커널 모듈이 소유한 장치를 제어하기 위해 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. 0x300a이 I2C 슬레이브에 16비트 레지스터 주소를 보냅니다.

    ret = write(file, &reg, 2);

그러나 실행될 때 항상 다음을 얻습니다.

Write i2c internal address error: Input/output error

perror()이 메시지는 레지스터 주소( 센서 칩 ID 상위 바이트)를 OV5645에 0x300a쓴 후 프로그램의 라인 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_SLAVEerrno = ioctl(file, I2C_SLAVE_FORCE, CAM_REAR_I2C_ADDR);

ioctl()커널 모듈이 소유한 장치를 제어 하는데 사용할 수 없는지 궁금합니다 .

답변1

우려되는 분들을 위해: 이 증상의 근본 원인은 초기화 후 OV5645의 커널 모듈이 OV5645의 전원을 끄는 것입니다(또는 전원을 절약합니까?). 수동으로 전원을 켠 후 이제 OV5645의 레지스터에 액세스할 수 있습니다. 구 유고슬라비아.

관련 정보