Android平台开发-3G
function porting-3G功能移植 2012-03-19 00:33:00
function porting-3G功能移植 2012-03-19 00:33:00
分类: LINUX
曾几何时在Android2.1下调试3G模块,曾几何时模块厂商提供的库不能用,曾几何时只能用自己的库痛苦地调试...这一切的一切都已成往事,昔日的成功在毫无保留下成为浮云,该忘了忘记了,该记得也跟着忘记了。现如今再次调3G模块,却不知道以前如何调试,看来还是要记下来。
我采用的是华为EM770W模块,支持WCDMA网络,由于华为提供的库只支持Android2.2,所以用Android2.1就需要自己修改库源码。
1.修改linux内核
(1)make menuconfig:
Device Drivers --->
<*> OHCI HCD support
[*] Network device support --->
<*> PPP (point-to-point protocol) support
[*] PPP multilink support (EXPERIMENTAL)
[*] PPP filtering
<*> PPP support for async serial ports
<*> PPP support for sync tty ports
<*> PPP Deflate compression
<*> PPP BSD-Compress compression
<*> PPP MPPE compression (encryption) (EXPERIMENTAL)
<*> PPP over Ethernet (EXPERIMENTAL)
<*> PPP over L2TP (EXPERIMENTAL)
[*] USB support --->
<*> USB Serial Converter support --->
<*> USB driver for GSM and CDMA modems
(2)增加EM770W的VID和PID
修改驱动文件drivers/usb/serial/option.c,增加以下代码
#define EM770W_OPTION_VENDOR_ID 0x12d1
#define EM770W_OPTION_PRODUCT_COLT 0x1001
static struct usb_device_id option_ids[] = {
{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COLT) },
…
{ USB_DEVICE(EM770W_OPTION_VENDOR_ID , EM770W_ OPTION_PRODUCT_COLT) },
}
驱动修改后插上3G模块,kernel运行后可在/dev下出现ttyUSB0、ttyUSB1 、ttyUSB2、ttyUSB3、ttyUSB4、ttyUSB5和ppp设备文件
2.修改RIL代码
(1)在ril/reference-ril/Android.mk添加一行:
LOCAL_CFLAGS += -DHUAWEI_EM770W
(2)在ril/reference-ril/atchannel.c中增加的代码
我采用的是华为EM770W模块,支持WCDMA网络,由于华为提供的库只支持Android2.2,所以用Android2.1就需要自己修改库源码。
1.修改linux内核
(1)make menuconfig:
Device Drivers --->
<*> OHCI HCD support
[*] Network device support --->
<*> PPP (point-to-point protocol) support
[*] PPP multilink support (EXPERIMENTAL)
[*] PPP filtering
<*> PPP support for async serial ports
<*> PPP support for sync tty ports
<*> PPP Deflate compression
<*> PPP BSD-Compress compression
<*> PPP MPPE compression (encryption) (EXPERIMENTAL)
<*> PPP over Ethernet (EXPERIMENTAL)
<*> PPP over L2TP (EXPERIMENTAL)
[*] USB support --->
<*> USB Serial Converter support --->
<*> USB driver for GSM and CDMA modems
(2)增加EM770W的VID和PID
修改驱动文件drivers/usb/serial/option.c,增加以下代码
#define EM770W_OPTION_VENDOR_ID 0x12d1
#define EM770W_OPTION_PRODUCT_COLT 0x1001
static struct usb_device_id option_ids[] = {
{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COLT) },
…
{ USB_DEVICE(EM770W_OPTION_VENDOR_ID , EM770W_ OPTION_PRODUCT_COLT) },
}
驱动修改后插上3G模块,kernel运行后可在/dev下出现ttyUSB0、ttyUSB1 、ttyUSB2、ttyUSB3、ttyUSB4、ttyUSB5和ppp设备文件
2.修改RIL代码
(1)在ril/reference-ril/Android.mk添加一行:
LOCAL_CFLAGS += -DHUAWEI_EM770W
(2)在ril/reference-ril/atchannel.c中增加的代码
点击(此处)折叠或打开
-
1.#include <termios.h>
-
-
1.
-
-
2.static int urc_fd = -1; /* fd
of the URC channel */ -
-
3.static char s_URCBuffer[MAX_AT_RESPONSE+1];
-
-
4.static char *s_URCBufferCur = s_URCBuffer;
-
-
5.static pthread_t s_tid_reader_urc;
-
1.static const char *urc_readline()
-
-
1.{
-
-
2. ssize_t count;
-
-
3. char *p_read = NULL;
-
-
4. char *p_eol = NULL;
-
-
5. char *ret;
-
-
6.7. if (*s_URCBufferCur == '\0') {
-
-
8. s_URCBufferCur = s_URCBuffer;
-
-
9. *s_URCBufferCur = '\0';
-
-
10. p_read = s_URCBuffer;
-
-
11. } else {
-
-
12. while (*s_URCBufferCur == '\r' || *s_URCBufferCur == '\n')
-
-
13. s_URCBufferCur++;
-
-
14. p_eol = findNextEOL(s_URCBufferCur);
-
-
15. if (p_eol == NULL) {
-
-
16. size_t len;
-
-
17. len = strlen(s_URCBufferCur);
-
-
18. memmove(s_URCBuffer, s_URCBufferCur, len + 1);
-
-
19. p_read = s_URCBuffer + len;
-
-
20. s_URCBufferCur = s_URCBuffer;
-
-
21. }
-
-
22. }
-
-
23. while (p_eol == NULL) {
-
-
24. if (0 == MAX_AT_RESPONSE - (p_read - s_URCBuffer)) {
-
-
25. LOGE("ERROR: Input line exceeded buffer\n");
-
-
26. s_URCBufferCur = s_URCBuffer;
-
-
27. *s_URCBufferCur = '\0';
-
-
28. p_read = s_URCBuffer;
-
-
29. }
-
-
30. do {
-
-
31. count = read(urc_fd, p_read, MAX_AT_RESPONSE - (p_read - s_URCBuffer));
-
-
32. } while (count < 0 && errno == EINTR);
-
-
33. if (count > 0) {
-
-
34. AT_DUMP( "<< ", p_read, count );
-
-
35. s_readCount += count;
-
-
36. p_read[count] = '\0';
-
-
37. while (*s_URCBufferCur == '\r' || *s_URCBufferCur == '\n')
-
-
38. s_URCBufferCur++;
-
-
39. p_eol = findNextEOL(s_URCBufferCur);
-
-
40. p_read += count;
-
-
41. } else if (count <= 0) {
-
-
42. if(count == 0) {
-
-
43. LOGD("atchannel: EOF reached");
-
-
44. } else {
-
-
45. LOGD("atchannel: read error %s", strerror(errno));
-
-
46. }
-
-
47. return NULL;
-
-
48. }
-
-
49. }
-
-
50. ret = s_URCBufferCur;
-
-
51. *p_eol = '\0';
-
-
52. s_URCBufferCur = p_eol + 1;
-
53. LOGD("AT< %s\n", ret);
-
-
54. return ret;
-
-
55.}
-
-
56.
-
-
57.static void *urc_readerLoop(void *arg)
-
-
58.{
-
-
59. for (;;) {
-
-
60. const char * line;
-
-
61. line = urc_readline();
-
-
62. if (line == NULL) {
-
-
63. break;
-
-
64. }
-
-
65. if(isSMSUnsolicited(line)) {
-
-
66. char *line1;
-
-
67. const char *line2;
-
-
68. line1 = strdup(line);
-
-
69. line2 = readline();
-
-
70. if (line2 == NULL) {
-
-
71. break;
-
-
72. }
-
-
73. if (s_unsolHandler != NULL) {
-
-
74. s_unsolHandler (line1, line2);
-
-
75. }
-
-
76. free(line1);
-
-
77. } else {
-
-
78. processLine(line);
-
-
79. }
-
-
80. }
-
-
81. onReaderClosed();
-
-
82. return NULL;
-
- 83.}
(3)修改ril/reference-ril/atchannel.c中的at_open函数,增加HUAWEI_EM770W宏控制的代码
点击(此处)折叠或打开
-
pthread_attr_init (&attr);
-
-
1. pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
-
-
2.
-
-
3.#ifdef HUAWEI_EM770W
-
-
4. int fd2 = -1;
-
-
5. while(fd2 < 0) {
-
-
6. fd2 = open ("/dev/ttyUSB2", O_RDWR);
-
- 7. if (fd2