| 引 言 隨著嵌入式系統(tǒng)及集成電路技術(shù)的飛速發(fā)展,針對移動手持終端的專用芯片獲得了長足發(fā)展。芯片的RAM和ROM的容量越大,在上面跑操作系統(tǒng)也越來越容易。Linux是當(dāng)今流行的操作系統(tǒng)之一。由于其內(nèi)核健壯、運行高效、源碼開放,并且Linux是免費的操作系統(tǒng),再加上其良好的可移植性等技術(shù)優(yōu)勢,使其已經(jīng)成為嵌入式操作系統(tǒng)的主流。設(shè)備驅(qū)動程序是Linux操作系統(tǒng)中的一個重要的組成部分,現(xiàn)在不斷升級的Linux內(nèi)核中,增加最多的就是驅(qū)動程序。由于Linux是開放源代碼的,給我們提供了一個絕好的機會來分析和改造設(shè)備驅(qū)動程序,使其滿足自己的特殊應(yīng)用,這樣在嵌入式產(chǎn)品中,就可以為自己特有的外圍設(shè)備編寫一個設(shè)備驅(qū)動程序。由于IrDA技術(shù)的蓬勃發(fā)展,提供了各種信息家電設(shè)備之間的無線連接的最佳選擇,紅外數(shù)據(jù)傳輸,成本低廉、連接方便、簡單易用、結(jié)構(gòu)緊湊,在小型嵌入式移動設(shè)備中也得到了廣泛的應(yīng)用。配備有紅外技術(shù)移動電話、個人數(shù)字助理、筆記本電腦都已登陸市場,因此,嵌入式設(shè)備的IrDA模塊的開發(fā)有著廣闊的市場前景。 本文將詳細講解基于Inte1的PXA255處理器的Sitsang開發(fā)平臺紅外模塊的設(shè)計,其中包括Linux下的IrDA驅(qū)動程序的開發(fā)和基于MC68HC908AP64紅外發(fā)射器的軟硬件設(shè)計兩個部分。 1 Linux下IrDA模塊的設(shè)計 1.1 Linux下的設(shè)備驅(qū)動程序簡介 系統(tǒng)調(diào)用是操作系統(tǒng)內(nèi)核和應(yīng)用程序之間的接口,驅(qū)動程序是操作系統(tǒng)內(nèi)核和機器硬件之間的接El,也是應(yīng)用層和實際硬件設(shè)備之間的軟件。一個驅(qū)動程序就是一個函數(shù)和數(shù)據(jù)結(jié)構(gòu)的集合,它的目的就是實現(xiàn)一個簡單的管理設(shè)備的接口。內(nèi)核用這個接口請求驅(qū)動程序控制設(shè)備的I/O操作。設(shè)備驅(qū)動程序為應(yīng)用程序屏蔽了硬件的細節(jié),這樣在應(yīng)用程序看來,硬件設(shè)備只是一個設(shè)備文件,應(yīng)用程序可以像操作普通文件一樣對硬件設(shè)備進行操作。Linux操作系統(tǒng)支持三種不同類型的設(shè)備,即字符設(shè)備、塊設(shè)備和網(wǎng)絡(luò)接口,相應(yīng)地有三種類型的設(shè)備驅(qū)動程序。本文主要討論字符型設(shè)備的驅(qū)動程序。設(shè)備驅(qū)動程序是內(nèi)核的一部分,主要完成以下的功能: ①對設(shè)備初始化和釋放; ②把數(shù)據(jù)從內(nèi)核傳送到硬件和從硬件讀取數(shù)據(jù); ③讀取應(yīng)用程序傳送給設(shè)備文件的數(shù)據(jù)和回送應(yīng)用程序請求的數(shù)據(jù); ④檢測和處理設(shè)備出現(xiàn)的錯誤。 由于應(yīng)用程序是通過設(shè)備文件同硬件打交道,對設(shè)備文件的操作方式不外乎就是一些系統(tǒng)調(diào)用,如open、read、write、close等等。Linux操作系統(tǒng)是通過一組固定的接口把系統(tǒng)調(diào)用和驅(qū)動程序關(guān)聯(lián)起來的。這組入口點是由每個設(shè)備的設(shè)備驅(qū)動程序組成了一個數(shù)據(jù)結(jié)構(gòu)來向系統(tǒng)提供的,它提供了字符型設(shè)備驅(qū)動程序所需的操作。這是一個非常關(guān)鍵的數(shù)據(jù)結(jié)構(gòu): struet file_operations{ struct modul*owner; loft t(*llseek)(struet file*10flf_t,int); ssize t(*read)(struct file*,char*,size_t,10ff_t); ssize tf*write)(struct file*,const char*size_t,10ff_t*); int f*readdir)(struct file*,void*,filldir_t); unsigned int(*poll)(struct file*,struct poll_table_struct*); int(*ioctl)(struct inode*.struct file*,unsigned int,unsigned long); int(*mmap)(struet file*,struct vm_area_struct*) int(*open)(struct inode*,stmct file*); int(*flush)(struct nle*); int(*release)(struct inode*,stmct file*); 這個結(jié)構(gòu)的每一個成員的名字都對應(yīng)著一個系統(tǒng)調(diào)月。應(yīng)用程序利用系統(tǒng)調(diào)用在對設(shè)備文件進行諸如read/write操作時,系統(tǒng)調(diào)用通過設(shè)備文件的主設(shè)備號找到相應(yīng)的設(shè)備驅(qū)動程序,然后讀取這個數(shù)據(jù)結(jié)構(gòu)相應(yīng)的函數(shù)指針,接著把控制權(quán)交給該函數(shù)。這是Linux的設(shè)備驅(qū)動程序工作的基本原理。既然是這樣,編寫設(shè)備驅(qū)動程序的主要工作就是編寫子函數(shù),并填充me_operations的各個域。多數(shù)情況下,只需為上面結(jié)構(gòu)中的少數(shù)方法編寫服務(wù)函數(shù),其它均設(shè)為NULL。 已經(jīng)提到,應(yīng)用程序是通過設(shè)備文件來與實際的硬件打交道的。每個設(shè)備文件都有其文件屬性(c/b),表示是字符設(shè)備還是塊設(shè)備。另外每個文件都有兩個設(shè)備號:第一個是主設(shè)備號,標(biāo)識驅(qū)動程序;第二個是從設(shè)備號,標(biāo)識使用同一個設(shè)備驅(qū)動程序的不同的硬件設(shè)備,比如有兩個軟盤,就可以用從設(shè)備號來區(qū)分它們。設(shè)備文件的主設(shè)備號必須與設(shè)備驅(qū)動程序在登記時申請的主設(shè)備號一致,否則用戶進程將無法訪問到驅(qū)動程序。 1.2 IrDA模塊驅(qū)動程序 IrDA是一種廉價、近距離、無線、低功耗、保密性強的通信技術(shù),適合于低成本、跨平臺、點對點高速數(shù)據(jù)連接,尤其是嵌入式系統(tǒng);主要應(yīng)用于無線數(shù)據(jù)傳輸,有時也用于無線網(wǎng)絡(luò)接入和近程遙控。IrDA制定了很多紅外通信協(xié)議,其中IrDA1.0協(xié)議基于異步收發(fā)器uART,最高通信速率在115 2kbps,簡稱sIR(Seria Infrared,串行紅外協(xié)議),采用3/1 6 ENDEC編/解碼機制。我們所要實現(xiàn)的就是基于sIR的IrDA驅(qū)動。它的發(fā)射強度與接收靈敏度因不同器件、不同應(yīng)用設(shè)計而強弱不一,使用時只能以半雙工方式進行紅外通信。 我們的設(shè)計思想是Sitsang板只作為接收端,而基于MC68HC908AP64紅外發(fā)射器作為發(fā)送端。其中file_operations結(jié)構(gòu)中的ioctl()函數(shù)可以進行發(fā)送或接收的狀態(tài)切換。原Sitsang板載Linux系統(tǒng)所帶的IrDA驅(qū)動程序是作為網(wǎng)絡(luò)部分編寫的,使用過于復(fù)雜,且在處理數(shù)據(jù)收發(fā)時需要做一些自己的處理和驗證規(guī)則,所以我們使用標(biāo)準串口在Linux下自己編寫了一個IrDA的設(shè)備驅(qū)動程序。這樣在使用時,可以根據(jù)自己的需要作相應(yīng)的更改,比較靈活。
|