使用者層:
原型:int ioctl(int fd, unsigned long cmd, ...)
說明:其中原點表示可選引數,存在與否依賴於控制命令(第二個引數)是否涉及到與裝置的資料互動;
驅動層:
原型:int
說明:cmd引數是從使用者層傳下來,可選引數arg以乙個unsigned long 的形式傳遞(為乙個整數或為一
個指標),如果cmd命令不涉及資料傳輸,則arg無任何意義;
用法步驟:
1、定義命令
ioctl命令編碼劃分為幾個階段,在include/asm/ioctl.h中定義:型別(幻數)、序號、傳遞方向、引數
的大小。在documention/ioctl-number.txt中羅列了在核心中已經使用的幻數。
其中:type:幻數(型別):表明哪個裝置的命令,8位寬;
number:序號:表面裝置命令中的第幾個,8位寬;
direction:資料傳遞的方向:常見的巨集定義有:_ioc_none(沒有資料傳送),_ioc_read(從裝置
讀),_ioc_write(從裝置寫),資料傳送是從應用層的觀點來看待;
size:使用者資料的大小。(13/14位寬,視處理器而定)
_io(type, nr) //沒有引數的命令
_ior(type, nr, datatype) //從驅動中讀資料
_iow(type, nr, datatype) //寫資料到驅動
_iowr(type, nr, datatype) //雙向傳輸,type和number成員作為引數被傳遞
定義命令範例:
#define mem_ioc_magic 'm'
#define mem_iocset _iow(mem_ioc_magic, 0, int)
#define mem_iocgqset _iow(mem_ioc_magic, 1, int)
2、實現ioctl
包括三個環節:1、返回值 2,引數使用 3命令操作
注:當命令號不能匹配任何乙個裝置所支援的命令時,通常返回-einval (非法引數)
引數檢查:
如果是乙個整數,可以直接使用,如果是指標,首先得確保使用者位址的有效性;
不需要檢測的有:
copy_form_user, copy_to_user, get_user, put_user;
需要檢測的有:__get_user, __put_user;
引數檢查方法(函式):
原型:int access_ok(int type, const void *addr, unsigned long size)
其中:第乙個引數是verify_read 還是 verify_write, 用來表明是讀使用者記憶體還是寫使用者記憶體。addr
引數是要操作的使用者記憶體位址,size是操作的長度。如果ioctl需要從使用者空間讀乙個整數,則size參
等於sizeof(int)。
access_ok返回乙個布林值,1 是成功(訪問都沒問題), 0 是失敗(訪問有問題), 如果該函式返回失
敗,則返回-efault;
引數檢查範例:
if(_ioc_dir(cmd) & _ioc_read)
err = !access_ok(verify_write, (void __user*)arg, _ioc_size(cmd));
else if(_ioc_dir(cmd) & _ioc_write)
err = !access_ok(verify_wread, (void __user*)arg, _ioc_size(cmd));
if(err)
return -efault;
範例:使用者層:
cmd = memdev_iocprint;
if (ioctl(fd, cmd, &arg) < 0)
/* 呼叫命令memdev_iocsetdata */
printf("<--- call memdev_iocsetdata --->\n");
cmd = memdev_iocsetdata;
arg = 2007;
if (ioctl(fd, cmd, &arg) < 0)
/* 呼叫命令memdev_iocgetdata */
printf("<--- call memdev_iocgetdata --->\n");
cmd = memdev_iocgetdata;
if (ioctl(fd, cmd, &arg) < 0)
驅動層:
int memdev_ioctl(struct inode *inode, struct file *filp,
unsigned int cmd, unsigned long arg)
return ret;
}
裝置控制介面(ioctl 函式)
int ioctl struct inode struct file unsigned int,unsigned long 這是驅動程式裝置控制介面函式 ioctl函式 的核心原型定義,struct inode 和 struct file 描述了操作的檔案,unsigned int 描述了ioctl...
裝置控制介面ioctl詳解
int ioctl struct inode struct file unsigned int,unsigned long 這是驅動程式裝置控制介面函式 ioctl函式 的核心原型定義,struct inode 和struct file 描述了操作的檔案,unsigned int 描述了ioctl命...
裝置驅動程式學習筆記 4 裝置控制ioctl方法
by 潘雲登 對於商業目的下對本文的任何行為需經作者同意。寫在前面 1.本文內容對應 linux 裝置驅動程式 第六章。2.參考俞永昌的 裝置驅動開發技術及應用 以及 documentation ioctl number.txt 和include asm ioctl.h 兩個檔案。3.裝置控制 io...