android 3G功能移植
2015-06-04 15:30
447 查看
地址:http://blog.csdn.net/hanmengaidudu/article/details/17021303
曾几何时在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中增加的代码
[html] view
plaincopy
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.}
曾几何时在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中增加的代码
[html] view
plaincopy
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.}
相关文章推荐
- android布局也好,框架也好总之xml中控件中的name属性对应类时,貌似必须跟类名完全相同?
- RecyclerView 解析
- Android代码片段:验证数据
- 自定义View实现Android圆形进度条,支持自定义显示的样式
- Android ColorMatrix总结
- Android设计模式(六)--工厂方法模式
- Android DrawerLayout-侧滑菜单
- Android视频播放器--手势控制亮度、音量、缩放
- Android中自定义View的onMeasure以及MeasureSpec使用
- ListView 滚动条
- android下面使用SurfaceView+ mediaPlayer播放视频
- Android进步之十一:Json解析
- Android Context 上下文 你必须知道的一切
- android使用隐藏api的方法(使用被@hide的api)
- Google I/O 2015 为 Android 开发者带来了哪些福利?
- Android 强制隐藏软键盘
- Android登陆界面实现-支持输入框清楚和震动效果功能
- android 回车键事件
- Android BLE开发之Android手机与BLE终端通信
- NDK下 将Platinum SDK 编译成so库 (android - upnp)