博客專欄

        EEPW首頁(yè) > 博客 > Linux字符設(shè)備驅(qū)動(dòng)之實(shí)現(xiàn)ioctl文件操作

        Linux字符設(shè)備驅(qū)動(dòng)之實(shí)現(xiàn)ioctl文件操作

        發(fā)布人:嵌入式Linux 時(shí)間:2023-01-11 來(lái)源:工程師 發(fā)布文章

        在前面的文章里面已經(jīng)寫了如何實(shí)現(xiàn)read、write操作,但是對(duì)于有些驅(qū)動(dòng)僅僅靠read和write是不夠的,比如對(duì)于一個(gè)led驅(qū)動(dòng),我們用戶想控制led進(jìn)行全亮、全滅、流水燈等等操作,那么顯然使用ioctl給驅(qū)動(dòng)發(fā)送不同的命令來(lái)實(shí)現(xiàn)不同的操作更加合適。

        ioctl在file_operations里面的函數(shù)指針原型:

        ioctl函數(shù)的第二個(gè)參數(shù)就是命令,ioctl命令的本質(zhì)是一個(gè)32位數(shù):設(shè)備類型8bit + 序列號(hào)8bit + 方向2bit + 數(shù)據(jù)尺寸8~14bit

        通常使用下面四個(gè)宏來(lái)快速聲明ioctl命令:

        _IO: 可以定義一個(gè)沒(méi)有方向的ioctl命令

        _IOR: 可以定義一個(gè)方向是從驅(qū)動(dòng)讀的ioctl命令

        _IOW: 可以定義一個(gè)方向是往驅(qū)動(dòng)寫的ioctl命令

        _IOWR:可以定義一個(gè)雙向的讀寫驅(qū)動(dòng)的ioctl命令

        定義的ioctl命令帶有讀寫方向的好處是在驅(qū)動(dòng)實(shí)現(xiàn)的ioctl中,可以根據(jù)命令的讀寫方法來(lái)判斷調(diào)用copy_to_user還是copy_from_user操作內(nèi)核資源,比如對(duì)于一個(gè)串口驅(qū)動(dòng),用戶想獲取當(dāng)前串口的波特率,那么就可以使用_IOR宏定義一個(gè)命令來(lái)讀取波特率。

        type參數(shù)我們稱之為幻數(shù),通常定義一個(gè)宏來(lái)表示type,這個(gè)參數(shù)是自定義的,用來(lái)表示這個(gè)ioctl命令是用來(lái)控制哪個(gè)設(shè)備的以防命令的混淆,通常不同的幻數(shù)對(duì)應(yīng)不同的設(shè)備;nr參數(shù)稱之為序數(shù),用來(lái)區(qū)分同一個(gè)設(shè)備的不同控制命令。實(shí)際使用時(shí)ioctl命令單獨(dú)使用一個(gè)頭文件:

        ioctl驅(qū)動(dòng)實(shí)現(xiàn)

        app測(cè)試


        *博客內(nèi)容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀點(diǎn),如有侵權(quán)請(qǐng)聯(lián)系工作人員刪除。



        關(guān)鍵詞: ioctl

        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 林州市| 大兴区| 白朗县| 循化| 扬州市| 运城市| 资兴市| 昌平区| 高淳县| 宜阳县| 清原| 横山县| 桦川县| 云霄县| 桂阳县| 固始县| 诏安县| 右玉县| 银川市| 浠水县| 安庆市| 灵石县| 师宗县| 南城县| 同德县| 漯河市| 东港市| 平远县| 鲜城| 招远市| 两当县| 乳山市| 安塞县| 垦利县| 翁源县| 荔波县| 翁牛特旗| 河源市| 郴州市| 邻水| 盐池县|