嵌入式藍牙PSTN語(yǔ)音接入點(diǎn)的設計與實(shí)現
源碼開(kāi)放的μclinux由于其強大的網(wǎng)絡(luò )功能和較低的成本,得到了廣泛的應用。嵌入式藍牙公共交換電話(huà)網(wǎng)絡(luò )pstn(public switched telephone network)語(yǔ)音接入點(diǎn),就是我們和廣東省電信科學(xué)研究院合作,在μclinux系統上開(kāi)發(fā)的一種具有廣闊前景的應用。其應用場(chǎng)景如圖1所示。
本文引用地址:http://dyxdggzs.com/article/21399.htm藍牙gsm雙模手機在進(jìn)入藍牙pstn語(yǔ)音接入點(diǎn)的信號覆蓋范圍后,即自動(dòng)通過(guò)接入點(diǎn)在pstn網(wǎng)絡(luò )上登記,這樣用戶(hù)的話(huà)務(wù)就被轉移到pstn網(wǎng)絡(luò ),使用時(shí)只需繳納固定電話(huà)費;網(wǎng)關(guān)具有小型交換機的功能,可以為多個(gè)藍牙手機提供類(lèi)似的服務(wù);而且同一個(gè)接入點(diǎn)信號覆蓋范圍之內的藍牙手機間,還可以不經(jīng)過(guò)pstn直接進(jìn)行相互間通話(huà),就像對講機一樣,不用付費。本文主要介紹接入點(diǎn)軟硬件以及設備驅動(dòng)程序的設計與實(shí)現。

嵌入式藍牙pstn語(yǔ)音接入點(diǎn)的硬件系統框圖如圖2所示。整個(gè)接入點(diǎn)主要由網(wǎng)關(guān)控制模塊、電話(huà)線(xiàn)路接口模塊和藍牙收發(fā)模塊組成。

網(wǎng)關(guān)控制模塊是整個(gè)網(wǎng)關(guān)軟件的運行平臺。μclinux操作系統運行于此硬件平臺之上,而所有應用軟件又運行于操作系統之上。復雜的控制流程以及大量的外擴模塊要求mpu具有較強的處理能力。經(jīng)多方權衡,本設計最終選用了motorola公司的coldfire嵌入式處理器mcf5272。
mcf5272內部的sram和rom對于運行μclinux操作系統是遠遠不夠的。本設計對mcf5272的ram和rom進(jìn)行了擴充,外擴了16mb的sdram和4mb的flash rom。這樣的存儲器配置不僅滿(mǎn)足了語(yǔ)音接入點(diǎn)軟件的需要,還為網(wǎng)關(guān)增加各種功能留有較多的余地。
1.2 電話(huà)線(xiàn)路接口模塊
電話(huà)線(xiàn)路接口模塊是網(wǎng)關(guān)和pstn的接口,由線(xiàn)路切換繼電器、電話(huà)線(xiàn)接口芯片、dtmf接收電路、dtmf發(fā)送電路和fsk解調及振鈴接收電路組成。它通過(guò)mcf5272的12根gpio線(xiàn)和4個(gè)外部中斷線(xiàn)和網(wǎng)關(guān)控制模塊相連。線(xiàn)路切換繼電器用于實(shí)現電話(huà)線(xiàn)上的信號在振鈴接收電路和語(yǔ)音電路之間的切換,即實(shí)現摘機掛機的功能。在待機狀態(tài)下繼電器觸點(diǎn)切換在振鈴接收電路一側,等待接收振鈴信號。當需要摘機時(shí),mcf5272控制繼電器切換到話(huà)音電路一側。
電話(huà)線(xiàn)路接口芯片選用philips公司的tea1062a。tea1062a把電話(huà)線(xiàn)上送來(lái)的模擬語(yǔ)音信號放大后發(fā)送到藍牙收到模塊的pcm編解碼器;相反,也把pcm編解碼器送來(lái)的語(yǔ)音信號放大后,放到電話(huà)線(xiàn)上傳輸。此外,它還提供了消側音、自動(dòng)增益控制等功能。
網(wǎng)關(guān)還需具備轉發(fā)來(lái)電顯示信息的功能。常見(jiàn)的來(lái)電顯示標準分為dtmf和fsk兩種。我國的來(lái)電顯示國家標準是fsk制式的,大部分pstn交換機也支持fsk標準的來(lái)電顯示信息;但是也有少量pstn交換機和一些用戶(hù)內部交換機發(fā)送的是dtmf標準的來(lái)電顯示信息。我們holtek的ht9170d以及ht9032c芯片分別接收dtmf及fsk來(lái)電顯示信息。
網(wǎng)關(guān)向pstn交換機撥號和普通的電話(huà)一樣,采用dtmf信號,同時(shí)也可以用dtmf信號向pstn交換機發(fā)送一些信令信息。網(wǎng)關(guān)的dtmf發(fā)送選用foltek的ht9200a芯片。
1.3 藍牙收發(fā)模塊
藍牙收發(fā)模塊包括藍牙射頻電路、基帶處理電路和pcm編解碼電路,通過(guò)mcf5272的uart1和網(wǎng)關(guān)控制模塊相連。語(yǔ)音信號通過(guò)pcm編解碼器mc145483和電話(huà)接口芯片tea1062a連接。語(yǔ)音信號通過(guò)pcm編解碼器mc145483和電話(huà)接口芯片tea1062a連接。mcf5272把藍牙模塊接收到的數據通過(guò)協(xié)議棧解釋為摘機、掛機、撥號、來(lái)電顯示等命令,并通過(guò)數據線(xiàn)控制電話(huà)語(yǔ)音接收與撥叫電路的各種操作。pstn市話(huà)網(wǎng)用戶(hù)線(xiàn)與電話(huà)線(xiàn)路接口模塊連接,電話(huà)線(xiàn)路接口模塊把外部pstn電話(huà)網(wǎng)的振鈴信號和來(lái)電顯示信息通過(guò)數據線(xiàn)傳遞給mcf5272。mcf5272再把這些信號通過(guò)藍牙軟件棧打成數據包并送給藍牙模塊,由藍牙模塊通過(guò)無(wú)線(xiàn)信道發(fā)送給終端。電話(huà)線(xiàn)上的模擬語(yǔ)音信息通過(guò)pcm編解碼器編碼后經(jīng)藍牙模塊發(fā)送給終端,同時(shí)藍牙模塊接收終端發(fā)送過(guò)來(lái)的語(yǔ)音數據,經(jīng)過(guò)pcm編解碼器解碼,形成模擬語(yǔ)音信號,通過(guò)電話(huà)接口芯發(fā)送到電話(huà)線(xiàn)上。本設計中的藍牙基帶和射頻電路由csr的bluecore01b芯片加上功放、低噪放、收發(fā)切換開(kāi)關(guān)、濾波器和一些外圍電路組成。
2 驅動(dòng)程序的設計與實(shí)現
2.1 μclinux設備驅動(dòng)程序概述
在μclinux下,所有的硬件設備都被視為文件,從設備接收輸入數據和將輸出送到設備就像從普通文件接收輸入和將輸出送到文件一樣,可以使用read()、write()等系統調用。應用程序通過(guò)系統調用和內核交互,而內核則通過(guò)設備驅動(dòng)程序和具體硬件交互,如圖3所示。一般來(lái)說(shuō),操作系統內核需要訪(fǎng)問(wèn)三類(lèi)主要設備:字符型設備、塊型設備以及網(wǎng)絡(luò )設備。本接入點(diǎn)的驅動(dòng)程序屬于字符設備驅動(dòng)程序。

每個(gè)驅動(dòng)都有一個(gè)稱(chēng)為file_operations的數據結構,包含指向驅動(dòng)程序內部大多數函數的指針。當系統引導時(shí),驅動(dòng)程序初始化函數將file_operations結構的指針送給內核,內核就可以通過(guò)該指針訪(fǎng)問(wèn)驅動(dòng)程序內的函數。因而,這些函數就是進(jìn)入驅動(dòng)程序的基本入口點(diǎn)。當用戶(hù)程序執行系統調用時(shí),將導致驅動(dòng)程序內相應的函數被調用。
2.2 需求分析
嵌入式藍牙pstn語(yǔ)音接入點(diǎn)的硬件設計中,電話(huà)線(xiàn)路接口模塊、藍牙收發(fā)模塊是外擴的模塊,需要在μclinux內核為基提供支持。
藍牙收發(fā)模塊通過(guò)mcf5272的串口2和網(wǎng)關(guān)控制模塊相連,因而直接使用μclinux自帶的串口驅動(dòng)程序就可以完成對此模塊的控制;而電話(huà)線(xiàn)路接口模塊通過(guò)gpio口以及外部中斷線(xiàn)與網(wǎng)關(guān)控制模塊相連,必須由我們自由提供驅動(dòng)程序。
2.3 fsk來(lái)電顯示芯片驅動(dòng)的設計與實(shí)現
fsk來(lái)電顯示驅動(dòng)的主要任務(wù)就是完成fsk來(lái)電顯示信息的接收,總工作流程如圖4所示。其主要功能由設備驅動(dòng)程序基本入口點(diǎn)中的open、release、read、ioctl、select函數,以及設備初始化函數、中斷處理函數、下半部分處理函數、定時(shí)器超時(shí)處理函數完成。下面對其中一些關(guān)鍵的函數進(jìn)行簡(jiǎn)要介紹。

1)read函數
read、write稱(chēng)為對設備的i/o操作。當用戶(hù)進(jìn)程對設備執行i/o操作時(shí),設備可能并不具備進(jìn)行i/o操作的條件。這些情況下,用戶(hù)進(jìn)程可以選擇繼續等待,即通過(guò)interruptible_sleep_on()函數讓用戶(hù)進(jìn)程進(jìn)入睡眠狀態(tài);也可以選擇不等待,立即返回。這就產(chǎn)生一兩種類(lèi)型的i/o操作,即阻塞型i/o和非阻塞型i/o。我們的驅動(dòng)同時(shí)支持阻塞型和非阻塞型的讀操作。
(2)ioctl函數
設備特殊文件之所以特殊就是因為它代表一個(gè)設備,可以通過(guò)它對設備的屬性進(jìn)行設置,這和對設備的i/o操作不同。我們通過(guò)ioct1函數來(lái)實(shí)現,ioct1的實(shí)質(zhì)就是向設備發(fā)送命令來(lái)改變設備的屬性。在實(shí)現此驅動(dòng)的過(guò)程中發(fā)現,fsk來(lái)電顯示芯片在沒(méi)有真正的fsk數據的時(shí)候也會(huì )受到干擾,使數據線(xiàn)上有電平的跳動(dòng),從而產(chǎn)生不應該產(chǎn)生的中斷對系統的性能造成影響,因而提供了2個(gè)ioct1命令給用戶(hù)進(jìn)程,來(lái)控制fsk中斷的打開(kāi)與關(guān)閉
。
(3)select函數
為了使用戶(hù)進(jìn)程可以使用i/o多路轉接技術(shù),在驅動(dòng)程序中實(shí)現了select函數。當用戶(hù)進(jìn)程執行select系統調用的時(shí)候,每一個(gè)加入select測試集合的設備的select函數都被調用,如果其中任何一個(gè)或多個(gè)設備可以進(jìn)行要求的i/o操作,則select返回;否則,通過(guò)select_wait()函數讓用戶(hù)進(jìn)程進(jìn)入睡眠狀態(tài),直到有任何一個(gè)設備可以進(jìn)行要求的i/o操作或超時(shí)為止。
(4)中斷處理函數及下半部分處理函數
fsk來(lái)電顯示芯片只有1根數據線(xiàn)連接到cpu的gpio口上。這根數據線(xiàn)的每一字節數據都以0開(kāi)始、以1結束,中間是8位的ascii碼,最低位最先發(fā)送,在沒(méi)有數的時(shí)候數據線(xiàn)一直保護高電平。由于fsk來(lái)電顯示數據具有這種特殊的格式,把這根數據線(xiàn)同時(shí)接到cpu的外部中斷線(xiàn)上,并設置為下降沿觸發(fā),這樣每來(lái)1字節數據就會(huì )產(chǎn)生一次中斷。fsk數據幀由若干字節這樣的數據組成。fsk數據速率是1.2kb/s,因而1個(gè)bit延續約0.83ms。這樣收一個(gè)字節的數據就需要耗費約8.3ms的時(shí)間。顯然在中斷處理程序里面接收數據是不合適的,所以在中斷處理程序中只調用mark_up函數標記數據的到來(lái),而把接收及處理數據的任務(wù)留到下半部分程序中完成。
下半部分程序負責接收1字節的fsk來(lái)電顯示數據,由于1字節數據中可能有多個(gè)下降延,所以在進(jìn)入處理函數后首先要關(guān)閉fsk中斷,然后每0.83ms讀一次gpio口,接收一位的數據,收完1字節數據后要打開(kāi)fsk中斷,以接收下一字節的數據。
根據本次fsk中斷是否為此次通信的每一個(gè)中斷,可以判斷本次接收的是否為fsk數據幀的第一個(gè)字節,如果是,那么將啟動(dòng)一個(gè)內核定時(shí)器,其超時(shí)時(shí)間設為1s(因為一個(gè)fsk數據幀的傳輸時(shí)間不會(huì )超過(guò)1s)。在定時(shí)器超時(shí)后,內核將調用定時(shí)器超過(guò)時(shí)處理函數,提取出主叫用戶(hù)的電話(huà)號碼,并通過(guò)wake_up函數喚醒任何等待讀此設備的用戶(hù)進(jìn)程。
2.4 dtmf語(yǔ)音撥號、來(lái)電顯示驅動(dòng)的設計與實(shí)現
由于dtmf芯片要提供雙音多頻撥號的功能,所以與fsk芯片驅動(dòng)相比,dtmf芯片驅動(dòng)中多了一個(gè)write函數。dtmf芯片的多音多頻撥號部分有2根線(xiàn)和cpu相連:1根數據線(xiàn)、1根時(shí)鐘線(xiàn)。write函數實(shí)際上就是根據芯片的寫(xiě)時(shí)序把用戶(hù)進(jìn)程發(fā)來(lái)的數據傳送到芯片上去。
相比于fsk來(lái)電顯示信息的接收而言,dtmf來(lái)電顯示信息的接收就比較容易了。dtmf來(lái)電顯示芯片提供了1根中斷信號線(xiàn)和4根并行數據線(xiàn),每次中斷來(lái)只需要讀并行信號線(xiàn),并進(jìn)行簡(jiǎn)單的解碼、緩存工作就可以了。此外為了方便,把摘、掛機,抬高、拉低靜音等命令者包含此驅動(dòng)的iotcl命令集中了;和fsk驅動(dòng)一樣,為了防止干擾對dtmf來(lái)電顯示信息的影響,也在iotcl命令提供了打開(kāi)、關(guān)閉dtmf來(lái)電顯示中斷的命令。
3 應用軟件的設計與實(shí)現
接入點(diǎn)應用程序位于前面介紹的硬件平臺以及設備驅動(dòng)程序之上,三者之間的關(guān)系如圖5所示。接入點(diǎn)應用程序是整個(gè)軟件的核心,它與串口驅動(dòng)程序、fsk來(lái)電顯示驅動(dòng)程序、dtmf來(lái)電顯示驅動(dòng)程序、dtmf撥號驅動(dòng)程序、flash驅動(dòng)程序、振鈴驅動(dòng)程序交互,并通過(guò)后五個(gè)驅動(dòng)程序控制具體硬件完成相關(guān)功能。接入點(diǎn)可以對允許接入的藍牙終端屬性進(jìn)行設備,只有被授權的藍牙終端才能通過(guò)接入點(diǎn)訪(fǎng)問(wèn)pstn。接入點(diǎn)的flash可設置多個(gè)允許接入的藍牙終端,并可通過(guò)與網(wǎng)關(guān)并聯(lián)的電話(huà)進(jìn)行增添、刪除一個(gè)或全部刪除終端設置的操作。

對于設置為雙模的藍牙手機,必須先向網(wǎng)絡(luò )登記,網(wǎng)絡(luò )返回成功信息的方可與網(wǎng)關(guān)建立物理和邏輯鏈路;而在雙模手機主動(dòng)與網(wǎng)關(guān)拆開(kāi)物理鏈路時(shí),也必須向網(wǎng)絡(luò )登記。接入點(diǎn)可以發(fā)現已登記的雙模手機是否離開(kāi)本網(wǎng)關(guān)信號覆蓋范圍,并自動(dòng)向網(wǎng)絡(luò )登記,將雙模手機的話(huà)務(wù)切換回移動(dòng)網(wǎng)絡(luò )中,而并模終端無(wú)需這樣的操作。網(wǎng)關(guān)可同時(shí)與7個(gè)藍牙終端建立acl(asynchronous connection less)對于不同調制方式(fsk及dtmf)來(lái)電均能接收號碼以及振鈴,并根據來(lái)電號碼分析被呼叫方,根據藍牙無(wú)繩電話(huà)協(xié)議ctp(cordless telephony profile)建立起tcs(telephone control specification)鏈路、sco(synchronous connection oriented)鏈路。當來(lái)電顯示為非特服號開(kāi)頭的號碼時(shí),表示來(lái)電來(lái)普通電話(huà),所有與網(wǎng)關(guān)相連的分機終端都振鈴。某一終端接聽(tīng)后,其它終端停止振鈴,回到空閑狀態(tài)。當來(lái)電顯示為特服號開(kāi)頭的時(shí)候,表示來(lái)電為訪(fǎng)問(wèn)特定終端的話(huà)務(wù),可以分析來(lái)電顯示的格式得到接入順序號,并使對應的藍牙終端振鈴。藍牙雙?;蛘邌文=K端能通過(guò)網(wǎng)關(guān)、pstn網(wǎng)絡(luò )撥打外部電話(huà),網(wǎng)關(guān)支持終端多次撥號,并且外部電話(huà)能收到來(lái)電顯示。
我們設計的應用程序流程如圖6所示。在μclinux系統中,此應用程序被視為一個(gè)用戶(hù)進(jìn)程。在系統啟動(dòng)rc腳本文件的末尾添加該進(jìn)程,則系統在完成初始化工作后會(huì )自動(dòng)啟動(dòng)該進(jìn)程。對用戶(hù)進(jìn)程而言,硬件設備被視為設備描述文件,它和普通的文件沒(méi)有區別,可用文件描述符(一個(gè)非負整數)表示。在程序啟動(dòng)時(shí),用linux系統提供的open函數打開(kāi)這些設備,同時(shí)設置這些設備的工作方式;啟動(dòng)藍牙協(xié)議棧,并設置工作模式、服務(wù)發(fā)現數據庫和其它參數,使網(wǎng)關(guān)始終處于被發(fā)現和被動(dòng)建鏈的一方。

此后應用程序地偵聽(tīng)、等待各設備數據的到來(lái),我們采用了i/o多咱轉接的技術(shù)來(lái)實(shí)現對多個(gè)描述符的讀、寫(xiě)和管理。該技術(shù)的基本思想是:先構造一張有關(guān)描述符的表,然后調用一個(gè)函數,它要到描述符中的一個(gè)已準備好表示i/o時(shí)才返回。在返回時(shí),它告訴進(jìn)程哪一個(gè)描述符已準備好可以進(jìn)行i/o。select函數可以執行i/o多路轉換,傳向該函數的參數告訴內核我們所關(guān)心的描述符、對于每個(gè)描述符我們所關(guān)心的條件(是否讀一個(gè)給定的描述符?是否想寫(xiě)一個(gè)給定的描述符?是否關(guān)心一個(gè)描述符的異常條件?)以及希望等待的時(shí)間(可以永遠等待、等待固定時(shí)間或完全不等待)。我們在程序中設置了永遠等待,即只有所指定的描述符中的一個(gè)已準備好或捕捉到一個(gè)信號才返回。從select返回時(shí),內核告訴我們已準備好的描述符的數量和哪一個(gè)描述符已準備好讀、寫(xiě)或異常條件,應用程序這個(gè)信息進(jìn)入相應的處理子模塊。
結語(yǔ)
基于嵌入式μclinux系統的藍牙pstn網(wǎng)關(guān)實(shí)現了上術(shù)的所有功能,使藍牙三合一電話(huà)的應用成為現實(shí)。最多7個(gè)藍牙終端能同時(shí)與該網(wǎng)關(guān)建立物理和邏輯鏈路,網(wǎng)關(guān)能建立起一條語(yǔ)音鏈路。經(jīng)實(shí)測,在傳輸距離不超過(guò)10m的前提下,話(huà)音質(zhì)量良好,清晰無(wú)失真;在傳輸距離超過(guò)10m后,由于藍牙的自動(dòng)功率控制功能,會(huì )增大發(fā)射功率,模擬語(yǔ)音電路部分引入的電磁干擾噪聲增加,影響通話(huà)效果,此問(wèn)題可以通過(guò)調整pcb布局布線(xiàn)和對易干擾電路增加屏蔽來(lái)消除。根據標準藍牙協(xié)議,藍牙終端和網(wǎng)關(guān)之間最多可建立起3條語(yǔ)音鏈路,這將在下一個(gè)版本中加以改進(jìn)。
評論