2012-03-06 4 views
3

私はlinuxにドライバを書いています。ユーザープログラムとドライバ間の通信にioctlを使用する方法は?次のような構造がある私のドライバで は、:私の理解でユーザプログラムとドライバ間の通信にどのようにioctlを使用できますか?

struct file_operations fops = {.read = device_read,.write = device_write,.unlocked_ioctl = device_ioctl,.open = device_open,.release=device_release }; 

、ここdevice_ioctlは、ユーザプログラムからのioctl呼び出しを処理する関数です。また、可変数のパラメータで呼び出しが可能です。

しかし、私はioctlを使用する方法についてはわかりません。また、私はdevice_ioctlをどのように書くことができるのか、全然混乱しています。

誰でも手伝ってもらえますか?

ありがとうございます。

+2

まずあなたは、同様のドライバがそれを実装する方法を確認し、ioctl'はユーザ空間からどのように使われるか '学ばなければならない、そしてフィギュアあなたのドライバーに必要なものを出しなさい。 –

+0

あなたはいくつかの参考資料を提案できますか? – tijin

答えて

1
  1. register_chrdevを使用して、カーネルファイルのメジャー番号を取得します。パラメータとしてfopsを与えます。
  2. メジャー番号が返されます(/proc/devicesにもあります)mknodコマンドでこの番号を使用して/dev/yourdeviceを作成します。
  3. ユーザー空間コードで/dev/yourdeviceを開き、ファイル記述子にioctl関数を使用します。
2

私はLDD3チャプター6.1が良い例であなたの質問に答えると信じています。

0

あなたは、このような方法で、代わりにデバイスのいずれかprocファイルを使用することができます。

static long my_proc_ioctl(struct file * file, unsigned int cmd, unsigned long arg) 
{ 
    printk("%s() cmd=%.08x arg=%pK\n", __func__, cmd, (void *)arg); 
    return 0; 
} 

static const struct file_operations my_ioctl_fops = { 
    .owner = THIS_MODULE, 
    .unlocked_ioctl = my_proc_ioctl, 
}; 

[...] 
proc_create("my_ioctl_file", 0600, NULL, &my_ioctl_fops); 
[...] 
関連する問題