关于添加新sensor之后,找不到id问题

代码设置了0x02 chip addr,chip id 0x53 ,实际读出来也是对应,但是日志显示找不到sensor 是什么原因

i2cget 能读到 0x53,说明器件供电、I2C 通路和 7 位地址 0x3c 都没问题;框架读到 0x00 是它自己那条读取路径和你用户态读法不一致,并不等于“没有 sensor”。日志里 vcon@1 绑 bus 6、vcon@2 和 vcon@3 都绑 bus 4,并且在逐个试 0x3c / 0x3e,所以先别把“搜不到”当成器件问题。

1)区分寄存器地址位宽(最常见的差异点)。i2cget 走的是单字节寄存器地址,而 sensor so 里 SENSOR_MODULE_F(xxx, CAM_MODULE_FLAG_A16D8) 声明的是 16bit 寄存器地址 + 8bit 数据。两种方式各读一次同一个 chip id 寄存器:

i2ctransfer -y 4 w1@0x3c 0x02 r1        # 8bit 寄存器地址
i2ctransfer -y 4 w2@0x3c 0x00 0x02 r1   # 16bit 寄存器地址

若只有 8bit 形式返回 0x53,就说明 so 里的 flag 要和器件实际一致(8bit 地址/8bit 数据,如 A8D8 一类),chip id 的寄存器地址、期望值/掩码也按 datasheet 逐字核对。

2)确认框架探测的 bus/addr 和你实测的一致:日志显示 vcon@2 与 vcon@3 都绑了 bus 4,请按原理图确认实际接入的 RX 口与 vcon/rx_phy 一一对应;同时确认 sample 配置表里 addr 是 7 位地址 0x3c(不是 0x78),并确认板端加载的就是你新编的 so(ls -l /usr/hobot/lib/sensor/ 下同名库是否有多份、路径是否被覆盖)。

3)日志里的 mipi mclk is not configured 未必是 chip id 读 0x00 的原因,但如果你的模组靠 SOC 给 mclk,需要先把对应 RX 口切到 24M mclk(S100 相机扩展板拨码开关;S600 走加串器),否则后面开流还会失败。

参考 Camera 点亮:添加新 sensor(dts/i2c/mclk、sensor 驱动与配置字段说明)。

还需要确认两点:板型是 S100 还是 S600、系统/SDK 版本;你这次是只改了 sample 的 sensor 配置,还是同时重编了 /usr/hobot/lib/sensor 下的 so、并改过 dts 里的 vcon bus 号?

sensor 寄存器是8 位地址,8位数据,这个需要另外设置吗,在哪里设置

要设置,而且不在 sample 的 sensor 配置表里——那张表的 addr 只是 7 位从地址,0x3c 你已经填对了。位宽声明在 sensor 驱动 so 里,两处:

1)模块声明里的 flag。官方模板就是 SENSOR_MODULE_F(imx219, CAM_MODULE_FLAG_A16D8);,从命名看 A16D8 指寄存器地址 16bit、数据 8bit,而你的器件是 8bit 地址 + 8bit 数据,需要换成 8bit 地址对应的宏。宏名先去 SDK 头文件确认,别凭猜:

grep -rn "CAM_MODULE_FLAG" <hobot-camera源码目录>/ --include=*.h

看宏定义旁的注释选 8bit 地址那一项替换掉 A16D8。

2)驱动内部的寄存器读写和 init setting 表。寄存器地址只发 1 字节,读写封装不要沿用 imx219 那套 uint16_t addr(会发 2 字节地址);setting 表里的寄存器地址也按单字节写。

改完重编 so,拷到 /usr/hobot/lib/sensor/,再跑 get_vin_data,看 WARN 行的 Actual Chip ID 是否变成 0x53。

依据:你上一张图的实测已经把方向定下来了——w2@0x3c 0x00 0x02 r1 读回 0x00,w1@0x3c 0x02 r1 读回 0x53,说明这颗器件不接受 16bit 地址访问;框架读回 0x00 与"按 16bit 地址发出去"的结果一致,所以最可能卡在 A16D8 这个声明上(这一条是推断,改完以日志为准)。

参考 添加新 sensor 点亮步骤(SENSOR_MODULE_F 标志位写法、so 部署路径与错误码)。

如果 grep 出来只有 A16D8 一类、没有 8bit 地址的枚举,把头文件里这几个宏发我,我们再看检测侧该怎么改;mipi mclk is not configured 和 vcon@2/vcon@3 都绑 bus 4 是另外两条独立问题,等这个过了再顺着日志处理。

我的是rdx x5平台,没有找到设置数据长度的地方

X5 上没有“数据长度/地址位宽”这个配置项,sample 的 sensor 配置表里 addr 只是 7 位从地址,也没有 json 或图形界面可设——位宽写在你自己那个 sensor 驱动 so 的源码里,改完重编再部署到 /usr/hobot/lib/sensor/。官方 Camera 调试指南给的驱动位置是 hbre/camsys/libcam/src/sensor/<sensor_name>/,产物是 lib<sensor_name>.so。

两处要看:

1)模块声明里的 flag,官方各厂家 bringup 示例都是这一行:

SENSOR_MODULE_F(os08c10, CAM_MODULE_FLAG_A16D8);

A16D8 = 16bit 寄存器地址 + 8bit 数据,你这颗是 8bit 地址,就得换成头文件里 8bit 地址对应的宏。宏名别猜,直接在源码树里查:

grep -rn "CAM_MODULE_FLAG" <libcam源码根目录>/ --include=*.h

2)驱动内部读写寄存器的封装。实际发几个地址字节由这段代码决定;若沿用参考驱动那种 uint16_t addr 的参数(如 os08c10/imx219 风格),读 chip id 时就会发 2 字节地址。init setting 表里的寄存器地址也按单字节写。

需要纠正一点判断依据:你日志里 0x3e 那一行同样打印 Actual Chip ID Read: 0x00,而 i2cdetect 显示 0x3e 上没有器件,说明读失败也会显示 0x00。所以 0x00 本身不能直接证明是 16bit 地址造成的,得看 i2c 返回码或驱动侧打印才能定性。先确认这行打印是谁出的:

grep -rn "Actual Chip ID" /app/multimedia_samples /usr/hobot 2>/dev/null

带 os02h10-25fps 这种名字,说明是 app 侧按配置表遍历探测;如果这段探测不走你的 so,改 flag 对这行无效,要按它用的读接口去核对位宽。

把你 so 里 sensor_init 读 chip id 那段贴出来(或直接说 sensor 型号 + chip id 寄存器地址),我按这个帮你确认该用哪种位宽。

参考:Camera 调试指南(驱动位置与命名、sensor_module_t 接口)、OmniVision Sensor Bring-Up(SENSOR_MODULE_F 模块声明写法)

X5 要看 vp_sensors/vp_sensors.c 的 read_chip_id():官方默认读法固定发送两字节寄存器地址,与你单字节读到 0x53、双字节读到0的现象一致。这段探测不会跟着 sensor so 的位宽标志改变。

给 os02h10 单独使用8位地址/8位数据的读ID逻辑(向 0x3c 发 0x02,读1字节并校验 0x53),再重编 get_vin_data。新版可用 read_chip_id_cb,旧版加专用分支,别全局改公共函数影响其他相机;后续驱动的寄存器读写也要匹配8位格式。

官方代码:https://github.com/D-Robotics/x5-multimedia-samples/blob/main/vp_sensors/vp_sensors.c

修改8位地址8位数据后,这样是识别到了吗, 但是报了错,是因为config_file里面配置问题吗

看logcat显示初始化失败

样例侧已经探测到了;第10楼的 os02h10 chip ID mismatch 是驱动内部校验失败,随后才返回 -203。现在查 libos02h10.so 的 sensor_init() 中打印这条错误的位置。

确认这里也用8位地址/8位数据读取:总线4、设备 0x3c、寄存器 0x02 应读到 0x53;ID 寄存器及完整校验值要按 OS02H10 手册核对,别保留原参考 sensor 的值,也别跳过校验。重编并替换板端实际加载的 so;只改样例探测还不够,驱动后续寄存器读写也要匹配。

驱动位置及部署说明:https://developer.d-robotics.cc/x5_sdk_doc/multimedia_development/isp_tuning_guide/Camera_sensor_bringup.html

看代码是这个位置,

然后我代码里面修改了8位地址8位数据读写,还是不匹配

按照教程文件部署到板端,还有哪里需要修改吗

日志提示这个,但是速率已经设置800 ,还是提示这个错误