新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 基于嵌入式Linux系統(tǒng)設(shè)備驅(qū)動(dòng)程序的開發(fā)

基于嵌入式Linux系統(tǒng)設(shè)備驅(qū)動(dòng)程序的開發(fā)

作者: 時(shí)間:2012-04-19 來源:網(wǎng)絡(luò) 收藏


當(dāng)初始化時(shí)將調(diào)用初始化函數(shù)int device_init( ),該函數(shù)包括以下內(nèi)容:

注冊(cè)所用設(shè)備。用設(shè)備號(hào)來標(biāo)識(shí)字符設(shè)備和塊設(shè)備。設(shè)備號(hào)分為主設(shè)備號(hào)和從設(shè)備號(hào),最終形成設(shè)備接點(diǎn)。設(shè)備節(jié)點(diǎn)在訪問字符設(shè)備和塊設(shè)備的設(shè)備時(shí)將使用。通常主設(shè)備號(hào)標(biāo)識(shí)設(shè)備對(duì)應(yīng)的,大多數(shù)設(shè)備是“一個(gè)主設(shè)備號(hào)對(duì)應(yīng)一個(gè)”,如:虛擬控制臺(tái)和串口終端由驅(qū)動(dòng)程序4管理。次設(shè)備號(hào)由內(nèi)核使用,用于確定設(shè)備文件所指的設(shè)備。字符設(shè)備和塊設(shè)備注冊(cè)時(shí)必須先定義好設(shè)備號(hào)。

字符設(shè)備注冊(cè)函數(shù)如下:
int register_chrdev(unsigned int major ,const char *name, struct file_oprations *fops);
其中 major是主設(shè)備號(hào)。

由于對(duì)網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)程序的訪問不需要設(shè)備節(jié)點(diǎn),它的注冊(cè)函數(shù)如下:
int register_netdev(struct net_device *dev)

注冊(cè)設(shè)備所用的中斷。中斷在現(xiàn)代計(jì)算機(jī)結(jié)構(gòu)中有重要的地位,操作系統(tǒng)必須提供程序響應(yīng)中斷的能力。一般是把一個(gè)中斷處理程序注冊(cè)到系統(tǒng)中去。操作系統(tǒng)在硬件中斷發(fā)生后調(diào)用驅(qū)動(dòng)程序的處理程序。

注冊(cè)中斷所用的函數(shù)如下:
int request_irq (unsigned irq,void(*handler)(int,void*,struct pt_regs*),unsigned long flags,const char*device,void* dev_id);

其中,irq是中斷向量;handler是中斷處理函數(shù);flags是中斷處理中的掩碼;devices是設(shè)備名;dev_id是在中斷共享使用的id。

當(dāng)不使用該設(shè)備時(shí),就要調(diào)用清除函數(shù)void_devicie_exit ( ),它同初始化函數(shù)相對(duì)應(yīng)的,主要是:

注銷設(shè)備,字符設(shè)備注銷函數(shù)如下:
int unregister_chrdev(unsigned int major ,const char *name, struct file_oprations *fops);

注銷中斷,注銷中斷所用的函數(shù)如下:
int free_irq (unsigned irq,void(*handler)(int,void*,struct pt_regs*),unsigned long flags,const char*device,void* dev_id);

釋放資源,模塊初始化和清除函數(shù)采用module_init(device_init),module_exit(device_exit) 形式

編寫服務(wù)子程序

服務(wù)于I/O請(qǐng)求的子程序,又稱為驅(qū)動(dòng)程序的上半部分。調(diào)用這部分是由于系統(tǒng)調(diào)用的結(jié)果。這部分程序在執(zhí)行的時(shí)候.系統(tǒng)仍認(rèn)為是和進(jìn)行調(diào)用的進(jìn)程屬于同一個(gè)進(jìn)程. 只是用戶態(tài)變成了核心態(tài),具有進(jìn)行此系統(tǒng)調(diào)用的用戶程序的運(yùn)行環(huán)境.因此可以在其中調(diào)用sleep等與進(jìn)程運(yùn)行環(huán)境有關(guān)的函數(shù)。

中斷服務(wù)子程序,又稱為驅(qū)動(dòng)程序的下半部分。在Linux系統(tǒng)中.并不是直接從中斷向量表中調(diào)用設(shè)備驅(qū)動(dòng)程序的中斷服務(wù)子程序,而是由Linux系統(tǒng)來接收硬件中斷,再由系統(tǒng)調(diào)用中斷服務(wù)子程序。中斷可以產(chǎn)生在任何一個(gè)進(jìn)程運(yùn)行的時(shí)候,因此在中斷服務(wù)程序被調(diào)用的時(shí)候.不能依賴于仟何進(jìn)程的狀態(tài),也就不能調(diào)用任何與進(jìn)程運(yùn)行環(huán)境相關(guān)的函數(shù)。因?yàn)樵O(shè)備驅(qū)動(dòng)程序一般支持同一類型的若干設(shè)備,所以一般在系統(tǒng)調(diào)用中斷服務(wù)程序的時(shí)候,都帶有一個(gè)或多個(gè)參數(shù),以唯一標(biāo)識(shí)請(qǐng)求服務(wù)的設(shè)備。

設(shè)備驅(qū)動(dòng)程序的使用

直接將驅(qū)動(dòng)程序編譯進(jìn)linux內(nèi)核

將設(shè)備驅(qū)動(dòng)程序復(fù)制到 linux/drivers相關(guān)的子目錄下,比如字符設(shè)備驅(qū)動(dòng)程序 就放在linux/drivers/char下。

修改linux/drivers相關(guān)的子目錄的Makefile,
如obj-$(config_dev_driver) +=dev_driver.o,這樣在編譯內(nèi)核時(shí)將會(huì)編譯dev_driver.c,生成 dev_driver.o.

對(duì)內(nèi)核進(jìn)行重新編譯時(shí),進(jìn)行相關(guān)的配置,比如要使用AT91RM9200的UART,就要如下配置:
Character devices -> Serial drivers ->AT91RM9200 serial port support

將驅(qū)動(dòng)程序編譯成驅(qū)動(dòng)模塊

在設(shè)備驅(qū)動(dòng)程序中要有兩個(gè)重要函數(shù):
module_init(dev_init),module_exit(dev_exit)

利用相應(yīng)的交叉編譯器以及編譯命令將驅(qū)動(dòng)程序dev_driver.c編譯成dev_driver.o 這樣的動(dòng)態(tài)驅(qū)動(dòng)模塊。利用insmod命令給系統(tǒng)安裝驅(qū)動(dòng)模塊,如果在/dev目錄下沒有相應(yīng)的設(shè)備文件,就可以使用mknod創(chuàng)建一個(gè)設(shè)備文件。利用 rmmod命令卸載驅(qū)動(dòng)模塊,設(shè)備文件的刪除可以用rm命令。

結(jié)語

設(shè)備驅(qū)動(dòng)程序的開發(fā)是在Linux環(huán)境中最復(fù)雜的編程任務(wù)之一 。它需要和硬件打交道,容易引起系統(tǒng)崩潰,而且很難調(diào)試。掌握設(shè)備驅(qū)動(dòng)程序的開發(fā)技術(shù),將使得開發(fā)嵌入式Linux的系統(tǒng)更為迅速和有效。

參考文獻(xiàn):
1. AlessandroRubmi,JonathanCorbet.Linux設(shè)備驅(qū)動(dòng)程序,第3版,中國電力出版社,2006.2
2. 毛德操、胡希明,Linux內(nèi)核源代碼情景分析,浙江大學(xué)出版社,2001
3. 周立功、陳明記、陳渝,ARM嵌入式linux系統(tǒng)構(gòu)建與驅(qū)動(dòng)開發(fā),北京航空航天大學(xué)出版社,2006年1月第1版
4. 李祥兵、鄭扣根,Linux中I2C總線驅(qū)動(dòng)程序的開發(fā),計(jì)算機(jī)工程與設(shè)計(jì),2005;26(1)
5. 鄭偉、王欽若,Linux內(nèi)核空間設(shè)備驅(qū)動(dòng)程序的開發(fā),微計(jì)算機(jī)信息,2003;19(12)

linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)

linux相關(guān)文章:linux教程



上一頁 1 2 下一頁

評(píng)論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉