泰山派4--编写驱动中的申请字符类设备号

老小孩
原创
发布时间: 2025-06-14 15:31:14 | 阅读数 0收藏数 0评论数 0
封面
编写驱动中,申请设备号的两种方法,一种是静态申请,一种是动态申请,一般情况下都是用动态申请的方法。

准备工作:

材料:

  1. 一台装有Linux虚拟机的PC
  2. 一个泰山派开发板
  3. 一个串口烧录器CH341
1

设备号的操作轮廓

在Linux中操作设备号需要两个头文件:

#include <linux/cdev.h>

#include <linux/fs.h>

设备号是分为主设备号和副设备号两部分,主设备号是用来区分不同类别的设备,次设备号是区分同类设备中的不同设备个体,设备号的数据类型是 dev_t, 也就是一个32位的无符号整型(unsigned int),它高12位表示主设备号,低20位表示次设备号。

在Linux内核中提供了操作设备号的3个宏:

1.MAJOR(设备号):通过设备号获取主设备号。

2.MINOR(设备号):通过设备号获取次设备号。

3.MKDEV(设备号):通过主设备号和副设备号合成设备号。

使用函数 alloc_chrdev_region 向系统动态申请设备号,差不多就是自动申请的意思:

int alloc_chrdev_region(dev_t * , unsigned, unsigned, const char *) ;

这个函数一共四个参数:1. dev_t * :表示获取到设备号后需要存放的位置指针。

2. unsigned :次设备号的开始号,就是从几开始,一般默写0。

3. unsigned :你需要的设备号的个数,就是你想申请几个设备。

4. const char *:你申请的这些设备号的名字。

注销设备号用的函数是:unregister_chrdev_region(dev_t, unsigned); 第一个参数就是你想注销的设备号,第二个参数是注销的设备个数。

2

编写驱动.c文件

这次在上几篇驱动中的框架基础上进行编写:

#include <linux/module.h>
#include <linux/init.h>
#include <linux/fs.h>
#include <linux/kdev_t.h>


static int major=0; //储存驱动主设备号变量
static int minor=0; //储存驱动副设备号变量

dev_t dev_num; //储存设备号变量

static int moduleparam_init(void){ //驱动加载函数

int ret;

ret=alloc_chrdev_region(&dev_num,0,1,"dev_name"); //静态申请驱动设备号部分
if(ret<0){
printk("get is error\n");
}
printk("get is ok\n");
major = MAJOR(dev_num); //获取驱动主设备号部分
minor = MINOR(dev_num); //获取驱动副设备号部分
printk("major is %d\n", major); //打印主设备号
printk("minor is %d\n", minor); //打印副设备号
return 0;
}

static void moduleparam_exit(void) //驱动卸载函数
{
unregister_chrdev_region(dev_num,1); //删除驱动设备号函数
printk("bye bye\n");
}

module_init(moduleparam_init); //系统加载驱动框架函数
module_exit(moduleparam_exit); //系统卸载驱动框架函数

MODULE_LICENSE("GPL");
MODULE_AUTHOR("lxh");
MODULE_VERSION("V1.0");
C
dev_t.c
1.44KB
3

编写Makefile文件

这次在上几篇驱动中的框架基础上进行编写:

obj-m += dev_t.o
KDIR:=/home/wht/tspi/linux/kernel
PWD?=$(shell pwd)
all:
make -C $(KDIR) M=$(PWD) modules
echo $(PWD)
clean:
rm -f *.ko *.o *.mod.o *mod.c *.symvers *.order
4

编译

还按之前的套路。

5

在泰山派上测试

用insmod 命令加载模块,然后用命令cat查看 /proc/devices 下新建的设备号和名字。

阅读记录0
点赞0
收藏0
禁止 本文未经作者允许授权,禁止转载
猜你喜欢
评论/提问(已发布 0 条)
评论 评论
收藏 收藏
分享 分享
pdf下载 下载