一、
<include/linux/fs.h >
int register_chrdev_region(dev_t from, unsigned count, const char *name);
函数用于已知起始设备的设备号的情况 ;要先查看cat /proc/devices去查看没有使用的
from:要分配的设备编号范围的初始值, 这组连续设备号的起始设备号, 相当于register_chrdev()中主设备号
Count:连续编号范围. 是这组设备号的大小(也是次设备号的个数)
Name:编号相关联的设备名称. (/proc/devices); 本组设备的驱动名称
<linux/kdev_t.h>
为获得一个 dev_t 的主或者次编号
MAJOR(dev_t dev);
MINOR(dev_t dev);
相反, 如果你有主次编号, 需要将其转换为一个 dev_t, 使用:
MKDEV(int major, int minor);
#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 "sscdev" #define DEVICE_MINOR_NUM 2 #define DEV_MAJOR 0 #define DEV_MINOR 0 MODULE_LICENSE("Dual BSD/GPL"); /*声明是开源的,没有内核版本限制*/ MODULE_AUTHOR("iTOPEET_dz"); /*声明作者*/ int numdev_major = DEV_MAJOR; int numdev_minor = DEV_MINOR; /*输入主设备号*/ module_param(numdev_major,int,S_IRUSR); /*输入次设备号*/ module_param(numdev_minor,int,S_IRUSR); static int scdev_init(void) { int ret = 0; dev_t num_dev; printk(KERN_EMERG "numdev_major is %d!\n",numdev_major); printk(KERN_EMERG "numdev_minor is %d!\n",numdev_minor); if(numdev_major){ num_dev = MKDEV(numdev_major,numdev_minor); ret = register_chrdev_region(num_dev,DEVICE_MINOR_NUM,DEVICE_NAME); } else{ printk(KERN_EMERG "numdev_major %d is failed!\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,numdev_minor),DEVICE_MINOR_NUM); } module_init(scdev_init); /*初始化函数*/ module_exit(scdev_exit); /*卸载函数*/
使用命令“cat /proc/devices”查看已经被注册的主设备,设备号9没有被注册
insmod /mnt/udisk/request_cdev_num.ko numdev_major=9 numdev_minor=0
使用命令“cat /proc/devices”查看,设备号9被注册为scdev
rmmod request_cdev_num numdev_major=9 numdev_minor=0
二、
int alloc_chrdev_region(dev_t *dev, unsigned baseminor, unsigned count,
const char *name);
void unregister_chrdev_region(dev_t from, unsigned count);
register_chrdev() 是老版本的设备号注册方式,只分配主设备号。从
设备号在mknod的时候指定