现在的位置: 首页 > 综合 > 正文

Android平台开发-3G function porting-3G功能移植

2013年09月03日 ⁄ 综合 ⁄ 共 3805字 ⁄ 字号 评论关闭

分类: 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中增加的代码

点击(此处)折叠或打开

  1. 1.#include <termios.h>

  2. 1.

  3. 2.static int urc_fd = -1; /* fd
    of the URC channel */

  4. 3.static char s_URCBuffer[MAX_AT_RESPONSE+1];

  5. 4.static char *s_URCBufferCur = s_URCBuffer;

  6. 5.static pthread_t s_tid_reader_urc;
  7. 1.static const char *urc_readline()

  8. 1.{

  9. 2. ssize_t count;

  10. 3. char *p_read = NULL;

  11. 4. char *p_eol = NULL;

  12. 5. char *ret;

  13. 6.7. if (*s_URCBufferCur == '\0') {

  14. 8. s_URCBufferCur = s_URCBuffer;

  15. 9. *s_URCBufferCur = '\0';

  16. 10. p_read = s_URCBuffer;

  17. 11. } else { 

  18. 12. while (*s_URCBufferCur == '\r' || *s_URCBufferCur == '\n')

  19. 13. s_URCBufferCur++;

  20. 14. p_eol = findNextEOL(s_URCBufferCur);

  21. 15. if (p_eol == NULL) {

  22. 16. size_t len;

  23. 17. len = strlen(s_URCBufferCur);

  24. 18. memmove(s_URCBuffer, s_URCBufferCur, len + 1);

  25. 19. p_read = s_URCBuffer + len;

  26. 20. s_URCBufferCur = s_URCBuffer;

  27. 21. }

  28. 22. }

  29. 23. while (p_eol == NULL) {

  30. 24. if (== MAX_AT_RESPONSE - (p_read - s_URCBuffer)) {

  31. 25. LOGE("ERROR: Input line exceeded buffer\n");

  32. 26. s_URCBufferCur = s_URCBuffer;

  33. 27. *s_URCBufferCur = '\0';

  34. 28. p_read = s_URCBuffer;

  35. 29. }

  36. 30. do {

  37. 31. count = read(urc_fd, p_read, MAX_AT_RESPONSE - (p_read - s_URCBuffer));

  38. 32. } while (count < 0 && errno == EINTR);

  39. 33. if (count > 0) {

  40. 34. AT_DUMP( "<< ", p_read, count );

  41. 35. s_readCount += count;

  42. 36. p_read[count] = '\0';

  43. 37. while (*s_URCBufferCur == '\r' || *s_URCBufferCur == '\n')

  44. 38. s_URCBufferCur++;

  45. 39. p_eol = findNextEOL(s_URCBufferCur);

  46. 40. p_read += count;

  47. 41. } else if (count <= 0) {

  48. 42. if(count == 0) {

  49. 43. LOGD("atchannel: EOF reached");

  50. 44. } else {

  51. 45. LOGD("atchannel: read error %s", strerror(errno));

  52. 46. }

  53. 47. return NULL;

  54. 48. }

  55. 49. }

  56. 50. ret = s_URCBufferCur;

  57. 51. *p_eol = '\0';

  58. 52. s_URCBufferCur = p_eol + 1; 
  59. 53. LOGD("AT< %s\n", ret);

  60. 54. return ret;

  61. 55.}

  62. 56.

  63. 57.static void *urc_readerLoop(void *arg)

  64. 58.{

  65. 59. for (;;) {

  66. 60. const char * line;

  67. 61. line = urc_readline();

  68. 62. if (line == NULL) {

  69. 63. break;

  70. 64. }

  71. 65. if(isSMSUnsolicited(line)) {

  72. 66. char *line1;

  73. 67. const char *line2;

  74. 68. line1 = strdup(line);

  75. 69. line2 = readline();

  76. 70. if (line2 == NULL) {

  77. 71. break;

  78. 72. }

  79. 73. if (s_unsolHandler != NULL) {

  80. 74. s_unsolHandler (line1, line2);

  81. 75. }

  82. 76. free(line1);

  83. 77. } else {

  84. 78. processLine(line);

  85. 79. }

  86. 80. }

  87. 81. onReaderClosed();

  88. 82. return NULL;

  89. 83.}



(3)修改ril/reference-ril/atchannel.c中的at_open函数,增加HUAWEI_EM770W宏控制的代码

点击(此处)折叠或打开

  1. pthread_attr_init (&attr);

  2. 1. pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);

  3. 2.

  4. 3.#ifdef HUAWEI_EM770W 

  5. 4. int fd2 = -1;

  6. 5. while(fd2 < 0) {

  7. 6. fd2 = open ("/dev/ttyUSB2", O_RDWR);

  8. 7. if (fd2 

抱歉!评论已关闭.