當前位置:首頁 > 嵌入式 > 嵌入式軟件
[導讀]IrDA模塊與HCG8HC908AP64的紅外系統(tǒng)設(shè)計

引 言
    隨著嵌入式系統(tǒng)及集成電路技術(shù)的飛速發(fā)展,針對移動手持終端的專用芯片獲得了長足發(fā)展。芯片的RAM和ROM的容量越大,在上面跑操作系統(tǒng)也越來越容易。Linux是當今流行的操作系統(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è)備號,標識驅(qū)動程序;第二個是從設(shè)備號,標識使用同一個設(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ī)則,所以我們使用標準串口在Linux下自己編寫了一個IrDA的設(shè)備驅(qū)動程序。這樣在使用時,可以根據(jù)自己的需要作相應(yīng)的更改,比較靈活。
    在IrDA驅(qū)動程序中主要實現(xiàn)了s_r_read()、s_r_write()、siLopen()、sir_close()、siLioctl()及sir_handle_irq()中斷處理程序六個函數(shù)。相應(yīng)的接口結(jié)構(gòu)如下所示:
    static struct file_operations siLfops={
    ioctl: sir ioctl,
    read: siread,
    write: sir_write,
    open: slr_open,
    release:sir close

1.2.1 sir_handle_irq函數(shù)
    用戶空間進程通過接口函數(shù)進入到內(nèi)核,內(nèi)核再調(diào)用驅(qū)動程序相應(yīng)的I/O函數(shù)。IrDA驅(qū)動程序是字符類型的驅(qū)動程序,我們用中斷的方式實現(xiàn)內(nèi)核與設(shè)備之間的數(shù)據(jù)傳輸。當驅(qū)動程序在啟動后設(shè)備就掛起自己,直到串口完成操作并發(fā)出一個中斷請求(IRQ)。當IRQ產(chǎn)生時,注冊的中斷處理程序sir_handlejrq得以運行。在Sir_handle_irq中,程序通過相應(yīng)的寄存器操作得到接收的數(shù)據(jù),并將數(shù)據(jù)存入到一個內(nèi)部緩沖中。
1.2.2 sir open和sir_cIose函數(shù)
    sir_open函數(shù)的主要功能就是遞增使用計數(shù)和設(shè)備初始化操作。這里把設(shè)置并初始化sitsang板上的紅外設(shè)備放在了sir_open函數(shù)中,這樣在每次打開IrDA設(shè)備時,紅外設(shè)備都會被正確地設(shè)置,確保了紅外硬件的正常工作。另外,把申請設(shè)備中斷號的工作也放到了Sir_open函數(shù)中,這樣IrDA設(shè)備所占用的中斷號,在沒有使用IrDA設(shè)備時也可以被其它設(shè)備共享。
static int sir sopen(struct inode*inode,struet *filp){
    計數(shù)器加1;
    申請設(shè)備中斷號;
    設(shè)置Sitsang板上的紅外設(shè)備并初始化;
}
    sir_close()函數(shù)所作的工作與sir_open()的正好相反,計數(shù)器減1,注銷設(shè)備中斷號。
1.2.3 sir_ioctl函數(shù)
    由于所使用的紅外收發(fā)器HSDL-3200只能以半雙工方式進行紅外通信,所以就需要命令進行接收和發(fā)送狀態(tài)的轉(zhuǎn)換。ioctl函數(shù)的主要功能就是對硬件設(shè)備進行控制,因此在sir—ioctl函數(shù)中實現(xiàn)了這一功能。
static int siLioctl(stmctiTlode*inode,structfile*mp,unsigned_int cmd,unsignedlogarg){
    swltell(cmd){
    case接收:
    設(shè)置接收寄存器;
    break:
    case發(fā)送:
    設(shè)置發(fā)送寄存器;
    break;
    default:
   }
}
1.2.4 sir_read和sir_write函數(shù)
    這兩個函數(shù)主要完成讀取應(yīng)用程序傳送給內(nèi)核設(shè)備文件的數(shù)據(jù)和回送應(yīng)用程序請求的數(shù)據(jù),并把數(shù)據(jù)從內(nèi)核傳送到硬件和從硬件讀取數(shù)據(jù)的通信過程。這也是在整個驅(qū)動程序中最重要的部分。
    當用戶調(diào)用read()函數(shù)時,內(nèi)核相應(yīng)地調(diào)用sir_read()函數(shù)。在Sir_read()中,通過判斷硬件寄存器是否有新數(shù)據(jù)到來而決定是否從設(shè)備讀取數(shù)據(jù),然后使用內(nèi)核提供的copy touser(void*to,const void*from,unsigned long count)函數(shù)將數(shù)據(jù)返回應(yīng)用程序。write()函數(shù)的實現(xiàn)與read()函數(shù)的實現(xiàn)過程正好相反。在sir_write()中,通過調(diào)用copy_from user_form_user(void*to,const void*from,unsigned long count,)函數(shù)來完成把數(shù)據(jù)從用戶的應(yīng)用程序傳送給硬件設(shè)備。
1.2.5實現(xiàn)模式
    設(shè)備驅(qū)動程序的主體完成了,現(xiàn)在要把驅(qū)動程序嵌入內(nèi)核。實現(xiàn)Llnux下IrDA設(shè)備驅(qū)動功能主要有兩種形式:一是通過內(nèi)核來進行加載,需要用戶在./etc/rc.d/目錄中定義的初始啟動腳本中寫入命令,當內(nèi)核啟動的時候,就開始加載IrDA設(shè)備驅(qū)動程序,內(nèi)核啟動完成之后,IrDA驅(qū)動功能也隨即實現(xiàn)了,但是增大了內(nèi)核;第二是通過模塊加載的形式。比較兩者,第二種形式更加靈活,在此著重對模塊加載形式進行討論。模塊設(shè)計是Llnux中特有的技術(shù),它使Linux內(nèi)核功能更容易擴展。采用模塊來設(shè)計Linux設(shè)備驅(qū)動程序會很輕松,并且能夠形成固定的模式。任何人只要依照這個模式去設(shè)計,都能設(shè)計出優(yōu)良的設(shè)備驅(qū)動程序。
    先簡要概述一下基于模塊加載的設(shè)備驅(qū)動程序的設(shè)計步驟。首先每一個可裝配的設(shè)備驅(qū)動程序都必須有init_module和cleanup module兩個函數(shù),裝載和卸載設(shè)備時內(nèi)核自動調(diào)用這兩個函數(shù)。前者在insmod的時候執(zhí)行,后者在rmmod的時候執(zhí)行。通過模塊加載命令insmod來把IrDA設(shè)備驅(qū)動程序插入到內(nèi)核之中。在init_module中,除可以對硬件設(shè)備進行檢查和初始化外,還必須調(diào)用reglster_*’函數(shù)將設(shè)備登記到系統(tǒng)中。本例中是通過register_chrdev來登記的,如果是塊設(shè)備或網(wǎng)絡(luò)設(shè)備則應(yīng)該用reglstei_blkdev和register_netdev來登記。registeT_chrdev的主要功能是將設(shè)備名和結(jié)構(gòu)flle operatioons登記到系統(tǒng)的設(shè)備控制塊中。最后可以通過執(zhí)行模塊卸載命令rmmod,調(diào)用IrDA驅(qū)動程序中的cleanup_module()函數(shù),來對IrDA驅(qū)動程序模塊卸載,具體實現(xiàn)過程如圖l所示。

2 基于MC68HC908AP64紅外發(fā)射器的設(shè)計
2.1 紅外發(fā)射器的硬件設(shè)計
    為了可以檢測Sitsang板端的IrDA設(shè)備能否正常工作,設(shè)計了一個IrDA發(fā)射器。發(fā)射器的體積為l3cm×10cm,安裝靈活方便。在發(fā)射器上有一個撥位開關(guān),可以用來設(shè)置發(fā)射不同的碼值。紅外收發(fā)器選用具有半雙工功能的HSDL-3200。
    單片機的可靠性和片上資源是選擇的關(guān)鍵。如一片單片機的資源不足,還要另加其它芯片,就會給系統(tǒng)的可靠性、外型體積、造價帶來很多負面的影響。MC68HC908AP64單片機對程序安全運行有較全面的保護。與其它的MCU相比,最重要的是它內(nèi)部集成有UART單元及其接口,支持IrDA標準,有紅外接口可以直接與紅外收發(fā)體系連接??梢灾苯域?qū)動HSDL_3200,片上的其它資源包含了發(fā)射器的全部需要,并且廉價低功耗。所以選用其作為發(fā)射器的主控芯片電路如圖2所示。

2.2 紅外發(fā)射器的軟件實現(xiàn)流程
    發(fā)射器的軟件編程對產(chǎn)品的可靠性有很大影響。由于IrDA是異步半雙工的通信方式,在某一個時刻,IrDA收發(fā)器只可能呈現(xiàn)一種狀態(tài)。鑒于這種情況,設(shè)置IrDA收發(fā)器始終處于發(fā)射狀態(tài),而SitSang板上的IrDA收發(fā)器始終處于接收狀態(tài),這樣就不用切換收發(fā)狀態(tài),保證了系統(tǒng)的穩(wěn)定性。發(fā)射器和接收器之間的通信需要制定一套合理的通信協(xié)議來協(xié)調(diào)總通信。這里采用的是數(shù)據(jù)包通信方式。通信波特率為9600bps,通信數(shù)據(jù)是成幀發(fā)送的,每幀數(shù)據(jù)都可以設(shè)置自己的引導碼和數(shù)據(jù)。其中引導碼是用于同步每一幀數(shù)據(jù);數(shù)據(jù)是IrDA發(fā)射器撥位開關(guān)的值,可以自己隨意設(shè)定。當紅外發(fā)射器和Sitsang板調(diào)通以后,也可以通過sir_ioctl函數(shù)來切換收發(fā)狀態(tài),達到雙方通信的目的。發(fā)射器的軟件流程如圖3所示。

結(jié)語
    本文分析了設(shè)備驅(qū)動程序在內(nèi)核中的實現(xiàn)方法,并講解了基于Intel的PXA255處理器的Sitsang平臺開發(fā)的驅(qū)動程序設(shè)計和實現(xiàn)過程。其中結(jié)合Linux下一個現(xiàn)在使用廣泛的IrDA驅(qū)動程序,詳細闡述了紅外模塊驅(qū)動程序的設(shè)計和開發(fā)過程,最后從硬件和軟件兩個方面講述了基于MC68HC908AP64紅外發(fā)射器的設(shè)計和實現(xiàn)。雖然嵌入式Linux操作系統(tǒng)和傳統(tǒng)的嵌入式操作系統(tǒng)相比還不夠成熟完善,但是Linux本身所具有的優(yōu)越性使其在移動設(shè)備的OS領(lǐng)域具有廣闊的應(yīng)用前景。

本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫毥谦F公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風險,如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機 衛(wèi)星通信

要點: 有效應(yīng)對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅持高質(zhì)量發(fā)展策略,塑強核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運營商 數(shù)字經(jīng)濟

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術(shù)學會聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(shù)(集團)股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉