驱动、设备树、用户态、烧录。立体匹配、深度与标定都在相机上运行。
演示工具(烧录、现场页、标定)为英文界面。
| 位置 | 内容 |
|---|---|
| 本机 | USB 驱动、烧录、overlay 推送、ADB 转发、诊断、会话写入 |
板上 /userdata | 立体页、FSYNC/EFSYNC、IMU 抬头显示、标定界面、Wi-Fi STA、IQ JSON、本地匹配器、启动脚本 |
| 板内核 | 设备树、CSI、I2C/SPI、SDIO Wi-Fi、ADB 配件:device-tree/rv1126b-camevision-ego.dts |
源码:tools/。Overlay:restore/release-0.2-20260902/overlay/ → /userdata/。链接:/src/…。
手机应用是 CameVision-App 1.2.11。应用语言是英文。第一次打开和设置里可以改成中文。
第一次打开先选 USB 录制和预览,或只用蓝牙控制。之后可以在设置里改。USB 模式是相机画面和设置。蓝牙模式是录制、存储卡和设置。
走 USB 时,电脑仍用配置 1。Ego 保持 ADB,2207:0006。手机选择配置 2,录 HEVC 1920×1200、50 帧/秒,双眼和两路 IMU。目录是 My Recordings/<session>/episode 和 synced,里面有 cam_left.mp4 和 cam_right.mp4。录制时关掉实时画面。只有打开 microSD 缓冲时,相机会先把这一段写在卡上。
走蓝牙时,手机在卡上开始和停止录制,再拷贝或上传。卡上的目录仍是 camevision/sessions/。
| 项 | 值 |
|---|---|
| 基线 | 75.0 mm · CAM0 左 · CAM1 右。深度误差按此基线计算。 |
| 同步 | RV1126B GPIO 直接控制 FSYNC + EFSYNC。为 RV1126B 能达到的最高同步。 |
| 帧率 | 全部商城传感器 60 fps。Ego 立体最高 60 fps。演示触发 12.5 fps。步骤。 |
| AE / AWB | rkaiq 3A 同时控制两路 ISP。两眼同一曝光与白平衡。从模式 HDR 关闭。 |
| IMU | LSM6DSVQTR ×2 · 480 Hz |
| 时间戳 | 帧与 IMU 使用 CLOCK_MONOTONIC_ns。IMU JSON 含 CLOCK_REALTIME 与 ISO。RV-3028 设置系统时钟。录像:cam_left.timestamps.jsonl · cam_right.timestamps.jsonl |
| 曝光 · 50 / 60 Hz | 50 Hz:曝光 N × 10 ms。60 Hz:曝光 N × 8.333 ms。IQ 默认 50 Hz 抗闪烁。 |
Boot FIT 中的内核为 6.1.141-rt52。树内节点来自 DTB。树外模块在 overlay 中,由启动脚本 insmod。
| 模块 | 驱动 / 兼容串 | 位置 | 现场节点 |
|---|---|---|---|
| MIPI 传感器 | smartsens,sc233hgs | Boot FIT(内核 + DTB) | I2C 3-0030、6-0030 · 芯片 ID 0xcb61 |
| MIPI CSI-2 D-PHY | csi2_dphy0 · csi2_dphy1 | DTB,各 4 通道 | CSI RX0 / RX1 下的 PHY |
| MIPI CSI-2 主机 | mipi0_csi2 · mipi1_csi2 | DTB | 桥接到 CIF |
| CIF | rkcif · rkcif_mipi_lvds · rkcif_mipi_lvds1 | DTB + Rockchip CIF | 进入 ISP 的 RAW 通路 |
| ISP / VPSS | rkisp · rkisp_vir0/1 · rkvpss_vir0/1 · rkdvbm | DTB + Rockchip ISP | /dev/video24 CAM0 · /dev/video32 CAM1 |
| 3A / IQ | rkaiq_3A_server | /oem/usr/bin/ + overlay 中的 IQ JSON | 两路 ISP 同一 AE / AWB。从模式 HDR 关闭。 |
| IMU | st,lsm6dsv(IIO) | Boot FIT · SPI0 / SPI1 | /sys/bus/iio/devices/iio:device1…4(陀螺 / 加速度 ×2)。步骤见 480 Hz。精度见 硬件 |
| Wi-Fi / BLE | SDIO 1FFE:6621 · skw_sdio_lite · swt6621s_wifi · skwbt | Overlay swt6621-rt52/ + 固件 swt6621_fw/ | mmc2 · wlan0 · hci0 |
| Wi-Fi 协议栈 | cfg80211 · mac80211 · AES / CCM | 由 camevision-wifi.sh 加载 | nl80211 + wpa_camevision.conf。步骤。 |
| USB 配件 | DWC3 dr_mode=peripheral · configfs gadget | DTB + rootfs | ADB 2207:0006 · UDC 21500000.usb |
| eMMC / SD / SDIO 主机 | emmc · sdmmc0 · sdmmc1 | DTB | mmc0 eMMC · mmc1 µSD · mmc2 Wi-Fi |
| RTC / 电源管理 | rv3028 I2C2 0x52 · rk801 I2C0 0x27 | DTB | /dev/rtc0 · PMIC 稳压器 |
| NPU / GPU / MPP | rknpu · mali · mpp | 内核 + overlay 中的 kmpp-rt52.ko | /dev/rknpu · /dev/mali* · /dev/mpp_service |
DTB 中的相机通路:传感器 → D-PHY → CSI-2 → CIF → ISP → VPSS。Wi-Fi 模块按本 rt52 内核编译,从 /userdata/swt6621-rt52 加载。固件在 /userdata/swt6621_fw(Seekwave / SWT6621S NV)。
板级源:device-tree/rv1126b-camevision-ego.dts。包含 rv1126b.dtsi。型号字符串 CameVision Ego,兼容 camemake,camevision-ego。
Boot FIT 携带编译后的 DTB。改 DTS 后需重建并写入 boot 分区。
| 节点 | 状态 |
|---|---|
i2c3/sc233hgs@30 · i2c-gpio-cam1/sc233hgs@30 | 双相机,27 MHz XVCLK,4 通道 |
i2c4 | 关闭:CAM1 SCL/SDA 对调,改用软件模拟 |
csi2_dphy0/1 · mipi0/1_csi2 · rkcif* · rkisp* · rkvpss* | 正常:双通路 |
spi0/imu@0 · spi1/imu@0 | st,lsm6dsv,SPI 模式 3,1 MHz,st,odr-triggered |
sdmmc1 + sdio-pwrseq · wireless-wlan · UART2 蓝牙 | VS6621 |
emmc 8 位 HS200 · sdmmc0 4 位 | 正常 |
usb@21500000 | dr_mode = peripheral(ADB) |
usb_host_ehci · ohci · gmac · dsi · i2c1 · i2c5 | 关闭 |
uart0 | 调试串口 1.5 Mbaud |
两颗 LSM6DSVQTR。加速度和陀螺速率:sampling_frequency。
| 相机 | 现场页 | 总线 | 陀螺 | 加速度 |
|---|---|---|---|---|
| CAM0 | 右 | SPI0 | iio:device1 | iio:device2 |
| CAM1 | 左 | SPI1 | iio:device3 | iio:device4 |
目录:/sys/bus/iio/devices/iio:deviceN/。SPI 模式 3,1 MHz。数据就绪为 INT1。设备树:st,odr-triggered。
第 2 步打印当前驱动的 sampling_frequency_available。第 4 步、ODR、两处 write_text 各取该列表中的一个数。
| Hz | |
|---|---|
| 加速度 | 1.875 · 7.5 · 15 · 30 · 60 · 120 · 240 · 480 · 960 · 1920 · 3840 · 7680 |
| 陀螺 | 7.5 · 15 · 30 · 60 · 120 · 240 · 480 · 960 · 1920 · 3840 · 7680 |
adb shell
for d in 1 2 3 4; do echo -n "device$d " cat /sys/bus/iio/devices/iio:device$d/name echo -n " available " cat /sys/bus/iio/devices/iio:device$d/sampling_frequency_available echo done
每行 name 为 LSM6DSV 驱动。
buffer/enable 为 1 时,写入 sampling_frequency 会被拒绝。
for d in 1 2 3 4; do echo 0 > /sys/bus/iio/devices/iio:device$d/buffer/enable done
for d in 1 2 3 4; do echo 480 > /sys/bus/iio/devices/iio:device$d/sampling_frequency done
for d in 1 2 3 4; do echo -n "device$d " cat /sys/bus/iio/devices/iio:device$d/sampling_frequency done
每行读数为 480。端口 8083 的 JSON:odr_hz 为请求速率。read_hz 为两路 IMU 的 sysfs 轮询速率之和。
四个 sampling_frequency 文件是芯片速率。现场页和录像写的是这四个文件。
| 位置 | 何时写入芯片 | 速率显示在哪里 |
|---|---|---|
| 现场页 | tools/ego_imu_hud.py,板上为 /userdata/ego_imu_hud.py。camevision-stereo.sh 在开机时、该进程未运行时启动它。进程启动时,每个加速度和每个陀螺各写入一次 ODR = "480"。先把 buffer/enable 置 0。 |
端口 8083,以及现场页 /imu。odr_hz 是正在运行的进程里的 ODR。read_hz 是抬头显示的轮询速率,两路 IMU 相加。 |
| 手机实时 IMU | 手机链路读取端口 8083。芯片写入见上一行现场页。 | tools/ego_phone_link.py,板上为 /userdata/ego_phone_link.py,发送该 JSON 里的 odr_hz、imu0、imu1。 |
| 网页录像 | POST /record/start 调用 tools/ego_record.py 的 start(),板上为 /userdata/ego_record.py。_imu_loop 向四个文件写入 480,然后读原始寄存器。 |
录像中的 IMU 行。每一行的时间戳是读取时的 CLOCK_MONOTONIC。循环在两次读取之间等待 1 ms。 |
| 手机录像 | POST /record/phone/start 和 POST /record/phone/start-sd 调用同一个 start()。 |
录像中同样的 IMU 行。 |
| 本机录像 | POST /record/local/start 调用同一个 start()。 |
录像中同样的 IMU 行。 |
| 壳 | 第 4 步当时写入四个文件。 | 第 5 步,cat sampling_frequency。 |
现场页:改 /userdata/ego_imu_hud.py 里的 ODR。该进程启动时写入新值。开机由 /userdata/camevision-stereo.sh 在进程未运行时启动。在这次启动之前,端口 8083 和 /imu 继续报当前进程的 ODR。手机实时 IMU 跟随这份 JSON。
录像:改 /userdata/ego_record.py 里 _imu_loop 的两处 write_text。下一次 /record/start、/record/phone/start、/record/phone/start-sd 或 /record/local/start 时写入新值。
壳:第 4 步写入芯片。正在运行的抬头显示保持自己的 odr_hz。下一次抬头显示启动和下一次录像开始,把各自的值写入这四个文件。
ego_record.py 约每 1 ms 读取 in_accel_x_raw、in_accel_y_raw、in_accel_z_raw、in_anglvel_x_raw、in_anglvel_y_raw、in_anglvel_z_raw。时间戳是读取时的 CLOCK_MONOTONIC。写入的是该次读取时寄存器中的值。同一样本可能写入两次。两次读取之间到达的样本可能被跳过。
每个输出周期一个样本来自传感器 FIFO,或来自 INT1 上 DRDY 触发的 IIO buffer。抬头显示和录像读取 oneshot sysfs。
现场画面、手机画面、触发和录像各有自己的数。
| 位置 | 板上文件 | 本包中的数 | 显示位置 |
|---|---|---|---|
| 现场页画面 | ego_stereo.py · /userdata/ego_stereo.py · PREVIEW_FPS |
15 | /stat 的 color_fps。现场页 JPEG。 COLOR_PERIOD = 1/PREVIEW_FPS。 |
| 手机实时画面 | tools/ego_phone_link.py · /userdata/ego_phone_link.py · PREVIEW_PERIOD |
1/15 秒 | 两次手机 JPEG 之间的间隔。 |
| 空闲触发 | /userdata/ego_stereo.py · trig_fps |
24 | 无录像时的 GPIO FSYNC/EFSYNC 周期。由 ego_stereo.py 启动时经 tools/ego_cam_sync.py 的 set_fps 设置。 |
| 录像 | tools/ego_record.py · /userdata/ego_record.py · LOCAL_FPS |
50 | HEVC 1920×1200,双眼。start() 用 LOCAL_FPS 设置 FPS、TRIG_FPS、GOP,然后调用 _raise_rate。 |
| 传感器时序 | /userdata/ego_cam_sync.py · VTS_30 · VTS_60 |
30 时为 3200 · 60 时为 1600 | 录像开始时 apply_vts(60)。录像停止时,若保存的触发低于 55,则 apply_vts(30)。set_fps 把 GPIO 周期设为 1/fps,并在 fps 达到 55 及以上时调用 apply_vts。 |
| 采集请求 | /userdata/ego_stereo.py · CAP_FPS |
30,然后 24,然后 30 | v4l2-ctl --set-parm。到达的帧跟随触发。 |
改 /userdata/ego_stereo.py 里的 PREVIEW_FPS。该文件下次启动时读取新数。开机由 /userdata/camevision-stereo.sh 在进程未运行时启动。正在运行的进程保持启动时的 PREVIEW_FPS。/stat 的 color_fps 是这个循环。
改 /userdata/ego_phone_link.py 里的 PREVIEW_PERIOD。该文件下次启动时读取新间隔。正在运行的手机链路保持启动时的间隔。
改 /userdata/ego_stereo.py 里的 trig_fps。该文件下次启动时用这个数调用 set_fps。无录像时 GPIO 周期为 1/trig_fps。
改 /userdata/ego_record.py 里的 LOCAL_FPS。下一次 POST /record/start、/record/phone/start、/record/phone/start-sd 或 /record/local/start 用 LOCAL_FPS 设置 FPS、TRIG_FPS、GOP,调用 apply_vts(60),再调用 set_fps(LOCAL_FPS)。停止时把触发恢复为这段录像开始时保存的值,该值低于 55 时调用 apply_vts(30)。
apply_vts 参数 | VTS | 垂直消隐 |
|---|---|---|
| 低于 55 | 3200 | 2000 |
| 55 及以上 | 1600 | 400 |
本包的录像使用触发 50,VTS 1600。空闲触发为 24,时序保持上一次 apply_vts 留下的值。
相机加入 /userdata/wpa_camevision.conf 里的网络。源文件:tools/wpa_camevision.conf。camevision-wifi.sh 把该板上文件读作 CONF。
network={
ssid="network name"
psk="passphrase"
key_mgmt=WPA-PSK
proto=RSN
pairwise=CCMP
group=CCMP
priority=10
scan_ssid=1
}
| 字段 | 作用 |
|---|---|
ssid | 网络名称。 |
psk | 密码。 |
key_mgmt | 本文件为 WPA-PSK。 |
proto | RSN。 |
pairwise · group | CCMP。 |
priority | 10。 |
scan_ssid | 1。 |
adb shell vi /userdata/wpa_camevision.conf
改 ssid 和 psk。保留引号。该文件在 /userdata,重启后仍在。
sh /userdata/camevision-wifi.sh
camevision-wifi.sh 用该文件在 wlan0 上启动 wpa_supplicant,驱动 nl80211。开机时 /userdata/camevision-stereo.sh 在 wlan0 没有 IPv4 地址且该脚本未运行时执行同一脚本。
wpa_cli -i wlan0 status ip -4 addr show wlan0
wpa_state=COMPLETED 表示已加入。该状态里的 ssid 是文件中的名称。ip -4 addr 在 DHCP 之后显示地址。日志:/userdata/wifi.log 和 /userdata/wpa.log。
Maskrom。空板或已有镜像的板均可。
| LBA | 镜像 | 本包位置 |
|---|---|---|
| loader(db 一次) | rv1126b_spl_loader_k4a8g.bin | restore/known-good-20260819-camera-adb/ 或 restore/updates/current/ |
0x0 | env.img | 同上 |
0x40 | idblock.img | 同上 |
0x440 | uboot.img | 同上 |
0x2440 | camevision_boot_ego.img | 内核 + DTB FIT |
0x7C40 | userdata.img | 再写 overlay |
0x207C40 | oem_noko.img | IQ 二进制、rkaiq、oem 库 |
0x607C40 | rootfs_bootstable.img | 根文件系统 |
python tools/cv_ego_flash.py --prebuilt
tools/cv_ego_flash.py → tools/cv_ego_wifi_full_flash.py。先 upgrade_tool db 写一次 1 GB DDR loader,再 wl 各 LBA,rd,然后通过 ADB 写 overlay。
host/upgrade_tool.exe db restore/known-good-20260819-camera-adb/rv1126b_spl_loader_k4a8g.bin host/upgrade_tool.exe wl 0x0 env.img host/upgrade_tool.exe wl 0x40 idblock.img host/upgrade_tool.exe wl 0x440 uboot.img host/upgrade_tool.exe wl 0x2440 camevision_boot_ego.img host/upgrade_tool.exe wl 0x7C40 userdata.img host/upgrade_tool.exe wl 0x207C40 oem_noko.img host/upgrade_tool.exe wl 0x607C40 rootfs_bootstable.img host/upgrade_tool.exe rd python tools/cv_ego_overlay_deploy.py
python tools/cv_ego_flash.py --rebuild 运行 DTB 补丁与 tools/cv_pack_release02.py,再写同样分区。Boot 镜像:camevision_boot_ego.img(FIT,11 MiB / 0x5800 扇区)。
分区不动。文件在 tools/,然后 python tools/cv_ego_overlay_deploy.py。
S11hwclock:RV-3028 → 系统时钟。S99ego-stereo:等待后启动立体脚本。tools/camevision-stereo.sh:kmpp、Wi-Fi、rkaiq 3A、IMU 抬头显示,然后 ego_stereo.py。tools/cv_ego_page.py:adb forward 8081 与 8083,打开浏览器(英文界面)。| 模块 | 文件 | 板上路径 | 作用 |
|---|---|---|---|
| 现场立体 | tools/ego_stereo.py | /userdata/ego_stereo.py · 端口 8081 | 读 /dev/video24(CAM0)与 /dev/video32(CAM1)。JPEG 现场页、深度叠加、标定路由、录像控制。加载 libego_stereo.so。 |
| 匹配器 | tools/stereo_native.c | /userdata/libego_stereo.so | C 块匹配与 NV12 叠加。现场页加载的共享库。 |
| FSYNC / EFSYNC | tools/ego_cam_sync.py | 现场页导入 | GPIO4_A1/A0 + GPIO6_C2/C3,两眼同一节拍。RV1126B 直接控制,为该 SoC 能达到的最高同步。传感器寄存器 0x3222 / 0x3282。传感器 60 fps,Ego 最高 60 fps,演示触发 12.5 fps。 |
| IMU 抬头显示 | tools/ego_imu_hud.py | /userdata/ego_imu_hud.py · 端口 8083 | IMU0(SPI0,CAM0)与 IMU1(SPI1,CAM1)的 JSON。现场页把 /imu 代理到此端口。 |
| 标定界面 | tools/ego_calib.html | /userdata/ego_calib.html · /cal | 浏览器界面(英文)。经现场页写入 /userdata/ego_calib.json(/cal/start、/cal/sample、/cal/stop)。 |
| 对焦 / MTF | tools/ego_mtf.py | 现场页导入 | 1920×1200 Y 平面上的 ISO 12233 斜边 MTF50。/focus/start、/focus/stop。 |
| 录像(板) | tools/ego_record.py | 由现场页启动 | 把现场 NV12 的 HEVC 送到电脑 8091。/record/start、/record/stat。 |
| Wi-Fi STA | tools/camevision-wifi.sh | /userdata/camevision-wifi.sh | VS6621 模块 + wpa_camevision.conf。步骤。 |
| IQ | overlay/iqfiles/…default.json | /userdata/iqfiles/ → /oem/usr/share/iqfiles/ | SC233HGS 3A / ISP 调参,供 rkaiq_3A_server 使用。 |
| 设备树 | device-tree/rv1126b-camevision-ego.dts | FIT / boot 镜像 | 相机、IMU、Wi-Fi、SD、LED、USB 配件。硬件页是该文件的管脚表。 |
在板上。主机用 python tools/cv_ego_page.py 打开。界面为英文。
| 路径 | 内容 |
|---|---|
/ | 现场 HTML:/ov0 与 /ov1 MJPEG |
/ov0 · /ov1 | 带深度叠加的 MJPEG |
/raw0 · /raw1 | 无叠加的 MJPEG |
/depth | 深度视图 |
/snap0 · /snap1 · /snapx | 单张 JPEG |
/stat | JSON 状态 |
/imu | 来自 :8083 的 JSON |
/trig | FSYNC / EFSYNC 状态 |
/cal | 标定界面(英文) |
/cal/stat · /cal/start · /cal/sample · /cal/stop · /cal/reset | 标定会话 |
/focus/start · /focus/stop | MTF |
/align | 立体对齐 |
/record/start · /record/stat | 会话录像 |
IMU JSON 与立体页一同转发(cv_ego_page.py)。
| 模块 | 文件 | 作用 |
|---|---|---|
| 首次主机 | tools/cv_ego_host_setup.py | 捆绑 Python、USB 驱动 / udev |
| USB 驱动 | tools/cv_ego_driver.py | Rockusb + ADB(Windows),udev 2207(Linux) |
| 烧录 | tools/cv_ego_flash.py | Maskrom 写入 loader…rootfs,再写 overlay |
| Overlay 推送 | tools/cv_ego_overlay_deploy.py | 经 ADB 把 overlay 拷到 /userdata |
| 打开现场页 | tools/cv_ego_page.py | 转发 8081 / 8083 |
| 自动启动 | tools/cv_ego_autostart.py | 主机监视:部署 + 转发 + 页面 |
| 诊断 | tools/cv_ego_diag.py | ADB 转储:身份、I2C、IMU、视频、dmesg |
| 更新 | tools/cv_ego_update.py | GitHub 或 zip → restore/updates/current |
| 录像(主机) | tools/cv_ego_record_host.py | 监听 8091,写入会话文件夹 |
| 路径 | tools/cv_ego_paths.py | ADB、upgrade_tool、镜像、overlay 根目录 |
文件放在 tools/,然后:
python tools/cv_ego_overlay_deploy.py
现场进程:python3 /userdata/ego_stereo.py。