0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

AT32講堂046 | 雅特力AT32 MCU USB設(shè)備庫的架構(gòu)和使用方法

雅特力 AT32 MCU ? 2023-02-22 11:23 ? 次閱讀

AT32 USB設(shè)備協(xié)議庫

這部分主要介紹AT32 USB設(shè)備庫的結(jié)構(gòu)和庫的使用方法,AT32 USB是基于USB2.0全速設(shè)備,不支持USB2.0高速設(shè)備。這里庫的作用是用來管理USB外設(shè)和實(shí)現(xiàn)USB的基本協(xié)議,使開發(fā)者能夠更快的上手開發(fā)。USB Deivce庫包含以下幾個(gè)模塊如圖1:

用戶應(yīng)用程序

此部分為開發(fā)者根據(jù)應(yīng)用具體需求開發(fā)應(yīng)用程序。

USB Core Driver和USB設(shè)備類

USB Core Driver:此部分實(shí)現(xiàn)USB設(shè)備標(biāo)準(zhǔn)協(xié)議棧,標(biāo)準(zhǔn)請求等接口。

USB設(shè)備類:此部分實(shí)現(xiàn)一個(gè)具體USB設(shè)備的描述和設(shè)備請求。

USB硬件底層接口

此部分實(shí)現(xiàn)硬件寄存器抽象接口

USB/OTG外設(shè)

圖1. USB庫結(jié)構(gòu)c131a572-b1f4-11ed-ad0d-dac502259ad0.png

AT32 USB庫文件

如下是AT32 USB應(yīng)用工程結(jié)構(gòu)圖:圖2. AT32工程結(jié)構(gòu)c15f5850-b1f4-11ed-ad0d-dac502259ad0.pngCore Driver庫路徑:OTGFS-->middlewares\usb_driversUSBFS-->middlewares\usbd_driversDevice Class庫路徑:middlewares\usbd_class如下是USB庫文件列表:表1. USB庫文件列表c18169b8-b1f4-11ed-ad0d-dac502259ad0.png表2. USB設(shè)備類型文件列表c19bf012-b1f4-11ed-ad0d-dac502259ad0.png

USB設(shè)備庫文件說明

USB庫實(shí)現(xiàn)USB設(shè)備標(biāo)準(zhǔn)請求,同時(shí)實(shí)現(xiàn)USB規(guī)格里面的4種傳輸類型(control,interrupt,bulk,isochronous)的函數(shù)接口。圖3.USB庫文件結(jié)構(gòu)c1c968da-b1f4-11ed-ad0d-dac502259ad0.png

USB設(shè)備文件函數(shù)接口

usbd_int.c函數(shù)接口usbd_int.c主要處理底層中斷,不同USB外設(shè),此部分會(huì)根據(jù)外設(shè)不同而有所改變。AT32系列芯片USB外設(shè)存在USBFS和OTGFS兩種外設(shè),此部分函數(shù)接口基本相同。表3.usbd_int函數(shù)接口c1fd4b28-b1f4-11ed-ad0d-dac502259ad0.pngusbd_core.c函數(shù)接口usbd_core.c此文件封裝不同的usb接口用于不同的地方調(diào)用,包括一些接收,發(fā)送函數(shù)等。表4.usbd_core函數(shù)接口c2297ad6-b1f4-11ed-ad0d-dac502259ad0.pngusbd_sdr.c函數(shù)接口usbd_sdr.c此文件處理USB一些標(biāo)準(zhǔn)請求。表5.usbd_sdr函數(shù)接口c2618a02-b1f4-11ed-ad0d-dac502259ad0.png支持的標(biāo)志設(shè)備請求如下表:表6. 標(biāo)準(zhǔn)設(shè)備請求c2832504-b1f4-11ed-ad0d-dac502259ad0.pngusbd_xx_class.c函數(shù)接口usbd_xx_class.c 此文件為具體設(shè)備類型的數(shù)據(jù)處理,通過結(jié)構(gòu)體函數(shù)來實(shí)現(xiàn)不同設(shè)備類型數(shù)據(jù)的處理。開發(fā)者根據(jù)不同的設(shè)備類型,來實(shí)現(xiàn)下面函數(shù)結(jié)構(gòu)體中的函數(shù),達(dá)到不同應(yīng)用結(jié)果。函數(shù)結(jié)構(gòu)體如下:表7.設(shè)備class函數(shù)結(jié)構(gòu)體c2ad8da8-b1f4-11ed-ad0d-dac502259ad0.png表8.設(shè)備class函數(shù)接口c2d040fa-b1f4-11ed-ad0d-dac502259ad0.pngusbd_xx_desc.c函數(shù)接口usbd_xx_desc.c此文件為設(shè)備描述文件,設(shè)備描述信息都通過此文件的函數(shù)接口返回給主機(jī)。表9.設(shè)備描述函數(shù)結(jié)構(gòu)體c2fe3cb2-b1f4-11ed-ad0d-dac502259ad0.png表10.設(shè)備描述接口函數(shù)c325cdae-b1f4-11ed-ad0d-dac502259ad0.png其它參數(shù)函數(shù)的參數(shù)結(jié)構(gòu)體如下,USB設(shè)備庫中參數(shù)傳遞使用結(jié)構(gòu)體usbd_core_type,如下圖:圖4.全局結(jié)構(gòu)體c3499464-b1f4-11ed-ad0d-dac502259ad0.pngUSB設(shè)備的連接狀態(tài)如下圖:連接狀態(tài)包含:

默認(rèn)狀態(tài)

地址狀態(tài)

配置狀態(tài)

掛起狀態(tài)

可使用usbd_connect_state_get函數(shù)查詢當(dāng)前USB設(shè)備的連接狀態(tài)。圖5.USB設(shè)備連接狀態(tài)c3841832-b1f4-11ed-ad0d-dac502259ad0.pngUSB設(shè)備返回值,USB函數(shù)接口使用如下函數(shù)返回值。圖6.函數(shù)返回值c3a789f2-b1f4-11ed-ad0d-dac502259ad0.png

端點(diǎn)FIFO分配

USB要正常收發(fā)數(shù)據(jù),在初始化時(shí)需要為每個(gè)端點(diǎn)分配發(fā)送/接收的FIFO,F(xiàn)IFO的大小可以根據(jù)端點(diǎn)上傳輸?shù)淖畲蟀L度確認(rèn)。注意,分配給所有端點(diǎn)FIFO大小的和不能超過系統(tǒng)分配給USB緩沖區(qū)的最大長度,具體USB的緩沖區(qū)大小參考RM上的描述。開發(fā)者可以參考例程usb_conf.h為每個(gè)端點(diǎn)自定義分配FIFO。另外使用USBFS和OTGFS兩種不同的外設(shè)時(shí),usb_conf.h中對端點(diǎn)FIFO分配稍有不同。USBFS外設(shè)端點(diǎn)FIFO分配USBFS外設(shè)端點(diǎn)分配實(shí)現(xiàn)了兩種分配方式,一種自動(dòng)分配,一種是用戶自定義分配。

  • 自動(dòng)分配:

1. 通過打開usb_conf.h中USB_EPT_AUTO_MALLOC_BUFFER宏開啟自動(dòng)分配功能

2. 在調(diào)用打開端點(diǎn)函數(shù)(usbd_ept_open)時(shí)自動(dòng)根據(jù)傳入的最大包長度自動(dòng)分配FIFO

3. 如果使用雙緩沖模式(同步端點(diǎn),雙緩沖Bulk)時(shí),在打開端點(diǎn)前先調(diào)用(usbd_ept_dbuffer_enable)表示使用雙緩沖模式,可參考audio例程。

4. 自動(dòng)分配audio例程配置如下:

usb_conf.h

c3e02f64-b1f4-11ed-ad0d-dac502259ad0.png

audio_class.c:端點(diǎn)打開

c3ffc040-b1f4-11ed-ad0d-dac502259ad0.png

  • 自定義分配:

1. 關(guān)閉usb_conf.h中USB_EPT_AUTO_MALLOC_BUFFER宏開啟自定義分配

2. 在調(diào)用打開端點(diǎn)函數(shù)(usbd_ept_open)時(shí)調(diào)用usbd_ept_buf_custom_define函數(shù)自定義為端點(diǎn)分配FIFO,參考vcp_loopback例程。

3. vcp_loopback例程自定義分配配置

usb_conf.h:

c424dc04-b1f4-11ed-ad0d-dac502259ad0.png

cdc_class.c端點(diǎn)打開:

c459c9f0-b1f4-11ed-ad0d-dac502259ad0.png

OTGFS外設(shè)端點(diǎn)FIFO分配OTGFS對于端點(diǎn)的接收緩沖是共享的,因此對于所有的OUT端點(diǎn),只需要分配一個(gè)接收FIFO。對發(fā)送緩沖區(qū)則需要為每個(gè)發(fā)送端點(diǎn)分配一塊自己專用的FIFO。支持的端點(diǎn)個(gè)數(shù)請參考對應(yīng)型號(hào)的RM。OTGFS的端點(diǎn)分配都需要開發(fā)者根據(jù)端點(diǎn)支持的最大包長度進(jìn)行分配,注意usb_conf.h中對端點(diǎn)分配的FIFO大小單位為word(Byte)。以vcp_loopback例程為例:c48da1a8-b1f4-11ed-ad0d-dac502259ad0.png

USB設(shè)備初始化

在使用USB時(shí),需要對USB的寄存器做一些基本的初始化,通過調(diào)用USB的初始化函數(shù)完成這部分的操作,對于外設(shè)USBFS和OTGFS在初始化時(shí)所調(diào)用的函數(shù)一定的區(qū)別。USBFS外設(shè)初始化USBFS初始化函數(shù)usbd_core_init包含5個(gè)參數(shù):c4a95b82-b1f4-11ed-ad0d-dac502259ad0.png例程vcp_loopback的初始化如下:usbd_core_init(&usb_core_dev, USB, &class_handler, &desc_handler, 0);OTGFS外設(shè)初始化OTGFS初始化函數(shù)usbd_init包含5個(gè)參數(shù):c4ccaf56-b1f4-11ed-ad0d-dac502259ad0.png例程vcp_loopback的初始化如下:c4e7203e-b1f4-11ed-ad0d-dac502259ad0.png

USB設(shè)備中斷處理

USB中斷入口函數(shù)usbd_irq_handler處理所有USB中斷,包括Reset,端點(diǎn)收發(fā)數(shù)據(jù),SOF,掛起,喚醒等中斷,下面介紹一些典型的中斷處理。圖7.USB中斷處理函數(shù)c5111aba-b1f4-11ed-ad0d-dac502259ad0.pngReset中斷處理當(dāng)USB設(shè)備在總線上檢測到Reset信號(hào)時(shí),將產(chǎn)生Reset中斷。軟件在收到Reset中斷時(shí),需要做基本的初始化,用于后面的枚舉處理。Reset中斷處理函數(shù)usbd_reset_handler:

端點(diǎn)FIFO初始化

設(shè)備地址設(shè)置為0

端點(diǎn)0初始化

調(diào)用設(shè)備類的事件函數(shù)

udev->class_handler->event_handler(udev, USBD_RESET_EVENT);

端點(diǎn)中斷處理當(dāng)USB端點(diǎn)收發(fā)數(shù)據(jù)完成時(shí),將產(chǎn)生對應(yīng)的端點(diǎn)完成中斷,端點(diǎn)完成中斷處理發(fā)送和接收的數(shù)據(jù)。中斷處理函數(shù):usbd_xeptx_handlerSOF中斷處理打開SOF中斷之后,USB設(shè)備在每收到一個(gè)主機(jī)發(fā)送的SOF就會(huì)產(chǎn)生SOF中斷。中斷處理函數(shù):usbd_sof_handler

中斷處理函數(shù)會(huì)調(diào)用設(shè)備類的SOF處理函數(shù)

udev->class_handler->sof_handler(udev);

Suspend中斷處理當(dāng)總線滿足掛起條件時(shí),USB設(shè)備會(huì)產(chǎn)生一個(gè)掛起中斷,開發(fā)者可根據(jù)此中斷判斷是否需要進(jìn)入低功耗模式。中斷處理函數(shù):usbd_suspend_handler

連接狀態(tài)設(shè)置為掛起狀態(tài)

設(shè)置設(shè)備進(jìn)入掛起狀態(tài)

調(diào)用設(shè)備類的事件處理函數(shù)

udev->class_handler->event_handler(udev, USBD_SUSPEND_EVENT);

Wakeup中斷處理當(dāng)設(shè)備在掛起狀態(tài)時(shí),如果總線上有wakeup信號(hào),USB設(shè)備將產(chǎn)生wakeup中斷。中斷處理函數(shù):usbd_wakeup_handler

設(shè)備退出掛起狀態(tài)

連接狀態(tài)設(shè)置為進(jìn)入掛起之前的狀態(tài)

調(diào)用設(shè)備類事件處理函數(shù)

udev->class_handler->event_handler(udev, USBD_WAKEUP_EVENT);

USB設(shè)備端點(diǎn)數(shù)據(jù)處理流程

USB設(shè)備在收到主機(jī)發(fā)送的數(shù)據(jù)包之后,對應(yīng)端點(diǎn)0的數(shù)據(jù)(IN/OUT/SETUP)會(huì)做單獨(dú)處理,其它端點(diǎn)的數(shù)據(jù)會(huì)調(diào)用設(shè)備類的IN/OUT handler進(jìn)行數(shù)據(jù)處理。如下圖所示數(shù)據(jù)的處理過程:圖8.端點(diǎn)數(shù)據(jù)處理流程c537bf80-b1f4-11ed-ad0d-dac502259ad0.png圖9. Setup處理流程c5566570-b1f4-11ed-ad0d-dac502259ad0.pngUSB控制端點(diǎn)枚舉流程當(dāng)設(shè)備接到主機(jī)之后,通過控制端點(diǎn)(端點(diǎn)0)進(jìn)行枚舉動(dòng)作,典型的枚舉流程圖如下:圖10.USB枚舉流程c572012c-b1f4-11ed-ad0d-dac502259ad0.pngUSB控制傳輸過程包含SETUP-DATA-STATUS三個(gè)階段,如下是一個(gè)主機(jī)獲取設(shè)備信息的傳輸過程GET_DESCRIPTOR:圖11 Get Descriptorc5b976c4-b1f4-11ed-ad0d-dac502259ad0.png如下是USB庫處理上圖Get Descriptor的流程:圖12. USB庫處理Get Descriptor調(diào)用流程c5ffd466-b1f4-11ed-ad0d-dac502259ad0.pngUSB設(shè)備請求格式(Setup請求)圖13.Setup請求格式c6318966-b1f4-11ed-ad0d-dac502259ad0.pngUSB應(yīng)用端點(diǎn)處理流程應(yīng)用端點(diǎn)指客戶實(shí)際應(yīng)用使用到的非0端點(diǎn),包括Bulk,interrupt,ISO等端點(diǎn)類型,這些端點(diǎn)的數(shù)據(jù)通回調(diào)函數(shù)in_handler和out_handler進(jìn)行處理。開發(fā)者只需要在xxx_class.c中class_in_handler和class_out_handler里面實(shí)現(xiàn)具體端點(diǎn)的數(shù)據(jù)處理即可。IN端點(diǎn)數(shù)據(jù)處理:圖14.IN端點(diǎn)數(shù)據(jù)處理c662f38e-b1f4-11ed-ad0d-dac502259ad0.pngOUT端點(diǎn)數(shù)據(jù)處理:圖15.OUT端點(diǎn)數(shù)據(jù)處理c67c7aa2-b1f4-11ed-ad0d-dac502259ad0.png

USB設(shè)備類型例程

本章將說明使用AT32 USB設(shè)備庫實(shí)現(xiàn)不同的設(shè)備類型的例程。目前實(shí)現(xiàn)的設(shè)備例程如下:

Audio

custom_hid

keyboard

mouse

msc(mass strorage)

printer

vcp_loopback

virtual_msc_iap

composite_vcp_keyboard

hid_iap

Audio例程

Audio例程使用audio V1.0的協(xié)議實(shí)現(xiàn)一個(gè)Speaker和Microphone,傳輸Audio數(shù)據(jù)使用同步傳輸,Speaker使用同步OUT傳輸,Microphone使用同步IN傳輸。Audio的例程運(yùn)行在AT-START評(píng)估板上,Audio Speaker和Mircophone是基于Audio Arduino Demo Board進(jìn)行實(shí)現(xiàn),實(shí)驗(yàn)過程中需要連接AT-START和Audio Arduino Board,更多開發(fā)板信息請參考《UM_Audio Arduino Daughter Board_V1.0/V2.0》,Audio協(xié)議請參數(shù)《Universal Serial Bus Device Class Define for Audio Device V1.0》。實(shí)現(xiàn)功能實(shí)現(xiàn)一個(gè)Speaker和Microphone的Audio復(fù)合設(shè)備,可以同時(shí)進(jìn)行音頻播放和錄音。Speaker功能:

支持16K,48K采樣率

支持采樣率切換

支持16bit采樣

支持靜音

支持音量調(diào)節(jié)

支持feedback功能

支持雙通道

Microphone功能:

支持16K,48K采樣率

支持采樣率切換

支持16bit采樣

支持靜音

支持音量調(diào)節(jié)

支持雙通道

外設(shè)資源使用USB外設(shè):

端點(diǎn)0 IN/OUT:用于USB枚舉以及Audio部分控制。

端點(diǎn)1 IN:用于Microphone錄音數(shù)據(jù)

端點(diǎn)1 OUT:用于Speaker播放數(shù)據(jù)

端點(diǎn)2 IN:用于Feedback數(shù)據(jù)

I2C

使用I2C發(fā)送控制信息到音頻Board

I2S:

使用I2S1發(fā)送數(shù)據(jù)到音頻board(speaker)

使用I2S2從音頻board接收數(shù)據(jù)(microphone)

DMA

使用DMA1通道3傳輸I2S1的數(shù)據(jù)

使用DMA1通道4傳輸I2S2的數(shù)據(jù)

TIMER:

使用TIMER產(chǎn)生Codec所需要的時(shí)鐘

Audio設(shè)備實(shí)現(xiàn)USB Audio設(shè)備類實(shí)現(xiàn)源文件在audio_class.c和audio_desc.c中,外部codec的控制以及音頻數(shù)據(jù)的處理都在audio_codec.c中實(shí)現(xiàn),根據(jù)主機(jī)的請求設(shè)置會(huì)調(diào)用到audio_codec.c中具體的設(shè)置函數(shù)。另外需要特別注意關(guān)于USB設(shè)備端點(diǎn)FIFO大小的分配在usb_conf.h中配置,此部分根據(jù)具體端點(diǎn)傳輸?shù)淖畲蟀L度進(jìn)行分配。1. 設(shè)備描述:(audio_desc.c/h)

Audio設(shè)備的描述(g_usbd_descriptor)

Audio設(shè)備的配置描述信息(g_usbd_configuration)

AC interface

Mricrophone Streaming interface

Microphone Terminal INPUT/OUTPUT

Microphone Feature Unit

Microphone Endpoint

Speaker Streaming interface

Speaker Terminal INPUT/OUTPUT

Speaker Feature Unit

Speaker Endpoint

Feedback Endpoint

Lang id (g_string_lang_id)

序列號(hào)(g_string_serial)

廠商產(chǎn)品ID(audio_desc.h)

c6915166-b1f4-11ed-ad0d-dac502259ad0.png

制造商、產(chǎn)品名、配置描述、接口描述(audio_desc.h)

c6a4482a-b1f4-11ed-ad0d-dac502259ad0.png

2. 數(shù)據(jù)處理部分(audio_class.c/h audio_codec.c/h)

端點(diǎn)初始化(class_init_handler)

c6c54c8c-b1f4-11ed-ad0d-dac502259ad0.png

端點(diǎn)清除(class_clear_handler)

c6ee9a1a-b1f4-11ed-ad0d-dac502259ad0.png

Audio控制請求(class_setup_handler)

實(shí)現(xiàn)如下audio控制請求:

c7825872-b1f4-11ed-ad0d-dac502259ad0.png

c7a71a04-b1f4-11ed-ad0d-dac502259ad0.png

Audio音量、靜音、采樣率設(shè)置(class_ept0_rx_handler)

此函數(shù)用于接收完主機(jī)發(fā)送的設(shè)置數(shù)據(jù)之后進(jìn)行處理,包括設(shè)置音量,靜音,以及采樣率的設(shè)置。

c7bb233c-b1f4-11ed-ad0d-dac502259ad0.png

Microphone和Feedback數(shù)據(jù)傳輸(class_in_handler)

c7ea5abc-b1f4-11ed-ad0d-dac502259ad0.png

Speaker數(shù)據(jù)接收(class_out_handler)

c8169b90-b1f4-11ed-ad0d-dac502259ad0.png

audio_codec.c中實(shí)現(xiàn)codec具體的控制以及數(shù)據(jù)處理,需要實(shí)現(xiàn)如下函數(shù):

c83ebfbc-b1f4-11ed-ad0d-dac502259ad0.png

以上函數(shù)可根據(jù)例程里的方式進(jìn)行實(shí)現(xiàn),也可以根據(jù)開發(fā)者實(shí)際使用的codec來進(jìn)行修改,對于codec的初始化部分,在這里將不再講述。

audio例程功能配置

audio_conf.h中可以對當(dāng)前audio例程進(jìn)行配置,例如:是否需要speaker功能,支持采樣率等,有如下選項(xiàng)配置:

c86a56ea-b1f4-11ed-ad0d-dac502259ad0.png

如何根據(jù)Audio例程進(jìn)行開發(fā)本章將簡單描述如何修改audio例程的代碼來進(jìn)行開發(fā),根據(jù)應(yīng)用具體的需求來修改代碼。

根據(jù)功能需求修改audio配置(audio_conf.h)

根據(jù)功能需求修改設(shè)備描述信息(audio_desc.c, audio_desc.h)

設(shè)備描述信息(g_usbd_descriptor)

設(shè)備配置描述信息(g_usbd_configuration)

其它描述

根據(jù)功能修改要使用端點(diǎn)(audio_class.c, audio_class.h)

端點(diǎn)定義(audio_class.h)

端點(diǎn)初始化(class_init_handler,class_clear_handler)

修改使用的Audio控制請求

控制請求修改(class_setup_handler)

控制請求設(shè)置處理(class_ept0_rx_handler)

Audio數(shù)據(jù)處理修改

IN數(shù)據(jù)處理(class_in_handler)

OUT數(shù)據(jù)處理(class_out_handler)

根據(jù)需求修改端點(diǎn)FIFO大小分配(usb_conf.h)

根據(jù)具體需求實(shí)現(xiàn)codec函數(shù)接口(audio_codec.c)


custom_hid例程

custom_hid實(shí)現(xiàn)一個(gè)HID(human interface device)功能,與上位機(jī)(Artery_UsbHid_Demo)通信完成一些簡單的交互操作,HID使用中斷傳輸與上位機(jī)通信,例程在AT-START開發(fā)板上運(yùn)行,上位機(jī)可在官網(wǎng)下載,關(guān)于HID協(xié)議參考《Human Interface Devices (HID) V1.11》。實(shí)現(xiàn)功能

上位機(jī)顯示按鍵狀態(tài)

通過上位機(jī)控制開發(fā)板LED等開關(guān)狀態(tài)

HID數(shù)據(jù)回環(huán)功能

外設(shè)資源使用USB外設(shè):

端點(diǎn)0 IN/OUT:用于USB枚舉

端點(diǎn)1 IN:用于數(shù)據(jù)發(fā)送

端點(diǎn)1 OUT:用于數(shù)據(jù)接收

custom_hid設(shè)備實(shí)現(xiàn)custom_hid設(shè)備類實(shí)現(xiàn)源代碼主要在custom_hid_class.c和custom_hid_desc.c中,這兩個(gè)源文件實(shí)現(xiàn)了對設(shè)備的描述和設(shè)備的處理。1. 設(shè)備描述:(custom_hid_desc.c/h)

custom hid設(shè)備描述(g_usbd_descriptor)

custom hid設(shè)備配置描述(g_usbd_configuration)

HID interface

HID Endpoint

custom hid report描述(g_usbd_hid_report)

HID_REPORT_ID_2(LED2)

HID_REPORT_ID_3(LED3)

HID_REPORT_ID_4(LED4)

HID_REPORT_ID_5(BUTTON)

HID_REPORT_ID_6(LOOPBACK DATA)

Lang id(g_string_lang_id)

序列號(hào)(g_string_serial)

廠商產(chǎn)品ID(custom_hid_desc.h

c8968c10-b1f4-11ed-ad0d-dac502259ad0.png

制造商、產(chǎn)品名、配置描述、接口描述(custom_hid_desc.h)

c8b456c8-b1f4-11ed-ad0d-dac502259ad0.png

2. 數(shù)據(jù)處理部分(custom_hid_class.c/h)

端點(diǎn)初始化(class_init_handler)

c8d81806-b1f4-11ed-ad0d-dac502259ad0.png

端點(diǎn)清除(class_clear_handler)

c8f9288e-b1f4-11ed-ad0d-dac502259ad0.png

HID設(shè)備類請求(class_setup_handler)

實(shí)現(xiàn)如下請求:

SET_PROTOCOL

GET_PROTOCOL

SET_IDLE

GET_IDLE

SET_REPORT

代碼如下:

c91c1dc6-b1f4-11ed-ad0d-dac502259ad0.png

Custom_HID發(fā)送數(shù)據(jù)

c9436d36-b1f4-11ed-ad0d-dac502259ad0.png

Custom_HID接收數(shù)據(jù)

c96cd112-b1f4-11ed-ad0d-dac502259ad0.png

數(shù)據(jù)處理

c98eb19c-b1f4-11ed-ad0d-dac502259ad0.png

如何根據(jù)custom hid例程進(jìn)行開發(fā)本章將簡單描述如何修改custom_hid例程的代碼來進(jìn)行開發(fā),根據(jù)應(yīng)用具體的需求來修改代碼。

根據(jù)功能需求修改設(shè)備描述信息(custom_hid_desc.c, custom_hid_desc.h)

設(shè)備描述信息(g_usbd_descriptor)

設(shè)備配置描述信息(g_usbd_configuration)

設(shè)備報(bào)告描述符(g_usbd_hid_report)

其它描述

根據(jù)功能修改要使用端點(diǎn)(custom_hid_class.c, custom_hid_class.h)

端點(diǎn)定義(custom_hid_class.h)

端點(diǎn)初始化(class_init_handler,class_clear_handler)

修改使用的custom_hid控制請求

控制請求修改(class_setup_handler)

控制請求設(shè)置處理(class_ept0_rx_handler)

custom_hid發(fā)送接收數(shù)據(jù)處理修改

IN數(shù)據(jù)處理(class_in_handler)

OUT數(shù)據(jù)處理(class_out_handler)

根據(jù)需求修改端點(diǎn)FIFO大小分配(usb_conf.h)

修改數(shù)據(jù)處理部分

keyboard例程

keyboard實(shí)現(xiàn)一個(gè)鍵盤功能,使用中斷傳輸與上位機(jī)通信,例程在AT-START開發(fā)板上運(yùn)行,通過按鍵發(fā)送字符串到主機(jī)。實(shí)現(xiàn)功能

通過按鍵發(fā)送字符串(”Keyboard Demo”)到主機(jī)

外設(shè)資源使用USB外設(shè):

端點(diǎn)0 IN/OUT:用于USB枚舉

端點(diǎn)1 IN:用于數(shù)據(jù)發(fā)送

keyboard設(shè)備實(shí)現(xiàn)keyboard設(shè)備類實(shí)現(xiàn)源代碼主要在keyboard_class.c和keyboard_desc.c中,這兩個(gè)源文件實(shí)現(xiàn)了對設(shè)備的描述和設(shè)備的處理。1. 設(shè)備描述:(keyboard_desc.c/h)

keyboard設(shè)備描述(g_usbd_descriptor)

keyboard設(shè)備配置描述(g_usbd_configuration)

keyboard interface

keyboard endpoint

keyboard report描述(g_usbd_hid_report)

Lang id(g_string_lang_id)

序列號(hào)(g_string_serial)

廠商產(chǎn)品ID(keyboard_desc.h)

ca2bd8aa-b1f4-11ed-ad0d-dac502259ad0.png

制造商、產(chǎn)品名、配置描述、接口描述(keyboard_desc.h)

ca4b7a5c-b1f4-11ed-ad0d-dac502259ad0.png


2. 數(shù)據(jù)處理部分(keyboard_class.c/h)

端點(diǎn)初始化(class_init_handler)

ca7299b6-b1f4-11ed-ad0d-dac502259ad0.png

端點(diǎn)清除(class_clear_handler)

ca94e340-b1f4-11ed-ad0d-dac502259ad0.png

HID設(shè)備類請求(class_setup_handler)

實(shí)現(xiàn)如下請求:

SET_PROTOCOL

GET_PROTOCOL

SET_IDLE

GET_IDLE

SET_REPORT

keyboard發(fā)送數(shù)據(jù)

cab7b65e-b1f4-11ed-ad0d-dac502259ad0.png

keyboard字符數(shù)據(jù)處理

caeec0d6-b1f4-11ed-ad0d-dac502259ad0.png

如何根據(jù)keyboard例程進(jìn)行開發(fā)本章將簡單描述如何修改keyboard例程的代碼來進(jìn)行開發(fā),根據(jù)應(yīng)用具體的需求來修改代碼。

根據(jù)功能需求修改設(shè)備描述信息(keyboard_desc.c, keyboard_desc.h)

設(shè)備描述信息(g_usbd_descriptor)

設(shè)備配置描述信息(g_usbd_configuration)

設(shè)備報(bào)告描述符(g_usbd_hid_report)

其它描述

根據(jù)功能修改要使用端點(diǎn)(keyboard_class.c, keyboard_class.h)

端點(diǎn)定義(keyboard_class.h)

端點(diǎn)初始化(class_init_handler,class_clear_handler)

修改使用的keyboard控制請求

控制請求修改(class_setup_handler)

控制請求設(shè)置處理(class_ept0_rx_handler)

keyboard發(fā)送接收數(shù)據(jù)處理修改

IN數(shù)據(jù)處理(class_in_handler)

OUT數(shù)據(jù)處理(class_out_handler)

根據(jù)需求修改端點(diǎn)FIFO大小分配(usb_conf.h)

修改數(shù)據(jù)處理部分

Mouse例程

實(shí)現(xiàn)功能mouse實(shí)現(xiàn)一個(gè)簡單的鼠標(biāo)功能,使用中斷傳輸與上位機(jī)通信,例程在AT-START開發(fā)板上運(yùn)行,通過開發(fā)板上的按鍵發(fā)送鼠標(biāo)右鍵功能。圖16.鼠標(biāo)傳輸格式cb434d40-b1f4-11ed-ad0d-dac502259ad0.png鼠標(biāo)d通常是通過設(shè)置X和Y值來控制PC鼠標(biāo)移動(dòng)。外設(shè)資源使用USB外設(shè):

端點(diǎn)0 IN/OUT:用于USB枚舉

端點(diǎn)1 IN:用于數(shù)據(jù)發(fā)送

mouse設(shè)備實(shí)現(xiàn)mouse設(shè)備實(shí)現(xiàn)源代碼主要在mouse_class.c和mouse_desc.c中,這兩個(gè)源文件實(shí)現(xiàn)了對設(shè)備的描述和設(shè)備的處理。1. 設(shè)備描述:(mouse_desc.c/h)

mouse設(shè)備描述(g_usbd_descriptor)

mouse設(shè)備配置描述(g_usbd_configuration)

mouseinterface

mouseendpoint

mouse report描述(g_usbd_hid_report)

Lang id(g_string_lang_id)

序列號(hào)(g_string_serial)

廠商產(chǎn)品ID(mouse_desc.h)

cb592174-b1f4-11ed-ad0d-dac502259ad0.png

制造商、產(chǎn)品名、配置描述、接口描述(keyboard_desc.h)

cb795840-b1f4-11ed-ad0d-dac502259ad0.png

2. 數(shù)據(jù)處理部分(mouse_class.c/h)

端點(diǎn)初始化(class_init_handler)

cb9d38dc-b1f4-11ed-ad0d-dac502259ad0.png

端點(diǎn)清除(class_clear_handler)

cbbb7d24-b1f4-11ed-ad0d-dac502259ad0.png

HID設(shè)備類請求(class_setup_handler)

實(shí)現(xiàn)如下請求:

SET_PROTOCOL

GET_PROTOCOL

SET_IDLE

GET_IDLE

SET_REPORT

keyboard發(fā)送數(shù)據(jù)

cbd6a270-b1f4-11ed-ad0d-dac502259ad0.png

mouse數(shù)據(jù)處理

cbfae8ba-b1f4-11ed-ad0d-dac502259ad0.png

如何根據(jù)mouse例程進(jìn)行開發(fā)本章將簡單描述如何修改mouse例程的代碼來進(jìn)行開發(fā),根據(jù)應(yīng)用具體的需求來修改代碼。

根據(jù)功能需求修改設(shè)備描述信息(mouse_desc.c, mouse_desc.h)

設(shè)備描述信息(g_usbd_descriptor)

設(shè)備配置描述信息(g_usbd_configuration)

設(shè)備報(bào)告描述符(g_usbd_hid_report)

其它描述

根據(jù)功能修改要使用端點(diǎn)(mouse_class.c, mouse_class.h)

端點(diǎn)定義(mouse_class.h)

端點(diǎn)初始化(class_init_handler,class_clear_handler)

修改使用的mouse控制請求

控制請求修改(class_setup_handler)

控制請求設(shè)置處理(class_ept0_rx_handler)

mouse發(fā)送接收數(shù)據(jù)處理修改

IN數(shù)據(jù)處理(class_in_handler)

OUT數(shù)據(jù)處理(class_out_handler)

根據(jù)需求修改端點(diǎn)FIFO大小分配(usb_conf.h)

修改數(shù)據(jù)處理部分

msc例程

msc(mass storage)例程展示如何通過USB BULK傳輸,進(jìn)行PC主機(jī)和AT-START通信,該例程支持BOT(Bulk only transfer)協(xié)議和SCSI(small computer system interface)指令。圖17. BOT 命令/數(shù)據(jù)/狀態(tài) 流程cc38d8c8-b1f4-11ed-ad0d-dac502259ad0.png圖18.BOT命令格式cc5be156-b1f4-11ed-ad0d-dac502259ad0.png圖19.BOT狀態(tài)格式cc90e504-b1f4-11ed-ad0d-dac502259ad0.png實(shí)現(xiàn)功能

將內(nèi)部FLASH虛擬成一個(gè)磁盤

實(shí)現(xiàn)bulk-only傳輸協(xié)議

實(shí)現(xiàn)subclass SCSI傳輸命令

MSC_CMD_INQUIRY

MSC_CMD_START_STOP

MSC_CMD_MODE_SENSE6

MSC_CMD_MODE_SENSE10

MSC_CMD_ALLOW_MEDIUM_REMOVAL

MSC_CMD_READ_10

MSC_CMD_READ_CAPACITY

MSC_CMD_REQUEST_SENSE

MSC_CMD_TEST_UNIT

MSC_CMD_VERIFY

MSC_CMD_WRITE_10

MSC_CMD_READ_FORMAT_CAPACITY

外設(shè)資源使用USB外設(shè):

端點(diǎn)0 IN/OUT:用于USB枚舉

端點(diǎn)1 IN:用于數(shù)據(jù)發(fā)送

端點(diǎn)1 OUT:用于數(shù)據(jù)接收

msc設(shè)備實(shí)現(xiàn)1. 設(shè)備描述:(msc_desc.c/h)

msc設(shè)備描述(g_usbd_descriptor)

msc設(shè)備配置描述(g_usbd_configuration)

msc interface

msc endpoint

Lang id(g_string_lang_id)

序列號(hào)(g_string_serial)

廠商產(chǎn)品ID(custom_hid_desc.h)

ccae8050-b1f4-11ed-ad0d-dac502259ad0.png

制造商、產(chǎn)品名、配置描述、接口描述(msc_desc.h)

ccd18cbc-b1f4-11ed-ad0d-dac502259ad0.png

2. 數(shù)據(jù)處理部分(msc_class.c/h)

端點(diǎn)初始化(class_init_handler)

ccf63198-b1f4-11ed-ad0d-dac502259ad0.png

端點(diǎn)清除(class_clear_handler)

cd218ea6-b1f4-11ed-ad0d-dac502259ad0.png

MSC設(shè)備請求(class_setup_handler)

GET_MAX_LUN

BO_RESET

代碼如下:

cd48068a-b1f4-11ed-ad0d-dac502259ad0.png

IN傳輸處理

cd6ef290-b1f4-11ed-ad0d-dac502259ad0.png

OUT傳輸處理(接收數(shù)據(jù))

cd91b73a-b1f4-11ed-ad0d-dac502259ad0.png

3. BOT和SCSI命令處理Bulk-only transfer和SCSI的命令處理在庫文件msc_bot_scsi.c/h中。表11.msc_bot_scsi函數(shù)列表cdb239a6-b1f4-11ed-ad0d-dac502259ad0.png4. diskio處理此部分主要處理與存儲(chǔ)設(shè)備間接口,例程里面以內(nèi)部flash的存儲(chǔ)控制作為說明,msc_diskio.c/h根據(jù)開發(fā)者使用存儲(chǔ)不同,只需要實(shí)現(xiàn)對應(yīng)存儲(chǔ)的讀寫函數(shù)即可。表12.inquiry描述cde13896-b1f4-11ed-ad0d-dac502259ad0.png表13 diskio操作函數(shù)ce126f42-b1f4-11ed-ad0d-dac502259ad0.png如何根據(jù)msc例程進(jìn)行開發(fā)本章將簡單描述如何修改msc例程的代碼來進(jìn)行開發(fā),根據(jù)應(yīng)用具體的需求來修改代碼。

根據(jù)功能需求修改設(shè)備描述信息(msc_desc.c, msc_desc.h)

設(shè)備描述信息(g_usbd_descriptor)

設(shè)備配置描述信息(g_usbd_configuration)

其它描述

根據(jù)功能修改要使用端點(diǎn)(msc_class.c, msc_class.h)

端點(diǎn)定義(msc_class.h)

端點(diǎn)初始化(class_init_handler,class_clear_handler)

修改使用的msc控制請求

控制請求修改(class_setup_handler)

控制請求設(shè)置處理(class_ept0_rx_handler)

msc發(fā)送接收數(shù)據(jù)處理修改

IN數(shù)據(jù)處理(class_in_handler)

OUT數(shù)據(jù)處理(class_out_handler)

根據(jù)需求修改端點(diǎn)FIFO大小分配(usb_conf.h)

修改diskio部分,實(shí)現(xiàn)表13里面的函數(shù)(msc_diskio.c/h)

printer例程

Printer例程展示了使用USB Device作為打印機(jī)設(shè)備,此demo可在PC端識(shí)別到一個(gè)打印機(jī)設(shè)備并且可應(yīng)答PC端發(fā)送的關(guān)于printer類的狀態(tài)請求命令(例如打印機(jī)的有紙/無紙狀態(tài))
實(shí)現(xiàn)功能

實(shí)現(xiàn)一個(gè)打印機(jī)設(shè)備

外設(shè)資源使用USB外設(shè):

端點(diǎn)0 IN/OUT:用于USB枚舉

端點(diǎn)1 IN:用于數(shù)據(jù)發(fā)送

端點(diǎn)1 OUT:用于數(shù)據(jù)接收

printer設(shè)備實(shí)現(xiàn)1. 設(shè)備描述(printer_desc.c/h)

printer設(shè)備描述(g_usbd_descriptor)

printer設(shè)備配置描述(g_usbd_configuration)

printer interface

printer endpoint

Lang id(g_string_lang_id)

序列號(hào)(g_string_serial)

廠商產(chǎn)品ID(custom_hid_desc.h)

ce3e2e48-b1f4-11ed-ad0d-dac502259ad0.png

制造商、產(chǎn)品名、配置描述、接口描述(msc_desc.h)

ce57c0ba-b1f4-11ed-ad0d-dac502259ad0.png

2. 數(shù)據(jù)處理(printer_class.c/h)

端點(diǎn)初始化(class_init_handler)

ce75f6fc-b1f4-11ed-ad0d-dac502259ad0.png

端點(diǎn)清除(class_clear_handler)

ce9a5f4c-b1f4-11ed-ad0d-dac502259ad0.png

printer設(shè)備請求(class_setup_handler)

GET_DEVICE_ID

PORT_STATUS

SOFT_RESET

代碼如下:

cebde00c-b1f4-11ed-ad0d-dac502259ad0.png

IN傳輸處理

cf25460c-b1f4-11ed-ad0d-dac502259ad0.png

OUT傳輸處理(接收數(shù)據(jù))

cf3f0e7a-b1f4-11ed-ad0d-dac502259ad0.png

如何根據(jù)printer例程進(jìn)行開發(fā)本章將簡單描述如何修改printer例程的代碼來進(jìn)行開發(fā),根據(jù)應(yīng)用具體的需求來修改代碼。

根據(jù)功能需求修改設(shè)備描述信息(printer_desc.c, printer_desc.h)

設(shè)備描述信息(g_usbd_descriptor)

設(shè)備配置描述信息(g_usbd_configuration)

其它描述

根據(jù)功能修改要使用端點(diǎn)(printer_class.c, printer_class.h)

端點(diǎn)定義(printer_class.h)

端點(diǎn)初始化(class_init_handler,class_clear_handler)

修改使用的printer控制請求

控制請求修改(class_setup_handler)

控制請求設(shè)置處理(class_ept0_rx_handler)

printer發(fā)送接收數(shù)據(jù)處理修改

IN數(shù)據(jù)處理(class_in_handler)

OUT數(shù)據(jù)處理(class_out_handler)

根據(jù)需求修改端點(diǎn)FIFO大小分配(usb_conf.h)

vcp loopback例程

在現(xiàn)代PC中,USB是和絕大部分外設(shè)通信的標(biāo)準(zhǔn)接口。盡管如此,大部分的工業(yè)軟件依舊使用COM接口(UART)通信。vcp_loopback例程提供使用USB設(shè)備模擬COM接口方法,解決了該問題, vcp_loopback例程展示了如何通過CDC協(xié)議進(jìn)行USB數(shù)據(jù)收發(fā)。改例程需要使用虛擬串口驅(qū)動(dòng),可在官網(wǎng)下載。實(shí)現(xiàn)功能

實(shí)現(xiàn)一個(gè)虛擬串口

外設(shè)資源使用USB外設(shè):

端點(diǎn)0 IN/OUT:用于USB枚舉

端點(diǎn)1 IN:用于數(shù)據(jù)發(fā)送

端點(diǎn)1 OUT:用于數(shù)據(jù)接收

端點(diǎn)2 IN:監(jiān)控中斷傳輸

vcp_loopback設(shè)備實(shí)現(xiàn)1. 設(shè)備描述(cdc_desc.c/h)

cdc設(shè)備描述(g_usbd_descriptor)

cdc設(shè)備配置描述(g_usbd_configuration)

cdc interface

cdc endpoint

Lang id(g_string_lang_id)

序列號(hào)(g_string_serial)

廠商產(chǎn)品ID(custom_hid_desc.h)

cf5e014a-b1f4-11ed-ad0d-dac502259ad0.png

制造商、產(chǎn)品名、配置描述、接口描述(msc_desc.h)

cf7c2c06-b1f4-11ed-ad0d-dac502259ad0.png

2. 數(shù)據(jù)處理(cdc_class.c/h)

端點(diǎn)初始化(class_init_handler)

cf9efd26-b1f4-11ed-ad0d-dac502259ad0.png

端點(diǎn)清除(class_clear_handler)

cfcef0a8-b1f4-11ed-ad0d-dac502259ad0.png

cdc設(shè)備請求(class_setup_handler)

SET_LINE_CODING

GET_LINE_CODING

代碼如下:

cff39278-b1f4-11ed-ad0d-dac502259ad0.png

IN傳輸處理

d039790a-b1f4-11ed-ad0d-dac502259ad0.png

OUT傳輸處理(接收數(shù)據(jù))

d06695fc-b1f4-11ed-ad0d-dac502259ad0.png

如何根據(jù)vcp_loopback例程進(jìn)行開發(fā)本章將簡單描述如何修改cdc例程的代碼來進(jìn)行開發(fā),根據(jù)應(yīng)用具體的需求來修改代碼。

根據(jù)功能需求修改設(shè)備描述信息(cdc_desc.c, cdc_desc.h)

設(shè)備描述信息(g_usbd_descriptor)

設(shè)備配置描述信息(g_usbd_configuration)

其它描述

根據(jù)功能修改要使用端點(diǎn)(cdc_class.c, cdc_class.h)

端點(diǎn)定義(cdc_class.h)

端點(diǎn)初始化(class_init_handler,class_clear_handler)

修改使用的cdc控制請求

控制請求修改(class_setup_handler)

控制請求設(shè)置處理(class_ept0_rx_handler)

cdc發(fā)送接收數(shù)據(jù)處理修改

IN數(shù)據(jù)處理(class_in_handler)

OUT數(shù)據(jù)處理(class_out_handler)

根據(jù)需求修改端點(diǎn)FIFO大小分配(usb_conf.h)

virtual_msc_iap例程

virtual msc iap實(shí)現(xiàn)一個(gè)升級(jí)功能的設(shè)備,不依賴上位機(jī),當(dāng)接入PC之后,通過將固件拷貝到磁盤以達(dá)到升級(jí)目的。實(shí)現(xiàn)功能

將flash虛擬成磁盤進(jìn)行升級(jí)

Iap保留使用20K byte空間

升級(jí)完成之后reset usb設(shè)備返回升級(jí)狀態(tài)

支持下載地址設(shè)置

支持升級(jí)完成之后跳轉(zhuǎn)到APP運(yùn)行

支持bin文件升級(jí)

外設(shè)資源使用USB外設(shè):

端點(diǎn)0 IN/OUT:用于USB枚舉

端點(diǎn)1 IN:用于數(shù)據(jù)發(fā)送

端點(diǎn)1 OUT:用于數(shù)據(jù)接收

virtual_msc_iap設(shè)備實(shí)現(xiàn)1. 設(shè)備描述(msc_desc.c/h)參考3.5.3.12. 數(shù)據(jù)處理部分(msc_class.c/h)參考3.5.3.23. BOT和SCSI命令處理參考3.5.3.34. diskio處理參考3.5.3.45. flash升級(jí)部分(flash_fat16.c/h)

升級(jí)狀態(tài)

d095113e-b1f4-11ed-ad0d-dac502259ad0.png

當(dāng)連接Host之后,在響應(yīng)磁盤上通過TXT文檔顯示當(dāng)前狀態(tài)

準(zhǔn)備升級(jí)狀態(tài)(Ready.TXT)

升級(jí)成功(Success.TXT)

升級(jí)失?。‵ailed.TXT)

未知文件或錯(cuò)誤(Unkonwn.TXT)

升級(jí)文件大于FLASH大?。↙arge.TXT)

FAT16分區(qū)表描述

  • d0bde7da-b1f4-11ed-ad0d-dac502259ad0.png
  • 升級(jí)接口函數(shù)d102c620-b1f4-11ed-ad0d-dac502259ad0.png

如何根據(jù)virtual_msc_iap例程進(jìn)行開發(fā)本章將簡單描述如何修改virtual_msc_iap例程的代碼來進(jìn)行開發(fā),根據(jù)應(yīng)用具體的需求來修改代碼。

  • 根據(jù)功能需求修改設(shè)備描述信息(msc_desc.c, msc_desc.h)設(shè)備描述信息(g_usbd_descriptor)設(shè)備配置描述信息(g_usbd_configuration)其它描述
  • 根據(jù)功能修改要使用端點(diǎn)(msc_class.c, msc_class.h)端點(diǎn)定義(msc_class.h)端點(diǎn)初始化(class_init_handler,class_clear_handler)
  • 修改使用的msc控制請求控制請求修改(class_setup_handler)控制請求設(shè)置處理(class_ept0_rx_handler)
  • msc發(fā)送接收數(shù)據(jù)處理修改IN數(shù)據(jù)處理(class_in_handler)OUT數(shù)據(jù)處理(class_out_handler)
  • 根據(jù)需求修改端點(diǎn)FIFO大小分配(usb_conf.h)
  • 修改diskio部分,實(shí)現(xiàn)表13里面的函數(shù)(msc_diskio.c/h)
  • 修改flash_fat16.c/h升級(jí)參數(shù),包括APP起始地址,IAP占用空間等,要保證IAP和APP地址不重合。

composive_vcp_keyboard例程

復(fù)合設(shè)備定義如下:擁有多個(gè)相互獨(dú)立接口的設(shè)備被稱為復(fù)合設(shè)備。當(dāng)使用該設(shè)備時(shí),該設(shè)備上擁有多個(gè)組合的功能。例如,Composite vcp keyboard demo 提供的復(fù)合設(shè)備包含HID和CDC功能(鍵盤和串口通信)實(shí)現(xiàn)功能

  • 實(shí)現(xiàn)一個(gè)USB虛擬串口(參考3.7)
  • 實(shí)現(xiàn)一個(gè)USB鍵盤設(shè)備(參考3.3)

外設(shè)資源使用USB外設(shè):

  • 端點(diǎn)0 IN/OUT:用于USB枚舉
  • 端點(diǎn)1 IN:用于數(shù)據(jù)發(fā)送
  • 端點(diǎn)1 OUT:用于數(shù)據(jù)接收
  • 端點(diǎn)2 IN:CDC命令中斷傳輸
  • 端點(diǎn)3 IN:Keyboard發(fā)送數(shù)據(jù)

composite_vcp_keyboard設(shè)備實(shí)現(xiàn)1. 設(shè)備描述(cdc_keyboard_desc.c/h)

  • cdc_keyboard設(shè)備描述(g_usbd_descriptor)
  • cdc_keyboard設(shè)備配置描述(g_usbd_configuration)cdc interfacecdc endpointkeyboard interfacekeyboard endpoint
  • Lang id(g_string_lang_id)
  • 序列號(hào)(g_string_serial)
  • 廠商產(chǎn)品ID(custom_hid_desc.h)d1214078-b1f4-11ed-ad0d-dac502259ad0.png
  • 制造商、產(chǎn)品名、配置描述、接口描述(msc_desc.h)d13f9eb0-b1f4-11ed-ad0d-dac502259ad0.png

2. 數(shù)據(jù)處理(cdc_keyboard_class.c/h)

  • 端點(diǎn)初始化(class_init_handler)d165d8be-b1f4-11ed-ad0d-dac502259ad0.png
  • 端點(diǎn)清除(class_clear_handler)d197f04c-b1f4-11ed-ad0d-dac502259ad0.png
  • 設(shè)備請求(class_setup_handler)cdc設(shè)備類請求:SET_LINE_CODINGGET_LINE_CODIN

Keyboard hid設(shè)備類請求:

  • SET_PROTOCOLGET_PROTOCOLSET_IDLEGET_IDLESET_REPORT

代碼如下:

  • d1b97776-b1f4-11ed-ad0d-dac502259ad0.png
  • IN傳輸處理d1e20146-b1f4-11ed-ad0d-dac502259ad0.png
  • OUT傳輸處理(接收數(shù)據(jù))d20de086-b1f4-11ed-ad0d-dac502259ad0.png

如何根據(jù)composite_vcp_keyboard例程進(jìn)行開發(fā)本章將簡單描述如何修改composite_vcp_keyboard例程的代碼來進(jìn)行復(fù)合設(shè)備開發(fā),根據(jù)應(yīng)用具體的需求來修改代碼。

  • 根據(jù)功能需求修改設(shè)備描述信息(cdc_keyboard_desc.c, cdc_keyboard_desc.h)設(shè)備描述信息(g_usbd_descriptor)設(shè)備配置描述信息(g_usbd_configuration)其它描述
  • 根據(jù)功能修改要使用端點(diǎn)(cdc_keyboard_class.c, cdc_keyboard_class.h)端點(diǎn)定義(cdc_class.h)端點(diǎn)初始化(class_init_handler,class_clear_handler)
  • 修改使用的cdc控制請求控制請求修改(class_setup_handler)控制請求設(shè)置處理(class_ept0_rx_handler)
  • cdc_keyboard發(fā)送接收數(shù)據(jù)處理修改IN數(shù)據(jù)處理(class_in_handler)OUT數(shù)據(jù)處理(class_out_handler)
  • 根據(jù)需求修改端點(diǎn)FIFO大小分配(usb_conf.h)

hid_iap例程

hid_iap例程使用usb hid實(shí)現(xiàn)IAP升級(jí)功能,需要搭配上位機(jī)使用,上位機(jī)可在官網(wǎng)下載IAP_Programmer。hid iap的例程代碼位于BSP固件庫utilities\at32f435_437_usb_iap_demo中,使用方法可參考《AN0007_AT32_IAP_using_the_USB_HID_ZH_V2.x.x.pdf》1. 實(shí)現(xiàn)功能

  • 實(shí)現(xiàn)使用HID進(jìn)行設(shè)備升級(jí)

2. 外設(shè)資源使用USB 外設(shè):

  • 端點(diǎn)0 IN/OUT:用于USB枚舉
  • 端點(diǎn)1 IN:用于數(shù)據(jù)發(fā)送
  • 端點(diǎn)1 OUT:用于數(shù)據(jù)接收

hid_iap設(shè)備實(shí)現(xiàn)1. 設(shè)備描述(hid_iap_desc.c/h)

  • hid iap設(shè)備描述(g_usbd_descriptor)
  • hid iap設(shè)備配置描述(g_usbd_configuration)HID interfaceHID Endpoint
  • hid iap report描述(g_usbd_hid_report)
  • Lang id(g_string_lang_id)
  • 序列號(hào)(g_string_serial)
  • 廠商產(chǎn)品ID(hid_iap_desc.h)d2383d4a-b1f4-11ed-ad0d-dac502259ad0.png
  • 制造商、產(chǎn)品名、配置描述、接口描述(hid_iap_desc.h)d258ae04-b1f4-11ed-ad0d-dac502259ad0.png

2. 數(shù)據(jù)處理(hid_iap_class.c/h)

  • 端點(diǎn)初始化(class_init_handler)d27fbf58-b1f4-11ed-ad0d-dac502259ad0.png
  • 端點(diǎn)清除(class_clear_handler)d2a77732-b1f4-11ed-ad0d-dac502259ad0.png
  • HID設(shè)備類請求(class_setup_handler)實(shí)現(xiàn)如下請求:SET_PROTOCOLGET_PROTOCOLSET_IDLEGET_IDLESET_REPORT代碼如下:d2ca1170-b1f4-11ed-ad0d-dac502259ad0.png
  • hid iap發(fā)送數(shù)據(jù)d2f8f21a-b1f4-11ed-ad0d-dac502259ad0.png
  • hid iap接收數(shù)據(jù)d32c8eb8-b1f4-11ed-ad0d-dac502259ad0.png
  • 升級(jí)命令數(shù)據(jù)處理d350eb8c-b1f4-11ed-ad0d-dac502259ad0.png

3. hid iap升級(jí)協(xié)議表14.hid iap升級(jí)命令d3876b08-b1f4-11ed-ad0d-dac502259ad0.png

0x5AA0進(jìn)入IAP模式

作為一個(gè)特定的命令,當(dāng)用戶APP收到這個(gè)命令之后將進(jìn)入IAP模式。實(shí)現(xiàn)方式為收到這個(gè)命令之后擦除flag然后reset

上位機(jī):[0x5A, 0xA0]

IAP設(shè)備響應(yīng):[0x5A, 0XA0, ACK/NACK]

0x5AA1開始下載

上位機(jī):[0x5A,0xA1]

IAP設(shè)備響應(yīng):[0x5A,0xA1,ACK/NACK]

0x5AA2設(shè)置下載地址

設(shè)置下載地址需按照1KB對齊,每下載1Kbyte數(shù)據(jù)之后,都需要重新設(shè)置下載地址。

上位機(jī)(命令+地址):[0x5A, 0xA2, 0x08, 0x00, 0x40, 0x00]

IAP設(shè)備響應(yīng):[0x5A,0xA2, ACK/NACK]

0x5AA3下載數(shù)據(jù)命令(1KB 對齊多個(gè)包發(fā)送)

下載數(shù)據(jù)命令采用命令+長度+數(shù)據(jù)的格式進(jìn)行發(fā)送,每包最大數(shù)據(jù)量為60Byte(64–命令–長度),當(dāng)發(fā)送數(shù)據(jù)達(dá)到1KB時(shí),上位機(jī)需要等待設(shè)備的ACK響應(yīng)。此時(shí)設(shè)備需將1KB的數(shù)據(jù)寫到FLASH。

上位機(jī)(命令(2Byte)+長度(2 Byte)+數(shù)據(jù)(n byte)):[0x5A,0xA3,LEN1,LEN0,DATA0….DATAn]

收完1KB數(shù)據(jù)后IAP設(shè)備響應(yīng):[0x5A, 0XA3, ACK/NACK]

0x5AA4下載結(jié)束

上位機(jī):[0x5A, 0xA4]

IAP設(shè)備響應(yīng):[0x5A, 0xA4, ACK/NACK]

0x5AA5固件CRC校驗(yàn)

上位機(jī)傳輸固件起始地址和固件大小/1KB(固件大小按1KB對齊,不足補(bǔ)0xFF),由IAP計(jì)算CRC之后返回給上位機(jī)。

上位機(jī):[0x5A,0xA5, 0x08, 0x00, 0x40, 0x00, LEN1, LEN0]

IAP設(shè)備響應(yīng): [0x5A, 0xA5, ACK/NACK, CRC3, CRC2, CRC1, CRC0]

0x5AA6跳轉(zhuǎn)命令

跳轉(zhuǎn)命令將跳轉(zhuǎn)到用戶代碼進(jìn)行運(yùn)行

上位機(jī):[0x5A,0xA6, 0x08, 0x00, 0x40, 0x00]

IAP設(shè)備響應(yīng):[0x5A,0xA6,ACK/NACK]

0x5AA7獲取IAP設(shè)置的app地址

返回IAP設(shè)置的app地址

上位機(jī):[0x5A, 0xA7]

IAP設(shè)備響應(yīng):[0x5A, 0xA7, ACK/NACK, 0x08, 0x00, 0x40, 0x00]

如何根據(jù)hid_iap例程進(jìn)行開發(fā)本章將簡單描述如何修改hid_iap例程的代碼來進(jìn)行開發(fā),根據(jù)應(yīng)用具體的需求來修改代碼。

  • 根據(jù)功能需求修改設(shè)備描述信息(hid_iap_desc.c, hid_iap_desc.h)設(shè)備描述信息(g_usbd_descriptor)設(shè)備配置描述信息(g_usbd_configuration)其它描述
  • 根據(jù)功能修改要使用端點(diǎn)(hid_iap_class.c, hid_iap_class.h)端點(diǎn)定義(hid_iap_class.h)端點(diǎn)初始化(class_init_handler,class_clear_handler)
  • 修改使用的hid控制請求控制請求修改(class_setup_handler)控制請求設(shè)置處理(class_ept0_rx_handler)
  • hid_iap發(fā)送接收數(shù)據(jù)處理修改IN數(shù)據(jù)處理(class_in_handler)OUT數(shù)據(jù)處理(class_out_handler)
  • 根據(jù)需求修改端點(diǎn)FIFO大小分配(usb_conf.h)
  • 修改hid_iap_user.h中的升級(jí)參數(shù),包括APP起始地址等,IAP占用空間等,保證APP地址和IAP的地址不要重合。

關(guān)于雅特力雅特力科技于2016年成立,是一家致力于推動(dòng)全球市場32位微控制器(MCU)創(chuàng)新趨勢的芯片設(shè)計(jì)公司,專注于ARM Cortex-M4/M0+的32位微控制器研發(fā)與創(chuàng)新,全系列采用55nm先進(jìn)工藝及ARM Cortex-M4高效能或M0+低功耗內(nèi)核,締造M4業(yè)界最高主頻288MHz運(yùn)算效能,并支持工業(yè)級(jí)別芯片工作溫度范圍(-40°~105°)。雅特力目前已累積相當(dāng)多元的終端產(chǎn)品成功案例:如微型打印機(jī)、掃地機(jī)、光流無人機(jī)、熱成像儀、激光雷達(dá)、工業(yè)縫紉機(jī)、伺服驅(qū)控、電競周邊市場、斷路器、ADAS、T-BOX、數(shù)字電源、電動(dòng)工具等終端設(shè)備應(yīng)用,廣泛地覆蓋5G物聯(lián)網(wǎng)、消費(fèi)、商務(wù)及工控等領(lǐng)域。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • mcu
    mcu
    +關(guān)注

    關(guān)注

    146

    文章

    17148

    瀏覽量

    351195
  • AT32
    +關(guān)注

    關(guān)注

    1

    文章

    113

    瀏覽量

    2102
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    發(fā)布高性能電機(jī)控制專用MCU

    近日,科技正式推出了其首款高性能電機(jī)控制專用MCU——AT32M412/M416。這款MCU專為出行工具、家電及工業(yè)控制等應(yīng)用而設(shè)計(jì),
    的頭像 發(fā)表于 11-01 18:11 ?900次閱讀

    AT32講堂088 | AT32F402/F405時(shí)鐘配置

    介紹如何結(jié)合提供的V2.x.x的板級(jí)支持包(BSP)來配置時(shí)鐘。以下介紹時(shí)鐘配置的方法主要分兩種:1、以手動(dòng)編寫代碼調(diào)用BSP中提供的驅(qū)動(dòng)函數(shù)接口來進(jìn)行時(shí)鐘配
    的頭像 發(fā)表于 09-15 08:08 ?494次閱讀
    <b class='flag-5'>AT32</b><b class='flag-5'>講堂</b>088 | <b class='flag-5'>雅</b><b class='flag-5'>特</b><b class='flag-5'>力</b>AT32F402/F405時(shí)鐘配置

    AT32講堂087 | AT32 IDE快速入門指南

    新建項(xiàng)目新項(xiàng)目向?qū)T32ID提供支持MCU的C語言項(xiàng)目模板,方便用戶快速創(chuàng)建項(xiàng)目。菜單欄【File】>【New】>【CProject】。新建項(xiàng)目向?qū)У膶υ捒驅(qū)⒊霈F(xiàn)。在對
    的頭像 發(fā)表于 09-15 08:08 ?452次閱讀
    <b class='flag-5'>AT32</b><b class='flag-5'>講堂</b>087 | <b class='flag-5'>雅</b><b class='flag-5'>特</b><b class='flag-5'>力</b><b class='flag-5'>AT32</b> IDE快速入門指南

    AT32 MCU的隨機(jī)數(shù)生成

    應(yīng)用的需求。底下提供兩種方法:提高亂度的方法之一,使用ADC的誤差。AT32的微控制器內(nèi)置最多三個(gè)高級(jí)12位片上SAR模擬數(shù)字轉(zhuǎn)換器(ADC)并提供自校準(zhǔn)功能,保證1
    的頭像 發(fā)表于 08-30 12:26 ?569次閱讀
    <b class='flag-5'>雅</b><b class='flag-5'>特</b><b class='flag-5'>力</b><b class='flag-5'>AT32</b> <b class='flag-5'>MCU</b>的隨機(jī)數(shù)生成

    AT32講堂085 | AT32 MCU HICK時(shí)鐘校準(zhǔn)

    簡介AT32系列MCU內(nèi)部都有提供適合運(yùn)行的內(nèi)部高速時(shí)鐘(HICK),其本質(zhì)就是內(nèi)置于芯片的RC振蕩器。在25℃下,其典型值頻率8MHz的精度由工廠校準(zhǔn)到±1%,在-40到105℃,該內(nèi)部高速時(shí)鐘
    的頭像 發(fā)表于 08-30 12:26 ?626次閱讀
    <b class='flag-5'>AT32</b><b class='flag-5'>講堂</b>085 | <b class='flag-5'>雅</b><b class='flag-5'>特</b><b class='flag-5'>力</b><b class='flag-5'>AT32</b> <b class='flag-5'>MCU</b> HICK時(shí)鐘校準(zhǔn)

    攜多款AT32 MCU新品與應(yīng)用方案亮相2024慕尼黑上海電子展

    7月8日,2024慕尼黑上海電子展electronicaChina在上海新國際博覽中心拉開序幕,作為全球電子行業(yè)的盛會(huì),匯聚了國內(nèi)外眾多優(yōu)質(zhì)電子企業(yè),為業(yè)界呈現(xiàn)一場前所未有的科技盛宴。攜高性能
    的頭像 發(fā)表于 07-09 08:15 ?667次閱讀
    <b class='flag-5'>雅</b><b class='flag-5'>特</b><b class='flag-5'>力</b>攜多款<b class='flag-5'>AT32</b> <b class='flag-5'>MCU</b>新品與應(yīng)用方案亮相2024慕尼黑上海電子展

    如何在AT32 MCU上創(chuàng)建IAP應(yīng)用程序

    概述AT32CANIAP快速使用方法使用CAN進(jìn)行IAP升級(jí),此示例使用PC上位軟件(IAP_Programmer.exe)通過一個(gè)USB轉(zhuǎn)CAN的橋接設(shè)備和目標(biāo)板進(jìn)行通信,IAPDemo和橋接
    的頭像 發(fā)表于 05-20 08:15 ?1129次閱讀
    如何在<b class='flag-5'>雅</b><b class='flag-5'>特</b><b class='flag-5'>力</b><b class='flag-5'>AT32</b> <b class='flag-5'>MCU</b>上創(chuàng)建IAP應(yīng)用程序

    AT32 MCU通過IEC 60730功能安全認(rèn)證,為家電產(chǎn)品提供安全保障

    ??近日,AT32MCU安全順利通過IEC60730功能安全認(rèn)證,為家電產(chǎn)品提供安全質(zhì)量保證。國際公認(rèn)的測試、檢驗(yàn)和認(rèn)證機(jī)構(gòu)SGS為
    的頭像 發(fā)表于 05-20 08:15 ?566次閱讀
    <b class='flag-5'>雅</b><b class='flag-5'>特</b><b class='flag-5'>力</b><b class='flag-5'>AT32</b> <b class='flag-5'>MCU</b>通過IEC 60730功能安全認(rèn)證,為家電產(chǎn)品提供安全保障

    發(fā)布全新車載型AT32A423系列MCU

    近日發(fā)布了全新車載型AT32A423系列MCU,該產(chǎn)品基于ARM?Cortex?-M4內(nèi)核設(shè)計(jì),集成了豐富的外設(shè)資源,展現(xiàn)了高效能與多尺寸封裝的雙重優(yōu)勢。
    的頭像 發(fā)表于 05-17 10:38 ?635次閱讀

    AT32F423入門使用指南

    初步環(huán)境準(zhǔn)備開發(fā)環(huán)境下載地址:
    的頭像 發(fā)表于 05-14 08:15 ?1547次閱讀
    <b class='flag-5'>雅</b><b class='flag-5'>特</b><b class='flag-5'>力</b>AT32F423入門使用指南

    AT32F405高速USB MCU榮獲“年度最佳MCU

    設(shè)計(jì)Fabless100排行榜也在同期舉行的中國IC領(lǐng)袖峰會(huì)發(fā)布,AT32F405榮獲“中國IC設(shè)計(jì)成就獎(jiǎng)之年度最佳MCU”。年度最佳MCU
    的頭像 發(fā)表于 03-30 08:13 ?930次閱讀
    <b class='flag-5'>雅</b><b class='flag-5'>特</b><b class='flag-5'>力</b>AT32F405高速<b class='flag-5'>USB</b> <b class='flag-5'>MCU</b>榮獲“年度最佳<b class='flag-5'>MCU</b>”

    AT32 MCU與SEGGER攜手合作,開發(fā)量產(chǎn)事半功倍

    近日,與SEGGER共同宣布J-Link仿真調(diào)試器與Flasher在線燒錄器全面支持AT32 MCU產(chǎn)品,SEGGER工具鏈的加持使
    的頭像 發(fā)表于 02-23 10:27 ?419次閱讀

    AT32 MCU與SEGGER攜手合作,開發(fā)量產(chǎn)事半功倍

    近日,與SEGGER共同宣布J-Link仿真調(diào)試器與Flasher在線燒錄器全面支持AT32MCU產(chǎn)品,SEGGER工具鏈的加持使AT32MC
    的頭像 發(fā)表于 02-22 08:13 ?484次閱讀
    <b class='flag-5'>雅</b><b class='flag-5'>特</b><b class='flag-5'>力</b><b class='flag-5'>AT32</b> <b class='flag-5'>MCU</b>與SEGGER攜手合作,開發(fā)量產(chǎn)事半功倍

    AT32F423時(shí)鐘配置

    介紹如何結(jié)合提供的V2.x.x的板級(jí)支持包(BSP)來配置時(shí)鐘。以下介紹時(shí)鐘配置的方法主要分兩種:1、以手動(dòng)編寫代碼調(diào)用BSP中提供的驅(qū)動(dòng)函數(shù)接口來進(jìn)行時(shí)鐘配
    的頭像 發(fā)表于 02-19 13:26 ?593次閱讀
    <b class='flag-5'>雅</b><b class='flag-5'>特</b><b class='flag-5'>力</b>AT32F423時(shí)鐘配置

    AT32 MCU HOGP開發(fā)指南

    。HID角色在HID中,以及在HOGP的延伸中,定義了兩個(gè)角色,這些角色是HID主機(jī)和HID設(shè)備。HID設(shè)備一次只能主動(dòng)連接到單個(gè)HID主機(jī);然而一個(gè)HID主機(jī)可以連接
    的頭像 發(fā)表于 12-30 08:14 ?661次閱讀
    <b class='flag-5'>雅</b><b class='flag-5'>特</b><b class='flag-5'>力</b><b class='flag-5'>AT32</b> <b class='flag-5'>MCU</b> HOGP開發(fā)指南