一、ioctl接口
函数原型:
int ioctl(int fd, unsigned long cmd, ...);
ioctl驱动方法有和用户空间版本不同的原型:
int (*ioctl)(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg);
为帮助程序员创建唯一的ioctl命令代码,这些编码已被划分为几个段位,Linux的第一个版本使用16-位数:
高8位是关联这个设备的“魔”数,低8位是一个顺序号,在设备内唯一。
根据Linux内核管理来选择驱动ioctl号,在include/asm/ioctl.h和Documentation/ioctl-number.txt文件列举了在内核中使用的魔数。
定义ioctl命令号的正确方法使用4个位段,新富豪定义在<linux/ioctl.h>
type:魔数,只是一个选择数(参考ioctl-number.txt),并且使用它在整个驱动中,8位宽(_IOC_TYPEBITS)
number:序号,它是8位(_IOC_NRBITS)宽
direction:数据传送方向,如果这个特殊的命令设计数据传送。可能的值_IOC_NONE(没有数据传输),_IOC_READ, _IOC_WRITE, IOC_READ|_IOC_WRITE。
size:涉及到的用户数据的大小
头文件<asm/ioctl.h>,它包含在<linux/ioctl.h>中,定义宏来帮助建立命令号。
使用ioctl参数
ioctl调用常常包含小数据项,可通过其他方法更有效的操作。地址校验由函数access_ok,在头文件<asm/uaccess.h>:
int access_ok(int type, const void *addr, unsigned long size);