时间:2024-07-28
牟 跃,周渊平
(四川大学 电子信息学院, 四川 成都 610065)
基于Android电话拨号功能的驱动设计
牟 跃,周渊平
(四川大学 电子信息学院, 四川 成都 610065)
由于Android操作系统开放源码,在近几年被广泛用于各个领域,可以利用Android系统的开放性,开发该系统在有线电话方面的应用。将Android平台与拨号芯片MT8880结合起来研究。因为Android原生代码具有很大局限性,支持的设备太少,所以为了识别MT8880这个特定设备,并控制MT8880的逻辑输出,需要在Linux内核中添加驱动模块,并在HAL层和JNI层生成动态链接库,使得顶层应用程序可以控制拨号芯片MT8880。MT8880芯片主要用于发送双音多频信号(Dual Tone Multi Frequency),在加载了拨号驱动和应用程序后,可以实现Android系统的拨号功能。经测试,设计的拨号驱动能实现对新增设备的控制,电话应用能成功拨号。
Android;Linux内核; HAL; JNI;MT8880芯片
图1 系统框架图
Android是由Google公司和开放手机联盟领导及开发、基于Linux内核的开放源代码的操作系统[1]。Android最近几年发展迅猛,被用于各种场合。TQ210开发板搭载的是Android4.0系统,使用的是三星公司生产的S5PV210处理器,能够满足大多数应用场合的需求。而采用的拨号芯片MT8880能够发送经过滤波处理过的双音多频(Dual Tone Multi Frequency,DTMF)信号。
电话由于其信号稳定、抗干扰能力强、辐射小等优点被广泛用于企业、事业机构和个人。在如今移动设备被各个行业广泛应用的大环境下,可以通过底层驱动的开发[2],使得Android可以识别外部新增设备。将Android平台与拨号芯片MT8880结合研究,可以实现Android电话拨号功能。
1.1 硬件框架
Android开发平台(TQ210开发板)和MT8880拨号芯片构成了硬件系统的主要部分[3],如图1所示。Android平台采用 TQ210 开发板, TQ210开发板的核心板为63 mm×53 mm×7 mm的10层板,共有280根引脚。核心板引出了两路摄像头接口CAMERA_A和CAMERA_B,其中CAMERA_B主要是开发板为满足不同开发需求预留的应用接口,可GPIO口复用,当不用摄像头功能时,可作为GPIO扩展口。Android的 GPIO接口连接MT8880拨号芯片,使用CAMERA_B的GPIO口与芯片的相应管脚相连接,并通过GPIO口输出高低逻辑电平,对芯片进行控制,实现发送DTMF信号的功能。
1.2 语音拨号芯片MT8880
MT8880芯片采用ISO-CMOS技术制造,具有功耗低和稳定性高等特点,能够比较准确地发送DTMF信号。MT8880的发送部分的内部逻辑如图2所示。从结构上看,在发送与电话号码对应的DTMF信号之前,必须对寄存器进行相应操作,首先选择对状态寄存器SR和控制寄存器CRA进行操作,打开信号音突发选通电路,使芯片能够输出信号,然后通过控制寄存器CRB和发送数据寄存器TDR,使得电话号码能够通过D1~D4数据线输入,最后经过行、列计数器和D/A转换器,输出DTMF信号。通过RSO及WR和RD口线可对相关寄存器进行选择和控制,具体控制功能的实现如表1。 从外部看,可以通过外部微处理器访问其内部的寄存器,以实现DTMF信号的发送功能。
图2 MT8880发送部分内部结构框图
RSOWRRD功能001写发送数据寄存器10读接收数据寄存器101写控制寄存器10读状态寄存器
2.1 Android源码编译环境的搭建
首先在64位的Ubuntu12.04操作系统中,完成Android源码的编译操作,并在系统中安装和配置JDK,而为了顺利编译Android源码,在系统中还需要安装GCC编译器、相关的库和交叉编译器arm-linux-gcc。在完成编译环境的搭建后,目标代码便能在其他平台上运行。
2.2 拨号功能的软件框架
Android的系统架构与其操作系统一样,采用了分层架构,主要包括应用程序层、应用程序框架层、系统运行库和核心层[4],如图3所示。为使Android可以识别拨号芯片MT8880这个特定的新增设备,即通过顶层代码实现对硬件设备的控制,首先在Linux内核实现了名为tel.c的内核驱动,为系统上层提供了操作底层硬件的接口;然后在HAL层封装控制逻辑,在JNI层将本地代码封装成上层应用可以调用的Java代码,并生成相应的动态链接库文件即.so文件;最后顶层便可通过调用动态链接库,实现拨号功能。
图3 系统软件框架图
2.2.1 底层驱动设计
底层驱动模块主要是控制CAMERA_B上的GPIO管脚,提供控制MT8880拨号芯片硬件设备接口的逻辑电平,使得系统能够控制外部芯片MT8880实现拨号。拨号驱动程序tel.c采用的混杂型驱动设备miscdevice,主要由设备的注册misc_register、注销misc_deregister、打开open、关闭close等部分组成。驱动程序tel.c通过宏S3C_GPIO_SFN(x)对管脚功能进行定义,当x为0时,管脚为输入,x为1时,管脚为输出;通过函数int s3c_gpio_setpull(unsigned int pin, amsung_gpio_pull_t pull)为指定的GPIO管脚配置上下位状态;通过函数int gpio_request(unsigned gpio, const char *label)向内核申请管脚,并用label去描述它;通过函数void gpio_free(unsigned gpio)释放一个已经申请的引脚,此函数与gpio_request对应;通过函数int gpio_direction_output(unsigned gpio, int value )在管脚处输出一个电平value(0或者1);通过函数int gpio_direction_input(unsigned gpio)读取;通过函数static unsigned int gpio_cfg_table[]定义了gpio_table数组,这个数组用来定义电话驱动所用的GPIO引脚,总共需要7个引脚,分别为GPI0的0~6口。
2.2.2 驱动的编译与安装
将底层驱动程序tel.c文件编写好后放入到/driver/char/mydrivers目录下,并修改该目录下的Kconfig和Makefile文件。由于使用动态加载驱动程序,所以必须先通过make menuconfig和make modules命令生成.ko文件,运行以上两个命令后其编译结果如图4所示。 然后使用adb devices和adb push命令将tel.ko文件传送到开发板上,并通过adb shell 命令进入到Android Shell命令模式,即切换到开发板,最后使用insmod 命令将tel.ko模块加载到开发板上。使用以上命令后,其编译结果如图5所示。
图4 生成模板并传递到开发板上
图5 加载模块
2.3 HAL层软件
硬件抽象层(Hardware Abstraction Layer,HAL)位于Linux内核上面一层[5],其具体位置如图6所示。HAL层主要用于隐藏底层驱动的业务逻辑,即顶层调用底层驱动的具体细节,这样就能够摆脱Linux开源束缚,使关于驱动开发的具体细节不用公开,得到保护。
图6 新HAL架构
编译 HAL 层库文件方法如下:
(1)首先在 hardware/libhardware/include 目录下创建tel.h 头文件。tel.h头文件主要用于定义hw_module_t、hw_device和hw_module_methods这三个重要的关系紧密的结构体。tel.h也为HAL模块定义了一个ID,通过这个ID来查找tel的HAL模块。
(2)然后需要在device/embedsky/tq21目录下创建名为libwiretelephone的文件夹,在该文件夹中添加tel.c、Android.mk 两个文件。在HAl层实现了所有拨号驱动的业务逻辑, 在HAL层通过对GPIO口的控制实现对MT8880拨号芯片发送部分的控制,使芯片能够发出双音多频(DTMF)信号。
(3)运行mmm device/embedsky/tq210/libtel命令生成tel.tq210.so文件,然后将文件复制到开发板上的/system/lib/hw目录。最后通过adb device命令和adb push命令将tel.tq210.so文件加载到开发板上[6],运行以上命令后,编译结果如图7所示。
图7 编译 HAL 层库文件
2.4 JNI层软件
JNI(Java Native Interface)层指的是本地编程接口[7],其工作原理图如图8所示。主要使Java编写的应用程序和用C、C++编写的底层驱动及一些本地链接库能够实现信息的交互。
图8 JNI原理图
编译 JNI 层库文件的方法如下:
(1)在Android 文件系统下的 packages /apps 下创建一个名为libtel的文件夹, 再在该文件夹中创建 jni 文件夹,在jni文件夹中创建tel.cpp 和Androi d.mk 文件。在tel.cpp文件中,通过JNINativeMethod定义了JNI函数的映射。通过 registe_android_server_telService(JNIEnv *env)函数将JNI程序库与Java类绑定,系统在成功装载JNI共享库后会自动调用JNI_Onload函数,用于初始化JNI模块。
(2)在packages/apps/ Wiretelephone/jni/ 目录下运行mmm,生成libtel.so动态共享库[8],然后使用cp命令将生成的文件复制到开发板对应的out/target/product/tq210/rootfs_dir/system/lib目录下。最后通过adb device命令和adb push命令将tel.tq210.so文件加载到开发板上,运行以上命令,其编译成功后,结果如图9所示。
图9 编译JNI层库文件
在TQ210开发板中加载电话拨号程序的APP层程序后,测试驱动能否正常运行,实现其相关功能,有如下几步:
(1)将TQ210开发板的相关GPIO接口与示波器相连接,打开开发板和示波器电源,通过拨号界面拨号时,示波器上出现对应的电平波形,即相关GPIO接口能够实现输出功能,内核驱动实现了对通用接口的控制。
(2)将TQ210开发板、MT8880芯片和电话连接起来,在拨号界面进行拨号, 经测试能顺利拨通,即可以控制MT8880芯片产生DTMF信号。
经过以上测试,该驱动程序实现了对MT8880芯片的控制,使整个系统在加载了APP程序后能够实现拨号功能,如图10所示。
通过以上测试,说明该驱动程序能够实现对MT8880芯片的控制,即Android可以通过新增驱动模块识别特定设备,在加载了应用层程序后能够通过MT8880拨号芯片实现完整的DTMF信号发送功能。即通过开发板的通用GPIO口操纵拨号控制芯片,实现语音拨号功能,可以通过在Linux Kernel中添加新的驱动模块,使得Android能够识别添加的特定硬件设备。在本文基础上,如果再添加来电显示的驱动,控制MT8880的寄存器的设置,实现来电显示控制,就可以组成一个完整的电话系统。
[1] 宋小倩,周东升.基于 Android 平台的应用开发研究[J].软件导刊,2011,10(2):104-106.
[2] 宋宝华.Linux 设备驱动开发详解(第2版)[M].北京:人民邮电出版社,2010.
[3] 杜江,周渊平.基于 Android的电话拨号功能[J]. 计算机系统应用, 2014(12):245-248.
[4] 姚昱旻,刘卫国.Android 的架构与应用开发研究[J].计算机系统应用,2008,17(11):110-112.
[5] 李宁.Android深度探索(卷1): HAL与驱动开发[M].北京:人民邮电出版社,2013.
[6] 付兴武,张军,王洋.基于 SPI 总线协议的字符设备驱动程序[J].计算机系统应用,2013(2):146-150.
[7] 李宁.Android开发权威指南(第2版)[M].北京:人民邮电出版社,2013.
[8] 明日科技.Android 从入门到精通[M].北京:清华大学出版社, 2012.
周渊平(1955-), 男, 教授,博士生导师,主要研究方向:通信与信息系统、信号与信息处理。
Design of driver based on Android phone dialing function
Mou Yue, Zhou Yuanping
(College of Electronic Information, Sichuan University, Chengdu 610065, China)
Android is an open operating system based on the Linux Kernel,and it is widely used in a variety of mobile devices.This article combines the Android platform with the dial-up chip MT8880. Android native code supports very few devices,so we need to add a new low-level driver module in Linux Kernel,through the dynamic link libraries which are generated in the HAL layer and JNI layer,so that Android can identify a specific device MT8880,and control the logic output of MT8880.After loading the application,MT8880 chip can send Dual Tone Multi Frequency (DTMF) signal,finally realize Android system dial-up function. After testing,the dial-up driver can control the new device,the phone application can dial successfully.
Android; Linux Kernel; HAL; JNI;MT8880 chip
TP399
A
10.19358/j.issn.1674- 7720.2017.09.026
牟跃,周渊平.基于Android电话拨号功能的驱动设计[J].微型机与应用,2017,36(9):88-91,99.
2016-12-13)
牟跃(1992-),女, 硕士研究生,主要研究方向:信号与信息处理。
我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自各大过期杂志,内容仅供学习参考,不准确地方联系删除处理!