六、【ioctl】應用程式和驅動程式中的ioctl
阿新 • • 發佈:2021-12-11
1、介面函式介紹
很多裝置除了讀和寫之外,還需要驅動提供其它操作能力,例如:獲取LCD尺寸、修改串列埠波特率
(應用層)函式原型:
#include <sys/ioctl.h>
int ioctl(int fd, unsigned long request, ...);
(driver)提供介面函式
struct file_operations { ..... long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long); long (*compat_ioctl) (struct file *, unsigned int, unsigned long); ...... }
2.6.36之後的核心版本只支援unlocked_ioctl,之前的一些過渡版本兩者都支援,更早的版本只支援compat_ioctl
long (*unlocked_ioctl) (struct file * filp, unsigned int cmd , unsigned long arg);
引數:
- filp:指向開啟的檔案資訊結構體。
- cmd:驅動提供給應用程式的命令字。
- arg:應用程式與驅動之間傳遞的引數。
2、命令字的組成
(1)bit解釋
- bit[31:30]:引數傳遞的方向。應用--->驅動、驅動--->應用、應用<--->驅動、不需要引數.
- bit[29:16]:引數的大小,用資料型別表示大小char int struct xxx。
- bit[15:8]:魔數/幻數,用於區分不同驅動的命令字,一般設定為某個字元的ASCII碼。
- bit[7:0]:命令字的序號。
(2)核心中提供的生成命令字的巨集
#define _IO(type,nr) _IOC(_IOC_NONE,(type),(nr),0) #define _IOR(type,nr,size) _IOC(_IOC_READ,(type),(nr),(_IOC_TYPECHECK(size))) #define _IOW(type,nr,size) _IOC(_IOC_WRITE,(type),(nr),(_IOC_TYPECHECK(size))) #define _IOWR(type,nr,size) _IOC(_IOC_READ|_IOC_WRITE,(type),(nr),(_IOC_TYPECHECK(size)))
_IO---生成沒有引數傳遞的命令字。 _IOR--生成應用從驅動獲取引數的命令字。 _IOW--生成應用給驅動傳遞引數的命令字。 _IOWR--生成雙向傳參的命令字。
引數:
- type:魔數/幻數,用於區分不同驅動的命令字,一般設定為某個字元的ASCII碼
- nr:命令字的序號
- size:引數的大小,用資料型別表示大小char int struct xxx
例如:
#define BEEP_ON _IO('B',0) #define BEEP_OFF _IO('B',1) #define LED_ON _IOW('L',0,unsigned int) #define LED_OFF _IOW('L',1,unsigned int)