除了讀和寫裝置外,大部分驅動還需要另一種能力,即通過裝置驅動程式執行各種型別的硬體控制。這些操作通常通過ioctl函式實現。
在使用者空間,ioctl的原型:
int ioctl(int fd,unsigned long cmd,…);
在核心空間,ioctl的原型:
int (*ioctl) (struct inode *inode,struct file*filp,unsigned int cmd,unsigned long arg);
在核心的ioctl中大多實現了乙個switch語句,根據不同的cmd執行不同的**。不同的cmd有不同的值,為了方便建立唯一的ioctl的cmd,linux在中包含的中提供了一些建立cmd的巨集,如下:
_io(type,nr);
_ior(type,nr,datatype);
_iow(type,nr,datatype);
_iowr(type,nr,datatype);
type是表示乙個magic number,一般可以如下定義:
#define ***_io_magic 『k』
nr代表命令序數,一般從1開始,隨你設定,不能重複。datatype是資料型別。下面例子,我們定義乙個命令cmd:
#define ***_iocmd_o _io(***_io_magic,1)
#define ***_iocmd_c _io(***_io_magic,2)
***代表任意,自己定吧,反正是巨集定義,自己看著辦。
定義了上述命令,我們即刻通過***_iocmd_o傳入ioctl,由使用者空間到核心空間的聯絡了。注意,上面定義命令部分,要在使用者空間和核心空間進行相同的操作,即在驅動程式和使用者程式裡面是相同的命令設定。
在驅動程式部分,大概是這樣乙個switch語句:
switch(cmd)
在使用者程式部分,就像是ioctl()的呼叫了。假設乙個裝置描述符為dev_fd,開啟這個裝置(使用者態),呼叫ioctl(dev_fd,***_iocmd_o);
就這麼簡單啦。
linux 驅動程式 高階字元驅動程式
ioctl方法 驅動程式的原型實現 int ioctl struct inode inode,struct file filp,unsigned int cmd,unsigned long arg ioctl 命令選擇 位段結構 number direction ioc read ioc write...
linux裝置驅動程式 字元裝置驅動程式
先留個 有一起學習驅動程式的加qq295699450 字元裝置驅動 這篇比較惱火。載入成功,但是讀不出來資料,有知道怎麼回事的,留個言,一起討論下 資料結構 struct scull mem struct scull dev dev 整個驅動程式 如下 include include include...
Linux裝置驅動程式 字元裝置驅動程式
1.檢視主裝置號,次裝置號 進入 dev目錄執行ls l,第四,五列分別為主次裝置號,10,180,1,5,這些是主裝置號,而60,63這些就是次裝置號 130 shell android dev ls l crw rw r system radio 10,60 1969 12 31 21 00 a...