Linux文字デバイス制御技術

2252 ワード

キャラクタデバイス制御技術
一.キャラクタデバイス制御理論
  1.さぎょう
ほとんどの設備は「読み書き設備」の能力のほかに、「制御設備」の能力もあるべきだ.例えばボーレートを変える
  2. アプリケーションインタフェース
ユーザ空間でIoctlシステムを使用してデバイスを制御し、プロトタイプは以下の通りである.
    int ioctl (int fd,unsigned long cmd,...);
fd:制御されたデバイスファイル記述子
cmd:デバイスに送信される制御コマンド
    .... : 3番目のパラメータはオプションのパラメータで、存在するかどうかは依存と制御コマンドです.
  3.デバイス駆動方法
システムがioctlシステムで呼び出されると、ドライバは次の関数で応答します.
    1. カーネルは2.6.36以前のカーネルです
      long (*ioctl) (struct inode* node ,struct file* filp, unsigned int cmd,unsigned long arg)
    2. カーネルは2.6.36以降のカーネルです
      long (*unlocked_ioctl) (struct file *filp, unsigned int cmd, unsigned long arg)
パラメータcmd:関数ioctlを適用して渡されるコマンド
二.キャラクタデバイス制御実装
    1. コマンドは実質的に整数ですが、この整数をより読みやすくするために、通常、この整数をいくつかのセグメントに分けます.
タイプ(8ビット)、シーケンス番号、パラメータ転送方向、パラメータ長.
#Type(タイプ/幻):どのデバイスに属するかを示すコマンドです.
#Number(シーケンス番号)同一デバイスを区別するための異なるコマンド
#Direction:パラメータ転送方向、可能な値は_IOC_NONE(データ転送なし),IOC_READ, _IOC_WRITE(デバイスへの書き込みパラメータ)
#Size:パラメータ長
    2. Linuxシステムは、コマンドの定義を支援する次のマクロを提供します.
      #_IO(type,nr):パラメータなしのコマンド
      #_IOR(type,nr,datatype):デバイスからパラメータを読み出すコマンド
      #_IOW(type,nr,datatype):デバイスにパラメータを書き込むコマンド
例:#define MEM_MAGIC'm//幻数の定義
        #define MEM_SET_IOW(MEM_MAGIC, 0, int)
    3.unlocked_ioctl関数の実装は、通常、コマンドに従って実行されるswitch文である.
ただし、コマンド番号がいずれかの機器でサポートするコマンドに一致しない場合は、EINVALに戻る.プログラミングモデル:
      Switch cmd
CaseコマンドA://A対応の操作を行う
CaseコマンドB://B対応の操作を行う
      Default://return -EINVAL
三.自分で手動でプログラムを書く
      
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include "memdev.h"


int main()
{
    int fd = 0;
    fd = open("dev/memdev0",O_RDWR);
    
    ioctl(fd,MEM_SET,115200);
    
    ioctl(fd,MEM_RESTART);
    return 0;
}