Linux-字符設備控制技術
設備控制-應用函數
在用戶空間,使用ioctl系統調用來控制設備:
int ioctl(int fd, unsigned long cmd, ....)
fd:要控制的設備文件描述符
cmd:發送給設備的控制命令,其實只是用來起到標識作用
...:可選參數,存在與否依賴於控制命令,可以簡單地課程就是一個參數
內核file_operations中對應函數
long (*ioctl)(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg);
long (*unlocked_ioctl)(struct file *filp, unsigned int cmd, unsigned long arg);
定義命令:
命令其實就是用幾個字段來對設備的控制命令進行更細緻的劃分,由驅動設計者自己設定。
命令由類型(1Byte)、序號、參數傳送方向、參數長度這四個段組成。其中
類型/幻數:表明這是哪個設備的命令
序號:用來區分同一設備的不同命令
參數傳送方向:參數傳送的方向,可能的值是_IOC_NONE(沒有數據傳輸),_IOC_READ,_IOC_WRITE(向設備寫入參數)
參數長度:size
利用linux提供的宏來幫助定義命令【注意不要和linux中的命令衝突】
_IO(type, nr): 不帶參數的命令
_IOR(type, nr, datatype):從設備中讀參數的命令
_IOW(type, nr, datatype): 向設備寫入參數的命令
操作實現
unlocked_ioctl和ioctl函數中通常是使用一個switch來對命令進行識別,從而實現對設備的控制。當命令號不能匹配任何一個設備所支持的命令時,返回-EINVAL
switch cmd{
case A:
break;
case B:
break;
default:
break;
}