一下是源码
在 ubuntu 下面可以识别 ttyACM, host 通过 ACM 写数据OK, 但是读数据还是不行.
在 windows 上就是如上图的鸟样了. VID/PID改变后 inf文件做了相应修改也是不行.
/******************************************************************************
* @file descriptors.c
* @brief USBD descriptors
*
* @note
* Copyright (C) 2013 Nuvoton Technology Corp. All rights reserved.
******************************************************************************/
#ifndef __DESCRIPTORS_C__
#define __DESCRIPTORS_C__
/*!<Includes */
#include "M451Series.h"
#include "usbd.h"
#include "cdc_serial.h"
const uint8_t HID_MouseReportDescriptor[] =
{
0x05, 0x01, /* Usage Page(Generic Desktop Controls) */
0x09, 0x02, /* Usage(Mouse) */
0xA1, 0x01, /* Collection(Application) */
0x09, 0x01, /* Usage(Pointer) */
0xA1, 0x00, /* Collection(Physical) */
0x05, 0x09, /* Usage Page(Button) */
0x19, 0x01, /* Usage Minimum(0x1) */
0x29, 0x03, /* Usage Maximum(0x3) */
0x15, 0x00, /* Logical Minimum(0x0) */
0x25, 0x01, /* Logical Maximum(0x1) */
0x75, 0x01, /* Report Size(0x1) */
0x95, 0x03, /* Report Count(0x3) */
0x81, 0x02, /* Input(3 button bit) */
0x75, 0x05, /* Report Size(0x5) */
0x95, 0x01, /* Report Count(0x1) */
0x81, 0x01, /* Input(5 bit padding) */
0x05, 0x01, /* Usage Page(Generic Desktop Controls) */
0x09, 0x30, /* Usage(X) */
0x09, 0x31, /* Usage(Y) */
0x09, 0x38, /* Usage(Wheel) */
0x15, 0x81, /* Logical Minimum(0x81)(-127) */
0x25, 0x7F, /* Logical Maximum(0x7F)(127) */
0x75, 0x08, /* Report Size(0x8) */
0x95, 0x03, /* Report Count(0x3) */
0x81, 0x06, /* Input(1 byte wheel) */
0xC0, /* End Collection */
0xC0, /* End Collection */
};
/*!<USB HID Report Descriptor */
const uint8_t HID_KeyboardReportDescriptor[] =
{
0x05, 0x01, /* Usage Page(Generic Desktop Controls) */
0x09, 0x06, /* Usage(Keyboard) */
0xA1, 0x01, /* Collection(Application) */
0x05, 0x07, /* Usage Page(Keyboard/Keypad) */
0x19, 0xE0, /* Usage Minimum(0xE0) */
0x29, 0xE7, /* Usage Maximum(0xE7) */
0x15, 0x00, /* Logical Minimum(0x0) */
0x25, 0x01, /* Logical Maximum(0x1) */
0x75, 0x01, /* Report Size(0x1) */
0x95, 0x08, /* Report Count(0x8) */
0x81, 0x02, /* Input (Data) => Modifier byte */
0x95, 0x01, /* Report Count(0x1) */
0x75, 0x08, /* Report Size(0x8) */
0x81, 0x01, /* Input (Constant) => Reserved byte */
0x95, 0x05, /* Report Count(0x5) */
0x75, 0x01, /* Report Size(0x1) */
0x05, 0x08, /* Usage Page(LEDs) */
0x19, 0x01, /* Usage Minimum(0x1) */
0x29, 0x05, /* Usage Maximum(0x5) */
0x91, 0x02, /* Output (Data) => LED report */
0x95, 0x01, /* Report Count(0x1) */
0x75, 0x03, /* Report Size(0x3) */
0x91, 0x01, /* Output (Constant) => LED report padding */
0x95, 0x06, /* Report Count(0x6) */
0x75, 0x08, /* Report Size(0x8) */
0x15, 0x00, /* Logical Minimum(0x0) */
0x25, 0x65, /* Logical Maximum(0x65) */
0x05, 0x07, /* Usage Page(Keyboard/Keypad) */
0x19, 0x00, /* Usage Minimum(0x0) */
0x29, 0x65, /* Usage Maximum(0x65) */
0x81, 0x00, /* Input (Data) */
0xC0, /* End Collection */
};
/*----------------------------------------------------------------------------*/
/*!<USB Device Descriptor */
const uint8_t gu8DeviceDescriptor[] =
{
LEN_DEVICE, /* bLength */
DESC_DEVICE, /* bDescriptorType */
0x10, 0x01, /* bcdUSB */
0xEF, /* bDeviceClass */
0x02, /* bDeviceSubClass */
0x01, /* bDeviceProtocol */
EP0_MAX_PKT_SIZE, /* bMaxPacketSize0 */
/* idVendor */
USBD_VID & 0x00FF,
(USBD_VID & 0xFF00) >> 8,
/* idProduct */
USBD_PID & 0x00FF,
(USBD_PID & 0xFF00) >> 8,
0x00, 0x03, /* bcdDevice */
0x01, /* iManufacture */
0x02, /* iProduct */
0x03, /* iSerialNumber - no serial */
0x01 /* bNumConfigurations */
};
/*!<USB Configure Descriptor */
const uint8_t gu8ConfigDescriptor[] =
{
LEN_CONFIG, /* bLength */
DESC_CONFIG, /* bDescriptorType */
(0x4B + 2*LEN_INTERFACE + 2*LEN_HID + LEN_ENDPOINT * 2) & 0x00FF, /* wTotalLength (single VCOM is 0x43) */
((0x4B + 2*LEN_INTERFACE + 2*LEN_HID + LEN_ENDPOINT * 2) & 0xFF00) >> 8,
DSC_NUM_INTERFACE, /* bNumInterfaces */
0x01, /* bConfigurationValue */
0x00, /* iConfiguration */
0xC0, // | (USBD_SELF_POWERED << 6) | (USBD_REMOTE_WAKEUP << 5),/* bmAttributes */
USBD_MAX_POWER, /* MaxPower */
// ----- CDC descriptors -----
// Interface Association Descriptor
sizeof(Tinterface_association_descriptor), // bLength
DSC_IAD, // bDescriptorType = 11
0x00, // bFirstInterface
0x02, // bInterfaceCount
0x02, // bFunctionClass (Communication Class)
0x02, // bFunctionSubClass (Abstract Control Model)
0x01, // bFunctionProcotol (V.25ter, Common AT commands)
0x00, // iInterface
//interface 0 - for VCOM CDC Communication Class
/* INTERFACE descriptor */
LEN_INTERFACE, /* bLength */
DESC_INTERFACE, /* bDescriptorType */
DSC_INTERFACE_CDC_comm, /* bInterfaceNumber */
0x00, /* bAlternateSetting */
0x01, /* bNumEndpoints */
0x02, /* bInterfaceClass */
0x02, /* bInterfaceSubClass */
0x01, /* bInterfaceProtocol */
0x00, /* iInterface */
/* Communication Class Specified INTERFACE descriptor */
0x05, /* Size of the descriptor, in bytes */
0x24, /* CS_INTERFACE descriptor type */
0x00, /* Header functional descriptor subtype */
0x10, 0x01, /* Communication device compliant to the communication spec. ver. 1.10 */
/* Communication Class Specified INTERFACE descriptor */
0x05, /* Size of the descriptor, in bytes */
0x24, /* CS_INTERFACE descriptor type */
0x01, /* Call management functional descriptor */
0x00, /* BIT0: Whether device handle call management itself. */
/* BIT1: Whether device can send/receive call management information over a Data Class Interface 0 */
DSC_INTERFACE_CDC_data, /* Interface number of data class interface optionally used for call management */
/* Communication Class Specified INTERFACE descriptor */
0x04, /* Size of the descriptor, in bytes */
0x24, /* CS_INTERFACE descriptor type */
0x02, /* Abstract control management functional descriptor subtype */
0x00, /* bmCapabilities Get_Line_Coding, and the notification Serial_State) */
/* Communication Class Specified INTERFACE descriptor */
0x05, /* bLength */
0x24, /* bDescriptorType: CS_INTERFACE descriptor type */
0x06, /* bDescriptorSubType */
DSC_INTERFACE_CDC_comm, /* bMasterInterface */
DSC_INTERFACE_CDC_data, /* bSlaveInterface0 */
/* ENDPOINT descriptor */
LEN_ENDPOINT, /* bLength */
DESC_ENDPOINT, /* bDescriptorType */
(EP_INPUT | INT_IN_EP_NUM), /* bEndpointAddress */
EP_INT, /* bmAttributes */
EP4_MAX_PKT_SIZE, 0x00, /* wMaxPacketSize */
0x01, /* bInterval */
// Interface 1 - CDC Data Interface Class
/* INTERFACE descriptor */
LEN_INTERFACE, /* bLength */
DESC_INTERFACE, /* bDescriptorType */
DSC_INTERFACE_CDC_data, /* bInterfaceNumber */
0x00, /* bAlternateSetting */
0x02, /* bNumEndpoints */
0x0A, /* bInterfaceClass */
0x00, /* bInterfaceSubClass */
0x00, /* bInterfaceProtocol */
0x00, /* iInterface */
/* ENDPOINT descriptor */
LEN_ENDPOINT, /* bLength */
DESC_ENDPOINT, /* bDescriptorType */
(EP_INPUT | BULK_IN_EP_NUM), /* bEndpointAddress */
EP_BULK, /* bmAttributes */
EP2_MAX_PKT_SIZE, 0x00, /* wMaxPacketSize */
0x00, /* bInterval */
/* ENDPOINT descriptor */
LEN_ENDPOINT, /* bLength */
DESC_ENDPOINT, /* bDescriptorType */
(EP_OUTPUT | BULK_OUT_EP_NUM), /* bEndpointAddress */
EP_BULK, /* bmAttributes */
EP3_MAX_PKT_SIZE, 0x00, /* wMaxPacketSize */
0x00, /* bInterval */
//interface 2
/* I/F descr: HID */
LEN_INTERFACE, /* bLength */
DESC_INTERFACE, /* bDescriptorType */
DSC_INTERFACE_HID_MS, /* bInterfaceNumber */
0x00, /* bAlternateSetting */
0x01, /* bNumEndpoints */
0x03, /* bInterfaceClass */
0x01, /* bInterfaceSubClass */
HID_MOUSE, /* bInterfaceProtocol */
0x00, /* iInterface */
/* HID Descriptor */
LEN_HID, /* Size of this descriptor in UINT8s. */
DESC_HID, /* HID descriptor type. */
0x10, 0x01, /* HID Class Spec. release number. */
0x00, /* H/W target country. */
0x01, /* Number of HID class descriptors to follow. */
DESC_HID_RPT, /* Descriptor type. */
/* Total length of report descriptor. */
sizeof(HID_MouseReportDescriptor) & 0x00FF,
(sizeof(HID_MouseReportDescriptor) & 0xFF00) >> 8,
/* EP Descriptor: interrupt in. */
LEN_ENDPOINT, /* bLength */
DESC_ENDPOINT, /* bDescriptorType */
(INT_IN_EP6_NUM | EP_INPUT), /* bEndpointAddress */
EP_INT, /* bmAttributes */
/* wMaxPacketSize */
EP6_MAX_PKT_SIZE & 0x00FF,
(EP6_MAX_PKT_SIZE & 0xFF00) >> 8,
HID_DEFAULT_INT_IN_INTERVAL, /* bInterval */
//interface 3
/* I/F descr: HID */
LEN_INTERFACE, /* bLength */
DESC_INTERFACE, /* bDescriptorType */
DSC_INTERFACE_HID_KB, /* bInterfaceNumber */
0x00, /* bAlternateSetting */
0x01, /* bNumEndpoints */
0x03, /* bInterfaceClass */
0x01, /* bInterfaceSubClass */
HID_KEYBOARD, /* bInterfaceProtocol */
0x00, /* iInterface */
/* HID Descriptor */
LEN_HID, /* Size of this descriptor in UINT8s. */
DESC_HID, /* HID descriptor type. */
0x10, 0x01, /* HID Class Spec. release number. */
0x00, /* H/W target country. */
0x01, /* Number of HID class descriptors to follow. */
DESC_HID_RPT, /* Descriptor type. */
/* Total length of report descriptor. */
sizeof(HID_KeyboardReportDescriptor) & 0x00FF,
(sizeof(HID_KeyboardReportDescriptor) & 0xFF00) >> 8,
/* EP Descriptor: interrupt in. */
LEN_ENDPOINT, /* bLength */
DESC_ENDPOINT, /* bDescriptorType */
(INT_IN_EP5_NUM | EP_INPUT), /* bEndpointAddress */
EP_INT, /* bmAttributes */
/* wMaxPacketSize */
EP5_MAX_PKT_SIZE & 0x00FF,
(EP5_MAX_PKT_SIZE & 0xFF00) >> 8,
HID_DEFAULT_INT_IN_INTERVAL, /* bInterval */
};
/*!<USB Language String Descriptor */
const uint8_t gu8StringLang[4] =
{
4, /* bLength */
DESC_STRING, /* bDescriptorType */
0x09, 0x04
};
/*!<USB Vendor String Descriptor */
const uint8_t gu8VendorStringDesc[] =
{
16,
DESC_STRING,
'N', 0, 'u', 0, 'v', 0, 'o', 0, 't', 0, 'o', 0, 'n', 0
};
/*!<USB Product String Descriptor */
const uint8_t gu8ProductStringDesc[] =
{
32, /* bLength */
DESC_STRING, /* bDescriptorType */
'U', 0, 'S', 0, 'B', 0, ' ', 0, 'V', 0, 'i', 0, 'r', 0, 't', 0, 'u', 0, 'a', 0, 'l', 0, ' ', 0, 'C', 0, 'O', 0, 'M', 0
};
const uint8_t gu8StringSerial[26] =
{
26, // bLength
DESC_STRING, // bDescriptorType
'A', 0, '0', 0, '2', 0, '0', 0, '1', 0, '4', 0, '0', 0, '9', 0, '0', 0, '3', 0, '0', 0, '5', 0
};
const uint8_t *gpu8UsbString[4] =
{
gu8StringLang,
gu8VendorStringDesc,
gu8ProductStringDesc,
gu8StringSerial
};
const S_USBD_INFO_T gsInfo =
{
gu8DeviceDescriptor,
gu8ConfigDescriptor,
gpu8UsbString,
NULL,
NULL,
HID_MouseReportDescriptor,
HID_KeyboardReportDescriptor,
};
#endif /* __DESCRIPTORS_C__ */
|