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
どのようにすると接点出力を制御して、状態をとれるでしょうか?
コメント
y.nakamura
中村です。
> ここまではわかったのですが、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
# カーネル書き換えが面倒なので、自分では試してません。
--
なかむら
at_mizo
溝渕です。
中村さんの手順でも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の変更をする機能です
以上です。
sshida
at_mizo
sshida
at_mizo
sshida
y.nakamura
中村です。
溝渕さん、フォローありがとうございます。
> 中村さんの手順でも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を指定できるってことだったのですね。
(溝渕さんの説明を読んだ後、これを読み直して、
あー!そういうことだったのか・・・と)
勉強になりました。
--
なかむら
at_mizo
溝渕です。
本来(聞かれる前に)こちらから情報提供しなければならないところ、申し訳あ
りません。
Device Treeのプロパティについては、ほとんどの場合ドライバ固有になるの
で覚えるのが大変ですよね。
通常、ドライバ追加時には"Documentation/devicetree/bindings/"にノードお
よびプロパティの情報が記載されたドキュメントが追加されますが、実例等を
含むわかりやすいものとそうでないものがあります。imx-pinctrlは少しわか
りずらいですね。
また、カーネルドキュメントにはたびたび誤記や追記漏れ等あるため、私は最
終的には必ずドライバソースを確認してDTSを書くようにしています。ほとん
どのドライバでプロパティの取得はprobe内で行われるので、probe内を"of_"
で検索していくと大体見つかります。
sshida
Armadillo IoT G3で、DA00アドオンボードのデジタル出力ポートを変更したときは、
変更した状態をGPIOの値として読み取れるように、修正をしていただけないでしょうか?
2017年5月の更新を試してみましたが、デジタル出力の状態は常に0で、
GPIOのファイルでは読み取れませんでした。
http://armadillo.atmark-techno.com/armadillo-iot-g3/downloads
at_mizo
溝渕です。
> Armadillo IoT G3で、DA00アドオンボードのデジタル出力ポートを変更したときは、
> 変更した状態をGPIOの値として読み取れるように、修正をしていただけないでしょうか?
添付のパッチを次回アップデートに取り込む予定です。
以上です。
ファイル | ファイルの説明 |
---|---|
linux-3.14-x1-at14_enable_sion_for_do_pins.patch |
at_mizo
溝渕です。
> 添付のパッチを次回アップデートに取り込む予定です。
上記、Linuxカーネル v15.00で対応しました。以下のページより取得可能です。
http://armadillo.atmark-techno.com/armadillo-iot-g3/downloads
sshida
sshida
y.nakamura
2017年5月3日 0時38分
中村です。
気になったので調べてみました。
> 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のどこかだとは思うのですが・・・
--
なかむら