魔数幻数为了不与系统其他设备宏定义冲突,造成错误调用后能正常
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 */