閱讀817 返回首頁    go 阿裏雲 go 技術社區[雲棲]


linux驅動開發--字符設備:動態分配設備號

設備號的動態分配
int alloc_chrdev_region(dev_t *dev, unsigned baseminor, unsigned count, const char *name);
dev:保存分配到的設備號
baseminor:希望分配的起始次設備號
count:需要分配的設備號數目
name:設備名稱(出現在/proc/devices)
        返回:成功返回0, 失敗返回負值

請求內核動態分配count個設備號,且次設備號從baseminor開始

/**
*Copyright (c) 2013.TianYuan
*All rights reserved.
*
*文件名稱: char_device_driver02.c
*文件標識: 字符設備驅動 :動態分配設備號
*
*當前版本:1.0
*作者:wuyq 
*
*取代版本:xxx
*原作者:xxx
*完成日期:2013-11-26
*/
#include <linux/init.h>
#include <linux/module.h>
#include <linux/fs.h>

MODULE_LICENSE("GPL");
#define CDD_MAJOR	200//cat /proc/devices找一個尚未使用的
#define CDD_MINOR	0
#define CDD_COUNT	1
dev_t dev = 0;
u32 cdd_major = 0;
u32 cdd_minor = 0;

int __init cdd_init(void)
{
	int ret = 0;
	if(cdd_major){
		dev = MKDEV(CDD_MAJOR, CDD_MINOR);//生成設備號
		//注冊設備號;1、要注冊的起始設備號2、連續注冊的設備號個數3、名字
		ret = register_chrdev_region(dev, CDD_COUNT, "cdd_demo");
	}else{
		// 動態分配設備號
		ret = alloc_chrdev_region(&dev, cdd_minor, CDD_COUNT, "cdd_demo02");
	}
	
	if(ret < 0){
		printk("register_chrdev_region failed!\n");
		goto failure_register_chrdev;
	}
	//獲取主設備號
	cdd_major = MAJOR(dev);
	printk("cdd_major = %d\n", cdd_major);

	return 0;
failure_register_chrdev:
	return ret;
}

void __exit cdd_exit(void)
{
	//注銷設備號
	unregister_chrdev_region(dev, CDD_COUNT);
}	

module_init(cdd_init);
module_exit(cdd_exit);

KERNELDIR ?=/root/Desktop/work/ldd3/linux-2.6.31_TX2440A
PWD := $(shell pwd)
obj-m += char_device_driver02.o

default:
	$(MAKE) -C $(KERNELDIR) M=$(PWD) modules

clean:
	@rm -f *.o *.ord* *.sy* *.mod.* *.ko


最後更新:2017-04-03 12:54:00

  上一篇:go linux驅動開發--內核定時器
  下一篇:go viewgroup實現item拖動效果