linux 动态申请字符类设备号

字符设备函数在文件include/linux/fs.h

alloc_chrdev_region() 是动态分配主次设备号。

宏定义MAJOR提取dev_t数据中的主设备号

编写,编译

加载运行

使用命令cat /proc/devices查看

动态加载模块之后再查看设备号

#include <linux/init.h>
#include <linux/module.h>/*module license  GPL 申明*/
#include <linux/fs.h>//包含 register_chrdev_region(); alloc_chrdev_region() unregister_region();
#include <linux/kdev_t.h>//包含MKDEV
#include <linux/cdev.h>//包含dev_t
#include <linux/moduleparam.h>//定义module_param module_param_array的头文件
#include <linux/stat.h>


#define DEVICE_NAME "FXQ_DEV"
#define DEVICE_MINOR_NUM  2
#define DEV_MAJOR 0
#define DEV_MINOR 0

MODULE_LICENSE("Dual BSD/GPL");
MODULE_AUTHOR("FXQ");

//static int module_arg1,module_arg2;
//static int int_array[50];
//static int int_num;


int numdev_major=DEV_MAJOR;//主设备号
int numdev_minor=DEV_MINOR;//次设备号

//参数传递                  
//参数,参数类型,所有者权限
//输入主设备号,次设备号
//module_param(numdev_major,int,S_IRUSR);
//module_param(numdev_minor,int,S_IRUSR);
//module_param_array(int_array,int,&int_num,S_IRUSR);

static int
fxq_dev_init(void)

{
int ret;
dev_t fxq_num_dev;

if(numdev_major)//手动输入主设备号

{

printk(KERN_EMERG "numdev_major is %d!\n",numdev_major);
   printk(KERN_EMERG "numdev_minor is %d!\n",numdev_minor);           //打印设备号

fxq_num_dev =MKDEV(numdev_major,numdev_minor);  
ret=register_chrdev_region(fxq_num_dev,DEVICE_MINOR_NUM,DEVICE_NAME);//注册设备,设备名字numdev_minor,DEVICE_MINOR_NUM,
}
else //自动获取设备号
{
ret=alloc_chrdev_region(&fxq_num_dev,numdev_minor,DEVICE_MINOR_NUM,DEVICE_NAME);
     }

if(ret<0) //申请失败
{
printk(KERN_EMERG "register_chrdev_region  register  failed!\n");

}
else      //申请成功
{      
       numdev_major =MAJOR(fxq_num_dev);
printk(KERN_EMERG "alloc_chrdev_region register  %d is successful!\n",numdev_major);
}

return 0;

}

static void fxq_dev_exit(void)
{
printk(KERN_EMERG "fxq_dev_exit!\n");
unregister_chrdev_region(MKDEV(numdev_major,numdev_minor),DEVICE_MINOR_NUM);

}

module_init(fxq_dev_init);/*初始化函数*/
module_exit(fxq_dev_exit);


/*卸载函数*/


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值