ioctl
驱动程序可以使用ioctl执行硬件控制。
两种原型:
1.在用户空间
int ioctl(int fd,unsigned long cmd,...);
fd:文件描述符
cmd:控制命令
,,,:可选参数:插入*argp,具体内容依赖于cmd
2.驱动程序
int (*ioctl) (struct inode *inode,struct file *filp,unsigned int cmd,unsigned long arg);
inode与filp两个指针对应于应用程序传递的文件描述符fd,这和传递open方法的参数一样。
cmd 由用户空间直接不经修改的传递给驱动程序
arg 可选
cmd:
四个位字段:type,number,direction,size
type:幻数,8位
number:序数,8位
direction:涉及内容包括_IOC_NONE(无数据传输),_IOC_READ(从设备中读),_IOC_WRITE,_IOC_READ|_IOC_WRITE(双向数据传输)
size:表示所涉及的用户数据大小,通常为13位或是14位,具体可通过宏_IOC_SIZEBITS找到针对特定体系结构的具体数值。内核不会检查这个位字段,对该字段的检查可以帮助我们检测用户空间的错误。
另外,<asm/ioctl.h>定义了一些构造命令编号的宏,
_IOR(type,nr,datetype) 构造从驱动程序中读取数据的命令
_IO(type,nr) 用于构造无参数的命令编号
_IOW(type,nr,datetype) 用于写入命令的编号
_IOWR(type,nr,datatype) 双向传输
type,number通过参数传入,size通过对datatype参数取sizeof获取
还有一些解开位字段的宏:_IOC_DIR(nr),_IOC_TYPE(nr),_IOC_NR(nr),_IOC_SIZE(nr)
对非法的ioctl命令一般会返回-EINVAL
预定义命令
在使用ioctl命令编号时,一定要避免与预定义命令重复,否则,命令冲突,设备不会响应
下列ioctl命令对任何文件(包括设备特定文件)都是预定义的:
FIOCTLX 设置执行时关闭标志
FIONCLEX 清除执行时关闭标志
FIOASYNC 设置或复位文件异步通知
FIOQSIZE 返回文件或目录大小
<