uvc: log probe data and accept host interval
This commit is contained in:
parent
41cf36a812
commit
54c2367c8c
@ -185,6 +185,7 @@ fn main() -> Result<()> {
|
|||||||
&mut state,
|
&mut state,
|
||||||
&mut pending,
|
&mut pending,
|
||||||
req,
|
req,
|
||||||
|
debug,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
UVC_EVENT_DATA => {
|
UVC_EVENT_DATA => {
|
||||||
@ -196,7 +197,7 @@ fn main() -> Result<()> {
|
|||||||
data.length
|
data.length
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
handle_data(fd, uvc_send_response, &mut state, &mut pending, data);
|
handle_data(&mut state, &mut pending, data, debug);
|
||||||
}
|
}
|
||||||
_ => {
|
_ => {
|
||||||
if debug {
|
if debug {
|
||||||
@ -310,6 +311,7 @@ fn handle_setup(
|
|||||||
state: &mut UvcState,
|
state: &mut UvcState,
|
||||||
pending: &mut Option<PendingRequest>,
|
pending: &mut Option<PendingRequest>,
|
||||||
req: UsbCtrlRequest,
|
req: UsbCtrlRequest,
|
||||||
|
debug: bool,
|
||||||
) {
|
) {
|
||||||
let interface = (req.w_index & 0xff) as u8;
|
let interface = (req.w_index & 0xff) as u8;
|
||||||
let selector = (req.w_value >> 8) as u8;
|
let selector = (req.w_value >> 8) as u8;
|
||||||
@ -320,6 +322,12 @@ fn handle_setup(
|
|||||||
let len = req.w_length as usize;
|
let len = req.w_length as usize;
|
||||||
let payload = vec![0u8; len.min(UVC_DATA_SIZE)];
|
let payload = vec![0u8; len.min(UVC_DATA_SIZE)];
|
||||||
let _ = send_response(fd, uvc_send_response, &payload);
|
let _ = send_response(fd, uvc_send_response, &payload);
|
||||||
|
if debug {
|
||||||
|
eprintln!(
|
||||||
|
"[lesavka-uvc] SET_CUR queued len={} iface={} sel={}",
|
||||||
|
req.w_length, interface, selector
|
||||||
|
);
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -340,11 +348,10 @@ fn handle_setup(
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn handle_data(
|
fn handle_data(
|
||||||
fd: i32,
|
|
||||||
uvc_send_response: libc::c_ulong,
|
|
||||||
state: &mut UvcState,
|
state: &mut UvcState,
|
||||||
pending: &mut Option<PendingRequest>,
|
pending: &mut Option<PendingRequest>,
|
||||||
data: UvcRequestData,
|
data: UvcRequestData,
|
||||||
|
debug: bool,
|
||||||
) {
|
) {
|
||||||
let Some(p) = pending.take() else {
|
let Some(p) = pending.take() else {
|
||||||
return;
|
return;
|
||||||
@ -356,6 +363,17 @@ fn handle_data(
|
|||||||
|
|
||||||
let len = data.length as usize;
|
let len = data.length as usize;
|
||||||
let slice = &data.data[..len.min(data.data.len())];
|
let slice = &data.data[..len.min(data.data.len())];
|
||||||
|
if debug && slice.len() >= STREAM_CTRL_SIZE {
|
||||||
|
let interval = read_le32(slice, 4);
|
||||||
|
let payload = read_le32(slice, 22);
|
||||||
|
eprintln!(
|
||||||
|
"[lesavka-uvc] data ctrl fmt={} frame={} interval={} payload={}",
|
||||||
|
slice[2],
|
||||||
|
slice[3],
|
||||||
|
interval,
|
||||||
|
payload
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
if p.interface == UVC_STRING_STREAMING_IDX
|
if p.interface == UVC_STRING_STREAMING_IDX
|
||||||
&& matches!(p.selector, UVC_VS_PROBE_CONTROL | UVC_VS_COMMIT_CONTROL)
|
&& matches!(p.selector, UVC_VS_PROBE_CONTROL | UVC_VS_COMMIT_CONTROL)
|
||||||
@ -363,8 +381,26 @@ fn handle_data(
|
|||||||
let sanitized = sanitize_streaming_control(slice, state);
|
let sanitized = sanitize_streaming_control(slice, state);
|
||||||
if p.selector == UVC_VS_PROBE_CONTROL {
|
if p.selector == UVC_VS_PROBE_CONTROL {
|
||||||
state.probe = sanitized;
|
state.probe = sanitized;
|
||||||
|
if debug {
|
||||||
|
let interval = read_le32(&state.probe, 4);
|
||||||
|
let payload = read_le32(&state.probe, 22);
|
||||||
|
eprintln!(
|
||||||
|
"[lesavka-uvc] probe set interval={} payload={}",
|
||||||
|
interval,
|
||||||
|
payload
|
||||||
|
);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
state.commit = sanitized;
|
state.commit = sanitized;
|
||||||
|
if debug {
|
||||||
|
let interval = read_le32(&state.commit, 4);
|
||||||
|
let payload = read_le32(&state.commit, 22);
|
||||||
|
eprintln!(
|
||||||
|
"[lesavka-uvc] commit set interval={} payload={}",
|
||||||
|
interval,
|
||||||
|
payload
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -431,7 +467,7 @@ fn sanitize_streaming_control(data: &[u8], state: &UvcState) -> [u8; STREAM_CTRL
|
|||||||
if frame_index == 1 {
|
if frame_index == 1 {
|
||||||
out[3] = 1;
|
out[3] = 1;
|
||||||
}
|
}
|
||||||
if interval == state.cfg.interval {
|
if interval != 0 {
|
||||||
write_le32(&mut out[4..8], interval);
|
write_le32(&mut out[4..8], interval);
|
||||||
}
|
}
|
||||||
if host_payload > 0 {
|
if host_payload > 0 {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user