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
三.自分で手動でプログラムを書く
一.キャラクタデバイス制御理論
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;
}