Chinaunix首页 | 论坛 | 博客
  • 博客访问: 70736
  • 博文数量: 83
  • 博客积分: 1320
  • 博客等级: 中尉
  • 技术积分: 805
  • 用 户 组: 普通用户
  • 注册时间: 2010-07-20 14:54
文章分类

全部博文(83)

文章存档

2010年(83)

我的朋友

分类:

2010-08-02 09:41:37

驱动里的ioctl函数主要实现不用read,write函数的与用户空间的简单数据交互及无参数的命令控制。
ioctl驱动中以SWITCH{case A,case B}结构以实现对不同命令的响应,首先我们要对我们要使用的“A”,“B”命令定义一个整个操作系统内唯一的标识,
同时这个标识又能够表明我们的操作类型及传递参数的类型(如果需要的话)。
linux系统的每一个命令号被分为多个位字段,这些位字段包括 type,number,direction,size,分别表示幻数(与设备相关的一个字母,以避免与内核冲突),序数(命令编号),方向位(以用户空间为参照的读,写和无数据传输),size(传递参数类型)。
内核中/include/asm/ioctl.h,/Documentation /ioctl-number.txt两个文件表明了我们应该如何定义ioctl命令编号及自定义的幻数,。
    _IO(type,nr),_IOR(type,nr,datatype),_IOW(type,nr,datatype)。它们在包含的中有定义,所以在我们的驱动中应包含这个头文件。
其中_IO()用做无参数的命令编号,_IOR()用做从驱动中读取数据的命令编号,_IOW()用做写入数据命令。
LDD中用: define SCULL_IOC_MAGIC 'k' ,
         define SCULL_IOCSQUANTUM _IOW(SCULL_IOC_MAGIC,1,int)表示SCULL_IOCSQUANTUM命令编号为向驱动中写数据,命令编号为1,传送参数类型为int。
阅读(533) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~