Armadilloフォーラム

Armadillo IoT G3 DO1接点の出力を確認するには

sshida

2017年5月2日 20時00分

Armadillo IoT G3の接点モジュールでDO1端子に接点出力して、
その出力状態を確認しようとしています。

次のように接点出力でショートを指示しているつもりですが、
valueの値が「0」のままで変化がありませんでした。

$ cat /sys/class/gpio/gpio89/value
0
 
$ sudo sh -c "echo 1 > /sys/class/gpio/gpio89/value"
 
$ cat /sys/class/gpio/gpio89/value
0

どのようにすると接点出力を制御して、状態をとれるでしょうか?

コメント

中村です。

気になったので調べてみました。

> Armadillo IoT G3の接点モジュールでDO1端子に接点出力して、

接点モジュール(アドオンのDA00でしょうか...)でなくて
(DA00も持っていはいるのですが今は装着していないので)
Armadillo-IoTG3の開発セットに標準添付のRS00アドオンモジュールの
CON3/CON4の2.54ピッチのスルー端子を使って調べてみました。
使ったのは、CON4の45ピン(CON3とCON4で通しの番号がついてます)の
GPIO7_IO10(gpio202)です。

確かに、valueに1を出力しても、valueを読み込むと0になってますね。

Armadillo-IoTG3マニュアルの
22.3.3. 入力レベルを取得する
http://manual.atmark-techno.com/armadillo-iot-g3/armadillo-iotg-g3_prod…
に、次の記述があります。
| ・・・(省略)・・・入力レベルの取得は入出力方向がINPUT, OUTPUTの
| どちらでも行うことができます。
| 入出力方向がOUTPUTの時に読み出される値は、GPIOピンの状態です。
| そのため、valueファイルに書き込んだ値とは異なる場合があります。

まず、最初の「入力レベルの取得は・・・できます」のところですが、
細かいことを言うと、OUTPUTのときに「入力レベルを取得できる」はずは
ないですね。出力なのですから。
ソフトウェアが「/sys/class/.../valueをreadできます」ってことならわかりますが。

それから次の「入出力方向がOUTPUTの時に読み出される値」、
これも表現が、なんかおかしいと思います。
valueに値をwriteしてOUTPUTで出力しているなら、
valueの値とGPIOピンの状態の一致しているはずなのに、
「valueファイルに書き込んだ値とは異なる場合があります」と
書いてあります。これがおかしいと思うのです。

で、ソースとiMX7 Dualのリファレンスマニュアルを見てみました。
ソースはlinux-3.14-x1-at10/drivers/gpioにあるgpio-mxc.cとgpio-generic.c、
それから、gpiolib.cです。
(使っているの、これであってますよね?)

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

ここまではわかったのですが、SIONを1にする方法がわかりません。
DeviceTreeのどこかだとは思うのですが・・・

--
なかむら

中村です。

> ここまではわかったのですが、SIONを1にする方法がわかりません。
> DeviceTreeのどこかだとは思うのですが・・・

見つけました。

DA00アドオンのDO1とDO2ならば、
linux-3.14-x1-at10/arch/arm/boot/dts/imx7d-pinfunc.h

...
/*
 * The pin function ID is a tuple of
 * <mux_reg conf_reg input_reg mux_mode input_val>
 */
...
#define MX7D_PAD_LCD_DATA20__GPIO3_IO25                           0x0118 0x0388 0x0000 0x5 0x0
...
#define MX7D_PAD_LCD_DATA21__GPIO3_IO26                           0x011C 0x038C 0x0000 0x5 0x0
...
#define MX7D_PAD_I2C2_SCL__GPIO4_IO10                             0x0150 0x03C0 0x0000 0x5 0x0
...
#define MX7D_PAD_I2C2_SDA__GPIO4_IO11                             0x0154 0x03C4 0x0000 0x5 0x0
...

の各defineの5個の数値の右から2番目の0x5を0x15に
変更すればよさそうです。

変更後は次のようになります。

#define MX7D_PAD_LCD_DATA20__GPIO3_IO25                           0x0118 0x0388 0x0000 0x15 0x0
#define MX7D_PAD_LCD_DATA21__GPIO3_IO26                           0x011C 0x038C 0x0000 0x15 0x0
#define MX7D_PAD_I2C2_SCL__GPIO4_IO10                             0x0150 0x03C0 0x0000 0x15 0x0
#define MX7D_PAD_I2C2_SDA__GPIO4_IO11                             0x0154 0x03C4 0x0000 0x15 0x0

GPIO3_IO25とGPIO3_IO26が、CON1に装着したときのDO1とDO2
GPIO4_IO10 とGPIO4_IO11が、CON2に装着したときのDO1とDO2

# カーネル書き換えが面倒なので、自分では試してません。

--
なかむら

溝渕です。

中村さんの手順でもSIONを有効化できますが、ドライバの設計思想としては
Device Treeを編集した方がスマートです。

アドオン用のDevice Treeは、Device Tree Overlay[1]向けであるため、Linux
カーネルイメージにDTBが含まれる点に注意してください。

DA00アドオン用のDTSは以下の通りです。前者がアドオンインターフェース1用、
後者がアドオンインターフェース2用です。

arch/arm/mach-imx/armadillo_iotg_addon/addon_atmark_techno_didoad_iotg_g3_intf1.dts
arch/arm/mach-imx/armadillo_iotg_addon/addon_atmark_techno_didoad_iotg_g3_intf2.dts

例として、アドオンインターフェース1に接続されるDA00アドオンについて説明します。

デフォルト状態では、DOの設定は次のようになっています。

    MX7D_PAD_LCD_DATA20__GPIO3_IO25        0x00    /* INTF1_24 */
    MX7D_PAD_LCD_DATA21__GPIO3_IO26        0x00    /* INTF1_25 */

1番目のパラメータは、ピンマルチプレクス設定を表しています。命名規則は次の通りです。
MX7D_PAD_[ピン名]__[機能名]

2番目のパラメータは、主にパッド設定を現しています。以下のように、上位
2bitのみ特別な意味を持ちます。

bit31 - 0:パッド設定を行う, 1:パッド設定を行わない
bit30 - 0:SIONを無効化する, 1:SIONを有効化する

以上より、SIONを有効化するには、bit30に"1"を設定します。修正後のDTSは
次のようになります。

    MX7D_PAD_LCD_DATA20__GPIO3_IO25        0x40000000    /* INTF1_24 */
    MX7D_PAD_LCD_DATA21__GPIO3_IO26        0x40000000    /* INTF1_25 */

[1]: Linuxの起動後にDevice Treeの変更をする機能です

以上です。

中村様、溝渕様、ありがとうございます。

SIONの有効化が必要とのことですね。
すみません、Linux実行中にSIONを有効にすることはできるでしょうか?

溝渕です。

> SIONの有効化が必要とのことですね。

上記ご認識で正しいです。

> すみません、Linux実行中にSIONを有効にすることはできるでしょうか?

ユーザーランドからピン設定を変更するインターフェースは用意していません。

ドライバとの不整合が生じる可能性があるため危険ではありますが、
"/dev/mem"から直接レジスタ値を変更すると、ユーザーランドからピン設定を
変更可能と思います。

以上です。

溝渕様

ありがとうございます。/dev/memの変更だけだと動作するかわからないですね。

SIONの変更については、DTSを編集と、コンパイルした.dtbファイルの入替・再起動で
反映できるでしょうか?

溝渕です。

DTSの編集後は、先に書いた通り、

> アドオン用のDevice Treeは、Device Tree Overlay[1]向けであるため、Linux
> カーネルイメージにDTBが含まれる点に注意してください。

Linuxカーネルイメージの入替・再起動で反映することができます。

溝渕様、ありがとうございます。

アドオンボードのドライバ設定はDTSにあるけれども、
kernelイメージ内部に含まれるのでしたね。

中村です。
溝渕さん、フォローありがとうございます。

> 中村さんの手順でもSIONを有効化できますが、ドライバの設計思想としては
> Device Treeを編集した方がスマートです。

includeファイルを書き換える方法を投稿したあと、
「きれいではないなぁ」と別な方法を探していて、

linux-3.14-x1-at10/Documentation/devicetree/bindings/pinctrl/fsl,imx-pinctrl.txt
の次の記述はみつけていたのですが...

Required properties for pin configuration node:
- fsl,pins: each entry consists of 6 integers and represents the mux and config
  setting for one pin. The first 5 integers <mux_reg conf_reg input_reg mux_val
  input_val> are specified using a PIN_FUNC_ID macro, which can be found in
  imx*-pinfunc.h under device tree source folder. The last integer CONFIG is
  the pad setting value like pull-up on this pin. And that's why fsl,pins entry
  looks like <PIN_FUNC_ID CONFIG> in the example below.
 
Bits used for CONFIG:
NO_PAD_CTL(1 << 31): indicate this pin does not need config.
 
SION(1 << 30): Software Input On Field.
Force the selected mux mode input path no matter of MUX_MODE functionality.
By default the input path is determined by functionality of the selected
mux mode (regular).
 
Other bits are used for PAD setting.
Please refer to each fsl,<soc>-pinctrl,txt binding doc for SoC specific part
of bits definitions.

6番目のパラメタ(溝渕さんの説明では2番目)は、
PULL-UP/DOWNなどを指定するPADコントロールの下位8ビットに
対応していることもわかっていたのですが、その続きの
SIONの説明のところを読み切れていませんでした。

6番目のパラメタ(上の英文説明では"CONFIG")のbit30で
SIONを指定できるってことだったのですね。
(溝渕さんの説明を読んだ後、これを読み直して、
あー!そういうことだったのか・・・と)

勉強になりました。

--
なかむら

溝渕です。

本来(聞かれる前に)こちらから情報提供しなければならないところ、申し訳あ
りません。

Device Treeのプロパティについては、ほとんどの場合ドライバ固有になるの
で覚えるのが大変ですよね。

通常、ドライバ追加時には"Documentation/devicetree/bindings/"にノードお
よびプロパティの情報が記載されたドキュメントが追加されますが、実例等を
含むわかりやすいものとそうでないものがあります。imx-pinctrlは少しわか
りずらいですね。

また、カーネルドキュメントにはたびたび誤記や追記漏れ等あるため、私は最
終的には必ずドライバソースを確認してDTSを書くようにしています。ほとん
どのドライバでプロパティの取得はprobe内で行われるので、probe内を"of_"
で検索していくと大体見つかります。

Armadillo IoT G3で、DA00アドオンボードのデジタル出力ポートを変更したときは、
変更した状態をGPIOの値として読み取れるように、修正をしていただけないでしょうか?

2017年5月の更新を試してみましたが、デジタル出力の状態は常に0で、
GPIOのファイルでは読み取れませんでした。
http://armadillo.atmark-techno.com/armadillo-iot-g3/downloads

溝渕です。

> Armadillo IoT G3で、DA00アドオンボードのデジタル出力ポートを変更したときは、
> 変更した状態をGPIOの値として読み取れるように、修正をしていただけないでしょうか?

添付のパッチを次回アップデートに取り込む予定です。

以上です。

ファイル ファイルの説明
linux-3.14-x1-at14_enable_sion_for_do_pins.patch

DOの出力状態をgpioのvalueで読み出せるようになりました。ありがとうございます。