字元裝置控制

2021-07-25 08:32:22 字數 1401 閱讀 8759

大部分驅動程式除了讀寫功能外,還需要具備控制裝置的能力,比如對於串列埠,需要具備修改波特率的功能。 

在使用者空間,使用ioctl()函式作為系統呼叫來控制裝置

原型:int ioctl(int fd,unsigned long cmd,...)

標頭檔案:功能:字元裝置控制函式

引數:fd:要控制的裝置檔案描述符

cmd:傳送給裝置的控制命令

...:第3個引數是可選的引數,存在與否是依賴於控制命令(第2個引數 )。

當應用程式使用ioctl系統呼叫時,驅動程式的響應函式根據linux版本不同將由不同函式來響應: 

①2.6.36 之前的核心

long (*ioctl) (struct inode* node ,struct file* filp, unsigned

int cmd,unsigned

long arg)

②2.6.36之後的核心

long (*unlocked_ioctl) (struct file *filp, unsigned

int cmd, unsigned

long arg)

實現裝置控制函式編寫主要有兩步: 

1.定義命令

2.實現裝置方法,即編寫實現命令的unlocked_ioctl函式 

命令從其實質而言就是乙個整數, 但為了讓這個整數具備更好的可讀性,我們通常會把這個整數分為幾個段:型別(8位),序號,引數傳送方向,引數長度。 

①type(型別/幻數):表明這是屬於哪個裝置的命令 

②number(序號):用來區分同一裝置的不同命令 

③direction:引數傳送的方向,可能的值是 _ioc_none(沒有資料傳輸),_ioc_read,_ioc_write(向裝置寫入引數) 

④size: 引數長度

為了開發容易,linux系統提供了下面的巨集來幫助定義命令: 

①_io(type,nr):不帶引數的命令 

②_ior(type,nr,datatype):從裝置中讀引數的命令 

③_iow(type,nr,datatype):向裝置寫入引數的命令 

例:

#define mem_magic 'm' //定義幻數

#define mem_set _iow(mem_magic, 0, int)

乙個字元正好是8位,所以可以用乙個字元來表示型別,這顯得較為簡略;int表示傳輸的引數是int型別的。

unlocked_ioctl函式的實現通常是由switch語句完成。但是,當命令號不能匹配任何乙個裝置所支援的命令時,返回-einval。 

程式設計模型:

switch(cmd)

字元裝置控制

在使用者空間,使用ioctl系統呼叫來控制裝置,原型如下 int ioctl int fd,unsigned long cmd,fd 要控制的裝置檔案描述符 fd 要控制的裝置檔案描述符 cmd 傳送給裝置的控制命令 第3個引數是可選的引數,存在與否是依賴於控制命令 第 2 個引數 當應用程式使用i...

字元裝置控制技術

1 大部分驅動程式除了需要提供讀寫裝置的能力,還應具備控制裝置的能力。2 在使用者空間,使用ioctl系統呼叫來控制裝置。函式原型 int ioctl int fd,unsigned long cmd,fd 要控制的裝置檔案描述符 cmd 傳送給裝置的控制命令 第3個引數是可選的引數,存在與否是依賴...

Linux 字元裝置控制技術

字元裝置控制技術 一。字元裝置控制理論 1.作用 大部分裝置除了具有 讀寫裝置 的能力,還應該有 控制裝置 的能力。比如改變 波特率 2.應用程式介面 在使用者空間中使用 ioctl系統來控制裝置,原型如下 int ioctl int fd,unsigned long cmd,fd 控制的裝置檔案描...