Linux-字符设备控制技术
设备控制-应用函数
在用户空间,使用ioctl系统调用来控制设备:
int ioctl(int fd, unsigned long cmd, ....)
fd:要控制的设备文件描述符
cmd:发送给设备的控制命令,其实只是用来起到标识作用
...:可选参数,存在与否依赖于控制命令,可以简单地课程就是一个参数
内核file_operations中对应函数
long (*ioctl)(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg);
long (*unlocked_ioctl)(struct file *filp, unsigned int cmd, unsigned long arg);
定义命令:
命令其实就是用几个字段来对设备的控制命令进行更细致的划分,由驱动设计者自己设定。
命令由类型(1Byte)、序号、参数传送方向、参数长度这四个段组成。其中
类型/幻数:表明这是哪个设备的命令
序号:用来区分同一设备的不同命令
参数传送方向:参数传送的方向,可能的值是_IOC_NONE(没有数据传输),_IOC_READ,_IOC_WRITE(向设备写入参数)
参数长度:size
利用linux提供的宏来帮助定义命令【注意不要和linux中的命令冲突】
_IO(type, nr): 不带参数的命令
_IOR(type, nr, datatype):从设备中读参数的命令
_IOW(type, nr, datatype): 向设备写入参数的命令
操作实现
unlocked_ioctl和ioctl函数中通常是使用一个switch来对命令进行识别,从而实现对设备的控制。当命令号不能匹配任何一个设备所支持的命令时,返回-EINVAL
switch cmd{
case A:
break;
case B:
break;
default:
break;
}