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の変更が必要でしょうか?
必要な場合、その記述方法をご教示ください。
よろしくお願い申し上げます。
コメント
momura
y.nakamura
中村です。
横から失礼します。
> + MX7D_PAD_LCD_DATA02__GPIO3_IO7 0x40000074
> +
...
> PAD設定はご利用環境に合わせて適宜変更してください。ただし、入力として
> 利用する場合は、ソフトウェアとして特別な意味を持つbit30だけは必ず"1"に
> 設定してください。
入力として使用するとき、bit30を立てる必要がありますか?
bit30はSIONですよね?
参考:
https://armadillo.atmark-techno.com/forum/armadillo/2625
--
なかむら
y.nakamura
中村です。
(あとで自分でこれを読んだときのメモを兼ねてますが...)
> 入力として使用するとき、bit30を立てる必要がありますか?
> bit30はSIONですよね?
>
> 参考:
> https://armadillo.atmark-techno.com/forum/armadillo/2625
このときの溝渕さんとのやりとりと前後して、
at_itoさんがブログにまとめてくれていました。
https://users.atmark-techno.com/blog/53/2629
--
なかむら
at_mizo
溝渕です。
> > 入力として使用するとき、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);
y.nakamura
中村です。
> 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が立てられましたが。
--
なかむら
at_mizo
溝渕です。
> 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.
y.nakamura
中村です。
> 誤った情報をお伝えして大変申し訳ございません。
くどいかもしれませんが、まとめとして・・・
>> 横から失礼します。
>>
>>> + MX7D_PAD_LCD_DATA02__GPIO3_IO7 0x40000074
>>> +
>> ...
>>
>>> PAD設定はご利用環境に合わせて適宜変更してください。ただし、入力として
>>> 利用する場合は、ソフトウェアとして特別な意味を持つbit30だけは必ず"1"に
>>> 設定してください。
>>
>> 入力として使用するとき、bit30を立てる必要がありますか?
入力としてだけ使用するときはbit30を立てる必要はなく、
この部分は、
MX7D_PAD_LCD_DATA02__GPIO3_IO7 0x74
でいいのですよね?
--
なかむら
at_mizo
momura
y.nakamura
momura
at_mizo
2018年5月14日 14時15分
溝渕です。
> 例えば今回の場合、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"に追加してください。