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を使用して2つの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のレジスタにアクセスできるようになりました。旧ユーゴスラビア。