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