羅東華,李海崗,王忠民
(1.山東傳媒職業(yè)學(xué)院信息工程系,山東濟南250200;2.72946部隊,山東淄博255000;3.山東省科學(xué)院自動化研究所,山東濟南250014)
隨著計算機控制技術(shù)的不斷發(fā)展,嵌入式系統(tǒng)已經(jīng)廣泛滲透到儀器儀表、工業(yè)控制等各個領(lǐng)域,成為備受關(guān)注的熱點[1].而Linux作為一個源碼公開、結(jié)構(gòu)清晰、功能強大,且穩(wěn)定可靠的操作系統(tǒng),在嵌入式系統(tǒng)中占據(jù)主流位置[2].在工業(yè)控制與監(jiān)測領(lǐng)域,溫度監(jiān)控是一項必不可少的功能模塊.文中介紹了基于模擬量傳輸?shù)臏囟葌鞲衅髟贚inux系統(tǒng)下驅(qū)動程序的開發(fā)方法,闡述了可動態(tài)加載的設(shè)備驅(qū)動程序的配置、設(shè)計和調(diào)試步驟.
驅(qū)動程序的目的是驅(qū)動硬件正常工作,所以編寫驅(qū)動程序要針對特定的硬件來進行.Linux設(shè)備驅(qū)動程序是為特定的硬件提供給應(yīng)用程序的一組標準化接口,它隱藏了設(shè)備工作的細節(jié).設(shè)備驅(qū)動程序從總體上看分為兩部分:驅(qū)動程序與Linux內(nèi)核的接口、驅(qū)動程序與設(shè)備的接口[3].其代碼結(jié)構(gòu)大致可以分為如下幾個部分:驅(qū)動程序的注冊與注銷、設(shè)備的打開與釋放、設(shè)備的讀寫操作、設(shè)備的控制操作、設(shè)備的中斷和輪詢處理[4].
Liunx系統(tǒng)的設(shè)備分為三種類型:字符設(shè)備、塊設(shè)備和網(wǎng)絡(luò)設(shè)備.基于模數(shù)轉(zhuǎn)換模塊(ADC)的溫度傳感器屬于字符設(shè)備,其實現(xiàn)流程包括設(shè)備的注冊,文件操作結(jié)構(gòu)體(file_operations)賦值,以及編寫文件操作結(jié)構(gòu)體中用到的函數(shù).模數(shù)轉(zhuǎn)換模塊功能非常簡單,所以在文件操作結(jié)構(gòu)體中只需要設(shè)置打開函數(shù)(open)、釋放函數(shù)(release)以及讀取函數(shù)(read)的指針,相應(yīng)的僅需要實現(xiàn)open函數(shù)、release函數(shù)和read函數(shù).
open函數(shù)提供給驅(qū)動程序以初始化的能力,主要工作內(nèi)容如下:
1)檢查設(shè)備特定的錯誤(諸如設(shè)備未就緒或類似的硬件問題).
2)如果設(shè)備是首次打開,則對其進行初始化.
3)如果有必要,更新file_operations指針[5].在Linux系統(tǒng)用戶空間的應(yīng)用程序中,如果要打開溫度傳感器設(shè)備,需要調(diào)用此內(nèi)核函數(shù)(device_open).另外,還可以在此函數(shù)中使用一個全局變量,記錄設(shè)備打開次數(shù),以標識設(shè)備是否為第一次打開.
release函數(shù)作用與open正好相反,它釋放由open分配的所有資源,并關(guān)閉設(shè)備.同樣的,記錄設(shè)備打開次數(shù)的全局變量需要在此函數(shù)中進行減操作.
read函數(shù)的作用是拷貝數(shù)據(jù)到應(yīng)用程序空間,其表達式為:
static ssize_t device_read(struct file*file,char*buffer,size_t length,loff_t*offset)
參數(shù)file是文件指針,參數(shù)buffer是指向用戶空間的緩沖區(qū),參數(shù)length是數(shù)據(jù)長度,參數(shù)loff_t是指向長偏移量類型(long offset type)對象的指針.該函數(shù)內(nèi)部的程序流程圖如圖1所示.
圖1 read函數(shù)程序流程圖
read函數(shù)還檢查用戶空間的指針是否有效,如果指針無效,就不會進行拷貝;如果在拷貝過程中遇到無效地址,則僅僅會復(fù)制部分數(shù)據(jù).
驅(qū)動程序編寫完成后,還需要建立該程序的makefile文件,代碼如下:
其中,obj-m是生成目標文件的名稱,KERNELDIR是內(nèi)核路徑.
有了adcdriver.c和makefile文件,使用make命令即可得到驅(qū)動文件adcdriver.ko.然后使用insmod命令動態(tài)加載驅(qū)動程序,基于模數(shù)轉(zhuǎn)換模塊的溫度傳感器驅(qū)動就加載進了Linux內(nèi)核中.
為了測試該驅(qū)動程序,需要編寫Linux系統(tǒng)用戶空間下的應(yīng)用程序adc.c,程序流程圖如圖2所示.
圖2 應(yīng)用程序adc.c的流程圖
在Linux的用戶空間運行此應(yīng)用程序,能夠得到嵌入式處理器S3C2440模數(shù)轉(zhuǎn)換模塊的有效數(shù)據(jù),根據(jù)溫度傳感器模擬量數(shù)值與溫度的對應(yīng)關(guān)系,即可獲取外部環(huán)境溫度.
文中介紹了Linux操作系統(tǒng)下驅(qū)動程序的基本原理和框架,編寫了基于模數(shù)轉(zhuǎn)換模塊(ADC)的溫度傳感器的驅(qū)動程序和應(yīng)用程序,并給出實際項目中的操作步驟,對實現(xiàn)同類芯片的其他硬件驅(qū)動有很好的參考價值.
[1] 張威,黃沖.嵌入式Linux設(shè)備驅(qū)動的設(shè)計方法研究[J] .江西師范大學(xué)學(xué)報:自然科學(xué)版,2007,31(4):391-393.
[2] 巍鶩,張煥強,方貴明.基于Linux的USB驅(qū)動程序?qū)崿F(xiàn)[J] .計算機應(yīng)用,2002,22(8):17-19.
[3] 李亞峰,歐文盛.ARM嵌入式Linux系統(tǒng)開發(fā)從入門到精通[M] .北京:清華大學(xué)出版社,2007.
[4] 陳濤,余學(xué)才,朱良銷.信號發(fā)生模塊的Linux驅(qū)動程序設(shè)計[J] .化工自動化及儀表,2010,37(11):88-91.
[5] Corbet J,Rubini A,Hartman G K.Linux設(shè)備驅(qū)動程序[M] .北京:中國電力出版社,2006.