1. 程式人生 > >Android4.2 Quectel EC20 R2.1模組移植

Android4.2 Quectel EC20 R2.1模組移植

注意:  本文件不支援熱插拔,本文使用GobiNET方式實現4G上網,並沒使用PPPD模式。

1、核心部分的移植 1.1 usb串列埠驅動的修改 修改: autochips/kernel/drivers/usb/serial/option.c kernel/drivers/usb/serial/qcserial.c kernel/drivers/usb/serial/usb_wwan.c 修改:autochips/kernel/drivers/usb/serial/option.c  檔案,新增EC20模組的註冊時的VID和PID號,以及生成裝置階段的介面4用於網路裝置,如下: static const struct usb_device_id option_ids[] = { .....................................................................................     { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x6000)}, /* ZTE AC8700 */     { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x6613)}, /* Onda H600/ZTE MF330 */     { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x9000)}, /* SIMCom SIM5218 */     //EC20 yiyuan 4G LTE module configure     #if  1//Added by Quectel     { USB_DEVICE(0x05C6, 0x9090) }, /* Quectel UC15 */     { USB_DEVICE(0x05C6, 0x9003) }, /* Quectel UC20 */     { USB_DEVICE(0x05C6, 0x9215) }, /* Quectel EC20 */     { USB_DEVICE(0x2C7C, 0x0125) }, /* Quectel EC25/EC20 R2.0 */     { USB_DEVICE(0x2C7C, 0x0121) }, /* Quectel EC21 */     #endif

    { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_6280) },  ......................................................................................... } static int option_probe(struct usb_serial *serial,             const struct usb_device_id *id) {     struct usb_wwan_intf_private *data;

    printk("option_probe, 1\n");       #if 1 //Added by Quectel     //Quectel UC20's interface 4 can be used as USB Network device     if (serial->dev->descriptor.idVendor == 0x05C6 && serial->dev->descriptor.idProduct ==             0x9003 && serial->interface->cur_altsetting->desc.bInterfaceNumber >= 4)         return -ENODEV;         //Quectel EC20's interface 4 can be used as USB Network device     if (serial->dev->descriptor.idVendor == 0x05C6 && serial->dev->descriptor.idProduct ==             0x9215 && serial->interface->cur_altsetting->desc.bInterfaceNumber >= 4)         return -ENODEV;         if (serial->dev->descriptor.idVendor == cpu_to_le16(0x2C7C) &&              serial->interface->cur_altsetting->desc.bInterfaceNumber >= 4)         return -ENODEV;     #endif

    //end  yiyuan .......................................................... } static struct usb_serial_driver option_1port_device = {     .driver = {         .owner =    THIS_MODULE,         .name =        "option1",     },     .description       = "GSM modem (1-port)",     .id_table          = option_ids,     .num_ports         = 1,     .probe             = option_probe,     .open              = usb_wwan_open,     .close             = usb_wwan_close,     .dtr_rts       = usb_wwan_dtr_rts,     .write             = usb_wwan_write,     .write_room        = usb_wwan_write_room,     .chars_in_buffer   = usb_wwan_chars_in_buffer,     .set_termios       = usb_wwan_set_termios,     .tiocmget          = usb_wwan_tiocmget,     .tiocmset          = usb_wwan_tiocmset,     .ioctl             = usb_wwan_ioctl,     .attach            = usb_wwan_startup,     .disconnect        = usb_wwan_disconnect,     .release           = option_release,     .read_int_callback = option_instat_callback, #ifdef CONFIG_PM     .suspend           = usb_wwan_suspend,     .resume            = usb_wwan_resume,#if 1 //Added by Quectel     //.reset_resume = usb_wwan_resume, #endif
#endif };

修改:kernel/drivers/usb/serial/qcserial.c  去掉檔案中跟移遠4G模組VID和PID相沖突的選項,如下: static const struct usb_device_id id_table[] = {      ......................................................................      {USB_DEVICE(0x05c6, 0x9214)},    /* Acer Gobi 2000 QDL device (VP413) */     //for EC20 yiyuan module remove      //{USB_DEVICE(0x05c6, 0x9215)},    /* Acer Gobi 2000 Modem device (VP413) */     {USB_DEVICE(0x05c6, 0x9264)},    /* Asus Gobi 2000 QDL device (VR305) */      ................................................................................. } 修改:kernel/drivers/usb/serial/usb_wwan.c檔案,將移遠模組在USB串列埠urb資料上傳時使用0資料包處理,資料上行和下行使用USB網路介面,修改如下: static struct urb *usb_wwan_setup_urb(struct usb_serial *serial, int endpoint,                       int dir, void *ctx, char *buf, int len,                       void (*callback) (struct urb *)) {     struct urb *urb;

    if (endpoint == -1)         return NULL;    /* endpoint not needed */

    urb = usb_alloc_urb(0, GFP_KERNEL);    /* No ISO */     if (urb == NULL) {         dbg("%s: alloc for endpoint %d failed.", __func__, endpoint);         return NULL;     }

    /* Fill URB using supplied data. */     usb_fill_bulk_urb(urb, serial->dev,               usb_sndbulkpipe(serial->dev, endpoint) | dir,               buf, len, callback, ctx);     //add for EC20 yiyuan     #if 1//Added by Quectel for Zero Packet     struct usb_device_descriptor *desc = &serial->dev->descriptor;     if (desc->idVendor == cpu_to_le16(0x05C6) && desc->idProduct == cpu_to_le16(0x9090))         urb->transfer_flags |= URB_ZERO_PACKET;     if (desc->idVendor == cpu_to_le16(0x05C6) && desc->idProduct == cpu_to_le16(0x9003))         urb->transfer_flags |= URB_ZERO_PACKET;     if (desc->idVendor == cpu_to_le16(0x05C6) && desc->idProduct == cpu_to_le16(0x9215))         urb->transfer_flags |= URB_ZERO_PACKET;     if (desc->idVendor == cpu_to_le16(0x2C7C))         urb->transfer_flags |= URB_ZERO_PACKET;     #endif     //end EC20     return urb; } 1.2USB網路介面的修改   移遠的4G模組使用Gobinet驅動來實現網路資料的上行和下行,方法如下:   將移遠提供的驅動包中的檔案放到   kernel/drivers/net/usb/GobiUSBNet.c   kernel/drivers/net/usb/QMI.c   kernel/drivers/net/usb/QMI.h   kernel/drivers/net/usb/QMIDevice.c   kernel/drivers/net/usb/QMIDevice.h  kernel/drivers/net/usb/Structs.h 修改kernel/drivers/net/usb/Makefile,新增編譯選項,如下:obj-y += GobiNet.o GobiNet-objs := GobiUSBNet.o QMIDevice.o QMI.o obj-$(CONFIG_USB_CATC)        += catc.o 修改kernel/drivers/net/usb/qmi_wwan.c  USB網路介面驅動,新增EC2.1模組的VID和PID,將GobiNet驅動跟USB網路驅動連結到一起,將檔案系統介面的ttyUSB訪問時轉接到GobiNet驅動上,同時去掉介面中針對移遠模組的舊的VID、PID配置,修改如下: static const struct usb_device_id products[] = {      ..............................................................................     {QMI_GOBI_DEVICE(0x03f0, 0x251d)},    /* HP Gobi 2000 Modem device (VP412) */     //{QMI_GOBI_DEVICE(0x05c6, 0x9215)},    /* Acer Gobi 2000 Modem device (VP413) */     {QMI_GOBI_DEVICE(0x05c6, 0x9265)},    /* Asus Gobi 2000 Modem device (VR305) */      ...............................................................................     {QMI_GOBI_DEVICE(0x1199, 0x901b)},    /* Sierra Wireless MC7770 */     #if 1//Added by Quectel     //{QMI_GOBI_DEVICE(0x05C6, 0x9090) }, /* Quectel UC15 */     //{QMI_GOBI_DEVICE(0x05C6, 0x9003) }, /* Quectel UC20 */     {QMI_GOBI_DEVICE(0x05c6, 0x9215)}, //For Quectel EC20     {QMI_GOBI_DEVICE(0x2C7C, 0x0125)}, //For Quectel EC20     {QMI_GOBI_DEVICE(0x2C7C, 0x0121)}, //For Quectel EC20     #endif

    { }                    /* END */ }; 1.3 核心配置檔案修改 修改:autochips/kernel/arch/arm/configs/ac83xx_defconfig 新增ppp的配置選項:CONFIG_PPP=y CONFIG_PPP_BSDCOMP=y CONFIG_PPP_DEFLATE=y CONFIG_PPP_FILTER=y CONFIG_PPP_MPPE=y CONFIG_PPP_MULTILINK=y CONFIG_PPPOE=y CONFIG_PPPOL2TP=y CONFIG_PPPOLAC=y CONFIG_PPPOPNS=y CONFIG_PPP_ASYNC=y CONFIG_PPP_SYNC_TTY=y CONFIG_SLHC=y USB網路的配置:CONFIG_USB_USBNET=y   ---------->必選 CONFIG_USB_NET_AX8817X=y CONFIG_USB_NET_CDCETHER=y CONFIG_USB_NET_CDC_NCM=y CONFIG_USB_NET_NET1080=y CONFIG_USB_NET_CDC_SUBSET=y CONFIG_USB_BELKIN=y CONFIG_USB_ARMLINUX=y CONFIG_USB_NET_ZAURUS=y USB串列埠配置:CONFIG_USB_SERIAL=y CONFIG_USB_SERIAL_GENERIC=y CONFIG_USB_SERIAL_WWAN=y CONFIG_USB_SERIAL_OPTION=y 2、HAL的配置 2.1 刪除ATC平臺本身自帶的與ril層撥號相關的部分 首先刪除本身ATC平臺之前除錯3G模組針對電話網路部分的修改,主要有chat、ip-down、ip-up、rild以及reference-ril,這個幾個部分跟EC2.1模組的ril層使用有衝突,不去掉編譯將報錯誤或者在ril層撥號時不成功。刪除部分如下: autochips/hardware/ril/ autochips/external/chat/Android.mk autochips/external/ppp/android/Android.mk autochips/device/atc/ac8317/.overlay/hardware/ril/ 1)刪除autochips/hardware/ril 這個目錄 2)刪除autochips/device/atc/ac8317/.overlay/hardware/ril 這個目錄 3) 修改autochips/external/chat/Android.mk檔案,去掉編譯選項,如下:#ifeq ($(TARGET_ARCH),arm) ifeq ($(TARGET_ARCH), ) .................................... } 或將android.mk修改成android_mk,如下: autochips/external/chat/Android_mk 去掉自帶chat的編譯 4) 將autochips/external/ppp/android/Android.mk修改成: autochips/external/ppp/android/Android_mk.bak 將autochips/external/ppp/android/目錄下的檔案不編譯進系統。 2.2 新增EC2.1模組的ril層程式碼 2.2.1 如果是原始碼程式碼,請按照以下方式   將移遠提供的EC2.1模組的ril程式碼reference-ril資料夾新增到hardware/ril/目錄中,替換掉系統中自帶的hardware/ril/reference-ril/目錄,如下:hardware/ril/reference-ril_bak/ hardware/ril/reference-ril_bak/Android_mk   hardware/ril/reference-ril/ 2.2.2 如果提供的是二進位制檔案和庫,請使用如下方式修改   去掉系統自帶的的hardware/ril/reference-ril/目錄   hardware/ril/reference-ril_bak/   hardware/ril/reference-ril_bak/Android_mk   在autochips/hardware/ril/目錄或者hardware/ril/目錄中建立reference-ril目錄,將廠家提供的二進位制檔案放到reference-ril目錄中,mtk平臺放到autochips/hardware/ril/reference-ril/目錄下,其它平臺放到hardware/ril/reference-ril/目錄下,如下:autochips/hardware/ril/reference-ril/Android.mk autochips/hardware/ril/reference-ril/ip-up autochips/hardware/ril/reference-ril/ip-down autochips/hardware/ril/reference-ril/chat autochips/hardware/ril/reference-ril/libreference-ril.so 修改autochips/hardware/ril/reference-ril/Android.mk 內容如下:LOCAL_PATH := $(call my-dir) ############################################################### # copy the shell script to etc/ppp # ############################################################### include $(CLEAR_VARS) LOCAL_MODULE := ip-up #LOCAL_MODULE_TAGS := optional LOCAL_MODULE_CLASS := ETC LOCAL_MODULE_PATH := $(TARGET_OUT_ETC)/ppp LOCAL_SRC_FILES := $(LOCAL_MODULE) include $(BUILD_PREBUILT)

include $(CLEAR_VARS) LOCAL_MODULE := ip-down #LOCAL_MODULE_TAGS := optional LOCAL_MODULE_CLASS := ETC LOCAL_MODULE_PATH := $(TARGET_OUT_ETC)/ppp LOCAL_SRC_FILES := $(LOCAL_MODULE) include $(BUILD_PREBUILT)

include $(CLEAR_VARS) LOCAL_MODULE:= chat #LOCAL_MODULE_TAGS := optional LOCAL_MODULE_CLASS:= EXECUTABLES LOCAL_MODULE_PATH := $(TARGET_OUT_EXECUTABLES) LOCAL_SRC_FILES := $(LOCAL_MODULE) include $(BUILD_PREBUILT)

修改autochips/device/atc/ac8317/generic_ac8317.mk檔案,新增libreference-ril.so的拷貝方式,如下:PRODUCT_COPY_FILES := \ $(AUTOCHIPS_DIR)/hardware/ril/reference-ril/libreference-ril.so:system/lib/libreference-ril.so 2.2.3 如果有存在out目錄,並且系統之前編譯的中介軟體檔案有ip-up、ip-down、chat、libreference-ril.so的條件下,請按如下方式修改 請刪除以下檔案,否則系統全部編譯完成後,out/target/product/ac8317/system/lib/libreference-ril.so out/target/product/ac8317/system/bin/chat out/target/product/ac8317/system/etc/ppp/ip-up out/target/product/ac8317/system/etc/ppp/ip-down 目錄中的檔案仍然是之前系統編譯生成的中介軟體檔案,刪除之前編譯生成的中介軟體檔案目錄,如下:out/target/product/ac8317/obj/EXECUTABLES/chat_intermediates/  ---------->刪除 out/target/product/ac8317/obj/SHARED_LIBRARIES/libreference-ril*.so_intermediates/ --->刪除 out/target/product/ac8317/obj/SHARED_LIBRARIES/libreference-ril_intermediates/ --->刪除 out/target/product/ac8317/obj/lib/libreference-ril.so ------>刪除 out/target/product/ac8317/obj/ETC/ip-down_intermediates/ ------>刪除 out/target/product/ac8317/obj/ETC/ip-up_intermediates / ------>刪除 2.2.4 如果保留out目錄進行編譯,編譯完成後請驗證輸出結果 請在編譯完成之後對比客戶給的檔案跟系統生成的檔案是否一致,系統生成的檔案如下:out/target/product/ac8317/system/lib/libreference-ril.so out/target/product/ac8317/system/bin/chat out/target/product/ac8317/system/etc/ppp/ip-up out/target/product/ac8317/system/etc/ppp/ip-down 跟客戶給的檔案請使用Beyond compare工具對比,如果不一致證明檔案拷貝有問題或者中介軟體檔案沒刪除乾淨,一致則OK.

2.3 新增移遠提供的ril程式碼中的chat、ip-down、ip-up選項   修改build/target/product/base.mk修改,如下:    PRODUCT_PACKAGES += \     20-dns.conf \ 95-configured \ ..........................  libreference-ril \    chat \    ip-up \    ip-down \    libreverbwrapper \    ..............................    Vold 2.4 修改系統自帶的rild hardware/ril/rild/rild.c 去掉main()函式中使用者切換功能,修改如下: int main(int argc, char **argv) { ............................................ OpenLib: #endif     //switchUser();

    dlHandle = dlopen(rilLibPath, RTLD_NOW); ..................................................... } 3 Android os層的配置 3.1 init.rc啟動時服務和訪問檔案許可權的配置 修改autochips/build/.overlay/device/atc/ac8317/configs/main/init_for_mmc.rc      autochips/build/.overlay/device/atc/ac8317/configs/new/init_for_mmc.rc 修改如下: 在on post-fs-data標籤中新增chat、ip-down、ip-up的許可權配置,如下: on post-fs-data     # We chown/chmod /data again so because mount is run as root + defaults     chown system system /data chmod 0771 /data .............................. chmod 0777 /system/bin/switch_usb_mode.sh chmod 0777 /system/bin/storage_stress_test.sh # create the lost+found directories, so as to enforce our permissions mkdir /data/lost+found 0770 root root     # change permissions for ppp chmod 777 /system/etc/ppp/ip-up chmod 777 /system/etc/ppp/ip-down chmod 777 /system/etc/ppp/chat ........................................................ 去掉之前的系統的3G模組的服務,更換成EC20 R2.1模組的服務配置,如下:#service ril-daemon /system/bin/rild -l libmtk-ril.so -- -d /dev/ttyUSB3 #    class main #    socket rild stream 660 root radio #    socket rild-debug stream 660 radio system #    user root #    group radio cache inet misc audio log service ril-daemon /system/bin/rild -l /system/lib/libreference-ril.so      class main      socket rild stream 660 root radio      socket rild-debug stream 666 radio system      user  root      group radio cache inet misc audio sdcard_rw log 3.2 Android Framework層針對電話網路模組的配置 這個部分主要修改: autochips/build/.overlay/frameworks/base/core/res/res/values/main/config.xml autochips/build/.overlay/frameworks/base/core/res/res/values/new/config.xml 修改如下:  <string-array translatable="false" name="networkAttributes">         <item>"wifi,1,1,1,-1,true"</item>         <item>"ethernet,9,9,1,-1,true"</item>         <item>"mobile_bluetooth,7,7,1,-1,true"</item>         <item>"wifi_p2p,13,1,0,-1,true"</item>             <item>"mobile,0,0,0,-1,true"</item>         <item>"mobile_mms,2,0,2,60000,true"</item>         <item>"mobile_supl,3,0,2,60000,true"</item>         <item>"mobile_fota,10,0,3,60000,true"</item>         <item>"mobile_ims,11,0,3,60000,true"</item>         <item>"mobile_cbs,12,0,3,60000,true"</item>         <item>"mobile_dun,4,0,3,60000,true"</item>         <item>"mobile_hipri,5,0,3,60000,true"</item>      </string-array> <string-array translatable="false" name="radioAttributes">         <item>"1,1"</item>         <item>"0,1"</item>         <!-- <item>"7,1"</item>-->         <item>"9,1"</item>     </string-array>  <integer-array translatable="false" name="config_tether_upstream_types">         <item>0</item>         <item>1</item>         <item>7</item>         <item>4</item>         <item>5</item>         <item>2</item>         <item>3</item>         <item>9</item>         <item>11</item>         <item>12</item> </integer-array> <bool name="config_showNavigationBar">true</bool> 3.3 APN的配置 這個部分主要修改: autochips/device/atc/ac8317/data/etc/apns-conf.xml  新增紅色字型部分: <apns version="7">     <!--CHINA MOBILE-->     <apn carrier="CMCC"                 mcc="460"                 mnc="00"                 apn="cmnet"                 user="*"                 server="*"                 password="*"                 mmsc="null" /> .................................................  <apn carrier="T-Mobile NL MMS"          mcc="204"          mnc="16"          apn="mms"          user="tmobilemms"          password="tmobilemms"          server="*"          mmsproxy="010.010.010.011"          mmsport="8080"          mmsc="http://t-mobilemms"          type="mms"     />     <apn carrier="China Unicom 3GNET"          mcc="460"          mnc="01"          apn="3gnet"          user=""          server=""          password=""          mmsc=""     />     <apn carrier="China Mobile CMNET"          mcc="460"          mnc="00"          apn="cmnet"          user=""          server=""          password=""          mmsc=""     />     <apn carrier="China Mobile CMNET"          mcc="460"          mnc="02"          apn="cmnet"          user=""          server=""          password=""          mmsc=""     />     <apn carrier="China Mobile CMNET"          mcc="460"          mnc="07"          apn="cmnet"          user=""          server=""          password=""          mmsc=""     />      <apn carrier="China Mobile CTNET"          mcc="460"          mnc="03"          apn="ctnet"             user="[email protected]"          password="vnet.mobi"       proxy="10.0.0.200"       port="80"          type="default,supl"     />     <apn carrier="China Mobile CTNET"          mcc="460"          mnc="11"          user="[email protected]"          password="vnet.mobi"          apn="ctnet"          type="default,supl"     /> </apns> 4.預設系統是不在狀態列顯示4G圖示    預設系統是不在狀態列顯示4G圖示,請將系統自帶的SystemUI、Settings、SettingsProvider這三個APK中的Android.mk開啟,然後進入原始碼目錄中,使用mm  ./ 單獨編譯這三個APK,編譯完成後保留在另外目錄或U盤中。  將編譯好的系統進行升級到機器上,之後將/flysystem/app/目錄中SystemUI、Settings、SettingsProvider三個APK替換到成系統自帶的SystemUI、Settings、SettingsProvider三個APK檔案,之後重啟系統,插入4G模組之後就有了4G訊號顯示圖示了。#mount -o remount, rw flysystem/ #cp Settings.apk /flysystem/app/ #cp SettingsProvider.apk /flysystem/app/ #cp SystemUI.apk /flysystem/app/ 注意拷貝的時候先替換Settings.apk、SettingsProvider.apk,替換完SystemUI.apk系統會直接重啟,所以首先替換Settings.apk、SettingsProvider.apk,後替換SystemUI.apk。 4G模組插入後到看到狀態列有4G圖示顯示並有4G字樣之後,即可開啟瀏覽器上網 同時請修改架構層和APP層開啟LTE選項,否則預設是3G網路,沒法顯示4G圖示,修改如下: 修改: frameworks\base\telephony\java\com\android\internal\telephony\RILConstants.java   //int PREFERRED_NETWORK_MODE    =  NETWORK_MODE_WCDMA_PREF; int PREFERRED_NETWORK_MODE      =  NETWORK_MODE_LTE_GSM_WCDMA; 修改:packages\apps\Phone\res\values\config.xml<!-- <bool name="world_phone">false</bool>--->   <bool name="world_phone">true</bool> 修改好之後全部編譯,將/system/app/Phone.apk push到機器的,flysystem/app/目錄下替換機器中的檔案。

5.測試並進行驗證 修改配置完成後使用 $source selfenv newui $./selfbuild cpoverlay newui $./selfbuild 編譯整個系統,編譯完成後,將system、ramdisk、kernel三個部分做升級包升級到系統中。 插入4G模組,開機啟動。之後按照第4章中的說明將Settings.apk、SettingsProvider.apk、SystemUI.apk、Phone.apk 四個APK push到flysystem/app目錄中替換掉之前的APK,然後插入4G模組,在設定選單中選擇“更多”---->”行動網路”------>”網路模式”---------->”LTE/CDMA”選項打勾,點選”確定”即可。 插入4G模組之後一會就可以看到 4G圖示了。 有問題時抓取radio log。 #adb shell #logcat -b radio   抓取radio的日誌,看是否撥號成功,成功之後,使用ping和netstat看網路狀態。 [email protected]:/ # netstat Proto Recv-Q Send-Q Local Address          Foreign Address        State  tcp       0      0 127.0.0.1:5037         0.0.0.0:*              LISTEN  tcp       0      0 127.0.0.1:5038         0.0.0.0:*              LISTEN  tcp       0      0 127.0.0.1:5040         0.0.0.0:*              LISTEN  tcp       0      0 0.0.0.0:7000           0.0.0.0:*              LISTEN tcp6       1      0 ::ffff:10.153.50.37:36212 ::ffff:74.125.204.102:443 SYN_SENT tcp6       1      1 ::ffff:10.153.50.37:37211 ::ffff:220.181.163.3:80 LAST_ACK tcp6       0      1 ::ffff:10.153.50.37:55686 ::ffff:183.129.161.214:80 CLOSE_WAIT [email protected]:/ # ping www.baidu.com PING www.a.shifen.com (14.215.177.39) 56(84) bytes of data. 64 bytes from 14.215.177.39: icmp_seq=1 ttl=53 time=21.9 ms 64 bytes from 14.215.177.39: icmp_seq=2 ttl=53 time=35.2 ms 64 bytes from 14.215.177.39: icmp_seq=3 ttl=53 time=30.1 ms 64 bytes from 14.215.177.39: icmp_seq=4 ttl=53 time=32.7 ms 64 bytes from 14.215.177.39: icmp_seq=5 ttl=53 time=31.9 ms

注意:在4G模組插入的時候會彈出對話方塊,選擇”暫時不用”,否則4G網路會存在不能使用的問題