Linux字符設備驅動之實現ioctl文件操作
在前面的文章里面已經寫了如何實現read、write操作,但是對于有些驅動僅僅靠read和write是不夠的,比如對于一個led驅動,我們用戶想控制led進行全亮、全滅、流水燈等等操作,那么顯然使用ioctl給驅動發(fā)送不同的命令來實現不同的操作更加合適。
ioctl在file_operations里面的函數指針原型:
ioctl函數的第二個參數就是命令,ioctl命令的本質是一個32位數:設備類型8bit + 序列號8bit + 方向2bit + 數據尺寸8~14bit
通常使用下面四個宏來快速聲明ioctl命令:
_IO: 可以定義一個沒有方向的ioctl命令
_IOR: 可以定義一個方向是從驅動讀的ioctl命令
_IOW: 可以定義一個方向是往驅動寫的ioctl命令
_IOWR:可以定義一個雙向的讀寫驅動的ioctl命令
定義的ioctl命令帶有讀寫方向的好處是在驅動實現的ioctl中,可以根據命令的讀寫方法來判斷調用copy_to_user還是copy_from_user操作內核資源,比如對于一個串口驅動,用戶想獲取當前串口的波特率,那么就可以使用_IOR宏定義一個命令來讀取波特率。
type參數我們稱之為幻數,通常定義一個宏來表示type,這個參數是自定義的,用來表示這個ioctl命令是用來控制哪個設備的以防命令的混淆,通常不同的幻數對應不同的設備;nr參數稱之為序數,用來區(qū)分同一個設備的不同控制命令。實際使用時ioctl命令單獨使用一個頭文件:
ioctl驅動實現
app測試
*博客內容為網友個人發(fā)布,僅代表博主個人觀點,如有侵權請聯(lián)系工作人員刪除。