Chinaunix首页 | 论坛 | 博客
  • 博客访问: 541983
  • 博文数量: 64
  • 博客积分: 1591
  • 博客等级: 上尉
  • 技术积分: 736
  • 用 户 组: 普通用户
  • 注册时间: 2010-12-08 14:54
文章分类

全部博文(64)

文章存档

2011年(42)

2010年(22)

分类: LINUX

2011-01-06 13:51:54

ioctl接口
1.为什么使用ioctl接口

大部分驱动需要 

(1)读写设备的能力 

(2)通过设备驱动进行各种硬件控制的能力例如设备锁上它的门弹出它的介质报告错误信息改变波特率等这些操作常常通过 ioctl 方法来支持。

2.ioctl系统调用的用户空间原型

int ioctl(int fd,unsigned long cmd,...);

3.驱动程序的ioctl方法原型

int (*ioctl)(struct inode *inode,struct file *filp,unsigned int cmd,unsigned long arg);

inode filp 对应于应用程序传递的文件描述符fd

cmd  由用户空间不经修改地传递给驱动程序

可选的arg参数则无论用户程序使用的是指针还是整数值,它都以unsigned long的形式传递给驱动程序。

4.ioctl的实现

大多数ioctl的实现在都包括一个switch语句来根据cmd参数选择对应的操作。不同的命令被赋予不同的数值,为了简化代码,通常会在代码中使用符号代替数值,这些符号名由C语言的预处理语句定义。定制的设备驱动程序通常会在它们的头文件中声明这些符号。

5.选择ioctl命令

ioctl命令号应该在系统范围内唯一

_IO(type, nr)构造无参数的命令编号

_IOR(type, nr, datatype)构造驱动程序中读取数据的命令编号

_IOW(type, nr, datatype)用于写入数据的命令

_IOWR(type, nr, datatype)用于双向传输

6.ioctl返回

非法的ioctl命令返回-EINVAL

7.预定义命令

8.使用ioctl参数

对于非指针参数,直接使用就可。如果是指针,则要注意一些问题。

(1)先调用access_ok验证用户空间的合法性

(2)调用copy_from_usercopy_to_user进行大量数据的传送

 调用put_userget_user进行少量数据的传送

阅读(3079) | 评论(0) | 转发(2) |
给主人留下些什么吧!~~