2013年(18)
分类: LINUX
2013-03-21 11:06:27
大部分驱动需要
(1)读写设备的能力
(2)通过设备驱动进行各种硬件控制的能力. 例如, 设备锁上它的门, 弹出它的介质, 报告错误信息, 改变波特率等. 这些操作常常通过 ioctl 方法来支持。
int ioctl(int fd,unsigned long cmd,...);
int (*ioctl)(struct inode *inode,struct file *filp,unsigned int cmd,unsigned long arg);
inode filp 对应于应用程序传递的文件描述符fd
cmd 由用户空间不经修改地传递给驱动程序
可选的arg参数则无论用户程序使用的是指针还是整数值,它都以unsigned long的形式传递给驱动程序。
大多数ioctl的实现在都包括一个switch语句来根据cmd参数选择对应的操作。不同的命令被赋予不同的数值,为了简化代码,通常会在代码中使用符号代替数值,这些符号名由C语言的预处理语句定义。定制的设备驱动程序通常会在它们的头文件中声明这些符号。
ioctl命令号应该在系统范围内唯一
_IO(type, nr)构造无参数的命令编号
_IOR(type, nr, datatype)构造驱动程序中读取数据的命令编号
_IOW(type, nr, datatype)用于写入数据的命令
_IOWR(type, nr, datatype)用于双向传输
非法的ioctl命令返回-EINVAL
略
对于非指针参数,直接使用就可。如果是指针,则要注意一些问题。
(1)先调用access_ok验证用户空间的合法性
(2)调用copy_from_user和copy_to_user进行大量数据的传送
调用put_user和get_user进行少量数据的传送