閱讀145 返回首頁    go 技術社區[雲棲]


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

字符設備(char device)

        采用字節流方式訪問的設備稱為字符設備,通常智能采用順序訪問方式,也有極少數可以前後移動訪問指針的設備(如:幀捕捉卡等設備)。係統標準字符設備,例如:字符中斷、串口等設備。常見待開發設備驅動的字符設備,例如:觸摸屏、鍵盤、視頻捕捉設備、音頻設備等。


設備號
主設備號
    用於標識設備類型,內核代碼根據該號碼對應設備文件和對應的設備驅動程序
次設備號
    用於標識通類型的不同設備個體,驅動程序根據該號碼辨別具體操作的是哪個設備個體。

設備號數據類型
   dev_t 本質是一個unsigned int 數據類型, 高12位是主設備號,低20位是次設備號。<linux/kdev_t.h>
提取主設備號宏
    unsigned int MAJOR(dev_t dev);
提取次設備號宏
    unsigned int MINOR(dev_t dev);
合成設備號宏
   dev_t MKDEV(unsigned int ma, unsigned int mi);

設備號的靜態分配
內核源代碼Documentation/devices.txt文件
該文件列出本內核源代碼發行包中已經被使用和可以使用的主設備號
在devices.txt中尋找可用的主設備號。

int register_chrdev_region(dev_t from, unsigned count, const char *name);
from:待申請的設備號
count:待申請的設備號數目
name:設備名稱(出現在/proc/devices)
返回:成功返回0,失敗返回負值。
向內核申請從from開始的count個設備號(數設備號不變,次設備號增加)

/**
*Copyright (c) 2013.TianYuan
*All rights reserved.
*
*文件名稱: char_device_driver.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;

int __init cdd_init(void)
{
	int ret = 0;
	//dev = CDD_MAJOR<<20 + CDD_MINOR;
	dev = MKDEV(CDD_MAJOR, CDD_MINOR);//生成設備號
	//注冊設備號;1、要注冊的起始設備號2、連續注冊的設備號個數3、名字
	ret = register_chrdev_region(dev, CDD_COUNT, "cdd_demo");
	if(ret < 0){
		printk("register_chrdev_region failed!\n");
		goto failure_register_chrdev;
	}
	printk("register_chrdev_region successed! #cat /proc/devices\n");
	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_driver.o

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

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


最後更新:2017-04-03 12:53:59

  上一篇:go Beanstalkd隊列 概述
  下一篇:go android VPN編程