硬件:
Devkit8000 256M+256M
HuaWei EM770 WCDMA模块
Option ICON7.2 mini-pci转USB卡座
软件版本:
0xdroid beagle-eclair
0xkernel 2.6.32
源码下载与编译,参考0xlab官方wiki:http://code.google.com/p/0xdroid/wiki/Source
Android中负责与Modem交互的模块是RIL,位于源码的hardware目录之下。这部份代码自发布以来基本上没怎么更新过,主要都是各个基带厂商根据自己的芯片去实现这部份代码。
前不久在Google上网卡的时候,看到HUAWEI EM770支持语音电话,所以就萌生了一个想法,将它更到Android上来玩。在淘宝上入手了一块拿来研究,在windows上只要修改下Mobile Partner的configure文件就可以打接电话了,下载链接:
一、编译内核
弄到Android上,首先得让Linux内核认识EM770才行,所以第一步理所当然的就是配置kernel.
make menuconfig:
Device Drivers --->
[*] USB support --->
<*> USB Serial Converter support --->
[*] USB Serial Console device support
[ ] Functions for loading firmware on EZUSB chips
[*] USB Generic Serial Driver
<*> USB FTDI Single Port Serial Driver
<*> USB driver for GSM and CDMA modems
make uImage
好像直接用官方编好的0xkernel镜像也行。
二、进入Linux,检查驱动是否正常工作。
我调试Android的是先进入普通Linux再chroot到Android,自己怎样玩看个人喜好。
配置好usb转串口的驱动后,插入上网卡,会在dev下生成ttyUSB0、ttyUSB1、ttyUSB2三个设备。通过先前在X86下测试这三个串口可以得知ttyUSB0是AT口,ttyUSB2是URC口,ttyUSB1谷狗告诉我是trace log用的没找到Linux下可用的软件进行验证,先不管它。
三、修改RIL源码
RIL默认下访问Modem是打开的/dev/ttySx结点,而且URC与AT都是一个口子,显然EM770就不能工作了。修改的思路就是让收发AT的线程打开/dev/ttyUSB0,同时创建一个新的线程来收URC就行了。
1、在ril/reference-ril/Android.mk添加一行:
LOCAL_CFLAGS += -DHUAWEI_EM770
2、在ril/reference-ril/atchannel.c中添加下面两个函数:
#ifdef HUAWEI_EM770
#include <termios.h>
static int urc_fd = -1; /* fd of the URC channel */
static char s_URCBuffer[MAX_AT_RESPONSE+1];
static char *s_URCBufferCur = s_URCBuffer;
static pthread_t s_tid_reader_urc;
#endif
#ifdef HUAWEI_EM770
static const char *urc_readline()
{