前言:杂项设备驱动的主设备号是10,在/proc/devices文件中有 10 misc 就是杂项设备。那么字符设备就需要我们自己先申请一个主设备号。/dev目录下是设备节点。
注意:建议使用动态申请设备号
#include <linux/init.h>
#include <linux/module.h>
#include <linux/fs.h>
#include <linux/kdev_t.h>
static int major_num,minor_num;//定义主/次设备号,传参的时候只传递主设备号,次设备号默认是0
//向模块传参的函数
module_param(major_num,int,S_IRUSR);
module_param(minor_num,int,S_IRUSR);
static int hello_init(void)
{
//dev_t就是int类型,高12位是主设备号,低20位是次设备号
dev_t dev_num;
int ret;
//如果传入了主设备号(大于0),那么使用静态申请的方式申请设备号,否则使用动态申请
if(major_num > 0)
{
//将主次设备号合并成一个 dev_t类型的变量
dev_num = MKDEV(major_num,minor_num);
//静态申请一个字符设备号,参数:①设备号②次设备号的个数③设备名称(/proc/devices文件中有 如10 misc)
ret = register_chrdev_region(dev_num,1,"s_name");
if(ret == 0)
{
printk("静态申请成功\n");
}else{
printk("静态申请失败\n");
}
}else
{
//动态分配设备号,参数①dev_t设备号②次设备号的起始值③次设备号的个数④设备号名称
ret = alloc_chrdev_region(&dev_num,0,1,"d_name");
if(ret < 0)
{
printk("动态申请失败\n");
}else
{
printk("动态申请成功\n");
}
major_num = MAJOR(dev_num);//取出动态分配的主设备号
minor_num = MINOR(dev_num);//取出次设备号
}
printk("hello world\n");
return 0;
}
static void hello_exit(void)
{
//注销设备号,参数①dev_t设备号,②申请的次设备号的个数
unregister_chrdev_region(MKDEV(major_num,minor_num),1);
printk("bye bye\n");
}
module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("GPL");