diff --git a/Cargo.lock b/Cargo.lock index 192dc21..61b963a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1285,7 +1285,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ "libc", - "windows-sys 0.61.2", + "windows-sys 0.52.0", ] [[package]] @@ -1566,7 +1566,7 @@ dependencies = [ "gobject-sys", "libc", "system-deps", - "windows-sys 0.61.2", + "windows-sys 0.52.0", ] [[package]] @@ -1939,7 +1939,7 @@ dependencies = [ "tokio", "tokio-rustls", "tower-service", - "webpki-roots 1.0.9", + "webpki-roots 1.0.11", ] [[package]] @@ -3009,7 +3009,7 @@ dependencies = [ "quinn-udp", "rustc-hash", "rustls", - "socket2 0.6.5", + "socket2 0.5.10", "thiserror 2.0.21", "tokio", "tracing", @@ -3048,9 +3048,9 @@ dependencies = [ "cfg_aliases", "libc", "once_cell", - "socket2 0.6.5", + "socket2 0.5.10", "tracing", - "windows-sys 0.61.2", + "windows-sys 0.52.0", ] [[package]] @@ -3280,7 +3280,7 @@ dependencies = [ "wasm-bindgen", "wasm-bindgen-futures", "web-sys", - "webpki-roots 1.0.9", + "webpki-roots 1.0.11", ] [[package]] @@ -3549,7 +3549,7 @@ dependencies = [ "errno", "libc", "linux-raw-sys", - "windows-sys 0.61.2", + "windows-sys 0.52.0", ] [[package]] @@ -3618,7 +3618,7 @@ dependencies = [ "once_cell", "ring", "rustls-pki-types", - "rustls-webpki 0.103.15", + "rustls-webpki 0.103.16", "subtle", "zeroize", ] @@ -3668,11 +3668,11 @@ dependencies = [ "rustls", "rustls-native-certs", "rustls-platform-verifier-android", - "rustls-webpki 0.103.15", + "rustls-webpki 0.103.16", "security-framework", "security-framework-sys", "webpki-root-certs", - "windows-sys 0.61.2", + "windows-sys 0.52.0", ] [[package]] @@ -3694,9 +3694,9 @@ dependencies = [ [[package]] name = "rustls-webpki" -version = "0.103.15" +version = "0.103.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3c3cf1d8b1e7d4927e2d154c3fcb02979afb9939629c62cd9048d4f07b60ac2" +checksum = "4443b1b6d39d7c663139942cc4558262562d2c84123bb6282ef177009ca8b281" dependencies = [ "aws-lc-rs", "ring", @@ -4507,10 +4507,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd" dependencies = [ "fastrand", - "getrandom 0.4.3", + "getrandom 0.3.4", "once_cell", "rustix", - "windows-sys 0.61.2", + "windows-sys 0.52.0", ] [[package]] @@ -4610,9 +4610,9 @@ checksum = "fd3ca314f692efd6c868f8408f53fe444634a845f96c028b97d35f6a1f79f0ee" [[package]] name = "tokio" -version = "1.53.2" +version = "1.54.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e95f91fcc7a621e8b030f6aa23c71fe9838ae2fb4d8118b75602a328f5144044" +checksum = "b52fd3255258d26fac7264ab5a76b53c13367136dc011d3d6ad4f8ed070396a3" dependencies = [ "bytes", "libc", @@ -5196,14 +5196,14 @@ version = "0.26.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "521bc38abb08001b01866da9f51eb7c5d647a19260e00054a8c7fd5f9e57f7a9" dependencies = [ - "webpki-roots 1.0.9", + "webpki-roots 1.0.11", ] [[package]] name = "webpki-roots" -version = "1.0.9" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7dcd9d09a39985f5344844e66b0c530a33843579125f23e21e9f0f220850f22a" +checksum = "f5f280bbb2b287bc8e7de7e3852945a0ff50d1bbcb5ed42b6c7a568c546df171" dependencies = [ "rustls-pki-types", ] @@ -5399,7 +5399,7 @@ version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ - "windows-sys 0.61.2", + "windows-sys 0.52.0", ] [[package]] diff --git a/app/src/api/handlers/network.rs b/app/src/api/handlers/network.rs index 5ac7382..5b7bd00 100644 --- a/app/src/api/handlers/network.rs +++ b/app/src/api/handlers/network.rs @@ -87,19 +87,26 @@ pub async fn set_network_settings(params: NetworkSettingsParams) -> Result Result { info!("DHCP lease renewal requested"); let if_name = crate::network::NET_IF_NAME; - let status = tokio::process::Command::new("/sbin/udhcpc") - .args(["-i", if_name, "-q", "-n", "-t", "3"]) - .status() - .await; + // Ask the running dhcpcd to rebind rather than starting a second client + // on the same NIC; older images without dhcpcd still use one-shot udhcpc. + let (client, args): (&str, Vec<&str>) = if std::path::Path::new(DHCPCD_PIDFILE).exists() { + ("dhcpcd", vec!["-n", if_name]) + } else { + ("/sbin/udhcpc", vec!["-i", if_name, "-q", "-n", "-t", "3"]) + }; + let status = tokio::process::Command::new(client).args(&args).status().await; match status { Ok(s) if s.success() => Ok(Value::Null), - Ok(s) => Err(anyhow::anyhow!("udhcpc exited with status {}", s)), + Ok(s) => Err(anyhow::anyhow!("{client} exited with status {s}")), Err(e) => { - tracing::warn!("DHCP renewal via udhcpc failed: {e}"); - Err(anyhow::anyhow!("udhcpc not available: {e}")) + tracing::warn!("DHCP renewal via {client} failed: {e}"); + Err(anyhow::anyhow!("{client} not available: {e}")) } } } diff --git a/deny.toml b/deny.toml index a6c0a53..53fe0b6 100644 --- a/deny.toml +++ b/deny.toml @@ -35,6 +35,14 @@ ignore = [ # rustls-webpki 0.102 — panic in CRL parsing. "Applications that do not use CRLs # are not affected." rumqttc never parses CRLs. { id = "RUSTSEC-2026-0104", reason = "rumqttc does not parse CRLs; not affected" }, + # rustls-webpki 0.102 — distrusted emSign intermediates. Fixed only in 0.103.16+ + # (which the web server uses); rumqttc 0.25.1 is the latest release and pins 0.102. + # MQTT is off by default and talks only to the broker the operator configures. + { id = "RUSTSEC-2026-0382", reason = "rumqttc-only 0.102 copy; no fixed release; MQTT opt-in" }, + # crypto-bigint 0.5 — timing leaks in constant-time ops; fixed only in 0.7.6. + # Pulled in by webrtc 0.17.2 (latest) via dtls → p256/p384 → elliptic-curve 0.13, + # which cannot take 0.7. Exposure is the per-session ephemeral DTLS key exchange. + { id = "RUSTSEC-2026-0387", reason = "webrtc-rs dtls via elliptic-curve 0.13; no compatible fix" }, ] [licenses] diff --git a/os/rk3588/README.md b/os/rk3588/README.md index 6a4c055..5b1055d 100644 --- a/os/rk3588/README.md +++ b/os/rk3588/README.md @@ -21,12 +21,11 @@ empty and is mounted over the rootfs directory; `S99rustkvm` copies it to | Project | Change | | --- | --- | | `buildroot` | dhcpcd privsep seccomp allows `dup3` (SIGSYS at boot); chrony drift file ownership | -| `buildroot` | RustKVM defconfig (GStreamer Opus, RGA, uvc-gadget, dropbear client, update engine); uvc-gadget builds with `-Dwerror=false` and accepts CONTINUOUS frame intervals | -| `buildroot` | rkupdate's license points at its real `LICENSE` file, so `make legal-info` completes | | `kernel` | `nanopi6_linux_defconfig`: NBD built in (virtual media), USB UAC2 gadget | | `scripts/sd-fuse` | builds the `v4l2loopback` module (operator-camera passthrough) | -| `external` | rockit links `librkAlgoDis.so` | | `device/friendlyelec` | installs `rustkvm-files` (this overlay) and disables the stock dropbear service | +| `buildroot` | Headless defconfig: only what `rustkvm_app` and the boot scripts use (MPP/RGA, the GStreamer plugins the app loads, ALSA, chrony, dhcpcd, dropbear). No Weston, Chromium, Mali, NPU, ISP, PulseAudio, Bluetooth, OTA engine, uvc-gadget, benchmarks or fonts. `gst.sh` turns on RGA in videoconvert | +| `device/friendlyelec` | `rustkvm-slim` runs last and deletes what the SDK installs unconditionally (prebuilt tools in `/usr/local/bin`, fonts, demo media, PulseAudio and usbdevice leftovers); drops the PulseAudio and usbdevice overlays | ## Changing the SDK diff --git a/os/rk3588/patches/buildroot/0002-rustkvm-defconfig-and-package-fixes.patch b/os/rk3588/patches/buildroot/0002-rustkvm-defconfig-and-package-fixes.patch deleted file mode 100644 index 6599b9c..0000000 --- a/os/rk3588/patches/buildroot/0002-rustkvm-defconfig-and-package-fixes.patch +++ /dev/null @@ -1,310 +0,0 @@ -diff --git a/configs/rockchip/base/recovery.config b/configs/rockchip/base/recovery.config -index 13ceaf0e55..dfb931958b 100644 ---- a/configs/rockchip/base/recovery.config -+++ b/configs/rockchip/base/recovery.config -@@ -8,3 +8,6 @@ BR2_PACKAGE_RKUPDATE=y - - - BR2_ROOTFS_DEVICE_CREATION_DYNAMIC_EUDEV=y -+ -+BR2_PACKAGE_RECOVERY_USE_UPDATEENGINE=y -+BR2_PACKAGE_RECOVERY_UPDATEENGINEBIN=y -diff --git a/configs/rockchip/multimedia/gst/audio.config b/configs/rockchip/multimedia/gst/audio.config -index 5a884a08de..7afa6f1623 100644 ---- a/configs/rockchip/multimedia/gst/audio.config -+++ b/configs/rockchip/multimedia/gst/audio.config -@@ -9,3 +9,5 @@ BR2_PACKAGE_GST1_PLUGINS_GOOD_PLUGIN_PULSE=y - BR2_PACKAGE_GST1_PLUGINS_GOOD_PLUGIN_SOUPHTTPSRC=y - BR2_PACKAGE_CA_CERTIFICATES=y - BR2_PACKAGE_LIBSOUP_SSL=y -+BR2_PACKAGE_GST1_PLUGINS_BASE_PLUGIN_OPUS=y -+BR2_PACKAGE_GST1_PLUGINS_BAD_PLUGIN_OPUS=y -diff --git a/configs/rockchip/network/network.config b/configs/rockchip/network/network.config -index f1e4fb0593..31fdcc7857 100644 ---- a/configs/rockchip/network/network.config -+++ b/configs/rockchip/network/network.config -@@ -3,4 +3,4 @@ BR2_PACKAGE_DHCPCD=y - BR2_PACKAGE_DNSMASQ=y - BR2_PACKAGE_DROPBEAR=y - BR2_PACKAGE_GESFTPSERVER=y --# BR2_PACKAGE_DROPBEAR_CLIENT is not set -+BR2_PACKAGE_DROPBEAR_CLIENT=y -diff --git a/configs/rockchip_rk3588_defconfig b/configs/rockchip_rk3588_defconfig -index f7135da73f..673d32b3cc 100644 ---- a/configs/rockchip_rk3588_defconfig -+++ b/configs/rockchip_rk3588_defconfig -@@ -1,31 +1,180 @@ --#include "base/base.config" --#include "chips/rk3588_aarch64.config" --#include "font/chinese.config" --#include "fs/exfat.config" --#include "fs/ntfs.config" --#include "fs/vfat.config" --#include "gpu/gpu.config" --#include "multimedia/audio.config" --#include "multimedia/camera.config" --#include "multimedia/gst/audio.config" --#include "multimedia/gst/camera.config" --#include "multimedia/gst/rtsp.config" --#include "multimedia/gst/video.config" --#include "multimedia/mpp.config" --#include "tools/benchmark.config" --#include "tools/common.config" --#include "tools/test.config" --#include "network/chromium.config" --#include "npu2.config" --#include "powermanager.config" --#include "weston.config" --BR2_PACKAGE_VIM=y --BR2_PACKAGE_VIM_RUNTIME=y --BR2_PACKAGE_GST1_LIBAV=y --BR2_PACKAGE_ALSA_UTILS_SPEAKER_TEST=y --BR2_PACKAGE_RKWIFIBT_AP6398S=y --BR2_PACKAGE_RKWIFIBT_BTUART="ttyS8" -+BR2_aarch64=y -+BR2_cortex_a76_a55=y -+BR2_PRIMARY_SITE="http://sources.buildroot.net" -+BR2_BACKUP_SITE="" -+BR2_GNU_MIRROR="http://mirrors.kernel.org/gnu" -+BR2_CCACHE=y -+BR2_STRIP_EXCLUDE_FILES="libgraphic_lsf.so" -+BR2_FORCE_HOST_BUILD=y -+BR2_TOOLCHAIN_BUILDROOT_CXX=y -+BR2_TARGET_GENERIC_HOSTNAME="rk3588" -+BR2_TARGET_GENERIC_ISSUE="Welcome to RK3588 Buildroot" -+BR2_ROOTFS_DEVICE_CREATION_DYNAMIC_EUDEV=y -+BR2_ROOTFS_MERGED_USR=y -+BR2_TARGET_SERIAL_SHELL_SH=y -+BR2_ROOTFS_OVERLAY="board/rockchip/common/base board/rockchip/rk3588/fs-overlay/" -+BR2_ROOTFS_POST_BUILD_SCRIPT="board/rockchip/common/post-build.sh" -+BR2_LINUX_KERNEL_CUSTOM_LOCAL=y -+BR2_LINUX_KERNEL_CUSTOM_LOCAL_LOCATION="$(TOPDIR)/../kernel" -+BR2_PACKAGE_ROCKCHIP=y -+BR2_PACKAGE_CAMERA_ENGINE=y -+BR2_PACKAGE_CAMERA_ENGINE_RKAIQ_RKISP_DEMO=y -+BR2_PACKAGE_GSTREAMER1_ROCKCHIP=y -+BR2_PACKAGE_LIBV4L_RKMPP=y -+BR2_PACKAGE_RECOVERY=y -+BR2_PACKAGE_RECOVERY_USE_UPDATEENGINE=y - BR2_PACKAGE_RKNPU2=y --BR2_TARGET_GENERIC_GETTY_PORT="ttyFIQ0" --BR2_TARGET_GENERIC_GETTY_BAUDRATE_1500000=y -+BR2_PACKAGE_RKSCRIPT=y -+BR2_PACKAGE_RKTOOLKIT=y -+BR2_PACKAGE_RKUPDATE=y -+BR2_PACKAGE_ROCKCHIP_ALSA_CONFIG=y -+BR2_PACKAGE_ROCKCHIP_RGA=y -+BR2_PACKAGE_ROCKCHIP_MALI=y -+BR2_PACKAGE_ROCKCHIP_MPP_ALLOCATOR_DRM=y -+BR2_PACKAGE_ROCKCHIP_MPP_TESTS=y -+BR2_PACKAGE_ROCKCHIP_TEST=y -+BR2_PACKAGE_ROCKIT=y -+BR2_PACKAGE_BUSYBOX_CONFIG_FRAGMENT_FILES="board/rockchip/common/base/busybox.fragment" -+BR2_PACKAGE_BUSYBOX_SHOW_OTHERS=y -+BR2_PACKAGE_ALSA_UTILS=y -+BR2_PACKAGE_ALSA_UTILS_ALSACONF=y -+BR2_PACKAGE_ALSA_UTILS_AMIXER=y -+BR2_PACKAGE_ALSA_UTILS_APLAY=y -+BR2_PACKAGE_ALSA_UTILS_SPEAKER_TEST=y -+BR2_PACKAGE_GSTREAMER1=y -+BR2_PACKAGE_GST1_PLUGINS_BASE_INSTALL_TOOLS=y -+BR2_PACKAGE_GST1_PLUGINS_BASE_PLUGIN_APP=y -+BR2_PACKAGE_GST1_PLUGINS_BASE_PLUGIN_AUDIORATE=y -+BR2_PACKAGE_GST1_PLUGINS_BASE_PLUGIN_AUDIOTESTSRC=y -+BR2_PACKAGE_GST1_PLUGINS_BASE_PLUGIN_ENCODING=y -+BR2_PACKAGE_GST1_PLUGINS_BASE_PLUGIN_TCP=y -+BR2_PACKAGE_GST1_PLUGINS_BASE_PLUGIN_VIDEOTESTSRC=y -+BR2_PACKAGE_GST1_PLUGINS_BASE_PLUGIN_VIDEORATE=y -+BR2_PACKAGE_GST1_PLUGINS_BASE_PLUGIN_ALSA=y -+BR2_PACKAGE_GST1_PLUGINS_BASE_PLUGIN_OGG=y -+BR2_PACKAGE_GST1_PLUGINS_BASE_PLUGIN_OPUS=y -+BR2_PACKAGE_GST1_PLUGINS_BASE_PLUGIN_THEORA=y -+BR2_PACKAGE_GST1_PLUGINS_BASE_PLUGIN_VORBIS=y -+BR2_PACKAGE_GST1_PLUGINS_GOOD=y -+BR2_PACKAGE_GST1_PLUGINS_GOOD_JPEG=y -+BR2_PACKAGE_GST1_PLUGINS_GOOD_PNG=y -+BR2_PACKAGE_GST1_PLUGINS_GOOD_PLUGIN_ALPHA=y -+BR2_PACKAGE_GST1_PLUGINS_GOOD_PLUGIN_APETAG=y -+BR2_PACKAGE_GST1_PLUGINS_GOOD_PLUGIN_AUDIOPARSERS=y -+BR2_PACKAGE_GST1_PLUGINS_GOOD_PLUGIN_AUPARSE=y -+BR2_PACKAGE_GST1_PLUGINS_GOOD_PLUGIN_AUTODETECT=y -+BR2_PACKAGE_GST1_PLUGINS_GOOD_PLUGIN_DEINTERLACE=y -+BR2_PACKAGE_GST1_PLUGINS_GOOD_PLUGIN_FLV=y -+BR2_PACKAGE_GST1_PLUGINS_GOOD_PLUGIN_ID3DEMUX=y -+BR2_PACKAGE_GST1_PLUGINS_GOOD_PLUGIN_MATROSKA=y -+BR2_PACKAGE_GST1_PLUGINS_GOOD_PLUGIN_MULTIFILE=y -+BR2_PACKAGE_GST1_PLUGINS_GOOD_PLUGIN_RTP=y -+BR2_PACKAGE_GST1_PLUGINS_GOOD_PLUGIN_RTPMANAGER=y -+BR2_PACKAGE_GST1_PLUGINS_GOOD_PLUGIN_RTSP=y -+BR2_PACKAGE_GST1_PLUGINS_GOOD_PLUGIN_UDP=y -+BR2_PACKAGE_GST1_PLUGINS_GOOD_PLUGIN_VIDEOBOX=y -+BR2_PACKAGE_GST1_PLUGINS_GOOD_PLUGIN_VIDEOCROP=y -+BR2_PACKAGE_GST1_PLUGINS_GOOD_PLUGIN_VIDEOFILTER=y -+BR2_PACKAGE_GST1_PLUGINS_GOOD_PLUGIN_VIDEOMIXER=y -+BR2_PACKAGE_GST1_PLUGINS_GOOD_PLUGIN_MPG123=y -+BR2_PACKAGE_GST1_PLUGINS_GOOD_PLUGIN_V4L2=y -+BR2_PACKAGE_GST1_PLUGINS_GOOD_PLUGIN_GDKPIXBUF=y -+BR2_PACKAGE_GST1_PLUGINS_GOOD_PLUGIN_PULSE=y -+BR2_PACKAGE_GST1_PLUGINS_GOOD_PLUGIN_SOUPHTTPSRC=y -+BR2_PACKAGE_GST1_PLUGINS_BAD=y -+BR2_PACKAGE_GST1_PLUGINS_BAD_PLUGIN_ADPCMDEC=y -+BR2_PACKAGE_GST1_PLUGINS_BAD_PLUGIN_ADPCMENC=y -+BR2_PACKAGE_GST1_PLUGINS_BAD_PLUGIN_CAMERABIN2=y -+BR2_PACKAGE_GST1_PLUGINS_BAD_PLUGIN_DEBUGUTILS=y -+BR2_PACKAGE_GST1_PLUGINS_BAD_PLUGIN_DVBSUBOVERLAY=y -+BR2_PACKAGE_GST1_PLUGINS_BAD_PLUGIN_DVDSPU=y -+BR2_PACKAGE_GST1_PLUGINS_BAD_PLUGIN_JPEGFORMAT=y -+BR2_PACKAGE_GST1_PLUGINS_BAD_PLUGIN_MIDI=y -+BR2_PACKAGE_GST1_PLUGINS_BAD_PLUGIN_MPEGDEMUX=y -+BR2_PACKAGE_GST1_PLUGINS_BAD_PLUGIN_MPEGTSDEMUX=y -+BR2_PACKAGE_GST1_PLUGINS_BAD_PLUGIN_MPEGTSMUX=y -+BR2_PACKAGE_GST1_PLUGINS_BAD_PLUGIN_MPEGPSMUX=y -+BR2_PACKAGE_GST1_PLUGINS_BAD_PLUGIN_ONVIF=y -+BR2_PACKAGE_GST1_PLUGINS_BAD_PLUGIN_RTMP=y -+BR2_PACKAGE_GST1_PLUGINS_BAD_PLUGIN_SDP=y -+BR2_PACKAGE_GST1_PLUGINS_BAD_PLUGIN_VIDEOPARSERS=y -+BR2_PACKAGE_GST1_PLUGINS_BAD_PLUGIN_FAAD=y -+BR2_PACKAGE_GST1_PLUGINS_BAD_PLUGIN_FLUIDSYNTH=y -+BR2_PACKAGE_GST1_PLUGINS_BAD_PLUGIN_HLS=y -+BR2_PACKAGE_GST1_PLUGINS_BAD_PLUGIN_KMS=y -+BR2_PACKAGE_GST1_PLUGINS_BAD_PLUGIN_MPEG2ENC=y -+BR2_PACKAGE_GST1_PLUGINS_BAD_PLUGIN_OPUS=y -+BR2_PACKAGE_GST1_PLUGINS_UGLY=y -+BR2_PACKAGE_GST1_PLUGINS_UGLY_PLUGIN_ASFDEMUX=y -+BR2_PACKAGE_GST1_PLUGINS_UGLY_PLUGIN_DVDLPCMDEC=y -+BR2_PACKAGE_GST1_PLUGINS_UGLY_PLUGIN_DVDSUB=y -+BR2_PACKAGE_GST1_PLUGINS_UGLY_PLUGIN_MPEG2DEC=y -+BR2_PACKAGE_GST1_LIBAV=y -+BR2_PACKAGE_PULSEAUDIO_DAEMON=y -+BR2_PACKAGE_LMBENCH=y -+BR2_PACKAGE_UNIXBENCH=y -+BR2_PACKAGE_RT_TESTS=y -+BR2_PACKAGE_STRACE=y -+BR2_PACKAGE_STRESS=y -+BR2_PACKAGE_STRESS_NG=y -+BR2_PACKAGE_WHETSTONE=y -+BR2_PACKAGE_DOSFSTOOLS=y -+BR2_PACKAGE_DOSFSTOOLS_FATLABEL=y -+BR2_PACKAGE_DOSFSTOOLS_FSCK_FAT=y -+BR2_PACKAGE_DOSFSTOOLS_MKFS_FAT=y -+BR2_PACKAGE_EXFAT=y -+BR2_PACKAGE_EXFAT_UTILS=y -+BR2_PACKAGE_FATRESIZE=y -+BR2_PACKAGE_NTFS_3G=y -+BR2_PACKAGE_NTFS_3G_NTFSPROGS=y -+BR2_PACKAGE_DEJAVU=y -+BR2_PACKAGE_FONT_AWESOME=y -+BR2_PACKAGE_SOURCE_HAN_SANS_CN=y -+BR2_PACKAGE_GLMARK2=y -+BR2_PACKAGE_UVC_GADGET=y -+BR2_PACKAGE_WESTON=y -+BR2_PACKAGE_WESTON_SIMPLE_CLIENTS=y -+BR2_PACKAGE_WESTON_DEMO_CLIENTS=y -+# BR2_PACKAGE_EUDEV_ENABLE_HWDB is not set -+BR2_PACKAGE_EVTEST=y -+BR2_PACKAGE_I2C_TOOLS=y -+BR2_PACKAGE_INPUT_EVENT_DAEMON=y -+BR2_PACKAGE_PM_UTILS=y -+BR2_PACKAGE_USBMOUNT=y -+BR2_PACKAGE_ALSA_UCM_CONF=y -+BR2_PACKAGE_LIBMAD=y -+BR2_PACKAGE_CA_CERTIFICATES=y -+BR2_PACKAGE_AT_SPI2_CORE=y -+BR2_PACKAGE_JPEG_TURBO_JPEG6=y -+BR2_PACKAGE_LIBDRM_INSTALL_TESTS=y -+BR2_PACKAGE_WAYLAND_UTILS=y -+BR2_PACKAGE_LIBV4L=y -+BR2_PACKAGE_LIBV4L_UTILS=y -+BR2_PACKAGE_BLUEZ5_UTILS=y -+BR2_PACKAGE_CHRONY=y -+BR2_PACKAGE_CHROMIUM_WAYLAND=y -+BR2_PACKAGE_DHCPCD=y -+BR2_PACKAGE_DNSMASQ=y -+BR2_PACKAGE_DROPBEAR=y -+BR2_PACKAGE_GESFTPSERVER=y -+BR2_PACKAGE_IPUTILS=y -+BR2_PACKAGE_IW=y -+BR2_PACKAGE_LRZSZ=y -+BR2_PACKAGE_WIRELESS_TOOLS=y -+BR2_PACKAGE_ANDROID_ADBD=y -+BR2_PACKAGE_COREUTILS=y -+BR2_PACKAGE_PROCPS_NG=y -+BR2_PACKAGE_PROCRANK_LINUX=y -+BR2_PACKAGE_UTIL_LINUX_MOUNT=y -+BR2_PACKAGE_VIM=y -+BR2_TARGET_ROOTFS_CPIO=y -+BR2_TARGET_ROOTFS_CPIO_GZIP=y -+BR2_TARGET_ROOTFS_EXT2=y -+BR2_TARGET_ROOTFS_EXT2_4=y -+BR2_TARGET_ROOTFS_EXT2_SIZE_AUTO=y -+BR2_TARGET_ROOTFS_SQUASHFS=y - BR2_TARGET_ROOTFS_TAR_XZ=y -+BR2_PACKAGE_HOST_ENVIRONMENT_SETUP=y -+BR2_PACKAGE_HOST_NTFS_3G=y -+BR2_PACKAGE_HOST_PYTHON3=y -+BR2_PACKAGE_HOST_PYTHON3_SSL=y -diff --git a/package/gstreamer1/gstreamer1/gst.sh b/package/gstreamer1/gstreamer1/gst.sh -index 693627340a..050acfb81d 100644 ---- a/package/gstreamer1/gstreamer1/gst.sh -+++ b/package/gstreamer1/gstreamer1/gst.sh -@@ -78,8 +78,8 @@ export GST_V4L2SRC_MAX_RESOLUTION=3840x2160 - - # Try RGA 2D accel in videoconvert, videoscale and videoflip. - # NOTE: Might not success, and might behave different from the official plugin. --# export GST_VIDEO_CONVERT_USE_RGA=1 --# export GST_VIDEO_FLIP_USE_RGA=1 -+export GST_VIDEO_CONVERT_USE_RGA=1 -+export GST_VIDEO_FLIP_USE_RGA=1 - - # Default rotation for camerabin2: - # clockwise(90)|rotate-180|counterclockwise(270)|horizontal-flip|vertical-flip -diff --git a/package/uvc-gadget/0003-lib-accept-continuous-frame-intervals.patch b/package/uvc-gadget/0003-lib-accept-continuous-frame-intervals.patch -new file mode 100644 -index 0000000000..5b19aa4e02 ---- /dev/null -+++ b/package/uvc-gadget/0003-lib-accept-continuous-frame-intervals.patch -@@ -0,0 +1,29 @@ -+From: rustkvm -+Date: Fri, 20 Jun 2026 00:00:00 +0000 -+Subject: [PATCH] lib: accept CONTINUOUS frame intervals from the V4L2 source -+ -+v4l2loopback (used to bridge a control-end browser camera into the f_uvc -+gadget for operator-camera passthrough) reports -+V4L2_FRMIVAL_TYPE_CONTINUOUS frame intervals. The original enumerator -+only accepted DISCRETE and STEPWISE and returned -EINVAL otherwise, so -+uvc-gadget aborted with "unable to enumerate formats" and the camera -+could never stream. CONTINUOUS shares the STEPWISE union layout; accept -+both as a range. -+ -+Signed-off-by: rustkvm -+--- a/lib/v4l2.c -++++ b/lib/v4l2.c -+@@ -114,7 +114,13 @@ -+ ival->step.denominator = 1; -+ break; -+ -++ case V4L2_FRMIVAL_TYPE_CONTINUOUS: -+ case V4L2_FRMIVAL_TYPE_STEPWISE: -++ /* v4l2loopback reports CONTINUOUS (and some sources -++ * STEPWISE) frame intervals; the union layout is the same -++ * as STEPWISE, so accept both as a range instead of -++ * bailing out — otherwise browser-camera passthrough via -++ * the loopback can never enumerate. */ -+ ival->min = ivalenum.stepwise.min; -+ ival->max = ivalenum.stepwise.max; -+ ival->step = ivalenum.stepwise.step; -diff --git a/package/uvc-gadget/uvc-gadget.mk b/package/uvc-gadget/uvc-gadget.mk -index 52ca51a557..6c6e98be2e 100644 ---- a/package/uvc-gadget/uvc-gadget.mk -+++ b/package/uvc-gadget/uvc-gadget.mk -@@ -11,6 +11,10 @@ UVC_GADGET_LICENSE = LGPL 2.1+ - - UVC_GADGET_DEPENDENCIES = jpeg - -+# Upstream forces werror=true in meson.build, which breaks the build with -+# recent GCC + _FORTIFY_SOURCE (unused-result on read()/chdir()). -+UVC_GADGET_CONF_OPTS += -Dwerror=false -+ - UVC_GADGET_STATIC = $(BR2_PACKAGE_UVC_GADGET_STATIC) - ifeq ($(UVC_GADGET_STATIC),y) - UVC_GADGET_CFLAGS += -static diff --git a/os/rk3588/patches/buildroot/0002-rustkvm-headless-defconfig.patch b/os/rk3588/patches/buildroot/0002-rustkvm-headless-defconfig.patch new file mode 100644 index 0000000..60b32ac --- /dev/null +++ b/os/rk3588/patches/buildroot/0002-rustkvm-headless-defconfig.patch @@ -0,0 +1,110 @@ +diff --git a/configs/rockchip_rk3588_defconfig b/configs/rockchip_rk3588_defconfig +index f7135da..be95e36 100644 +--- a/configs/rockchip_rk3588_defconfig ++++ b/configs/rockchip_rk3588_defconfig +@@ -1,31 +1,59 @@ +-#include "base/base.config" +-#include "chips/rk3588_aarch64.config" +-#include "font/chinese.config" +-#include "fs/exfat.config" +-#include "fs/ntfs.config" +-#include "fs/vfat.config" +-#include "gpu/gpu.config" +-#include "multimedia/audio.config" +-#include "multimedia/camera.config" +-#include "multimedia/gst/audio.config" +-#include "multimedia/gst/camera.config" +-#include "multimedia/gst/rtsp.config" +-#include "multimedia/gst/video.config" +-#include "multimedia/mpp.config" +-#include "tools/benchmark.config" +-#include "tools/common.config" +-#include "tools/test.config" +-#include "network/chromium.config" +-#include "npu2.config" +-#include "powermanager.config" +-#include "weston.config" +-BR2_PACKAGE_VIM=y +-BR2_PACKAGE_VIM_RUNTIME=y +-BR2_PACKAGE_GST1_LIBAV=y +-BR2_PACKAGE_ALSA_UTILS_SPEAKER_TEST=y +-BR2_PACKAGE_RKWIFIBT_AP6398S=y +-BR2_PACKAGE_RKWIFIBT_BTUART="ttyS8" +-BR2_PACKAGE_RKNPU2=y +-BR2_TARGET_GENERIC_GETTY_PORT="ttyFIQ0" +-BR2_TARGET_GENERIC_GETTY_BAUDRATE_1500000=y +-BR2_TARGET_ROOTFS_TAR_XZ=y ++# RustKVM headless rootfs: only what rustkvm_app and its boot scripts use. ++# No Weston/Chromium/Mali/NPU/ISP/PulseAudio/benchmarks; see os/rk3588/README.md. ++BR2_aarch64=y ++BR2_cortex_a76_a55=y ++BR2_PRIMARY_SITE="http://sources.buildroot.net" ++BR2_BACKUP_SITE="" ++BR2_GNU_MIRROR="http://mirrors.kernel.org/gnu" ++BR2_CCACHE=y ++BR2_FORCE_HOST_BUILD=y ++BR2_TOOLCHAIN_BUILDROOT_CXX=y ++BR2_TARGET_GENERIC_HOSTNAME="rk3588" ++BR2_TARGET_GENERIC_ISSUE="Welcome to RK3588 Buildroot" ++BR2_ROOTFS_DEVICE_CREATION_DYNAMIC_EUDEV=y ++BR2_ROOTFS_MERGED_USR=y ++BR2_TARGET_SERIAL_SHELL_SH=y ++BR2_ROOTFS_OVERLAY="board/rockchip/rk3588/fs-overlay/" ++BR2_ROOTFS_POST_BUILD_SCRIPT="board/rockchip/common/post-build.sh" ++BR2_LINUX_KERNEL_CUSTOM_LOCAL=y ++BR2_LINUX_KERNEL_CUSTOM_LOCAL_LOCATION="$(TOPDIR)/../kernel" ++BR2_PACKAGE_ROCKCHIP=y ++BR2_PACKAGE_GSTREAMER1_ROCKCHIP=y ++BR2_PACKAGE_RKSCRIPT=y ++BR2_PACKAGE_ROCKCHIP_ALSA_CONFIG=y ++BR2_PACKAGE_ROCKCHIP_RGA=y ++BR2_PACKAGE_ROCKCHIP_MPP=y ++BR2_PACKAGE_ROCKCHIP_MPP_ALLOCATOR_DRM=y ++BR2_PACKAGE_BUSYBOX_CONFIG_FRAGMENT_FILES="board/rockchip/common/base/busybox.fragment" ++BR2_PACKAGE_BUSYBOX_SHOW_OTHERS=y ++BR2_PACKAGE_ALSA_UTILS=y ++# BR2_PACKAGE_ALSA_UTILS_ALSAMIXER is not set ++BR2_PACKAGE_GSTREAMER1=y ++BR2_PACKAGE_GST1_PLUGINS_BASE_PLUGIN_APP=y ++BR2_PACKAGE_GST1_PLUGINS_BASE_PLUGIN_VIDEORATE=y ++BR2_PACKAGE_GST1_PLUGINS_BASE_PLUGIN_ALSA=y ++BR2_PACKAGE_GST1_PLUGINS_BASE_PLUGIN_OPUS=y ++BR2_PACKAGE_GST1_PLUGINS_GOOD=y ++BR2_PACKAGE_GST1_PLUGINS_GOOD_PLUGIN_V4L2=y ++BR2_PACKAGE_GST1_PLUGINS_BAD=y ++BR2_PACKAGE_GST1_PLUGINS_BAD_PLUGIN_VIDEOPARSERS=y ++BR2_PACKAGE_GST1_PLUGINS_BAD_PLUGIN_OPUS=y ++BR2_PACKAGE_BASH=y ++BR2_PACKAGE_E2FSPROGS=y ++BR2_PACKAGE_E2FSPROGS_RESIZE2FS=y ++# BR2_PACKAGE_EUDEV_ENABLE_HWDB is not set ++BR2_PACKAGE_CA_CERTIFICATES=y ++BR2_PACKAGE_JPEG=y ++BR2_PACKAGE_JPEG_TURBO_JPEG6=y ++BR2_PACKAGE_LIBV4L=y ++BR2_PACKAGE_CHRONY=y ++BR2_PACKAGE_DHCPCD=y ++BR2_PACKAGE_DROPBEAR=y ++BR2_PACKAGE_UTIL_LINUX_MOUNT=y ++BR2_TARGET_ROOTFS_EXT2=y ++BR2_TARGET_ROOTFS_EXT2_4=y ++BR2_TARGET_ROOTFS_EXT2_SIZE_AUTO=y ++BR2_PACKAGE_HOST_ENVIRONMENT_SETUP=y ++BR2_PACKAGE_HOST_NTFS_3G=y ++BR2_PACKAGE_HOST_PYTHON3=y ++BR2_PACKAGE_HOST_PYTHON3_SSL=y +diff --git a/package/gstreamer1/gstreamer1/gst.sh b/package/gstreamer1/gstreamer1/gst.sh +index 6936273..050acfb 100644 +--- a/package/gstreamer1/gstreamer1/gst.sh ++++ b/package/gstreamer1/gstreamer1/gst.sh +@@ -78,8 +78,8 @@ export GST_V4L2SRC_MAX_RESOLUTION=3840x2160 + + # Try RGA 2D accel in videoconvert, videoscale and videoflip. + # NOTE: Might not success, and might behave different from the official plugin. +-# export GST_VIDEO_CONVERT_USE_RGA=1 +-# export GST_VIDEO_FLIP_USE_RGA=1 ++export GST_VIDEO_CONVERT_USE_RGA=1 ++export GST_VIDEO_FLIP_USE_RGA=1 + + # Default rotation for camerabin2: + # clockwise(90)|rotate-180|counterclockwise(270)|horizontal-flip|vertical-flip diff --git a/os/rk3588/patches/buildroot/0003-rkupdate-point-license-at-the-existing-LICENSE-file.patch b/os/rk3588/patches/buildroot/0003-rkupdate-point-license-at-the-existing-LICENSE-file.patch deleted file mode 100644 index 15cf07d..0000000 --- a/os/rk3588/patches/buildroot/0003-rkupdate-point-license-at-the-existing-LICENSE-file.patch +++ /dev/null @@ -1,13 +0,0 @@ -diff --git a/package/rockchip/rkupdate/rkupdate.mk b/package/rockchip/rkupdate/rkupdate.mk -index 2ac99eb6..dfb1d658 100644 ---- a/package/rockchip/rkupdate/rkupdate.mk -+++ b/package/rockchip/rkupdate/rkupdate.mk -@@ -9,7 +9,7 @@ RKUPDATE_SITE = $(TOPDIR)/../external/rkupdate - RKUPDATE_SITE_METHOD = local - - RKUPDATE_LICENSE = Apache V2.0 --RKUPDATE_LICENSE_FILES = NOTICE -+RKUPDATE_LICENSE_FILES = LICENSE - - RKUPDATE_DEPENDENCIES = \ - libpthread-stubs util-linux diff --git a/os/rk3588/patches/device/friendlyelec/0002-rk3588-headless-rustkvm-slim-overlay.patch b/os/rk3588/patches/device/friendlyelec/0002-rk3588-headless-rustkvm-slim-overlay.patch new file mode 100644 index 0000000..6a6f196 --- /dev/null +++ b/os/rk3588/patches/device/friendlyelec/0002-rk3588-headless-rustkvm-slim-overlay.patch @@ -0,0 +1,44 @@ +diff --git a/rk3588/base.mk b/rk3588/base.mk +index 3929936..9be5572 100644 +--- a/rk3588/base.mk ++++ b/rk3588/base.mk +@@ -20,10 +20,9 @@ BUILDROOT_FILES+=(device/friendlyelec/rom-version) + BUILDROOT_FILES+=(device/friendlyelec/rk3588/disable-unnecessary-services) + BUILDROOT_FILES+=(device/friendlyelec/load-modules-service) + BUILDROOT_FILES+=(device/friendlyelec/rk3588/r8125) +-BUILDROOT_FILES+=(device/friendlyelec/rk3588/set-pulse-audio-default-output-to-hdmi0) + BUILDROOT_FILES+=(device/friendlyelec/alsa-config) +-BUILDROOT_FILES+=(device/friendlyelec/usbdevice-wrapper) + BUILDROOT_FILES+=(device/friendlyelec/rustkvm-files) ++BUILDROOT_FILES+=(device/friendlyelec/rustkvm-slim) + + # U-boot + # +diff --git a/rustkvm-slim/install.sh b/rustkvm-slim/install.sh +new file mode 100755 +index 0000000..00a6b12 +--- /dev/null ++++ b/rustkvm-slim/install.sh +@@ -0,0 +1,22 @@ ++#!/bin/bash ++# RustKVM: last overlay step. Drops what device/rockchip and the rockchip ++# fs-overlay install unconditionally but a headless KVM never uses. ++set -eu ++ROOTFS_DIR=$1 ++ ++(cd ${ROOTFS_DIR} && { ++ # Prebuilt tools: gdb, four perf builds, adb, frecon, benchmarks. ++ rm -rf usr/local/bin ++ ++ # Fonts from device/rockchip/common/fonts (no display stack). ++ rm -rf usr/share/fonts ++ ++ # Demo media in /oem and /userdata. ++ find oem userdata -mindepth 1 -maxdepth 1 -exec rm -rf {} + 2>/dev/null || true ++ ++ # PulseAudio leftovers from board/rockchip/rk3588/fs-overlay. ++ rm -rf usr/share/pulseaudio etc/udev/rules.d/90-pulseaudio-rockchip.rules ++ ++ # rkscript's USB gadget service: rustkvm_app owns configfs. ++ rm -f etc/init.d/S50usbdevice.sh etc/init.d/K50usbdevice.sh lib/udev/rules.d/61-usbdevice.rules ++}) diff --git a/os/rk3588/patches/external/0001-rockit-link-librkAlgoDis.patch b/os/rk3588/patches/external/0001-rockit-link-librkAlgoDis.patch deleted file mode 100644 index fd8b6d5..0000000 --- a/os/rk3588/patches/external/0001-rockit-link-librkAlgoDis.patch +++ /dev/null @@ -1,14 +0,0 @@ -diff --git a/rockit/mpi/CMakeLists.txt b/rockit/mpi/CMakeLists.txt -index ea77198d..7ac1cf4d 100644 ---- a/rockit/mpi/CMakeLists.txt -+++ b/rockit/mpi/CMakeLists.txt -@@ -12,7 +12,8 @@ if(ARCH64) - ${CMAKE_CURRENT_LIST_DIR}/sdk/lib/lib64/libgraphic_lsf.so - ${CMAKE_CURRENT_LIST_DIR}/sdk/lib/lib64/libRkSwCac.so - ${CMAKE_CURRENT_LIST_DIR}/sdk/lib/lib64/libturbojpeg.so -- ${CMAKE_CURRENT_LIST_DIR}/sdk/lib/lib64/libjpeg.so -+ ${CMAKE_CURRENT_LIST_DIR}/sdk/lib/lib64/libjpeg.so -+ ${CMAKE_CURRENT_LIST_DIR}/sdk/lib/lib64/librkAlgoDis.so - ) - set(ROCKIT_DUMPSYS_FILE ${CMAKE_CURRENT_LIST_DIR}/example/bin/bin64/dumpsys) - else() diff --git a/scripts/build-firmware.sh b/scripts/build-firmware.sh index 7edacef..163c7a2 100755 --- a/scripts/build-firmware.sh +++ b/scripts/build-firmware.sh @@ -117,6 +117,8 @@ APP_VERSION=$app_version GIT_REVISION=$rev BOARD=${BOARD_MK%.mk} EOF + # Settings → About shows this one line (the app reads /etc/rustkvm-version). + echo "$FW_VERSION" >"$files/etc/rustkvm-version" [ -f "$APP" ] || die "application binary not found: $APP (run scripts/build-app.sh first)" # /userdata is its own (initially empty) partition mounted over the rootfs @@ -138,10 +140,20 @@ step_build() { sudo chown -R "$(id -u):$(id -g)" u-boot kernel buildroot/output scripts/sd-fuse/out fi ln -sfn "$(readlink -f .current)/$BOARD_MK" .current_config.mk + # mk-buildroot.sh reuses an existing .config, and Buildroot never deletes + # the files of packages that were turned off: start the Buildroot output + # over whenever the defconfig (packages, root password) changes. + local br_out=buildroot/output/rockchip_rk3588 stamp + stamp=$(sha256sum buildroot/configs/rockchip_rk3588_defconfig | cut -d' ' -f1) + if [ -d "$br_out" ] && [ "$(cat "$br_out/.rustkvm-defconfig" 2>/dev/null)" != "$stamp" ]; then + log "defconfig changed: rebuild Buildroot output from scratch" + rm -rf "$br_out" + fi for part in uboot kernel buildroot; do log "build $part ($BOARD_MK)" ./build.sh "$part" done + echo "$stamp" >"$br_out/.rustkvm-defconfig" log "pack SD image" ./build.sh sd-img log "pack eMMC flasher image"