0

Android カーネル空間で加速度計にアクセスし、そのデータを使用するにはどうすればよいですか? 電話が(車内で)動いている間に電話の機能の一部を制御する必要があるプロジェクトに取り組んでおり、加速度計を使用して電話が加速したかどうかを判断したいと考えています。すべてカーネル空間で行う必要があります。Android開発者ページで、加速度計とSensorEventを使用してユーザーレベルのアプリケーションの変更を検出する方法を見つけました。しかし、カーネルレベルでそのようなことを行うにはどうすればよいでしょうか? システムコールをするべきですか?

少し調べて検索すると、ファイルは /goldfish/drivers/hwmon/ にあると思いますが、よくわかりません。

4

1 に答える 1

2

アンチレベルの加速度計入力は、/dev/input/eventデバイスから取得されます。ツールボックスの を使用してgetevent()、電話を傾けると入力イベントがリアルタイムで表示されることを確認できます (メモリが機能する場合は、/dev/input/event3が必要ですが、これは自分で簡単に確認できます)。

加速度計のドライバーはこのキャラクター デバイスをエクスポートし、Android ランタイムは ( libhardwareの助けを借りて) 後で使い慣れた SensorEvent に変換します。このためのカーネル API はありません。最も簡単な解決策は、/dev/event と直接やり取りすることです。これには、次の 2 つの方法があります。

  1. ユーザー モード デーモンは/dev/eventをリッスンし、カーネル スレッドとも通信します (たとえば、カーネル モジュールがエクスポートする別のキャラクター デバイスをブロックする、リバース システム コールなどを行う)。

  2. 推奨されませんが、動作します -カーネル モードから/dev/input/eventを開きます ( への直接呼び出しと へのsys_open呼び出しを使用sys_read)。これには、カーネル保護を「回避する」必要があります (最も顕著なのKERNEL_DSは設定されていることです)。

于 2013-04-25T20:59:50.193 に答える