STM32實現(xiàn)HID和u盤復合設(shè)備
USB設(shè)備可以定義一個復合設(shè)備,復合設(shè)備分兩種,一種是一個設(shè)備多個配置,還有一種是一個配置多個接口,在本例中采用一個配置多個接口的方式
首先修改設(shè)備描述符,標準設(shè)備描述符和報告描述符都不需要修改,只需要修改配置描述符即可
//usb配置描述符
const u8 DinkUsbConfigDescriptor[DINK_USB_SIZ_CONFIG_DESC] = {
/***************配置描述符***********************/
USB_CONFIGUARTION_DESC_SIZE, //bLength字段。配置描述符的長度為9字節(jié)。
USB_CONFIGURATION_DESCRIPTOR_TYPE, //bDescriptorType字段。配置描述符編號為0x02。
//wTotalLength字段。配置描述符集合的總長度,
//包括配置描述符本身、接口描述符、類描述符、端點描述符等。
WBVAL(
USB_CONFIGUARTION_DESC_SIZE + //配置描述符
USB_INTERFACE_DESC_SIZE + //接口1描述符
9 + //hid描述符
USB_ENDPOINT_DESC_SIZE + //端點描述符
USB_ENDPOINT_DESC_SIZE + //端點描述符
USB_INTERFACE_DESC_SIZE + //接口描述符2
USB_ENDPOINT_DESC_SIZE + //端點描述符1
USB_ENDPOINT_DESC_SIZE //端點描述符2
),
0x02, //bNumInterfaces字段。該配置包含的接口數(shù),復合設(shè)備,兩個接口。
0x01, //bConfiguration字段。該配置的值為1。
0x00, //iConfigurationz字段,該配置的字符串索引。這里沒有,為0。
USB_CONFIG_BUS_POWERED , //bmAttributes字段,該設(shè)備的屬性
USB_CONFIG_POWER_MA(500), //bMaxPower字段,該設(shè)備需要的最大電流量
/*********************第一個接口描述符,hid設(shè)備**********************/
USB_INTERFACE_DESC_SIZE, //bLength字段。接口描述符的長度為9字節(jié)。
USB_INTERFACE_DESCRIPTOR_TYPE, //bDescriptorType字段。接口描述符的編號為0x04。
0x00, //bInterfaceNumber字段。該接口的編號,第一個接口,編號為0。
0x00, //bAlternateSetting字段。該接口的備用編號,為0。
0x02, //bNumEndpoints字段。非0端點的數(shù)目。該接口有2個批量端點
USB_DEVICE_CLASS_HUMAN_INTERFACE, //bInterfaceClass字段。該接口所使用的類。大容量存儲設(shè)備接口類的代碼為0x08。,
0x00, //bInterfaceSubClass字段。該接口所使用的子類。在HID1.1協(xié)議中,
//只規(guī)定了一種子類:支持BIOS引導啟動的子類。
//USB鍵盤、鼠標屬于該子類,子類代碼為0x01。
//但這里我們是自定義的HID設(shè)備,所以不使用子類。
0x00, //bInterfaceProtocol字段。如果子類為支持引導啟動的子類,
//則協(xié)議可選擇鼠標和鍵盤。鍵盤代碼為0x01,鼠標代碼為0x02。
//自定義的HID設(shè)備,也不使用協(xié)議。
0x00, //iConfiguration字段。該接口的字符串索引值。這里沒有,為0。
/*********************HID報告描述符*************************/
//bLength字段。本HID描述符下只有一個下級描述符。所以長度為9字節(jié)。
0x09,
//bDescriptorType字段。HID描述符的編號為0x21。
0x21,
//bcdHID字段。本協(xié)議使用的HID1.1協(xié)議。注意低字節(jié)在先。
0x10,
0x01,
//bCountyCode字段。設(shè)備適用的國家代碼,這里選擇為美國,代碼0x21。
0x21,
//bNumDescriptors字段。下級描述符的數(shù)目。我們只有一個報告描述符。
0x01,
//bDescriptorType字段。下級描述符的類型,為報告描述符,編號為0x22。
0x22,
//bDescriptorLength字段。下級描述符的長度。下級描述符為報告描述符。
sizeof(HID_ReportDescriptor)&0xFF,
(sizeof(HID_ReportDescriptor)>>8)&0xFF,
/*********************端點描述符**********************************/
/* 端點描述符 */
USB_ENDPOINT_DESC_SIZE, //bLength字段。端點描述符長度為7字節(jié)。
USB_ENDPOINT_DESCRIPTOR_TYPE, //bDescriptorType字段。端點描述符編號為0x05。
USB_ENDPOINT_IN(1), //bEndpointAddress字段。端點的地址。我們使用D12的輸入端點1。
USB_ENDPOINT_TYPE_INTERRUPT, //bmAttributes字段。D1~D0為端點傳輸類型選擇。
WBVAL(0x0040), //wMaxPacketSize字段。該端點的最大包長。最大包長為64字節(jié)。
0x01, //bInterval字段。端點查詢的時間,端點查詢的時間,此處無意義。
/***********************端點描述符*******************************************/
USB_ENDPOINT_DESC_SIZE, //bLength字段。端點描述符長度為7字節(jié)。
USB_ENDPOINT_DESCRIPTOR_TYPE, //bDescriptorType字段。端點描述符編號為0x05。
USB_ENDPOINT_OUT(1), //bEndpointAddress字段。端點的地址。我們使用D12的輸入端點1。
USB_ENDPOINT_TYPE_INTERRUPT, //bmAttributes字段。D1~D0為端點傳輸類型選擇。
WBVAL(0x0040), //wMaxPacketSize字段。該端點的最大包長。最大包長為64字節(jié)。
0x01, //bInterval字段。端點查詢的時間,端點查詢的時間,此處無意義。
/*******************第二個接口描述符 存儲設(shè)備*********************/
USB_INTERFACE_DESC_SIZE, //bLength字段。接口描述符的長度為9字節(jié)。
USB_INTERFACE_DESCRIPTOR_TYPE, //bDescriptorType字段。接口描述符的編號為0x04。
0x01, //bInte