前言
linux内核源码里有很多宏,为了能更好地理解内核和驱动源码,有必要对一些常用宏做一个梳理和解析,在此专门做一篇博文来帮助学习,并在以后的学习中逐步添加和完善。
正文
1._IOR(type,nr,size)
用法:
#define GPIO_IOC_MAGIC 'G'
#define IOCTL_GPIO_GETVALUE _IOR(GPIO_IOC_MAGIC, 3, int)
宏解析:
#define _IOR(type,nr,size) _IOC(_IOC_READ,(type),(nr),(_IOC_TYPECHECK(size)))
->>
#define _IOC(dir,type,nr,size) \
(((dir) << _IOC_DIRSHIFT) | \
((type) << _IOC_TYPESHIFT) |
((nr) << _IOC_NRSHIFT) |
((size) << _IOC_SIZESHIFT))
#ifndef _IOC_READ
#define _IOC_READ 2U
#endif
->>
#define _IOC(dir,type,nr,size) \
(((dir) << 30) | \
((type) << 8) |
((nr) << 0) |
((size) << 16))
由上分析可知_IOC宏把四个参数拼成了一个32位的数字,该数字的组成如下
所以#define IOCTL_GPIO_GETVALUE _IOR(GPIO_IOC_MAGIC, 3, int)语句设置IOCTL_GPIO_GETVALUE的值为
2.MKDEV,MAJOR,MINOR
定义:
#define MINORBITS 20
#define MINORMASK ((1U << MINORBITS) - 1)
#define MAJOR(dev) ((unsigned int) ((dev) >> MINORBITS))
#define MINOR(dev) ((unsigned int) ((dev) & MINORMASK))
#define MKDEV(ma,mi) (((ma) << MINORBITS) | (mi))
所以dev设备号的结构