AT32 USB設備協(xié)議庫
這部分主要介紹AT32 USB設備庫的結構和庫的使用方法,AT32 USB是基于USB2.0全速設備,不支持USB2.0高速設備。這里庫的作用是用來管理USB外設和實現USB的基本協(xié)議,使開發(fā)者能夠更快的上手開發(fā)。USB Deivce庫包含以下幾個模塊如圖1:- 
						用戶應用程序 此部分為開發(fā)者根據應用具體需求開發(fā)應用程序。 
- 
						USB Core Driver和USB設備類 USB Core Driver:此部分實現USB設備標準協(xié)議棧,標準請求等接口。 USB設備類:此部分實現一個具體USB設備的描述和設備請求。 
- 
						USB硬件底層接口 此部分實現硬件寄存器抽象接口 
- 
						USB/OTG外設 
 ?
					?
					?
					?AT32 USB庫文件
如下是AT32 USB應用工程結構圖:圖2. AT32工程結構 Core Driver庫路徑:OTGFS-->middlewaresusb_driversUSBFS-->middlewaresusbd_driversDevice Class庫路徑:middlewaresusbd_class如下是USB庫文件列表:表1. USB庫文件列表
Core Driver庫路徑:OTGFS-->middlewaresusb_driversUSBFS-->middlewaresusbd_driversDevice Class庫路徑:middlewaresusbd_class如下是USB庫文件列表:表1. USB庫文件列表 表2. USB設備類型文件列表
表2. USB設備類型文件列表 ?
					?USB設備庫文件說明
USB庫實現USB設備標準請求,同時實現USB規(guī)格里面的4種傳輸類型(control,interrupt,bulk,isochronous)的函數接口。圖3.USB庫文件結構 ?
					?USB設備文件函數接口
usbd_int.c函數接口usbd_int.c主要處理底層中斷,不同USB外設,此部分會根據外設不同而有所改變。AT32系列芯片USB外設存在USBFS和OTGFS兩種外設,此部分函數接口基本相同。表3.usbd_int函數接口 ?usbd_core.c函數接口usbd_core.c此文件封裝不同的usb接口用于不同的地方調用,包括一些接收,發(fā)送函數等。表4.usbd_core函數接口
					?usbd_core.c函數接口usbd_core.c此文件封裝不同的usb接口用于不同的地方調用,包括一些接收,發(fā)送函數等。表4.usbd_core函數接口 ?usbd_sdr.c函數接口usbd_sdr.c此文件處理USB一些標準請求。表5.usbd_sdr函數接口
					?usbd_sdr.c函數接口usbd_sdr.c此文件處理USB一些標準請求。表5.usbd_sdr函數接口 支持的標志設備請求如下表:表6. 標準設備請求
支持的標志設備請求如下表:表6. 標準設備請求 ?usbd_xx_class.c函數接口usbd_xx_class.c 此文件為具體設備類型的數據處理,通過結構體函數來實現不同設備類型數據的處理。開發(fā)者根據不同的設備類型,來實現下面函數結構體中的函數,達到不同應用結果。函數結構體如下:表7.設備class函數結構體
					?usbd_xx_class.c函數接口usbd_xx_class.c 此文件為具體設備類型的數據處理,通過結構體函數來實現不同設備類型數據的處理。開發(fā)者根據不同的設備類型,來實現下面函數結構體中的函數,達到不同應用結果。函數結構體如下:表7.設備class函數結構體 表8.設備class函數接口
表8.設備class函數接口 ?usbd_xx_desc.c函數接口usbd_xx_desc.c此文件為設備描述文件,設備描述信息都通過此文件的函數接口返回給主機。表9.設備描述函數結構體
					?usbd_xx_desc.c函數接口usbd_xx_desc.c此文件為設備描述文件,設備描述信息都通過此文件的函數接口返回給主機。表9.設備描述函數結構體 表10.設備描述接口函數
表10.設備描述接口函數 ?其它參數函數的參數結構體如下,USB設備庫中參數傳遞使用結構體usbd_core_type,如下圖:圖4.全局結構體
					?其它參數函數的參數結構體如下,USB設備庫中參數傳遞使用結構體usbd_core_type,如下圖:圖4.全局結構體 USB設備的連接狀態(tài)如下圖:連接狀態(tài)包含:
USB設備的連接狀態(tài)如下圖:連接狀態(tài)包含:- 
						默認狀態(tài) 
- 
						地址狀態(tài) 
- 
						配置狀態(tài) 
- 
						掛起狀態(tài) 
 USB設備返回值,USB函數接口使用如下函數返回值。圖6.函數返回值
USB設備返回值,USB函數接口使用如下函數返回值。圖6.函數返回值 ?
					?端點FIFO分配
USB要正常收發(fā)數據,在初始化時需要為每個端點分配發(fā)送/接收的FIFO,FIFO的大小可以根據端點上傳輸的最大包長度確認。注意,分配給所有端點FIFO大小的和不能超過系統(tǒng)分配給USB緩沖區(qū)的最大長度,具體USB的緩沖區(qū)大小參考RM上的描述。開發(fā)者可以參考例程usb_conf.h為每個端點自定義分配FIFO。另外使用USBFS和OTGFS兩種不同的外設時,usb_conf.h中對端點FIFO分配稍有不同。 USBFS外設端點FIFO分配USBFS外設端點分配實現了兩種分配方式,一種自動分配,一種是用戶自定義分配。- 
						自動分配:1. 通過打開usb_conf.h中USB_EPT_AUTO_MALLOC_BUFFER宏開啟自動分配功能 2. 在調用打開端點函數(usbd_ept_open)時自動根據傳入的最大包長度自動分配FIFO 3. 如果使用雙緩沖模式(同步端點,雙緩沖Bulk)時,在打開端點前先調用(usbd_ept_dbuffer_enable)表示使用雙緩沖模式,可參考audio例程。 4. 自動分配audio例程配置如下: usb_conf.h  audio_class.c:端點打開  
- 
						自定義分配:1. 關閉usb_conf.h中USB_EPT_AUTO_MALLOC_BUFFER宏開啟自定義分配 2. 在調用打開端點函數(usbd_ept_open)時調用usbd_ept_buf_custom_define函數自定義為端點分配FIFO,參考vcp_loopback例程。 3. vcp_loopback例程自定義分配配置 usb_conf.h:  cdc_class.c端點打開:  
 ?
					?USB設備初始化
在使用USB時,需要對USB的寄存器做一些基本的初始化,通過調用USB的初始化函數完成這部分的操作,對于外設USBFS和OTGFS在初始化時所調用的函數一定的區(qū)別。 USBFS外設初始化USBFS初始化函數usbd_core_init包含5個參數: 例程vcp_loopback的初始化如下:usbd_core_init(&usb_core_dev, USB, &class_handler, &desc_handler, 0);
					OTGFS外設初始化OTGFS初始化函數usbd_init包含5個參數:
例程vcp_loopback的初始化如下:usbd_core_init(&usb_core_dev, USB, &class_handler, &desc_handler, 0);
					OTGFS外設初始化OTGFS初始化函數usbd_init包含5個參數: 例程vcp_loopback的初始化如下:
例程vcp_loopback的初始化如下: ?
					?USB設備中斷處理
USB中斷入口函數usbd_irq_handler處理所有USB中斷,包括Reset,端點收發(fā)數據,SOF,掛起,喚醒等中斷,下面介紹一些典型的中斷處理。圖7.USB中斷處理函數 ?Reset中斷處理當USB設備在總線上檢測到Reset信號時,將產生Reset中斷。軟件在收到Reset中斷時,需要做基本的初始化,用于后面的枚舉處理。Reset中斷處理函數usbd_reset_handler:
					?Reset中斷處理當USB設備在總線上檢測到Reset信號時,將產生Reset中斷。軟件在收到Reset中斷時,需要做基本的初始化,用于后面的枚舉處理。Reset中斷處理函數usbd_reset_handler:- 
						端點FIFO初始化 
- 
						設備地址設置為0 
- 
						端點0初始化 
- 
						調用設備類的事件函數 udev->class_handler->event_handler(udev, USBD_RESET_EVENT); 
- 
						中斷處理函數會調用設備類的SOF處理函數 udev->class_handler->sof_handler(udev); 
- 
						連接狀態(tài)設置為掛起狀態(tài) 
- 
						設置設備進入掛起狀態(tài) 
- 
						調用設備類的事件處理函數 udev->class_handler->event_handler(udev, USBD_SUSPEND_EVENT); 
- 
						設備退出掛起狀態(tài) 
- 
						連接狀態(tài)設置為進入掛起之前的狀態(tài) 
- 
						調用設備類事件處理函數 udev->class_handler->event_handler(udev, USBD_WAKEUP_EVENT); 
USB設備端點數據處理流程
USB設備在收到主機發(fā)送的數據包之后,對應端點0的數據(IN/OUT/SETUP)會做單獨處理,其它端點的數據會調用設備類的IN/OUT handler進行數據處理。如下圖所示數據的處理過程:圖8.端點數據處理流程 圖9. Setup處理流程
圖9. Setup處理流程 ?USB控制端點枚舉流程當設備接到主機之后,通過控制端點(端點0)進行枚舉動作,典型的枚舉流程圖如下:圖10.USB枚舉流程
					?USB控制端點枚舉流程當設備接到主機之后,通過控制端點(端點0)進行枚舉動作,典型的枚舉流程圖如下:圖10.USB枚舉流程 USB控制傳輸過程包含SETUP-DATA-STATUS三個階段,如下是一個主機獲取設備信息的傳輸過程GET_DESCRIPTOR:圖11 Get Descriptor
USB控制傳輸過程包含SETUP-DATA-STATUS三個階段,如下是一個主機獲取設備信息的傳輸過程GET_DESCRIPTOR:圖11 Get Descriptor 如下是USB庫處理上圖Get Descriptor的流程:圖12. USB庫處理Get Descriptor調用流程
如下是USB庫處理上圖Get Descriptor的流程:圖12. USB庫處理Get Descriptor調用流程 USB設備請求格式(Setup請求)圖13.Setup請求格式
USB設備請求格式(Setup請求)圖13.Setup請求格式 ?USB應用端點處理流程應用端點指客戶實際應用使用到的非0端點,包括Bulk,interrupt,ISO等端點類型,這些端點的數據通回調函數in_handler和out_handler進行處理。開發(fā)者只需要在xxx_class.c中class_in_handler和class_out_handler里面實現具體端點的數據處理即可。IN端點數據處理:圖14.IN端點數據處理
					?USB應用端點處理流程應用端點指客戶實際應用使用到的非0端點,包括Bulk,interrupt,ISO等端點類型,這些端點的數據通回調函數in_handler和out_handler進行處理。開發(fā)者只需要在xxx_class.c中class_in_handler和class_out_handler里面實現具體端點的數據處理即可。IN端點數據處理:圖14.IN端點數據處理 OUT端點數據處理:圖15.OUT端點數據處理
OUT端點數據處理:圖15.OUT端點數據處理 ?
					?USB設備類型例程
本章將說明使用AT32 USB設備庫實現不同的設備類型的例程。目前實現的設備例程如下:- 
						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é)議實現一個Speaker和Microphone,傳輸Audio數據使用同步傳輸,Speaker使用同步OUT傳輸,Microphone使用同步IN傳輸。Audio的例程運行在AT-START評估板上,Audio Speaker和Mircophone是基于Audio Arduino Demo Board進行實現,實驗過程中需要連接AT-START和Audio Arduino Board,更多開發(fā)板信息請參考《UM_Audio Arduino Daughter Board_V1.0/V2.0》,Audio協(xié)議請參數《Universal Serial Bus Device Class Define for Audio Device V1.0》。 實現功能實現一個Speaker和Microphone的Audio復合設備,可以同時進行音頻播放和錄音。Speaker功能:- 
						支持16K,48K采樣率 
- 
						支持采樣率切換 
- 
						支持16bit采樣 
- 
						支持靜音 
- 
						支持音量調節(jié) 
- 
						支持feedback功能 
- 
						支持雙通道 
- 
						支持16K,48K采樣率 
- 
						支持采樣率切換 
- 
						支持16bit采樣 
- 
						支持靜音 
- 
						支持音量調節(jié) 
- 
						支持雙通道 
- 
						端點0 IN/OUT:用于USB枚舉以及Audio部分控制。 
- 
						端點1 IN:用于Microphone錄音數據 
- 
						端點1 OUT:用于Speaker播放數據 
- 
						端點2 IN:用于Feedback數據 
- 
						使用I2C發(fā)送控制信息到音頻Board 
- 
						使用I2S1發(fā)送數據到音頻board(speaker) 
- 
						使用I2S2從音頻board接收數據(microphone) 
- 
						使用DMA1通道3傳輸I2S1的數據 
- 
						使用DMA1通道4傳輸I2S2的數據 
- 
						使用TIMER產生Codec所需要的時鐘 
- 
						Audio設備的描述(g_usbd_descriptor) 
- 
						Audio設備的配置描述信息(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) 
- 
						序列號(g_string_serial) 
- 
						廠商產品ID(audio_desc.h)  
- 
						制造商、產品名、配置描述、接口描述(audio_desc.h)  
- 
						端點初始化(class_init_handler)  
- 
						端點清除(class_clear_handler)  
- 
						Audio控制請求(class_setup_handler) 實現如下audio控制請求:   
- 
						Audio音量、靜音、采樣率設置(class_ept0_rx_handler) 此函數用于接收完主機發(fā)送的設置數據之后進行處理,包括設置音量,靜音,以及采樣率的設置。  
- 
						Microphone和Feedback數據傳輸(class_in_handler)  
- 
						Speaker數據接收(class_out_handler)  
- 
						audio_codec.c中實現codec具體的控制以及數據處理,需要實現如下函數:  以上函數可根據例程里的方式進行實現,也可以根據開發(fā)者實際使用的codec來進行修改,對于codec的初始化部分,在這里將不再講述。 
- 
						audio例程功能配置 audio_conf.h中可以對當前audio例程進行配置,例如:是否需要speaker功能,支持采樣率等,有如下選項配置:  
- 
						根據功能需求修改audio配置(audio_conf.h) 
- 
						根據功能需求修改設備描述信息(audio_desc.c, audio_desc.h) 設備描述信息(g_usbd_descriptor) 設備配置描述信息(g_usbd_configuration) 其它描述 
- 
						根據功能修改要使用端點(audio_class.c, audio_class.h) 端點定義(audio_class.h) 端點初始化(class_init_handler,class_clear_handler) 
- 
						修改使用的Audio控制請求 控制請求修改(class_setup_handler) 控制請求設置處理(class_ept0_rx_handler) 
- 
						Audio數據處理修改 IN數據處理(class_in_handler) OUT數據處理(class_out_handler) 
- 
						根據需求修改端點FIFO大小分配(usb_conf.h) 
- 
						根據具體需求實現codec函數接口(audio_codec.c) 
custom_hid例程
custom_hid實現一個HID(human interface device)功能,與上位機(Artery_UsbHid_Demo)通信完成一些簡單的交互操作,HID使用中斷傳輸與上位機通信,例程在AT-START開發(fā)板上運行,上位機可在官網下載,關于HID協(xié)議參考《Human Interface Devices (HID) V1.11》。 實現功能- 
						上位機顯示按鍵狀態(tài) 
- 
						通過上位機控制開發(fā)板LED等開關狀態(tài) 
- 
						HID數據回環(huán)功能 
- 
						端點0 IN/OUT:用于USB枚舉 
- 
						端點1 IN:用于數據發(fā)送 
- 
						端點1 OUT:用于數據接收 
- 
						custom hid設備描述(g_usbd_descriptor) 
- 
						custom hid設備配置描述(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) 
- 
						序列號(g_string_serial) 
- 
						廠商產品ID(custom_hid_desc.h  
- 
						制造商、產品名、配置描述、接口描述(custom_hid_desc.h)  
- 
						端點初始化(class_init_handler)  
- 
						端點清除(class_clear_handler)  
- 
						HID設備類請求(class_setup_handler) 實現如下請求: SET_PROTOCOL GET_PROTOCOL SET_IDLE GET_IDLE SET_REPORT 代碼如下:  
- 
						Custom_HID發(fā)送數據  
- 
						Custom_HID接收數據  
- 
						數據處理  
- 
						根據功能需求修改設備描述信息(custom_hid_desc.c, custom_hid_desc.h) 設備描述信息(g_usbd_descriptor) 設備配置描述信息(g_usbd_configuration) 設備報告描述符(g_usbd_hid_report) 其它描述 
- 
						根據功能修改要使用端點(custom_hid_class.c, custom_hid_class.h) 端點定義(custom_hid_class.h) 端點初始化(class_init_handler,class_clear_handler) 
- 
						修改使用的custom_hid控制請求 控制請求修改(class_setup_handler) 控制請求設置處理(class_ept0_rx_handler) 
- 
						custom_hid發(fā)送接收數據處理修改 IN數據處理(class_in_handler) OUT數據處理(class_out_handler) 
- 
						根據需求修改端點FIFO大小分配(usb_conf.h) 
- 
						修改數據處理部分 
keyboard例程
keyboard實現一個鍵盤功能,使用中斷傳輸與上位機通信,例程在AT-START開發(fā)板上運行,通過按鍵發(fā)送字符串到主機。 實現功能- 
						通過按鍵發(fā)送字符串(”Keyboard Demo”)到主機 
- 
						端點0 IN/OUT:用于USB枚舉 
- 
						端點1 IN:用于數據發(fā)送 
- 
						keyboard設備描述(g_usbd_descriptor) 
- 
						keyboard設備配置描述(g_usbd_configuration) keyboard interface keyboard endpoint 
- 
						keyboard report描述(g_usbd_hid_report) 
- 
						Lang id(g_string_lang_id) 
- 
						序列號(g_string_serial) 
- 
						廠商產品ID(keyboard_desc.h)  
- 
						制造商、產品名、配置描述、接口描述(keyboard_desc.h)  
- 
						端點初始化(class_init_handler)  
- 
						端點清除(class_clear_handler)  
- 
						HID設備類請求(class_setup_handler) 實現如下請求: SET_PROTOCOL GET_PROTOCOL SET_IDLE GET_IDLE SET_REPORT 
- 
						keyboard發(fā)送數據  
- 
						keyboard字符數據處理  
- 
						根據功能需求修改設備描述信息(keyboard_desc.c, keyboard_desc.h) 設備描述信息(g_usbd_descriptor) 設備配置描述信息(g_usbd_configuration) 設備報告描述符(g_usbd_hid_report) 其它描述 
- 
						根據功能修改要使用端點(keyboard_class.c, keyboard_class.h) 端點定義(keyboard_class.h) 端點初始化(class_init_handler,class_clear_handler) 
- 
						修改使用的keyboard控制請求 控制請求修改(class_setup_handler) 控制請求設置處理(class_ept0_rx_handler) 
- 
						keyboard發(fā)送接收數據處理修改 IN數據處理(class_in_handler) OUT數據處理(class_out_handler) 
- 
						根據需求修改端點FIFO大小分配(usb_conf.h) 
- 
						修改數據處理部分 
Mouse例程
實現功能mouse實現一個簡單的鼠標功能,使用中斷傳輸與上位機通信,例程在AT-START開發(fā)板上運行,通過開發(fā)板上的按鍵發(fā)送鼠標右鍵功能。圖16.鼠標傳輸格式 鼠標d通常是通過設置X和Y值來控制PC鼠標移動。
					外設資源使用USB外設:
鼠標d通常是通過設置X和Y值來控制PC鼠標移動。
					外設資源使用USB外設:- 
						端點0 IN/OUT:用于USB枚舉 
- 
						端點1 IN:用于數據發(fā)送 
- 
						mouse設備描述(g_usbd_descriptor) 
- 
						mouse設備配置描述(g_usbd_configuration) mouseinterface mouseendpoint 
- 
						mouse report描述(g_usbd_hid_report) 
- 
						Lang id(g_string_lang_id) 
- 
						序列號(g_string_serial) 
- 
						廠商產品ID(mouse_desc.h)  
- 
						制造商、產品名、配置描述、接口描述(keyboard_desc.h)  
- 
						端點初始化(class_init_handler)  
- 
						端點清除(class_clear_handler)  
- 
						HID設備類請求(class_setup_handler) 實現如下請求: SET_PROTOCOL GET_PROTOCOL SET_IDLE GET_IDLE SET_REPORT 
- 
						keyboard發(fā)送數據  
- 
						mouse數據處理  
- 
						根據功能需求修改設備描述信息(mouse_desc.c, mouse_desc.h) 設備描述信息(g_usbd_descriptor) 設備配置描述信息(g_usbd_configuration) 設備報告描述符(g_usbd_hid_report) 其它描述 
- 
						根據功能修改要使用端點(mouse_class.c, mouse_class.h) 端點定義(mouse_class.h) 端點初始化(class_init_handler,class_clear_handler) 
- 
						修改使用的mouse控制請求 控制請求修改(class_setup_handler) 控制請求設置處理(class_ept0_rx_handler) 
- 
						mouse發(fā)送接收數據處理修改 IN數據處理(class_in_handler) OUT數據處理(class_out_handler) 
- 
						根據需求修改端點FIFO大小分配(usb_conf.h) 
- 
						修改數據處理部分 
msc例程
msc(mass storage)例程展示如何通過USB BULK傳輸,進行PC主機和AT-START通信,該例程支持BOT(Bulk only transfer)協(xié)議和SCSI(small computer system interface)指令。圖17. BOT 命令/數據/狀態(tài) 流程 圖18.BOT命令格式
圖18.BOT命令格式 圖19.BOT狀態(tài)格式
圖19.BOT狀態(tài)格式 ?實現功能
					?實現功能- 
						將內部FLASH虛擬成一個磁盤 
- 
						實現bulk-only傳輸協(xié)議 
- 
						實現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 
- 
						端點0 IN/OUT:用于USB枚舉 
- 
						端點1 IN:用于數據發(fā)送 
- 
						端點1 OUT:用于數據接收 
- 
						msc設備描述(g_usbd_descriptor) 
- 
						msc設備配置描述(g_usbd_configuration) msc interface msc endpoint 
- 
						Lang id(g_string_lang_id) 
- 
						序列號(g_string_serial) 
- 
						廠商產品ID(custom_hid_desc.h)  
- 
						制造商、產品名、配置描述、接口描述(msc_desc.h)  
- 
						端點初始化(class_init_handler)  
- 
						端點清除(class_clear_handler)  
- 
						MSC設備請求(class_setup_handler) GET_MAX_LUN BO_RESET 代碼如下:  
- 
						IN傳輸處理  
- 
						OUT傳輸處理(接收數據)  
 ?4. diskio處理此部分主要處理與存儲設備間接口,例程里面以內部flash的存儲控制作為說明,msc_diskio.c/h根據開發(fā)者使用存儲不同,只需要實現對應存儲的讀寫函數即可。表12.inquiry描述
					?4. diskio處理此部分主要處理與存儲設備間接口,例程里面以內部flash的存儲控制作為說明,msc_diskio.c/h根據開發(fā)者使用存儲不同,只需要實現對應存儲的讀寫函數即可。表12.inquiry描述 表13 diskio操作函數
表13 diskio操作函數 ?如何根據msc例程進行開發(fā)本章將簡單描述如何修改msc例程的代碼來進行開發(fā),根據應用具體的需求來修改代碼。
					?如何根據msc例程進行開發(fā)本章將簡單描述如何修改msc例程的代碼來進行開發(fā),根據應用具體的需求來修改代碼。- 
						根據功能需求修改設備描述信息(msc_desc.c, msc_desc.h) 設備描述信息(g_usbd_descriptor) 設備配置描述信息(g_usbd_configuration) 其它描述 
- 
						根據功能修改要使用端點(msc_class.c, msc_class.h) 端點定義(msc_class.h) 端點初始化(class_init_handler,class_clear_handler) 
- 
						修改使用的msc控制請求 控制請求修改(class_setup_handler) 控制請求設置處理(class_ept0_rx_handler) 
- 
						msc發(fā)送接收數據處理修改 IN數據處理(class_in_handler) OUT數據處理(class_out_handler) 
- 
						根據需求修改端點FIFO大小分配(usb_conf.h) 
- 
						修改diskio部分,實現表13里面的函數(msc_diskio.c/h) 
printer例程
Printer例程展示了使用USB Device作為打印機設備,此demo可在PC端識別到一個打印機設備并且可應答PC端發(fā)送的關于printer類的狀態(tài)請求命令(例如打印機的有紙/無紙狀態(tài)) 實現功能- 
						實現一個打印機設備 
- 
						端點0 IN/OUT:用于USB枚舉 
- 
						端點1 IN:用于數據發(fā)送 
- 
						端點1 OUT:用于數據接收 
- 
						printer設備描述(g_usbd_descriptor) 
- 
						printer設備配置描述(g_usbd_configuration) printer interface printer endpoint 
- 
						Lang id(g_string_lang_id) 
- 
						序列號(g_string_serial) 
- 
						廠商產品ID(custom_hid_desc.h)  
- 
						制造商、產品名、配置描述、接口描述(msc_desc.h)  
- 
						端點初始化(class_init_handler)  
- 
						端點清除(class_clear_handler)  
- 
						printer設備請求(class_setup_handler) GET_DEVICE_ID PORT_STATUS SOFT_RESET 代碼如下:  
- 
						IN傳輸處理  
- 
						OUT傳輸處理(接收數據)  
- 
						根據功能需求修改設備描述信息(printer_desc.c, printer_desc.h) 設備描述信息(g_usbd_descriptor) 設備配置描述信息(g_usbd_configuration) 其它描述 
- 
						根據功能修改要使用端點(printer_class.c, printer_class.h) 端點定義(printer_class.h) 端點初始化(class_init_handler,class_clear_handler) 
- 
						修改使用的printer控制請求 控制請求修改(class_setup_handler) 控制請求設置處理(class_ept0_rx_handler) 
- 
						printer發(fā)送接收數據處理修改 IN數據處理(class_in_handler) OUT數據處理(class_out_handler) 
- 
						根據需求修改端點FIFO大小分配(usb_conf.h) 
vcp loopback例程
在現代PC中,USB是和絕大部分外設通信的標準接口。盡管如此,大部分的工業(yè)軟件依舊使用COM接口(UART)通信。vcp_loopback例程提供使用USB設備模擬COM接口方法,解決了該問題, vcp_loopback例程展示了如何通過CDC協(xié)議進行USB數據收發(fā)。改例程需要使用虛擬串口驅動,可在官網下載。 實現功能- 
						實現一個虛擬串口 
- 
						端點0 IN/OUT:用于USB枚舉 
- 
						端點1 IN:用于數據發(fā)送 
- 
						端點1 OUT:用于數據接收 
- 
						端點2 IN:監(jiān)控中斷傳輸 
- 
						cdc設備描述(g_usbd_descriptor) 
- 
						cdc設備配置描述(g_usbd_configuration) cdc interface cdc endpoint 
- 
						Lang id(g_string_lang_id) 
- 
						序列號(g_string_serial) 
- 
						廠商產品ID(custom_hid_desc.h)  
- 
						制造商、產品名、配置描述、接口描述(msc_desc.h)  
- 
						端點初始化(class_init_handler)  
- 
						端點清除(class_clear_handler)  
- 
						cdc設備請求(class_setup_handler) SET_LINE_CODING GET_LINE_CODING 代碼如下:  
- 
						IN傳輸處理  
- 
						OUT傳輸處理(接收數據)  
- 
						根據功能需求修改設備描述信息(cdc_desc.c, cdc_desc.h) 設備描述信息(g_usbd_descriptor) 設備配置描述信息(g_usbd_configuration) 其它描述 
- 
						根據功能修改要使用端點(cdc_class.c, cdc_class.h) 端點定義(cdc_class.h) 端點初始化(class_init_handler,class_clear_handler) 
- 
						修改使用的cdc控制請求 控制請求修改(class_setup_handler) 控制請求設置處理(class_ept0_rx_handler) 
- 
						cdc發(fā)送接收數據處理修改 IN數據處理(class_in_handler) OUT數據處理(class_out_handler) 
- 
						根據需求修改端點FIFO大小分配(usb_conf.h) 
virtual_msc_iap例程
virtual msc iap實現一個升級功能的設備,不依賴上位機,當接入PC之后,通過將固件拷貝到磁盤以達到升級目的。 實現功能- 
						將flash虛擬成磁盤進行升級 
- 
						Iap保留使用20K byte空間 
- 
						升級完成之后reset usb設備返回升級狀態(tài) 
- 
						支持下載地址設置 
- 
						支持升級完成之后跳轉到APP運行 
- 
						支持bin文件升級 
- 
						端點0 IN/OUT:用于USB枚舉 
- 
						端點1 IN:用于數據發(fā)送 
- 
						端點1 OUT:用于數據接收 
- 
						升級狀態(tài)  當連接Host之后,在響應磁盤上通過TXT文檔顯示當前狀態(tài) 準備升級狀態(tài)(Ready.TXT) 升級成功(Success.TXT) 升級失敗(Failed.TXT) 未知文件或錯誤(Unkonwn.TXT) 升級文件大于FLASH大?。↙arge.TXT) 
- 
						FAT16分區(qū)表描述  
- 
						升級接口函數 
- 根據功能需求修改設備描述信息(msc_desc.c, msc_desc.h)設備描述信息(g_usbd_descriptor)設備配置描述信息(g_usbd_configuration)其它描述
- 根據功能修改要使用端點(msc_class.c, msc_class.h)端點定義(msc_class.h)端點初始化(class_init_handler,class_clear_handler)
- 修改使用的msc控制請求控制請求修改(class_setup_handler)控制請求設置處理(class_ept0_rx_handler)
- msc發(fā)送接收數據處理修改IN數據處理(class_in_handler)OUT數據處理(class_out_handler)
- 根據需求修改端點FIFO大小分配(usb_conf.h)
- 修改diskio部分,實現表13里面的函數(msc_diskio.c/h)
- 修改flash_fat16.c/h升級參數,包括APP起始地址,IAP占用空間等,要保證IAP和APP地址不重合。
composive_vcp_keyboard例程
復合設備定義如下:擁有多個相互獨立接口的設備被稱為復合設備。當使用該設備時,該設備上擁有多個組合的功能。例如,Composite vcp keyboard demo 提供的復合設備包含HID和CDC功能(鍵盤和串口通信) 實現功能- 實現一個USB虛擬串口(參考3.7)
- 實現一個USB鍵盤設備(參考3.3)
- 端點0 IN/OUT:用于USB枚舉
- 端點1 IN:用于數據發(fā)送
- 端點1 OUT:用于數據接收
- 端點2 IN:CDC命令中斷傳輸
- 端點3 IN:Keyboard發(fā)送數據
- cdc_keyboard設備描述(g_usbd_descriptor)
- cdc_keyboard設備配置描述(g_usbd_configuration)cdc interfacecdc endpointkeyboard interfacekeyboard endpoint
- Lang id(g_string_lang_id)
- 序列號(g_string_serial)
- 
						廠商產品ID(custom_hid_desc.h) 
- 
						制造商、產品名、配置描述、接口描述(msc_desc.h) 
- 
						端點初始化(class_init_handler) 
- 
						端點清除(class_clear_handler) 
- 
						設備請求(class_setup_handler)cdc設備類請求:SET_LINE_CODINGGET_LINE_CODINKeyboard hid設備類請求: SET_PROTOCOLGET_PROTOCOLSET_IDLEGET_IDLESET_REPORT代碼如下:  
- 
						IN傳輸處理 
- 
						OUT傳輸處理(接收數據) 
- 根據功能需求修改設備描述信息(cdc_keyboard_desc.c, cdc_keyboard_desc.h)設備描述信息(g_usbd_descriptor)設備配置描述信息(g_usbd_configuration)其它描述
- 根據功能修改要使用端點(cdc_keyboard_class.c, cdc_keyboard_class.h)端點定義(cdc_class.h)端點初始化(class_init_handler,class_clear_handler)
- 修改使用的cdc控制請求控制請求修改(class_setup_handler)控制請求設置處理(class_ept0_rx_handler)
- cdc_keyboard發(fā)送接收數據處理修改IN數據處理(class_in_handler)OUT數據處理(class_out_handler)
- 根據需求修改端點FIFO大小分配(usb_conf.h)
hid_iap例程
hid_iap例程使用usb hid實現IAP升級功能,需要搭配上位機使用,上位機可在官網下載IAP_Programmer。hid iap的例程代碼位于BSP固件庫utilitiesat32f435_437_usb_iap_demo中,使用方法可參考《AN0007_AT32_IAP_using_the_USB_HID_ZH_V2.x.x.pdf》 1. 實現功能- 實現使用HID進行設備升級
- 端點0 IN/OUT:用于USB枚舉
- 端點1 IN:用于數據發(fā)送
- 端點1 OUT:用于數據接收
- hid iap設備描述(g_usbd_descriptor)
- hid iap設備配置描述(g_usbd_configuration)HID interfaceHID Endpoint
- hid iap report描述(g_usbd_hid_report)
- Lang id(g_string_lang_id)
- 序列號(g_string_serial)
- 
						廠商產品ID(hid_iap_desc.h) 
- 
						制造商、產品名、配置描述、接口描述(hid_iap_desc.h) 
- 
						端點初始化(class_init_handler) 
- 
						端點清除(class_clear_handler) 
- 
						HID設備類請求(class_setup_handler)實現如下請求:SET_PROTOCOLGET_PROTOCOLSET_IDLEGET_IDLESET_REPORT代碼如下: 
- 
						hid iap發(fā)送數據 
- 
						hid iap接收數據 
- 
						升級命令數據處理
							 

- 
						0x5AA0進入IAP模式 作為一個特定的命令,當用戶APP收到這個命令之后將進入IAP模式。實現方式為收到這個命令之后擦除flag然后reset 上位機:[0x5A, 0xA0] IAP設備響應:[0x5A, 0XA0, ACK/NACK] 
- 
						0x5AA1開始下載 上位機:[0x5A,0xA1] IAP設備響應:[0x5A,0xA1,ACK/NACK] 
- 
						0x5AA2設置下載地址 設置下載地址需按照1KB對齊,每下載1Kbyte數據之后,都需要重新設置下載地址。 上位機(命令+地址):[0x5A, 0xA2, 0x08, 0x00, 0x40, 0x00] IAP設備響應:[0x5A,0xA2, ACK/NACK] 
- 
						0x5AA3下載數據命令(1KB 對齊多個包發(fā)送) 下載數據命令采用命令+長度+數據的格式進行發(fā)送,每包最大數據量為60Byte(64–命令–長度),當發(fā)送數據達到1KB時,上位機需要等待設備的ACK響應。此時設備需將1KB的數據寫到FLASH。 上位機(命令(2Byte)+長度(2 Byte)+數據(n byte)):[0x5A,0xA3,LEN1,LEN0,DATA0….DATAn] 收完1KB數據后IAP設備響應:[0x5A, 0XA3, ACK/NACK] 
- 
						0x5AA4下載結束 上位機:[0x5A, 0xA4] IAP設備響應:[0x5A, 0xA4, ACK/NACK] 
- 
						0x5AA5固件CRC校驗 上位機傳輸固件起始地址和固件大小/1KB(固件大小按1KB對齊,不足補0xFF),由IAP計算CRC之后返回給上位機。 上位機:[0x5A,0xA5, 0x08, 0x00, 0x40, 0x00, LEN1, LEN0] IAP設備響應: [0x5A, 0xA5, ACK/NACK, CRC3, CRC2, CRC1, CRC0] 
- 
						0x5AA6跳轉命令 跳轉命令將跳轉到用戶代碼進行運行 上位機:[0x5A,0xA6, 0x08, 0x00, 0x40, 0x00] IAP設備響應:[0x5A,0xA6,ACK/NACK] 
- 
						0x5AA7獲取IAP設置的app地址 返回IAP設置的app地址 上位機:[0x5A, 0xA7] IAP設備響應:[0x5A, 0xA7, ACK/NACK, 0x08, 0x00, 0x40, 0x00] 
- 根據功能需求修改設備描述信息(hid_iap_desc.c, hid_iap_desc.h)設備描述信息(g_usbd_descriptor)設備配置描述信息(g_usbd_configuration)其它描述
- 根據功能修改要使用端點(hid_iap_class.c, hid_iap_class.h)端點定義(hid_iap_class.h)端點初始化(class_init_handler,class_clear_handler)
- 修改使用的hid控制請求控制請求修改(class_setup_handler)控制請求設置處理(class_ept0_rx_handler)
- hid_iap發(fā)送接收數據處理修改IN數據處理(class_in_handler)OUT數據處理(class_out_handler)
- 根據需求修改端點FIFO大小分配(usb_conf.h)
- 修改hid_iap_user.h中的升級參數,包括APP起始地址等,IAP占用空間等,保證APP地址和IAP的地址不要重合。
- 
                                mcu
                                +關注關注 147文章 18451瀏覽量 381388
- 
                                usb
                                +關注關注 60文章 8340瀏覽量 280361
- 
                                雅特力
                                +關注關注 0文章 186瀏覽量 8947
- 
                                AT32
                                +關注關注 1文章 121瀏覽量 3077
原文標題:AT32講堂046 | 雅特力AT32 MCU USB設備庫的架構和使用方法
文章出處:【微信號:AT32 MCU 雅特力科技,微信公眾號:AT32 MCU 雅特力科技】歡迎添加關注!文章轉載請注明出處。
發(fā)布評論請先 登錄
在AT32系列MCU上Flash模擬EEPRO的應用原理和使用方法
AT32 MCU USB主機庫應用說明
AT32 MCU USB設備庫應用說明
雅特力攜高效能AT32 MCU“芯”動亮相ICCAD 2020
雅特力攜高性能AT32 MCU精彩亮相全球MCU生態(tài)發(fā)展大會
 
    
雅特力攜高性能AT32 MCU精彩亮相D Forum 2021 微控制器論壇
 
    
雅特力攜高性能AT32 MCU精彩亮相全球MCU生態(tài)發(fā)展大會
 
    
雅特力展臺首日速遞,AT32 MCU精彩亮相
 
    
 
           
        
 
         雅特力AT32 MCU USB設備庫的架構和使用方法
雅特力AT32 MCU USB設備庫的架構和使用方法 
                 
  
     
     
     
            
             
             
                 
             工商網監(jiān)
工商網監(jiān)
        
評論