Armadilloフォーラム

拡張 I/F における SPI(ECSPI2)の仕様

n_kogawa

2024年3月27日 22時21分

Armadiilo-X1 拡張 I/F(CON8)の ECSPI2 を利用したSPI 通信を試みていますが、苦戦中です。

カーネルソース(v6.1-at1)に含まれる armadillo_x1-ecspi4_mcp3202.dts を下の記事を参考に、下記の DTS を作成しました。
https://armadillo.atmark-techno.com/blog/615/2577

#include "armadillo_x1.dts"
 
/*
 * CON8_26: ECSPI2_CLK
 * CON8_27: ECSPI2_MOSI
 * CON8_32: ECSPI2_MISO
 * CON8_33: GPIO7_IO9(Slave Select)
 */
 
&iomuxc {
        x1_ext {
                pinctrl_ecspi2: ecspi2grp {
                        fsl,pins = <
                                MX7D_PAD_ENET1_RGMII_RD2__ECSPI2_SCLK           0x70
                                MX7D_PAD_ENET1_RGMII_RD3__ECSPI2_MOSI           0x70
                                MX7D_PAD_ENET1_RGMII_TD2__ECSPI2_MISO           0x70
                                MX7D_PAD_ENET1_RGMII_TD3__GPIO7_IO9             0x70
                        >;
                };
        };
};
 
&ecspi2 {
        pinctrl-names = "default";
        pinctrl-0 = <&pinctrl_ecspi2>;
 
        fsl,spi-num-chipselects = <1>;
        cs-gpios = <&gpio7 9 GPIO_ACTIVE_HIGH>;
        status = "okay";
 
        spi@0 {
                compatible = "spidev";
                spi-max-frequency = <1000000>;
                reg = <0>;
        };
};

この DTS をコンパイルしてArmadillo 側に取り込み、起動パラメータの設定を行いましたが、/dev/spidevX.X のデバイスファイルが作成されません。
何かお気づきの点などございましたら、ご指摘いただけますと幸いです。

コメント

> Armadiilo-X1 拡張 I/F(CON8)の ECSPI2 を利用したSPI 通信を試みていますが、苦戦中です。
>
> カーネルソース(v6.1-at1)に含まれる armadillo_x1-ecspi4_mcp3202.dts を下の記事を参考に、下記の DTS を作成しました。
> https://armadillo.atmark-techno.com/blog/615/2577
>
>

> #include "armadillo_x1.dts"
> 
> /*
>  * CON8_26: ECSPI2_CLK
>  * CON8_27: ECSPI2_MOSI
>  * CON8_32: ECSPI2_MISO
>  * CON8_33: GPIO7_IO9(Slave Select)
>  */
> 
> &iomuxc {
>         x1_ext {
>                 pinctrl_ecspi2: ecspi2grp {
>                         fsl,pins = <
>                                 MX7D_PAD_ENET1_RGMII_RD2__ECSPI2_SCLK           0x70
>                                 MX7D_PAD_ENET1_RGMII_RD3__ECSPI2_MOSI           0x70
>                                 MX7D_PAD_ENET1_RGMII_TD2__ECSPI2_MISO           0x70
>                                 MX7D_PAD_ENET1_RGMII_TD3__GPIO7_IO9             0x70
>                         >;
>                 };
>         };
> };
> 
> &ecspi2 {
>         pinctrl-names = "default";
>         pinctrl-0 = <&pinctrl_ecspi2>;
> 
>         fsl,spi-num-chipselects = <1>;
>         cs-gpios = <&gpio7 9 GPIO_ACTIVE_HIGH>;
>         status = "okay";
> 
>         spi@0 {
>                 compatible = "spidev";
>                 spi-max-frequency = <1000000>;
>                 reg = <0>;
>         };
> };
> 

>
> この DTS をコンパイルしてArmadillo 側に取り込み、起動パラメータの設定を行いましたが、/dev/spidevX.X のデバイスファイルが作成されません。
> 何かお気づきの点などございましたら、ご指摘いただけますと幸いです。
>

仕様 → 使用 です。失礼しました。

松坂です。

compatibleのプロパティを以下に変更して、試してみてもらえますか?

compatible = "rohm,dh2228fv";

以下のページで解説されている現象と同じに見えます。
https://blog-between-hw-sw.com/howto-use-spi-4zynqlinux/#rtoc-22

spidev.cでcompatible名を定義している箇所です。
https://github.com/atmark-techno/linux-6.1-at/blob/main/drivers/spi/spi…

> 松坂です。
>
> compatibleのプロパティを以下に変更して、試してみてもらえますか?
>

> compatible = "rohm,dh2228fv";
> 

>
> 以下のページで解説されている現象と同じに見えます。
> https://blog-between-hw-sw.com/howto-use-spi-4zynqlinux/#rtoc-22
>
> spidev.cでcompatible名を定義している箇所です。
> https://github.com/atmark-techno/linux-6.1-at/blob/main/drivers/spi/spi…

ありがとうございます。

ご教示いただいた内容に従い、 DTS を下記に修正することで、
/dev/spidev3.0 が作成されました。

#include "armadillo_x1.dts"
 
/*
 * CON8_26: ECSPI2_CLK
 * CON8_27: ECSPI2_MOSI
 * CON8_32: ECSPI2_MISO
 * CON8_33: GPIO7_IO9(Slave Select)
 */
 
&iomuxc {
        x1_ext {
                pinctrl_ecspi2: ecspi2grp {
                        fsl,pins = <
                                MX7D_PAD_ENET1_RGMII_RD2__ECSPI2_SCLK           0x70
                                MX7D_PAD_ENET1_RGMII_RD3__ECSPI2_MOSI           0x70
                                MX7D_PAD_ENET1_RGMII_TD2__ECSPI2_MISO           0x70
                                MX7D_PAD_ENET1_RGMII_TD3__GPIO7_IO9             0x70
                        >;
                };
        };
};
 
&ecspi2 {
        pinctrl-names = "default";
        pinctrl-0 = <&pinctrl_ecspi2>;
 
        fsl,spi-num-chipselects = <1>;
        cs-gpios = <&gpio7 9 GPIO_ACTIVE_HIGH>;
        status = "okay";
 
        spi@0 {
                compatible = "rohm,dh2228fv";
                spi-max-frequency = <1000000>;
                reg = <0>;
        };
};

その上で下記のコードを用いて、/dev/spidev3.0 から出力を試みたのですが、
ECSPI2 の各端子から SS 以外の信号が出力されません。(プルアップで張り付き)

どのような原因が考えられますでしょうか。

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <linux/spi/spidev.h>
 
int main() {
    uint8_t tx_data[] = {0xAA, 0xBB, 0xCC, 0xDD};
    struct spi_ioc_transfer tr = {
        .tx_buf = (unsigned long)tx_data,
        .len = sizeof(tx_data),
        .speed_hz = 1000000,
        .bits_per_word = 8,
    };
 
    int spi_fd = open("/dev/spidev3.0", O_RDWR);
    if (spi_fd < 0) {
        perror("Failed to open the SPI device");
        exit(1);
    }
 
    while (1) {
        if (ioctl(spi_fd, SPI_IOC_MESSAGE(1), &tr) < 0) {
            perror("Failed to send SPI message");
            exit(1);
        }
 
        printf("Data sent\n");
        sleep(3);
    }
 
    close(spi_fd);
    return 0;
}

参考までに上記のコードと下記の DTS ファイルを用いると、
ECSPI4 の各端子より、期待通りの信号が出力されます。

iomuxc {
        x1_ext {
                pinctrl_ecspi4: ecspi4grp {
                        fsl,pins = <
                                MX7D_PAD_LCD_CLK__ECSPI4_MISO                   0x70
                                MX7D_PAD_LCD_ENABLE__ECSPI4_MOSI                0x70
                                MX7D_PAD_LCD_HSYNC__ECSPI4_SCLK                 0x70
                                MX7D_PAD_LCD_VSYNC__GPIO3_IO3                   0x70
                        >;
                };
 
&ecspi4 {
        pinctrl-names = "default";
        pinctrl-0 = <&pinctrl_ecspi4>;
 
        fsl,spi-num-chipselects = <1>;
        cs-gpios = <&gpio3 3 GPIO_ACTIVE_HIGH>;
        status = "okay";
 
        spi@0 {
                compatible = "rohm,dh2228fv";
                spi-max-frequency = <1000000>;
                reg = <0>;
        };
};

> > 松坂です。
> >
> > compatibleのプロパティを以下に変更して、試してみてもらえますか?
> >

> > compatible = "rohm,dh2228fv";
> > 

> >
> > 以下のページで解説されている現象と同じに見えます。
> > https://blog-between-hw-sw.com/howto-use-spi-4zynqlinux/#rtoc-22
> >
> > spidev.cでcompatible名を定義している箇所です。
> > https://github.com/atmark-techno/linux-6.1-at/blob/main/drivers/spi/spi…
>
> ありがとうございます。
>
> ご教示いただいた内容に従い、 DTS を下記に修正することで、
> /dev/spidev3.0 が作成されました。
>
>

> #include "armadillo_x1.dts"
> 
> /*
>  * CON8_26: ECSPI2_CLK
>  * CON8_27: ECSPI2_MOSI
>  * CON8_32: ECSPI2_MISO
>  * CON8_33: GPIO7_IO9(Slave Select)
>  */
> 
> &iomuxc {
>         x1_ext {
>                 pinctrl_ecspi2: ecspi2grp {
>                         fsl,pins = <
>                                 MX7D_PAD_ENET1_RGMII_RD2__ECSPI2_SCLK           0x70
>                                 MX7D_PAD_ENET1_RGMII_RD3__ECSPI2_MOSI           0x70
>                                 MX7D_PAD_ENET1_RGMII_TD2__ECSPI2_MISO           0x70
>                                 MX7D_PAD_ENET1_RGMII_TD3__GPIO7_IO9             0x70
>                         >;
>                 };
>         };
> };
> 
> &ecspi2 {
>         pinctrl-names = "default";
>         pinctrl-0 = <&pinctrl_ecspi2>;
> 
>         fsl,spi-num-chipselects = <1>;
>         cs-gpios = <&gpio7 9 GPIO_ACTIVE_HIGH>;
>         status = "okay";
> 
>         spi@0 {
>                 compatible = "rohm,dh2228fv";
>                 spi-max-frequency = <1000000>;
>                 reg = <0>;
>         };
> };
> 

>
> その上で下記のコードを用いて、/dev/spidev3.0 から出力を試みたのですが、
> ECSPI2 の各端子から SS 以外の信号が出力されません。(プルアップで張り付き)
>
> どのような原因が考えられますでしょうか。
>
>

> #include <stdio.h>
> #include <stdlib.h>
> #include <stdint.h>
> #include <unistd.h>
> #include <fcntl.h>
> #include <sys/ioctl.h>
> #include <linux/spi/spidev.h>
> 
> int main() {
>     uint8_t tx_data[] = {0xAA, 0xBB, 0xCC, 0xDD};
>     struct spi_ioc_transfer tr = {
>         .tx_buf = (unsigned long)tx_data,
>         .len = sizeof(tx_data),
>         .speed_hz = 1000000,
>         .bits_per_word = 8,
>     };
> 
>     int spi_fd = open("/dev/spidev3.0", O_RDWR);
>     if (spi_fd < 0) {
>         perror("Failed to open the SPI device");
>         exit(1);
>     }
> 
>     while (1) {
>         if (ioctl(spi_fd, SPI_IOC_MESSAGE(1), &tr) < 0) {
>             perror("Failed to send SPI message");
>             exit(1);
>         }
> 
>         printf("Data sent\n");
>         sleep(3);
>     }
> 
>     close(spi_fd);
>     return 0;
> }
> 

>
> 参考までに上記のコードと下記の DTS ファイルを用いると、
> ECSPI4 の各端子より、期待通りの信号が出力されます。
>
>

> iomuxc {
>         x1_ext {
>                 pinctrl_ecspi4: ecspi4grp {
>                         fsl,pins = <
>                                 MX7D_PAD_LCD_CLK__ECSPI4_MISO                   0x70
>                                 MX7D_PAD_LCD_ENABLE__ECSPI4_MOSI                0x70
>                                 MX7D_PAD_LCD_HSYNC__ECSPI4_SCLK                 0x70
>                                 MX7D_PAD_LCD_VSYNC__GPIO3_IO3                   0x70
>                         >;
>                 };
> 
> &ecspi4 {
>         pinctrl-names = "default";
>         pinctrl-0 = <&pinctrl_ecspi4>;
> 
>         fsl,spi-num-chipselects = <1>;
>         cs-gpios = <&gpio3 3 GPIO_ACTIVE_HIGH>;
>         status = "okay";
> 
>         spi@0 {
>                 compatible = "rohm,dh2228fv";
>                 spi-max-frequency = <1000000>;
>                 reg = <0>;
>         };
> };
> 

>
>

Armadillo に書き込んだ DTS の記述に誤りがありました。
修正したところ、ECSPI 2 で SPI 通信ができることが確認できました。

度々、申し訳ありません。
本件、解決とさせていただきます。

松阪様、ありがとうございました。