Camemake
CameVision Ego Camemake 立体视觉 · NPU
购买 EGO
本软件包

软件

驱动、设备树、用户态、烧录。立体匹配、深度与标定都在相机上运行。

演示工具(烧录、现场页、标定)为英文界面。

运行位置

位置内容
本机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 / AWBrkaiq 3A 同时控制两路 ISP。两眼同一曝光与白平衡。从模式 HDR 关闭。
IMULSM6DSVQTR ×2 · 480 Hz
时间戳帧与 IMU 使用 CLOCK_MONOTONIC_ns。IMU JSON 含 CLOCK_REALTIME 与 ISO。RV-3028 设置系统时钟。录像:cam_left.timestamps.jsonl · cam_right.timestamps.jsonl
曝光 · 50 / 60 Hz50 Hz:曝光 N × 10 ms。60 Hz:曝光 N × 8.333 ms。IQ 默认 50 Hz 抗闪烁。

驱动

Boot FIT 中的内核为 6.1.141-rt52。树内节点来自 DTB。树外模块在 overlay 中,由启动脚本 insmod。

模块驱动 / 兼容串位置现场节点
MIPI 传感器smartsens,sc233hgsBoot FIT(内核 + DTB)I2C 3-0030、6-0030 · 芯片 ID 0xcb61
MIPI CSI-2 D-PHYcsi2_dphy0 · csi2_dphy1DTB,各 4 通道CSI RX0 / RX1 下的 PHY
MIPI CSI-2 主机mipi0_csi2 · mipi1_csi2DTB桥接到 CIF
CIFrkcif · rkcif_mipi_lvds · rkcif_mipi_lvds1DTB + Rockchip CIF进入 ISP 的 RAW 通路
ISP / VPSSrkisp · rkisp_vir0/1 · rkvpss_vir0/1 · rkdvbmDTB + Rockchip ISP/dev/video24 CAM0 · /dev/video32 CAM1
3A / IQrkaiq_3A_server/oem/usr/bin/ + overlay 中的 IQ JSON两路 ISP 同一 AE / AWB。从模式 HDR 关闭。
IMUst,lsm6dsv(IIO)Boot FIT · SPI0 / SPI1/sys/bus/iio/devices/iio:device1…4(陀螺 / 加速度 ×2)。步骤见 480 Hz。精度见 硬件
Wi-Fi / BLESDIO 1FFE:6621 · skw_sdio_lite · swt6621s_wifi · skwbtOverlay 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 gadgetDTB + rootfsADB 2207:0006 · UDC 21500000.usb
eMMC / SD / SDIO 主机emmc · sdmmc0 · sdmmc1DTBmmc0 eMMC · mmc1 µSD · mmc2 Wi-Fi
RTC / 电源管理rv3028 I2C2 0x52 · rk801 I2C0 0x27DTB/dev/rtc0 · PMIC 稳压器
NPU / GPU / MPPrknpu · 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@0st,lsm6dsv,SPI 模式 3,1 MHz,st,odr-triggered
sdmmc1 + sdio-pwrseq · wireless-wlan · UART2 蓝牙VS6621
emmc 8 位 HS200 · sdmmc0 4 位正常
usb@21500000dr_mode = peripheral(ADB)
usb_host_ehci · ohci · gmac · dsi · i2c1 · i2c5关闭
uart0调试串口 1.5 Mbaud

IMU 480 Hz

两颗 LSM6DSVQTR。加速度和陀螺速率:sampling_frequency。

相机现场页总线陀螺加速度
CAM0右SPI0iio:device1iio:device2
CAM1左SPI1iio:device3iio: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

1. 打开壳

adb shell

2. 核对四个设备

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 驱动。

3. 关闭缓冲

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

4. 设为 480 Hz

for d in 1 2 3 4; do
  echo 480 > /sys/bus/iio/devices/iio:device$d/sampling_frequency
done

5. 读回

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 轮询速率之和。

6. 480 写在哪里

四个 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。

7. 改这个数

现场页:改 /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。下一次抬头显示启动和下一次录像开始,把各自的值写入这四个文件。

8. 录像里保存的样本

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。到达的帧跟随触发。

1. 改现场画面

改 /userdata/ego_stereo.py 里的 PREVIEW_FPS。该文件下次启动时读取新数。开机由 /userdata/camevision-stereo.sh 在进程未运行时启动。正在运行的进程保持启动时的 PREVIEW_FPS。/stat 的 color_fps 是这个循环。

2. 改手机画面

改 /userdata/ego_phone_link.py 里的 PREVIEW_PERIOD。该文件下次启动时读取新间隔。正在运行的手机链路保持启动时的间隔。

3. 改空闲触发

改 /userdata/ego_stereo.py 里的 trig_fps。该文件下次启动时用这个数调用 set_fps。无录像时 GPIO 周期为 1/trig_fps。

4. 改录像帧率

改 /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)。

5. 传感器时序可选值

apply_vts 参数VTS垂直消隐
低于 5532002000
55 及以上1600400

本包的录像使用触发 50,VTS 1600。空闲触发为 24,时序保持上一次 apply_vts 留下的值。

Wi-Fi 名称和密码

相机加入 /userdata/wpa_camevision.conf 里的网络。源文件:tools/wpa_camevision.conf。camevision-wifi.sh 把该板上文件读作 CONF。

1. 字段

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。
protoRSN。
pairwise · groupCCMP。
priority10。
scan_ssid1。

2. 改板上文件

adb shell
vi /userdata/wpa_camevision.conf

改 ssid 和 psk。保留引号。该文件在 /userdata,重启后仍在。

3. 重新加入

sh /userdata/camevision-wifi.sh

camevision-wifi.sh 用该文件在 wlan0 上启动 wpa_supplicant,驱动 nl80211。开机时 /userdata/camevision-stereo.sh 在 wlan0 没有 IPv4 地址且该脚本未运行时执行同一脚本。

4. 读回

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.binrestore/known-good-20260819-camera-adb/ 或 restore/updates/current/
0x0env.img同上
0x40idblock.img同上
0x440uboot.img同上
0x2440camevision_boot_ego.img内核 + DTB FIT
0x7C40userdata.img再写 overlay
0x207C40oem_noko.imgIQ 二进制、rkaiq、oem 库
0x607C40rootfs_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

只重建 boot FIT

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。

启动链

  1. S11hwclock:RV-3028 → 系统时钟。
  2. S99ego-stereo:等待后启动立体脚本。
  3. tools/camevision-stereo.sh:kmpp、Wi-Fi、rkaiq 3A、IMU 抬头显示,然后 ego_stereo.py。
  4. 电脑 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.soC 块匹配与 NV12 叠加。现场页加载的共享库。
FSYNC / EFSYNCtools/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 · 端口 8083IMU0(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)。
对焦 / MTFtools/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 STAtools/camevision-wifi.sh/userdata/camevision-wifi.shVS6621 模块 + wpa_camevision.conf。步骤。
IQoverlay/iqfiles/…default.json/userdata/iqfiles/ → /oem/usr/share/iqfiles/SC233HGS 3A / ISP 调参,供 rkaiq_3A_server 使用。
设备树device-tree/rv1126b-camevision-ego.dtsFIT / 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
/statJSON 状态
/imu来自 :8083 的 JSON
/trigFSYNC / EFSYNC 状态
/cal标定界面(英文)
/cal/stat · /cal/start · /cal/sample · /cal/stop · /cal/reset标定会话
/focus/start · /focus/stopMTF
/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.pyRockusb + ADB(Windows),udev 2207(Linux)
烧录tools/cv_ego_flash.pyMaskrom 写入 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.pyADB 转储:身份、I2C、IMU、视频、dmesg
更新tools/cv_ego_update.pyGitHub 或 zip → restore/updates/current
录像(主机)tools/cv_ego_record_host.py监听 8091,写入会话文件夹
路径tools/cv_ego_paths.pyADB、upgrade_tool、镜像、overlay 根目录

替换一块

文件放在 tools/,然后:

python tools/cv_ego_overlay_deploy.py

现场进程:python3 /userdata/ego_stereo.py。