设备驱动控制函数 ioctl函数

ioctl是一个用于设备I/O操作的系统调用,它根据传入的请求码执行特定功能。参数包括设备文件描述符(fd)、交互协议(cmd)以及可能的额外参数。cmd定义了操作类型和设备类型,通过_IOC宏进行构建。ioctl支持无参数、读参数、写参数和读写参数的操作。
摘要由CSDN通过智能技术生成
头文件:
#include <sys/ioctl.h>
函数原型:
int ioctl(int fd, unsigned long request, ...);
描述:
        是一个专用于设备输入输出操作的系统调用, 该调用传入一个跟设备有关的请求码,系统调用的功能完全取决于请求码。
参数:
        fd: 用户程序打开设备时使用 open 函数返回的文件标示符
        cmd: 交互协议,设备驱动将根据 cmd 执行对应操作
        …:补充参数,最多一个, 依赖 cmd 指定长度以及类型
返回值:
        执行成功时返回 0 ,失败则返回 -1
备注:
        用户与驱动的 “ 协议 参数 cmd 的格式为:
在内核中,提供了宏接口以生成上述格式的 ioctl 命令:
// include/uapi/asm-generic/ioctl.h
#define _IOC(dir,type,nr,size) \
(((dir) << _IOC_DIRSHIFT) | \
((type) << _IOC_TYPESHIFT) | \
((nr) << _IOC_NRSHIFT) | \
((size) << _IOC_SIZESHIFT))
dir direction :
        ioctl 命令访问模式(数据传输方向),占据 2 bit ,可以为 _IOC_NONE 、 _IOC_READ、 _IOC_WRITE _IOC_READ | _IOC_WRITE ,分别指示了四种访问模式: 无数据、读数据、写数据、读写数据;
type device type :
        设备类型,占据 8 bit ,在一些文献中翻译为 幻数 或者 魔数 ,可以为任意 char型字符,例如:‘a’ ’b’ ’c’ 等等,其主要作用是使 ioctl 命令有唯一的设备标识;
nr number :
        命令编号/ 序数,占据 8 bit ,可以为任意 unsigned char 型数据,取值范围 0~255 ,如果定义了多个 ioctl 命令,通常从 0 开始编号递增;
size :
        涉及到 ioctl 函数 第三个参数 arg ,占据 13bit 或者 14bit (体系相关, arm 架构 一般为 14 位),指定了 arg 的数据类型及长度,如果在驱动的 ioctl 实现中不检查,通常可以忽略该参数; 通常而言,为了方便会使用宏 _IOC() 衍生的接口来直接定义 ioctl 命令:
/* used to create numbers */
#define _IO(type,nr) _IOC(_IOC_NONE,(type),(nr),0)
#define
_IOR(type,nr,size) _IOC(_IOC_READ,(type),(nr),(_IOC_TYPECHECK(size)))
#define
_IOW(type,nr,size) _IOC(_IOC_WRITE,(type),(nr),(_IOC_TYPECHECK(size)))
#define _IOWR(type,nr,size) 
_IOC(_IOC_READ|_IOC_WRITE,(type),(nr),(_IOC_TYPECHECK(size)))
_IO 定义不带参数的 ioctl 命令
_IOW 定义带写参数的 ioctl 命令( copy_from_user
_IOR 定义带读参数的 ioctl 命令( copy_to_user
_IOWR 定义带读写参数的 ioctl 命令
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

九月丫

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

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

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

打赏作者

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

抵扣说明:

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

余额充值