13

こんにちは、Linux カーネル ドライバーの達人です。

構成にシリアル インターフェイスを使用するカメラ用の v4l2 ドライバーを作成しています。カメラ モデル間でクライアント コードの一貫性を維持するため、ドライバーでカメラを構成する必要があります。問題は、ドライバ モジュールからカメラのシリアル インターフェイスにアクセスする最良の方法は何ですか?

私が聞いたところによると、カーネル ドライバーからファイルにアクセスすることは大したことではありませんが、それは可能です。そのため、現在次のコード スニペットを使用していますが、ハックのように感じます。

oldfs = get_fs();
set_fs(KERNEL_DS);

fd->f_pos=0;
fd->f_op->write(fd, data, data_len, &fd->f_pos);

set_fs(oldfs);

私の質問は本当にです:これを行う正しい方法は何ですか?

4

2 に答える 2

5

シリアルポートが関係しているので、これはある種の組み込みシステムに違いないと思います。結局のところ、シリアルポートさえ持っているPCは多くありません。また、少なくともユーザーの観点からは、シリアルポートは永続的な接続と見なすことができると思います。それがすべて当てはまる場合は、TTYデバイスは本当に必要ありません。プライベートUARTとしてデバイスにアクセスしたい。

Wolfsonオーディオコーデック(sound / soc / wm * .c)を見ると、主にI2Sを介して通信するが、構成用の補助I2Cインターフェイスを備えたデバイスの例が表示されます。これは概念的にあなたが望むものだと私は信じています。ドライバーは、ソフトウェアへの統一されたインターフェイスを提供し、適切なハードウェアにコマンドを発行します。明らかに、これはハードウェア実装の詳細をユーザースペースに公開するよりもはるかにクリーンです。

このように動作するカーネル内のUARTドライバーの良い例を見つけることができませんでしたが、うまくいけば、何を探すべきかを説明しました。技術的な純度の観点よりも実用的な観点からは、カーネルからファイルI/Oを実行する方がよい場合があります。

于 2011-04-06T19:11:35.570 に答える
2

最初に、可能であればユーザー空間からこれを行う方法を見つけることをお勧めします。ここで達成しようとしているのは、実際にはカーネル コード内のユーザー空間コードです。

しかし、それを行う方法が見つからない場合は、この記事でカーネル空間でユーザー空間呼び出しを行う方法を示します。

シリアル ポートにアクセスしたいので、たとえば open のように tty 向けの呼び出しを行う必要があります。

serial_fd = sys_open("/dev/ttyS0",  O_RDWR | O_NOCTTY | O_NONBLOCK))
于 2011-03-22T08:48:24.340 に答える