AT32 USB設備協議庫
這部分主要介紹AT32 USB設備庫的結構和庫的使用方法,AT32 USB是基于USB2.0全速設備,不支持USB2.0高速設備。這里庫的作用是用來管理USB外設和實現USB的基本協議,使開發者能夠更快的上手開發。USB Deivce庫包含以下幾個模塊如圖1:
用戶應用程序
此部分為開發者根據應用具體需求開發應用程序。
USB Core Driver和USB設備類
USB Core Driver:此部分實現USB設備標準協議棧,標準請求等接口。
USB設備類:此部分實現一個具體USB設備的描述和設備請求。
USB硬件底層接口
此部分實現硬件寄存器抽象接口
USB/OTG外設
圖1. USB庫結構
AT32 USB庫文件
如下是AT32 USB應用工程結構圖:圖2. AT32工程結構Core Driver庫路徑:OTGFS-->middlewares\usb_driversUSBFS-->middlewares\usbd_driversDevice Class庫路徑:middlewares\usbd_class如下是USB庫文件列表:表1. USB庫文件列表表2. USB設備類型文件列表
USB設備庫文件說明
USB庫實現USB設備標準請求,同時實現USB規格里面的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接口用于不同的地方調用,包括一些接收,發送函數等。表4.usbd_core函數接口usbd_sdr.c函數接口usbd_sdr.c此文件處理USB一些標準請求。表5.usbd_sdr函數接口支持的標志設備請求如下表:表6. 標準設備請求usbd_xx_class.c函數接口usbd_xx_class.c 此文件為具體設備類型的數據處理,通過結構體函數來實現不同設備類型數據的處理。開發者根據不同的設備類型,來實現下面函數結構體中的函數,達到不同應用結果。函數結構體如下:表7.設備class函數結構體表8.設備class函數接口usbd_xx_desc.c函數接口usbd_xx_desc.c此文件為設備描述文件,設備描述信息都通過此文件的函數接口返回給主機。表9.設備描述函數結構體表10.設備描述接口函數其它參數函數的參數結構體如下,USB設備庫中參數傳遞使用結構體usbd_core_type,如下圖:圖4.全局結構體USB設備的連接狀態如下圖:連接狀態包含:
默認狀態
地址狀態
配置狀態
掛起狀態
可使用usbd_connect_state_get函數查詢當前USB設備的連接狀態。圖5.USB設備連接狀態USB設備返回值,USB函數接口使用如下函數返回值。圖6.函數返回值
端點FIFO分配
USB要正常收發數據,在初始化時需要為每個端點分配發送/接收的FIFO,FIFO的大小可以根據端點上傳輸的最大包長度確認。注意,分配給所有端點FIFO大小的和不能超過系統分配給USB緩沖區的最大長度,具體USB的緩沖區大小參考RM上的描述。開發者可以參考例程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端點打開:
OTGFS外設端點FIFO分配OTGFS對于端點的接收緩沖是共享的,因此對于所有的OUT端點,只需要分配一個接收FIFO。對發送緩沖區則需要為每個發送端點分配一塊自己專用的FIFO。支持的端點個數請參考對應型號的RM。OTGFS的端點分配都需要開發者根據端點支持的最大包長度進行分配,注意usb_conf.h中對端點分配的FIFO大小單位為word(Byte)。以vcp_loopback例程為例:
USB設備初始化
在使用USB時,需要對USB的寄存器做一些基本的初始化,通過調用USB的初始化函數完成這部分的操作,對于外設USBFS和OTGFS在初始化時所調用的函數一定的區別。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的初始化如下:
USB設備中斷處理
USB中斷入口函數usbd_irq_handler處理所有USB中斷,包括Reset,端點收發數據,SOF,掛起,喚醒等中斷,下面介紹一些典型的中斷處理。圖7.USB中斷處理函數Reset中斷處理當USB設備在總線上檢測到Reset信號時,將產生Reset中斷。軟件在收到Reset中斷時,需要做基本的初始化,用于后面的枚舉處理。Reset中斷處理函數usbd_reset_handler:
端點FIFO初始化
設備地址設置為0
端點0初始化
調用設備類的事件函數
udev->class_handler->event_handler(udev, USBD_RESET_EVENT);
端點中斷處理當USB端點收發數據完成時,將產生對應的端點完成中斷,端點完成中斷處理發送和接收的數據。中斷處理函數:usbd_xeptx_handlerSOF中斷處理打開SOF中斷之后,USB設備在每收到一個主機發送的SOF就會產生SOF中斷。中斷處理函數:usbd_sof_handler
中斷處理函數會調用設備類的SOF處理函數
udev->class_handler->sof_handler(udev);
Suspend中斷處理當總線滿足掛起條件時,USB設備會產生一個掛起中斷,開發者可根據此中斷判斷是否需要進入低功耗模式。中斷處理函數:usbd_suspend_handler
連接狀態設置為掛起狀態
設置設備進入掛起狀態
調用設備類的事件處理函數
udev->class_handler->event_handler(udev, USBD_SUSPEND_EVENT);
Wakeup中斷處理當設備在掛起狀態時,如果總線上有wakeup信號,USB設備將產生wakeup中斷。中斷處理函數:usbd_wakeup_handler
設備退出掛起狀態
連接狀態設置為進入掛起之前的狀態
調用設備類事件處理函數
udev->class_handler->event_handler(udev, USBD_WAKEUP_EVENT);
USB設備端點數據處理流程
USB設備在收到主機發送的數據包之后,對應端點0的數據(IN/OUT/SETUP)會做單獨處理,其它端點的數據會調用設備類的IN/OUT handler進行數據處理。如下圖所示數據的處理過程:圖8.端點數據處理流程圖9. Setup處理流程USB控制端點枚舉流程當設備接到主機之后,通過控制端點(端點0)進行枚舉動作,典型的枚舉流程圖如下:圖10.USB枚舉流程USB控制傳輸過程包含SETUP-DATA-STATUS三個階段,如下是一個主機獲取設備信息的傳輸過程GET_DESCRIPTOR:圖11 Get Descriptor如下是USB庫處理上圖Get Descriptor的流程:圖12. USB庫處理Get Descriptor調用流程USB設備請求格式(Setup請求)圖13.Setup請求格式USB應用端點處理流程應用端點指客戶實際應用使用到的非0端點,包括Bulk,interrupt,ISO等端點類型,這些端點的數據通回調函數in_handler和out_handler進行處理。開發者只需要在xxx_class.c中class_in_handler和class_out_handler里面實現具體端點的數據處理即可。IN端點數據處理:圖14.IN端點數據處理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的協議實現一個Speaker和Microphone,傳輸Audio數據使用同步傳輸,Speaker使用同步OUT傳輸,Microphone使用同步IN傳輸。Audio的例程運行在AT-START評估板上,Audio Speaker和Mircophone是基于Audio Arduino Demo Board進行實現,實驗過程中需要連接AT-START和Audio Arduino Board,更多開發板信息請參考《UM_Audio Arduino Daughter Board_V1.0/V2.0》,Audio協議請參數《Universal Serial Bus Device Class Define for Audio Device V1.0》。實現功能實現一個Speaker和Microphone的Audio復合設備,可以同時進行音頻播放和錄音。Speaker功能:
支持16K,48K采樣率
支持采樣率切換
支持16bit采樣
支持靜音
支持音量調節
支持feedback功能
支持雙通道
Microphone功能:
支持16K,48K采樣率
支持采樣率切換
支持16bit采樣
支持靜音
支持音量調節
支持雙通道
外設資源使用USB外設:
端點0 IN/OUT:用于USB枚舉以及Audio部分控制。
端點1 IN:用于Microphone錄音數據
端點1 OUT:用于Speaker播放數據
端點2 IN:用于Feedback數據
I2C:
使用I2C發送控制信息到音頻Board
I2S:
使用I2S1發送數據到音頻board(speaker)
使用I2S2從音頻board接收數據(microphone)
DMA:
使用DMA1通道3傳輸I2S1的數據
使用DMA1通道4傳輸I2S2的數據
TIMER:
使用TIMER產生Codec所需要的時鐘
Audio設備實現USB Audio設備類實現源文件在audio_class.c和audio_desc.c中,外部codec的控制以及音頻數據的處理都在audio_codec.c中實現,根據主機的請求設置會調用到audio_codec.c中具體的設置函數。另外需要特別注意關于USB設備端點FIFO大小的分配在usb_conf.h中配置,此部分根據具體端點傳輸的最大包長度進行分配。1. 設備描述:(audio_desc.c/h)
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)
制造商、產品名、配置描述、接口描述(audio_desc.h)
2. 數據處理部分(audio_class.c/h audio_codec.c/h)
端點初始化(class_init_handler)
端點清除(class_clear_handler)
Audio控制請求(class_setup_handler)
實現如下audio控制請求:
Audio音量、靜音、采樣率設置(class_ept0_rx_handler)
此函數用于接收完主機發送的設置數據之后進行處理,包括設置音量,靜音,以及采樣率的設置。
Microphone和Feedback數據傳輸(class_in_handler)
Speaker數據接收(class_out_handler)
audio_codec.c中實現codec具體的控制以及數據處理,需要實現如下函數:
以上函數可根據例程里的方式進行實現,也可以根據開發者實際使用的codec來進行修改,對于codec的初始化部分,在這里將不再講述。
audio例程功能配置
audio_conf.h中可以對當前audio例程進行配置,例如:是否需要speaker功能,支持采樣率等,有如下選項配置:
如何根據Audio例程進行開發本章將簡單描述如何修改audio例程的代碼來進行開發,根據應用具體的需求來修改代碼。
根據功能需求修改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開發板上運行,上位機可在官網下載,關于HID協議參考《Human Interface Devices (HID) V1.11》。實現功能
上位機顯示按鍵狀態
通過上位機控制開發板LED等開關狀態
HID數據回環功能
外設資源使用USB外設:
端點0 IN/OUT:用于USB枚舉
端點1 IN:用于數據發送
端點1 OUT:用于數據接收
custom_hid設備實現custom_hid設備類實現源代碼主要在custom_hid_class.c和custom_hid_desc.c中,這兩個源文件實現了對設備的描述和設備的處理。1. 設備描述:(custom_hid_desc.c/h)
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)
2. 數據處理部分(custom_hid_class.c/h)
端點初始化(class_init_handler)
端點清除(class_clear_handler)
HID設備類請求(class_setup_handler)
實現如下請求:
SET_PROTOCOL
GET_PROTOCOL
SET_IDLE
GET_IDLE
SET_REPORT
代碼如下:
Custom_HID發送數據
Custom_HID接收數據
數據處理
如何根據custom hid例程進行開發本章將簡單描述如何修改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發送接收數據處理修改
IN數據處理(class_in_handler)
OUT數據處理(class_out_handler)
根據需求修改端點FIFO大小分配(usb_conf.h)
修改數據處理部分
keyboard例程
keyboard實現一個鍵盤功能,使用中斷傳輸與上位機通信,例程在AT-START開發板上運行,通過按鍵發送字符串到主機。實現功能
通過按鍵發送字符串(”Keyboard Demo”)到主機
外設資源使用USB外設:
端點0 IN/OUT:用于USB枚舉
端點1 IN:用于數據發送
keyboard設備實現keyboard設備類實現源代碼主要在keyboard_class.c和keyboard_desc.c中,這兩個源文件實現了對設備的描述和設備的處理。1. 設備描述:(keyboard_desc.c/h)
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)
2. 數據處理部分(keyboard_class.c/h)
端點初始化(class_init_handler)
端點清除(class_clear_handler)
HID設備類請求(class_setup_handler)
實現如下請求:
SET_PROTOCOL
GET_PROTOCOL
SET_IDLE
GET_IDLE
SET_REPORT
keyboard發送數據
keyboard字符數據處理
如何根據keyboard例程進行開發本章將簡單描述如何修改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發送接收數據處理修改
IN數據處理(class_in_handler)
OUT數據處理(class_out_handler)
根據需求修改端點FIFO大小分配(usb_conf.h)
修改數據處理部分
Mouse例程
實現功能mouse實現一個簡單的鼠標功能,使用中斷傳輸與上位機通信,例程在AT-START開發板上運行,通過開發板上的按鍵發送鼠標右鍵功能。圖16.鼠標傳輸格式鼠標d通常是通過設置X和Y值來控制PC鼠標移動。外設資源使用USB外設:
端點0 IN/OUT:用于USB枚舉
端點1 IN:用于數據發送
mouse設備實現mouse設備實現源代碼主要在mouse_class.c和mouse_desc.c中,這兩個源文件實現了對設備的描述和設備的處理。1. 設備描述:(mouse_desc.c/h)
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)
2. 數據處理部分(mouse_class.c/h)
端點初始化(class_init_handler)
端點清除(class_clear_handler)
HID設備類請求(class_setup_handler)
實現如下請求:
SET_PROTOCOL
GET_PROTOCOL
SET_IDLE
GET_IDLE
SET_REPORT
keyboard發送數據
mouse數據處理
如何根據mouse例程進行開發本章將簡單描述如何修改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發送接收數據處理修改
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)協議和SCSI(small computer system interface)指令。圖17. BOT 命令/數據/狀態 流程圖18.BOT命令格式圖19.BOT狀態格式實現功能
將內部FLASH虛擬成一個磁盤
實現bulk-only傳輸協議
實現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
外設資源使用USB外設:
端點0 IN/OUT:用于USB枚舉
端點1 IN:用于數據發送
端點1 OUT:用于數據接收
msc設備實現1. 設備描述:(msc_desc.c/h)
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)
2. 數據處理部分(msc_class.c/h)
端點初始化(class_init_handler)
端點清除(class_clear_handler)
MSC設備請求(class_setup_handler)
GET_MAX_LUN
BO_RESET
代碼如下:
IN傳輸處理
OUT傳輸處理(接收數據)
3. BOT和SCSI命令處理Bulk-only transfer和SCSI的命令處理在庫文件msc_bot_scsi.c/h中。表11.msc_bot_scsi函數列表4. diskio處理此部分主要處理與存儲設備間接口,例程里面以內部flash的存儲控制作為說明,msc_diskio.c/h根據開發者使用存儲不同,只需要實現對應存儲的讀寫函數即可。表12.inquiry描述表13 diskio操作函數如何根據msc例程進行開發本章將簡單描述如何修改msc例程的代碼來進行開發,根據應用具體的需求來修改代碼。
根據功能需求修改設備描述信息(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發送接收數據處理修改
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端發送的關于printer類的狀態請求命令(例如打印機的有紙/無紙狀態)
實現功能
實現一個打印機設備
外設資源使用USB外設:
端點0 IN/OUT:用于USB枚舉
端點1 IN:用于數據發送
端點1 OUT:用于數據接收
printer設備實現1. 設備描述(printer_desc.c/h)
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)
2. 數據處理(printer_class.c/h)
端點初始化(class_init_handler)
端點清除(class_clear_handler)
printer設備請求(class_setup_handler)
GET_DEVICE_ID
PORT_STATUS
SOFT_RESET
代碼如下:
IN傳輸處理
OUT傳輸處理(接收數據)
如何根據printer例程進行開發本章將簡單描述如何修改printer例程的代碼來進行開發,根據應用具體的需求來修改代碼。
根據功能需求修改設備描述信息(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發送接收數據處理修改
IN數據處理(class_in_handler)
OUT數據處理(class_out_handler)
根據需求修改端點FIFO大小分配(usb_conf.h)
vcp loopback例程
在現代PC中,USB是和絕大部分外設通信的標準接口。盡管如此,大部分的工業軟件依舊使用COM接口(UART)通信。vcp_loopback例程提供使用USB設備模擬COM接口方法,解決了該問題, vcp_loopback例程展示了如何通過CDC協議進行USB數據收發。改例程需要使用虛擬串口驅動,可在官網下載。實現功能
實現一個虛擬串口
外設資源使用USB外設:
端點0 IN/OUT:用于USB枚舉
端點1 IN:用于數據發送
端點1 OUT:用于數據接收
端點2 IN:監控中斷傳輸
vcp_loopback設備實現1. 設備描述(cdc_desc.c/h)
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)
2. 數據處理(cdc_class.c/h)
端點初始化(class_init_handler)
端點清除(class_clear_handler)
cdc設備請求(class_setup_handler)
SET_LINE_CODING
GET_LINE_CODING
代碼如下:
IN傳輸處理
OUT傳輸處理(接收數據)
如何根據vcp_loopback例程進行開發本章將簡單描述如何修改cdc例程的代碼來進行開發,根據應用具體的需求來修改代碼。
根據功能需求修改設備描述信息(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發送接收數據處理修改
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設備返回升級狀態
支持下載地址設置
支持升級完成之后跳轉到APP運行
支持bin文件升級
外設資源使用USB外設:
端點0 IN/OUT:用于USB枚舉
端點1 IN:用于數據發送
端點1 OUT:用于數據接收
virtual_msc_iap設備實現1. 設備描述(msc_desc.c/h)參考3.5.3.12. 數據處理部分(msc_class.c/h)參考3.5.3.23. BOT和SCSI命令處理參考3.5.3.34. diskio處理參考3.5.3.45. flash升級部分(flash_fat16.c/h)
升級狀態
當連接Host之后,在響應磁盤上通過TXT文檔顯示當前狀態
準備升級狀態(Ready.TXT)
升級成功(Success.TXT)
升級失?。‵ailed.TXT)
未知文件或錯誤(Unkonwn.TXT)
升級文件大于FLASH大小(Large.TXT)
FAT16分區表描述
- 升級接口函數
如何根據virtual_msc_iap例程進行開發本章將簡單描述如何修改virtual_msc_iap例程的代碼來進行開發,根據應用具體的需求來修改代碼。
- 根據功能需求修改設備描述信息(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發送接收數據處理修改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)
外設資源使用USB外設:
- 端點0 IN/OUT:用于USB枚舉
- 端點1 IN:用于數據發送
- 端點1 OUT:用于數據接收
- 端點2 IN:CDC命令中斷傳輸
- 端點3 IN:Keyboard發送數據
composite_vcp_keyboard設備實現1. 設備描述(cdc_keyboard_desc.c/h)
- 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)
2. 數據處理(cdc_keyboard_class.c/h)
- 端點初始化(class_init_handler)
- 端點清除(class_clear_handler)
- 設備請求(class_setup_handler)cdc設備類請求:SET_LINE_CODINGGET_LINE_CODIN
Keyboard hid設備類請求:
- SET_PROTOCOLGET_PROTOCOLSET_IDLEGET_IDLESET_REPORT
代碼如下:
- IN傳輸處理
- OUT傳輸處理(接收數據)
如何根據composite_vcp_keyboard例程進行開發本章將簡單描述如何修改composite_vcp_keyboard例程的代碼來進行復合設備開發,根據應用具體的需求來修改代碼。
- 根據功能需求修改設備描述信息(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發送接收數據處理修改IN數據處理(class_in_handler)OUT數據處理(class_out_handler)
- 根據需求修改端點FIFO大小分配(usb_conf.h)
hid_iap例程
hid_iap例程使用usb hid實現IAP升級功能,需要搭配上位機使用,上位機可在官網下載IAP_Programmer。hid iap的例程代碼位于BSP固件庫utilities\at32f435_437_usb_iap_demo中,使用方法可參考《AN0007_AT32_IAP_using_the_USB_HID_ZH_V2.x.x.pdf》1. 實現功能
- 實現使用HID進行設備升級
2. 外設資源使用USB 外設:
- 端點0 IN/OUT:用于USB枚舉
- 端點1 IN:用于數據發送
- 端點1 OUT:用于數據接收
hid_iap設備實現1. 設備描述(hid_iap_desc.c/h)
- 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)
2. 數據處理(hid_iap_class.c/h)
- 端點初始化(class_init_handler)
- 端點清除(class_clear_handler)
- HID設備類請求(class_setup_handler)實現如下請求:SET_PROTOCOLGET_PROTOCOLSET_IDLEGET_IDLESET_REPORT代碼如下:
- hid iap發送數據
- hid iap接收數據
- 升級命令數據處理
3. hid iap升級協議表14.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 對齊多個包發送)
下載數據命令采用命令+長度+數據的格式進行發送,每包最大數據量為60Byte(64–命令–長度),當發送數據達到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例程進行開發本章將簡單描述如何修改hid_iap例程的代碼來進行開發,根據應用具體的需求來修改代碼。
- 根據功能需求修改設備描述信息(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發送接收數據處理修改IN數據處理(class_in_handler)OUT數據處理(class_out_handler)
- 根據需求修改端點FIFO大小分配(usb_conf.h)
- 修改hid_iap_user.h中的升級參數,包括APP起始地址等,IAP占用空間等,保證APP地址和IAP的地址不要重合。
關于雅特力雅特力科技于2016年成立,是一家致力于推動全球市場32位微控制器(MCU)創新趨勢的芯片設計公司,專注于ARM Cortex-M4/M0+的32位微控制器研發與創新,全系列采用55nm先進工藝及ARM Cortex-M4高效能或M0+低功耗內核,締造M4業界最高主頻288MHz運算效能,并支持工業級別芯片工作溫度范圍(-40°~105°)。雅特力目前已累積相當多元的終端產品成功案例:如微型打印機、掃地機、光流無人機、熱成像儀、激光雷達、工業縫紉機、伺服驅控、電競周邊市場、斷路器、ADAS、T-BOX、數字電源、電動工具等終端設備應用,廣泛地覆蓋5G、物聯網、消費、商務及工控等領域。
-
mcu
+關注
關注
146文章
17317瀏覽量
352630 -
AT32
+關注
關注
1文章
118瀏覽量
2164
發布評論請先 登錄
相關推薦
評論