From 54c2367c8cbc0ea3618b9e3f8e313b93c55235c8 Mon Sep 17 00:00:00 2001 From: Brad Stein Date: Tue, 6 Jan 2026 05:43:56 -0300 Subject: [PATCH] uvc: log probe data and accept host interval --- server/src/bin/lesavka-uvc.rs | 44 +++++++++++++++++++++++++++++++---- 1 file changed, 40 insertions(+), 4 deletions(-) diff --git a/server/src/bin/lesavka-uvc.rs b/server/src/bin/lesavka-uvc.rs index 8c26ae3..d4ce397 100644 --- a/server/src/bin/lesavka-uvc.rs +++ b/server/src/bin/lesavka-uvc.rs @@ -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, 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, 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 {