设备号
linux 每个设备都有主次设备号
主设备:表示某一个具体的驱动
次设备号:表示使用这个驱动的各个设别
//path: include/linux/types.h
//dev_t 表示定义了设备号
typedef __u32 __kernel_dev_t;
typede __kernel_dev_t dev_t;
//path: include/uapi/asm-generic/int-ll64.h
typedef unsigned int __u32;
其中,高 12 位为主设备号 0~4095 为主设备号范围,后 20 位为次设备号
//path: include/linux/kdev_t.h
#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))
MINORBITS 次设备号位数,一共 20 bit
MINORMASK 次设备掩码
MAJOR 从 dev_t 获取主设备号,将 dev_t 右移 20 即刻
MINOR 从 dev_t 获取次设备号,取 dev_t 低 20 位即可
MKDEV 将给定的主设备号和次设备号的值组合成 dev_t 类型的设备号
设备号的分配
1 静态分配 就是直接分配
具体:Documentation/devices.txt
2 动态分配设备号
申请设备号
int alloc_chrdev_region(dev_t *dev, unsigned baseminor, unsigned count, const char *name)
dev 保存申请到的设备号
baseminor 次设备号起始地址,一般为了 0
count: 申请的设备号数量
name: 名称
释放设备号
void unregister_chrdev_region(dev_t from, unsigned count)
from 设备号
count 要释放的设备号的数据量