字符设备控制函数
除了open、read等对设备的操作的函数之外还有对设备进行控制的函数:
ioctl(int fd,unsigned long cmd,…)
该函数的功能是对设备进行一些配置,如串口的波特率控制等。
同open等函数一样,需要修改struct file_operations类型变量来对应相关的处理函数,对于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)
对于其中的cmd命令,由Type(类型/幻数,表明属于哪个设备)、Number(序号,用来区分同一设备的不同命令)、Direction(参数传送的方向,可能值为_IOC_NONE(没有数据传输)、_IOC_READ、_IOC_WRITE(向设备写入参数))、Size(参数长度)等组成。该命令cmd本质就是一个32位整数,在应用程序调用ioctl()函数时将cmd参数传给内核时,内核会对cmd参数做适当的检查,如读写是否正确等,一些特定的cmd参数如:0x5450、0x5451等,这些cmd不会被传给驱动中对应的I/O控制函数,而是被内核处理。
在设备驱动函数中,由应用函数传进来cmd参数一般会使用switch函数进行分情况处理。
Linux系统提供了一些宏来帮助定义cmd命令,只要定义了幻数(type)和nr就可以得到一个cmd。
_IO(type,nr):不带参数的命令
_IOR(type,nr,datatype):从设备中读参数的命令
_IOW(type,nr,datatype):向设备中写参数的命令