linux驱动:(20)ioctl接口(一)

目录

unlocked_ioctl与ioctl接口

与read/write的区别

接口命令规则

合成宏

分解宏

示例


unlocked_ioctl与ioctl接口

  • 这两个是一样的,功能和对应的系统调用均没有发生变化
  • 当调用的时候也会调用文件操作结构体中的函数,和read和write一样

与read/write的区别

  • 两则都可以让应用层与内核通信,传输数据
  • read只能读取,write只能写,
  • ioctl函数可以读写,但读取大数据的时候会变低

接口命令规则

  • 包含32位,分为四个分区,每个分区不一样
    • 0-7:命令的编号,0-255
    • 8-15:命令的的幻数
    • 0-15主要目的是区分命令,只有全部一样的才是同一个命令
    • 16-29:存放传递数据的大小
    • 30-31:读写的方向
      • 00:用户和驱动没有通信
      • 10:用户从驱动读数据
      • 01:用户从驱动写数据
      • 11:先写数据到驱动再读

合成宏

_IO(type,nr)  //定义没有数据传递的命令
_IOR(type,nr,size)//定义从驱动中读取数据的命令
_IOW(type,nr,size)//定义向驱动写入数据的命令
_IOWR(type,nr,size)//定义数据交换类型的命令,先写入数据,再读取数据这类命令
  • 参数:
    • type:幻数,8-15位
    • nr:编号,0-7位
    • size:大小,不是数字,是类型,int....

分解宏

_IOC_DIR(nr)//分解命令的方向,也就是上面说 30~31位的值
_IOC_TYPE(nr)//分解命令的幻数,也就是上面说 8~15 位的值
_IOC_NR(nr)//分解命令的编号,也就是上面说 0~7位
_IOC_SIZE(nr)//分解命令的复制数据大小,也就是上面说的 16~29 位
  • 参数:
    • nr:要分解的命令

示例

  • 加入头文件#include <sys/ioctl.h>
  • 定义命令
  • 在main函数中分解命令打印分区
    #include <stdio.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    #include <unistd.h>
    #include <sys/ioctl.h>
    
    #define CMD_TEST0 _IO('L',0)
    #define CMD_TEST1 _IO('L',1)
    #define CMD_TEST2 _IOW('L',3,int)
    #define CMD_TEST3 _IOR('L',3,int)
    
    int main(int argc,char *argv[])
    {
        printf("30-31 is %d",_IOC_DIR(CMD_TEST0));
        printf("30-31 is %d",_IOC_DIR(CMD_TEST3));
        printf("7-15 is %c",_IOC_TYPE(CMD_TEST0));
        printf("7-15 is %c",_IOC_TYPE(CMD_TEST1));
        printf("0-7 is %d",_IOC_NR(CMD_TEST2));
        return 0;
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码农小白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值