カーネルモジュールが所有するデバイスを制御するために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を使用して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

それがすることは簡単です:

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

おすすめ記事