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 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 {
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user