姓名:鄭煜爍? 學(xué)號(hào):19029100010? 學(xué)院:電子工程學(xué)院
轉(zhuǎn)自:https://blog.csdn.net/u012142460/article/details/78951664
【嵌牛導(dǎo)讀】簡單介紹相關(guān)的控制操作和命令
【嵌牛鼻子】ioctl設(shè)備基本操作
【嵌牛提問】何為ioctl設(shè)備
【嵌牛正文】
對(duì)驅(qū)動(dòng)設(shè)備除了讀寫操作,還應(yīng)該有一個(gè)控制操作,內(nèi)核將對(duì)設(shè)備的控制操作委派給了ioct接口,ioctl也是一個(gè)系統(tǒng)調(diào)用,函數(shù)原型如下:
? int ioctl(int d, int request,......)
d表示文件描述符
request我們理解為命令
后面可以跟命令的參數(shù)
在文件操作集合中與ioctl對(duì)應(yīng)的函數(shù)是:
? ? ? ? ? ? ? ? ? ? ? ? ? ? long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long);
第一個(gè)參數(shù)表示打開的文件結(jié)構(gòu)指針
第二個(gè)參數(shù)與request對(duì)應(yīng)
第三個(gè)參數(shù)與系統(tǒng)調(diào)用的第三個(gè)參數(shù)對(duì)應(yīng)。
對(duì)于第二個(gè)參數(shù)request,需要遵從一定的規(guī)則
bit31-30? ? ? ? ? 00 命令不帶參數(shù)
? ? ? ? ? ? ? ? ? ? ? 10? 命令需要從驅(qū)動(dòng)中獲取數(shù)據(jù),讀方向
? ? ? ? ? ? ? ? ? ? ? ? 01 命令需要把數(shù)據(jù)寫入驅(qū)動(dòng),寫方向
? ? ? ? ? ? ? ? ? ? ? ? 11 命令既要寫數(shù)據(jù)也要讀數(shù)據(jù) 讀寫
bit 29-16? ? ? ? ? 如果命令帶參數(shù),則指定參數(shù)所占用的內(nèi)存空間大小
bit15-8? ? ? ? ? ? 每個(gè)驅(qū)動(dòng)全局唯一的幻數(shù)
bit7-0? ? ? ? ? ? ? ? 命令碼
內(nèi)核有命令碼來生成相關(guān)命令
命令碼如何生成:
? ? ? ? #define _IO(type,nr)? ? _IOC(_IOC_NONE,(type),(nr),0)? ? // 生成一個(gè)命令碼
#define _IOR(type,nr,size)? ? ? _IOC(_IOC_READ,(type),(nr),sizeof(size))? // 生成一個(gè)讀命令碼
#define _IOW(type,nr,size)? ? ? _IOC(_IOC_WRITE,(type),(nr),sizeof(size))? // 生成一個(gè)寫命令碼
#define _IOWR(type,nr,size)? ? _IOC(_IOC_READ|_IOC_WRITE,(type),(nr),sizeof(size))? // 生成一個(gè)讀寫命令碼
? ? type :8位一個(gè)幻數(shù),任意的一個(gè)字符
? ? nr? :自然數(shù)? 8位
? ? size :數(shù)據(jù)的類型 占 14位
? ? dir? :方向占用 2位
例:
#define SET_BAUD? _IOW('c',0,unsigned int )
————————————————
版權(quán)聲明:本文為CSDN博主「念念有余」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/u012142460/article/details/78951664