2019-04-26
關鍵字:高新興 ME3630-W 適配、rk3128 移植 4G 模塊
本篇文章系筆者在移植 高新興物聯 ME3630-W 4G 模塊到運行着 Android4.4 操作系統的 rk3128 開發板上的一篇日志。文章以快速適配為目的進行講解,不涉及一些步驟的原理講解。
這款 4G 模塊是一個全網通模塊,它在 rk 平台的適配資料並不多,難得的幾篇博文講的也比較片面。筆者在適配移植的過程中遇到了不少的問題,現將解決過程記錄一下,以期能幫到有需要的同學。
首先,沒有官方提供的適配文檔是很難完成適配工作的,這款模塊的官方網站為:高新興物聯 ME3630-W 官方網站 。官網中下部給出了很全面的文檔。
如果沒有辦法直接在網上下載文檔,可以要求采購向廠家索要。
硬件排查
硬件虐我千百遍,我待硬件如初戀!
這塊不打算詳細聊,總之您想辦法確保硬件電路 OK 就好。祝好運!
軟件排查
1. 內核支持
要調 4G 模塊,首先需要確保對應的內核功能模塊是可用的。一般可以在 menuconfig 作如下配置( 在 kernel 目錄下執行 make menuconfig 命令 ),將下面標紅的選項都選上。
在保存了上面的配置以后,還可以去 ./kernel/.config 文件下檢查一下,看是否有如下圖所示的配置
需要注意的是:一定要確保 make menuconfig 對內核功能模塊做出的更改是 “最終更改” 。因為筆者這邊的情況就是可以通過 make menuconfig 來更改內核功能模塊,然后再編譯大包的時候還會再從另外一個地方讀取一下內核功能配置模塊。對於這種有多處可以修改內核功能模塊的情況,一定要保證好上面的配置項不會被重置掉! 這個很重要。
2. 注冊模塊
這款 4G 模塊會以 ttyUSB0 ~ ttyUSB2 的形式注冊在 /dev 目錄下。所以我們在板子啟動以后首先要檢查 /dev 目錄,看是否有下圖所示的幾個設備節點
如果沒有,則是沒有配好相應的 vendor id 和 product id 。此時,我們就需要操作這個文件了
.\kernel\drivers\usb\serial\option.c
在 option.c 的 option_ids[] 中添加您模塊對應的 VID 和 PID 。
static const struct usb_device_id option_ids[] = { // ... { USB_DEVICE(0x19d2, 0x1476) }, // ... }
如果您不知道您手里的模塊的 VID 和 PID ,有官方適配文檔的直接參考官方適配文檔,沒有的則可以上網查一下,實在不行,可以看串口的打印,通常在內核打印中都會將新設備的 vid , pid 打印出來的。中興集團的 VID 固定為 0x19d2 。
然后,最好再在 option.c 文件中的 option_probe 函數中添加下面一段代碼,這一步的目的是為了防止用來傳輸上網數據的 USB 口被映射成普通 USB 串口。
static int option_probe(struct usb_serial *serial, const struct usb_device_id *id) { // ... printk("idVendor=%x, idProduct=%x, bInterfaceNumber =%d\n\n", serial->dev->descriptor.idVendor, serial->dev->descriptor.idProduct, serial->interface->cur_altsetting->desc. bInterfaceNumber); if (serial->dev->descriptor.idVendor == 0x19d2 && serial->dev->descriptor.idProduct == 0x1476 && serial->interface->cur_altsetting->desc. bInterfaceNumber == 3) return -ENODEV; if (serial->dev->descriptor.idVendor == 0x19d2 && serial->dev->descriptor.idProduct == 0x1476 && serial->interface->cur_altsetting->desc. bInterfaceNumber == 4) return -ENODEV; if (serial->dev->descriptor.idVendor == 0x19d2 && serial->dev->descriptor.idProduct == 0x1476 && serial->interface->cur_altsetting->desc. bInterfaceNumber == 5) return -ENODEV; // ... }
3. 預置驅動文件
按照下表將對應的文件預置到系統中。
這些文件都是模塊廠商提供的。
4. 系統配置
在您的 init.rc 文件中添加以下信息
service ril-daemon /system/bin/rild -l /system/lib/libreference-ril-gosuncn.so 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 pppd_gprs /system/etc/init.gprs-pppd user root group radio cache inet misc log disabled oneshot
對了,或許您還需要再關注一下 APN 的配置。
./device/rockchip/common/phone/etc/apns-full-conf.xml
關於 APN 信息,筆者這邊也不是很清楚,因為筆者沒有配置過 APN 信息。
這邊貼一個簡要參考,可以通過 Android 系統啟動以后在系統設置中配置一下 APN 信息
電信 --> ctnet 聯通 --> 3gnet 移動 --> cmnet
5. 調試
此時,我們的基本適配工作就做完了。編譯系統並燒寫。首先可以來檢查我們的 4G 模塊是否被正確識別到。可以查看內核打印來檢查。
dmesg
通常,如果您能看到類似下面所示的打印,就穩的了。
usb 1-1: new high-speed USB device number 2 using rockchip_ehci_host usb 1-1: New USB device found, idVendor=19d2, idProduct=1476 usb 1-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3 usb 1-1: Product: Android usb 1-1: Manufacturer: Android usb 1-1: SerialNumber: d6ee6d9b idVendor=19d2, idProduct=1476, bInterfaceNumber =0 option 1-1:1.0: GSM modem (1-port) converter detected usb 1-1: GSM modem (1-port) converter now attached to ttyUSB0 idVendor=19d2, idProduct=1476, bInterfaceNumber =1 option 1-1:1.1: GSM modem (1-port) converter detected usb 1-1: GSM modem (1-port) converter now attached to ttyUSB1 idVendor=19d2, idProduct=1476, bInterfaceNumber =2 option 1-1:1.2: GSM modem (1-port) converter detected usb 1-1: GSM modem (1-port) converter now attached to ttyUSB2 cdc_ether 1-1:1.3 usb0: register 'cdc_ether' at usb-101c0000.usb-1, CDC Ethernet Device, c6:92:10:17:52:43
如果很不幸您 /dev 目錄下並沒有 ttyUSB0 ~ ttyUSB2 這 3 個節點,那就得再回去好好檢查檢查了。
然后這個時候,如果有屏幕的話就可以去屏幕上確認確認,所插的 SIM 卡是否成功入網,並且能夠通過蜂窩網絡訪問互聯網了。
如果這個時候發現所插 SIM 卡無法正確入網,常用的檢測手段是可以通過如下命令查看電話網絡的打印
logcat -b radio
對應地,清日志緩沖區的命令是
logcat -c -b radio
如果您的適配過程並不那么順利,那就需要對照着官方提供的適配文檔來排錯了。
關於官方提供的文檔與驅動,筆者這邊礙於版權問題,就不提供下載鏈接了。
6. ttyUSB 釋義
這里再解釋一下 ttyUSB0, ttyUSB1, ttyUSB2 各自有什么作用,看下表
型號 | 設備號 | 作用 |
ME3630-W ( pid: 0x1476 ) |
ttyUSB0 | DIAG |
ttyUSB1 | AT | |
ttyUSB2 | MODEM | |
3 | ECM | |
4 | ECM |
7. 自定義撥號流程
如果您的業務需要客制化撥號流程,或者您懷疑系統的撥號流程有問題,可以關注下這塊代碼
./hardware/ril/
入網撥號流程一般是首先走
./rild/rild.c
里的 main() 函數。然后在 main() 函數中調用到
./reference-ril/reference-ril.c
里面的 RIL_Init 函數。在這個 reference-ril.c 里面比較重要的函數還有 mainLoop 、initializeCallback 、 onUnsolicited 、 onRequest 。
其實 Android 原生的入網流程就已經很完善了,如果是排查問題的話,筆者建議可以不用看這里的代碼,大概率是沒有什么結果的。
如果要查看撥號日志,使用如下命令
logcat -s pppd
參考: