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