これは、stackoverflow への私の最初の投稿であり、この質問が適切であることを願っています。
入力と出力用のいくつかのピンで構成された仮想 GPIO チップ用の Linux デバイス ドライバーを作成しています。一部は物理ピンのエイリアスであり、他は仮想ピンです。仮想ピンについては、バックドアを介して仮想化の残りの半分をチップ デバイスとエクスポートされたピンに提供するユーザー空間アプリケーションがあります。たとえば、チップは GPIO 224 を割り込み可能な入力として構成し、次のようなユーザー空間からの呼び出しをブロックすることを目的としています。cat /sys/class/gpio/gpiochip224/Virtual Input/value
. これを行うために、私のアプローチは、「仮想」という名前の「仮想入力」に特別なファイル属性を追加することです(たとえば)。「cat」を呼び出すと、「gpio_chip.get」コールバックが呼び出され、キューで待機します。私のユーザー空間アプリケーションは、後で値がいつ変更されるかを決定し、更新された値を「.../Virtual Input/virtual」に書き込みます。これにより、内部で値が更新され、待機のブロックが解除されます。
私が抱えている問題は、エクスポートされたピンにデバイス属性を追加することです。コマンド ラインから を使用してピンをエクスポートするecho "224" > /sys/class/gpio/export
と、「gpio_chip.request」コールバックが呼び出されます。これは、属性を同期的に追加する可能性がある唯一の場所です。しかし、GPIO クラス ドライバーを見ると、"request" コールバックが呼び出され、続いて "gpio_export" が呼び出されて "device_add" が呼び出され、デバイス (ピン) がシステムに追加されます。つまり、デバイスはリクエスト ハンドラのコンテキストにまだ存在せず、属性を追加できません。
エクスポートされたピンデバイス (およびチップ) に関連付けられたバスがないように見え、gpio_export
呼び出しを介して通知を受け取るために独自のバスを作成しようとしdevice_add
ていましたが、うまくいきませんでした。
私を正しい方向に向けるアイデアは大歓迎です。