Armadilloフォーラム

KBCR-S51MM対応MIPIのDeviceTreeファイル作成について(特にCSI1_GPIO0_3V3について)

kan_harada

2024年12月11日 14時12分

Armadillo X2にシキノハイテックのKBCR-S51MM(150万画素モノクロプログレッシブカメラ)を接続しようとしています。

CON10(MIPI)にカメラを接続してみてますが、CON10/11番ピンがこのカメラのPowerEnable信号となっているため、CSI1_GPIO0_3V3をHIGHにする必要がありそうなのですが、この信号線のArmadilloのGPIO番号/IO番号が知りたいです。何を見れば良いでしょうか?

※ちなみに現状、ここのピンに電圧はでていません。

参考にしているデバイスツリーはarmadillo_iotg_g4-con10-ox01f10.dtsです。これからarmadillo_iotg_g4-con10-ox01h1b.dtsを作って使用しようとしてます。この中は以下のようになっていて、カメラのI2Cアドレスが0x20らしいのでそこを書き換えているのみです。

// SPDX-License-Identifier: (GPL-2.0 OR MIT)
/*
* Copyright (C) 2021 Atmark Techno, Inc. All Rights Reserved.
*/

/dts-v1/;
/plugin/;

#include
#include
#include "imx8mp-pinfunc.h"

&i2c2 {
#address-cells = <1>;
#size-cells = <0>;

og01h1b_cam0: rbpcv2_og01h1b@30 {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_og01h1b_pwn>;

compatible = "brcm,bcm2835";
/* I2C device address */
reg = <0x20>; /* カメラアドレスに書き換えで合ってる? */

pwdn-gpios = <&gpio3 6 GPIO_ACTIVE_HIGH>; /* これがCON10/#11ピン? */

clocks = <&clk IMX8MP_CLK_IPP_DO_CLKO2>;
clock-names = "csi_mclk";
assigned-clocks = <&clk IMX8MP_CLK_IPP_DO_CLKO2>;
assigned-clock-parents = <&clk IMX8MP_CLK_24M>;
assigned-clock-rates = <24000000>;
csi_id = <0>;
mclk = <24000000>;
mclk_source = <0>;
mipi_csi;
status = "okay";

port {
og01h1b_mipi_0_ep: endpoint {
remote-endpoint = <&mipi_csi0_ep>;
data-lanes = <1>;
clock-lanes = <0>;
max-pixel-frequency = /bits/ 64 <224000000>;
};
};
};
};

&iomuxc {
pinctrl_og01h1b_pwn: og01h1b_pwn_grp { /* GPIOピンのMUX設定? */
fsl,pins = <
MX8MP_IOMUXC_NAND_DATA00__GPIO3_IO06 0x40000100
>;
};
};

&mipi_csi_0 {
#address-cells = <1>;
#size-cells = <0>;
status = "okay";

port@0 {
reg = <0>;
mipi_csi0_ep: endpoint {
remote-endpoint = <&og01h1b_mipi_0_ep>;
data-lanes = <1>;
csis-hs-settle = <16>;
};
};
};

&cameradev {
status = "okay";
};

&isi_0 {
status = "okay";

cap_device {
status = "okay";
};

m2m_device {
status = "okay";
};
};

&isp_0 {
status = "okay";
};

&dewarp {
status = "okay";
};

コメント

at_shota.shimoyama

2024年12月11日 17時53分

下山です。

> CON10(MIPI)にカメラを接続してみてますが、CON10/11番ピンがこのカメラのPowerEnable信号となっているため、CSI1_GPIO0_3V3をHIGHにする必要がありそうなのですが、この信号線のArmadilloのGPIO番号/IO番号が知りたいです。何を見れば良いでしょうか?

gpio3の6番です。ですので、armadillo_iotg_g4-con10-ox01f10.dtsのpwdn-gpiosに記載されているものと同じピンになります。
またご指摘のとおり、regにはI2Cアドレスを記述するのですが、1bit目を除いた7bitで記述する必要があります。
ですので、0x20を1bit右にシフトした、0x10を記述してください。

dtsファイルについてはLinuxカーネルのソースコードにまだ加えておりませんが、
弊社で既に作成したものがございます。添付いたしますので、こちらをご参考にしてください。

また、KBCR-S51MMを動作させるためにはdtsファイルとは別にドライバ
(KBCR-S51MMの製品CD-ROM内にあるsample driver/src/linux/drivers/media/i2c/og01h1b.c)が必要になります。

このog01h1b.cをLinuxカーネルのソースコードにコピーした上でビルドを行う必要がありますが、
そのままではビルド時にエラーが発生しますので、

まずはLinuxカーネルのソースコード内の /linux-5.10-5.10.230-r0/drivers/media/i2c/
にog01h1b.cをコピーした上で、添付しているパッチファイルを以下のコマンドで適用してください。

atmark@atde9:~/linux-5.10-5.10.230-r0$ patch -u -p1 < ../s51mm.patch
patching file arch/arm64/boot/dts/freescale/Makefile
patching file arch/arm64/boot/dts/freescale/armadillo_iotg_g4-con10-og01h1b.dts
patching file arch/arm64/configs/x2_defconfig
patching file drivers/media/i2c/Kconfig
patching file drivers/media/i2c/Makefile
patching file drivers/media/i2c/og01h1b.c

このパッチファイルはog01h1b.cだけでなく、添付しているarmadillo_iotg_g4-con10-og01h1b.dts自体やMakefileなどの差分も含まれています。差分の詳細はパッチファイルの内容をご確認ください。

パッチファイルを適用した後の手順については、
https://manual.atmark-techno.com/armadillo-x2/armadillo-x2_product_manu…
のとおりLinuxカーネルのビルドを行い、
swupdateなどでLinuxカーネルの更新をArmadilloに適用してください。

また、ビルド終了後にarch/arm64/boot/dts/freescale/armadillo_iotg_g4-con10-og01h1b.dtbo
が生成されているはずですので、
https://manual.atmark-techno.com/armadillo-x2/armadillo-x2_product_manu…
の手順を参考にして、Armadilloへのdtboの適用を行ってください。

■カメラの動作方法例

at-debian-imageのコンテナを利用する場合は、

・.confファイルにadd_devices /dev/video2を追加
・必要なパッケージ↓をインストール
weston
gstreamer1.0-imx
libgstreamer-imx
gstreamer1.0-plugins-bad
libgstreamer-plugins-bad1.0-0
gstreamer1.0-plugins-base
libgstreamer-plugins-base1.0-0
gstreamer1.0-plugins-good
libgstreamer1.0-0
gstreamer1.0-tools
gstreamer1.0-imx-tools
v4l-utils
・ArmadilloのHDMI端子とディスプレイを接続
した上で、

root@c8ba6ec4d574:/# weston --tty=7 &
 
root@c8ba6ec4d574:/# gst-launch-1.0 v4l2src device=/dev/video2 ! video/x-raw,format=GRAY8,width=1440,height=1080,framerate=30/1 ! videoconvert n-threads=4 ! autovideosink sync=false

を実行すると、ディスプレイにカメラの映像が表示されるはずです。

■カメラの接続方法について

カメラのケーブルを接続する際は、向きに注意してください。
変換基板側コネクタの一番左側の端子(GND)が、X2のCON10の1番に対応します。
誤ってねじれた状態(変換基板側コネクタの一番左側の端子(GND)が、X2のCON10の15番に対応するような接続)で接続して
電源を投入してしまうと、カメラやArmadilloが破損する恐れがあります。

また、CSI1_GPIO0_3V3はArmadilloがカメラを使用するタイミング(gst-launch-1.0コマンド実行時など)にしかHighになりませんので、
ご注意ください。

カーネルのビルド方法などでご不明な点がございましたら、ご遠慮なくおっしゃってください。

よろしくお願いします。

ファイル ファイルの説明
armadillo_iotg_g4-con10-og01h1b.dts
s51mm.patch

下山様 デバイスツリー, ドライバーのソースまで頂き、ありがとうございます。
早速、コンパイルしてトライしていますが、まだうまく動いていません(FPCの逆差しをやってしまったので、Armadillo, カメラのいずれかが故障している可能性もあります)

device treeはarch/arm64/boot/dts/freescale/armadillo_iotg_g4-con10-thcv24xa-ox01f10.dtboを/bootにコピーしてoverlay.txtで起動時に読込んでいます。i2cdetectでサーチしてみたところ、昨日までできていなかった箇所にUUとでているので、設定はできてるのでは・・と思っています。

# i2cdetect -y 1
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- --
10: UU -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- UU -- -- --
30: -- -- UU -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --

I2Cドライバはカーネルモジュールとしてコンパイルして/lib/moules/以下に配置しています。depmodを実行しておいたので、X2起動時に自動的に読込まれていることは確認しました。以下がdmesgの該当箇所です。

[ 2.375520] og01h1b: module verification failed: signature and/or required key missing - tainting kernel
[ 2.376783] og01h1b_probe:devm_kzalloc
[ 2.376795] og01h1b_probe:Initialize subdev
[ 2.376856] og01h1b 1-0010: supply avdd not found, using dummy regulator
[ 2.376951] og01h1b 1-0010: supply dovdd not found, using dummy regulator
[ 2.376965] og01h1b 1-0010: supply dvdd not found, using dummy regulator
[ 2.492079] og01h1b_probe:og01h1b_detect
[ 2.492115] og01h1b_probe:og01h1b_init_controls
[ 2.492149] og01h1b_probe:pm_runtime_set_active

"supply avdd not found, using dummy regulator"というところが気になりますが、これで良いのでしょうか?

at_shota.shimoyama

2024年12月12日 14時35分

下山です。

> i2cdetectでサーチしてみたところ、昨日までできていなかった箇所にUUとでているので、設定はできてるのでは・・と思っています。

こちらでも同様の結果になりました。

> [ 2.375520] og01h1b: module verification failed: signature and/or required key missing - tainting kernel
> [ 2.376783] og01h1b_probe:devm_kzalloc
> [ 2.376795] og01h1b_probe:Initialize subdev
> [ 2.376856] og01h1b 1-0010: supply avdd not found, using dummy regulator
> [ 2.376951] og01h1b 1-0010: supply dovdd not found, using dummy regulator
> [ 2.376965] og01h1b 1-0010: supply dvdd not found, using dummy regulator
> [ 2.492079] og01h1b_probe:og01h1b_detect
> [ 2.492115] og01h1b_probe:og01h1b_init_controls
> [ 2.492149] og01h1b_probe:pm_runtime_set_active
>
> "supply avdd not found, using dummy regulator"というところが気になりますが、これで良いのでしょうか?

はい、大丈夫です。

> 早速、コンパイルしてトライしていますが、まだうまく動いていません(FPCの逆差しをやってしまったので、Armadillo, カメラのいずれかが故障している可能性もあります)

うまく動いていないというのは具体的にどういったことかお伺いしてもよろしいでしょうか?

また、 v4l2-ctl --list-deviceの実行結果で以下のように/dev/video2を確認できるでしょうか?

root@5a21e06ad210:/# v4l2-ctl --list-device
mxc-isi-cap (platform:32e00000.isi:cap_devic):
        /dev/video2
 
Failed to open /dev/video0: Device or resource busy

よろしくお願いします。

~ # v4l2-ctl --list-device
mxc-isi-m2m (platform:32e00000.isi:m2m_devic):
/dev/video2

Failed to open /dev/video0: Device or resource busy
~ # v4l2-ctl -d /dev/video2 -V
Format Video Capture Multiplanar:
Width/Height : 4096/8192
Pixel Format : 'RGBP' (16-bit RGB 5-6-5)
Field : None
Number of planes : 1
Flags :
Colorspace : sRGB
Transfer Function : sRGB
YCbCr/HSV Encoding: ITU-R 601
Quantization : Full Range
Plane 0 :
Bytes per Line : 8192
Size Image : 67108864

という状態で/dev/video2は認識できていますが、そこのカメラ情報がおかしいです。また、電源が供給されていないようで、カメラの3.3Vは供給されていません。

追加で、以下のような状態です。やはりカメラが壊れてるのかもしれません。現在、追加でカメラを発注しているので、そちらで確認しましょう。

# gst-launch-1.0 v4l2src device=/dev/video2
パイプラインを一時停止 (PAUSED) にしています...
ERROR: from element /GstPipeline:pipeline0/GstV4l2Src:v4l2src0: Device '/dev/video2' is not a capture device.
追加のデバッグ情報:
../sys/v4l2/v4l2_calls.c(629): gst_v4l2_open (): /GstPipeline:pipeline0/GstV4l2Src:v4l2src0:
Capabilities: 0x4204000
ERROR: pipeline doesn't want to preroll.
Failed to set pipeline to PAUSED.
Setting pipeline to NULL ...
Freeing pipeline ...

at_shota.shimoyama

2024年12月12日 17時55分

下山です。

/dev以下には次のようにvideo3のデバイスファイルも見えていますでしょうか?

armadillo:~# ls /dev/video*                                                                                                 
/dev/video0  /dev/video1  /dev/video2  /dev/video3
 
armadillo:~# v4l2-ctl --list-device                                                                                         
 ():                                                                                                                        
        /dev/v4l-subdev0                                                                                                    
 
mxc-isi-cap (platform:32e00000.isi:cap_devic):                                                                              
        /dev/video2                                                                                                         
 
mxc-isi-m2m (platform:32e00000.isi:m2m_devic):                                                                              
        /dev/video3                                                                                                         
 
FSL Capture Media Device (platform:mxc-md):                                                                                 
        /dev/media0                                                                                                         
 
Failed to open /dev/video0: Resource busy 

こちらでは/dev/video2がmxc-isi-capに対応しているのですが、
もしかしたらkan_harada様の個体では/dev/video3の方に対応しているかもしれません。

> また、電源が供給されていないようで、カメラの3.3Vは供給されていません。

電源は常時供給されているわけではなく、カメラを使用するタイミングのみ3.3Vが供給されますので、
gstreamerのコマンドを実行していないときに電源が供給されていないということであれば正常です。

> 追加で、以下のような状態です。やはりカメラが壊れてるのかもしれません。現在、追加でカメラを発注しているので、そちらで確認しましょう。
承知しました。

よろしくお願いします。

新しいカメラ基板と変換基板が届いたので早速トライしてみましたが、結果は変わりませんでした。まずはFPCの接続確認のため写真を添付します。この状態でカメラ基板のGNDとArmadilloのGNDは導通があるので接続的には問題ないと考えています。

Armadillo X2も別の基板に入れ替えてみましたが、それも同じ結果でした。この基板ではKBCR-S08MMが問題なく動いています。
こちらの環境でv4l2の状態は以下のようになっていて、カメラは/dev/video2に接続されているようです。

armadillo:~# ls /dev/video*
/dev/video0 /dev/video1 /dev/video2

# v4l2-ctl --list-device
mxc-isi-m2m (platform:32e00000.isi:m2m_devic):
/dev/video2

Failed to open /dev/video0: Device or resource busy

ファイル ファイルの説明
FPC接続.pdf