這段時(shí)間學(xué)習(xí)LPC11Uxx系列的USB-HID,,研究官方的USB庫(kù)文件和HID文件發(fā)現(xiàn)對(duì)于hiduser里面的GetReport和SetReport只在端點(diǎn)0的響應(yīng)函數(shù)中有調(diào)用,,采用USB抓包工具 Bus Hound發(fā)送指令時(shí)也可發(fā)現(xiàn),如果選擇HID-Compliant Device,,只能發(fā)送控制類(lèi)的指令,,而對(duì)于實(shí)際的數(shù)據(jù)傳輸需要另外配置端點(diǎn)進(jìn)行傳輸。
USB 的傳輸事務(wù)類(lèi)型可在端點(diǎn)描述符中配置,,不同的端點(diǎn)可以配置成不同類(lèi)型的傳輸事務(wù),,但端點(diǎn)0默認(rèn)是控制傳輸,上電連接USB即可啟用,,不需要配置,。
HID設(shè)備類(lèi)一般配置數(shù)據(jù)傳輸端點(diǎn)為中斷傳輸,由于USB不支持硬件中斷,,所以USB的中斷傳輸實(shí)際上是主機(jī)在一定的時(shí)間不斷地主動(dòng)輪詢(xún)?cè)O(shè)備檢查其是否有數(shù)據(jù)需要傳輸,,對(duì)此有3個(gè)重要參數(shù)需要在端點(diǎn)描述符中進(jìn)行配置:
傳輸類(lèi)型
輪詢(xún)時(shí)間間隔
每次傳輸?shù)淖畲髷?shù)據(jù)包大小
/* Endpoint, HID Interrupt In */USB_ENDPOINT_DESC_SIZE, /* bLength */USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType */HID_EP_IN, /* bEndpointAddress */USB_ENDPOINT_TYPE_INTERRUPT, /* bmAttributes */WBVAL(0x0040), /* wMaxPacketSize */0x20, /* 16ms */ /* bInterval (輪詢(xún)時(shí)間間隔)*//* Endpoint, HID Interrupt Out */USB_ENDPOINT_DESC_SIZE, /* bLength */USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType */HID_EP_OUT, /* bEndpointAddress */USB_ENDPOINT_TYPE_INTERRUPT, /* bmAttributes(傳輸類(lèi)型) */WBVAL(0x0040), /* wMaxPacketSize(傳輸數(shù)據(jù)包的最大大小) */0x20, /* 16ms */ /* bInterval */0 /* bLength */
USB中斷傳輸事務(wù)流程圖
對(duì)于IN事務(wù),,每次輪詢(xún)時(shí)間間隔內(nèi),,主機(jī)主動(dòng)發(fā)送IN令牌(包括設(shè)備地址和端點(diǎn)號(hào)),,然后切換到接收數(shù)據(jù)狀態(tài),,等待設(shè)備發(fā)送數(shù)據(jù),如果設(shè)備有數(shù)據(jù)要返回,,則把一個(gè)數(shù)據(jù)包放到總線(xiàn)上,。
對(duì)于OUT事務(wù),當(dāng)主機(jī)發(fā)送數(shù)據(jù)時(shí),,USB設(shè)備會(huì)進(jìn)入中斷函數(shù),,根據(jù)地址和端點(diǎn)號(hào)信息調(diào)用相應(yīng)的端點(diǎn)響應(yīng)事件函數(shù),從而進(jìn)行相關(guān)的處理,。