<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 手機與無(wú)線(xiàn)通信 > 設計應用 > IrDA模塊與HCG8HC908AP64的紅外系統設計

IrDA模塊與HCG8HC908AP64的紅外系統設計

作者: 時(shí)間:2006-06-23 來(lái)源:網(wǎng)絡(luò ) 收藏

引 言
隨著(zhù)嵌入式及集成電路技術(shù)的飛速發(fā)展,針對移動(dòng)手持終端的專(zhuān)用芯片獲得了長(cháng)足發(fā)展。芯片的RAM和ROM的容量越大,在上面跑操作也越來(lái)越容易。Linux是當今流行的操作之一。由于其內核健壯、運行高效、源碼開(kāi)放,并且Linux是免費的操作系統,再加上其良好的可移植性等技術(shù)優(yōu)勢,使其已經(jīng)成為嵌入式操作系統的主流。設備驅動(dòng)程序是Linux操作系統中的一個(gè)重要的組成部分,現在不斷升級的Linux內核中,增加最多的就是驅動(dòng)程序。由于Linux是開(kāi)放源代碼的,給我們提供了一個(gè)絕好的機會(huì )來(lái)分析和改造設備驅動(dòng)程序,使其滿(mǎn)足自己的特殊應用,這樣在嵌入式產(chǎn)品中,就可以為自己特有的外圍設備編寫(xiě)一個(gè)設備驅動(dòng)程序。由于技術(shù)的蓬勃發(fā)展,提供了各種信息家電設備之間的無(wú)線(xiàn)連接的最佳選擇,數據傳輸,成本低廉、連接方便、簡(jiǎn)單易用、結構緊湊,在小型嵌入式移動(dòng)設備中也得到了廣泛的應用。配備有技術(shù)移動(dòng)電話(huà)、個(gè)人數字助理、筆記本電腦都已登陸市場(chǎng),因此,嵌入式設備的的開(kāi)發(fā)有著(zhù)廣闊的市場(chǎng)前景。
本文將詳細講解基于Inte1的PXA255處理器的Sitsang開(kāi)發(fā)平臺,其中包括Linux下的驅動(dòng)程序的開(kāi)發(fā)和基于MC68HC908AP64紅外發(fā)射器的軟硬件兩個(gè)部分。


1 Linux下IrDA
1.1 Linux下的設備驅動(dòng)程序簡(jiǎn)介

系統調用是操作系統內核和應用程序之間的接口,驅動(dòng)程序是操作系統內核和機器硬件之間的接El,也是應用層和實(shí)際硬件設備之間的軟件。一個(gè)驅動(dòng)程序就是一個(gè)函數和數據結構的集合,它的目的就是實(shí)現一個(gè)簡(jiǎn)單的管理設備的接口。內核用這個(gè)接口請求驅動(dòng)程序控制設備的I/O操作。設備驅動(dòng)程序為應用程序屏蔽了硬件的細節,這樣在應用程序看來(lái),硬件設備只是一個(gè)設備文件,應用程序可以像操作普通文件一樣對硬件設備進(jìn)行操作。Linux操作系統支持三種不同類(lèi)型的設備,即字符設備、塊設備和網(wǎng)絡(luò )接口,相應地有三種類(lèi)型的設備驅動(dòng)程序。本文主要討論字符型設備的驅動(dòng)程序。設備驅動(dòng)程序是內核的一部分,主要完成以下的功能:
①對設備初始化和釋放;
②把數據從內核傳送到硬件和從硬件讀取數據;
③讀取應用程序傳送給設備文件的數據和回送應用程序請求的數據;
④檢測和處理設備出現的錯誤。
由于應用程序是通過(guò)設備文件同硬件打交道,對設備文件的操作方式不外乎就是一些系統調用,如open、read、write、close等等。Linux操作系統是通過(guò)一組固定的接口把系統調用和驅動(dòng)程序關(guān)聯(lián)起來(lái)的。這組入口點(diǎn)是由每個(gè)設備的設備驅動(dòng)程序組成了一個(gè)數據結構來(lái)向系統提供的,它提供了字符型設備驅動(dòng)程序所需的操作。這是一個(gè)非常關(guān)鍵的數據結構:
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*);
這個(gè)結構的每一個(gè)成員的名字都對應著(zhù)一個(gè)系統調月。應用程序利用系統調用在對設備文件進(jìn)行諸如read/write操作時(shí),系統調用通過(guò)設備文件的主設備號找到相應的設備驅動(dòng)程序,然后讀取這個(gè)數據結構相應的函數指針,接著(zhù)把控制權交給該函數。這是Linux的設備驅動(dòng)程序工作的基本原理。既然是這樣,編寫(xiě)設備驅動(dòng)程序的主要工作就是編寫(xiě)子函數,并填充me_operations的各個(gè)域。多數情況下,只需為上面結構中的少數方法編寫(xiě)服務(wù)函數,其它均設為NULL。
已經(jīng)提到,應用程序是通過(guò)設備文件來(lái)與實(shí)際的硬件打交道的。每個(gè)設備文件都有其文件屬性(c/b),表示是字符設備還是塊設備。另外每個(gè)文件都有兩個(gè)設備號:第一個(gè)是主設備號,標識驅動(dòng)程序;第二個(gè)是從設備號,標識使用同一個(gè)設備驅動(dòng)程序的不同的硬件設備,比如有兩個(gè)軟盤(pán),就可以用從設備號來(lái)區分它們。設備文件的主設備號必須與設備驅動(dòng)程序在登記時(shí)申請的主設備號一致,否則用戶(hù)進(jìn)程將無(wú)法訪(fǎng)問(wèn)到驅動(dòng)程序。
1.2 IrDA模塊驅動(dòng)程序
IrDA是一種廉價(jià)、近距離、無(wú)線(xiàn)、低功耗、保密性強的通信技術(shù),適合于低成本、跨平臺、點(diǎn)對點(diǎn)高速數據連接,尤其是嵌入式系統;主要應用于無(wú)線(xiàn)數據傳輸,有時(shí)也用于無(wú)線(xiàn)網(wǎng)絡(luò )接入和近程遙控。IrDA制定了很多紅外通信協(xié)議,其中IrDA1.0協(xié)議基于異步收發(fā)器uART,最高通信速率在115 2kbps,簡(jiǎn)稱(chēng)sIR(Seria Infrared,串行紅外協(xié)議),采用3/1 6 ENDEC編/解碼機制。我們所要實(shí)現的就是基于sIR的IrDA驅動(dòng)。它的發(fā)射強度與接收靈敏度因不同器件、不同應用設計而強弱不一,使用時(shí)只能以半雙工方式進(jìn)行紅外通信。
我們的設計思想是Sitsang板只作為接收端,而基于MC68HC908AP64紅外發(fā)射器作為發(fā)送端。其中file_operations結構中的ioctl()函數可以進(jìn)行發(fā)送或接收的狀態(tài)切換。原Sitsang板載Linux系統所帶的IrDA驅動(dòng)程序是作為網(wǎng)絡(luò )部分編寫(xiě)的,使用過(guò)于復雜,且在處理數據收發(fā)時(shí)需要做一些自己的處理和驗證規則,所以我們使用標準串口在Linux下自己編寫(xiě)了一個(gè)IrDA的設備驅動(dòng)程序。這樣在使用時(shí),可以根據自己的需要作相應的更改,比較靈活。
在IrDA驅動(dòng)程序中主要實(shí)現了s_r_read()、s_r_write()、siLopen()、sir_close()、siLioctl()及sir_handle_irq()中斷處理程序六個(gè)函數。相應的接口結構如下所示:
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函數
用戶(hù)空間進(jìn)程通過(guò)接口函數進(jìn)入到內核,內核再調用驅動(dòng)程序相應的I/O函數。IrDA驅動(dòng)程序是字符類(lèi)型的驅動(dòng)程序,我們用中斷的方式實(shí)現內核與設備之間的數據傳輸。當驅動(dòng)程序在啟動(dòng)后設備就掛起自己,直到串口完成操作并發(fā)出一個(gè)中斷請求(IRQ)。當IRQ產(chǎn)生時(shí),注冊的中斷處理程序sir_handlejrq得以運行。在Sir_handle_irq中,程序通過(guò)相應的寄存器操作得到接收的數據,并將數據存入到一個(gè)內部緩沖中。
1.2.2 sir open和sir_cIose函數
sir_open函數的主要功能就是遞增使用計數和設備初始化操作。這里把設置并初始化sitsang板上的紅外設備放在了sir_open函數中,這樣在每次打開(kāi)IrDA設備時(shí),紅外設備都會(huì )被正確地設置,確保了紅外硬件的正常工作。另外,把申請設備中斷號的工作也放到了Sir_open函數中,這樣IrDA設備所占用的中斷號,在沒(méi)有使用IrDA設備時(shí)也可以被其它設備共享。
static int sir sopen(struct inode*inode,struet *filp){
計數器加1;
申請設備中斷號;
設置Sitsang板上的紅外設備并初始化;
}
sir_close()函數所作的工作與sir_open()的正好相反,計數器減1,注銷(xiāo)設備中斷號。
1.2.3 sir_ioctl函數
由于所使用的紅外收發(fā)器HSDL-3200只能以半雙工方式進(jìn)行紅外通信,所以就需要命令進(jìn)行接收和發(fā)送狀態(tài)的轉換。ioctl函數的主要功能就是對硬件設備進(jìn)行控制,因此在sir―ioctl函數中實(shí)現了這一功能。
static int siLioctl(stmctiTlode*inode,structfile*mp,unsigned_int cmd,unsignedlogarg){
swltell(cmd){
case接收:
設置接收寄存器;
break:
case發(fā)送:
設置發(fā)送寄存器;
break;
default:
}
}
1.2.4 sir_read和sir_write函數
這兩個(gè)函數主要完成讀取應用程序傳送給內核設備文件的數據和回送應用程序請求的數據,并把數據從內核傳送到硬件和從硬件讀取數據的通信過(guò)程。這也是在整個(gè)驅動(dòng)程序中最重要的部分。
當用戶(hù)調用read()函數時(shí),內核相應地調用sir_read()函數。在Sir_read()中,通過(guò)判斷硬件寄存器是否有新數據到來(lái)而決定是否從設備讀取數據,然后使用內核提供的copy touser(void*to,const void*from,unsigned long count)函數將數據返回應用程序。write()函數的實(shí)現與read()函數的實(shí)現過(guò)程正好相反。在sir_write()中,通過(guò)調用copy_from user_form_user(void*to,const void*from,unsigned long count,)函數來(lái)完成把數據從用戶(hù)的應用程序傳送給硬件設備。
1.2.5實(shí)現模式
設備驅動(dòng)程序的主體完成了,現在要把驅動(dòng)程序嵌入內核。實(shí)現Llnux下IrDA設備驅動(dòng)功能主要有兩種形式:一是通過(guò)內核來(lái)進(jìn)行加載,需要用戶(hù)在./etc/rc.d/目錄中定義的初始啟動(dòng)腳本中寫(xiě)入命令,當內核啟動(dòng)的時(shí)候,就開(kāi)始加載IrDA設備驅動(dòng)程序,內核啟動(dòng)完成之后,IrDA驅動(dòng)功能也隨即實(shí)現了,但是增大了內核;第二是通過(guò)模塊加載的形式。比較兩者,第二種形式更加靈活,在此著(zhù)重對模塊加載形式進(jìn)行討論。模塊設計是Llnux中特有的技術(shù),它使Linux內核功能更容易擴展。采用模塊來(lái)設計Linux設備驅動(dòng)程序會(huì )很輕松,并且能夠形成固定的模式。任何人只要依照這個(gè)模式去設計,都能設計出優(yōu)良的設備驅動(dòng)程序。
先簡(jiǎn)要概述一下基于模塊加載的設備驅動(dòng)程序的設計步驟。首先每一個(gè)可裝配的設備驅動(dòng)程序都必須有init_module和cleanup module兩個(gè)函數,裝載和卸載設備時(shí)內核自動(dòng)調用這兩個(gè)函數。前者在insmod的時(shí)候執行,后者在rmmod的時(shí)候執行。通過(guò)模塊加載命令insmod來(lái)把IrDA設備驅動(dòng)程序插入到內核之中。在init_module中,除可以對硬件設備進(jìn)行檢查和初始化外,還必須調用reglster_*’函數將設備登記到系統中。本例中是通過(guò)register_chrdev來(lái)登記的,如果是塊設備或網(wǎng)絡(luò )設備則應該用reglstei_blkdev和register_netdev來(lái)登記。registeT_chrdev的主要功能是將設備名和結構flle operatioons登記到系統的設備控制塊中。最后可以通過(guò)執行模塊卸載命令rmmod,調用IrDA驅動(dòng)程序中的cleanup_module()函數,來(lái)對IrDA驅動(dòng)程序模塊卸載,具體實(shí)現過(guò)程如圖l所示。

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

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

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

紅外遙控器相關(guān)文章:紅外遙控器原理


評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>