1. 程式人生 > >動態申請字元類裝置號

動態申請字元類裝置號

字元裝置函式在檔案 include/linux/fs.h 中

alloc_chrdev_region() 是動態分配主次裝置號

巨集定義MAJOR提取dev_t資料中的主裝置號

 

 編寫,編譯

測試原始碼:

#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"
#define DEVICE_MINOR_NUM 2
#define DEV_MAJOR 0
#define DEV_MINOR 0

MODULE_LICENSE("Dual BSD/GPL");
/*宣告是開源的,沒有核心版本限制*/
MODULE_AUTHOR("SKYFALL");
/*宣告作者*/

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("%s,%d\n",__func__,__LINE__);
	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
	{
		/*動態註冊裝置號*/
	
//int alloc_chrdev_region(dev_t *dev, unsigned baseminor, unsigned count,const char *name)
		ret = alloc_chrdev_region(&num_dev,numdev_minor,DEVICE_MINOR_NUM,DEVICE_NAME);
		/*獲得主裝置號*/
		numdev_major = MAJOR(num_dev);
		printk("%s,%d\n",__func__,__LINE__);
		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,numdev_minor),DEVICE_MINOR_NUM);
}


module_init(scdev_init);
/*初始化函式*/
module_exit(scdev_exit);
/*解除安裝函式*/

相應的Makefile檔案參考相關博文即可。

 

 載入執行

 

– 使用命令“cat /proc/devices”檢視

 

– 動態載入模組之後再檢視裝置號