這部分主要介紹AT32 USB主機庫的結構和庫的使用方法,AT32 USB支持全速和低速,不支持USB2.0高速設備。 這里庫的作用是用來管理USB外設和實現USB的基本協議,使開發者能夠更快的上手開發。
USB主機庫包含以下幾個模塊 如圖1:
用戶應用程序
此部分為開發者根據應用具體需求開發應用程序。
USB Core Driver和USB主機類
USB Core Driver:此部分實現USB設備標準協議棧,標準請求等接口。
USB主機類:此部分實現具體USB主機請求。
USB主機硬件底層接口
此部分實現硬件寄存器抽象接口
USB/OTG外設
圖1. USB主機庫結構
AT32 USB庫文件
如下是AT32 USB應用工程結構圖:
圖2. AT32工程結構
Core Driver庫路徑:OTGFS-->middlewaresusb_drivers
Host Class庫路徑:middlewaresusbh_class
如下是USB主機庫文件列表:
表1. USB主機庫文件列表
表2. USB主機類文件列表
USB主機庫文件說明
USB庫實現USB主機枚舉標準請求,同時實現USB規格里面的4種傳輸類型(control,interrupt,bulk,isochronous)的函數接口。
圖3 USB主機庫文件結構
USB主機文件函數接口
usbh_int.c函數接口
usbh_int.c主要處理底層中斷,包括設備連接,設備斷開等。
表3 usbh_int函數接口
usbh_core.c函數接口
usbh_core.c此文件封裝不同的usb主機函數接口用于不同的地方調用,包括一些接收,發送函數等。
表4 usbh_core函數接口
usbh_ctrl.c函數接口
usbh_ctrl.c此文件處理USB主機枚舉過程中的一些標準請求。
表5 usbh_ctrl函數接口
支持的標準設備請求如下表:
表6 標準設備請求
usbh_xx_class.c函數接口
usbh_xx_class.c此文件為具體主機類型的數據處理,通過結構體函數來實現不同主機類型數據的處理。 開發者根據不同的主機類型,來實現下面函數結構體中的函數,達到不同應用結果。
函數結構體如下:
表7 主機class函數結構體
表8 主機class函數接口
usbh_user.c函數接口
usbh_user.c此文件主要為一些給用戶處理事件的函數如復位,斷開連接等。
表9 用戶事件函數結構體
表10 用戶函數接口函數
其它參數
函數的參數結構體如下,USB主機庫中參數傳遞使用結構體usbh_core_type,如下圖:
圖4 全局結構體
USB主機的狀態機如下圖:
圖5 USB主機狀態機
USB返回值,USB函數接口使用如下函數返回值。
圖6 函數返回值
通道FIFO分配
USB主機要正常收發數據,在初始化時需要為通道分配FIFO,分配給所有通道FIFO大小的和不能超過系統分配給USB緩沖區的最大長度,具體USB的緩沖區大小參考RM上的描述。
開發者可以參考例程usb_conf.h為通道自定義分配FIFO。
OTGFS主機通道FIFO****分配
主機模式下,所有通道共享一個接收FIFO,通道發送FIFO分為非周期性發送FIFO和周期性發送FIFO。 注意usb_conf.h中對端點分配的FIFO大小單位為word(Byte)。
以hid_demo例程為例:
USB主機初始化
在使用USB主機功能時,需要對USB的寄存器做一些基本的初始化,通過調用USB主機的初始化函數完成這部分的操作。
OTGFS****外設初始化
OTGFS初始化函數usbd_init包含5個參數:
例程主機hid_demo的初始化如下:
USB主機中斷處理
USB主機中斷入口函數usbh_irq_handler處理所有USB主機中斷,包括連接狀態,通道收發數據,SOF,喚醒等中斷,下面介紹一些典型的中斷處理。
圖7 USB主機中斷處理函數
通道中斷處理
當USB主機與設備進行通信時,通道的收發狀態都在通道中斷中處理,通道的方向分為IN和OUT通過通道寄存器中的方向為進行判斷。
中斷處理函數:usbh_hch_handler
代碼如下:
Wakeup 中斷處理
當USB主機在掛起狀態時,檢測到設備觸發的遠程喚醒信號,將產生此中斷。 此中斷會將當前主機狀態改為WAKEUP狀態:
中斷處理函數:usbh_wakeup_handler
代碼如下:
接收FIFO非空中斷
此中斷表示當前接收FIFO有數據,應用程序通過此中斷讀出接收到的數據,并存放到對應通道的FIFO當中,當數據讀取完成之后,會產生對應的通道的中斷。
中斷處理函數:usbh_rx_qlvl_handler
代碼如下:
主機端口中斷處理
當USB主機斷開發生狀態改變時,會產生端口中斷,應用程序通過此中斷判斷連接設備的速度等。
中斷處理函數:usbh_port_handler
設備斷開連接中斷處理
當連接的設備斷開是,會產生斷開連接中斷。
中斷處理函數:usbh_disconnect_handler
代碼:
USB主機枚舉處理
USB主機狀態機在usbh_loop_handler函數中處理,對應的主機狀態機uhost->global_state,如下圖是設備連接到主機的狀態處理流程:
圖8 設備連接狀態機流程
USBH_IDLE:當USB啟動或者設備斷開連接之后在此狀態
USBH_PORT_EN:USB主機端口使能之后在此狀態
USBH_ATTACHED:USB設備連接穩定之后
USBH_ENUMERATION:USB設備標準的枚舉流程
USBH_USER_HANDLER:枚舉完成之后,調用主機類的初始化函數
USBH_CLASS_REQUEST:主機類初始化完成之后,進行主機類請求
USBH_CLASS:所有枚舉完成,進行正常的數據處理。
USB主機枚舉流程
當設備接到主機之后,通過控制端點(端點0)進行枚舉動作,USB主機的枚舉狀態如下:
如下是主機枚舉的狀態機流程:
圖9 USB主機枚舉流程
ENUM_GET_MIN_DESC:獲取8字節設備描述
ENUM_GET_FULL_DESC:獲取18字節設備描述
ENUM_SET_ADDR:設置設備地址
ENUM_GET_CFG:獲取9字節配置描述
ENUM_GET_FULL_CFG:獲取完整的配置描述
ENUM_GET_PRODUCT_STRING:獲取設備產品信息
ENUM_GET_SERIALNUM_STRING:獲取設備序列號信息
ENUM_SET_CONFIG:設置配置
ENUM_COMPLETE:枚舉完成
USB控制傳輸過程包含SETUP-DATA-STATUS三個階段,如下是一個主機獲取設備信息的傳輸過程GET_DESCRIPTOR:
圖10 獲取描述符
如下是USB主機庫一個SETUP-DATA-STATUS函數調用流程:
圖11 USB主機SETUP函數調用
usbh_ctrl_transfer_loop函數中斷對控制請求的各個狀態階段進行處理:
控制請求狀態機:
圖12 控制請求處理流程
USB主機類初始化
在USB標準枚舉完成之后,會調用USB主機類的初始化,在初始化函數中解析當前枚舉的設備是否支持,調用函數uhost->class_handler->init_handler(uhost)。
初始化代碼例:
USB主機類請求
USB主機類初始化之后,可以發送主機類控制請求,根據不同的設備類,需要實現不同的設備類請求。 調用函數uhost->class_handler->request_handler((void*)uhost);
主機類請求例:
USB主機數據處理
所有枚舉完成之后,將進行主機數據處理
主機數據處理例:
USB主機類型例程
本章將說明使用AT32 USB主機庫實現不同的主機類型的例程。 目前實現的主機類例程如下:
隱藏(鼠標,鍵盤)
大容量存儲(msc_only_fat32)
two_otg_host_demo(僅AT32F435/437支持)
HID例程
HID類支持鼠標和鍵盤設備,開發者可修改此例程用以實現支持其它HID類設備。
HID類:
HID類例程初始化
當USB設備標準枚舉完成之后,會進行初始化,調用uhost_init_handler, 調用此函數將解析接到主機上的設備類型,是鼠標還是鍵盤或者其它設備。
通過設備的配置描述信息進行如下流程解析:
查找HID接口
判斷接口是鼠標還是鍵盤
查找對應接口的端點號
初始化對應通道
代碼如下:
HID類請求
HID類請求實現一些HID設備的標準請求,調用函數uhost_request_handler
SET_IDLE
SET_PROTOCOL
GET_REPORT
代碼如下:
HID****類數據處理
HID枚舉設置完成之后,USB主機可以請求設備數據,通過調用uhost_process_handler來處理。
通過usbh_interrupt_recv函數給設備發送IN請求
通過usbh_get_urb_status(puhost, phid->chin); 獲取IN請求的狀態
通過phid->in_poll判斷多長時間發送一次IN請求
通過phid->protocol判斷是鼠標還是鍵盤
代碼如下:
MSC例程
msc_only_fat32實現一個簡單的mass storage主機類,僅支持FAT32格式。
MSC類:
MSC 類初始化
當USB設備標準枚舉完成之后,會進行初始化,調用uhost_init_handler,調用此函數將解析接到主機上的設備類型,判斷是否是MSC類型。
通過設備的配置描述信息進行如下流程解析:
查找MSC接口
查找對應接口的端點號
初始化對應通道
初始化bulk-only和SCSI狀態機
代碼如下:
MSC類請求
MSC類請求實現一些MSC設備的標準請求,調用函數uhost_request_handler
GET_MAX_LUN
代碼如下:
MSC類數據處理
HID枚舉設置完成之后,USB主機可以請求設備數據,通過調用uhost_process_handler來處理。
實現如下命令:
查詢
TEST_UNIT_READY
READ_CAPACITY10
REQUEST_SENSE
代碼如下:
MSC讀寫數據
MSC讀寫數據在通過FATFS接口進行實現,在usbh_msc_diskio.c中實現讀寫函數。
讀函數:
寫函數:
CDC例程
cdc實現一個簡單的虛擬串口類。
CDC類:
CDC類例程初始化
當USB設備標準枚舉完成之后,會進行初始化,調用uhost_init_handler, 調用此函數將解析接到主機上的設備類型。
通過設備的配置描述信息進行如下流程解析:
查找CDC接口
判斷接口是否為虛擬串口
查找對應接口的端點號
初始化對應通道
代碼如下:
CDC類請求
CDC類請求實現一些CDC設備的標準請求,調用函數uhost_request_handler
GET_LINECODING
代碼如下:
CDC類數據處理
CDC枚舉設置完成之后,USB主機可以請求設備數據,通過調用uhost_process_handler來處理。
通過set_linecoding和get_linecoding配置linecoding
通過cdc_process_reception(puhost)函數給設備發送IN請求
通過cdc_process_transmission(puhost)函數發送數據給設備
代碼如下:
two_otg_host_demo例程
AT32F435/437存在兩個OTGFS,此例程說明同時使用兩個OTGFS實現兩個host功能。
實現功能:
OTGFS1實現MSC主機(參考MSC例程)
OTGFS2實現HID主機(參考HID例程)
配置與實現
在usb_conf.h中配置OTGFS1和OTGFS2:
在main中初始化:
審核編輯:湯梓紅
-
mcu
+關注
關注
146文章
17002瀏覽量
350335 -
接口
+關注
關注
33文章
8512瀏覽量
150850 -
usb
+關注
關注
60文章
7900瀏覽量
264016 -
主機
+關注
關注
0文章
985瀏覽量
35068 -
AT32
+關注
關注
1文章
113瀏覽量
2078
原文標題:AT32講堂043 | 如何使用AT32 MCU主機庫快速開發USB相關應用
文章出處:【微信號:AT32 MCU 雅特力科技,微信公眾號:AT32 MCU 雅特力科技】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論