2021-03-17
關鍵字:移遠EC204G模組、Linux平台的4G模塊移植
移遠EC20是一款4G模組,支持基於普通手機卡的2G、3G及4G網絡。
這款模組在Linux系統中最終是以USB協議通信的,因此在適配之前必須保證Linux系統的USB驅動功能完好。
適配的過程雖然主要圍繞着Quectel官方給出的指導文檔來進行,但對於僅僅是想使用這款模組實現簡單的上網功能需求而言,官方指導文檔中有些步驟是會使人confused且又完全可以跳過的。因此寫下這篇博文,記載筆者在適配過程中的關鍵步驟並給出相關文件以期能幫助到有需要的同學。
另外,這篇博文是基於Linux內核版本為3.10及以上的系統環境講解的,如果您的內核版本較低,請自行參閱官方指導文檔,該文檔會在文末給出。
1、概述
總體而言,整個適配過程可以概括為兩步:
1、驅動
2、撥號
這兩個環節幾乎都是《Quectel_WCDMA<E_Linux_USB_Driver_User_Guide_V1.8.pdf》文檔中的內容,以下是整個過程的詳細步驟。
2、驅動
因為模組是通過USB協議與Linux通信的,因此這里假定我們的嵌入式Linux系統USB功能都是完好的。
模組驅動適配的原理無非就是使Linux中的USB子系統能夠識別到這款設備,並將它注冊為字符型設備節點。
整個驅動適配過程又可以大致分為在內核代碼中添加設備信息以及在menuconfig中開啟配置選項兩步。
另外,以下提到的信息請務必完整添加。
以上兩個步驟完成后即可以在 /dev 目錄下看到 ttyUSB0 ~ ttyUSB3 四個字符型設備節點了。如下所示:
crw------- 1 root root 188, 0 Mar 16 15:07 ttyUSB0 crw------- 1 root root 188, 1 Mar 16 15:07 ttyUSB1 crw------- 1 root root 188, 2 Mar 16 15:07 ttyUSB2 crw------- 1 root root 188, 3 Mar 16 15:07 ttyUSB3
首先,我們打開文件:
drivers/usb/serial/option.c
在 option_ids[] 結構體數組中添加模組的PID和VID信息,如下圖所示:
要添加的信息如下:
#if 1 //Added by Quectel { USB_DEVICE(0x05C6, 0x9090) }, /* Quectel UC15 */ { USB_DEVICE(0x05C6, 0x9003) }, /* Quectel UC20 */ { USB_DEVICE(0x2C7C, 0x0125) }, /* Quectel EC25 */ { USB_DEVICE(0x2C7C, 0x0121) }, /* Quectel EC21 */ { USB_DEVICE(0x05C6, 0x9215) }, /* Quectel EC20 */ { USB_DEVICE(0x2C7C, 0x0191) }, /* Quectel EG91 */ { USB_DEVICE(0x2C7C, 0x0195) }, /* Quectel EG95 */ { USB_DEVICE(0x2C7C, 0x0306) }, /* Quectel EG06/EP06/EM06 */ { USB_DEVICE(0x2C7C, 0x0296) }, /* Quectel BG96 */ { USB_DEVICE(0x2C7C, 0x0435) }, /* Quectel AG35 */ #endif
PID/VID是用於描述USB設備的,任何想要使用USB協議通信的設備都必須要有一個明確的PID/VID。
然后同樣在option.c中option_1port_device結構體初始化中添加如下圖所示信息:
這段信息的作用是喚醒休眠狀態下的模組的,對於有節能需求的產品來說才會有用。
其次打開文件:
drivers/usb/serial/qcserial.c
如果這個文件中有如下所示信息,則刪除它:
{USB_DEVICE(0x05c6, 0x9215)}, /* Acer Gobi 2000 Modem device (VP413) */
再打開文件:
drivers/net/usb/qmi_wwan.c
如果這個文件有如下所示信息,同樣刪除它:
{QMI_GOBI_DEVICE(0x05c6, 0x9215)}, /* Acer Gobi 2000 Modem device (VP413) */
然后我們打開文件:
drivers/usb/serial/usb_wwan.c
在 usb_wwan_setup_urb 函數中添加如下圖所示的信息:
要添加的信息如下:
#if 1 //Added by Quectel for zero packet if (dir == USB_DIR_OUT) { 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
至此,驅動代碼部分的修改就完成了。官方文檔后還有關於 GobiNet 與 QMI WWAN 的配置步驟,這兩個東西都是撥號相關的,GobiNet 會包含 QMI WWAN 的東西,但我們其實完全不需要做這些配置,我們的撥號是直接使用 pppd 和 chat 程序做的。
接下來還需要開啟相關配置項。
USB相關的配置項這里就不說了。
打開內核的menuconfig配置菜單,進入到以下層級
Device Drivers
Network device support
將ppp功能打開,如下圖所示:
再進入到以下層級
Device Drivers
Network device support
USB Network Adapter
將USBNET功能打開,如下圖所示:
至此,我們便完成了Quectel EC20的驅動適配,此時重新編譯內核再燒進開發板,即可以看到幾個 ttyUSB 設備節點的了。模組節點識別到時的內核打印信息如下所示:
usb 1-1.2: new high-speed USB device number 4 using rtl819x-ehci usb 1-1.2: New USB device found, idVendor=2c7c, idProduct=0125 usb 1-1.2: New USB device strings: Mfr=1, Product=2, SerialNumber=0 usb 1-1.2: Product: Android usb 1-1.2: Manufacturer: Android option 1-1.2:1.0: GSM modem (1-port) converter detected usb 1-1.2: GSM modem (1-port) converter now attached to ttyUSB0 option 1-1.2:1.1: GSM modem (1-port) converter detected usb 1-1.2: GSM modem (1-port) converter now attached to ttyUSB1 option 1-1.2:1.2: GSM modem (1-port) converter detected usb 1-1.2: GSM modem (1-port) converter now attached to ttyUSB2 option 1-1.2:1.3: GSM modem (1-port) converter detected usb 1-1.2: GSM modem (1-port) converter now attached to ttyUSB3
在幾個 ttyUSB 節點中,ttyUSB2 是模擬出來的串口通信節點,ttyUSB3 則是用於撥號上網使用的。我們完全可以開啟兩個命令行終端來讀寫 ttyUSB2,如通過AT指令控制模組:
# echo AT > /dev/ttyUSB2 # -------------------------------- # cat /dev/ttyUSB2 OK
3、撥號
撥號其實比驅動適配要簡單的多,我們僅需將Quectel官方提供的幾個撥號腳本預置進 /etc 目錄即可。
這幾個撥號腳本如下圖所示:
其中,必須要預置進 /etc 的文件為:1、ip-up;2、quectel-chat-connect;3、quectel-chat-disconnect;4、quectel-ppp。
至於如何預置這些文件本文不作討論,不同平台可能有不同的操作方法。只需要按照以下位置預置即可:
1、ip-up 預置進 /etc/ppp 目錄;
2、其它三個文件預置進 /etc/ppp/peers 目錄。
盡管 readme 文件中有講到需要填寫APN、用戶名及密碼信息,但實際上至少在我們國家完全可以忽略,直接用默認的信息預置即可。
一切准備妥當后即可以使用以下命令撥號上網了:
pppd call quectel-ppp &
當然,這里前提條件是你的系統要有 pppd 以及 chat 兩個程序。quectel-ppp 直接填寫即可,pppd 會自動補全路徑前綴 /etc/ppp/peers 。
如果有的同學出現錯誤提示:無法找到 /etc_ro/ppp/peers/quectel-ppp 錯誤的話,請去 pppd 的源碼目錄修改默認目錄前綴配置:
./pppd/pathnames.h
將 #define _ROOT_PATH "/etc_ro" 修改為 #define _ROOT_PATH "/etc" 即可。
正常撥號以后會出現如下網卡信息:
至此,Quectel EC20在嵌入式Linux平台的適配過程就完成了。
4、其它
官方指導文檔第4章是電源管理,對於不需要考慮節能的同學來說跳過這章即可。
第5章是測試,里面提到的通過 microcom 來測試模組的步驟如果無法得到文檔所示的結果,或者說執行了那條命令后卡死不動的話完全不用擔心,無所謂的。至於5.2節的PPP撥號流程倒是有一定的參考價值。
鏈接: https://pan.baidu.com/s/1S8noViDPhO64_L7IB6uCCw
提取碼: fk4r