android 3G功能移植

地址:http://blog.youkuaiyun.com/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 plain copy 在CODE上查看代码片 派生到我的代码片
  1. 1.#include <termios.h>  
  2.   
  3. 1.  
  4.   
  5. 2.static int urc_fd = -1; /* fd of the URC channel */  
  6.   
  7. 3.static char s_URCBuffer[MAX_AT_RESPONSE+1];  
  8.   
  9. 4.static char *s_URCBufferCur = s_URCBuffer;  
  10.   
  11. 5.static pthread_t s_tid_reader_urc;  
  12. 1.static const char *urc_readline()  
  13.   
  14. 1.{  
  15.   
  16. 2. ssize_t count;  
  17.   
  18. 3. char *p_read = NULL;  
  19.   
  20. 4. char *p_eol = NULL;  
  21.   
  22. 5. char *ret;  
  23.   
  24. 6.7. if (*s_URCBufferCur == '\0') {  
  25.   
  26. 8. s_URCBufferCur = s_URCBuffer;  
  27.   
  28. 9. *s_URCBufferCur = '\0';  
  29.   
  30. 10. p_read = s_URCBuffer;  
  31.   
  32. 11. } else {   
  33.   
  34. 12. while (*s_URCBufferCur == '\r' || *s_URCBufferCur == '\n')  
  35.   
  36. 13. s_URCBufferCur++;  
  37.   
  38. 14. p_eol = findNextEOL(s_URCBufferCur);  
  39.   
  40. 15. if (p_eol == NULL) {  
  41.   
  42. 16. size_t len;  
  43.   
  44. 17. len = strlen(s_URCBufferCur);  
  45.   
  46. 18. memmove(s_URCBuffer, s_URCBufferCur, len + 1);  
  47.   
  48. 19. p_read = s_URCBuffer + len;  
  49.   
  50. 20. s_URCBufferCur = s_URCBuffer;  
  51.   
  52. 21. }  
  53.   
  54. 22. }  
  55.   
  56. 23. while (p_eol == NULL) {  
  57.   
  58. 24. if (0 == MAX_AT_RESPONSE - (p_read - s_URCBuffer)) {  
  59.   
  60. 25. LOGE("ERROR: Input line exceeded buffer\n");  
  61.   
  62. 26. s_URCBufferCur = s_URCBuffer;  
  63.   
  64. 27. *s_URCBufferCur = '\0';  
  65.   
  66. 28. p_read = s_URCBuffer;  
  67.   
  68. 29. }  
  69.   
  70. 30. do {  
  71.   
  72. 31. count = read(urc_fd, p_read, MAX_AT_RESPONSE - (p_read - s_URCBuffer));  
  73.   
  74. 32. } while (count < 0 && errno == EINTR);  
  75.   
  76. 33. if (count > 0) {  
  77.   
  78. 34. AT_DUMP( "<< ", p_read, count );  
  79.   
  80. 35. s_readCount += count;  
  81.   
  82. 36. p_read[count] = '\0';  
  83.   
  84. 37. while (*s_URCBufferCur == '\r' || *s_URCBufferCur == '\n')  
  85.   
  86. 38. s_URCBufferCur++;  
  87.   
  88. 39. p_eol = findNextEOL(s_URCBufferCur);  
  89.   
  90. 40. p_read += count;  
  91.   
  92. 41. } else if (count <= 0) {  
  93.   
  94. 42. if(count == 0) {  
  95.   
  96. 43. LOGD("atchannel: EOF reached");  
  97.   
  98. 44. } else {  
  99.   
  100. 45. LOGD("atchannel: read error %s", strerror(errno));  
  101.   
  102. 46. }  
  103.   
  104. 47. return NULL;  
  105.   
  106. 48. }  
  107.   
  108. 49. }  
  109.   
  110. 50. ret = s_URCBufferCur;  
  111.   
  112. 51. *p_eol = '\0';  
  113.   
  114. 52. s_URCBufferCur = p_eol + 1;   
  115. 53. LOGD("AT< %s\n", ret);  
  116.   
  117. 54. return ret;  
  118.   
  119. 55.}  
  120.   
  121. 56.  
  122.   
  123. 57.static void *urc_readerLoop(void *arg)  
  124.   
  125. 58.{  
  126.   
  127. 59. for (;;) {  
  128.   
  129. 60. const char * line;  
  130.   
  131. 61. line = urc_readline();  
  132.   
  133. 62. if (line == NULL) {  
  134.   
  135. 63. break;  
  136.   
  137. 64. }  
  138.   
  139. 65. if(isSMSUnsolicited(line)) {  
  140.   
  141. 66. char *line1;  
  142.   
  143. 67. const char *line2;  
  144.   
  145. 68. line1 = strdup(line);  
  146.   
  147. 69. line2 = readline();  
  148.   
  149. 70. if (line2 == NULL) {  
  150.   
  151. 71. break;  
  152.   
  153. 72. }  
  154.   
  155. 73. if (s_unsolHandler != NULL) {  
  156.   
  157. 74. s_unsolHandler (line1, line2);  
  158.   
  159. 75. }  
  160.   
  161. 76. free(line1);  
  162.   
  163. 77. } else {  
  164.   
  165. 78. processLine(line);  
  166.   
  167. 79. }  
  168.   
  169. 80. }  
  170.   
  171. 81. onReaderClosed();  
  172.   
  173. 82. return NULL;  
  174.   
  175. 83.}  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值