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