
私は、GPIO ピン 102 にブザーが取り付けられた ARM マシンを使用しています。マシンは Linux 2.6 を実行しているため、/sys/class/gpio のピンへの sysfs インターフェイスがあります。最初にブザーを動作させようとしたとき、次のようなことを試しました。
# cd /sys/class/gpio
# echo 102 > export
# cd gpio102
# echo out > direction
# echo 1 > value
残念なことに、マシンは音を立てませんでした。しかし、WinCE 用に書かれたブザー ドライバーのソース コードを確認すると、GPIO マルチプレクサが特定のモードに設定されていることに気付きました。私はソフトウェア以外のことにはあまり詳しくないので、これが何を意味するのかまだよくわかりません。しかし、マシンで Linux を起動するために使用する U-Boot のバージョンのソース コードが提供されたので、ボードのヘッダー ファイル ( u-boot/board/somecompany/someboard/someboard.h
) に次のコード行を追加して、GPIO バンク モードを設定するように編集することができました。
MUX_VAL(CP(CCDC_DATA3), (IDIS | PTD | DIS | M4));
ブートローダを再コンパイルし、コピーしてマシンを再起動し、上記のテストを再度実行したところ、うまくいきました。これでタスクは完了したと思いました。しかし、GPIO バンクが他のドライバーに使用されている可能性があるため、実行方法は安全ではない可能性があると通知されました。debugfs をマウントして確認すると/sys/kernel/debug/gpio
、GPIO バンクの他の GPIO ピンがドライバーに使用されているように見えます。
次に、別のアプローチを試しました。起動時にビープ音が最も重要なので、ブートローダーにビープ音を鳴らすコードを追加してみることにしました。
MUX_VAL(CP(CCDC_DATA3), (IDIS | PTD | DIS | M4));
if(!gpio_request(102, "buzzer")){
gpio_direction_output(102, 1);
udelay (500000);
gpio_direction_output(102, 0);
}
MUX_VAL(CP(CCDC_DATA3), (IEN | PTD | DIS | M0));
これは、ブートローダがシングルスレッドであるため、GPIO バンクを巡って争う必要がないため機能します。最後の行は、GPIO バンクのマルチプレクサ モードを、コード内で以前に設定された状態にリセットします。
これはブートローダ実行中にビープ音を鳴らすことに成功し、GPIO バンクが必要な状態に復元されるので、私の知る限り、どのドライバーにも干渉しません。ただし、ブートローダ シーケンス中のビープ音は必ずしも完全なブートが成功したことを示すわけではないため、期待するほど便利ではありません。代わりに、Linux 内からブザーにアクセスして、ブートの成功やその他のイベントを示すことができれば、はるかに便利です。ただし、Linux で GPIO バンク mux モードを設定する方法に関するドキュメントを見つけることができません。そのため、私の質問は次のとおりです。
カーネル空間から GPIO バンクの mux モードを設定する方法はありますか?