Armadilloフォーラム

Armadillo-640へのSPIおよびCANの追加方法

jaksama

2018年8月2日 17時58分

井上と申します。

armadillo-640のCON9にマルチプレクス表をもとに下記のインターフェースを割りつけて通信する
ことを検討しております。

・UART1(3、5ピン)
・UART2(25~28ピン:CTS、RTSあり)
・UART5(4、6ピン)
・CAN2(1、2ピン)
・ECSPI1(15~18ピン)

2018/7のアップデートは適用済みで、コンソールはCON4に変更しております。
UART1,2,5はデバイスファイルに追加でき、簡単な通信テストができましたが、
CAN2とECSPI1は追加できていません。

DTBファイルを添付の通りです。
別途、カーネルコンフィグレーション等で行う設定等がありましたらご指摘ください。

また、UART5を例にとると下記のような記述がありますが、

 MX6UL_PAD_UART5_TX_DATA__UART5_DCE_TX 0x00008

行末の「0x00008」の部分の呼び名、および、どの資料をみれば「0x00008」となることが
わかるのかご教示いただきたく存じます。
(ほかの例ですとI2C2なら「0x4000007f」と導入セミナーの資料にありました。)

以上、よろしくお願いいたします。

ファイル ファイルの説明
arm640uart1.dts
コメント

> 行末の「0x00008」の部分の呼び名、および、どの資料をみれば「0x00008」となることが
> わかるのかご教示いただきたく存じます。

この部分はpinctrl subsystem配下のimx向けpinctrlデバイスドライバの実装での
CONFIGという部分になります。

- 31bit目(0~31bitで計算)のビットの機能は、「0:パッド設定を行う, 1:パッド設定を行わない」となります
- 30bit目(0~31bitで計算)のビットの機能はSION(Software Input On)の有効/無効の指定になります。
SIONの詳細は「i.MX 6ULL Applications Processor Reference Manual」を参照してください

- 残りのビット(この例だと0x00008全て)はそのままSoC(i.MX6ULL)の PAD設定レジスタ(pullup/down等を設定する)の
設定値になります。各ビットの意味は
linux-4.14-atX/Documentation/devicetree/bindings/pinctrl/fsl,imx6ul-pinctrl.txt
に記載されています。

上記の定義はカーネルのソースコード内にも説明があります。
linux-4.14-atX/Documentation/devicetree/bindings/pinctrl/fsl,imx-pinctrl.txt

より詳細な各ビットの設定値は 「i.MX 6ULL Applications Processor Reference Manual」の
Chapter 33 IOMUX Controller (IOMUXC) に提示されている SW_PAD_CTL_PAD_で始まる
レジスタのページに説明があります。(尚、0x10b0 は大半のPADの初期値になっています。)

i.MX 6ULL Applications Processor Reference Manual
https://www.nxp.com/docs/en/reference-manual/IMX6ULLRM.pdf

---------------------

添付いただいたのdtsについては、uart5の設定が7月のアップデート版から
消されているようですが、こちらは意図した変更でしょうか。

それ以外については、CAN,SPIともに後述のPAD設定レジスタの値の違い
を除いて、必要な項目は書かれているとおもいます。

あとは、デバイスドライバをmenuconfigで有効にする必要があります。

Device Drivers  --->
 
   [*] SPI support  ---->
      [*]  Freescale i.MX SPI controllers
 
   Networking support --->
     [*]   CAN bus subsystem support  --->
                     CAN Device Drivers  --->
                       [*]   Support for Freescale FLEXCAN based chips

各々のPAD設定レジスタの値については実際の回路依存になりますが、

SPIはSS以外の信号は普通オープンドレインで駆動するので11ビット目
(ODE:Open Drain Enable Field)のビットを立てる必要があります。

また、それらのpullupを、SoCの内蔵で実施するかするか外付け回路で
実装するか選ぶ事ができます。
SoC内蔵でpullupするのであれば13ビット目(PUE:Pull / Keep Select Field)を
立てるとpullupになります。そのときのpullup抵抗は15-14ビット目で決定されます。

CANについては、そのままでも動くと思いますが、実際の波形を観測して、
PAD設定レジスタのDSEとSREの値を加減してください。このフィールドは
ダンピング抵抗を加減するのと同じことなので、値を下げすぎると反射したり
高周波ノイズが放射されますが、逆に鈍ってもいけないのでカットアンドトライ
する必要があります。

また、SPI,CANのどちらも 7–6ビット目のSpeedFieldはLow(50MHz以下向け)の
00 で十分だと思います。 このフィールドはノイズフィルタの帯域を変更する
ので、必要以上に高周波設定にするとノイズ放射が増える可能性があります。

at_ohsawa 様

懇切丁寧なご説明ありがとうございます。

> 添付いただいたのdtsについては、uart5の設定が7月のアップデート版から
> 消されているようですが、こちらは意図した変更でしょうか。

7月のアップデート版でもI2C2がデバイスファイルに登録されるか試してみたあとに
削除してしまったようです。ご指摘ありがとうございます。
アップデート版のdtsでuart5の通信ができることは確認済みです。

ご教示いただいたドライバ実装のCONFIG部分とmenuconfigにおける手順を確認し、
結果をご報告いたします。

ご教示ありがとうございます。

at_ohsawa 様よりご教示いただいた通り、menuconfigをご教示のとおり実施して、
dtsファイルとuImageファイルを書き込んでリブートしましたが、spiとCANが追加されませんでした。

起動ログを添付いたしますが、 [0.602788] 付近にspiやCANに関連すると思われるエラーが見受けられます。
対処法をご教示いただけましたら幸いです。

井上

ファイル ファイルの説明
spi_can_log.txt

すみません、spiの方に間違いありました。
imxのSPIのSSはGPIOで実装されているので、
ピンの機能をgpioにmuxしてcs-gpiosという変数で
gpioを指示します。(下記diff)

@@ -119,6 +119,7 @@
        pinctrl-names = "default";
        pinctrl-0 = <&pinctrl_ecspi3>;
        status = "okay";
+       cs-gpios = <&gpio1 20 GPIO_ACTIVE_HIGH>;
 };
 
 &can2 {
@@ -184,7 +185,7 @@
 
        pinctrl_ecspi3: ecspi3grp {
                fsl,pins = <
-               MX6UL_PAD_UART2_TX_DATA__ECSPI3_SS0     0x10b0
+               MX6UL_PAD_UART2_TX_DATA__GPIO1_IO20     0x1b0b0
                MX6UL_PAD_UART2_RX_DATA__ECSPI3_SCLK    0x10b0
                MX6UL_PAD_UART2_CTS_B__ECSPI3_MOSI      0x10b0
                MX6UL_PAD_UART2_RTS_B__ECSPI3_MISO      0x10b0

また、特定のセンサ等のデバイスではなく/dev/spidev*.*を使うのであれば、
もう一つ手順が必要です。

1. ecspiのセクションにspidevを追加

例:

&ecspi3 {
    cs-gpios = <&gpio1 20 GPIO_ACTIVE_HIGH>;
    pinctrl-names = "default";
    pinctrl-0 = <&pinctrl_ecspi3>;
    status = "okay";
 
    spidev0: spi@0 {
        compatible = "spidev";
        reg = <0>;
        spi-max-frequency = <5000000>;
    };
};

2. user mode spi driverの有効化

Device Drivers --->
[*] SPI support --->
[*] User mode SPI device driver support

以上の手順を設定すると、/dev/spidev2.0のようなデバイスノードができます。
spiに接続するICが決っているのであれば、spidevではなく、そのICに対応した
デバイスドライバを指定してください。デバイスドライバが無ければ、そのまま
/dev/spidevを使うか、デバイスドライバを書く必要があります。

それと、muxの書き方は正しいのですが、
ピン指定が期待されてるCON9_15-18とは異なるピンを指定していると思います。

(先日添付されたファイルだとecspiとCANで指定しているピンと重複していますが、
今回の起動ログで「重複してmuxできない」というエラーが出ていないので、
今回のログまでに井上樣が修正されているのではないかと思っています。)

pinmuxのMX6UL_PAD_UART2_RTS_B__FLEXCAN2_RXのような名前の前半部分(UART2_RTS_B)が
物理的なピン名で、後半(FLEXCAN2_RX)が内部の機能になるのですが、

Armadillo-640 マルチプレクス表の「ピン名」のカラムを参照して頂いて
CON9の15から18ピンにあたるのは

LCD_DATA20
LCD_DATA21
LCD_DATA22
LCD_DATA23

となっているので、例えば CON9_15ピン の LCD_DATA20 がピン名で
機能はSCLKになり、従って MX6UL_PAD_LCD_DATA20__ECSPI1_SCLK を指定します。

CANについては、前述のspiとのピンの重複が直っていれば動作しているはずです。
ifconfig -a や ip link 等のコマンドを実行すると can0 というインターフェースが
が見えないでしょうか。
CANはネットワークインターフェースなので/dev/can0のようなデバイスノードには
なりません。

at_ohsawa 様

ご教示ありがとうございます。
ご教示いただいた通り修正した添付dtsファイルによって、CANのインターフェース、SPIのデバイスノードとも
確認できました。CANはとりあえずCON11の24-25、SPIはECSPI3にし、UART5は復旧させました。
SPIは/dev/spidev*.*で使う予定です。

armadillo-400シリーズの「ハードウエア機能をカスタマイズする」の資料を参考にしてCANのネットワーク、
および、SPIインターフェースを持つADC(MCP3204)と接続することを考えております。
armadillo-400シリーズの場合と異なる点や注意点がありましたらあらかじめご教示いただきたく存じます。

よろしくお願いいたします。

ファイル ファイルの説明
arm640uart3.dts

中村です。

Armadillo-640のSPIについて調べていて、この記事を見つけました。
2018/08/03の
https://armadillo.atmark-techno.com/forum/armadillo/3422#comment-5838
からの引用になります。

> SPIはSS以外の信号は普通オープンドレインで駆動するので11ビット目
> (ODE:Open Drain Enable Field)のビットを立てる必要があります。
>
> また、それらのpullupを、SoCの内蔵で実施するかするか外付け回路で
> 実装するか選ぶ事ができます。

とありますが、SPIの信号線をオープンドレイン駆動にするのは
なぜでしょうか?

基本的なところで勉強不足なのかもしれませんが、
理由がわからないので、教えていただけますでしょうか?

よろしくお願いいたします。

--
なかむら

> > また、それらのpullupを、SoCの内蔵で実施するかするか外付け回路で
> > 実装するか選ぶ事ができます。
>
> とありますが、SPIの信号線をオープンドレイン駆動にするのは
> なぜでしょうか?

これは誤りですね。
教えてくださりありがとうございます。

中村です。

> これは誤りですね。

確認、ありがとうございます。

--
なかむら

お世話になっております。井上です。

以前CANとSPIの追加方法についてアドバイス頂きましたが、内臓のRTCを使いたいため、linux-V4.14-at4からlinux-V4.14-at10に移行しようとしたところ、下記の説明のmenuconfigの項目が変わっていました。

現状のdtsは添付の通り、SPIは「/dev/spidev*.*」のように使います。
現バージョンでの設定方法についてご教示いただきたく存じます。
よろしくお願いいたします。

> > 行末の「0x00008」の部分の呼び名、および、どの資料をみれば「0x00008」となることが
> > わかるのかご教示いただきたく存じます。
>
> この部分はpinctrl subsystem配下のimx向けpinctrlデバイスドライバの実装での
> CONFIGという部分になります。
>
> - 31bit目(0~31bitで計算)のビットの機能は、「0:パッド設定を行う, 1:パッド設定を行わない」となります
> - 30bit目(0~31bitで計算)のビットの機能はSION(Software Input On)の有効/無効の指定になります。
> SIONの詳細は「i.MX 6ULL Applications Processor Reference Manual」を参照してください
>
> - 残りのビット(この例だと0x00008全て)はそのままSoC(i.MX6ULL)の PAD設定レジスタ(pullup/down等を設定する)の
> 設定値になります。各ビットの意味は
> linux-4.14-atX/Documentation/devicetree/bindings/pinctrl/fsl,imx6ul-pinctrl.txt
> に記載されています。
>
> 上記の定義はカーネルのソースコード内にも説明があります。
> linux-4.14-atX/Documentation/devicetree/bindings/pinctrl/fsl,imx-pinctrl.txt
>
> より詳細な各ビットの設定値は 「i.MX 6ULL Applications Processor Reference Manual」の
> Chapter 33 IOMUX Controller (IOMUXC) に提示されている SW_PAD_CTL_PAD_で始まる
> レジスタのページに説明があります。(尚、0x10b0 は大半のPADの初期値になっています。)
>
> i.MX 6ULL Applications Processor Reference Manual
> https://www.nxp.com/docs/en/reference-manual/IMX6ULLRM.pdf
>
> ---------------------
>
> 添付いただいたのdtsについては、uart5の設定が7月のアップデート版から
> 消されているようですが、こちらは意図した変更でしょうか。
>
> それ以外については、CAN,SPIともに後述のPAD設定レジスタの値の違い
> を除いて、必要な項目は書かれているとおもいます。
>
> あとは、デバイスドライバをmenuconfigで有効にする必要があります。
>
>

> Device Drivers  --->
> 
>    [*] SPI support  ---->
>       [*]  Freescale i.MX SPI controllers
> 
>    Networking support --->
>      [*]   CAN bus subsystem support  --->
>                      CAN Device Drivers  --->
>                        [*]   Support for Freescale FLEXCAN based chips
> 

>
>
> 各々のPAD設定レジスタの値については実際の回路依存になりますが、
>
> SPIはSS以外の信号は普通オープンドレインで駆動するので11ビット目
> (ODE:Open Drain Enable Field)のビットを立てる必要があります。
>
> また、それらのpullupを、SoCの内蔵で実施するかするか外付け回路で
> 実装するか選ぶ事ができます。
> SoC内蔵でpullupするのであれば13ビット目(PUE:Pull / Keep Select Field)を
> 立てるとpullupになります。そのときのpullup抵抗は15-14ビット目で決定されます。
>
> CANについては、そのままでも動くと思いますが、実際の波形を観測して、
> PAD設定レジスタのDSEとSREの値を加減してください。このフィールドは
> ダンピング抵抗を加減するのと同じことなので、値を下げすぎると反射したり
> 高周波ノイズが放射されますが、逆に鈍ってもいけないのでカットアンドトライ
> する必要があります。
>
> また、SPI,CANのどちらも 7–6ビット目のSpeedFieldはLow(50MHz以下向け)の
> 00 で十分だと思います。 このフィールドはノイズフィルタの帯域を変更する
> ので、必要以上に高周波設定にするとノイズ放射が増える可能性があります。
> ぃぬx

ファイル ファイルの説明
arm640uart5.dts

私の早とちりでした。
項目がちゃんとありました。
申し訳ありません。

井上

> お世話になっております。井上です。
>
> 以前CANとSPIの追加方法についてアドバイス頂きましたが、内臓のRTCを使いたいため、linux-V4.14-at4からlinux-V4.14-at10に移行しようとしたところ、下記の説明のmenuconfigの項目が変わっていました。
>
> 現状のdtsは添付の通り、SPIは「/dev/spidev*.*」のように使います。
> 現バージョンでの設定方法についてご教示いただきたく存じます。
> よろしくお願いいたします。
>
>
> > > 行末の「0x00008」の部分の呼び名、および、どの資料をみれば「0x00008」となることが
> > > わかるのかご教示いただきたく存じます。
> >
> > この部分はpinctrl subsystem配下のimx向けpinctrlデバイスドライバの実装での
> > CONFIGという部分になります。
> >
> > - 31bit目(0~31bitで計算)のビットの機能は、「0:パッド設定を行う, 1:パッド設定を行わない」となります
> > - 30bit目(0~31bitで計算)のビットの機能はSION(Software Input On)の有効/無効の指定になります。
> > SIONの詳細は「i.MX 6ULL Applications Processor Reference Manual」を参照してください
> >
> > - 残りのビット(この例だと0x00008全て)はそのままSoC(i.MX6ULL)の PAD設定レジスタ(pullup/down等を設定する)の
> > 設定値になります。各ビットの意味は
> > linux-4.14-atX/Documentation/devicetree/bindings/pinctrl/fsl,imx6ul-pinctrl.txt
> > に記載されています。
> >
> > 上記の定義はカーネルのソースコード内にも説明があります。
> > linux-4.14-atX/Documentation/devicetree/bindings/pinctrl/fsl,imx-pinctrl.txt
> >
> > より詳細な各ビットの設定値は 「i.MX 6ULL Applications Processor Reference Manual」の
> > Chapter 33 IOMUX Controller (IOMUXC) に提示されている SW_PAD_CTL_PAD_で始まる
> > レジスタのページに説明があります。(尚、0x10b0 は大半のPADの初期値になっています。)
> >
> > i.MX 6ULL Applications Processor Reference Manual
> > https://www.nxp.com/docs/en/reference-manual/IMX6ULLRM.pdf
> >
> > ---------------------
> >
> > 添付いただいたのdtsについては、uart5の設定が7月のアップデート版から
> > 消されているようですが、こちらは意図した変更でしょうか。
> >
> > それ以外については、CAN,SPIともに後述のPAD設定レジスタの値の違い
> > を除いて、必要な項目は書かれているとおもいます。
> >
> > あとは、デバイスドライバをmenuconfigで有効にする必要があります。
> >
> >

> > Device Drivers  --->
> > 
> >    [*] SPI support  ---->
> >       [*]  Freescale i.MX SPI controllers
> > 
> >    Networking support --->
> >      [*]   CAN bus subsystem support  --->
> >                      CAN Device Drivers  --->
> >                        [*]   Support for Freescale FLEXCAN based chips
> > 

> >
> >
> > 各々のPAD設定レジスタの値については実際の回路依存になりますが、
> >
> > SPIはSS以外の信号は普通オープンドレインで駆動するので11ビット目
> > (ODE:Open Drain Enable Field)のビットを立てる必要があります。
> >
> > また、それらのpullupを、SoCの内蔵で実施するかするか外付け回路で
> > 実装するか選ぶ事ができます。
> > SoC内蔵でpullupするのであれば13ビット目(PUE:Pull / Keep Select Field)を
> > 立てるとpullupになります。そのときのpullup抵抗は15-14ビット目で決定されます。
> >
> > CANについては、そのままでも動くと思いますが、実際の波形を観測して、
> > PAD設定レジスタのDSEとSREの値を加減してください。このフィールドは
> > ダンピング抵抗を加減するのと同じことなので、値を下げすぎると反射したり
> > 高周波ノイズが放射されますが、逆に鈍ってもいけないのでカットアンドトライ
> > する必要があります。
> >
> > また、SPI,CANのどちらも 7–6ビット目のSpeedFieldはLow(50MHz以下向け)の
> > 00 で十分だと思います。 このフィールドはノイズフィルタの帯域を変更する
> > ので、必要以上に高周波設定にするとノイズ放射が増える可能性があります。
> > ぃぬx