linux驱动————ioctl函数的使用

ioctl函数

        man ioctl

        #include <sys/ioctl.h>

                int ioctl(int fd,int request, ...);

                参数:

                        fd         :文件描述符

                        request:命令码

                        ...         :传递的参数,(可以传可以不传)(传递的是一个地址)

ruquest解析:    

                        目录:内核/Documentation/ioctl/ioctl-decoding.txt

方向:
     31-30  00 - no parameters: uses _IO macro
        10 - read: _IOR
        01 - write: _IOW
        11 - read/write: _IOWR
    
     大小:
     29-16  size of arguments

     类型:
     15-8   ascii character supposedly   unique to each driver

     功能:
     7-0    function #
     
 

可以通过四个宏,来得到上述的32位的整数request

    #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))

 宏的实现

#define _IOC(dir,type,nr,size) (((dir)  << _IOC_DIRSHIFT)   |   ((type) << _IOC_TYPESHIFT)   |  ((nr)   << _IOC_NRSHIFT)   |  ((size) << _IOC_SIZESHIFT))


                    dir<<30|size <<16| type<<8 |nr <<0 
                    2             14              8             8

注:通过这_IO _IOR _IOW _IOWR宏就是为了得到一个32位的不重复的整数,只要保证在当前的驱动中它的功能唯一即可,驱动和驱动间功能可以不唯一。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值