組み込み Linux デバイスへのレベル トリガー割り込みを使用する既存のシステムを移植しています。私は少し問題を抱えています。誰かが助けてくれることを願っています。私の計画は、poll() 関数 (ユーザー空間では、低レベルのドライバーの計画はありません) を使用して、gpio ラインが高くなったことを検出することでした。それは何かをするための兆候です。
残念ながら、その条件を有効にする方法がわかりません。現在、私は次のことを行っています。
- gpio 番号を /sys/class/gpio/export に書き込みます
- 方向を「中」に設定します
- エッジを ? に設定します。
条件をクリアせずに poll() が複数回呼び出された場合でも、gpio ラインが高い場合は常にポーリングが返されるように GPIO を設定できますが、ラインが低い場合は待機しますか? poll() を使用する代わりに、何か他のものを使用する必要がありますか? ありがとう!
アップデート
私は解決策があると思ったが、明らかにそうではなかった。GPIO ラインのエッジを「立ち上がり」に設定しました。ハードウェア側では、この行はデータ バッファーの "FIFO 使用" カウントに関連付けられています。FIFO にデータがある場合、ラインはハイです。そうでなければ低いです。次に、次のシステムをセットアップします。
GetByte() {
Is there data in the FIFO? {
Read a byte.
Return
}
Call poll() to wait for the data {
Is there data in the FIFO? {
Read a byte.
Return
}
}
}
最初の「If」ステートメントが存在するのは、一度に 1 バイトしか読み取らず、poll() は、条件が変わらない場合はタイムアウトになる前に戻らないためです (また、複数のバイトが入っている場合はシステムに戻りません)。 FIFO)。私が今見ている問題は、poll() が返されることがありますが、FIFO にデータがないことです。実際、poll() は「1」を返しますが、FIFO は空であると報告します。
GPIO ラインの「立ち上がり」エッジ設定により、gpioXX/value ファイルが 0 から 1 に変更された場合にのみ、poll() が変更を検出することを期待しています。あれは正しいですか?これは poll() を使用する合理的な方法ですか、それとも別の設計を検討する必要がありますか?