Armadilloフォーラム

Armadillo-X1の拡張インターフェースにてCANを使用する場合のデバイスツリーについて

ak-satou

2020年8月22日 3時27分

古河電池の佐藤と申します。

お世話になります。

掲題の件、Armadillo-X1の拡張インターフェースを使用し、2CHのCAN通信可能なボードを作成中です。

「Armadillo標準ガイドハードウェア拡張編 8.2.2.対応カーネルイメージ」の作成を参考に以下の手順で作成しようと考えております。
 (1)Device Tree の編集→(2)カーネルコンフィギュレーションでのCAN の有効化→(3)カーネルとDTB をビルドしArmadillo に書き込み

ところが(1)で躓いております。
arch/arm/boot/dts/armadillo-640-can2.dtsiを参考に、armadillo-x1-ext-can.dtsiというファイルを作成し、arch/arm/boot/dts/armadillo_x1l.dtsにincludeしようとしておりますが、PAD(各ピンの入出力特性などの設定)の設定値(以下のXXの部分)について、どのように値を決めればよろしいでしょうか?

「i.MX 7Dual Applications Processor Reference Manual」を調べてもみたのですが、わかりませんでした。

初心者的な質問で申し訳ありませんがよろしくお願いいたします。

ーーー 以下、dtsiファイル ---
&iomuxc {
pinctrl_can1: can1grp {
fsl,pins = <
MX7D_PAD_ENET1_RGMII_RD2__FLEXCAN1_RX XX
MX7D_PAD_ENET1_RGMII_RD3__FLEXCAN1_TX XX
>;
};
pinctrl_can2: can2grp {
fsl,pins = <
MX7D_PAD_ENET1_RGMII_TD2__FLEXCAN1_RX XX
MX7D_PAD_ENET1_RGMII_TD3__FLEXCAN1_TX XX
>;
};
};

&can1 {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_can1>;
status = "okay";
};

&can2 {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_can2>;
status = "okay";
};

---以上ーーー

コメント

at_makoto.sato

2020年8月24日 9時57分

佐藤です。

> arch/arm/boot/dts/armadillo-640-can2.dtsiを参考に、armadillo-x1-ext-can.dtsiというファイルを作成し、arch/arm/boot/dts/armadillo_x1l.dtsにincludeしようとしておりますが、PAD(各ピンの入出力特性などの設定)の設定値(以下のXXの部分)について、どのように値を決めればよろしいでしょうか?
>
> 「i.MX 7Dual Applications Processor Reference Manual」を調べてもみたのですが、わかりませんでした。
例えば「MX7D_PAD_ENET1_RGMII_RD2__FLEXCAN1_RX」ですと、
「i.MX 7Dual Applications Processor Reference Manual」内の「SW_PAD_CTL_PAD_ENET1_RGMII_RD2 SW PAD Control
Register」という章に設定値に関する説明が書かれているかと思います。

> MX7D_PAD_ENET1_RGMII_TD2__FLEXCAN1_RX XX
> MX7D_PAD_ENET1_RGMII_TD3__FLEXCAN1_TX XX
上記は、FLEXCAN2_RX と FLEXCAN2_TX かと思います。

ak-satou

2020年8月24日 19時07分

佐藤様

> 例えば「MX7D_PAD_ENET1_RGMII_RD2__FLEXCAN1_RX」ですと、
> 「i.MX 7Dual Applications Processor Reference Manual」内の「SW_PAD_CTL_PAD_ENET1_RGMII_RD2 SW PAD Control
> Register」という章に設定値に関する説明が書かれているかと思います。
>
ご回答ありがとうございます。

上記設定値の「Pull Enable Field」及び「Pull Select Field」について質問させてください。

作成中の回路では、拡張インターフェースからの信号をCANトランシーバのTXD,RXDに直結しております。
Pull Enable FieldにてPull Enabledとした方がよろしいでしょうか?
その場合の、Pull Select Fieldについては推奨値はありますでしょうか?

> > MX7D_PAD_ENET1_RGMII_TD2__FLEXCAN1_RX XX
> > MX7D_PAD_ENET1_RGMII_TD3__FLEXCAN1_TX XX
> 上記は、FLEXCAN2_RX と FLEXCAN2_TX かと思います。
>
誤記でした。
失礼いたしました。

at_makoto.sato

2020年8月25日 15時27分

佐藤です。

> 作成中の回路では、拡張インターフェースからの信号をCANトランシーバのTXD,RXDに直結しております。
> Pull Enable FieldにてPull Enabledとした方がよろしいでしょうか?
> その場合の、Pull Select Fieldについては推奨値はありますでしょうか?
基本的には pull up 設定をしなくてもよいかと思いますが、
ご自身の環境によっては、不安定な状態になることを避けるために 100k pull up 設定をしたほうがよいかもしれません。

Armadillo-640の例となりますが、以下では100k pull up を設定しています。
https://manual.atmark-techno.com/armadillo-guide-std/armadillo-guide-st…

ak-satou

2020年8月25日 19時38分

佐藤様

> Armadillo-640の例となりますが、以下では100k pull up を設定しています。
> https://manual.atmark-techno.com/armadillo-guide-std/armadillo-guide-st…
>
了解いたしました。

まずは、100k pull upに設定してみます。

その他については、640の例にならい、以下の通り設定してみます。
・Hysteresis Disabled
・Slow Slew Rate
・DSE_3_X6

ありがとうございました。

ak-satou

2020年8月28日 19時09分

佐藤様

お世話になります。

ご教授いただいた結果を反映し、armadillo-x1-ext-can.dtsiを作成し、armadillo_x1.dtsに上記ファイルをinclude、カーネル及びDTBをビルドしArmadillo-X1に書き込み、再起動しました。
dmesgで起動時のログに関し、canでgrepしたところ、以下のようなメッセージが表示されておりますが問題ないでしょうか?

atmark@armadillo:~$ dmesg | grep can
[ 0.277733] imx7d-pinctrl 30330000.iomuxc: no groups defined in /soc/aips-bus@30000000/iomuxc@30330000/can1grp
[ 0.277744] imx7d-pinctrl 30330000.iomuxc: no groups defined in /soc/aips-bus@30000000/iomuxc@30330000/can2grp
[ 0.349062] i2c i2c-2: can't use DMA, using PIO instead.
[ 0.408733] i2c i2c-3: can't use DMA, using PIO instead.
[ 1.684989] imx7d-pinctrl 30330000.iomuxc: unable to find group for node can1grp
[ 1.691093] flexcan: probe of 30a00000.can failed with error -22
[ 1.695844] imx7d-pinctrl 30330000.iomuxc: unable to find group for node can2grp
[ 1.701961] flexcan: probe of 30a10000.can failed with error -22
[ 2.573100] snvs-secvio 30370000.caam-snvs: can't get snvs clock
[ 2.744681] can: controller area network core (rev 20120528 abi 9)
[ 2.752928] can: raw protocol (rev 20120528)
[ 2.755898] can: broadcast manager protocol (rev 20161123 t)
[ 2.760262] can: netlink gateway (rev 20130117) max_hops=1

no groups defined inとかflexcan: probe of XXXXXXXX.can failed with error -22
と表示されているので失敗しているように見えます。

ご教授いただけますでしょうか。
armadillo_x1.dts及びarmadillo-x1-ext-can.dtsiをarmadillo_x1.zipとして添付いたします。

ファイル ファイルの説明
armadillo_x1.zip

at_makoto.sato

2020年8月31日 11時15分

佐藤です。

armadillo-x1-ext-can.dtsi 内の can1grp と can2grp の定義部分を以下のように修正してみてもらえますでしょうか。

&iomuxc {
	armadillo-x1-can-ext {
		pinctrl_can1: can1grp {
			fsl,pins = <
				MX7D_PAD_ENET1_RGMII_RD2__FLEXCAN1_RX 0x77
				MX7D_PAD_ENET1_RGMII_RD3__FLEXCAN1_TX 0x77
			>;
		};
		pinctrl_can2: can2grp {
			fsl,pins = <
				MX7D_PAD_ENET1_RGMII_TD2__FLEXCAN2_RX 0x77
				MX7D_PAD_ENET1_RGMII_TD3__FLEXCAN2_TX 0x77
			>;
		};
	};
};

ak-satou

2020年8月31日 14時53分

佐藤様

ご回答ありがとうございます。

以下のメッセージに変わりました。

atmark@armadillo:~$ dmesg | grep can
[    0.349052] i2c i2c-2: can't use DMA, using PIO instead.
[    0.409248] i2c i2c-3: can't use DMA, using PIO instead.
[    1.668146] 30a00000.can supply xceiver not found, using dummy regulator
[    1.674455] flexcan 30a00000.can: device registered (reg_base=f5a00000, irq=43)
[    1.680627] 30a10000.can supply xceiver not found, using dummy regulator
[    1.686841] flexcan 30a10000.can: device registered (reg_base=f5a10000, irq=44)
[    2.558044] snvs-secvio 30370000.caam-snvs: can't get snvs clock
[    2.737524] can: controller area network core (rev 20120528 abi 9)
[    2.745786] can: raw protocol (rev 20120528)
[    2.748755] can: broadcast manager protocol (rev 20161123 t)
[    2.753147] can: netlink gateway (rev 20130117) max_hops=1

unable to find group for node ~やcan failed with errorは消えました。
xceiver not foundというメッセージがありますが、これは問題ないでしょうか?

at_makoto.sato

2020年8月31日 17時07分

佐藤です。

> xceiver not foundというメッセージがありますが、これは問題ないでしょうか?
ご自身で用意されたCANトランシーバへの電源供給をカーネル側から制御したい場合は、レギュレータを設定する必要がありますが、
そうでない場合は、無視して問題ありません。

ak-satou

2020年8月31日 20時17分

佐藤様

> ご自身で用意されたCANトランシーバへの電源供給をカーネル側から制御したい場合は、レギュレータを設定する必要がありますが、
> そうでない場合は、無視して問題ありません。
>
ご回答ありがとうございます。

早速、can-utilsを使用して動作確認を実施したところ、通信に成功しました。
ありがとうございました。

ak-satou

2021年5月1日 0時49分

佐藤(彰)と申します。

以前、Linux-4.9-x1-at15の環境でCANの動作確認に成功したのですが、改めて、at19の環境で動作確認を使用としたところ失敗してしまいました。

具体的には、以下の様に実行した際に、”can0”が見つからないと表示されます。
# ip link set can0 type can bitrate 500000 loopback off
Cannot find device "can0"

.configや編集したDevice treeを確認しましたが差異はないようです。

dmesgの結果を確認した結果、at19には以下が表示されていませんでした。
[ 1.668146] 30a00000.can supply xceiver not found, using dummy regulator
[ 1.674455] flexcan 30a00000.can: device registered (reg_base=f5a00000, irq=43)
[ 1.680627] 30a10000.can supply xceiver not found, using dummy regulator
[ 1.686841] flexcan 30a10000.can: device registered (reg_base=f5a10000, irq=44)

これらからどの辺を確認すればよいか、ご教授願います。

at_akihito.irie

2021年5月10日 9時26分

入江です。

以下のコマンドを実行後に再度コンフィギュレーションとビルドを行った場合
もCANが使用できませんでしょうか。

[ATDE ~/linux-4.9-x1-at19] make distclean
// この後再コンフィギュレーション、ビルド

上記手順でも解決しない場合は、本現象が発生しているArmadillo-X1上の以下
のファイルと、お客様が作成・編集されたdtsファイル送って頂けると何かア
ドバイスできるかもしれません。

[armadillo]# mount /dev/mmcblk2p1 /mnt
[armadillo]# ls /mnt/armadillo_x1.dtb
/mnt/armadillo_x1.dtb  ←このファイルを送ってください。

ak-satou

2021年5月10日 10時26分

入江様

ご回答ありがとうございます。

> 以下のコマンドを実行後に再度コンフィギュレーションとビルドを行った場合
> もCANが使用できませんでしょうか。
>
>

> [ATDE ~/linux-4.9-x1-at19] make distclean
> // この後再コンフィギュレーション、ビルド
> 

念の為、確認ですが、make distclean実施後の再コンフィギュレーション、ビルドの手順は以下で問題ないでしょうか?

atmark@atde7:~/linux-4.9-x1-at19$ ln -s ../initramfs_x1-v2.0.0.cpio.gz initramfs_x1.cpio.gz
atmark@atde7:~/linux-4.9-x1-at19$ make ARCH=arm x1_defconfig
atmark@atde7:~/linux-4.9-x1-at19$ make ARCH=arm menuconfig
 
[*] Networking support --->			
	[*] CAN bus subsystem support ---> 		
		CAN Device Drivers --->	
			[*] Platform CAN drivers with Netlink support
			[*] Support for Freescale FLEXCAN based chips 
 
atmark@atde7:~/linux-4.9-x1-at19$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
atmark@atde7:~/linux-4.9-x1-at19$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- LOADADDR=0x80008000 uImage

at_akihito.irie

2021年5月10日 14時12分

入江です。

atmark@atde7:~/linux-4.9-x1-at19$ ln -s ../initramfs_x1-v2.0.0.cpio.gz initramfs_x1.cpio.gz

上記は行わなくても大丈夫です(行っても失敗するだけで特に問題はありませんが)。

その他は問題ないと思います。

ak-satou

2021年5月10日 17時33分

入江様

make distcleanを実施後、確認いたしましたが、can0を使おうとすると、

Cannot find device "can0"

と表示されてしまいます。

ご依頼のファイルを添付いたしました。
よろしくお願いいたします。

ファイル ファイルの説明
armadillo_x1_20210510.zip armadillo_x1.dtb, armadillo_x1l.dts, armadillo-x1-ext-can.dtsi

at_akihito.irie

2021年5月10日 18時02分

入江です。

#include "armadillo-x1-ext-can.dtsi"

の記述はarmadillo_x1l.dtsではなく、armadillo_x1.dtsの方に記載した上で
再度ビルド、動作確認を行って頂いてもよろしいでしょうか。

ak-satou

2021年5月11日 0時04分

入江様

#include "armadillo-x1-ext-can.dtsi"

の記述を、armadillo_x1l.dtsから、armadillo_x1.dtsの方に記載し、再度ビルド、動作確認を行ったところ、正常動作いたしました。ありがとうございました。

単純なミスでした。
申し訳ございません。