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