現在、センサからデータを読み込んでいるカーネルドライバがあります。 私は、カーネルのsensor_read()
APIを呼び出し、データをクラウドに送るユーザスペースアプリケーションを作成する必要があります。カーネルドライバからユーザスペースドライバにデータをコピーする最良の方法
カーネルのsensor_read()
呼び出しをユーザー空間に公開し、このデータをユーザー空間から読み取るにはどうすればよいですか?データは約10バイトです。
現在、センサからデータを読み込んでいるカーネルドライバがあります。 私は、カーネルのsensor_read()
APIを呼び出し、データをクラウドに送るユーザスペースアプリケーションを作成する必要があります。カーネルドライバからユーザスペースドライバにデータをコピーする最良の方法
カーネルのsensor_read()
呼び出しをユーザー空間に公開し、このデータをユーザー空間から読み取るにはどうすればよいですか?データは約10バイトです。
ユーザー空間からIOCTL(ioctl/read)呼び出しを使用してカーネル関数にアクセスすることができます。
は、サンプルのリンクの下に参照してください。 http://www.tldp.org/LDP/lkmpg/2.4/html/x856.html
どのようにしてユーザ空間にカーネルの
sensor_read()
コールを公開し、ユーザ空間からこのデータを読み取ることができますか?
ほとんどの場合、センサドライバを書き込むために設計されているので、IIOカーネルフレームワークを使用する必要があります。 IIOはドライバに必要なファイルを公開します(/sys/bus/iio/
および/dev/iio*
)。これらのファイルはread()
、割り込みを処理するにはpoll()
です。
公式ドキュメントはhereです。また、いくつかの既存のドライバを参照として使用することもできます:drivers/iio/。
IIOフレームワークが導入される前は、ドライバに手動でsysfsファイルを提供するのが一般的でした。古いカーネルを使用している場合は、ドライバを書き込む方法です。バス(I2Cなど)とsysfsファイルを手動で処理します。しかし、最良の方法は、新しいカーネルとIIOを使用することです。
私はGyro + accelセンサーで作業しています。 Linuxドライバは、両方のタイプのEV_MSCイベントを送信します
チップに複数のセンサーがあることは珍しくありません。その場合、加速度計用とジャイロ用の2種類のドライバーを作成する必要があります。この方法で、2つの異なるファイル、センサーごとに1つのファイルが作成されます。例えば
、それはLSM330DLCチップ(加速度計+ジャイロ)のために行うのかを見て:
両ドライバーからiio_device_register()
関数を呼び出しています対応するファイルを作成するドライバーのプローブ機能(読み取り/ポーリングが可能)。詳細はdocumentationを参照してください。
私の理解によれば、ユーザー空間から入力デバイスを開いて、ポーリングするFDのリストに追加します。だから、新しいイベントがあるときに、このイベントがジャイロかアゼルかどうかをどのように判断できるのか?
あなたがユーザ空間で2つの/dev/input/event*
ファイルを処理する方法について興味があれば、あなたは基本的に2つの選択肢があります:あなたは別のスレッド でそれらをポーリング/読むことができます:I/Oブロック使用
O_NONBLOCK
として開き、同じ1つのスレッド内でそれらをread()
として開くことができます。新しいデータがまだ利用できない場合は-1を返し、errno
はEAGAIN
に設定されます。あなたは、これらの操作を行うことができ、たとえばThis答えがC.で入力ファイルを処理する方法の例が含まれており、hereあなたがI/Oを非ブロック/ブロックについて読むことができ、無限ループに読み込みます。
ありがとうSam ... poll()は良いアプローチだと思われます。しかし、私は1つの疑いがあります。基本的に私はGyro + accelセンサーに取り組んでいます。 Linuxドライバは両方のEV_MSCタイプのイベントを送信します。 私の理解によれば、ユーザー空間から入力デバイスを開いて、ポーリングするFDのリストに追加します。だから、新しいイベントがあるときに、このイベントがジャイロかアゼルかどうかをどのように判断できるのか? –
@SandeepSharma私は自分の答えを編集し、あなたの質問に答えました。 –
このようなすばらしい説明に感謝します...私はそれをチェックします...更新されます。 –
あなたが使用するセンサの関連ドライバの
/sys/class/
インターフェイスからデータを読み取ることができます。関連するパラメータがsysfs
にエクスポートされていることを確認する必要があります。 例:温度センサーには、sysfsのエントリにエクスポートされた温度値(同等のファクタ)が含まれている必要があります。
例(以下の実施例のみフィクションです)一部のドライバで
cat /sys/class/hwmon/tempsensor/value
cat /sys/class/hwmon/tempsensor/min_value
cat /sys/class/hwmon/tempsensor/max_value
、あなたは/書き込みセンサデータを読み取るためにioctl/read/write
のAPIを介してそれらを読むことができます。
そこにはさまざまな方法があります。しかし、あなたは、あなたが読んでいるセンサーが何であるかを言っていませんでした。 'lm-sensor'の使い方は?次に、完全に別の話であるクラウドにデータを送信する必要があります。 KeyWord:common-gateway-interface(cgi) – suleiman
ありがとうsuleiman ..私はAccl-Gyroセンサーに取り組んでいます。 lm-sensorをチェックします。クラウドの部分はすでに完了しており、公開されたクラウドAPIを実装する必要があります。 –