2 Linuxのドライバ開発

ドライバデバイス番号
1ドライバは、駆動符号判別装置が属するのメジャー番号であるメジャー番号、ポイントのマイナー番号を有し、マイナー番号は、ドライバ複数のデバイスを区別するために使用されます。
内部デバイス番号を示す2
   のtypedef unsigned long型のdev_t、マスタデバイス12の数が低位置20と係合するように前記マイナーデバイス番号です。
   MAJOR(たdev_t DEV)MINORを(:たdev_tマクロを使用して、プライマリデバイス番号またはマイナーデバイス番号を取得するために、変数の型を既知 のdev_t DEV)
   既知のメジャーおよびマイナー番号のdev_t型変数、マクロを使用生成する:のmkdev(INTメジャー;、int型のマイナー)
3つのメジャーとマイナー番号割り当て方法
   :一般要求タイミングデバイス番号は、ドライバの初期化関数に割り当てる必要がありますが、カーネルAPIがある
   int型register_chrdev_region(のdev_tまず、COUNT unsigned int型、文字*名)
   静的リクエストデバイス番号、負の数を返すために失敗し、メジャーとマイナーデバイス番号を申請するのdev_t、あなたは合計カウントに適用するデバイスの数、名前はドライバの名前である
   int型alloc_chrdev_region(dev_tの* DEV、符号なしの int型のfirstminor、unsigned int型の数、文字*名
   動的出願番号機器、負の数を返すことに失敗し、デバイス番号は、最初のマイナー番号にDEV得、firstminor優先権を主張を保存し、カウントがデバイス名ドライブ名のアプリケーションの数であり、
   例。
   int型scull_major = 0;
   int型scull_minor = 0;
   IF(scull_major)
   {
      DEV =のmkdev(scull_major、scull_minor)。
      結果= register_chrdev_region(DEV、scull_nr_devs、 "スカル")。
   }
   他
   {
      結果= alloc_chrdev_region(&DEV、scull_minor、scull_nr_devs、 "スカル")。
    }
   (結果<0)であれば
   {
      のprintk( "主要な得ることができません")。
      結果を返します。
   }
4释放设备号
unregister_chrdev_region(DEVNO、scull_nr_devs)。
5デバイスファイルを作成
#mknodは/ dev / scull0 C 252 0
Cキャラクタデバイスファイルを
6カーネルにデバイスドライバを登録します
cdev_init(&DEV-> CDEV、&scull_fops);
DEV-> cdev.owner = THIS_MODULE;
DEV-> cdev.ops =&scull_fops;
ERR = cdev_add(&DEV-> CDEV、DEVNO ,. 1)、
IF(ERR)
   のprintk(「ADDフェイル「)スカル;
各CDEVのcdev_init前記コードフィールドの次の2行が初期化され、デバイスがオペレーティングシステムキャラクタデバイスリストに追加されcdev_add。
7キャンセルキャラクタデバイス
cdev_del(&scull_devices [I] .cdev);
cdev_del文字は文字デバイスのデバイスリストから削除されます。
8駆動機能の重要な機能を達成する
{file_operations scull_fops =構造体を
 .owner = THIS_MODULE、
 .llseek = scull_llseek、
// .llseek = no_llseek、
 .read = scull_read取引の、
 .WRITE = scull_write、
 .compat_ioctl = scull_ioctl、
 scull_openため.Open =
 = scull_release .release、
};
scull_openにint(*財投ファイルの構造体、* iノードをiノードの構造体)
システムが開いているときに、ユーザプログラムのドライバにオープンコールを呼び出し
int型scull_release(iノード*、構造体ファイル*財投inodeを構造体)
ユーザ近いを呼び出すときテーブルが近いファイルがリリースされていないとき場合は、ファイルテーブルが呼び出されたときに機能がリリースされる一般的な呼び出しは、それが解放関数呼び出しません
ssize_tののscull_read(構造体ファイル*財投、__userはchar * bufは、size_tのCOUNT、
                loff_tを* f_pos)
ユーザ・コールが読まれたとき、システムが読み取り機能にドライバを呼び出し、財投は、ファイルポインタテーブル、BUFは、着信コールのためにカウントするときに、ユーザー、f_posファイルテーブルf_posフィールド
ssize_tののscull_write(*財投、構造体ファイルのconst char型* BUFの__user、size_tのCOUNT、
                loff_t * f_pos)
loff_t scull_llseek(構造体ファイル*そこからint型)のための財投、loff_t OFF、
INT scull_ioctl(構造体のinode * iノード、構造体ファイル*財投、
                 unsigned int型cmdを、符号なしロングのArg)
30元記事公開 ウォン称賛21 ビューに14万+を

おすすめ

転載: blog.csdn.net/oushaojun2/article/details/62898102