Armadilloフォーラム

Armadillo-X1へのMAX3109の実装

yamakawa

2019年10月8日 8時52分

山川と申します。

Armadillo-X1にて、デュアルシリアルUART「MAX3109」を組み込もうとしております。

kernelコンフィグにて、
Device Drivers
-> Character devices
-> Serial drivers
-> MAX310X support
は有効とし、
Devoce Treeも添付のように記述しましたが、
以下のエラーが出てしまいます。
(添付では、.dtsiのアップロードができませんでしたので、.dtsとしています。)

> > max310x spi1.0: No platform data supplied
> > max310x: probe of spi1.0 failed with error -22

Device Treeの記述方法に、何か問題があるのでしょうか?
または、このDevice Treeでの記述は、
Linux-3.14.79ではサポートしていないのでしょうか?
(/Documentation/devicetree/bindings/serialに、「maxim,max310x.txt」がありませんでした。)

ファイル ファイルの説明
armadillo_x1-ecspi2.dts
コメント

佐藤です。

> または、このDevice Treeでの記述は、
> Linux-3.14.79ではサポートしていないのでしょうか?
v3.14 ではサポートされておらず、v3.16 以降でサポートされているようです。
可能であれば、v4.9 を使用されることをお勧めします。
https://users.atmark-techno.com/armadillo-x1/software

山川です。

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

Device Tree以外でのデバイスの指定方法はあるのでしょうか?

また、Linux-4.9.133で同様にしてみたところ、
 spi_imx 30830000.ecspi: dma setup error -19, use pio
 max310x spi1.0: MAX3109 ID 0x00 does not match
 spi_imx 30830000.ecspi: probed
のエラーメッセージがありました。

お判りになることがあれば、ご教示頂けると幸甚です。

佐藤です。

> Device Tree以外でのデバイスの指定方法はあるのでしょうか?
platform data を C で記述する必要があります。

> また、Linux-4.9.133で同様にしてみたところ、
>  spi_imx 30830000.ecspi: dma setup error -19, use pio
>  max310x spi1.0: MAX3109 ID 0x00 does not match
>  spi_imx 30830000.ecspi: probed
> のエラーメッセージがありました。
MAX3109 のレジスタの値が取れていないようです。
MAX3109 の電源は入っていますでしょうか、または結線等は正常でしょうか。

山川です。

度々、ありがとうございます。

> MAX3109 の電源は入っていますでしょうか、または結線等は正常でしょうか。

電源が外れておりました。
接続し直したところ、
 spi_imx 30830000.ecspi: dma setup error -19, use pio
 max310x spi1.0: MAX3109 ID 0xda does not match
 spi_imx 30830000.ecspi: probed
のメッセージで、IDが変化しましたが、未だエラーの様子です。

お判りになることがあれば、ご教示頂けると幸甚です。

佐藤です。

レジスタの値は読めているようですが、期待している値とは違うようです。
RST 信号の high/low が正しくなっているかご確認ください。

山川です。

RST信号はhighとなっておりました。
Low Activeの信号なので、問題無いと思います。
(ちなみに、RST信号をLowにしたまま起動すると、"ID 0x00"とのメッセージになります。)

山川です。

返信頂き、ありがとうございます。

> MAX3109 の 9番ピン(SPI/I2C)は high になってますでしょうか。

確認致しましたが、highになっています。

また、
 max310x spi1.0: MAX3109 ID 0xda does not match
のメッセージですが、
 max310x spi1.0: MAX3109 ID 0xe0 does not match
と、IDが変化していました。
結線や、Device Treeは変更しておりません。

このIDは、どのレジスタの値なのか、お判りになりますか?
ご教示頂けると助かります。

佐藤です。

> また、
>  max310x spi1.0: MAX3109 ID 0xda does not match
> のメッセージですが、
>  max310x spi1.0: MAX3109 ID 0xe0 does not match
> と、IDが変化していました。
> 結線や、Device Treeは変更しておりません。
MAX3109 が正しく reset されていないのかもしれません。
arch/arm/boot/dts/imx7d-sdb-mipi-dsi.dts を参考に reset の定義を入れると良いかもしれません。
(上記に加えて reset-on-init を加えると、reset driver の probe 時に reset されます。)

> このIDは、どのレジスタの値なのか、お判りになりますか?
> ご教示頂けると助かります。
アドレスは 0x05 です。

山川です。

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

> > このIDは、どのレジスタの値なのか、お判りになりますか?
> アドレスは 0x05 です。

SPI使用時には、Extended addressingのため、アドレス0x05を参照しているのですね。
データシートに依ると、起動時には"0xC0"となるようで、
"0xda"や"0xe0"など正しく読めていないようです。

> arch/arm/boot/dts/imx7d-sdb-mipi-dsi.dts を参考に reset の定義を入れると良いかもしれません。
> (上記に加えて reset-on-init を加えると、reset driver の probe 時に reset されます。)

上記参照してみましたが、reset-on-initの使い方が判りません。
サンプルなどありませんでしょうか?

佐藤です。

> 上記参照してみましたが、reset-on-initの使い方が判りません。
> サンプルなどありませんでしょうか?
reset-on-init; と追加するだけです。

  compatible = "gpio-reset";
  reset-gpios = <&gpio6 15 GPIO_ACTIVE_LOW>;
  reset-delay-us = <1000>;
  reset-on-init;
  #reset-cells = <0>;

> 佐藤です。
>
> > 上記参照してみましたが、reset-on-initの使い方が判りません。
> > サンプルなどありませんでしょうか?
> reset-on-init; と追加するだけです。
>

>   compatible = "gpio-reset";
>   reset-gpios = <&gpio6 15 GPIO_ACTIVE_LOW>;
>   reset-delay-us = <1000>;
>   reset-on-init;
>   #reset-cells = <0>;
> 

山川です。

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

> reset-on-init; と追加するだけです。
>

>   compatible = "gpio-reset";
>   reset-gpios = <&gpio6 15 GPIO_ACTIVE_LOW>;
>   reset-delay-us = <1000>;
>   reset-on-init;
>   #reset-cells = <0>;
> 

上記を参考に組み込んでみて、reset信号が動作していることを確認致しました。
が、結果は変わらず、IDが正しく読めていない様子です。

佐藤です。

spi-max-frequency = <26000000>;    

ここの値を下げてみてもダメでしょうか。

山川です。

返信、遅くなりすみません。

> spi-max-frequency = <26000000>;
> ここの値を下げてみてもダメでしょうか。

spi-max-frequency = <1000000>;  /* 1MHz */
としたところ、
spi1.0: ttyMAX0 at I/O 0x0 (irq = 262, base_baud = 230400) is a MAX3109
spi1.0: ttyMAX1 at I/O 0x20 (irq = 262, base_baud = 230400) is a MAX3109
spi_imx 30830000.ecspi: probed
となり、正常に認識するようになりました。

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

ちなみに、
spi-max-frequency = <10000000>;  /* 10MHz */
spi-max-frequency = <26000000>;  /* 26MHz */
は指定できないのでしょうか?

佐藤です。

> spi-max-frequency = <26000000>;  /* 26MHz */
> は指定できないのでしょうか?
MAX3109 のデータシートを確認する限り 26MHz でも動作すると思います。
現状では動作しないということなので、実際の波形を確認してみると良いかもしれません。

山川です。

> MAX3109 のデータシートを確認する限り 26MHz でも動作すると思います。
> 現状では動作しないということなので、実際の波形を確認してみると良いかもしれません。

確認してみます。

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