Linux驱动开发(8)——静态和动态申请字符设备

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/kakascx/article/details/83416619

先贴一段demo

#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>

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;
}

字符设备函数在文件“include/linux/fs.h”中,内核提供了三个函数来注册一组字符设备编号。

  • register_chrdev_region()是提前知道设备的主次设备号,再去申请设备
    号,也是demo中使用的函数

  • extern int register_chrdev_region(dev_t , unsigned, const char *);
    - 参数1:dev_t类型,通过MKDEV得到的设备号
    - 参数2:设备数量
    - 参数3:设备名称

  • alloc_chrdev_region() 是动态分配主次设备号
    - int alloc_chrdev_region(dev_t *, unsigned, unsigned, const char *);
    - 参数1:dev_t *通过MKDEV得到的设备号,注意是指针类型,&num_dev取得
    - 参数2:次设备号
    - 参数3:设备数量
    - 参数4:设备名称

  • register_chrdev()。是老版本的设备号注册方式,只分配主设备号。从
    设备号在mknod的时候指定

宏定义MKDEV在头文件“include/linux/kdev_t.h中。在kdev_t.h头文件中有一系列设备号处理的宏命令,用于处理各种设备号
相关的数据。

include/linux/cdev.h是定义字符设备的结构体。cdev类型是是字符设备描述的结构

另外说明:使用命令“cat /proc/devices”查看已经被注册的主设备

猜你喜欢

转载自blog.csdn.net/kakascx/article/details/83416619