2

Linux ボックスから RS232 シリアル経由でマイクロコントローラに接続しようとしています。

ドライバーを作成し、プロトコル b/n pc とマイクロコントローラーを実装しました。これは、カーネルに既に存在する tty(/dev/ttyS0) デバイスをモジュールとして使用します (たとえば、open、close などの呼び出しを介して)。ただし、コンパイルしようとすると、開く、書き込み、読み取りなどへの参照が見つからないと表示されます...

ドライバー内から既存のデバイス ドライバーを使用するにはどうすればよいですか? 他に含める必要があるものはありますか?

そうでない場合、ドライバ内から簡単にシリアル ポートを使用するにはどうすればよいですか?

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/uaccess.h>
#include <linux/init.h>
#include <linux/slab.h>
#include <linux/cdev.h>
#include <linux/spinlock.h>
#include <linux/termios.h>
#include <linux/fcntl.h>
#include <linux/unistd.h>
4

1 に答える 1

0

通常、ユーザー空間でそのようなことを行う必要があります-通常のユーザー空間プログラムでデバイスのプロトコルを実装します。

カーネルでこれらのことを行うことは可能ですが、絶対にお勧めできません。たとえば、ppp ドライバーは、シリアル ドライバーの上にネットワーク ドライバーを実装します。その場合にどのように機能するかはわかりませんが、ユーザー空間ヘルパープログラムがデバイスを開き、そのパラメーターなどを初期化し、システムコールを使用してファイル記述子をカーネルに渡すと思います。

カーネルから任意のライブラリ関数を呼び出すことはできません。実際、ライブラリ関数をまったく呼び出すことはできません (カーネルの一部として実際に出荷されたライブラリを除く)。これには、カーネル システム コールが含まれます。呼び出すことができる同等の関数があります。たとえば、filp​​_open です。

ほとんどの場合、ポインターがユーザー空間データを指すことを期待しているため、カーネルから通常のシステムコールを呼び出すことはできませんが、カーネルでは、(kalloc などを介して割り当てられた) 通常、カーネル空間データを指します。両者を自由に混在させることはできません。

于 2011-05-09T06:37:06.843 に答える