您的位置:首页 > 移动开发 > Android开发

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.}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: