20191017(28)ARM Linux 字符设备驱动(2)设备号申请释放

设备号

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 要释放的设备号的数据量

发布了120 篇原创文章 · 获赞 27 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/qq_24890953/article/details/102615177
今日推荐