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
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
修改: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網路會存在不能使用的問題