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);
0x300a
이 I2C 슬레이브에 16비트 레지스터 주소를 보냅니다.ret = write(file, ®, 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_SLAVE
errno = ioctl(file, I2C_SLAVE_FORCE, CAM_REAR_I2C_ADDR);
ioctl()
커널 모듈이 소유한 장치를 제어 하는데 사용할 수 없는지 궁금합니다 .
답변1
우려되는 분들을 위해: 이 증상의 근본 원인은 초기화 후 OV5645의 커널 모듈이 OV5645의 전원을 끄는 것입니다(또는 전원을 절약합니까?). 수동으로 전원을 켠 후 이제 OV5645의 레지스터에 액세스할 수 있습니다. 구 유고슬라비아.