羅東華,李海崗,王忠民
(1.山東傳媒職業學院信息工程系,山東濟南250200;2.72946部隊,山東淄博255000;3.山東省科學院自動化研究所,山東濟南250014)
隨著計算機控制技術的不斷發展,嵌入式系統已經廣泛滲透到儀器儀表、工業控制等各個領域,成為備受關注的熱點[1].而Linux作為一個源碼公開、結構清晰、功能強大,且穩定可靠的操作系統,在嵌入式系統中占據主流位置[2].在工業控制與監測領域,溫度監控是一項必不可少的功能模塊.文中介紹了基于模擬量傳輸的溫度傳感器在Linux系統下驅動程序的開發方法,闡述了可動態加載的設備驅動程序的配置、設計和調試步驟.
驅動程序的目的是驅動硬件正常工作,所以編寫驅動程序要針對特定的硬件來進行.Linux設備驅動程序是為特定的硬件提供給應用程序的一組標準化接口,它隱藏了設備工作的細節.設備驅動程序從總體上看分為兩部分:驅動程序與Linux內核的接口、驅動程序與設備的接口[3].其代碼結構大致可以分為如下幾個部分:驅動程序的注冊與注銷、設備的打開與釋放、設備的讀寫操作、設備的控制操作、設備的中斷和輪詢處理[4].
Liunx系統的設備分為三種類型:字符設備、塊設備和網絡設備.基于模數轉換模塊(ADC)的溫度傳感器屬于字符設備,其實現流程包括設備的注冊,文件操作結構體(file_operations)賦值,以及編寫文件操作結構體中用到的函數.模數轉換模塊功能非常簡單,所以在文件操作結構體中只需要設置打開函數(open)、釋放函數(release)以及讀取函數(read)的指針,相應的僅需要實現open函數、release函數和read函數.


open函數提供給驅動程序以初始化的能力,主要工作內容如下:
1)檢查設備特定的錯誤(諸如設備未就緒或類似的硬件問題).
2)如果設備是首次打開,則對其進行初始化.
3)如果有必要,更新file_operations指針[5].在Linux系統用戶空間的應用程序中,如果要打開溫度傳感器設備,需要調用此內核函數(device_open).另外,還可以在此函數中使用一個全局變量,記錄設備打開次數,以標識設備是否為第一次打開.
release函數作用與open正好相反,它釋放由open分配的所有資源,并關閉設備.同樣的,記錄設備打開次數的全局變量需要在此函數中進行減操作.
read函數的作用是拷貝數據到應用程序空間,其表達式為:
static ssize_t device_read(struct file*file,char*buffer,size_t length,loff_t*offset)
參數file是文件指針,參數buffer是指向用戶空間的緩沖區,參數length是數據長度,參數loff_t是指向長偏移量類型(long offset type)對象的指針.該函數內部的程序流程圖如圖1所示.

圖1 read函數程序流程圖
read函數還檢查用戶空間的指針是否有效,如果指針無效,就不會進行拷貝;如果在拷貝過程中遇到無效地址,則僅僅會復制部分數據.
驅動程序編寫完成后,還需要建立該程序的makefile文件,代碼如下:


其中,obj-m是生成目標文件的名稱,KERNELDIR是內核路徑.
有了adcdriver.c和makefile文件,使用make命令即可得到驅動文件adcdriver.ko.然后使用insmod命令動態加載驅動程序,基于模數轉換模塊的溫度傳感器驅動就加載進了Linux內核中.
為了測試該驅動程序,需要編寫Linux系統用戶空間下的應用程序adc.c,程序流程圖如圖2所示.

圖2 應用程序adc.c的流程圖
在Linux的用戶空間運行此應用程序,能夠得到嵌入式處理器S3C2440模數轉換模塊的有效數據,根據溫度傳感器模擬量數值與溫度的對應關系,即可獲取外部環境溫度.
文中介紹了Linux操作系統下驅動程序的基本原理和框架,編寫了基于模數轉換模塊(ADC)的溫度傳感器的驅動程序和應用程序,并給出實際項目中的操作步驟,對實現同類芯片的其他硬件驅動有很好的參考價值.
[1] 張威,黃沖.嵌入式Linux設備驅動的設計方法研究[J] .江西師范大學學報:自然科學版,2007,31(4):391-393.
[2] 巍鶩,張煥強,方貴明.基于Linux的USB驅動程序實現[J] .計算機應用,2002,22(8):17-19.
[3] 李亞峰,歐文盛.ARM嵌入式Linux系統開發從入門到精通[M] .北京:清華大學出版社,2007.
[4] 陳濤,余學才,朱良銷.信號發生模塊的Linux驅動程序設計[J] .化工自動化及儀表,2010,37(11):88-91.
[5] Corbet J,Rubini A,Hartman G K.Linux設備驅動程序[M] .北京:中國電力出版社,2006.