Armadilloフォーラム

Armadillo-X1 gpio設定について

momura

2018年5月14日 13時46分

お世話になります。大村と申します。
Armadillo-X1 gpio設定についてお教えください。
フォーラム
https://armadillo.atmark-techno.com/forum/armadillo/2563

ブログ
https://users.atmark-techno.com/blog/615/2577
を拝見して、他のArmadilloとは違って、exportしなければ使えないこと、
入出力ディレクションの設定は他のArmadilloと同様ということは判りました。
しかし、PAD設定やInputとして使う場合、DeviceTreeの変更が必要との記載がありました。
例えば今回の場合、GPIO1_IO1、GPIO3_IO7、GPIO3_IO8、GPIO3_IO11、GPIO3_IO13、GPIO3_IO19、GPIO3_IO20、GPIO5_IO9、GPIO5_IO10、GPIO7_IO11を入力にして使おうと考えております。
この場合、DeviceTreeの変更が必要でしょうか?
必要な場合、その記述方法をご教示ください。
よろしくお願い申し上げます。

コメント

溝渕です。

> 例えば今回の場合、GPIO1_IO1、GPIO3_IO7、GPIO3_IO8、GPIO3_IO11、GPIO3_IO13、GPIO3_IO19、GPIO3_IO20、GPIO5_IO9、GPIO5_IO10、GPIO7_IO11を入力にして使おうと考えております。
> この場合、DeviceTreeの変更が必要でしょうか?

必要です。これは、GPIOを入力として利用しようとしているためです。

> 必要な場合、その記述方法をご教示ください。

例えば、"GPIO1_IO1"と"GPIO3_IO7"を追加する場合は次のように記述します。

--- a/arch/arm/boot/dts/armadillo_x1.dts
+++ b/arch/arm/boot/dts/armadillo_x1.dts
@@ -263,6 +263,8 @@
imx7d-sdb {
pinctrl_hog_1: hoggrp-1 {
fsl,pins = <
+ MX7D_PAD_LCD_DATA02__GPIO3_IO7 0x40000074
+
/* Add-On Module I/F */
MX7D_PAD_EPDC_PWR_STAT__GPIO2_IO31 0x00 /* G_AOM_USB_PWREN */

@@ -376,6 +378,8 @@
imx7d-sdb {
pinctrl_hog_2: hoggrp-2 {
fsl,pins = <
+ MX7D_PAD_GPIO1_IO01__GPIO1_IO1 0x40000074
+
MX7D_PAD_GPIO1_IO00__WDOD1_WDOG_B 0x74
MX7D_PAD_GPIO1_IO03__CCM_CLKO2 0x0a /* USB_HUB_REFCLK */
>;

MUX設定を示すマクロについては、"arch/arm/boot/dts/imx7d-pinfunc.h"を参
照してください。命名規則は次のようになっています。
MX7D_PAD_[ピン名]__[機能名]

PAD設定はご利用環境に合わせて適宜変更してください。ただし、入力として
利用する場合は、ソフトウェアとして特別な意味を持つbit30だけは必ず"1"に
設定してください。

PAD設定の下位7bitについては、i.MX 7Dual Applications Processor
Reference Manual[1]の以下の章から設定内容を確認できます。
8.2.5.14 SW_PAD_CTL_PAD_GPIO1_IO01 SW PAD Control Register
(IOMUXC_LPSR_SW_PAD_CTL_PAD_GPIO1_IO01)

[1]: https://www.nxp.com/jp/products/processors-and-microcontrollers/applica…

また、GPIO1_IO01〜GPIO1_IO08については、"iomuxc_lpsr"にMUX/PAD設定を追
加する必要があります。その他のピンは"iomuxc"に追加してください。

溝渕様

お世話になります。大村です。早速のご回答ありがとうございます。
内容理解できました。
これにてトライしてみます。
取り急ぎ御礼申し上げます。

中村です。

横から失礼します。

> + MX7D_PAD_LCD_DATA02__GPIO3_IO7 0x40000074
> +
...
> PAD設定はご利用環境に合わせて適宜変更してください。ただし、入力として
> 利用する場合は、ソフトウェアとして特別な意味を持つbit30だけは必ず"1"に
> 設定してください。

入力として使用するとき、bit30を立てる必要がありますか?
bit30はSIONですよね?

参考:
https://armadillo.atmark-techno.com/forum/armadillo/2625

--
なかむら

中村です。

(あとで自分でこれを読んだときのメモを兼ねてますが...)
> 入力として使用するとき、bit30を立てる必要がありますか?
> bit30はSIONですよね?
>
> 参考:
> https://armadillo.atmark-techno.com/forum/armadillo/2625

このときの溝渕さんとのやりとりと前後して、
at_itoさんがブログにまとめてくれていました。
https://users.atmark-techno.com/blog/53/2629

--
なかむら

溝渕です。

> > 入力として使用するとき、bit30を立てる必要がありますか?
> > bit30はSIONですよね?

ご認識の通りSIONです。

i.MXのGPIOドライバでは、データの入力にGPIO pad status registerを参照し
ます。GPIO data registerは出力にのみ利用します。

そのため、SIONを立てる必要があります。

GPIOドライバを次のように変更すると、SIONを立てなくても正しく入力値を取
得可能になると思います。

drivers/gpio/gpio-mxc.c
450 err = bgpio_init(&port->bgc, &pdev->dev, 4,
451 port->base + GPIO_DR, // GPIO_PSRをGPIO_DRに変更
452 port->base + GPIO_DR, NULL,
453 port->base + GPIO_GDIR, NULL, 0);

中村です。

> i.MXのGPIOドライバでは、データの入力にGPIO pad status registerを参照し
> ます。GPIO data registerは出力にのみ利用します。
>
> そのため、SIONを立てる必要があります。

DRレジスタではなくてPSRレジスタを使っていることは知っています。

>> 参考:
>> https://armadillo.atmark-techno.com/forum/armadillo/2625
の2017/05/03 - 00:38の私の投稿の次の部分

| GPIOの値の読み出し(/sys/class/.../valueのread)は、
| DRレジスタではなく、PSRレジスタを使っているようです。
| PSRレジスタは、DIRがinputのときはピンの値そのもの。
| DIRがoutputのときは、IOMUXのSIONビットを1にしてあげると、
| DRにセットした値をPSRで読めるようです。

このときに調べたところでは、この引用にあるように
PSRでinputピンの値を読めるようです。
SIONとは関係なくです。

> GPIOドライバを次のように変更すると、SIONを立てなくても正しく入力値を取
> 得可能になると思います。
>
>
> drivers/gpio/gpio-mxc.c
> 450 err = bgpio_init(&port->bgc, &pdev->dev, 4,
> 451 port->base + GPIO_DR, // GPIO_PSRをGPIO_DRに変更
> 452 port->base + GPIO_DR, NULL,
> 453 port->base + GPIO_GDIR, NULL, 0);
>

上に書いたように、このような修正をしなくとも、
PSRレジスタのままでSIONなしで、
入力は読めると思うのですが・・・

DA00アドオンボードのデジタル入力のポートでは、
SIONビットは立っていなかったと思います。
出力ポートでは、
>> 参考:
>> https://armadillo.atmark-techno.com/forum/armadillo/2625
のやりとりのあとのリリース版修正でSIONが立てられましたが。

--
なかむら

溝渕です。

> DRレジスタではなくてPSRレジスタを使っていることは知っています。

大変失礼しました。

> このときに調べたところでは、この引用にあるように
> PSRでinputピンの値を読めるようです。
> SIONとは関係なくです。

ご指摘の通り、SION無効でもPSRでinputピンの状態を読めそうです。
IMX7DRM.pdf(Rev. 1, 01/2018)にはoutputピンの状態を読むにはSIONを有効に
する必要があるとのみ記述されていました。
8.3.4.2.2 GPIO Write Mode

誤った情報をお伝えして大変申し訳ございません。

> DA00アドオンボードのデジタル入力のポートでは、
> SIONビットは立っていなかったと思います。
> 出力ポートでは、
> >> 参考:
> >> https://armadillo.atmark-techno.com/forum/armadillo/2625
> のやりとりのあとのリリース版修正でSIONが立てられましたが。

SIONを立てた背景としては、以下のドキュメントに記載の挙動とするためです。

Documentation/gpio/consumer.txt
> int gpiod_get_value(const struct gpio_desc *desc);
> void gpiod_set_value(struct gpio_desc *desc, int value);
>
>The values are boolean, zero for low, nonzero for high. When reading the value
>of an output pin, the value returned should be what's seen on the pin. That
>won't always match the specified output value, because of issues including
>open-drain signaling and output latencies.

中村です。

> 誤った情報をお伝えして大変申し訳ございません。

くどいかもしれませんが、まとめとして・・・

>> 横から失礼します。
>>
>>> + MX7D_PAD_LCD_DATA02__GPIO3_IO7 0x40000074
>>> +
>> ...
>>
>>> PAD設定はご利用環境に合わせて適宜変更してください。ただし、入力として
>>> 利用する場合は、ソフトウェアとして特別な意味を持つbit30だけは必ず"1"に
>>> 設定してください。
>>
>> 入力として使用するとき、bit30を立てる必要がありますか?

入力としてだけ使用するときはbit30を立てる必要はなく、
この部分は、
MX7D_PAD_LCD_DATA02__GPIO3_IO7 0x74
でいいのですよね?

--
なかむら

溝渕です。

> 入力としてだけ使用するときはbit30を立てる必要はなく、
> この部分は、
> MX7D_PAD_LCD_DATA02__GPIO3_IO7 0x74
> でいいのですよね?

良いです。

溝渕様、中村様

大村です。
お二方、いろいろと有り難う御座います。
bit30を立てても、立てなくても、gpio入出力とも
正常に動作しているようです。
動作確認ができました。
ありがとうございました。

中村です。

> bit30を立てても、立てなくても、gpio入出力とも
> 正常に動作しているようです。

整理しておきます。

「入力のときは"必要はない"」であって、立てても問題はなく、
入力はbit30(SION)を立てても立てなくても正常動作します。
出力のときも(出力するだけなら)立てても立てなくても問題なく動作します。
出力ポートに出力した値を読むときにbit30(SION)が必要になります。

--
なかむら

中村様
よく解りやすい解説ありがとうございます。
理解できました。
御礼申し上げます。

      大村