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を使用して動作確認を実施したところ、通信に成功しました。
ありがとうございました。