2011-05-09 11 views
2

私は自分のLinuxボックスからRS232シリアル経由でマイクロコントローラへのインターフェースを試みています。ドライバの中からドライバを使用しているLinux

私はドライバーを書いて、モジュールとしてカーネルに既に存在するtty(/ dev/ttyS0)デバイスを使用するプロトコルb/n pcとマイクロコントローラーを実装しました(例えば、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> 

答えて

0

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

カーネルでこれらの作業を行うことは可能ですが、間違いなく推奨されています。たとえば、pppドライバはシリアルドライバの上にネットワークドライバを実装します。私はその場合どのように動作するのかわかりませんが、私はuserspaceヘルパープログラムがデバイスを開き、そのパラメータを初期化し、そしていくつかのシステムコールを使ってファイル記述子をカーネルに渡すことを期待します。

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

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

+0

PPPドライバは、特定のttyS ...特定のマジックである、いわゆる "シリアルラインの規律"を使ってこれを行います。技術的には、カーネルコンテキストからfdsを開き、syscallを実行することが可能です。しかし、なぜあなたはそのようなことをしますか? – datenwolf

関連する問題