由于USB的靈活性,已被廣泛應用于PC機的人機接口、存儲及嵌入式系統(tǒng)中。本文為大家介紹在ZLG打造的AWorks嵌入式實時操作系統(tǒng)中,如何創(chuàng)建一個自定義的USB設備。
USB,是英文Universal Serial Bus(通用串行總線的縮寫),是一種快速、靈活的總線接口。USB對所有的USB外設提供了單一的易于使用的標準的連接類型,簡化了USB外設的設計。USB接口支持熱插拔,計算機系統(tǒng)可以動態(tài)地檢測外設的插拔,并且動態(tài)地加載驅(qū)動程序。另外,USB還具有很靈活的擴展性,一個USB端口接上一個USB HUB(集線器)就可以擴展多個USB端口。USB廣泛的應用于PC機中的人機接口、音頻、存儲等功能,隨著嵌入式系統(tǒng)在各個領域上廣泛應用,USB也在嵌入式系統(tǒng)中被廣泛的使用。
USB簡介
USB是在1994年底由英特爾、康柏、IBM、Microsoft等多家公司聯(lián)合提出。ISB1.1是較為普遍的USB規(guī)范,其高速方式的傳輸速率是12Mbps,低速模式的傳輸速率為1.5Mbps(b是bit的意思,12Mbps=1.5MB/s),USB2.0規(guī)范是由USB1.1規(guī)范演變而來,它的傳輸速率達到了480Mbps,足以滿足大多數(shù)外設的速率要求。USB2.0中的EHCI(增強主機控制器接口)定義了一個與USB1.1相兼容的結(jié)構(gòu)。它可以用USB2.0的驅(qū)動程序驅(qū)動USB1.1的設備,也就是說所有支持USB1.1的設備都可以直接在USB2.0的接口上使用而不必擔心兼容性問題。
USB采用四線電纜,其中兩根是用來傳送數(shù)據(jù)的串行通道,另兩根為下游設備提供電源,對于任何已經(jīng)成功連接且相互識別的外設,將以對方設備均能夠支持的最高速率傳輸數(shù)據(jù)。USB總線會根據(jù)外設情況在所兼容的傳輸模式中自動地由高速向低速動態(tài)轉(zhuǎn)換且匹配鎖定在合適的速率。USB系統(tǒng)采用級聯(lián)星型拓撲,該拓撲由三個基本部分組成:主機,集線器和功能設備。
主機包含有主控制器和根集線器,控制著USB總線上的數(shù)據(jù)和控制信息的流動,每個USB系統(tǒng)只能有一個根集線器,它連接在主控制器上。
集線器是USB結(jié)構(gòu)中的特定成分,它可以對原有的USB端口在數(shù)量上進行擴展以獲得更多的USB端口(集線器只能擴展出更多的USB端口,而不能擴展出更多的帶寬),設備通過端口連接到USB總線上,同時檢測連接在總線上的設備,并為這些設備提供電源管理,負責總線的故障檢測和恢復。集線可為總線提供能源,亦可為自身提供能源。
功能設備通過端口與總線連接。
本文章以M1052平臺為例,主要講解在AWorks平臺中如何創(chuàng)建一個自定義的USB設備。
1AWorks工程配置
在AWorks工程中,用戶可以通過aw_prj_params.h配置文件進行設備添加與刪除,aw_prj_params.h在工程目錄user_config中。
在aw_prj_params.h文件中,有效定義設備的使能宏,才表示一個有效的硬件設備,在本文章中我們需要使能USB Device,所以在aw_prj_params.h中添加AW_DEV_IMX1050_USBD設備宏。

在aw_prj_params.h中添加AW_DEV_IMX1050_USBD設備宏之后,在aw_prj_param_auto_cfg.h文件中會自動添加AW_COM_USBD的定義,AW_COM_USBD代表的是USB Device協(xié)議棧組件。此處要注意AW_DEV_IMX1050_USBD與AW_DEV_IMX1050_USBH1有沖突(一個USB控制器不能同時出現(xiàn)主機設備模式),兩個只能使能一個。AW_DRV_IMX1050_USBD表示加載USB Device的驅(qū)動:

2AWorks中USB Device的硬件配置
在AWorks中所有設備集中由AWbus_lite進行管理,在使用一個硬件設備前,必須將其添加到系統(tǒng)硬件設備列表(在awbus_lite_hwconf_usrcfg.c中定義),各個硬件設備的類型為struct awbl_devhcf。USB設備相關(guān)硬件配置可以查閱工程目錄下的:
\user_config\awbl_hwconf_usrcfg\awbl_hwconf_imx1050_usbd.h文件,USB設備模式的設備信息詳見程序清單2.1。
程序清單2.1 USB設備模式的設備信息類型定義

其中"/dev/usbd" 是USB Device外設的設備名字,在實際的應用中需要通過該名字來使用USB Device
AWBL_USBD_CFG_SELF_POWERED 表示本設備為自行供電設備。__imx1050_usbd_plfm_init函數(shù)是用來初始化與USB Device平臺相關(guān)的信息,在這里是初始化USB Device時鐘,詳見程序清單2.2。
程序清單2.2 USB設備模式的平臺初始化函數(shù)

3與USB Device操作函數(shù)相關(guān)重要結(jié)構(gòu)體介紹
USB設備類回調(diào)函數(shù)列表,這個結(jié)構(gòu)體用于提供USB枚舉以及USB通信過程中的事件回調(diào)接口,方便用戶接入應用代碼:

USB設備信息結(jié)構(gòu)體,此結(jié)構(gòu)體用于配置USB設備的基礎信息(具體信息詳見結(jié)構(gòu)體定義),當設備連接到PC端后,可以在PC端查看到這些信息:

USB設備接口信息結(jié)構(gòu)體,這個結(jié)構(gòu)體是用來描述當前USB設備接口的信息:

4USB Device操作接口
AWorks提供了一系列的USB Device操作相關(guān)的標準接口,包括初始化一個USB設備、USB功能初始化、啟動USB設備和USB數(shù)據(jù)傳輸?shù)?,用戶在使用AWorks開發(fā)USB Device的應用程序時,使用上述標準接口就能方便快捷的開發(fā)出源代碼。詳見表4.1
表4.1 USB設備模式操作接口函數(shù)

struct aw_usbd 為USB Device對象
struct aw_usbd_fun 為功能接口對象
struct aw_usbd_pipe 為端點管道對象
5應用案例代碼詳解
這里基于M1052平臺,展示如何創(chuàng)建一個自定義的USB設備。本例子會初始化一個USB設備,為USB設備創(chuàng)建一個OUT管道和一個IN管道用于接收和發(fā)送數(shù)據(jù)(IN和OUT的概念是相對于USB主機而言),并在這個USB設備添加接口功能。通過USB設備與PC機的連接,實現(xiàn)與PC的通訊,當PC機上位機軟件發(fā)送數(shù)據(jù)時,USB設備通過OUT管道接收數(shù)據(jù),并通過IN管道把收到的數(shù)據(jù)發(fā)送回PC端上位機。這里只對部分關(guān)鍵的代碼進行講解,完整的代碼請自行下載查看,本例程所在目錄位于:
\examples\peripheral\common\usb\ demo_usbd_vendor.c
定義數(shù)據(jù)接收緩沖區(qū)的大小和等待超時時間:

定義USB Device的信息,當USB Device與PC端連接時,PC端會對其進行枚舉從而獲取USB Device的設備信息,這些信息都可以在PC端進行查看:

USB Device接口信息結(jié)構(gòu)體:

USB Device例程入口函數(shù),這里主要是初始化USB Device對象,并為這個USB Device對象添加自定義功能,最后通過調(diào)用aw_usbd_start函數(shù)啟動配置好的USB Device。

創(chuàng)建USB Device自定義功能,在本例程中,調(diào)用aw_usbd_pipe_create函數(shù)為USB Devie的自定義功能創(chuàng)建兩個管道,一個OUT管道和一個IN管道用于接收和發(fā)送數(shù)據(jù),然后把這個功能添加進上文中初始化好的USB Device對象,最后創(chuàng)建一個任務用于接收數(shù)據(jù)并把數(shù)據(jù)發(fā)送回去。



USB Device接收發(fā)送任務,當USB Device連接到PC端后,PC端檢測到USB Device的設備信息和設置功能接口后,就會調(diào)用USB Device接口信息的回調(diào)函數(shù)__custom_alt_set,__custom_alt_set會發(fā)送信號量,通知USB Device接收發(fā)送任務USB Device已連接到PC端,然后進入等待數(shù)據(jù)接收狀態(tài),當收到數(shù)據(jù)后會取消阻塞狀態(tài),然后把收到的數(shù)據(jù)通過IN管道再發(fā)送出去:



6應用案例演示
把完整的例程拷貝到工程的user_code目錄,并把USB Device入口函數(shù)demo_usbd_vendor_entry添加到main.c文件中:

編譯程序并把程序燒寫進M1052開發(fā)板后,通過USB線連接開發(fā)板上的USB HOST1 和PC機,這時PC即會檢測到有USB設備插入,在PC機上安裝對應的驅(qū)動后,PC機識別到我們的自定義USB設備。
打開PC端串口打?。?/p>

PC端上檢測到USB Device的插入,此時因為PC端沒有相應的驅(qū)動,所以檢測到是未知設備:

在PC機上安裝相應的驅(qū)動后,PC機識別到我們的自定義USB設備:

打開專用的USB通訊軟件,選擇要操作的端點,因為在本例程中創(chuàng)建了兩個管道,一個IN管道一個OUT管道,所以在軟件中會看到本USB設備有兩個端點,選擇后會出現(xiàn)兩個窗口,一個是接收一個是發(fā)送。

在發(fā)送窗口輸入想要發(fā)送的數(shù)據(jù),點擊發(fā)送,接收窗口就會收到響應的數(shù)據(jù)。

-
嵌入式
+關(guān)注
關(guān)注
5194文章
20284瀏覽量
331842 -
集線器
+關(guān)注
關(guān)注
0文章
451瀏覽量
41263 -
USB設備
+關(guān)注
關(guān)注
0文章
57瀏覽量
17016 -
嵌入式實時操作系統(tǒng)
+關(guān)注
關(guān)注
1文章
128瀏覽量
8236
原文標題:AWorks?編程——USB設備模式的使用
文章出處:【微信號:Zlgmcu7890,微信公眾號:周立功單片機】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
嵌入式實時操作系統(tǒng)的特點
【安富萊】【RTX操作系統(tǒng)教程】第2章 嵌入式實時操作系統(tǒng)介紹
轉(zhuǎn):第2章嵌入式實時操作系統(tǒng)介紹
嵌入式操作系統(tǒng)USB雙向通信怎么實現(xiàn)?
如何在嵌入式操作系統(tǒng)ARM Linux中實現(xiàn)ZLG7290的驅(qū)動?
嵌入式實時操作系統(tǒng)教程
嵌入式操作系統(tǒng)中USB雙向通信的設計與實現(xiàn)
實時操作系統(tǒng)用于嵌入式應用系統(tǒng)的設計
基于FreeRTOS的嵌入式實時操作系統(tǒng)的原理和實現(xiàn)
不同的實時嵌入式Linux操作系統(tǒng)有什么差異
嵌入式實時操作系統(tǒng)的應用詳細教程說明
嵌入式實時操作系統(tǒng)
基于HAL庫的USB自定義HID設備實現(xiàn)
嵌入式開發(fā)中自定義協(xié)議的解析與組包
在ZLG打造的AWorks嵌入式實時操作系統(tǒng)中,如何創(chuàng)建一個自定義的USB設備
評論