2012-09-22 4 views
8

私はgpio割り込みを扱っています。 "/ sys/class/gpio/gpio38/value"にファイルがあります。属性の値がに変わるたびに通知が必要です。だから、どのように私はユーザー空間でこれを達成することができます。すでに情報を収集しているので、select()、poll()またはepoll()を使うことができます。だから、このアプリケーションには正しいですか?または、私が/ proc/irqなどを使用できるかどうかを私に示唆してください。おかげで:)私は助けになるかもしれ何かhereを発見したselect()、poll()またはepoll()? sysfs属性のため

答えて

2

GPIO信号は、/ SYS /クラス/ GPIO/gpio42 /(GPIOの#42) のようなパスを持っていると、次の読み取りを持っています/書き込み属性:

"value" ... 0(低)または1(高)のいずれかと読みます。 GPIO が出力として設定されている場合は、この値を書き込むことができます。 0以外の値はすべてhighとして扱われます。そのファイルと 投票に

ピンは 割り込み割り込み生成として構成することができ、それが(「エッジ」の 説明を参照)、割り込みを生成するように構成されている場合、あなたはポーリングすることができた場合(2)(2 )は、割り込みが発生するたびに戻ります。 poll(2)を使用する場合は、イベントPOLLPRIおよびPOLLERRを設定します。 select(2)を使用する場合は、exceptfdsにファイル記述子を設定します。 poll(2)の後に、sysfs ファイルの先頭にlseek(2)を戻し、新しい値を読み取るか、ファイルを閉じて、再び を開いて値を読み取ります。

"gpio42"用ですが、これはあなたのケースに当てはまると思います。それができない場合は、私の答えにコメントをしてください。

+0

おかげで、それは私がエッジファイルまたは値のファイルをポーリングしなければならないことを意味 –

1

いずれも使用できます。ここでのポイントは、GPIOラインの値に対してsysfsファイルを開いて(例:/sys/class/gpio/gpio42/value)、それをブロックすることです。

行状態の変更は書き込みではなく例外条件として通知されます(直感的かもしれません)

選択の場合

:トニー・ライオン@

fd_set exceptfds; 
int res;  

FD_ZERO(&exceptfds); 
FD_SET(gpioFileDesc, &exceptfds); 

res = select(gpioFileDesc+1, 
      NULL,    // readfds - not needed 
      NULL,    // writefds - not needed 
      &exceptfds, 
      NULL);    // timeout (never) 

if (res > 0 && FD_ISSET(gpioFileDesc, &exceptfds)) 
{ 
    // GPIO line changed 
} 
+1

注必ずしもすべてのGPIOが割り込み可能であることをGPIO場合は?。あなたは割り込みをサポートしていない(とこれはあなたが使用している正確なCPU/SoCに依存します)で作業している場合、それを定期的に読む必要がありますy。 – duskwuff

+0

GPIOラインがI2Cペリフェラルまたはオーディオコーデックで実装されている場合、これが真実であることは間違いありません。しかし、その場合、 'select()' 'pselect()'、 'poll()'や 'epoll()'を呼び出すことは決してありません。 ['poll()'とその兄弟は、実際には全く投票しません] – marko

+0

こんにちは@Marko返事をありがとうございました。上記のあなたの選択のためのサンプルコードを教えてください。実際に私がやっていることは、echo 1> file_nameを実行すると、通知が表示されるはずです。非常に役に立ちます。 –

関連する問題