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

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

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

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

0739hhbb ? 來源:AT32 MCU 雅特力科技 ? 2023-02-22 10:09 ? 次閱讀

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)請(qǐng)求等接口。

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

  • USB硬件底層接口

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

  • USB/OTG外設(shè)

圖1. USB庫結(jié)構(gòu)f9323596-b216-11ed-bfe3-dac502259ad0.png ? ?

AT32 USB庫文件

如下是AT32 USB應(yīng)用工程結(jié)構(gòu)圖:圖2. AT32工程結(jié)構(gòu)f943cee6-b216-11ed-bfe3-dac502259ad0.pngCore Driver庫路徑:OTGFS-->middlewaresusb_driversUSBFS-->middlewaresusbd_driversDevice Class庫路徑:middlewaresusbd_class如下是USB庫文件列表:表1. USB庫文件列表f96d1f62-b216-11ed-bfe3-dac502259ad0.png表2. USB設(shè)備類型文件列表f9962538-b216-11ed-bfe3-dac502259ad0.png ?

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

USB庫實(shí)現(xiàn)USB設(shè)備標(biāo)準(zhǔn)請(qǐng)求,同時(shí)實(shí)現(xiàn)USB規(guī)格里面的4種傳輸類型(control,interrupt,bulk,isochronous)的函數(shù)接口。圖3.USB庫文件結(jié)構(gòu)f9d3e382-b216-11ed-bfe3-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ù)接口fa10aa7e-b216-11ed-bfe3-dac502259ad0.png ?usbd_core.c函數(shù)接口usbd_core.c此文件封裝不同的usb接口用于不同的地方調(diào)用,包括一些接收,發(fā)送函數(shù)等。表4.usbd_core函數(shù)接口fa2ac83c-b216-11ed-bfe3-dac502259ad0.png ?usbd_sdr.c函數(shù)接口usbd_sdr.c此文件處理USB一些標(biāo)準(zhǔn)請(qǐng)求。表5.usbd_sdr函數(shù)接口fa61a870-b216-11ed-bfe3-dac502259ad0.png支持的標(biāo)志設(shè)備請(qǐng)求如下表:表6. 標(biāo)準(zhǔn)設(shè)備請(qǐng)求fa719c94-b216-11ed-bfe3-dac502259ad0.png ?usbd_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)體fa9affb2-b216-11ed-bfe3-dac502259ad0.png表8.設(shè)備class函數(shù)接口fab19236-b216-11ed-bfe3-dac502259ad0.png ?usbd_xx_desc.c函數(shù)接口usbd_xx_desc.c此文件為設(shè)備描述文件,設(shè)備描述信息都通過此文件的函數(shù)接口返回給主機(jī)。表9.設(shè)備描述函數(shù)結(jié)構(gòu)體fad473f0-b216-11ed-bfe3-dac502259ad0.png表10.設(shè)備描述接口函數(shù)faefc38a-b216-11ed-bfe3-dac502259ad0.png ?其它參數(shù)函數(shù)的參數(shù)結(jié)構(gòu)體如下,USB設(shè)備庫中參數(shù)傳遞使用結(jié)構(gòu)體usbd_core_type,如下圖:圖4.全局結(jié)構(gòu)體fb273eb4-b216-11ed-bfe3-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)fb4eb944-b216-11ed-bfe3-dac502259ad0.pngUSB設(shè)備返回值,USB函數(shù)接口使用如下函數(shù)返回值。圖6.函數(shù)返回值fb64146a-b216-11ed-bfe3-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中對(duì)端點(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

    fb8f2ef2-b216-11ed-bfe3-dac502259ad0.png

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

    fbb7e18a-b216-11ed-bfe3-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:

    fbe61cee-b216-11ed-bfe3-dac502259ad0.png

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

    fc12f61a-b216-11ed-bfe3-dac502259ad0.png

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

USB設(shè)備初始化

在使用USB時(shí),需要對(duì)USB的寄存器做一些基本的初始化,通過調(diào)用USB的初始化函數(shù)完成這部分的操作,對(duì)于外設(shè)USBFS和OTGFS在初始化時(shí)所調(diào)用的函數(shù)一定的區(qū)別。 USBFS外設(shè)初始化USBFS初始化函數(shù)usbd_core_init包含5個(gè)參數(shù):fc7b6bc8-b216-11ed-bfe3-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ù):fc99ec24-b216-11ed-bfe3-dac502259ad0.png例程vcp_loopback的初始化如下:fcbd976e-b216-11ed-bfe3-dac502259ad0.png ?

USB設(shè)備中斷處理

USB中斷入口函數(shù)usbd_irq_handler處理所有USB中斷,包括Reset,端點(diǎn)收發(fā)數(shù)據(jù),SOF,掛起,喚醒等中斷,下面介紹一些典型的中斷處理。圖7.USB中斷處理函數(shù)fccdc5b2-b216-11ed-bfe3-dac502259ad0.png ?Reset中斷處理當(dāng)USB設(shè)備在總線上檢測(cè)到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)生對(duì)應(yīng)的端點(diǎn)完成中斷,端點(diǎn)完成中斷處理發(fā)送和接收的數(shù)據(jù)。中斷處理函數(shù):usbd_xeptx_handler SOF中斷處理打開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ù)包之后,對(duì)應(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ù)處理流程fcf323de-b216-11ed-bfe3-dac502259ad0.png圖9. Setup處理流程fd1a6c14-b216-11ed-bfe3-dac502259ad0.png ?USB控制端點(diǎn)枚舉流程當(dāng)設(shè)備接到主機(jī)之后,通過控制端點(diǎn)(端點(diǎn)0)進(jìn)行枚舉動(dòng)作,典型的枚舉流程圖如下:圖10.USB枚舉流程fd4835fe-b216-11ed-bfe3-dac502259ad0.pngUSB控制傳輸過程包含SETUP-DATA-STATUS三個(gè)階段,如下是一個(gè)主機(jī)獲取設(shè)備信息的傳輸過程GET_DESCRIPTOR:圖11 Get Descriptorfd6480b0-b216-11ed-bfe3-dac502259ad0.png如下是USB庫處理上圖Get Descriptor的流程:圖12. USB庫處理Get Descriptor調(diào)用流程fda5eec4-b216-11ed-bfe3-dac502259ad0.pngUSB設(shè)備請(qǐng)求格式(Setup請(qǐng)求)圖13.Setup請(qǐng)求格式fde1e91a-b216-11ed-bfe3-dac502259ad0.png ?USB應(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ù)處理fe194306-b216-11ed-bfe3-dac502259ad0.pngOUT端點(diǎn)數(shù)據(jù)處理:圖15.OUT端點(diǎn)數(shù)據(jù)處理fe3b6562-b216-11ed-bfe3-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ā)板信息請(qǐng)參考《UM_Audio Arduino Daughter Board_V1.0/V2.0》,Audio協(xié)議請(qǐng)參數(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: 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ī)的請(qǐng)求設(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)

    fe573706-b216-11ed-bfe3-dac502259ad0.png

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

    fe7439fa-b216-11ed-bfe3-dac502259ad0.png

2. 數(shù)據(jù)處理部分(audio_class.c/h audio_codec.c/h
  • 端點(diǎn)初始化(class_init_handler)

    fe9b5bc0-b216-11ed-bfe3-dac502259ad0.png

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

    feb2576c-b216-11ed-bfe3-dac502259ad0.png

  • Audio控制請(qǐng)求(class_setup_handler)

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

    fed7e536-b216-11ed-bfe3-dac502259ad0.png

    ff0152fe-b216-11ed-bfe3-dac502259ad0.png

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

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

    ff387b94-b216-11ed-bfe3-dac502259ad0.png

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

    ff659a34-b216-11ed-bfe3-dac502259ad0.png

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

    ff7e6014-b216-11ed-bfe3-dac502259ad0.png

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

    ff8f0e00-b216-11ed-bfe3-dac502259ad0.png

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

  • audio例程功能配置

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

    ffd80c04-b216-11ed-bfe3-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控制請(qǐng)求

    控制請(qǐng)求修改(class_setup_handler)

    控制請(qǐng)求設(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)了對(duì)設(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

    fff20f3c-b216-11ed-bfe3-dac502259ad0.png

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

    000a149c-b217-11ed-bfe3-dac502259ad0.png

2. 數(shù)據(jù)處理部分(custom_hid_class.c/h)
  • 端點(diǎn)初始化(class_init_handler)

    0031ae8a-b217-11ed-bfe3-dac502259ad0.png

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

    005768d2-b217-11ed-bfe3-dac502259ad0.png

  • HID設(shè)備類請(qǐng)求(class_setup_handler)

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

    SET_PROTOCOL

    GET_PROTOCOL

    SET_IDLE

    GET_IDLE

    SET_REPORT

    代碼如下:

    0082eae8-b217-11ed-bfe3-dac502259ad0.png

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

    00b64708-b217-11ed-bfe3-dac502259ad0.png

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

    00c4f190-b217-11ed-bfe3-dac502259ad0.png

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

    00d5c81c-b217-11ed-bfe3-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控制請(qǐng)求

    控制請(qǐng)求修改(class_setup_handler)

    控制請(qǐng)求設(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)了對(duì)設(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)

    00f4e530-b217-11ed-bfe3-dac502259ad0.png

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

    01087fdc-b217-11ed-bfe3-dac502259ad0.png

2. 數(shù)據(jù)處理部分(keyboard_class.c/h
  • 端點(diǎn)初始化(class_init_handler)

    013759d8-b217-11ed-bfe3-dac502259ad0.png

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

    0154ab78-b217-11ed-bfe3-dac502259ad0.png

  • HID設(shè)備類請(qǐng)求(class_setup_handler)

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

    SET_PROTOCOL

    GET_PROTOCOL

    SET_IDLE

    GET_IDLE

    SET_REPORT

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

    01751732-b217-11ed-bfe3-dac502259ad0.png

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

    018ed0e6-b217-11ed-bfe3-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控制請(qǐng)求

    控制請(qǐng)求修改(class_setup_handler)

    控制請(qǐng)求設(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)傳輸格式01ad4d0a-b217-11ed-bfe3-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)了對(duì)設(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)

    01e9ce9c-b217-11ed-bfe3-dac502259ad0.png

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

    02015c6a-b217-11ed-bfe3-dac502259ad0.png

2. 數(shù)據(jù)處理部分(mouse_class.c/h)
  • 端點(diǎn)初始化(class_init_handler)

    02221ab8-b217-11ed-bfe3-dac502259ad0.png

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

    024927c0-b217-11ed-bfe3-dac502259ad0.png

  • HID設(shè)備類請(qǐng)求(class_setup_handler)

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

    SET_PROTOCOL

    GET_PROTOCOL

    SET_IDLE

    GET_IDLE

    SET_REPORT

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

    0262cdba-b217-11ed-bfe3-dac502259ad0.png

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

    027719a0-b217-11ed-bfe3-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控制請(qǐng)求

    控制請(qǐng)求修改(class_setup_handler)

    控制請(qǐng)求設(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) 流程02aeb752-b217-11ed-bfe3-dac502259ad0.png圖18.BOT命令格式02d11d74-b217-11ed-bfe3-dac502259ad0.png圖19.BOT狀態(tài)格式02fa5a72-b217-11ed-bfe3-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)

    0311144c-b217-11ed-bfe3-dac502259ad0.png

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

    03333d60-b217-11ed-bfe3-dac502259ad0.png

2. 數(shù)據(jù)處理部分(msc_class.c/h)
  • 端點(diǎn)初始化(class_init_handler)

    0349afa0-b217-11ed-bfe3-dac502259ad0.png

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

    037224a8-b217-11ed-bfe3-dac502259ad0.png

  • MSC設(shè)備請(qǐng)求(class_setup_handler)

    GET_MAX_LUN

    BO_RESET

    代碼如下:

    039912d4-b217-11ed-bfe3-dac502259ad0.png

  • IN傳輸處理

    03c93900-b217-11ed-bfe3-dac502259ad0.png

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

    03e5fce8-b217-11ed-bfe3-dac502259ad0.png

3. BOT和SCSI命令處理Bulk-only transfer和SCSI的命令處理在庫文件msc_bot_scsi.c/h中。表11.msc_bot_scsi函數(shù)列表040a6fd8-b217-11ed-bfe3-dac502259ad0.png ?4. diskio處理此部分主要處理與存儲(chǔ)設(shè)備間接口,例程里面以內(nèi)部flash的存儲(chǔ)控制作為說明,msc_diskio.c/h根據(jù)開發(fā)者使用存儲(chǔ)不同,只需要實(shí)現(xiàn)對(duì)應(yīng)存儲(chǔ)的讀寫函數(shù)即可。表12.inquiry描述044256d2-b217-11ed-bfe3-dac502259ad0.png表13 diskio操作函數(shù)04617972-b217-11ed-bfe3-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控制請(qǐng)求

    控制請(qǐng)求修改(class_setup_handler)

    控制請(qǐng)求設(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)請(qǐng)求命令(例如打印機(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)

    04893b60-b217-11ed-bfe3-dac502259ad0.png

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

    04ac42e0-b217-11ed-bfe3-dac502259ad0.png

2. 數(shù)據(jù)處理(printer_class.c/h
  • 端點(diǎn)初始化(class_init_handler)

    04d8248c-b217-11ed-bfe3-dac502259ad0.png

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

    04fe3c30-b217-11ed-bfe3-dac502259ad0.png

  • printer設(shè)備請(qǐng)求(class_setup_handler)

    GET_DEVICE_ID

    PORT_STATUS

    SOFT_RESET

    代碼如下:

    051592e0-b217-11ed-bfe3-dac502259ad0.png

  • IN傳輸處理

    0530c466-b217-11ed-bfe3-dac502259ad0.png

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

    054ff750-b217-11ed-bfe3-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控制請(qǐng)求

    控制請(qǐng)求修改(class_setup_handler)

    控制請(qǐng)求設(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)

    056f8ade-b217-11ed-bfe3-dac502259ad0.png

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

    0596a916-b217-11ed-bfe3-dac502259ad0.png

2. 數(shù)據(jù)處理(cdc_class.c/h
  • 端點(diǎn)初始化(class_init_handler)

    05b8695c-b217-11ed-bfe3-dac502259ad0.png

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

    05e0ec92-b217-11ed-bfe3-dac502259ad0.png

  • cdc設(shè)備請(qǐng)求(class_setup_handler)

    SET_LINE_CODING

    GET_LINE_CODING

    代碼如下:

    06044ee4-b217-11ed-bfe3-dac502259ad0.png

  • IN傳輸處理

    062ca394-b217-11ed-bfe3-dac502259ad0.png

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

    06570bd4-b217-11ed-bfe3-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控制請(qǐng)求

    控制請(qǐng)求修改(class_setup_handler)

    控制請(qǐng)求設(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.1 2. 數(shù)據(jù)處理部分(msc_class.c/h參考3.5.3.2 3. BOTSCSI命令處理參考3.5.3.3 4. diskio處理參考3.5.3.4 5. flash升級(jí)部分(flash_fat16.c/h
  • 升級(jí)狀態(tài)

    0683b3c8-b217-11ed-bfe3-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ū)表描述

    06a93de6-b217-11ed-bfe3-dac502259ad0.png
  • 升級(jí)接口函數(shù)06f42540-b217-11ed-bfe3-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控制請(qǐng)求控制請(qǐng)求修改(class_setup_handler)控制請(qǐng)求設(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)071ba26e-b217-11ed-bfe3-dac502259ad0.png
  • 制造商、產(chǎn)品名、配置描述、接口描述(msc_desc.h)07318782-b217-11ed-bfe3-dac502259ad0.png
2. 數(shù)據(jù)處理(cdc_keyboard_class.c/h
  • 端點(diǎn)初始化(class_init_handler)07595ae6-b217-11ed-bfe3-dac502259ad0.png
  • 端點(diǎn)清除(class_clear_handler)077dc21e-b217-11ed-bfe3-dac502259ad0.png
  • 設(shè)備請(qǐng)求(class_setup_handler)cdc設(shè)備類請(qǐng)求:SET_LINE_CODINGGET_LINE_CODIN

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

    SET_PROTOCOLGET_PROTOCOLSET_IDLEGET_IDLESET_REPORT

    代碼如下:

    079b6a44-b217-11ed-bfe3-dac502259ad0.png
  • IN傳輸處理07cb4796-b217-11ed-bfe3-dac502259ad0.png
  • OUT傳輸處理(接收數(shù)據(jù))0808f5d2-b217-11ed-bfe3-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控制請(qǐng)求控制請(qǐng)求修改(class_setup_handler)控制請(qǐng)求設(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固件庫utilitiesat32f435_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)08321566-b217-11ed-bfe3-dac502259ad0.png
  • 制造商、產(chǎn)品名、配置描述、接口描述(hid_iap_desc.h)084e44e8-b217-11ed-bfe3-dac502259ad0.png
2. 數(shù)據(jù)處理(hid_iap_class.c/h
  • 端點(diǎn)初始化(class_init_handler)087c3c40-b217-11ed-bfe3-dac502259ad0.png
  • 端點(diǎn)清除(class_clear_handler)089e6f86-b217-11ed-bfe3-dac502259ad0.png
  • HID設(shè)備類請(qǐng)求(class_setup_handler)實(shí)現(xiàn)如下請(qǐng)求:SET_PROTOCOLGET_PROTOCOLSET_IDLEGET_IDLESET_REPORT代碼如下:08be20b0-b217-11ed-bfe3-dac502259ad0.png
  • hid iap發(fā)送數(shù)據(jù)08e60cec-b217-11ed-bfe3-dac502259ad0.png
  • hid iap接收數(shù)據(jù)0918b4f8-b217-11ed-bfe3-dac502259ad0.png
  • 升級(jí)命令數(shù)據(jù)處理 094243a4-b217-11ed-bfe3-dac502259ad0.png
3. hid iap升級(jí)協(xié)議表14.hid iap升級(jí)命令0976967c-b217-11ed-bfe3-dac502259ad0.png
  1. 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]

  2. 0x5AA1開始下載

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

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

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

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

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

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

  4. 0x5AA3下載數(shù)據(jù)命令(1KB 對(duì)齊多個(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]

  5. 0x5AA4下載結(jié)束

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

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

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

    上位機(jī)傳輸固件起始地址和固件大小/1KB(固件大小按1KB對(duì)齊,不足補(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]

  7. 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]

  8. 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控制請(qǐng)求控制請(qǐng)求修改(class_setup_handler)控制請(qǐng)求設(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的地址不要重合。
審核編輯:湯梓紅

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

    關(guān)注

    146

    文章

    16662

    瀏覽量

    347724
  • usb
    usb
    +關(guān)注

    關(guān)注

    60

    文章

    7771

    瀏覽量

    262351
  • 雅特力
    +關(guān)注

    關(guān)注

    0

    文章

    150

    瀏覽量

    7913
  • AT32
    +關(guān)注

    關(guān)注

    1

    文章

    109

    瀏覽量

    2015

原文標(biāo)題:AT32講堂046 | 雅特力AT32 MCU USB設(shè)備庫的架構(gòu)和使用方法

文章出處:【微信號(hào):AT32 MCU 雅特力科技,微信公眾號(hào):AT32 MCU 雅特力科技】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    AT32系列MCU上Flash模擬EEPRO的應(yīng)用原理和使用方法

    AN0002—AT32 MCU如何使用片上Flash來實(shí)現(xiàn)EEPROM功能當(dāng)前諸多嵌入式應(yīng)用場(chǎng)景都需要用到 EEPROM 作為非易失性的數(shù)據(jù)存儲(chǔ)設(shè)備。出于客戶低成本的考慮,AT32
    發(fā)表于 11-26 07:15

    AT32 MCU USB主機(jī)庫應(yīng)用說明

    AT32 MCU USB Host Library Application Note主要描述AT32F4xx 系列USB 主機(jī)庫的架構(gòu)
    發(fā)表于 10-25 07:02

    AT32 MCU USB設(shè)備應(yīng)用說明

    AT32 MCU USB Device Library Application Note主要描述AT32F4xx 系列USB 設(shè)備
    發(fā)表于 10-25 07:07

    攜高效能AT32 MCU“芯”動(dòng)亮相ICCAD 2020

    高峰論壇,獲得了業(yè)界人士、廣大客戶及眾多媒體的廣泛關(guān)注。 (供圖,下同) 在同期舉辦的IP 與 IC 設(shè)計(jì)專題論壇上,
    的頭像 發(fā)表于 12-16 17:12 ?1963次閱讀

    攜高性能AT32 MCU精彩亮相全球MCU生態(tài)發(fā)展大會(huì)

    技術(shù)、邊緣AI、新興應(yīng)用和生態(tài)發(fā)展等熱門議題。 業(yè)務(wù)處長陳佳延在大會(huì)發(fā)表了題為“
    的頭像 發(fā)表于 08-30 10:04 ?4416次閱讀
    <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>精彩亮相全球<b class='flag-5'>MCU</b>生態(tài)發(fā)展大會(huì)

    如何使用AT32 MCU主機(jī)庫快速開發(fā)USB相關(guān)應(yīng)用

    這部分主要介紹AT32 USB主機(jī)庫的結(jié)構(gòu)和使用方法,AT32 USB支持全速和低速,不支持
    的頭像 發(fā)表于 01-14 10:56 ?1750次閱讀
    如何使用<b class='flag-5'>AT32</b> <b class='flag-5'>MCU</b>主機(jī)庫快速開發(fā)<b class='flag-5'>USB</b>相關(guān)應(yīng)用

    AT32 SPI

    AT32 SPI 科技AT32F415系
    發(fā)表于 03-30 10:44 ?415次閱讀

    攜高性能AT32 MCU精彩亮相D Forum 2021 微控制器論壇

    AT32高效能MCU平臺(tái)–持續(xù)布局多元化應(yīng)用市場(chǎng)”的主題演講。產(chǎn)品與行銷處長杜立博先生在演講中首先介紹了公司近幾年來取得的成績,
    的頭像 發(fā)表于 02-24 09:33 ?622次閱讀
    <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>精彩亮相D Forum 2021 微控制器論壇

    攜高性能AT32 MCU精彩亮相全球MCU生態(tài)發(fā)展大會(huì)

    技術(shù)、邊緣AI、新興應(yīng)用和生態(tài)發(fā)展等熱門議題。業(yè)務(wù)處長陳佳延在大會(huì)發(fā)表了題為“AT3
    的頭像 發(fā)表于 02-24 09:31 ?489次閱讀
    <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>精彩亮相全球<b class='flag-5'>MCU</b>生態(tài)發(fā)展大會(huì)

    AT32講堂046 | AT32 MCU USB設(shè)備架構(gòu)使用方法

    AT32USB設(shè)備協(xié)議這部分主要介紹AT32USB設(shè)備的結(jié)構(gòu)和
    的頭像 發(fā)表于 02-22 11:23 ?5675次閱讀
    <b class='flag-5'>AT32</b>講堂046 | <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> <b class='flag-5'>USB</b><b class='flag-5'>設(shè)備</b><b class='flag-5'>庫</b>的<b class='flag-5'>架構(gòu)</b>和<b class='flag-5'>使用方法</b>

    展臺(tái)首日速遞,AT32 MCU精彩亮相

    8月23日,elexcon2023深圳國際電子展在深圳會(huì)展中心(福田)正式拉開帷幕!攜AT32MCU精彩亮相,電機(jī)控制、工業(yè)控制、消費(fèi)&商務(wù)、電力&電源、智能家電及汽車電子等
    的頭像 發(fā)表于 08-24 08:17 ?537次閱讀
    <b class='flag-5'>雅</b><b class='flag-5'>特</b><b class='flag-5'>力</b>展臺(tái)首日速遞,<b class='flag-5'>AT32</b> <b class='flag-5'>MCU</b>精彩亮相

    如何使用AT32 MCU定時(shí)器進(jìn)行PWM輸入測(cè)試

    如何使用AT32 MCU定時(shí)器進(jìn)行PWM輸入測(cè)試
    的頭像 發(fā)表于 10-27 14:20 ?2045次閱讀
    如何使用<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>定時(shí)器進(jìn)行PWM輸入測(cè)試

    AT32 MCU Printf的功能使用方法

    AT32 MCU Printf的功能使用方法
    的頭像 發(fā)表于 10-27 09:27 ?833次閱讀
    <b class='flag-5'>AT32</b> <b class='flag-5'>MCU</b> Printf的功能<b class='flag-5'>使用方法</b>

    AT32 MCU實(shí)現(xiàn)高效電機(jī)驅(qū)動(dòng)控制與應(yīng)用

    發(fā)展。受邀出席此次會(huì)議,產(chǎn)品市場(chǎng)總監(jiān)林金海發(fā)表了題為“AT32
    的頭像 發(fā)表于 11-17 08:15 ?690次閱讀
    <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>實(shí)現(xiàn)高效電機(jī)驅(qū)動(dòng)控制與應(yīng)用

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

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