嵌入式藍(lán)牙網(wǎng)關(guān)中藍(lán)牙驅(qū)動(dòng)層研究與實(shí)現(xiàn)
掃描二維碼
隨時(shí)隨地手機(jī)看文章
關(guān)鍵字:嵌入式;藍(lán)牙網(wǎng)關(guān);tty設(shè)備;虛擬串口
Abstract: At present,the bluetooth technology is one of main ways which resolve the intelligent terminals interconnect and visit Internet expediently under the family and the work environment.Therefore ,we developed the Embedded Bluetooth Gateway ,and launched the discussion to key technologies .Firstly, the hardware composition structure and the software system construction of the Embedded Bluetooth Gateway are presented . Then, proposed an improvement program which based on the TTY(Teletype)driver model. Finally, test system of Embedded Bluetooth Gatway confirmed the bluetooth driver architecture which designed based on the TTY driver model is effective.
Key words:Embedded;Bluetooth Gateway;tty Device;Virtual Serial Port
0.引言
隨著智能終端設(shè)備的不斷增多,用來連接各種筆記本、PDA、臺(tái)式電腦等設(shè)備的電纜布線會(huì)越來越復(fù)雜,它不僅影響了美觀性,還增加了安裝、維護(hù)的費(fèi)用和難度,藍(lán)牙技術(shù)是解決上述問題的有效途徑之一[1],家庭或辦公室中的筆記本、PC機(jī)等只要安裝上藍(lán)牙適配器就成為具有了藍(lán)牙連接功能的數(shù)據(jù)終端(DT),彼此之間可以方便地實(shí)現(xiàn)互連互通。目前,具有藍(lán)牙功能的筆記本、PDA、手機(jī)等終端設(shè)備越來越多,而藍(lán)牙終端設(shè)備與互聯(lián)網(wǎng)之間的互連互通則成了制約其應(yīng)用的一大瓶頸[2]。藍(lán)牙網(wǎng)關(guān)正是為這些藍(lán)牙終端設(shè)備(包括藍(lán)牙PDA、藍(lán)牙筆記本電腦、藍(lán)牙PC等)創(chuàng)建一個(gè)到本地網(wǎng)絡(luò)的無線連接通訊鏈路,使之能夠訪問本地網(wǎng)絡(luò)及Internet。目前,藍(lán)牙網(wǎng)關(guān)大多是基于PC機(jī)上的windows或linux平臺(tái)開發(fā)的,體積、成本、易用性等因素在一定程度上制約了藍(lán)牙網(wǎng)關(guān)的推廣[3]??紤]以上各因素,筆者研制了一種嵌入式藍(lán)牙網(wǎng)關(guān),與基于PC的藍(lán)牙網(wǎng)關(guān)相比在成本、易用性、體積等方面都具有一定的優(yōu)勢(shì)。本文主要針對(duì)嵌入式藍(lán)牙網(wǎng)關(guān)中藍(lán)牙硬件模塊驅(qū)動(dòng)層框架設(shè)計(jì)及具體實(shí)現(xiàn)給予詳細(xì)闡述,并提出一種管理藍(lán)牙虛擬串口設(shè)備的方案,在此基礎(chǔ)上實(shí)現(xiàn)了一個(gè)以MIPS內(nèi)核嵌入式微處理器Au1000為硬件平臺(tái)的嵌入式藍(lán)牙網(wǎng)關(guān)[4]。
1.嵌入式藍(lán)牙網(wǎng)關(guān)的硬件結(jié)構(gòu)
藍(lán)牙是一種開放性的、短距離無線數(shù)據(jù)和語音通信的全球規(guī)范。藍(lán)牙規(guī)范的動(dòng)機(jī)是通過合理地選擇鏈路的傳輸速度、通訊距離和傳輸功率來實(shí)現(xiàn)一種成本低、效率高、單芯片方式的通信收發(fā)設(shè)備,而嵌入式藍(lán)牙網(wǎng)關(guān)正是一種藍(lán)牙應(yīng)用規(guī)范中LAP(局域網(wǎng)接入應(yīng)用模型)的典型應(yīng)用[5] [6]。
一般來說,嵌入式藍(lán)牙網(wǎng)關(guān)硬件主要由微處理器、內(nèi)嵌式藍(lán)牙硬件模塊及其他接口電路、存儲(chǔ)器件等組成??紤]到系統(tǒng)的性價(jià)比等諸多因素,在本文中,筆者采用AMD的MIPS內(nèi)核的嵌入式微處理器Au1000作為微處理器平臺(tái),同時(shí)在處理器豐富資源的基礎(chǔ)上,還進(jìn)行了相關(guān)的配置和擴(kuò)展,平臺(tái)配置了Intel 16Mbyte的E28F128J3 FLASH芯片和Hynix 32Mbyte 的HY57V561620 SDRAM芯片。通過SMSC公司的LAN91C11 10/100M型以太網(wǎng)控制芯片擴(kuò)展了一個(gè)網(wǎng)絡(luò)接口。藍(lán)牙模塊采用CSR BlueCore02芯片的增強(qiáng)型藍(lán)牙模塊,兼容藍(lán)牙1.2規(guī)范,最大發(fā)射距離達(dá)到100米,最大數(shù)據(jù)傳輸率可達(dá)到1.384Mbps,支持低功耗工作模式/高速工作模式,支持安全認(rèn)證、數(shù)據(jù)加密,該模塊通過UART口與Au1000微處理器通信。
2.嵌入式藍(lán)牙網(wǎng)關(guān)的軟件體系架構(gòu)
在嵌入式系統(tǒng)的開發(fā)過程中,嵌入式操作系統(tǒng)平臺(tái)的選擇是關(guān)鍵點(diǎn)之一。目前,常見的嵌入式操作系統(tǒng)有Vxworks、Win CE、pPOS、palm OS、Nucleus、QNX,嵌入式linux等,針對(duì)不同的應(yīng)用需求,它們各有特點(diǎn)。在嵌入式藍(lán)牙網(wǎng)關(guān)的開發(fā)中,我們選用MIZI公司的嵌入式Linux操作系統(tǒng)來構(gòu)建嵌入式藍(lán)牙網(wǎng)關(guān)的軟件平臺(tái),其原因主要有三:一方面,它是一種開放源碼的操作系統(tǒng),并且MIZI-Linux已經(jīng)成為嵌入式領(lǐng)域很受歡迎的操作系統(tǒng)之一[7];另一方面,Linux下的軟件幾乎都遵循GPL版權(quán)協(xié)議,可以利用Linux操作系統(tǒng)上的mgetty+AutoPPP快速搭建嵌入式藍(lán)牙網(wǎng)關(guān)端的撥號(hào)服務(wù)器應(yīng)用程序,從而不必自己開發(fā)撥號(hào)服務(wù)器應(yīng)用程序;據(jù)此,筆者設(shè)計(jì)的嵌入式藍(lán)牙網(wǎng)關(guān)中的軟件體系架構(gòu)如圖1所示。
圖1 嵌入式藍(lán)牙網(wǎng)關(guān)軟件的體系架構(gòu)圖
本文主要是對(duì)該軟件體系架構(gòu)中的藍(lán)牙驅(qū)動(dòng)層框架及實(shí)現(xiàn)給予闡述,并提出一種管理藍(lán)牙虛擬串口設(shè)備的方案,在此基礎(chǔ)上實(shí)現(xiàn)了一個(gè)以Au1000為硬件平臺(tái)的嵌入式藍(lán)牙網(wǎng)關(guān)。
3.藍(lán)牙硬件模塊驅(qū)動(dòng)層框架的設(shè)計(jì)與實(shí)現(xiàn)
在開發(fā)嵌入式藍(lán)牙網(wǎng)關(guān)過程中,為了縮短開發(fā)周期,減少開發(fā)成本,筆者利用了Linux下現(xiàn)有的撥號(hào)服務(wù)器程序來實(shí)現(xiàn)與藍(lán)牙設(shè)備的互連,為此,筆者實(shí)現(xiàn)了藍(lán)牙虛擬串口設(shè)備ttyBT。對(duì)于用戶使用來說,該虛擬串口和系統(tǒng)真實(shí)串口tty沒有任何區(qū)別。同時(shí),為了更好地管理虛擬串口以及實(shí)現(xiàn)與藍(lán)牙協(xié)議模塊進(jìn)行交互,筆者對(duì)于以往的tty驅(qū)動(dòng)模型進(jìn)行了改進(jìn),即在藍(lán)牙協(xié)議模塊和ttyBT設(shè)備之間設(shè)計(jì)了一個(gè)ttyBTmgr模塊。下面將詳細(xì)描述藍(lán)牙驅(qū)動(dòng)硬件模塊的驅(qū)動(dòng)層框架和驅(qū)動(dòng)層框架中的各函數(shù)的實(shí)現(xiàn)過程。
3.1 藍(lán)牙硬件模塊驅(qū)動(dòng)層框架
tty設(shè)備是一種字符設(shè)備, 在MIZI-Linux操作系統(tǒng)中,串行通信端口設(shè)備被實(shí)現(xiàn)為tty設(shè)備,即ttySx [8]。筆者在設(shè)計(jì)嵌入式藍(lán)牙網(wǎng)關(guān)時(shí),將其中的藍(lán)牙硬件模塊設(shè)計(jì)成一種tty類型設(shè)備,即通過藍(lán)牙虛擬串口設(shè)備ttyBT實(shí)現(xiàn)與MIZI-Linux操作系統(tǒng)的互連。遵循tty設(shè)備驅(qū)動(dòng)規(guī)范,藍(lán)牙虛擬串口設(shè)備ttyBT驅(qū)動(dòng)層框架如圖2所示:
圖 2 藍(lán)牙硬件模塊驅(qū)動(dòng)層框架
從圖2可以看出, ttyBT設(shè)備驅(qū)動(dòng)程序由三部分構(gòu)成,第一部分是tty核心,負(fù)責(zé)與嵌入式Linux操作系的接口,這對(duì)所有的tty設(shè)備都是一樣的;第二部分是ttyBT鏈路規(guī)程,它的作用是使用特殊的方法,把從用戶或硬件那里傳遞來的數(shù)據(jù)格式化,這種格式化通常使用一些協(xié)議來完成轉(zhuǎn)化,比如PPP協(xié)議或者藍(lán)牙協(xié)議;第三部分是ttyBT驅(qū)動(dòng)程序,完成藍(lán)牙硬件模塊輸入/輸出隊(duì)列的讀寫操作。
整個(gè)ttyBT設(shè)備驅(qū)動(dòng)程序的數(shù)據(jù)流向?yàn)椋簍ty核心從用戶那里得到將要發(fā)往藍(lán)牙硬件模塊的數(shù)據(jù),然后把數(shù)據(jù)發(fā)送給ttyBT鏈路規(guī)程,該鏈路規(guī)程把數(shù)據(jù)在傳遞給ttyBT驅(qū)動(dòng)程序;ttyBT驅(qū)動(dòng)程序?qū)?shù)據(jù)進(jìn)行格式化后,然后發(fā)送給藍(lán)牙硬件模塊;從藍(lán)牙硬件模塊那里接收到的數(shù)據(jù)將回溯至ttyBT驅(qū)動(dòng)程序,然后流入ttyBT鏈路規(guī)程,接著是流入tty核心,最后,用戶從tty核心那里得到數(shù)據(jù)。此外,tty設(shè)備可以很方便地和PPP模塊鏈接起來,是因?yàn)槟芡ㄟ^將tty設(shè)備的行為注冊(cè)為PPP來實(shí)現(xiàn)。這個(gè)特性對(duì)于快速構(gòu)建嵌入式藍(lán)牙網(wǎng)關(guān)的應(yīng)用程序來說是非常必要的。這也是筆者將這種設(shè)備實(shí)現(xiàn)為一種tty設(shè)備,即ttyBT的原因之一。
3.2藍(lán)牙硬件模塊驅(qū)動(dòng)程序實(shí)現(xiàn)
如圖3所示,藍(lán)牙硬件模塊驅(qū)動(dòng)層主要包括tty核心層、ttyBT鏈路規(guī)程層和ttyBT驅(qū)動(dòng)程序?qū)訕?gòu)成,下面分別將其實(shí)現(xiàn)過程介紹如下。
(1)tty核心層 其負(fù)責(zé)與嵌入式Linux操作系的接口,實(shí)現(xiàn)的關(guān)鍵是如何定義一個(gè)tty_driver結(jié)構(gòu),該結(jié)構(gòu)用來向tty核心注冊(cè)一個(gè)ttyBT驅(qū)動(dòng)程序。藍(lán)牙驅(qū)動(dòng)層框架中的tty核心層使用終端設(shè)備數(shù)據(jù)結(jié)構(gòu)tty_struct保存ttyBT端口的狀態(tài),同時(shí)賦予鏈路規(guī)程識(shí)別并向串行接口發(fā)送和接收4種藍(lán)牙HCI數(shù)據(jù)包: HCI Command Packet,HCI Event Packet,HCI ACL Data Packet和HCI SCO Data Packet,同時(shí)完成向高層協(xié)議提供標(biāo)準(zhǔn)發(fā)送接收過程[9]。
(2)藍(lán)牙硬件模塊鏈路規(guī)程 鏈路規(guī)程對(duì)于TTY驅(qū)動(dòng)程序來說是不透明的,驅(qū)動(dòng)程序不能直接與鏈路規(guī)程通信,在Linux系統(tǒng)中使用終端鏈路規(guī)程把具體的終端設(shè)備和輸入/輸出隊(duì)列相關(guān)聯(lián),使得操作系統(tǒng)對(duì)所有的終端都視為標(biāo)準(zhǔn)的流操作[10]。
(3)ttyBT設(shè)備驅(qū)動(dòng)函數(shù) 實(shí)現(xiàn)把藍(lán)牙硬件模塊接收到的字符遞送給ttyBT鏈路規(guī)程的輸入隊(duì)列和輸出隊(duì)列,發(fā)送到藍(lán)牙硬件的同時(shí)完成對(duì)輸入隊(duì)列和輸出隊(duì)列的監(jiān)測(cè)功能以及硬件中斷過程。
4.藍(lán)牙虛擬串口設(shè)備的管理
在實(shí)現(xiàn)藍(lán)牙驅(qū)動(dòng)層框架的過程中,為了便于管理ttyBT設(shè)備驅(qū)動(dòng)層中的虛擬串口設(shè)備并使之和ttyBT鏈路規(guī)程層中的藍(lán)牙協(xié)議模塊進(jìn)行交互,筆者提出了一種基于tty驅(qū)動(dòng)模型的改進(jìn)方案,即ttyBT設(shè)備不是和藍(lán)牙協(xié)議模塊直接通信的,而是在藍(lán)牙協(xié)議模塊和ttyBT設(shè)備之間增加了一個(gè)ttyBTmgr的字符設(shè)備。這個(gè)字符設(shè)備在藍(lán)牙協(xié)議模塊啟動(dòng)時(shí),由協(xié)議模塊打開。ttyBTmgr和藍(lán)牙協(xié)議模塊、ttyBT設(shè)備的消息通信機(jī)制如圖3所示。
圖3 ttyBTmgr的消息通信機(jī)制
(1)ttyBT設(shè)備發(fā)送消息 當(dāng)一個(gè)ttyBT設(shè)備被打開、關(guān)閉、寫數(shù)據(jù)等的時(shí)候,它要向藍(lán)牙協(xié)議模塊發(fā)送消息。在筆者的設(shè)計(jì)中,ttyBT設(shè)備不是和藍(lán)牙協(xié)議模塊直接通信的,而是通過ttyBTmgr設(shè)備和藍(lán)牙協(xié)議模塊通信的。在ttyBT設(shè)備的數(shù)據(jù)結(jié)構(gòu)中,維護(hù)了一個(gè)消息鏈表,所有的ttyBT設(shè)備要向協(xié)議模塊發(fā)送的消息都要先插入到這個(gè)消息鏈表中 。
(2)ttyBT設(shè)備接收消息 當(dāng)藍(lán)牙協(xié)議模塊給ttyBTmgr設(shè)備發(fā)送了消息,則ttyBTmgr設(shè)備需要將這些消息轉(zhuǎn)發(fā)給ttyBT設(shè)備。由于ttyBTmgr設(shè)備和ttyBT設(shè)備的驅(qū)動(dòng)程序都是編譯成內(nèi)核模塊,運(yùn)行在內(nèi)核空間,它們可以共享那些全局變量,這樣ttyBTmgr直接修改 ttyBT的全局變量就實(shí)現(xiàn)了消息的轉(zhuǎn)發(fā)。
(3)藍(lán)牙協(xié)議模塊發(fā)送消息 如果藍(lán)牙協(xié)議模塊要向虛擬串口設(shè)備發(fā)消息,它使用ioctl( )系統(tǒng)調(diào)用發(fā)送消息。這個(gè)ioctl命令是自定義的,其類型是W32IF_FROM_RFCOMM,在這里面有三種消息:DRV2UI_OPEN_RESULT_IND 指示串口設(shè)備打開結(jié)果
DRV2UI_SEND_DATA_COMPLETE 指示數(shù)據(jù)發(fā)送完畢
DRV2UI_REMOTE_DATA_IND 指示收到遠(yuǎn)程數(shù)據(jù)
(4)藍(lán)牙協(xié)議模塊接收消息 在藍(lán)牙協(xié)議模塊中,專門有一個(gè)線程來接收來自驅(qū)動(dòng)程序的消息。前面講過,這些消息不是直接來自ttyBT設(shè)備而是來自ttyBTmgr。協(xié)議模塊用select( )系統(tǒng)調(diào)用來等待消息,如果當(dāng)前消息隊(duì)列里有消息,或一旦有消息被添加到消息隊(duì)列,則select( )系統(tǒng)調(diào)用會(huì)成功返回。然后協(xié)議模塊調(diào)用read( )系統(tǒng)調(diào)用將消息從ttyBTmgr設(shè)備中讀出,然后根據(jù)消息類型進(jìn)行相應(yīng)的處理。
5.測(cè)試實(shí)驗(yàn)
為了驗(yàn)證本文的藍(lán)牙驅(qū)動(dòng)層框架是有效的,魯棒的,筆者搭建了嵌入式藍(lán)牙網(wǎng)關(guān)的測(cè)試系統(tǒng),由筆者研發(fā)出的嵌入式藍(lán)牙網(wǎng)關(guān)和藍(lán)牙數(shù)據(jù)終端組成。藍(lán)牙數(shù)據(jù)終端是由PC機(jī)、USB藍(lán)牙適配器、BlueSoleil組成的藍(lán)牙PC。依據(jù)本文提出的藍(lán)牙驅(qū)動(dòng)層框架所編寫的嵌入式藍(lán)牙網(wǎng)關(guān)端的藍(lán)牙驅(qū)動(dòng)程序,實(shí)現(xiàn)了藍(lán)牙硬件模塊和藍(lán)牙主機(jī)(Au1000硬件平臺(tái))之間HCI傳送功能,使該嵌入式藍(lán)牙網(wǎng)關(guān)實(shí)現(xiàn)了局域網(wǎng)接入訪問服務(wù)。試驗(yàn)結(jié)果表明,藍(lán)牙PC能成功連接到嵌入式藍(lán)牙網(wǎng)關(guān),并能搜索到嵌入式藍(lán)牙網(wǎng)關(guān)提供的藍(lán)牙網(wǎng)絡(luò)接入服務(wù),從而使藍(lán)牙PC能通過該嵌入式藍(lán)牙網(wǎng)關(guān)訪問Internet和局域網(wǎng)。
6.結(jié)束語
本文針對(duì)基于MIZI-linux操作系統(tǒng)的嵌入式藍(lán)牙網(wǎng)關(guān)中藍(lán)牙驅(qū)動(dòng)層框架設(shè)計(jì)給予詳細(xì)闡述,并描述了驅(qū)動(dòng)層框架的函數(shù)實(shí)現(xiàn)方法,同時(shí),對(duì)以往tty驅(qū)動(dòng)模型提出了相應(yīng)的改進(jìn)措施,達(dá)到了便于管理藍(lán)牙虛擬串口設(shè)備以及與藍(lán)牙協(xié)議模塊進(jìn)行交互的目的。實(shí)驗(yàn)證明,基于上述技術(shù)所研制的嵌入式藍(lán)牙網(wǎng)關(guān)是有效的,魯棒的。
7.參考文獻(xiàn)
[1] 李遠(yuǎn)偉,姜雪輝等.應(yīng)用藍(lán)牙技術(shù)組建家庭無線局域網(wǎng)[J].中國科技信息,2006-05:109.
[2] 馮慶勝,李紅等.基于藍(lán)牙技術(shù)組建無線家庭網(wǎng)絡(luò)[J].微計(jì)算機(jī)信息,2006-08:59.
[3] 袁宇恒,葉芝慧等.基于藍(lán)牙技術(shù)的家庭網(wǎng)絡(luò)控制子網(wǎng)設(shè)計(jì)與研制[J].東大學(xué)報(bào),2006-01.
[4] NicolasRouhana,Eric Horlait.Bluetooth Web Internet Gateway[J]. Proceedings of Seventh International Symposium on Computers and Communications, July 2002:679-684.
[5] 馬建倉,羅亞軍等.藍(lán)牙核心技術(shù)及應(yīng)用[M].北京:科學(xué)出版社,2003:99-103.
[6] David Johnson.Hardware and Software Implications of Creating Bluetooth Scatternet Devices[J].AFRICON Conference in Africa,Volume 1,2004:211- 215.
[7] 鄭靈翔.嵌入式系統(tǒng)設(shè)計(jì)與應(yīng)用開發(fā)[M].北京:北京航空航天大學(xué)出版社,2006:78-82.
[8] Jonatban Corbet, Alessandro Rubini.Linux Device Drivers[M].南京:東南大學(xué)出版社,2005:538-566.
[9] David Kammert等著,李靜等譯.藍(lán)牙應(yīng)用開發(fā)指南.北京:科學(xué)出版社,2003:130-159.
[10] Robert Love.Linux Kernel Development[M].2nd Edition.Novell Press,2005.
基金編號(hào):江蘇省高校自然科學(xué)計(jì)劃項(xiàng)目 06KJD520037