字元裝置控制

2022-03-24 12:03:04 字數 2724 閱讀 9785

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

int ioctl

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

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

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

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

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

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

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

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

程式設計模型:

switch cmd

case 命令a:

//執行a對應的操作

case 命令b:

//執行b對應的操作

default:

// return -einval

mem_ctl.c

1 #include2 #include3 #include4 #include5 #include "

memdev.h"6

7int

main()

8

mem_ctl

memdev.h

1

#ifndef mem_dev_h

2#define mem_dev_h34

#define mem_magic 'm' //

定義乙個幻數,而長度正好和asc碼長度一樣為8位,所以這裡定義個字元

5#define mem_restart _io(mem_magic, 0) //

第乙個命令是重啟的命令,重啟的命令不帶引數 第一命令這裡序號定義成0

6#define mem_set _iow(mem_magic, 1, int) //

設定引數命令,第2個命令,型別為int78

910#endif

memdev.h

memdev.c

1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include "

memdev.h"10

1112

int dev1_registers[5

];13

int dev2_registers[5

];14

15struct

cdev mdev;

16dev_t devno;

1718

static

int mem_open(struct inode *inode, struct file *filep)

1932

33static

int mem_release(struct inode *inode, struct file *filep)

3437

38static loff_t mem_llseek(struct file *filep, loff_t offset, int

base_addr )

3958

if((newpos<0) || (newpos>5*sizeof(int

)))59

return -einval;

6061 filep->f_pos =newpos;

62return

newpos;

6364}65

66static ssize_t mem_read(struct file *filep, char __user *buf, size_t size, loff_t *ppos)

6782

else

8387

return

ret;88}

8990

static ssize_t mem_write(struct file *filep, const

char __user *buf, size_t size, loff_t *ppos)

91109

return

ret;

110}

111112

static

long mem_ioctl(struct file *filp, unsigned int cmd, unsigned long

arg)

113

127128

return

0;

129}

130131

static

const

struct file_operations mem_fops =

132;

140141

static

int memdev_init(void

)142

149150

static

void memdev_exit(void

)151

155156

module_init(memdev_init);

157 module_exit(memdev_exit);

memdev.c

字元裝置控制

大部分驅動程式除了讀寫功能外,還需要具備控制裝置的能力,比如對於串列埠,需要具備修改波特率的功能。在使用者空間,使用ioctl 函式作為系統呼叫來控制裝置 原型 int ioctl int fd,unsigned long cmd,標頭檔案 功能 字元裝置控制函式 引數 fd 要控制的裝置檔案描述符...

字元裝置控制技術

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 控制的裝置檔案描...