私は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グループマルチプレクサモードの設定に関するドキュメントが見つかりませんでした。したがって、私の質問は次のようになります。
カーネル空間でGPIOグループの多重化モードを設定する方法はありますか?