天天看點

ioctl裝置操作

目的:為了處理非資料的操作。

1、使用者函數原型:int ioctl(int d,int request,.....);

d是操作檔案描述符;request代表不同操作的數字值;.....是C語言的實參個數可變的函數原型聲明形式,可是這裡表示可有可無的參數。

第三個形參為unsigned long 類型,除了可以傳遞數值,還可以傳遞指針這樣使用者空間與核心空間就可以互動任意多個位元組。

2、核心函數原型:long (*unlocked_ioctl)(struct file*,unsigned int ,unsigned long);

第一個參數表示打開的檔案的file結構指針,第二個參數和系統調用的第二個參數request對用,第三個參數對應系統調用的第三個參數。

3、指令編碼規則

31-30:含義

             00 —— 指令不帶參數

             10——指令需要從驅動中擷取資料,讀方向

              01——指令需要把資料寫入驅動,寫方向

              11——指令既要寫入資料又要擷取資料,讀寫方向

29-16     如果指令帶參數,則指定參數所占用的記憶體空間大小

15-8       每個驅動全局唯一的幻數(魔數)

7-0         指令碼

4、定義指令編碼的宏:

_IOC(dir,type,nr,size)

dir:    位31-30

type: 位15-8,差別指令碼

nr:    位7-0指令碼

size: 位29-16參數位元組大小

5、提取指令編碼資訊宏

_IOC_DIR(指令編碼)

_IOC_TYPE(指令編碼)

_IOC_NR(指令編碼)

_IOC_SIZE(指令編碼)

6、驅動中實作ioctl函數

思想:在ioctl函數中加入switch(cmd){}選擇分支,根據cmd的不同區分不同的指令。

繼續閱讀