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)
AT32 USB庫文件
如下是AT32 USB應(yīng)用工程結(jié)構(gòu)圖:圖2. AT32工程結(jié)構(gòu)Core Driver庫路徑:OTGFS-->middlewares\usb_driversUSBFS-->middlewares\usbd_driversDevice Class庫路徑:middlewares\usbd_class如下是USB庫文件列表:表1. USB庫文件列表表2. USB設(shè)備類型文件列表
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)
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ù)接口usbd_core.c函數(shù)接口usbd_core.c此文件封裝不同的usb接口用于不同的地方調(diào)用,包括一些接收,發(fā)送函數(shù)等。表4.usbd_core函數(shù)接口usbd_sdr.c函數(shù)接口usbd_sdr.c此文件處理USB一些標(biāo)準(zhǔn)請求。表5.usbd_sdr函數(shù)接口支持的標(biāo)志設(shè)備請求如下表:表6. 標(biāo)準(zhǔn)設(shè)備請求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)體表8.設(shè)備class函數(shù)接口usbd_xx_desc.c函數(shù)接口usbd_xx_desc.c此文件為設(shè)備描述文件,設(shè)備描述信息都通過此文件的函數(shù)接口返回給主機(jī)。表9.設(shè)備描述函數(shù)結(jié)構(gòu)體表10.設(shè)備描述接口函數(shù)其它參數(shù)函數(shù)的參數(shù)結(jié)構(gòu)體如下,USB設(shè)備庫中參數(shù)傳遞使用結(jié)構(gòu)體usbd_core_type,如下圖:圖4.全局結(jié)構(gòu)體USB設(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)USB設(shè)備返回值,USB函數(shù)接口使用如下函數(shù)返回值。圖6.函數(shù)返回值
端點(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
audio_class.c:端點(diǎn)打開
- 自定義分配:
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:
cdc_class.c端點(diǎn)打開:
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例程為例:
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ù):例程vcp_loopback的初始化如下:usbd_core_init(&usb_core_dev, USB, &class_handler, &desc_handler, 0);OTGFS外設(shè)初始化OTGFS初始化函數(shù)usbd_init包含5個(gè)參數(shù):例程vcp_loopback的初始化如下:
USB設(shè)備中斷處理
USB中斷入口函數(shù)usbd_irq_handler處理所有USB中斷,包括Reset,端點(diǎn)收發(fā)數(shù)據(jù),SOF,掛起,喚醒等中斷,下面介紹一些典型的中斷處理。圖7.USB中斷處理函數(shù)Reset中斷處理當(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ù)處理流程圖9. Setup處理流程USB控制端點(diǎn)枚舉流程當(dāng)設(shè)備接到主機(jī)之后,通過控制端點(diǎn)(端點(diǎn)0)進(jìn)行枚舉動(dòng)作,典型的枚舉流程圖如下:圖10.USB枚舉流程USB控制傳輸過程包含SETUP-DATA-STATUS三個(gè)階段,如下是一個(gè)主機(jī)獲取設(shè)備信息的傳輸過程GET_DESCRIPTOR:圖11 Get Descriptor如下是USB庫處理上圖Get Descriptor的流程:圖12. USB庫處理Get Descriptor調(diào)用流程USB設(shè)備請求格式(Setup請求)圖13.Setup請求格式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ù)處理OUT端點(diǎn)數(shù)據(jù)處理:圖15.OUT端點(diǎn)數(shù)據(jù)處理
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)品名、配置描述、接口描述(audio_desc.h)
2. 數(shù)據(jù)處理部分(audio_class.c/h audio_codec.c/h)
端點(diǎn)初始化(class_init_handler)
端點(diǎn)清除(class_clear_handler)
Audio控制請求(class_setup_handler)
實(shí)現(xiàn)如下audio控制請求:
Audio音量、靜音、采樣率設(shè)置(class_ept0_rx_handler)
此函數(shù)用于接收完主機(jī)發(fā)送的設(shè)置數(shù)據(jù)之后進(jìn)行處理,包括設(shè)置音量,靜音,以及采樣率的設(shè)置。
Microphone和Feedback數(shù)據(jù)傳輸(class_in_handler)
Speaker數(shù)據(jù)接收(class_out_handler)
audio_codec.c中實(shí)現(xiàn)codec具體的控制以及數(shù)據(jù)處理,需要實(shí)現(xiàn)如下函數(shù):
以上函數(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)配置:
如何根據(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
制造商、產(chǎn)品名、配置描述、接口描述(custom_hid_desc.h)
2. 數(shù)據(jù)處理部分(custom_hid_class.c/h)
端點(diǎn)初始化(class_init_handler)
端點(diǎn)清除(class_clear_handler)
HID設(shè)備類請求(class_setup_handler)
實(shí)現(xiàn)如下請求:
SET_PROTOCOL
GET_PROTOCOL
SET_IDLE
GET_IDLE
SET_REPORT
代碼如下:
Custom_HID發(fā)送數(shù)據(jù)
Custom_HID接收數(shù)據(jù)
數(shù)據(jù)處理
如何根據(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)
制造商、產(chǎn)品名、配置描述、接口描述(keyboard_desc.h)
2. 數(shù)據(jù)處理部分(keyboard_class.c/h)
端點(diǎn)初始化(class_init_handler)
端點(diǎn)清除(class_clear_handler)
HID設(shè)備類請求(class_setup_handler)
實(shí)現(xiàn)如下請求:
SET_PROTOCOL
GET_PROTOCOL
SET_IDLE
GET_IDLE
SET_REPORT
keyboard發(fā)送數(shù)據(jù)
keyboard字符數(shù)據(jù)處理
如何根據(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)傳輸格式鼠標(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)
制造商、產(chǎn)品名、配置描述、接口描述(keyboard_desc.h)
2. 數(shù)據(jù)處理部分(mouse_class.c/h)
端點(diǎn)初始化(class_init_handler)
端點(diǎn)清除(class_clear_handler)
HID設(shè)備類請求(class_setup_handler)
實(shí)現(xiàn)如下請求:
SET_PROTOCOL
GET_PROTOCOL
SET_IDLE
GET_IDLE
SET_REPORT
keyboard發(fā)送數(shù)據(jù)
mouse數(shù)據(jù)處理
如何根據(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) 流程圖18.BOT命令格式圖19.BOT狀態(tài)格式實(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)
制造商、產(chǎn)品名、配置描述、接口描述(msc_desc.h)
2. 數(shù)據(jù)處理部分(msc_class.c/h)
端點(diǎn)初始化(class_init_handler)
端點(diǎn)清除(class_clear_handler)
MSC設(shè)備請求(class_setup_handler)
GET_MAX_LUN
BO_RESET
代碼如下:
IN傳輸處理
OUT傳輸處理(接收數(shù)據(jù))
3. BOT和SCSI命令處理Bulk-only transfer和SCSI的命令處理在庫文件msc_bot_scsi.c/h中。表11.msc_bot_scsi函數(shù)列表4. diskio處理此部分主要處理與存儲(chǔ)設(shè)備間接口,例程里面以內(nèi)部flash的存儲(chǔ)控制作為說明,msc_diskio.c/h根據(jù)開發(fā)者使用存儲(chǔ)不同,只需要實(shí)現(xiàn)對應(yīng)存儲(chǔ)的讀寫函數(shù)即可。表12.inquiry描述表13 diskio操作函數(shù)如何根據(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)
制造商、產(chǎn)品名、配置描述、接口描述(msc_desc.h)
2. 數(shù)據(jù)處理(printer_class.c/h)
端點(diǎn)初始化(class_init_handler)
端點(diǎn)清除(class_clear_handler)
printer設(shè)備請求(class_setup_handler)
GET_DEVICE_ID
PORT_STATUS
SOFT_RESET
代碼如下:
IN傳輸處理
OUT傳輸處理(接收數(shù)據(jù))
如何根據(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)
制造商、產(chǎn)品名、配置描述、接口描述(msc_desc.h)
2. 數(shù)據(jù)處理(cdc_class.c/h)
端點(diǎn)初始化(class_init_handler)
端點(diǎn)清除(class_clear_handler)
cdc設(shè)備請求(class_setup_handler)
SET_LINE_CODING
GET_LINE_CODING
代碼如下:
IN傳輸處理
OUT傳輸處理(接收數(shù)據(jù))
如何根據(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)
當(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ū)表描述
- 升級(jí)接口函數(shù)
如何根據(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)
- 制造商、產(chǎn)品名、配置描述、接口描述(msc_desc.h)
2. 數(shù)據(jù)處理(cdc_keyboard_class.c/h)
- 端點(diǎn)初始化(class_init_handler)
- 端點(diǎn)清除(class_clear_handler)
- 設(shè)備請求(class_setup_handler)cdc設(shè)備類請求:SET_LINE_CODINGGET_LINE_CODIN
Keyboard hid設(shè)備類請求:
- SET_PROTOCOLGET_PROTOCOLSET_IDLEGET_IDLESET_REPORT
代碼如下:
- IN傳輸處理
- OUT傳輸處理(接收數(shù)據(jù))
如何根據(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)
- 制造商、產(chǎn)品名、配置描述、接口描述(hid_iap_desc.h)
2. 數(shù)據(jù)處理(hid_iap_class.c/h)
- 端點(diǎn)初始化(class_init_handler)
- 端點(diǎn)清除(class_clear_handler)
- HID設(shè)備類請求(class_setup_handler)實(shí)現(xiàn)如下請求:SET_PROTOCOLGET_PROTOCOLSET_IDLEGET_IDLESET_REPORT代碼如下:
- hid iap發(fā)送數(shù)據(jù)
- hid iap接收數(shù)據(jù)
- 升級(jí)命令數(shù)據(jù)處理
3. hid iap升級(jí)協(xié)議表14.hid iap升級(jí)命令
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)域。
-
mcu
+關(guān)注
關(guān)注
146文章
17148瀏覽量
351195 -
AT32
+關(guān)注
關(guān)注
1文章
113瀏覽量
2102
發(fā)布評(píng)論請先 登錄
相關(guān)推薦
評(píng)論