1、概述
AliOS Things支援MCU與通信晶片間的多種連接配接方式,如UART、SPI、SDIO、USB。這些連接配接方式不僅拓展了基于AliOS Things開發的可選聯網方案,還滿足了不同應用場景對傳輸速率需求,如表1所示。其中,HAAS100通過USB外接LTE,可以實作相同廠商不同模組間無縫替換,例如EC20、EC200S。

表1 AliOS Things所支援外接方式以及應用場景
2、USB外接通信晶片的優點
USB本身具有使用友善、資料傳輸可靠、成本低、省電等優點。而使用USB做為外接通信晶片的通道,将保留這些優點,具體表現為:
2.1、使用友善
- 一個接口可以用于多種裝置的連接配接,使用者可以友善地替換所要連接配接的通信晶片,無需針對不同通信晶片采用不同的連接配接器和線纜。
- 自動配置,通信晶片接入後,MCU側可以自動對通信晶片進行識别,并加載對應的驅動程式。
- 支援熱插拔,使用者可以随時接入或拔出通信晶片,而不會損害硬體裝置,也無需重新開機裝置。
- 無需額外供電,USB接口提供了+5V電壓,500mA以下電流,一般情況下通信晶片無需額外電源。
2.2、資料傳輸可靠
- 接收端和線纜硬體規範,保證資料傳輸在一個平靜的接口電器環境中,避免了導緻資料錯誤的大部分噪聲幹擾。
- 差分傳輸模式,USB 1.1/2.0采用四線模式,其中D+/D-為資料傳輸通道,采用差分信号的傳輸方式,D+/D-需要同時滿足電平條件才能判定為0或1,降低了因幹擾産生比特跳變的可能性。
- CRC校驗,USB硬體自帶CRC校驗,可檢測傳輸過程中發生的錯誤。
- 協定确認重傳,USB在協定層面提供了确認(ACK/NACK)與重傳機制,可從傳輸錯誤中恢複。
2.3、成本低、省電
- USB部件成本較低,無論是使用獨立的controller,還是使用內建IP的方案,成本都可以控制在合理範圍内。并且從可擴充性來看,USB可以支援更多種類的裝置連接配接,而無需硬體上的改動。
- USB使用了省電電路與協定,配合通信晶片的休眠與喚醒功能,可實作整體上的低功耗。
3、實作基于USB通道外接通信晶片
為了實作基于USB通道外接通信晶片,除了要保證MCU具備USB連接配接硬體能力以外,MCU側還需要實作USB host協定棧,以完成
- 裝置識别
- 驅動加載
- 資料傳輸
AliOS Things基于USB通道外接4G模組的方案1、概述2、USB外接通信晶片的優點3、實作基于USB通道外接通信晶片4、HaaS100外接4G模組示例5、總結
圖 1 MCU側USB Host協定棧結構,包括了Host controller層、Host Core層、Host Class層、USB Device Driver層
MCU側的USB host協定棧大緻分為四層:Host Controller層、Host Core層、Host Class層、USB Device Driver層。其中,Host Controlle是USB host協定棧最底層,負責直接與硬體互動,讀寫寄存器、中斷處理;Host Core是協定棧的核心層,對下負責管理Host controller、裝置、接口、端點,并負責裝置枚舉,對上負責host class的注冊、裝置的配置以及傳輸請求處理;Host Class層為各USB host類的實作層,例如HID、CDC、UVC等類。 最後,裝置驅動層用于實作與USB裝置應用互動邏輯,例如通過AT指令與EC20進行互動。各層的設計細節将在另一篇文章中詳細介紹,此處将不再展開。本節将圍繞裝置識别、驅動加載、資料傳輸介紹USB外接通信晶片的實作方式。
3.1、裝置識别
當通信晶片通過USB連接配接上MCU後,兩者會發生以下對話。
Host:你是什麼裝置?
Device: 12 01 0100... / Device Descriptor /
Host:你有幾種功能?
Device:09 02 09... / Configuration Descriptor /
Host:每個功能有幾個接口?
Device: 09 04 00... / Interface Descriptor /
Host:每個接口使用哪幾個端點?
Device: 06 05 82... / Endpoint Descriptor /
Host: 我知道你是誰了,開始傳輸
Device: OK
....
這些問答的目的是為了幫助USB Host準确地對接入的裝置進行識别。互動的資訊主要包括裝置描述符、配置描述符、接口描述符、端點描述符。
3.2、類加載
在枚舉過程的最後會根據裝置所屬類加載驅動。這裡有兩種加載方式,一種是按裝置加載,另一種是按接口加載。以EC20為例,其接口都為vendor類,無法根據接口類進行加載。是以,需要根據裝置的Vendor ID(VID)、Product ID(PID)加載對應類。
事實上,針對這一類由vendor定制廣域網USB裝置,Linux USB驅動的解決方案,是使用專門有檔案(usb/serial/option.c)用于存儲廠商的VID和PID清單;在枚舉時,如果USB裝置的VID與PID相比對,則加載相應驅動(usb/serial/wwan.c)進行處理。如上文所述,EC20有5個接口,其中接口0為DM口、接口1為GPS接口、接口2為AT口、接口3為PPP口、接口4為NDIS口,如圖5所示。由于PC端資源是充足的,Linux USB Host在枚舉EC20時可以為每個接口建立相應的端點,并允許使用者同時操作這些接口(open/read/write)。
圖 4 EC20各USB接口功能
然而,在運作RTOS的MCU晶片上USB控制器的資源是有限的,無法同時建立這麼多個接口所需要的端點。以HAAS1000為例,除了控制端點0,其USB控制器隻有4個端點可供使用。是以,在MCU上枚舉過程中需要考慮底層硬體資源限制,否則會導緻驅動加載失敗。這裡采用的政策是複用端點的方式。在加載驅動時,有針對性地選擇接口:首先為接口2配置設定端點資源,用于AT指令互動,保證4G子產品聯網并擷取IP;然後,在其它接口需要使用時,釋放端點2的端點資源。
3.3、資料互動
完成類加載後,上層可通過USB通道收發送資料。以EC20的AT接口為例,AliOS Things的AT驅動架構(SAL + AT Utility)可以無縫運作在USB協定棧上。
圖 5 基于USB協定棧的AT通道
需要做的工作是使用USB Class API實作AT Utility所需HAL(at_dev_ops_t)即可,如下所示。
/*
- AT dev operation type
*/
typedef struct {
at_dev_type_t type;
/**
* AT device init
*
* @return 0 - success, -1 - failure
int (init)(void dev);
- Receive data from AT device
-
@return 0 - success, -1 - failure
*/
int (recv)(void dev,
void *data, uint32_t expect_size, uint32_t *recv_size, uint32_t timeout);
- Send data to AT device.
- int (send)(void dev,
void *data, uint32_t size, uint32_t timeout);
- AT deviec deinit
} at_dev_ops_t;
在此基礎上,使用AT Utility API實作SAL所需HAL(sal_op_t)即可,如下所示。
typedef struct sal_op_s {
struct sal_op_s * next; //<! Next sal_op_t structure
char *version; //<! Reserved for furture use.
char *name; //<! Drvier name
/* Add sal device */
int (*add_dev)(void*);
/**
* Module low level init so that it's ready to setup socket connection.
*
* @return 0 - success, -1 - failure
*/
int (*init)(void);
/**
* Start a socket connection via module.
*
* @param[in] c - connect parameters which are used to setup
* the socket connection.
*
* @return 0 - success, -1 - failure
*/
int (*start)(sal_conn_t *c);
/**
* Send data via module.
* This function does not return until all data sent.
*
*/
int (*send_data)(int fd, uint8_t *data, uint32_t len,
char remote_ip[16], int32_t remote_port, int32_t timeout);
/**
* Get IP information of the corresponding domain.
* Currently only one IP string is returned (even when the domain
* coresponses to mutliple IPs). Note: only IPv4 is supported.
*
*
* @return 0 - success, -1 - failure
*/
int (*domain_to_ip)(char *domain, char ip[16]);
/**
* Close the socket connection.
*
* @return 0 - success, -1 - failure
*/
int (*finish)(int fd, int32_t remote_port);
/**
* Destroy SAL or exit low level state if necessary.
*
* @return 0 - success, -1 - failure
*/
int (*deinit)(void);
/**
* Register network connection data input function
* Input data from module.
* This callback should be called when the data is received from the module
* It should tell the sal where the data comes from.
*
* @return 0 - success, -1 - failure
*/
int (*register_netconn_data_input_cb)(netconn_data_input_cb_t cb);
} sal_op_t;
完成以上對接後,上層應用即可以基于标準的套接字API程式設計,降低了應用層移植成本。相關AT驅動元件介紹請參考AliOS Things幫助文檔 SAL元件、AT元件。
4、HaaS100外接4G模組示例
圖6 HaaS100通過USB外接EC20
圖 7 USB所用排針接線
HaaS100闆上排針提供了USB引腳,可以用接USB母口擴充線,與通信模組連接配接,如圖6、7所示。
步驟一:配置
aos make linkkit_demo@haas100 -c config
步驟二:配置選擇
aos make menuconfig
配置
步驟三:編譯
aos make
步驟四:燒錄
請參考
HaaS快速開始步驟五:啟動
該應用運作Linkkit demo,USB枚舉成功後,通過AT通道,可以連接配接入阿裡雲IoT平台。
5、總結
廣域網通信模組通常都提供USB通道,支援AT、PPP、RNDIS、ECM等通信方式。是以,在MCU側支援USB協定棧,可自動識别枚舉各類通信裝置,并加載所需的驅動,友善使用者上層的開發。本文簡要介紹了AliOS Things的USB Host協定棧,并以EC20為例描述了枚舉識别過程,同時給出了在USB通道上對接AliOS Things傳統AT通道的方式。在後續相關系列文章中,我們将介紹基于USB通道的PPP、RNDIS、ECM方式,并給出相應對比資料。敬請期待。
如需更多技術支援,可加入釘釘開發者群,或者關注微信公衆号
更多技術與解決方案介紹,請通路
阿裡雲AIoT首頁