Linux 字元裝置控制技術

2022-09-02 19:51:08 字數 1472 閱讀 9800

字元裝置控制技術

一。字元裝置控制理論

1.作用

大部分裝置除了具有《讀寫裝置》的能力,還應該有《控制裝置》的能力。比如改變 波特率

2. 應用程式介面

在使用者空間中使用 ioctl系統來控制裝置,原型如下:

int ioctl (int fd,unsigned long cmd,...);

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

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

.... : 第三個引數是可選引數,存在與否是依賴與控制命令

3.裝置驅動方法

當系統用 ioctl系統呼叫時,驅動程式將由如下函式來響應:

1. 核心是2.6.36之前的核心

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

2. 核心是2.6.36 之後的核心

long (*unlocked_ioctl) (struct file *filp, unsigned int cmd, unsigned long arg)

引數cmd: 通過應用函式ioctl傳遞下來的命令

二。字元裝置控制實現

1.    命令從其實質而言就是乙個整數,但為了讓這個整數具備更好的可讀性,我們通常會把這個整數分為幾個段:

型別(8位),序號,引數傳送方向,引數長度。

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

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

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

#size:引數長度

2.    linux系統提供了下面的巨集來幫助定義命令:

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

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

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

例:#define mem_magic  『m』  //定義幻數

#define mem_set_iow(mem_magic, 0, int)

3.unlocked_ioctl函式的實現通常是根據命令執行的乙個switch語句。

但是,當命令號不能匹配任何乙個裝置所支援的命令時,返回-einval.程式設計模型:

switch cmd

case 命令a://執行a對應的操作

case 命令b://執行b對應的操作

default:// return -einval

三。自己手動寫程式

#include #include 

#include

#include

#include

"memdev.h

"int

main()

字元裝置控制技術

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

14 Linux 字元裝置控制技術

裝置控制 應用函式 在使用者空間,使用ioctl系統呼叫來控制裝置 int ioctl int fd,unsigned long cmd,fd 要控制的裝置檔案描述符 cmd 傳送給裝置的控制命令,其實只是用來起到標識作用 可選引數,存在與否依賴於控制命令,可以簡單地課程就是乙個引數 核心file ...

ioctl 字元裝置的控制技術

字元裝置的控制 1.字元裝置控制理論 1.1 作用 大部分驅動程式除了需要提供讀寫裝置的能力外,還需要具備控制裝置的能力。比如 改變波特率 1.2 應用程式介面 在使用者空間,使用ioctl系統呼叫來控制裝置,原型如下 int ioctl int fd,unsigned long cmd,fd 要控...