无法使用 ioctl() 控制内核模块拥有的设备?

无法使用 ioctl() 控制内核模块拥有的设备?

我无法使用 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

它的作用很简单:

  1. 打开/dev/i2c-4

    file = open(filename, O_RDWR);

  2. 设置I2C从机地址0x3b

    errno = ioctl(file, I2C_SLAVE_FORCE, CAM_REAR_I2C_ADDR);

  3. 发送 16 位寄存器地址0x300a到该 I2C 从机

    ret = write(file, &reg, 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的寄存器了。前南斯拉夫。

相关内容