2012/05/11

LinuxとBeagleBoneのGPIOの関係


BeagleBoneのGPIOは、

  1. exportを使ってGPIOにアクセスできるようにし
  2. gpioN/value に値を書き込んだり読み込んで入出力を行い
  3. 使わなくなったらunexportする

という手順で使えるのですが、そもそもどうしてこうなってるの?と疑問に思ったので調べてみました。

オリジナル:GPIO Interfaces@kernel.org

GPIO Interfaces 勝手に翻訳
(よくわからないとこは飛ばしています)

GPIO:General Purpose Input/Outputは、ソフトウェアで柔軟に制御できるデジタル信号です。これらは様々な種類のチップにより提供され、カスタムハードウェアを開発するLinux開発者によく知られています。GPIOピンはそれぞれピンまたはBGAパッケージ上のボールに接続されています。基盤の回路図を確認すると、GPIOがどのピンに接続されているかを確認することができます。セットアップコードがドライバにその接続情報を渡すので、ドライバはGPIOに対してデータを書き込むことができます。

System-On-Chip(SOC)プロセッサは、GPIOに大きく頼っています。いくつかのケースでは、非専用ピンはGPIOとして設定することができます。そして、SOCプロセッサは数ダースものGPIO対応ピンを持ちます。

FPGAのようなロジックデバイスは簡単にGPIOピンを提供することができます。パ
ワーマネージャやオーディオコーデックなどの多機能チップ は、SOCのGPIOピン
不足を補うために少しのGPIOピンを持っています。また、I2CやSPIバスを使用し
てSOCに接続する、GPIOエ キスパンダなどもあります。大抵のPCのサウスブリッ
ジ(入出力コントローラがある側)には、数ダースのGPIOピンを持ちます。(BIOS
の ファームウェアがそれを認識している場合のみ)

GPIOの機能はシステムによって変わってきますが、共通の機能は以下の通りです。
- 1または0の値を出力できます。
- 1または0の値を読み取ることができます。いくつかのチップは出力モードになっているピンの値を読み取ることができます。また、GPIOコントローラはデグリッチ/デバウンスロジックを持ち、ソフトウェアで制御できる場合もあります。
- 入力ではIRQ信号が使える場合があります。IRQは待機中システムのウェイクアップイベントなどに使用できます。
- GPIOピンは大抵の場合、入力/出力を切り替えることができますが、製品によってはどちらか一方のみしか利用できないものもあります。
- ほとんどのGPIOはスピンロックを保持したままアクセスできます。

GPIO conventions
Identifying GPIOs
パス。 GPIOは正の整数で識別されるとのこと。負の部分はエラーコード用に使うようです。

Using GPIOs
パス。gpio_direction_inputとgpio_direction_outputを使って入出力を切り替えることができるようです。

Spinlock-Safe GPIO access
パス。マルチスレッドでなければ、IRQハンドラなどの中では安全にGPIOをメモ
リの読み取り/書き込み命令を使用してアクセスできるようで す。

GPIO access that may sleep
Claiming and Releasing GPIOs
GPIOs mapped to IRQs
Emulating Open Drain Signals
What do these conventions omit?
GPIO implementor's framework (OPTIONAL)
Controller Drivers: gpio_chip
Platform Support
Board Support
全部パス。


以下の項目が一番疑問に思ってたところの解答っぽいです。
Paths in Sysfs
以下の3種類のエントリーが /sys/class/gpio 内にあります。

  • GPIOをユーザ空間でコントロールするためのインターフェース
  • GPIOs自身
  • GPIOコントローラ ("gpio_chip")としてインスタンス化されます

これらは"device"などの標準シンボリックリンクに加えられます。

コントロールインターフェースは書き込み専用です。
/sys/class/gpio/

  • "export"...ユーザ空間はカーネルに対し、GPIOをエクスポートするよう問い合わせます。例: "echo 19 > export "は"gpio19"ノードを作成します。これはカーネルコードでなくても可能です。
  • "unexport"...exportと反対の作用を持ちます。例: "echo 19 > unexport " は"gpio19"ノードを削除します。

GPIOシグナルは /sys/class/gpio/gpio42/ のようにパスを持ちます。また、以
下のような読み取り・書き込み可能な属性を持ちます。
/sys/class/gpio/gpioN/

  • "direction" .. "in"または"out"のいずれかとなります。大抵の場合、directionは書き込み可能です。カーネルがGPIOのdirection変更をサ ポートしていなかったり、ユーザ空間に許可していない場合は、directionは表示されません。


  • "value" .. 0(low)か1(high)の値を持ちます。GPIOが出力に設定されている場合は、この値は書き込みできます。0でない値は"high"として扱われ ます。
  • "edge" .. "none","rising","falling","both"の値を持ちます。これらの値を書き込むことで、信号のエッジ形状を選択することができます。このファイルは、GPIOピンが割り込み要求可能な場合に表示されます。
  • "active_low" .. 0(false) か1(true)の値を持ちます。0以外の値を書き込むと、読み込み・書き込みの属性値が反転します。

GPIOコントローラは/sys/class/gpio/gpiochip42/のようなパスを持ち、以下の
読み取り専用属性を持ちます。
/sys/class/gpio/gpiochipN/

  • "base" .. Nと同じで、このチップで管理されるGPIOピンの最初を表します。
  • "label" .. 診断用に提供されます。(常に一意であるとは限りません)
  • "ngpio" .. 何本GPIOピンが管理されているかを示します。 (N to N + ngpio - 1)

Exporting from Kernel code
パス。

以上、GPIOについての調査でした。

0 件のコメント:

コメントを投稿