动态申请设备号
只学习怎么申请设备号。暂时没什么用。
- 挂载设备
insmod 002_alloc_chrdev.ko
- 查看
root@docker:~/driver_std/002_alloc_char_dev# lsmod
Module Size Used by
004_alloc_chrdev 16384 0
root@docker:~/driver_std/002_alloc_char_dev# cat /proc/devices
Character devices:
236 my_chrdev #(设备名称)
代码:002_alloc_chrdev.c
#include <linux/module.h>
#include <linux/fs.h>
#include <linux/init.h>
#include <linux/kdev_t.h>
#include <linux/moduleparam.h>
//主设备号
static int major = 0;
module_param(major, int, S_IRUGO);
//次设备号
static int minor = 0;
module_param(minor, int, S_IRUGO);
//设备名称
static char* name = "my_chrdev";
MODULE_LICENSE("GPL");
MODULE_AUTHOR("wyl");
MODULE_DESCRIPTION("alloc_chrdev");
static dev_t dev_no; //设备号:32位unsigned int,主设备号(前12位)+次设备号(后20位)
static int moduleparam_init(void)
{
int ret;
// 分配设备号:如果指定了major则使用register_chrdev_region,否则自动分配
if (major) {
dev_no = MKDEV(major, minor);
ret = register_chrdev_region(dev_no, 1, name);
printk(KERN_INFO "Using specified major=%d, minor=%d\n", major, minor);
} else {
ret = alloc_chrdev_region(&dev_no, 0, 1, name);
major = MAJOR(dev_no); //获取主设备号
minor = MINOR(dev_no); //获取次设备号
printk(KERN_INFO "Auto allocated major=%d, minor=%d\n", major, minor);
}
if (ret < 0) {
printk(KERN_ALERT "Failed to allocate device number: %d\n", ret);
return ret;
}
printk(KERN_INFO "Device number allocation success\n");
return 0;
}
static void moduleparam_exit(void)
{
unregister_chrdev_region(dev_no, 1);
printk(KERN_INFO "unregister_chrdev_region success\n");
}
module_init(moduleparam_init);
module_exit(moduleparam_exit);