Linux驱动-ioctl() 命令生成方式

Linux建议如下表所示的方式定义ioctl() 的命令。

设备类型序列号方向数据尺寸
8位8位2位13/14位

1、设备类型字段(8位)
命令码的设备类型字段为一个“幻数”,可以是0 ~ 0xff的值,内核中的ioctl-number.txt给出了一些推荐的和已经被使用的“幻数”,新设备驱动定义“幻数”的时候要避免与其冲突。

ioctl-number.txt文档中指出如下建议:

Some devices use their major number as the identifier; this is OK, as long as it is unique.

2、序列号(8位)

3、方向字段(2位)
该字段表示数据传送的方向,可能的值是_IOC_NONE(无数据传输)、_IOC_READ(读)、_IOC_WRITE(写)、_IOC_READ|_IOC_WRITE(双向)。数据传送的方向是从应用程序的角度来看的。

4、数据长度字段
该字段表示涉及的用户数据的大小,这个成员的宽度依赖于体系结构,通常是13或者14位。

内核定义了_IO()、_IOR()、_IOW()、_IOWR()这4个宏来辅助生成命令,其通用定义代码如下所示(来自/linux/ioctl.h):

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

/* _IOC宏定义如下 */
#define _IOC(dir,type,nr,size) \
	(((dir)  << _IOC_DIRSHIFT) | \
	 ((type) << _IOC_TYPESHIFT) | \
	 ((nr)   << _IOC_NRSHIFT) | \
	 ((size) << _IOC_SIZESHIFT))

/* _IOC_xxxSHIFT定义如下 */
#define _IOC_NRSHIFT	0
#define _IOC_TYPESHIFT	(_IOC_NRSHIFT+_IOC_NRBITS)
#define _IOC_SIZESHIFT	(_IOC_TYPESHIFT+_IOC_TYPEBITS)
#define _IOC_DIRSHIFT	(_IOC_SIZESHIFT+_IOC_SIZEBITS)

/* 各字段占用bit位如下定义 */
#define _IOC_NRBITS	8
#define _IOC_TYPEBITS	8
# define _IOC_SIZEBITS	14	/* 有条件宏,故可自己定义 */
# define _IOC_DIRBITS	2	/* 有条件宏,故可自己定义 */

由_IOC_xxxSHIFT宏定义,命令码的高低位排列应如下:(左高右低)

方向数据尺寸设备类型序列号
2位13/14位8位8位

5、以下是内核针对上述的命令码进行解码的宏:

/* 掩码宏 */
#define _IOC_NRMASK		((1 << _IOC_NRBITS)-1)
#define _IOC_TYPEMASK	((1 << _IOC_TYPEBITS)-1)
#define _IOC_SIZEMASK	((1 << _IOC_SIZEBITS)-1)
#define _IOC_DIRMASK	((1 << _IOC_DIRBITS)-1)

/* used to decode ioctl numbers.. */
#define _IOC_DIR(nr)		(((nr) >> _IOC_DIRSHIFT) & _IOC_DIRMASK)
#define _IOC_TYPE(nr)		(((nr) >> _IOC_TYPESHIFT) & _IOC_TYPEMASK)
#define _IOC_NR(nr)			(((nr) >> _IOC_NRSHIFT) & _IOC_NRMASK)
#define _IOC_SIZE(nr)		(((nr) >> _IOC_SIZESHIFT) & _IOC_SIZEMASK)
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值