《Linux驱动》动态申请字符设备号

来源:互联网 发布:南方大数据100指数评论 编辑:程序博客网 时间:2024/06/05 14:28
#include <linux/init.h>/*包含初始化宏定义的头文件,代码中的module_init和module_exit在此文件中*/#include <linux/module.h>/*包含初始化加载模块的头文件,代码中的MODULE_LICENSE在此头文件中*//*定义module_param module_param_array的头文件*/#include <linux/moduleparam.h>/*定义module_param module_param_array中perm的头文件*/#include <linux/stat.h>/*包含注册设备的函数*/#include <linux/fs.h>/*MKDEV转换设备号数据类型的宏定义*/#include <linux/kdev_t.h>/*定义字符设备的结构体*/#include <linux/cdev.h>#define DEVICE_NAME "ascdev"MODULE_LICENSE("Dual BSD/GPL");/*声明是开源的,没有内核版本限制*/MODULE_AUTHOR("HerGhost");/*声明作者*/int numdev_major;static int scdev_init(void){    int ret = 0;    dev_t num_dev;        /*动态注册设备号*/        /*        申请设备号:        register_chrdev_region(dev_t first,unsigned int count,char *name)        First :要分配的设备编号范围的初始值(次设备号常设为0);        Count:连续编号范围.        Name:编号相关联的设备名称. (/proc/devices);        动态分配:        Int alloc_chrdev_region(dev_t *dev,unsigned int firstminor,unsigned int count,char *name);        Firstminor : 通常为0;        *dev:存放返回的设备号;        count:连续编号范围.          这个意思说假如major是248,count是2的话,249也就是相当于被使用的了.        成功返回0,失败返回-1;*/        ret = alloc_chrdev_region(&num_dev,0,2,DEVICE_NAME);        /*获得主设备号*/        numdev_major = MAJOR(num_dev);        printk(KERN_EMERG "adev_region req %d !\n",numdev_major);    if(ret<0){        printk(KERN_EMERG "register_chrdev_region req %d is failed!\n",numdev_major);           }    printk(KERN_EMERG "scdev_init!\n");    /*打印信息,KERN_EMERG表示紧急信息*/    return 0;}static void scdev_exit(void){    printk(KERN_EMERG "scdev_exit!\n");    unregister_chrdev_region(MKDEV(numdev_major,0),2);}module_init(scdev_init);/*初始化函数*/module_exit(scdev_exit);/*卸载函数*/
1 0
原创粉丝点击