字符驱动的控制技术

1.设备控制理论:

作用:大部分驱动程序除了需要提供读写设备的能力外。

还需要具备控制设备的能力。比如:改变波特率。

设备控制-应用函数

在用户空间,使用ioctl系统调用来控制设备,原型如下

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

fd:要控制设备文件描述符

cmd: 发送给设备的控制命令

        .....  : 第3个参数是可选的参数,存在与否是依赖控制命令(第2个参数)。。


  设备控制 -- 驱动函数

2.6.36之后内核

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

参数:cmd  通过应用函数ioctl传递下来的。


学习一种新的驱动方法:

在应用程序中  读:read      xxx_read

写:write      xxx_write

控制: ioctl     unlocked_ioctl

如何实现驱动程序  unlocked_ioctl

      命令从实质上就是一个整数,但是为了让这个整数具备更好的可读性,我们

通常会把这个整数分为几个段:类型(8位),序号,参数传递方向,参数长度。


Type (类型/幻数):表明这个属于哪个设备的命令。

Number(序号):        用来区分同一设备的不同命令

Direction:参数传递方向,可能的值_IOC_NONE(没有数据传输),

_IOC_READ(向设备读参数),_IOC_WRITE(向设备写入参数)。

size   : 参数长度


Linxu 系统提供了下面的宏来帮助定义命令:

_IO(type,nr):  不带参数命令

_IOR(type,内容,datatype):从设备中读参数的命令

_IOW(type,内容,datatype):向设写入参数的命令

例:

#define  MEM_MAGIC  "m"  //定义幻数

#define  MEM_SET  _IOW(MEM_MAGIC,0,int)


unlocked_ioctl函数的实现通常是根据命令执行一个switch语句。但是,当命令号不能

匹配任何一个设备所支持的命令时,返回-EINVAL

编程模型:

switch cmd

case  A:

//执行A对应的操作

case  B:

//执行B对应的操作

default:

return -EINVAL

你可能感兴趣的:(技术,Linux驱动开发)