基于Android的MT8880芯片的设计与实现
文波,周渊平(四川大学 电子信息学院,四川 成都 610065)
Android是一种基于Linux的开源操作系统,它具有十分丰富的应用。文章提出了将搭载有Android系统的主板TQ210和双音多频拨号芯片MT8880通过主板上的摄像头B接口连接起来,设计一个可以在Android系统上接听和拨打有线电话的应用,然后在 Linux 内核中编写驱动程序,并在HAL层和JNI层中生成动态库文件,实现在Android平台上通过有线接听和拨打电话的功能。经过测试,该设计方案能成功接听和拨打电话。
Android; 有线电话; MT8880; HAL; JNI
随着移动通信技术的发展,移动通信经历了从第一代到第四代的飞速发展,目前,5G通信已经进入测试阶段。然而移动通信的每一次改变,通信频率几乎是成倍增加,使得每一个基站的信号覆盖率会越来越小,这样就会要求建立更多的基站,但是在城市里,居民不可能同意在自己的小区及小区附近建立基站,所以可以大胆预测,当5G通信到来时,室内的信号将会比较弱,手机通话质量会大大降低,这样使得辐射也会大大增加,通话稳定性将会显著降低。所以本文提出了一种在搭载有Android4.0系统的主板TQ210上拨打有线电话的方法,既可以克服手机在室内信号差的不足,又可以在主板上完成手机所具有的所有功能,这样在室内就可以完全不用手机。
1硬件系统设计
硬件系统由主板TQ210与MT8880模块及其外围电路构成,如图1所示。主板TQ210采用了三星公司推出的S5pv210微处理器[1],从图1中可以看出主板TQ210的外围电路十分齐全。只需要将TQ210开发板的GPIO接口与MT8880模块连接起来,就可以实现在搭载有Android系统的主板上接听和拨打电话的功能。
https://p3-sign.toutiaoimg.com/mosaic-legacy/12ca000041691368388d~tplv-tt-large.image?x-expires=1974835502&x-signature=mHNsp8vhcZSjf3Xq5CQljaehR1w%3D
1.2MT8880模块简介
MT8880收发芯片是具有微处理器接口的、功能较丰富的双音多频(DTMF)芯片。它的发送部分采用行列计数器及频率稳定性较高的D/A转换器,可以发出16种双音多频DTMF信号;接收部分能接收16个DTMF信号,并把DTMF信号分离及解码,以4位并行二进制方式输出[2]。MT8880芯片的功耗非常低,集成度相当高且定时准确,可以调整双音频模式的占空比,能自动抑制拨号音和调整信号增益,还带有标准的数据总线,可以与TTL电平兼容,并可方便地进行编程控制[3]。
https://p3-sign.toutiaoimg.com/mosaic-legacy/12ca0000416a3194bfe5~tplv-tt-large.image?x-expires=1974835502&x-signature=bc7FNlo39fUQG7%2BE5mayc7%2F1lRI%3D
1.2.1引脚排列与功能
MT8880芯片引脚排列如图2所示。该芯片有20个引脚,其中1脚为运放的同向输入引脚;2脚为运放的反向输入引脚;3脚为运放增益选择端;4脚为基准电压输出端;5脚为电源地;6脚为DTMF时钟/振荡器输入,采用3.579 545 MHz的时钟信号;7脚为时钟输出引脚;8脚为输出DTMF信号引脚;9脚为读写控制端;10脚为片选引脚;11脚为寄存器选择引脚,当为低电平时,控制数据寄存器的读写,当为高电平时,控制状态寄存器和控制寄存器的读写;12脚为系统时钟输入;13脚为中断处理请求端;14~17脚为数据线,控制DTMF信号的发送和接收;18脚为滞后前输出,当检测到有效音频时,就变为高电平,信号条件不足时又立刻返回低电平;19脚为滞后输出/保护后输出;20脚为电源正极,为该芯片提供所需电压[4]。
https://p3-sign.toutiaoimg.com/mosaic-legacy/12520006ae0d8b0e3ae9~tplv-tt-large.image?x-expires=1974835502&x-signature=7x9c8Yep1K4qGvz%2FtyPA5rOfArM%3D
1.2.2信号音判断原理
信号音主要由拨号音、忙音及回铃音组成,其中拨号音是连续脉冲信号,忙音和回铃音的频率相同,都在425 Hz~475 Hz,但它们通断时间并不一样,回铃音在1 s时间为通,4 s时间为断开,而忙音则是以0.7 s为一个周期,在一半的时间接通,一半的时间断开。若要判断信号音,应该在拨号后将MT8880芯片设置为呼叫处理模式,MT8880的呼叫处理滤波器是一个带通滤波器,当信号输入端有信号音输入时,在IRQ/CP就输出一高电平,此时电话呼叫过程中的各种信号音经MT8880滤波,限幅后得到方波,并由MT8880芯片的IRQ引脚输出,判断该引脚上的信号就知道为何种信号音。
在本次编程中,拨完电话号码后,就让MT8880芯片工作在CP模式,并开启中断及定时器,采用下降沿触发,计数时间为5 s,判断步骤如下:
(1)若计数值小于256则为拨号音,进入其他状态并继续检测。若计数值还是小于256,则说明还是在通话中,一直检测,直到计数值大于256后就挂断电话,因为此时对方已经挂断了电话。
(2)如果计数值在1 024~1 791之间,则为忙音,直接挂断电话。
(3)若计数值在256~1 023,则为回铃音,等待对方接听,并继续进入CP模式检测。
1.2.3MT8880模块与主板连接原理
https://p3-sign.toutiaoimg.com/mosaic-legacy/1254000f8deebe15d59b~tplv-tt-large.image?x-expires=1974835502&x-signature=toLqxY3qMx1UJqs1cnhTF6%2F5c0U%3D
由于TQ210主板上并没有直接可用的GPIO口,经过查阅电路图发现摄像头接口CAMERA_B的引脚与GPIO口复用,它使用了GPJ0口的全部引脚和GPJ1口的部分引脚。若要将此接口作为GPIO口,只需要将原来配置的摄像头驱动中对GPJ1、GPJ0引脚的初始化代码去掉,然后在自己写的驱动中对这些引脚初始化成所需的功能即可。图3为MT8880模块输入输出接口与开发板的GPIO接口对接图,其中D0~D3为数据线,当打电话时,把这4个脚配置为输出,当接电话时,把这4个脚配置为输入,为以后做来电显示做准备。具体每个脚的功能见表1。
2软件设计
Android系统的底层是Linux[5],所以所有的软件设计都是在Ubuntu14.04系统上完成的,要使该芯片能够正常工作,则必须要在Linux内核中编写相应的驱动文件,在HAL层和JNI层生成动态库文件以及在应用层编写应用程序[6]。
2.1MT8880驱动开发
在/opt/EmbedSky/TQ210/Kernel_3.0.8_TQ210_for_Linux_v1.4/drivers/char目录下新建一个tq210_mt8880.c,然后在tq210_mt8880.c文件里编写好程序后并保存,修改该目录下的Kconfig文件,在终端执行命令make menuconfig时可以看到刚刚新增的配置选项,最后修改该目录下的Makefile文件,然后在make menuconfig中选择刚才加上的菜单,重新编译内核,如果成功,则内核就已经包含了最新加进去的MT8880驱动了。
2.2HAL层开发
硬件抽象层(Hardware Abstraction Layer,HAL)是建立在Linux驱动之上的一套动态库。这套动态库是属于Linux内核层之上的系统运行库层[7]。
Android系统的HAL层是为了避开Linux的GPL束缚,保护一些硬件供应商的知识产权而提出的,HAL层用于控制硬件的动作,而Linux 驱动程序仅仅完成一些简单的数据交互作用,甚至把硬件寄存器空间直接映射到user space[8]。目前HAL存在两种架构,位于libhardware_legacy目录下的“旧HAL架构”和位于hardware的libhardware目录下的“新HAL架构”。主板TQ210采用了“新HAL架构”。新HAL架构如图4所示。
https://p3-sign.toutiaoimg.com/mosaic-legacy/12c6000f910bc0c984ab~tplv-tt-large.image?x-expires=1974835502&x-signature=pBCEyZhpmvanme4f7lkPZsw5D5Y%3D
编写HAL层代码步骤如下:
(1)首先在TQ210_Android_4.0.4_V1.4/hardware/Libhardward/include下创建MT8880.h头文件,编写头文件源码并保存。
(2)然后在/opt/EmbedSky/TQ210/TQ210_Android_4.0.4_V1.4/device/embedsky/tq210目录下创建libMT8880文件夹,在该文件夹中新建MT8880.c文件,在该文件里编写源码,然后保存该文件,最后在该文件夹下创建Android.mk文件并编写该文件的源码,然后保存该文件。
(3)最后在终端输入相关命令进行编译,将在目录下生成的MT8880.tq210.so文件复制到主板上的system/lib/hw目录下,当然也可以放在其他目录下。
2.3JNI层开发
JNI的全称为Java Native Interface,它是Java平台的一部分,并允许Java代码与其他语言写的代码进行交互,使得在JVM(Java虚拟机)内部运行的Java字节码能够与其他语言(比如C、C++等)进行交互操作[9],图5为JNI层在Android中的位置关系图。
https://p3-sign.toutiaoimg.com/mosaic-legacy/1254000f8def9ec73d5e~tplv-tt-large.image?x-expires=1974835502&x-signature=jA5UZw1T78kibVT%2F5MG524n9m8c%3D
在/opt/EmbedSky/TQ210/TQ210_Android_4.0.4_V1.4/packages/apps中创建MT8880文件夹,用来存放jni源码,在该文件夹中新建文件MT8880Service.cpp,编写源码并保存,这里需要注意的是函数的前置Java_com_embedsky_MT8880_MT8880Activity_决定了创建应用程序使用的包名。其次创建Android.mk文件,编写源码并保存。最后在终端输入相关命令进行编译,将生成的libMT8880.so文件复制到主板对应的目录中[10]。
3测试及结果
在本次测试中,将TQ210开发板(搭载Android4.0系统)与MT8880模块及其外围电路通过开发板上的CAMERA_B接口连接起来,并把电话线接到MT8880上的RJ11接口上,然后打开开发板上的通讯录APP,点击按钮进行拨号。经过测试,该装置能顺利拨通要打的电话,并且语音质量良好,测试结果如图6~图8所示。
https://p3-sign.toutiaoimg.com/mosaic-legacy/12c200187a6ea778c72c~tplv-tt-large.image?x-expires=1974835502&x-signature=dGtzh9onIRtI2LsxYh2zjLtgOxY%3D
https://p3-sign.toutiaoimg.com/mosaic-legacy/12c200187a6f0ff743fe~tplv-tt-large.image?x-expires=1974835502&x-signature=RklpUc0xU4Saop%2BmU7w8WxqJfBU%3D
https://p3-sign.toutiaoimg.com/mosaic-legacy/12c200187a701395683e~tplv-tt-large.image?x-expires=1974835502&x-signature=1kbelRycLj86%2FyWeN3rGoJMiwPM%3D
4结论
本文实现了在Android系统上通过MT8880芯片拨打和接听有线电话的功能,并且该方案既有抗干扰能力强、辐射小、保密性强的通信特点,又具有Android平台的所有特性。如果将手机上的通讯信息同步到该系统上,然后直接在该系统上拨出要打的电话号码,即可完全实现无线与有线的融合,把两者的优点结合起来,这样该设计方案将更加完美。
参考文献
[1] 广州天嵌计算机科技有限公司.TQ210用户硬件手册[Z].2012.
[2] 李传南,王剑刚,李宝华.单片机与DTMF信号收发芯片MT8880的直接接口设计[J].电子与自动化,1999(2):23-24.
[3] 张立臣.DTMF信号收、发芯片MT8888原理及应用[J].国外电子元器件,2001(9):30-31.
[4] 董守田,徐风文.DTMF收发芯片MT8888的应用[J].农机化研究,2003(2):216-217.
[5] 宋宝华.Linux设备驱动开发详解(第二版)[M].北京:人民邮电出版社,2013.
[6] 李刚.疯狂Android讲义[M].北京:电子工业出版社,2015.
[7] 李宁. Android开发权威指南[M]. 北京:人民邮电出版社,2011.
[8] 韦德琼.基于Android系统的驱动模块的设计和实现[D].哈尔滨:哈尔滨工业大学,2012.
[9] 施月玲,宣凯,张海平,等.JNI技术在Android平台融合通信终端的应用[J].杭州电子科技大学学报(自然科学版),2015,28(2):41-44.
[10] 杜江,周渊平.基于Android的电话拨号功能[J].计算机系统应用,2014,23(12):245-248.
AET会员年终大福利!
页:
[1]