NXP的SDK里面有一個(gè)例程evkbmimxrt1060_lwip_dhcp_usb_bm,該例程可以實(shí)現(xiàn)連接3款不同的支持RNDIS的手機(jī),實(shí)現(xiàn)USB 4G上網(wǎng)功能。但是如果客戶實(shí)際使用的上網(wǎng)終端是4G模塊,而不是這三款手機(jī),這個(gè)例程就有可能不能直接跑起來,需要我們?nèi)プ鲞m配。
本文就將介紹,當(dāng)上網(wǎng)的終端更改為Quectel的4G LTE模塊C200A-CN時(shí)(支持RNDIS模式),如何來做響應(yīng)的適配,并實(shí)現(xiàn)上網(wǎng)的功能。
一、基礎(chǔ)知識(shí)
1.1 什么是RNDIS
RNDIS = Remote Network Driver Interface Specification,即遠(yuǎn)程網(wǎng)絡(luò)驅(qū)動(dòng)接口規(guī)范。這是微軟定義的一套基于USB的通信協(xié)議。基于該協(xié)議的USB設(shè)備,可以免驅(qū)直接接入windows系統(tǒng),在windows操作系統(tǒng)上顯示為一個(gè)網(wǎng)卡。
1.2網(wǎng)絡(luò)層次模型
使用RT1060連接USB 4G module上網(wǎng)的網(wǎng)絡(luò)層次模型如下:
從便于理解的角度上,我們可以把RNDIS看成是一個(gè)特殊的PHY,完成MAC的傳輸。
1.3 RNDIS上網(wǎng)接口/端點(diǎn)分析
在SDK原例程中,使用了2個(gè)接口,3個(gè)端點(diǎn),見下圖。
其中數(shù)據(jù)接口就是用來傳輸以太包的,每個(gè)方向有一個(gè)端點(diǎn)。RNDIS接口主要是用來查詢?cè)O(shè)備狀態(tài)。
1.4 C200A接口/端點(diǎn)分析
C200A的實(shí)現(xiàn)了5個(gè)接口,其中包含了上述接口:
額外需要使用到的接口是AT接口,見下圖。
AT接口的功能是撥號(hào),這里面包括了對(duì)模塊的狀態(tài)查詢和控制等。我們需要在這里向4G模塊查詢相關(guān)的狀態(tài),并且發(fā)送聯(lián)網(wǎng)命令,這樣模塊才能接入互聯(lián)網(wǎng),這樣后面發(fā)送的IP包才能和互聯(lián)網(wǎng)進(jìn)行通信。使能AT接口以及在AT接口上撥號(hào),是我們使能/適配新的4G module需要做的主要工作。 4G模塊其他定義的接口,我們這里并不需要使用到,所以本文在此不做介紹。
1.5關(guān)于NXP SDK USB HOST的一些基礎(chǔ)知識(shí)
1)SDK會(huì)自動(dòng)解析配置描述符,這里會(huì)識(shí)別出配置描述符中所有的接口和端點(diǎn)。參見USB_HostParseDeviceConfigurationDescriptor(),這個(gè)函數(shù)在/evkbmimxrt1060_lwip_dhcp_usb_bm_c200a/usb/host/usb_host_devices.c。
2)Event回調(diào),參見USB_HostEvent(),此函數(shù)在/evkbmimxrt1060_lwip_dhcp_usb_bm_c200a/lwip/port/usb_ethernetif_bm.c。
3)為每個(gè)接口open pipe。
參見USB_HostCdcOpenDataInterfac(),USB_HostCdcOpenControlInterface(), in usb_host_cdc.c。
4)狀態(tài)機(jī)維護(hù)
狀態(tài)機(jī)的維護(hù)請(qǐng)參見USB_HosCdcRndisTask(),以及 USB_HostCdcRndisControlCallback() in /evkbmimxrt1060_lwip_dhcp_usb_bm_c200a/lwip/port/usb_ethernetif_bm.c 下圖展示的是默認(rèn)的狀態(tài)機(jī),我們需要做一些調(diào)整來使能4G模塊的AT接口以及在AT接口上撥號(hào)。
?
二、實(shí)現(xiàn)細(xì)節(jié)
基于前面介紹的基礎(chǔ)知識(shí),本章節(jié)主要介紹適配到C200A的實(shí)現(xiàn)細(xì)節(jié),這里更側(cè)重于代碼更改來講述。代碼的更新主要集中于usb_ethernet_bm.c和usb_ethernet.h。
增加AT接口對(duì)應(yīng)的數(shù)據(jù)結(jié)構(gòu)
更新狀態(tài)機(jī)
增加對(duì)應(yīng)的API和callback,具體細(xì)節(jié)請(qǐng)參見本文相關(guān)的代碼,下面列出了關(guān)鍵的API。
USB_HostCdcRndisATInCallback(); USB_HostCdcRndisATOutCallback(); dial_tx(); // Send command on AT interface dial_rx(); // Receive message from AT interface lte_dial(); // Dial, then USB 4G module can connect to internet USB_HostCdcRndisC200ACallback(); ep0_communicate(); // API used for AT interface enablement, to send/receive command/message to/from EP0 init_c200a(); // Initiate C200A, then AT interface communication is available
支持的最大接口數(shù)。
這個(gè)最大接口數(shù)在連接不同的USB 4G Module的時(shí)候,可能需要更改。比如對(duì)于LE910C1-EU,需要更改為8。對(duì)于本文中使用到的C200A,默認(rèn)的5就可以工作。
#define USB_HOST_CONFIG_CONFIGURATION_MAX_INTERFACE (8U)
更新狀態(tài)機(jī),主要代碼變動(dòng)在evkbmimxrt1060_lwip_dhcp_usb_bmlwipportusb_ethernetif_bm.c中的USB_HostCdcRndisControlCallback()以及USB_HosCdcRndisTask()中,具體細(xì)節(jié)請(qǐng)參見本文相關(guān)的代碼。
適配4G模塊的RNDIS接口和AT接口,這里的AT接口序號(hào)是通過USB協(xié)議分析儀抓出的log反向推導(dǎo)出來的。我們需要把協(xié)議棧解析出來的接口綁定到g_RndisInstance.atInterfaceHandle上。以下代碼位于evkbmimxrt1060_lwip_dhcp_usb_bmlwipportusb_ethernetif_bm.c 中的
USB_HostCdcRndisEvent();。該代碼直接將協(xié)議棧解析好的interface[3](通過usb分析儀抓包解析得出)付給對(duì)應(yīng)的接口handle。
三、注意事項(xiàng)
由于4G模塊比較耗電,在本例中i.MX RT1060模塊需要使用電源適配器外接供電。否則如果供電不足會(huì)導(dǎo)致4G模塊重復(fù)復(fù)位。
四、小結(jié)
在萬物互聯(lián)的時(shí)代,越來越多的嵌入式設(shè)備會(huì)有接入互聯(lián)網(wǎng)的需求。本文闡述了通過USB去連接4G模塊去實(shí)現(xiàn)上網(wǎng)的相關(guān)基礎(chǔ)知識(shí)和實(shí)現(xiàn)細(xì)節(jié)。希望這些內(nèi)容能在讀者在碰到相關(guān)的應(yīng)用時(shí)能有所幫助。
審核編輯:湯梓紅
-
NXP
+關(guān)注
關(guān)注
60文章
1289瀏覽量
185494 -
接口
+關(guān)注
關(guān)注
33文章
8691瀏覽量
151915 -
usb
+關(guān)注
關(guān)注
60文章
7980瀏覽量
266085 -
Module
+關(guān)注
關(guān)注
0文章
69瀏覽量
12904 -
SDK
+關(guān)注
關(guān)注
3文章
1045瀏覽量
46271
原文標(biāo)題:使用i.MX RT1060連接USB 4G module(RNDIS模式)
文章出處:【微信號(hào):NXP_SMART_HARDWARE,微信公眾號(hào):恩智浦MCU加油站】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論