Linux驱动(四)ioctl设备基本操作

对驱动设备除了读写操作,还应该有一个控制操作,内核将对设备的控制操作委派给了ioct接口,ioctl也是一个系统调用,函数原型如下:

  int ioctl(int d, int request,......)

d表示文件描述符

request我们理解为命令

后面可以跟命令的参数

在文件操作集合中与ioctl对应的函数是:

                            long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long);

第一个参数表示打开的文件结构指针

第二个参数与request对应

第三个参数与系统调用的第三个参数对应。


对于第二个参数request,需要遵从一定的规则

bit31-30          00 命令不带参数

                       10  命令需要从驱动中获取数据,读方向

                        01 命令需要把数据写入驱动,写方向

                        11 命令既要写数据也要读数据 读写

bit 29-16          如果命令带参数,则指定参数所占用的内存空间大小

bit15-8             每个驱动全局唯一的幻数

bit7-0                命令码



内核有命令码来生成相关命令

命令码如何生成:
         #define _IO(type,nr)    _IOC(_IOC_NONE,(type),(nr),0)     // 生成一个命令码
#define _IOR(type,nr,size)      _IOC(_IOC_READ,(type),(nr),sizeof(size))  // 生成一个读命令码
#define _IOW(type,nr,size)      _IOC(_IOC_WRITE,(type),(nr),sizeof(size))   // 生成一个写命令码
#define _IOWR(type,nr,size)     _IOC(_IOC_READ|_IOC_WRITE,(type),(nr),sizeof(size))  // 生成一个读写命令码
 
  type :8位一个幻数,任意的一个字符
  nr   :自然数  8位
  size :数据的类型 占 14位
  dir  :方向占用 2位

例:

#define SET_BAUD   _IOW('c',0,unsigned int )







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值