我无法使用 C/C++ 通过 I2C 总线访问系统上的图像传感器 OV5645 的寄存器。以下是有关我的系统的一些信息:
Hardware:
Dragonboard 410c +
96Boards MIPI Adapter with Dual OV5645
(https://www.ebay.com/itm/96Boards-MIPI-Adapter-with-Dual-OV5645/253645902432?hash=item3b0e795260%25253Ag%25253AL38AAOSwCmNZyJq5%252525EF%252525BC%25252589)
OS :
Linaro Linux 19.01
由于我可以使用GStreamer控制两个OV5645来反馈捕获的图像,因此硬件连接似乎没有问题。以下是我的系统中有关 I2C 主控和 OV5645 的一些信息:
linaro@linaro-developer:~$ sudo i2cdetect -l
i2c-3 i2c QUP I2C adapter I2C adapter
i2c-1 i2c QUP I2C adapter I2C adapter
i2c-4 i2c Qualcomm Camera Control Interface I2C adapter
i2c-0 i2c QUP I2C adapter I2C adapter
linaro@linaro-developer:~$ dmesg | grep ov5645
[ 11.825197] ov5645 4-003b: OV5645 detected at address 0x3b
[ 12.290626] ov5645 4-003a: OV5645 detected at address 0x3a
这是我的短节目:https://gist.github.com/oliverjungen/6f25e9e77167a17d677e7a3c0678c41e
它的作用很简单:
打开/dev/i2c-4
file = open(filename, O_RDWR);
设置I2C从机地址
0x3b
errno = ioctl(file, I2C_SLAVE_FORCE, CAM_REAR_I2C_ADDR);
发送 16 位寄存器地址
0x300a
到该 I2C 从机ret = write(file, ®, 2);
然而,当它运行时,我总是得到:
Write i2c internal address error: Input/output error
perror()
将寄存器地址(0x300a
传感器芯片 ID 高字节)写入 OV5645后,此消息在该程序的第 54 行中打印。
我发现,当发生此错误时,内核模块i2c-qcom-cci
会报告如下错误消息:
linaro@linaro-developer:~$ dmesg | grep cci
[ 1280.099448] i2c-qcom-cci 1b0c000.cci: Master 0 error 0x08000000
[ 1280.099502] i2c-qcom-cci 1b0c000.cci: master 0 queue 0 error -5
[ 1280.104247] i2c-qcom-cci 1b0c000.cci: cci i2c xfer error -5
这些 I2C 从设备(这些 OV5645)实际上由内核模块拥有。这就是为什么我在设置 I2C 从机地址时使用I2C_SLAVE_FORCE
而不是I2C_SLAVE
作为标志的原因:errno = ioctl(file, I2C_SLAVE_FORCE, CAM_REAR_I2C_ADDR);
我想知道我是否不能用来ioctl()
控制内核模块拥有的设备?
答案1
对于任何可能关心的人:此症状的根本原因是:OV5645的内核模块在初始化后会关闭OV5645的电源(或省电?)。手动上电后,现在就可以访问OV5645的寄存器了。前南斯拉夫。