幻数魔数

魔数幻数为了不与系统其他设备宏定义冲突,造成错误调用后能正常
Linux 第一个版本使用了16位整数,(幻)高8位与设备相关,(魔)低8位是序列号码

ioctl-number.txt内罗列了内核设备所使用的幻数

<linux/ioctl.h>
<asm/ioctl.h>

type
 幻数
number
 魔数 序数,顺序编号
direction
 数据传输方向 _IOC_NONE(没有数据传输) _IOC_READ(读取)
size
 所涉及的用户数据大小

#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 AGPIOC_BASE       'A' //幻数
#define AGPIOC_INFO       _IOR (AGPIOC_BASE, 0, struct agp_info*)
#define AGPIOC_ACQUIRE    _IO  (AGPIOC_BASE, 1)
#define AGPIOC_RELEASE    _IO  (AGPIOC_BASE, 2)
#define AGPIOC_SETUP      _IOW (AGPIOC_BASE, 3, struct agp_setup*)
#define AGPIOC_RESERVE    _IOW (AGPIOC_BASE, 4, struct agp_region*)
#define AGPIOC_PROTECT    _IOW (AGPIOC_BASE, 5, struct agp_region*)
#define AGPIOC_ALLOCATE   _IOWR(AGPIOC_BASE, 6, struct agp_allocate*)
#define AGPIOC_DEALLOCATE _IOW (AGPIOC_BASE, 7, int)
#define AGPIOC_BIND       _IOW (AGPIOC_BASE, 8, struct agp_bind*)
#define AGPIOC_UNBIND     _IOW (AGPIOC_BASE, 9, struct agp_unbind*)
#define AGPIOC_CHIPSET_FLUSH _IO (AGPIOC_BASE, 10)

<linux/kd.h>使用了16位数字直接定义CMD,这种方案不推荐
/* 0x4B is 'K', to avoid collision with termios and vt */
#define GIO_FONT    0x4B60    /* gets font in expanded form */
#define PIO_FONT    0x4B61    /* use font in expanded form */
#define GIO_FONTX    0x4B6B    /* get font using struct consolefontdesc */
#define PIO_FONTX    0x4B6C    /* set font using struct consolefontdesc */
#define KDGETLED    0x4B31    /* return current led state */
#define KDSETLED    0x4B32    /* set led state [lights, not flags] */
#define     LED_SCR        0x01    /* scroll lock led */
#define     LED_NUM        0x02    /* num lock led */
#define     LED_CAP        0x04    /* caps lock led */

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值