动态申请设备号

只学习怎么申请设备号。暂时没什么用。

  • 挂载设备
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);