GPIOコントロール

組み込みボードには多くの場合、外部機器を操作するためのGPIOポートの機能が要求されます。
Beagleboardにも、多くの拡張ポートが用意されています。
以下では、P9の28ピン拡張コネクタをGPIOとしてテストする簡単な方法を紹介します。

MUX設定

Beagleboardの拡張コネクタには、マルチプレクサ機能があり、マルチプレクサの8通りのうちいずれかのモードを、ピンMUXレジスタに書き込むことで、設定することができます。
各ピンの詳細については、System Reference Manualの表22 Expansion Connector Signals を参照してください。
例えば24番ピンの場合

Exp processer  0     1     2     3     4     5     6     7
24   AF15   I2C2_SCL   X     X     X   GPIO_168   X     X     Z

の様になっています。
アドレス番号AF15であり、レジスタに0を書き込んだ場合は、第2のI2Cポートのコントロールピンとなり、4を書き込むとGPIO168ポートと認識されます。
この設定は、Beagleboardの起動時に行われ、u-bootで行う方法と、カーネルの起動時に行う方法があります。
標準の設定では、u-bootでの設定を、カーネルが上書きしてカーネルでの設定が有効になっているようです。
また、他のポートはsysfsなどの仮想デバイスファイルを使って起動後でも設定できますが、I2Cシリアルポートは排他的設定となるため、この方法が使用が出来ませんので注意が必要です。

u-bootでの設定
ブートローダコンパイルで紹介した方法で、u-bootのソースコードを入手します。
u-boot-main/board/ti/beagle/beagle.h を開き、目的のピンの表22の0列にある名前で検索します。
24番ピンの場合なら、I2C2_SCLです。

263行目に
MUX_VAL(CP(I2C2_SCL), (IEN | PTU | EN | M0)) /*I2C2_SCL*/\
MUX_VAL(CP(I2C2_SDA), (IEN | PTU | EN | M0)) /*I2C2_SDA*/\

の行が見つかります。この場合、M0 がモード0を表しています。そこで、これを
MUX_VAL(CP(I2C2_SCL), (IEN | PTU | EN | M4)) /*I2C2_SCL*/\
MUX_VAL(CP(I2C2_SDA), (IEN | PTU | EN | M4)) /*I2C2_SDA*/\

に書き換えてコンパイルします。

カーネルでの設定は、もう少し複雑なようです。基本的には
linux-2.6.39.3/arch/arm/mach-omap2/mux34xx.c
の中で定義されているようなのですが、u-bootで簡単に設定できるので今回は簡単な方法を使います。
しかし、このままではu-bootでの設定が書き換えられてしますので、カーネルを再コンパイルします。
menuconfigで

system type --->
TI OMAP Common Features --->
[*] OMAP multiplexing support

のチェックをはずして、再コンパイルします。

これでu-bootでの設定が有効となりますので、23,24番ピンがGPIO_183 GPIO_168に設定されます。
ただし、この設定では、ブートメッセージ中に
timed out in wait_for_pin: I2C_STAT=0
I2C read: I/O error
とのエラーが出るようにまります。I2C_2ポートも起動スクリプト内で初期化されてるみたいですね。27、28番のGNDピンに一番近いので24番ピンを選びましたが、 他のピンの方が簡単だった用です。また、I2C_1ポートが使えるかどうかは確認していませんので、I2Cシリアルポートを使う場合は、カーネルでの設定を試してください。

sysfsでのGPIOコントロール

sysfsファイルは、2.6から採用されたprocファイルに代わるデバイスやドライバを扱う仮想ファイルシステムです。
拡張ポートの24番ピンと28番ピンの間の電圧を測定するか、LEDを挿入して動作を確認できるようにします。

cd /sys/class/gpio/
echo 168 > export
cd gpio168
echo out > direction
echo 1 > value
echo 0 > value
cd ..
echo 168 > unexport

最初、電圧は0.7V程度です。ハイインピーダンス状態?
echo out > direction を実行すると、電圧は0Vになります。
echo 1 > value で1.8Vに
echo 0 > value で0Vに変化します。

inserted by FC2 system