=============轉載著(zhù)名出處=============
圖片看不清的,將圖片在獨立窗口打開(kāi)。
首先,從協(xié)議中截取這兩個(gè)標準請求的結構:
Get Report
Set Report
=============轉載著(zhù)名出處=============
圖片看不清的,將圖片在獨立窗口打開(kāi)。
首先,從協(xié)議中截取這兩個(gè)標準請求的結構:
Get Report
Set Report
以CH554EVT中的CompatibilityHID.C例程為例,處理USB請求的部分:
因為是HID class特有的請求,所以會(huì )放在非標準請求中處理,例程已經(jīng)將兩個(gè)請求的case寫(xiě)在代碼里面了,此時(shí)芯片能夠正確應答請求。
其中Get Report的數據階段方向是Device->Host,所以代碼上的實(shí)現和標準請求中設備、配置描述符的上傳一樣,將pDsecr指針指向需要傳輸的數據,正確的給len賦值長(cháng)度即可。
Set Report的數據階段方向是Host->Device,可以看到case 0x09中沒(méi)有任何實(shí)質(zhì)性的處理,因為OUT事務(wù),作為設備只有等著(zhù)主機下發(fā),只要我們確保芯片對于EP0上的OUT事務(wù)響應狀態(tài)為ACK就好。
真正處理Set Report的數據階段在EP0的OUT事務(wù)完成中斷中:
可以看到程序默認這個(gè)case里面有一些東西,我們只關(guān)注框中的if條件。因為所有EP0上的OUT事務(wù),都會(huì )進(jìn)入這里,所以需要加一下判斷,當前進(jìn)入這個(gè)case是屬于Set Report請求的數據階段。通過(guò)判斷SetupReq這個(gè)全局變量,看一下定義和使用,不難理清他的工作原理。
此時(shí)USB_RX_LEN寄存器的值代表數據階段的數據長(cháng)度,數據本身存放在Ep0Buffer數組中,按照長(cháng)度讀取出來(lái)就可以了。