大部分驱动除了需要具备读写设备能力外,还需要具备对硬件控制的能力,例如:要求设备报告错误信息改变模特率,这些操作常常通过ioctl方法来实现!
这里的东西看上去的却挺多,但是还是依照此次的原则,只是对自己知识的一个复习,所以也就懒得贴那么多的文字。
1、ioctl方法
用户空间:
int ioctl(int fd, unsigned long cmd, ...);
原型中的省略号表示这是一个可选的参数,存在与否依赖于控制命令(第2个参数)是否涉及到与设备的数据交互。
内核:
#include <linus/fs.h>
// 不使用BLK(大内核锁),降使用此种函数指针代替ioctl
long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long);
// 兼容64位系统,将使用此函数指针代替
long (*compat_ioctl) (struct file *, unsigned int, unsigned long);
这里如果cmd命令不涉及数据传输,被驱动操作接收到的arg值是无定义的。
2、ioctl函数定义命令
ioctl命令编码被划分为几个段,include/asm/ioctl.h中定义了这些字段:类型(幻数),基数,传送方向,参数大小等。Documentation/ioctl-number.txt文件中罗列了再内核中已经使用的幻数。