6

組み込み Linux システム用のカスタム ジョイスティック/ゲームパッド デバイスを構築しようとしています。ユーザー空間コードから /dev/input にノードを作成できるライブラリまたはシステム API を探しています。

私はこれが欲しい理由:

  • カスタム ハードウェアは、既存の SPI または I2C ドライバーを使用してシステムと通信できます (これは私のハードウェア設計なので、最も技術的に意味のあることは何でもできます)。

  • カーネルモジュールは他のドライバーを利用できず、他のモジュールからエクスポートされたシンボルのみ

カーネル モジュールを作成する唯一の方法は、カーネル コードを使用し、それをカーネル モジュールとしてコンパイルすることだと理解しています。ユーザー空間コードでカーネル モジュールを実現しようとしているわけではありません。

ファイルを作成できる API を探しています。そのファイルが読み書きされると、関数が呼び出されます。それがキャラクタードライバーの一般的なコンセプトです。カーネルが提供または課す特権や制限は必要ありません。

まったく新しいカーネル モジュールを作成する必要のない、ファイル I/O をエミュレートする何らかの方法が必要です。

ありがとう!

4

6 に答える 6

5

古い質問ですが、これを見ている人が間違った考えにならないように、ちょっとした情報を追加すると思いました。過去 3 ~ 4 年間、質問者が求めていることを正確に実行するためのサンドボックス ソリューションを提供する FUSE ファイルシステム エッジを拡張するために追加された、この小さなフレームワークがありました。

これは CUSE と呼ばれ、カーネルで FUSE と CUSE がオンになっているシステムで、FUSE グループのメンバーがキャラクター ドライバーをインスタンス化できるようにします。必要なのは適切なアプリケーションだけです (ディストリビューション上の OSS 適応デーモンは、そのようなアプリケーションの 1 つにすぎません。FWIW...)

当時の「できない」などの回答はまったく役に立ちませんでした。実際に問題を考慮していませんでし

CUSE は FUSE ほど普及していないため、気の利いた使いやすいバインディングの形で何かを行うのに役立つものはあまりありませんが、まだ存在しています。このスレッドにたどり着いたのは、その件に関して「より良い」答えがあれば、それを探していたからです。「はい、Python を実行できる場合は...」 (pycuse) と答えてください。そこで Python を実行できない場合は、自分でできます。ええと...私はそのようなことを受け入れる人ではありませんでした...だから私はpycuseから学び、C++/Go/etcを作るつもりです. それらにたどり着き、必要なときに使用している言語用の新しいものが必要になったときにバインドします。

残りは...へぇ...次回はもっとアヒルを一列に並べてください。あなたは確かにこれをしませんでした。

于 2016-04-22T17:52:00.687 に答える
5

ユーザー空間入力サブシステムを使用して、必要なことを行うことができます。以下を参照してください。

http://thiemonge.org/getting-started-with-uinput

使用例:

https://xboxdrv.gitlab.io/

于 2013-01-07T03:44:17.343 に答える
1

viewos仮想マシンを正確に説明しています

http://wiki.virtualsquare.org/wiki/index.php/Main_Page

http://wiki.virtualsquare.org/wiki/index.php/UMview#Modules

この VM は、カーネルに向けられたすべての syscall をユーザー空間モジュールに乗っ取ることができます (Linux のモノリシック性を少し低下させると考えられています)。

$umview xtermコマンドでumviewインスタンスを起動します

そのため、新しく生成された xterm 内で実行されるすべてのプログラムがトレースされます

これで、(umview インスタンス内で) 単純に

$um_add_service umdev
$mount -t umdevJoystick none <your file, for example /dev/virtualJoystick>

/dev/virtualJoystickそのため、ファイルへのすべての読み取り/書き込み/...を傍受できるモジュールを作成し、必要なことを行うことができます

(モジュールの構文は非常に単純です)

static int joystick_read(char type, dev_t device, struct dev_info *di){
    /*my operation...probably a XTestEvent() or something like that*/
}
static int joystick_write(char type, dev_t device, struct dev_info *di){
    /*my operation...probably a XTestEvent() or something like that*/
}
/*...*/
struct umdev_operations umdev_ops={
    /*hijacking table*/
    .read=joystick_read,
    .write=joystick_write,
};

( umdev_testmodulesumview ソースのディレクトリは、ちょっとしたチュートリアルとして非常に役立ちます! ;))

于 2013-03-01T12:31:02.857 に答える
1

独自の char デバイスを作成してから、ドライバーと通信するユーザー空間アプリケーションを作成します (この場合、netlink を使用することをお勧めします。他のドライバーがシンボルをエクスポートしない場合にバックドアとして使用される可能性があるためです。この場合、netlink ヘルプのあるユーザー空間はゲートウェイとして機能します)。

カスタム char デバイスでは、作成するデバイスのパスをユーザーに教えてもらうことができます。つまり、char デバイスは固定名で最初の char デバイスを作成し、ユーザー アプリは netlink (または ioctl) を使用して、この char デバイスにカスタム名で別の char デバイスを作成するように指示できます。

お役に立てれば

于 2012-12-28T02:30:14.210 に答える
-3

できません。

「キャラクターデバイス」とは、カーネル内のキャラクター指向のインターフェースを指します。

LIUB が提案することを実行して、カーネルのような API をユーザー空間にマーシャリングするヒューズのようなインターフェイスを作成することができます/dev/input

それでも、HID デバイスが実際には必要なく、ハードウェア専用であり、ユーザー空間から低レベルのハードウェアと実際に通信できるため「カーネル アクセスは必要ない」場合は、他のオプションを検討できます。

于 2012-12-29T09:51:16.280 に答える