Troubleshooting
example_camera_capture reports Device or resource busy
Cause: frame_service is exclusively using /dev/video0.
Solution:
/etc/init.d/S52frame_service stop
./build/bin/example_camera_capture
/etc/init.d/S52frame_service start
For daily screenshots and frame testing, use:
frame_service_cli screenshot --out /tmp/screenshot.bmp
screenshot tool fails
Check:
/etc/init.d/S52frame_service status
frame_service_cli --socket /run/frame_service/frame_service.sock health
ls -l /run/frame_service/frame_service.sock
Common causes:
frame_serviceis not running;[hid].frame_socketpath inagent.tomlis inconsistent;- HDMI input is not synced;
- RK628D or TC358743 HDMI subdevice status is abnormal.
Frame Service keeps restarting
View logs:
tail -f /var/log/frame_service/frame_service.log
Check:
- Whether
/oem/usr/bin/frame_serviceexists and is executable; - Whether
/dev/video0and an RK628D or TC358743 subdevice exist; - Whether EDID / HDMI signal is normal;
- Whether other processes are using
/dev/video0.
Find the HDMI bridge subdevice without assuming a fixed index. RK628D reports
rk628-csi; TC358743 reports tc358743:
for f in /sys/class/video4linux/v4l-subdev*/name; do echo "$f: $(cat "$f")"; done
If the matching rk628-csi or tc358743 node was not selected, set
FRAME_SERVICE_SUBDEV=/dev/v4l-subdevX in
/etc/aiden_frame_service.conf to that node and restart S52frame_service.
Agent Web UI won't open
Check:
/etc/init.d/S53agent status
tail -f /userdata/agent/log/agent.log
netstat -lntp | grep 8080
Verify:
- The daemon is listening on port
8080; bothtextandsttmodes serve the Web UI; agent.tomlTOML syntax is correct;- Model configuration and API key are available;
- Firewall, USB network, or Wi-Fi IP is correct.
Wi-Fi connection is unstable
Solution:
- Connect an external 2.4 GHz antenna, antenna connector uses IPEX1 generation;
- Or try switching Wi-Fi channel to avoid heavily interfered channels.
Voice mode has no sound or cannot record audio
Check:
/etc/init.d/S53audio_service status
audio_service_cli --socket /run/audio_service/audio_service.sock health
audio_service_cli --socket /run/audio_service/audio_service.sock get-volume
amixer sget 'DAC HPMIX'
amixer sget 'DAC LINEOUT'
Recommendations:
- First run
scripts/setup_audio_volume.sh; - Confirm
[audio].socketpath matches the service; - Use
record-streamandplay-streamto verify recording/playback separately; - Check if
ffmpegexists when TTS fails.
RKNN VAD inference fails
First run helper self-test directly on the board:
/oem/usr/bin/rknn_vad --model /oem/usr/model/silero_vad_6_2_encoder_rv1106_w8a8_v1.rknn --weights /oem/usr/model/silero_vad_6_2_lstm_decoder_weights.bin --self-test
/oem/usr/bin/cpu_vad --weights /oem/usr/model/silero_vad_6_2_lstm_decoder_weights.bin --self-test
On success, it will output P <probability>. Current RV1106 helper uses RKNN zero-copy IO; if it outputs rknn_set_io_mem failed, rknn_run failed, or old helper outputs rknn_inputs_set failed, check:
- Whether
/oem/usr/lib/librknnmrt.soversion matches the model; - Whether
silero_vad_6_2_encoder_rv1106_w8a8_v1.rknnis the encoder model re-converted for RV1106 target; - Whether input/output tensor type, size, scale, zero-point in helper logs are normal.
HID input is ineffective
Check:
ls -l /dev/hidg*
mount | grep configfs
lsmod | grep -E 'dwc2|libcomposite'
Try reinitializing:
sudo ./build/bin/example_usb_hid cleanup
sudo ./build/bin/example_usb_hid setup composite
For iOS target devices, confirm AssistiveTouch is enabled.
Cannot capture screen from iPhone 16e
Cause: iPhone 16e's USB-C port has compatibility issues.
Solution:
- Currently unable to support screen capture from iPhone 16e;
- Switch to other compatible models for testing.
Board reboots frequently after connecting phone
Cause: Insufficient power supply.
Solution:
- Switch to a USB hub with better power supply capability;
- Or use a USB hub with external power support.
HTTP Tool API access exception
- Set
NO_PROXYfor device private IP / USB network adapter address; - First access
GET /api/toolsto confirm service is reachable; - When a tool invocation fails, check
is_errorandoutputin the response fromPOST /api/tools/{tool_name}; - Separate transport failure from tool failure judgement.
opkg update prints nothing, and no package can be found
# opkg update
# opkg install htop
error: opkg_prepare_url_for_install: Couldn't find anything to satisfy 'htop'.
opkg update prints one Downloading line per configured source, so silence
means no source is configured. Two different causes produce it:
cat /etc/opkg/*.conf | grep -E '^\s*(src|dist)' # any sources at all?
/etc/init.d/S22opt status # is /opt actually bound?
Every src line lives in /opt/etc/opkg/userfeeds.conf, so an unbound /opt
looks exactly like "no source was ever configured". Check both before writing a
source into a file that cannot be read.
Note this is not opkg refusing to start. /etc/opkg/90-userfeeds.conf is a
symlink into /opt, and when it dangles uClibc-ng's glob() silently drops it —
opkg never tries to open it and runs normally. The protection against installing
into the A/B rootfs comes from the read-only seal S22opt applies to /opt,
plus the fact that no source is reachable.
Recover the /opt mount
opt=bound is the only healthy status. Other states require mount recovery
before running opkg:
opt=sealed:/userdatawas unavailable or the bind mount failed, soS22optprotected the rootfs with a read-only tmpfs. Confirm that/userdatais mounted, fix the reported cause, then run/etc/init.d/S22opt restart.opt=wrong-source: something other than/userdata/optis mounted at/opt. Do not run opkg or unmount it blindly; stop processes using that mount, remove the configuration that created it, and reboot.opt=unbound: run/etc/init.d/S22opt restartand use its error output to diagnose the missing/userdatamount, directory creation failure, or bind failure.
After recovery, require a successful status check before continuing:
/etc/init.d/S22opt status
# opt=bound source=/userdata/opt
Configure a package feed
Package sources belong only in /opt/etc/opkg/userfeeds.conf. The init script
seeds the Entware source when it creates this file for the first time, but it
never changes an existing file, including an empty one. To enable or change a
feed, first verify that /opt is bound, then edit the file so it contains one
source declaration per feed:
src/gz entware https://bin.entware.net/armv7sf-k3.2
Avoid declaring the same source more than once. After saving the file, refresh the package lists and confirm that packages are visible:
opkg update
opkg list | head
Run plain opkg commands without -f; supplying a standalone configuration
file bypasses the fixed fragments under /etc/opkg that keep package files,
metadata, caches, and locks in their intended locations.
Recover opkg metadata
If an interrupted opkg update leaves only the downloaded package lists or
cache inconsistent, remove those regenerable files and download them again:
rm -f /opt/var/lib/opkg/lists/* /opt/var/cache/opkg/*
opkg update
Do not use that procedure for a truncated /opt/var/lib/opkg/status file. The
status file, /opt/var/lib/opkg/info, and the installed package files form one
state and must come from the same backup. Stop programs running from /opt,
unmount /opt, move the current /userdata/opt aside instead of overwriting
it, restore the complete backed-up tree at /userdata/opt, and start S22opt
again. Preserve file ownership, modes, and symlinks during the restore. The
S22opt stop action deliberately leaves /opt mounted because package
processes may still be running; it is not a substitute for stopping those
processes and running umount /opt before the replacement.
If no consistent backup exists, reset the whole package root rather than mixing
old package files with a new database. Stop /opt programs, unmount /opt, move
/userdata/opt to a recovery path, and run /etc/init.d/S22opt start. The init
script creates a clean package layout and feed file; then run opkg update and
reinstall the required packages. If /opt is busy, identify and stop its users
or reboot into a maintenance state, then repeat the unmount check before
replacing or restoring the package root.
Docker build fails
Check:
docker buildx version
docker info
Recommended for Apple Silicon:
colima start --vm-type vz --vz-rosetta
./build.sh
Confirm not using --arch x86_64 to start Colima VM.