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