uvc: log probe data and accept host interval

This commit is contained in:
Brad Stein 2026-01-06 05:43:56 -03:00
parent 41cf36a812
commit 54c2367c8c

View File

@ -185,6 +185,7 @@ fn main() -> Result<()> {
&mut state,
&mut pending,
req,
debug,
);
}
UVC_EVENT_DATA => {
@ -196,7 +197,7 @@ fn main() -> Result<()> {
data.length
);
}
handle_data(fd, uvc_send_response, &mut state, &mut pending, data);
handle_data(&mut state, &mut pending, data, debug);
}
_ => {
if debug {
@ -310,6 +311,7 @@ fn handle_setup(
state: &mut UvcState,
pending: &mut Option<PendingRequest>,
req: UsbCtrlRequest,
debug: bool,
) {
let interface = (req.w_index & 0xff) 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 payload = vec![0u8; len.min(UVC_DATA_SIZE)];
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;
}
@ -340,11 +348,10 @@ fn handle_setup(
}
fn handle_data(
fd: i32,
uvc_send_response: libc::c_ulong,
state: &mut UvcState,
pending: &mut Option<PendingRequest>,
data: UvcRequestData,
debug: bool,
) {
let Some(p) = pending.take() else {
return;
@ -356,6 +363,17 @@ fn handle_data(
let len = data.length as usize;
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
&& 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);
if p.selector == UVC_VS_PROBE_CONTROL {
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 {
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 {
out[3] = 1;
}
if interval == state.cfg.interval {
if interval != 0 {
write_le32(&mut out[4..8], interval);
}
if host_payload > 0 {