Linux驱动开发:设备号
Posted Top嵌入式
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux驱动开发:设备号相关的知识,希望对你有一定的参考价值。
文章目录
Linux驱动开发:设备号
一、设备号组成
Linux 中每个设备都有一个设备号,分为:
- 主设备号:表示某一个具体的驱动
- 次设备号:表示使用这个驱动的各个设备
Linux 内核代码中使用 dev_t 这个 u32 数据类型表示设备号
typedef __u32 __kernel_dev_t;
typedef __kernel_dev_t dev_t;
这 32 位整型变量高 12 位为主设备号,低 20 位为次设备号
内核提供了一些代码用于操作设备号变量
#define MAJOR(dev) ((unsigned int) ((dev) >> MINORBITS))
#define MINOR(dev) ((unsigned int) ((dev) & MINORMASK))
#define MKDEV(ma,mi) (((ma) << MINORBITS) | (mi))
- MAJOR 用于从 dev_t 中获取主设备号
- MINOR 用于从 dev_t 中获取次设备号
- MKDEV 用于将给定的主设备号和次设备号的值组合成 dev_t 类型的设备号
二、设备号分配
上面知道了设备号的基本知识,在注册设备的时候需要给设备分配一个设备号,设备号的分配有两种方式,静态分配和动态分配
- 静态设备号分配:设备号的分配由驱动开发者静态指定设备号,分配可能产生设备号冲突
- 动态设备号分配:设备号的分配由系统自动分配一个没有被使用的设备号,避免了设备号冲突
推荐使用动态设备号分配,分配函数如下:
int alloc_chrdev_region(dev_t *dev, unsigned baseminor, unsigned count, const char *name)
参数 | 功能 |
---|---|
dev | 保存申请到的设备号 |
baseminor | 次设备号起始地址 |
count | 要申请的设备号数量 |
name | 设备名字 |
注销设备后要释放掉设备号,释放函数如下:
void unregister_chrdev_region(dev_t from, unsigned count)
参数 | 功能 |
---|---|
from | 要释放的设备号 |
count | 从 from 开始,要释放的设备号数量 |
以上是关于Linux驱动开发:设备号的主要内容,如果未能解决你的问题,请参考以下文章