From d302764b4a4e04ea18bc159ab080d7ce271c9ecf Mon Sep 17 00:00:00 2001 From: Brad Stein Date: Tue, 28 Apr 2026 21:49:58 -0300 Subject: [PATCH] fix(uvc): match v4l2 ioctl layout --- Cargo.lock | 6 +++--- client/Cargo.toml | 2 +- common/Cargo.toml | 2 +- scripts/install/server.sh | 1 + server/Cargo.toml | 2 +- server/src/bin/lesavka-uvc.real.inc | 4 ++++ 6 files changed, 11 insertions(+), 6 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 5363cb3..5781433 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1642,7 +1642,7 @@ checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" [[package]] name = "lesavka_client" -version = "0.14.46" +version = "0.14.47" dependencies = [ "anyhow", "async-stream", @@ -1676,7 +1676,7 @@ dependencies = [ [[package]] name = "lesavka_common" -version = "0.14.46" +version = "0.14.47" dependencies = [ "anyhow", "base64", @@ -1688,7 +1688,7 @@ dependencies = [ [[package]] name = "lesavka_server" -version = "0.14.46" +version = "0.14.47" dependencies = [ "anyhow", "base64", diff --git a/client/Cargo.toml b/client/Cargo.toml index 14617bd..aa4e8d4 100644 --- a/client/Cargo.toml +++ b/client/Cargo.toml @@ -4,7 +4,7 @@ path = "src/main.rs" [package] name = "lesavka_client" -version = "0.14.46" +version = "0.14.47" edition = "2024" [dependencies] diff --git a/common/Cargo.toml b/common/Cargo.toml index bd01929..6982918 100644 --- a/common/Cargo.toml +++ b/common/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "lesavka_common" -version = "0.14.46" +version = "0.14.47" edition = "2024" build = "build.rs" diff --git a/scripts/install/server.sh b/scripts/install/server.sh index 1990c7a..23c0a9b 100755 --- a/scripts/install/server.sh +++ b/scripts/install/server.sh @@ -894,6 +894,7 @@ if [[ "$UVC_ENV_CHANGED" == "1" ]] && is_attached_state "$UDC_STATE"; then fi if [[ -n ${LESAVKA_ALLOW_GADGET_RESET:-} ]] || [[ "$FORCE_GADGET_REBUILD" == "1" ]] || ! is_attached_state "$UDC_STATE"; then echo "⚠️ UDC state is '$UDC_STATE' - forcing a Lesavka gadget rebuild before server start." + sudo systemctl stop lesavka-server >/dev/null 2>&1 || true sudo systemctl stop lesavka-uvc >/dev/null 2>&1 || true sudo systemctl reset-failed lesavka-uvc >/dev/null 2>&1 || true sudo env \ diff --git a/server/Cargo.toml b/server/Cargo.toml index 3234e31..79f7aad 100644 --- a/server/Cargo.toml +++ b/server/Cargo.toml @@ -10,7 +10,7 @@ bench = false [package] name = "lesavka_server" -version = "0.14.46" +version = "0.14.47" edition = "2024" autobins = false diff --git a/server/src/bin/lesavka-uvc.real.inc b/server/src/bin/lesavka-uvc.real.inc index efe4c77..752d695 100644 --- a/server/src/bin/lesavka-uvc.real.inc +++ b/server/src/bin/lesavka-uvc.real.inc @@ -117,6 +117,9 @@ union V4l2FormatUnion { #[repr(C)] struct V4l2Format { type_: u32, + // v4l2_format's union is 8-byte aligned on aarch64; this pad keeps + // our ioctl request size at the kernel's expected 208 bytes. + _padding: u32, fmt: V4l2FormatUnion, } @@ -315,6 +318,7 @@ impl UvcVideoStream { fn set_format(&self, cfg: UvcConfig) -> Result<()> { let mut fmt = V4l2Format { type_: V4L2_BUF_TYPE_VIDEO_OUTPUT, + _padding: 0, fmt: V4l2FormatUnion { pix: V4l2PixFormat { width: cfg.width,