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 のデバイスファイルが作成されません。
何かお気づきの点などございましたら、ご指摘いただけますと幸いです。
コメント
at_matsuzaka
松坂です。
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…
n_kogawa
> 松坂です。
>
> 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>; }; };
n_kogawa
> > 松坂です。
> >
> > 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 通信ができることが確認できました。
度々、申し訳ありません。
本件、解決とさせていただきます。
松阪様、ありがとうございました。
n_kogawa
2024年3月27日 22時22分
> Armadiilo-X1 拡張 I/F(CON8)の ECSPI2 を利用したSPI 通信を試みていますが、苦戦中です。
>
> カーネルソース(v6.1-at1)に含まれる armadillo_x1-ecspi4_mcp3202.dts を下の記事を参考に、下記の DTS を作成しました。
> https://armadillo.atmark-techno.com/blog/615/2577
>
>
>
> この DTS をコンパイルしてArmadillo 側に取り込み、起動パラメータの設定を行いましたが、/dev/spidevX.X のデバイスファイルが作成されません。
> 何かお気づきの点などございましたら、ご指摘いただけますと幸いです。
>
仕様 → 使用 です。失礼しました。