文波,周淵平
?。ㄋ拇ù髮W(xué) 電子信息學(xué)院,,四川 成都 610065)
摘要:Android是一種基于Linux的開(kāi)源操作系統(tǒng),它具有十分豐富的應(yīng)用。文章提出了將搭載有Android系統(tǒng)的主板TQ210和雙音多頻撥號(hào)芯片MT8880通過(guò)主板上的攝像頭B接口連接起來(lái),,設(shè)計(jì)一個(gè)可以在Android系統(tǒng)上接聽(tīng)和撥打有線電話(huà)的應(yīng)用,然后在 Linux 內(nèi)核中編寫(xiě)驅(qū)動(dòng)程序,,并在 HAL層和JNI層中生成動(dòng)態(tài)庫(kù)文件,實(shí)現(xiàn)在Android平臺(tái)上通過(guò)有線接聽(tīng)和撥打電話(huà)的功能,。經(jīng)過(guò)測(cè)試,該設(shè)計(jì)方案能成功接聽(tīng)和撥打電話(huà),。
關(guān)鍵詞:Android; 有線電話(huà); MT8880; HAL; JNI
0引言
隨著移動(dòng)通信技術(shù)的發(fā)展,移動(dòng)通信經(jīng)歷了從第一代到第四代的飛速發(fā)展,,目前,,5G通信已經(jīng)進(jìn)入測(cè)試階段。然而移動(dòng)通信的每一次改變,,通信頻率幾乎是成倍增加,,使得每一個(gè)基站的信號(hào)覆蓋率會(huì)越來(lái)越小,這樣就會(huì)要求建立更多的基站,,但是在城市里,,居民不可能同意在自己的小區(qū)及小區(qū)附近建立基站,所以可以大膽預(yù)測(cè),,當(dāng)5G通信到來(lái)時(shí),,室內(nèi)的信號(hào)將會(huì)比較弱,手機(jī)通話(huà)質(zhì)量會(huì)大大降低,,這樣使得輻射也會(huì)大大增加,,通話(huà)穩(wěn)定性將會(huì)顯著降低。所以本文提出了一種在搭載有Android4.0系統(tǒng)的主板TQ210上撥打有線電話(huà)的方法,,既可以克服手機(jī)在室內(nèi)信號(hào)差的不足,,又可以在主板上完成手機(jī)所具有的所有功能,這樣在室內(nèi)就可以完全不用手機(jī),。
1硬件系統(tǒng)設(shè)計(jì)
1.1硬件框架
硬件系統(tǒng)由主板TQ210與MT8880模塊及其外圍電路構(gòu)成,,如圖1所示。主板TQ210采用了三星公司推出的S5pv210微處理器[1],,從圖1中可以看出主板TQ210的外圍電路十分齊全,。只需要將TQ210開(kāi)發(fā)板的GPIO接口與MT8880模塊連接起來(lái),,就可以實(shí)現(xiàn)在搭載有Android系統(tǒng)的主板上接聽(tīng)和撥打電話(huà)的功能。
1.2MT8880模塊簡(jiǎn)介
MT8880收發(fā)芯片是具有微處理器接口的,、功能較豐富的雙音多頻(DTMF)芯片,。它的發(fā)送部分采用行列計(jì)數(shù)器及頻率穩(wěn)定性較高的D/A轉(zhuǎn)換器,可以發(fā)出16種雙音多頻DTMF信號(hào),;接收部分能接收16個(gè)DTMF信號(hào),,并把DTMF信號(hào)分離及解碼,以4位并行二進(jìn)制方式輸出[2],。MT8880芯片的功耗非常低,,集成度相當(dāng)高且定時(shí)準(zhǔn)確,可以調(diào)整雙音頻模式的占空比,,能自動(dòng)抑制撥號(hào)音和調(diào)整信號(hào)增益,,還帶有標(biāo)準(zhǔn)的數(shù)據(jù)總線,可以與TTL電平兼容,,并可方便地進(jìn)行編程控制[3]。
1.2.1引腳排列與功能
MT8880芯片引腳排列如圖2所示,。該芯片有20個(gè)引腳,,其中1腳為運(yùn)放的同向輸入引腳;2腳為運(yùn)放的反向輸入引腳,;3腳為運(yùn)放增益選擇端,;4腳為基準(zhǔn)電壓輸出端;5腳為電源地,;6腳為DTMF時(shí)鐘/振蕩器輸入,,采用3.579 545 MHz的時(shí)鐘信號(hào);7腳為時(shí)鐘輸出引腳,;8腳為輸出DTMF信號(hào)引腳,;9腳為讀寫(xiě)控制端;10腳為片選引腳,;11腳為寄存器選擇引腳,,當(dāng)為低電平時(shí),控制數(shù)據(jù)寄存器的讀寫(xiě),,當(dāng)為高電平時(shí),,控制狀態(tài)寄存器和控制寄存器的讀寫(xiě);12腳為系統(tǒng)時(shí)鐘輸入,;13腳為中斷處理請(qǐng)求端,;14~17腳為數(shù)據(jù)線,控制DTMF信號(hào)的發(fā)送和接收,;18腳為滯后前輸出,,當(dāng)檢測(cè)到有效音頻時(shí),,就變?yōu)楦唠娖剑盘?hào)條件不足時(shí)又立刻返回低電平,;19腳為滯后輸出/保護(hù)后輸出,;20腳為電源正極,為該芯片提供所需電壓[4],。
1.2.2信號(hào)音判斷原理
信號(hào)音主要由撥號(hào)音,、忙音及回鈴音組成,其中撥號(hào)音是連續(xù)脈沖信號(hào),,忙音和回鈴音的頻率相同,,都在425 Hz~475 Hz,但它們通斷時(shí)間并不一樣,,回鈴音在1 s時(shí)間為通,,4 s時(shí)間為斷開(kāi),而忙音則是以0.7 s為一個(gè)周期,,在一半的時(shí)間接通,,一半的時(shí)間斷開(kāi)。若要判斷信號(hào)音,,應(yīng)該在撥號(hào)后將MT8880芯片設(shè)置為呼叫處理模式,,MT8880的呼叫處理濾波器是一個(gè)帶通濾波器,當(dāng)信號(hào)輸入端有信號(hào)音輸入時(shí),,在IRQ/CP就輸出一高電平,,此時(shí)電話(huà)呼叫過(guò)程中的各種信號(hào)音經(jīng)MT8880濾波,限幅后得到方波,,并由MT8880芯片的IRQ引腳輸出,,判斷該引腳上的信號(hào)就知道為何種信號(hào)音。
在本次編程中,,撥完電話(huà)號(hào)碼后,,就讓MT8880芯片工作在CP模式,并開(kāi)啟中斷及定時(shí)器,,采用下降沿觸發(fā),,計(jì)數(shù)時(shí)間為5 s,判斷步驟如下:
(1)若計(jì)數(shù)值小于256則為撥號(hào)音,,進(jìn)入其他狀態(tài)并繼續(xù)檢測(cè),。若計(jì)數(shù)值還是小于256,則說(shuō)明還是在通話(huà)中,,一直檢測(cè),,直到計(jì)數(shù)值大于256后就掛斷電話(huà),因?yàn)榇藭r(shí)對(duì)方已經(jīng)掛斷了電話(huà),。
(2)如果計(jì)數(shù)值在1 024~1 791之間,,則為忙音,,直接掛斷電話(huà)。
(3)若計(jì)數(shù)值在256~1 023,,則為回鈴音,,等待對(duì)方接聽(tīng),并繼續(xù)進(jìn)入CP模式檢測(cè),。
1.2.3MT8880模塊與主板連接原理
由于TQ210主板上并沒(méi)有直接可用的GPIO口,,經(jīng)過(guò)查閱電路圖發(fā)現(xiàn)攝像頭接口CAMERA_B的引腳與GPIO口復(fù)用,它使用了GPJ0口的全部引腳和GPJ1口的部分引腳,。若要將此接口作為GPIO口,,只需要將原來(lái)配置的攝像頭驅(qū)動(dòng)中對(duì)GPJ1、GPJ0引腳的初始化代碼去掉,,然后在自己寫(xiě)的驅(qū)動(dòng)中對(duì)這些引腳初始化成所需的功能即可,。圖3為MT8880模塊輸入輸出接口與開(kāi)發(fā)板的GPIO接口對(duì)接圖,其中D0~D3為數(shù)據(jù)線,,當(dāng)打電話(huà)時(shí),,把這4個(gè)腳配置為輸出,當(dāng)接電話(huà)時(shí),,把這4個(gè)腳配置為輸入,,為以后做來(lái)電顯示做準(zhǔn)備。具體每個(gè)腳的功能見(jiàn)表1,。
2軟件設(shè)計(jì)
Android系統(tǒng)的底層是Linux[5],,所以所有的軟件設(shè)計(jì)都是在Ubuntu14.04系統(tǒng)上完成的,,要使該芯片能夠正常工作,,則必須要在Linux內(nèi)核中編寫(xiě)相應(yīng)的驅(qū)動(dòng)文件,在HAL層和JNI層生成動(dòng)態(tài)庫(kù)文件以及在應(yīng)用層編寫(xiě)應(yīng)用程序[6],。
2.1MT8880驅(qū)動(dòng)開(kāi)發(fā)
在/opt/EmbedSky/TQ210/Kernel_3.0.8_TQ210_for_Linux_v1.4/drivers/char目錄下新建一個(gè)tq210_mt8880.c,,然后在tq210_mt8880.c文件里編寫(xiě)好程序后并保存,修改該目錄下的Kconfig文件,,在終端執(zhí)行命令make menuconfig時(shí)可以看到剛剛新增的配置選項(xiàng),,最后修改該目錄下的Makefile文件,然后在make menuconfig中選擇剛才加上的菜單,,重新編譯內(nèi)核,,如果成功,則內(nèi)核就已經(jīng)包含了最新加進(jìn)去的MT8880驅(qū)動(dòng)了,。
2.2HAL層開(kāi)發(fā)
硬件抽象層(Hardware Abstraction Layer,HAL)是建立在Linux驅(qū)動(dòng)之上的一套動(dòng)態(tài)庫(kù),。這套動(dòng)態(tài)庫(kù)是屬于Linux內(nèi)核層之上的系統(tǒng)運(yùn)行庫(kù)層[7]。
Android系統(tǒng)的HAL層是為了避開(kāi)Linux的GPL束縛,,保護(hù)一些硬件供應(yīng)商的知識(shí)產(chǎn)權(quán)而提出的,,HAL層用于控制硬件的動(dòng)作,,而Linux 驅(qū)動(dòng)程序僅僅完成一些簡(jiǎn)單的數(shù)據(jù)交互作用,甚至把硬件寄存器空間直接映射到user space[8],。目前HAL存在兩種架構(gòu),,位于libhardware_legacy目錄下的“舊HAL架構(gòu)”和位于hardware的libhardware目錄下的“新HAL架構(gòu)”。主板TQ210采用了“新HAL架構(gòu)”,。新HAL架構(gòu)如圖4所示,。
編寫(xiě)HAL層代碼步驟如下:
(1)首先在TQ210_Android_4.0.4_V1.4/hardware/Libhardward/include下創(chuàng)建MT8880.h頭文件,編寫(xiě)頭文件源碼并保存,。
(2)然后在/opt/EmbedSky/TQ210/TQ210_Android_4.0.4_V1.4/device/embedsky/tq210目錄下創(chuàng)建libMT8880文件夾,,在該文件夾中新建MT8880.c文件,在該文件里編寫(xiě)源碼,,然后保存該文件,,最后在該文件夾下創(chuàng)建Android.mk文件并編寫(xiě)該文件的源碼,然后保存該文件,。
(3)最后在終端輸入相關(guān)命令進(jìn)行編譯,,將在目錄下生成的MT8880.tq210.so文件復(fù)制到主板上的system/lib/hw目錄下,當(dāng)然也可以放在其他目錄下,。
2.3JNI層開(kāi)發(fā)
JNI的全稱(chēng)為Java Native Interface,它是Java平臺(tái)的一部分,,并允許Java代碼與其他語(yǔ)言寫(xiě)的代碼進(jìn)行交互,使得在JVM(Java虛擬機(jī))內(nèi)部運(yùn)行的Java字節(jié)碼能夠與其他語(yǔ)言(比如C,、C++等)進(jìn)行交互操作[9],,圖5為JNI層在Android中的位置關(guān)系圖。
在/opt/EmbedSky/TQ210/TQ210_Android_4.0.4_V1.4/packages/apps中創(chuàng)建MT8880文件夾,,用來(lái)存放jni源碼,,在該文件夾中新建文件MT8880Service.cpp,編寫(xiě)源碼并保存,這里需要注意的是函數(shù)的前置Java_com_embedsky_MT8880_MT8880Activity_決定了創(chuàng)建應(yīng)用程序使用的包名,。其次創(chuàng)建Android.mk文件,,編寫(xiě)源碼并保存。最后在終端輸入相關(guān)命令進(jìn)行編譯,,將生成的libMT8880.so文件復(fù)制到主板對(duì)應(yīng)的目錄中[10],。
3測(cè)試及結(jié)果
在本次測(cè)試中,將TQ210開(kāi)發(fā)板(搭載Android4.0系統(tǒng))與MT8880模塊及其外圍電路通過(guò)開(kāi)發(fā)板上的CAMERA_B接口連接起來(lái),,并把電話(huà)線接到MT8880上的RJ11接口上,,然后打開(kāi)開(kāi)發(fā)板上的通訊錄APP,點(diǎn)擊按鈕進(jìn)行撥號(hào),。經(jīng)過(guò)測(cè)試,,該裝置能順利撥通要打的電話(huà),并且語(yǔ)音質(zhì)量良好,,測(cè)試結(jié)果如圖6~圖8所示,。
4結(jié)論
本文實(shí)現(xiàn)了在Android系統(tǒng)上通過(guò)MT8880芯片撥打和接聽(tīng)有線電話(huà)的功能,,并且該方案既有抗干擾能力強(qiáng)、輻射小,、保密性強(qiáng)的通信特點(diǎn),,又具有Android平臺(tái)的所有特性。如果將手機(jī)上的通訊信息同步到該系統(tǒng)上,,然后直接在該系統(tǒng)上撥出要打的電話(huà)號(hào)碼,,即可完全實(shí)現(xiàn)無(wú)線與有線的融合,把兩者的優(yōu)點(diǎn)結(jié)合起來(lái),,這樣該設(shè)計(jì)方案將更加完美,。
參考文獻(xiàn)
[1] 廣州天嵌計(jì)算機(jī)科技有限公司.TQ210用戶(hù)硬件手冊(cè)[Z].2012.
?。?] 李傳南,,王劍剛,李寶華.單片機(jī)與DTMF信號(hào)收發(fā)芯片MT8880的直接接口設(shè)計(jì)[J].電子與自動(dòng)化,1999(2):23-24.
?。?] 張立臣.DTMF信號(hào)收,、發(fā)芯片MT8888原理及應(yīng)用[J].國(guó)外電子元器件,2001(9):30-31.
[4] 董守田,,徐風(fēng)文.DTMF收發(fā)芯片MT8888的應(yīng)用[J].農(nóng)機(jī)化研究,2003(2):216-217.
?。?] 宋寶華.Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā)詳解(第二版)[M].北京:人民郵電出版社,2013.
?。?] 李剛.瘋狂Android講義[M].北京:電子工業(yè)出版社,,2015.
[7] 李寧. Android開(kāi)發(fā)權(quán)威指南[M]. 北京:人民郵電出版社,2011.
?。?] 韋德瓊.基于Android系統(tǒng)的驅(qū)動(dòng)模塊的設(shè)計(jì)和實(shí)現(xiàn)[D].哈爾濱:哈爾濱工業(yè)大學(xué),2012.
?。?] 施月玲,宣凱,張海平,等.JNI技術(shù)在Android平臺(tái)融合通信終端的應(yīng)用[J].杭州電子科技大學(xué)學(xué)報(bào)(自然科學(xué)版),2015,,28(2):41-44.
?。?0] 杜江,,周淵平.基于Android的電話(huà)撥號(hào)功能[J].計(jì)算機(jī)系統(tǒng)應(yīng)用,2014,23(12):245-248.