mirror of
https://github.com/ylj2000/DAPLink_X033.git
synced 2026-09-27 06:26:16 +00:00
Add Code
This commit is contained in:
@@ -0,0 +1,698 @@
|
||||
/*
|
||||
* Copyright (c) 2022, sakumisu
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
#ifndef USB_CDC_H
|
||||
#define USB_CDC_H
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
* Definitions based on usbcdc11.pdf (www.usb.org)
|
||||
*----------------------------------------------------------------------------*/
|
||||
/* Communication device class specification version 1.10 */
|
||||
#define CDC_V1_10 0x0110U
|
||||
// Communication device class specification version 1.2
|
||||
#define CDC_V1_2_0 0x0120U
|
||||
|
||||
/* Communication interface class code */
|
||||
/* (usbcdc11.pdf, 4.2, Table 15) */
|
||||
#define CDC_COMMUNICATION_INTERFACE_CLASS 0x02U
|
||||
|
||||
/* Communication interface class subclass codes */
|
||||
/* (usbcdc11.pdf, 4.3, Table 16) */
|
||||
#define CDC_SUBCLASS_NONE 0x00 /* Reserved */
|
||||
#define CDC_SUBCLASS_DLC 0x01 /* Direct Line Control Model */
|
||||
#define CDC_SUBCLASS_ACM 0x02 /* Abstract Control Model */
|
||||
#define CDC_SUBCLASS_TCM 0x03 /* Telephone Control Model */
|
||||
#define CDC_SUBCLASS_MCM 0x04 /* Multi-Channel Control Model */
|
||||
#define CDC_SUBCLASS_CAPI 0x05 /* CAPI Control Model */
|
||||
#define CDC_SUBCLASS_ECM 0x06 /* Ethernet Networking Control Model */
|
||||
#define CDC_SUBCLASS_ATM 0x07 /* ATM Networking Control Model */
|
||||
/* 0x08-0x0d Reserved (future use) */
|
||||
#define CDC_SUBCLASS_MBIM 0x0e /* MBIM Control Model */
|
||||
/* 0x0f-0x7f Reserved (future use) */
|
||||
/* 0x80-0xfe Reserved (vendor specific) */
|
||||
|
||||
#define CDC_DIRECT_LINE_CONTROL_MODEL 0x01U
|
||||
#define CDC_ABSTRACT_CONTROL_MODEL 0x02U
|
||||
#define CDC_TELEPHONE_CONTROL_MODEL 0x03U
|
||||
#define CDC_MULTI_CHANNEL_CONTROL_MODEL 0x04U
|
||||
#define CDC_CAPI_CONTROL_MODEL 0x05U
|
||||
#define CDC_ETHERNET_NETWORKING_CONTROL_MODEL 0x06U
|
||||
#define CDC_ATM_NETWORKING_CONTROL_MODEL 0x07U
|
||||
#define CDC_WIRELESS_HANDSET_CONTROL_MODEL 0x08U
|
||||
#define CDC_DEVICE_MANAGEMENT 0x09U
|
||||
#define CDC_MOBILE_DIRECT_LINE_MODEL 0x0AU
|
||||
#define CDC_OBEX 0x0BU
|
||||
#define CDC_ETHERNET_EMULATION_MODEL 0x0CU
|
||||
#define CDC_NETWORK_CONTROL_MODEL 0x0DU
|
||||
|
||||
/* Communication interface class control protocol codes */
|
||||
/* (usbcdc11.pdf, 4.4, Table 17) */
|
||||
#define CDC_COMMON_PROTOCOL_NONE 0x00U
|
||||
#define CDC_COMMON_PROTOCOL_AT_COMMANDS 0x01U
|
||||
#define CDC_COMMON_PROTOCOL_AT_COMMANDS_PCCA_101 0x02U
|
||||
#define CDC_COMMON_PROTOCOL_AT_COMMANDS_PCCA_101_AND_ANNEXO 0x03U
|
||||
#define CDC_COMMON_PROTOCOL_AT_COMMANDS_GSM_707 0x04U
|
||||
#define CDC_COMMON_PROTOCOL_AT_COMMANDS_3GPP_27007 0x05U
|
||||
#define CDC_COMMON_PROTOCOL_AT_COMMANDS_CDMA 0x06U
|
||||
#define CDC_COMMON_PROTOCOL_ETHERNET_EMULATION_MODEL 0x07U
|
||||
// NCM Communication Interface Protocol Codes
|
||||
// (usbncm10.pdf, 4.2, Table 4-2)
|
||||
#define CDC_NCM_PROTOCOL_NONE 0x00U
|
||||
#define CDC_NCM_PROTOCOL_OEM 0xFEU
|
||||
|
||||
/* Data interface class code */
|
||||
/* (usbcdc11.pdf, 4.5, Table 18) */
|
||||
#define CDC_DATA_INTERFACE_CLASS 0x0A
|
||||
|
||||
/* Data Interface Sub-Class Codes ********************************************/
|
||||
#define CDC_DATA_SUBCLASS_NONE 0x00
|
||||
|
||||
/* Data interface class protocol codes */
|
||||
/* (usbcdc11.pdf, 4.7, Table 19) */
|
||||
#define CDC_DATA_PROTOCOL_ISDN_BRI 0x30
|
||||
#define CDC_DATA_PROTOCOL_HDLC 0x31
|
||||
#define CDC_DATA_PROTOCOL_TRANSPARENT 0x32
|
||||
#define CDC_DATA_PROTOCOL_Q921_MANAGEMENT 0x50
|
||||
#define CDC_DATA_PROTOCOL_Q921_DATA_LINK 0x51
|
||||
#define CDC_DATA_PROTOCOL_Q921_MULTIPLEXOR 0x52
|
||||
#define CDC_DATA_PROTOCOL_V42 0x90
|
||||
#define CDC_DATA_PROTOCOL_EURO_ISDN 0x91
|
||||
#define CDC_DATA_PROTOCOL_V24_RATE_ADAPTATION 0x92
|
||||
#define CDC_DATA_PROTOCOL_CAPI 0x93
|
||||
#define CDC_DATA_PROTOCOL_HOST_BASED_DRIVER 0xFD
|
||||
#define CDC_DATA_PROTOCOL_DESCRIBED_IN_PUFD 0xFE
|
||||
|
||||
/* Type values for bDescriptorType field of functional descriptors */
|
||||
/* (usbcdc11.pdf, 5.2.3, Table 24) */
|
||||
#define CDC_CS_INTERFACE 0x24
|
||||
#define CDC_CS_ENDPOINT 0x25
|
||||
|
||||
/* Type values for bDescriptorSubtype field of functional descriptors */
|
||||
/* (usbcdc11.pdf, 5.2.3, Table 25) */
|
||||
#define CDC_FUNC_DESC_HEADER 0x00
|
||||
#define CDC_FUNC_DESC_CALL_MANAGEMENT 0x01
|
||||
#define CDC_FUNC_DESC_ABSTRACT_CONTROL_MANAGEMENT 0x02
|
||||
#define CDC_FUNC_DESC_DIRECT_LINE_MANAGEMENT 0x03
|
||||
#define CDC_FUNC_DESC_TELEPHONE_RINGER 0x04
|
||||
#define CDC_FUNC_DESC_REPORTING_CAPABILITIES 0x05
|
||||
#define CDC_FUNC_DESC_UNION 0x06
|
||||
#define CDC_FUNC_DESC_COUNTRY_SELECTION 0x07
|
||||
#define CDC_FUNC_DESC_TELEPHONE_OPERATIONAL_MODES 0x08
|
||||
#define CDC_FUNC_DESC_USB_TERMINAL 0x09
|
||||
#define CDC_FUNC_DESC_NETWORK_CHANNEL 0x0A
|
||||
#define CDC_FUNC_DESC_PROTOCOL_UNIT 0x0B
|
||||
#define CDC_FUNC_DESC_EXTENSION_UNIT 0x0C
|
||||
#define CDC_FUNC_DESC_MULTI_CHANNEL_MANAGEMENT 0x0D
|
||||
#define CDC_FUNC_DESC_CAPI_CONTROL_MANAGEMENT 0x0E
|
||||
#define CDC_FUNC_DESC_ETHERNET_NETWORKING 0x0F
|
||||
#define CDC_FUNC_DESC_ATM_NETWORKING 0x10
|
||||
#define CDC_FUNC_DESC_WIRELESS_HANDSET_CONTROL_MODEL 0x11
|
||||
#define CDC_FUNC_DESC_MOBILE_DIRECT_LINE_MODEL 0x12
|
||||
#define CDC_FUNC_DESC_MOBILE_DIRECT_LINE_MODEL_DETAIL 0x13
|
||||
#define CDC_FUNC_DESC_DEVICE_MANAGEMENT_MODEL 0x14
|
||||
#define CDC_FUNC_DESC_OBEX 0x15
|
||||
#define CDC_FUNC_DESC_COMMAND_SET 0x16
|
||||
#define CDC_FUNC_DESC_COMMAND_SET_DETAIL 0x17
|
||||
#define CDC_FUNC_DESC_TELEPHONE_CONTROL_MODEL 0x18
|
||||
#define CDC_FUNC_DESC_OBEX_SERVICE_IDENTIFIER 0x19
|
||||
#define CDC_FUNC_DESC_NCM 0x1A
|
||||
|
||||
/* CDC class-specific request codes */
|
||||
/* (usbcdc11.pdf, 6.2, Table 46) */
|
||||
/* see Table 45 for info about the specific requests. */
|
||||
#define CDC_REQUEST_SEND_ENCAPSULATED_COMMAND 0x00
|
||||
#define CDC_REQUEST_GET_ENCAPSULATED_RESPONSE 0x01
|
||||
#define CDC_REQUEST_SET_COMM_FEATURE 0x02
|
||||
#define CDC_REQUEST_GET_COMM_FEATURE 0x03
|
||||
#define CDC_REQUEST_CLEAR_COMM_FEATURE 0x04
|
||||
#define CDC_REQUEST_SET_AUX_LINE_STATE 0x10
|
||||
#define CDC_REQUEST_SET_HOOK_STATE 0x11
|
||||
#define CDC_REQUEST_PULSE_SETUP 0x12
|
||||
#define CDC_REQUEST_SEND_PULSE 0x13
|
||||
#define CDC_REQUEST_SET_PULSE_TIME 0x14
|
||||
#define CDC_REQUEST_RING_AUX_JACK 0x15
|
||||
#define CDC_REQUEST_SET_LINE_CODING 0x20
|
||||
#define CDC_REQUEST_GET_LINE_CODING 0x21
|
||||
#define CDC_REQUEST_SET_CONTROL_LINE_STATE 0x22
|
||||
#define CDC_REQUEST_SEND_BREAK 0x23
|
||||
#define CDC_REQUEST_SET_RINGER_PARMS 0x30
|
||||
#define CDC_REQUEST_GET_RINGER_PARMS 0x31
|
||||
#define CDC_REQUEST_SET_OPERATION_PARMS 0x32
|
||||
#define CDC_REQUEST_GET_OPERATION_PARMS 0x33
|
||||
#define CDC_REQUEST_SET_LINE_PARMS 0x34
|
||||
#define CDC_REQUEST_GET_LINE_PARMS 0x35
|
||||
#define CDC_REQUEST_DIAL_DIGITS 0x36
|
||||
#define CDC_REQUEST_SET_UNIT_PARAMETER 0x37
|
||||
#define CDC_REQUEST_GET_UNIT_PARAMETER 0x38
|
||||
#define CDC_REQUEST_CLEAR_UNIT_PARAMETER 0x39
|
||||
#define CDC_REQUEST_GET_PROFILE 0x3A
|
||||
#define CDC_REQUEST_SET_ETHERNET_MULTICAST_FILTERS 0x40
|
||||
#define CDC_REQUEST_SET_ETHERNET_PMP_FILTER 0x41
|
||||
#define CDC_REQUEST_GET_ETHERNET_PMP_FILTER 0x42
|
||||
#define CDC_REQUEST_SET_ETHERNET_PACKET_FILTER 0x43
|
||||
#define CDC_REQUEST_GET_ETHERNET_STATISTIC 0x44
|
||||
#define CDC_REQUEST_SET_ATM_DATA_FORMAT 0x50
|
||||
#define CDC_REQUEST_GET_ATM_DEVICE_STATISTICS 0x51
|
||||
#define CDC_REQUEST_SET_ATM_DEFAULT_VC 0x52
|
||||
#define CDC_REQUEST_GET_ATM_VC_STATISTICS 0x53
|
||||
#define CDC_REQUEST_GET_NTB_PARAMETERS 0x80
|
||||
#define CDC_REQUEST_GET_NET_ADDRESS 0x81
|
||||
#define CDC_REQUEST_SET_NET_ADDRESS 0x82
|
||||
#define CDC_REQUEST_GET_NTB_FORMAT 0x83
|
||||
#define CDC_REQUEST_SET_NTB_FORMAT 0x84
|
||||
#define CDC_REQUEST_GET_NTB_INPUT_SIZE 0x85
|
||||
#define CDC_REQUEST_SET_NTB_INPUT_SIZE 0x86
|
||||
#define CDC_REQUEST_GET_MAX_DATAGRAM_SIZE 0x87
|
||||
#define CDC_REQUEST_SET_MAX_DATAGRAM_SIZE 0x88
|
||||
#define CDC_REQUEST_GET_CRC_MODE 0x89
|
||||
#define CDC_REQUEST_SET_CRC_MODE 0x90
|
||||
|
||||
/* Communication feature selector codes */
|
||||
/* (usbcdc11.pdf, 6.2.2..6.2.4, Table 47) */
|
||||
#define CDC_ABSTRACT_STATE 0x01
|
||||
#define CDC_COUNTRY_SETTING 0x02
|
||||
|
||||
/** Control Signal Bitmap Values for SetControlLineState */
|
||||
#define SET_CONTROL_LINE_STATE_RTS 0x02
|
||||
#define SET_CONTROL_LINE_STATE_DTR 0x01
|
||||
|
||||
/* Feature Status returned for ABSTRACT_STATE Selector */
|
||||
/* (usbcdc11.pdf, 6.2.3, Table 48) */
|
||||
#define CDC_IDLE_SETTING (1 << 0)
|
||||
#define CDC_DATA_MULTPLEXED_STATE (1 << 1)
|
||||
|
||||
/* Control signal bitmap values for the SetControlLineState request */
|
||||
/* (usbcdc11.pdf, 6.2.14, Table 51) */
|
||||
#define CDC_DTE_PRESENT (1 << 0)
|
||||
#define CDC_ACTIVATE_CARRIER (1 << 1)
|
||||
|
||||
/* CDC class-specific notification codes */
|
||||
/* (usbcdc11.pdf, 6.3, Table 68) */
|
||||
/* see Table 67 for Info about class-specific notifications */
|
||||
#define CDC_NOTIFICATION_NETWORK_CONNECTION 0x00
|
||||
#define CDC_RESPONSE_AVAILABLE 0x01
|
||||
#define CDC_AUX_JACK_HOOK_STATE 0x08
|
||||
#define CDC_RING_DETECT 0x09
|
||||
#define CDC_NOTIFICATION_SERIAL_STATE 0x20
|
||||
#define CDC_CALL_STATE_CHANGE 0x28
|
||||
#define CDC_LINE_STATE_CHANGE 0x29
|
||||
#define CDC_CONNECTION_SPEED_CHANGE 0x2A
|
||||
|
||||
/* UART state bitmap values (Serial state notification). */
|
||||
/* (usbcdc11.pdf, 6.3.5, Table 69) */
|
||||
#define CDC_SERIAL_STATE_OVERRUN (1 << 6) /* receive data overrun error has occurred */
|
||||
#define CDC_SERIAL_STATE_OVERRUN_Pos (6)
|
||||
#define CDC_SERIAL_STATE_OVERRUN_Msk (1 << CDC_SERIAL_STATE_OVERRUN_Pos)
|
||||
#define CDC_SERIAL_STATE_PARITY (1 << 5) /* parity error has occurred */
|
||||
#define CDC_SERIAL_STATE_PARITY_Pos (5)
|
||||
#define CDC_SERIAL_STATE_PARITY_Msk (1 << CDC_SERIAL_STATE_PARITY_Pos)
|
||||
#define CDC_SERIAL_STATE_FRAMING (1 << 4) /* framing error has occurred */
|
||||
#define CDC_SERIAL_STATE_FRAMING_Pos (4)
|
||||
#define CDC_SERIAL_STATE_FRAMING_Msk (1 << CDC_SERIAL_STATE_FRAMING_Pos)
|
||||
#define CDC_SERIAL_STATE_RING (1 << 3) /* state of ring signal detection */
|
||||
#define CDC_SERIAL_STATE_RING_Pos (3)
|
||||
#define CDC_SERIAL_STATE_RING_Msk (1 << CDC_SERIAL_STATE_RING_Pos)
|
||||
#define CDC_SERIAL_STATE_BREAK (1 << 2) /* state of break detection */
|
||||
#define CDC_SERIAL_STATE_BREAK_Pos (2)
|
||||
#define CDC_SERIAL_STATE_BREAK_Msk (1 << CDC_SERIAL_STATE_BREAK_Pos)
|
||||
#define CDC_SERIAL_STATE_TX_CARRIER (1 << 1) /* state of transmission carrier */
|
||||
#define CDC_SERIAL_STATE_TX_CARRIER_Pos (1)
|
||||
#define CDC_SERIAL_STATE_TX_CARRIER_Msk (1 << CDC_SERIAL_STATE_TX_CARRIER_Pos)
|
||||
#define CDC_SERIAL_STATE_RX_CARRIER (1 << 0) /* state of receiver carrier */
|
||||
#define CDC_SERIAL_STATE_RX_CARRIER_Pos (0)
|
||||
#define CDC_SERIAL_STATE_RX_CARRIER_Msk (1 << CDC_SERIAL_STATE_RX_CARRIER_Pos)
|
||||
|
||||
#define CDC_ECM_XMIT_OK (1 << 0)
|
||||
#define CDC_ECM_RVC_OK (1 << 1)
|
||||
#define CDC_ECM_XMIT_ERROR (1 << 2)
|
||||
#define CDC_ECM_RCV_ERROR (1 << 3)
|
||||
#define CDC_ECM_RCV_NO_BUFFER (1 << 4)
|
||||
#define CDC_ECM_DIRECTED_BYTES_XMIT (1 << 5)
|
||||
#define CDC_ECM_DIRECTED_FRAMES_XMIT (1 << 6)
|
||||
#define CDC_ECM_MULTICAST_BYTES_XMIT (1 << 7)
|
||||
#define CDC_ECM_MULTICAST_FRAMES_XMIT (1 << 8)
|
||||
#define CDC_ECM_BROADCAST_BYTES_XMIT (1 << 9)
|
||||
#define CDC_ECM_BROADCAST_FRAMES_XMIT (1 << 10)
|
||||
#define CDC_ECM_DIRECTED_BYTES_RCV (1 << 11)
|
||||
#define CDC_ECM_DIRECTED_FRAMES_RCV (1 << 12)
|
||||
#define CDC_ECM_MULTICAST_BYTES_RCV (1 << 13)
|
||||
#define CDC_ECM_MULTICAST_FRAMES_RCV (1 << 14)
|
||||
#define CDC_ECM_BROADCAST_BYTES_RCV (1 << 15)
|
||||
#define CDC_ECM_BROADCAST_FRAMES_RCV (1 << 16)
|
||||
#define CDC_ECM_RCV_CRC_ERROR (1 << 17)
|
||||
#define CDC_ECM_TRANSMIT_QUEUE_LENGTH (1 << 18)
|
||||
#define CDC_ECM_RCV_ERROR_ALIGNMENT (1 << 19)
|
||||
#define CDC_ECM_XMIT_ONE_COLLISION (1 << 20)
|
||||
#define CDC_ECM_XMIT_MORE_COLLISIONS (1 << 21)
|
||||
#define CDC_ECM_XMIT_DEFERRED (1 << 22)
|
||||
#define CDC_ECM_XMIT_MAX_COLLISIONS (1 << 23)
|
||||
#define CDC_ECM_RCV_OVERRUN (1 << 24)
|
||||
#define CDC_ECM_XMIT_UNDERRUN (1 << 25)
|
||||
#define CDC_ECM_XMIT_HEARTBEAT_FAILURE (1 << 26)
|
||||
#define CDC_ECM_XMIT_TIMES_CRS_LOST (1 << 27)
|
||||
#define CDC_ECM_XMIT_LATE_COLLISIONS (1 << 28)
|
||||
|
||||
#define CDC_ECM_MAC_STR_DESC (uint8_t *)"010202030000"
|
||||
#define CDC_ECM_MAC_ADDR0 0x00U /* 01 */
|
||||
#define CDC_ECM_MAC_ADDR1 0x02U /* 02 */
|
||||
#define CDC_ECM_MAC_ADDR2 0x02U /* 03 */
|
||||
#define CDC_ECM_MAC_ADDR3 0x03U /* 00 */
|
||||
#define CDC_ECM_MAC_ADDR4 0x00U /* 00 */
|
||||
#define CDC_ECM_MAC_ADDR5 0x00U /* 00 */
|
||||
|
||||
#define CDC_ECM_NET_DISCONNECTED 0x00U
|
||||
#define CDC_ECM_NET_CONNECTED 0x01U
|
||||
|
||||
#define CDC_ECM_ETH_STATS_RESERVED 0xE0U
|
||||
#define CDC_ECM_BMREQUEST_TYPE_ECM 0xA1U
|
||||
|
||||
#define CDC_ECM_CONNECT_SPEED_UPSTREAM 0x004C4B40U /* 5Mbps */
|
||||
#define CDC_ECM_CONNECT_SPEED_DOWNSTREAM 0x004C4B40U /* 5Mbps */
|
||||
|
||||
#define CDC_ECM_NOTIFY_CODE_NETWORK_CONNECTION 0x00
|
||||
#define CDC_ECM_NOTIFY_CODE_RESPONSE_AVAILABLE 0x01
|
||||
#define CDC_ECM_NOTIFY_CODE_CONNECTION_SPEED_CHANGE 0x2A
|
||||
|
||||
#define CDC_NCM_NTH16_SIGNATURE 0x484D434E
|
||||
#define CDC_NCM_NDP16_SIGNATURE_NCM0 0x304D434E
|
||||
#define CDC_NCM_NDP16_SIGNATURE_NCM1 0x314D434E
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
* Structures based on usbcdc11.pdf (www.usb.org)
|
||||
*----------------------------------------------------------------------------*/
|
||||
|
||||
/* Header functional descriptor */
|
||||
/* (usbcdc11.pdf, 5.2.3.1) */
|
||||
/* This header must precede any list of class-specific descriptors. */
|
||||
struct cdc_header_descriptor {
|
||||
uint8_t bFunctionLength; /* size of this descriptor in bytes */
|
||||
uint8_t bDescriptorType; /* CS_INTERFACE descriptor type */
|
||||
uint8_t bDescriptorSubtype; /* Header functional descriptor subtype */
|
||||
uint16_t bcdCDC; /* USB CDC specification release version */
|
||||
} __PACKED;
|
||||
|
||||
/* Call management functional descriptor */
|
||||
/* (usbcdc11.pdf, 5.2.3.2) */
|
||||
/* Describes the processing of calls for the communication class interface. */
|
||||
struct cdc_call_management_descriptor {
|
||||
uint8_t bFunctionLength; /* size of this descriptor in bytes */
|
||||
uint8_t bDescriptorType; /* CS_INTERFACE descriptor type */
|
||||
uint8_t bDescriptorSubtype; /* call management functional descriptor subtype */
|
||||
uint8_t bmCapabilities; /* capabilities that this configuration supports */
|
||||
uint8_t bDataInterface; /* interface number of the data class interface used for call management (optional) */
|
||||
} __PACKED;
|
||||
|
||||
/* Abstract control management functional descriptor */
|
||||
/* (usbcdc11.pdf, 5.2.3.3) */
|
||||
/* Describes the command supported by the communication interface class with the Abstract Control Model subclass code. */
|
||||
struct cdc_abstract_control_management_descriptor {
|
||||
uint8_t bFunctionLength; /* size of this descriptor in bytes */
|
||||
uint8_t bDescriptorType; /* CS_INTERFACE descriptor type */
|
||||
uint8_t bDescriptorSubtype; /* abstract control management functional descriptor subtype */
|
||||
uint8_t bmCapabilities; /* capabilities supported by this configuration */
|
||||
} __PACKED;
|
||||
|
||||
/* Union functional descriptors */
|
||||
/* (usbcdc11.pdf, 5.2.3.8) */
|
||||
/* Describes the relationship between a group of interfaces that can be considered to form a functional unit. */
|
||||
struct cdc_union_descriptor {
|
||||
uint8_t bFunctionLength; /* size of this descriptor in bytes */
|
||||
uint8_t bDescriptorType; /* CS_INTERFACE descriptor type */
|
||||
uint8_t bDescriptorSubtype; /* union functional descriptor subtype */
|
||||
uint8_t bMasterInterface; /* interface number designated as master */
|
||||
} __PACKED;
|
||||
|
||||
/* Union functional descriptors with one slave interface */
|
||||
/* (usbcdc11.pdf, 5.2.3.8) */
|
||||
struct cdc_union_1slave_descriptor {
|
||||
uint8_t bFunctionLength;
|
||||
uint8_t bDescriptorType;
|
||||
uint8_t bDescriptorSubtype;
|
||||
uint8_t bControlInterface;
|
||||
uint8_t bSubordinateInterface0;
|
||||
} __PACKED;
|
||||
|
||||
/* Line coding structure for GET_LINE_CODING / SET_LINE_CODING class requests*/
|
||||
/* Format of the data returned when a GetLineCoding request is received */
|
||||
/* (usbcdc11.pdf, 6.2.13) */
|
||||
struct cdc_line_coding {
|
||||
uint32_t dwDTERate; /* Data terminal rate in bits per second */
|
||||
uint8_t bCharFormat; /* Number of stop bits */
|
||||
uint8_t bParityType; /* Parity bit type */
|
||||
uint8_t bDataBits; /* Number of data bits */
|
||||
} __PACKED;
|
||||
|
||||
/** Data structure for the notification about SerialState */
|
||||
struct cdc_acm_notification {
|
||||
uint8_t bmRequestType;
|
||||
uint8_t bNotificationType;
|
||||
uint16_t wValue;
|
||||
uint16_t wIndex;
|
||||
uint16_t wLength;
|
||||
uint16_t data;
|
||||
} __PACKED;
|
||||
|
||||
/** Ethernet Networking Functional Descriptor */
|
||||
struct cdc_eth_descriptor {
|
||||
uint8_t bFunctionLength;
|
||||
uint8_t bDescriptorType;
|
||||
uint8_t bDescriptorSubtype;
|
||||
uint8_t iMACAddress;
|
||||
uint32_t bmEthernetStatistics;
|
||||
uint16_t wMaxSegmentSize;
|
||||
uint16_t wNumberMCFilters;
|
||||
uint8_t bNumberPowerFilters;
|
||||
} __PACKED;
|
||||
|
||||
struct cdc_eth_notification {
|
||||
uint8_t bmRequestType;
|
||||
uint8_t bNotificationType;
|
||||
uint16_t wValue;
|
||||
uint16_t wIndex;
|
||||
uint16_t wLength;
|
||||
uint8_t data[8];
|
||||
} __PACKED;
|
||||
|
||||
struct cdc_ncm_ntb_parameters {
|
||||
uint16_t wLength;
|
||||
uint16_t bmNtbFormatsSupported;
|
||||
uint32_t dwNtbInMaxSize;
|
||||
uint16_t wNdbInDivisor;
|
||||
uint16_t wNdbInPayloadRemainder;
|
||||
uint16_t wNdbInAlignment;
|
||||
uint16_t wReserved;
|
||||
uint32_t dwNtbOutMaxSize;
|
||||
uint16_t wNdbOutDivisor;
|
||||
uint16_t wNdbOutPayloadRemainder;
|
||||
uint16_t wNdbOutAlignment;
|
||||
uint16_t wNtbOutMaxDatagrams;
|
||||
};
|
||||
|
||||
struct cdc_ncm_nth16 {
|
||||
uint32_t dwSignature;
|
||||
uint16_t wHeaderLength;
|
||||
uint16_t wSequence;
|
||||
uint16_t wBlockLength;
|
||||
uint16_t wNdpIndex;
|
||||
};
|
||||
|
||||
struct cdc_ncm_ndp16_datagram {
|
||||
uint16_t wDatagramIndex;
|
||||
uint16_t wDatagramLength;
|
||||
};
|
||||
|
||||
struct cdc_ncm_ndp16 {
|
||||
uint32_t dwSignature;
|
||||
uint16_t wLength;
|
||||
uint16_t wNextNdpIndex;
|
||||
struct cdc_ncm_ndp16_datagram datagram[];
|
||||
};
|
||||
|
||||
/*Length of template descriptor: 66 bytes*/
|
||||
#define CDC_ACM_DESCRIPTOR_LEN (8 + 9 + 5 + 5 + 4 + 5 + 7 + 9 + 7 + 7)
|
||||
// clang-format off
|
||||
#define CDC_ACM_DESCRIPTOR_INIT(bFirstInterface, int_ep, out_ep, in_ep, wMaxPacketSize, str_idx) \
|
||||
/* Interface Associate */ \
|
||||
0x08, /* bLength */ \
|
||||
USB_DESCRIPTOR_TYPE_INTERFACE_ASSOCIATION, /* bDescriptorType */ \
|
||||
bFirstInterface, /* bFirstInterface */ \
|
||||
0x02, /* bInterfaceCount */ \
|
||||
USB_DEVICE_CLASS_CDC, /* bFunctionClass */ \
|
||||
CDC_ABSTRACT_CONTROL_MODEL, /* bFunctionSubClass */ \
|
||||
CDC_COMMON_PROTOCOL_AT_COMMANDS, /* bFunctionProtocol */ \
|
||||
0x00, /* iFunction */ \
|
||||
0x09, /* bLength */ \
|
||||
USB_DESCRIPTOR_TYPE_INTERFACE, /* bDescriptorType */ \
|
||||
bFirstInterface, /* bInterfaceNumber */ \
|
||||
0x00, /* bAlternateSetting */ \
|
||||
0x01, /* bNumEndpoints */ \
|
||||
USB_DEVICE_CLASS_CDC, /* bInterfaceClass */ \
|
||||
CDC_ABSTRACT_CONTROL_MODEL, /* bInterfaceSubClass */ \
|
||||
CDC_COMMON_PROTOCOL_AT_COMMANDS, /* bInterfaceProtocol */ \
|
||||
str_idx, /* iInterface */ \
|
||||
0x05, /* bLength */ \
|
||||
CDC_CS_INTERFACE, /* bDescriptorType */ \
|
||||
CDC_FUNC_DESC_HEADER, /* bDescriptorSubtype */ \
|
||||
WBVAL(CDC_V1_10), /* bcdCDC */ \
|
||||
0x05, /* bLength */ \
|
||||
CDC_CS_INTERFACE, /* bDescriptorType */ \
|
||||
CDC_FUNC_DESC_CALL_MANAGEMENT, /* bDescriptorSubtype */ \
|
||||
0x00, /* bmCapabilities */ \
|
||||
(uint8_t)(bFirstInterface + 1), /* bDataInterface */ \
|
||||
0x04, /* bLength */ \
|
||||
CDC_CS_INTERFACE, /* bDescriptorType */ \
|
||||
CDC_FUNC_DESC_ABSTRACT_CONTROL_MANAGEMENT, /* bDescriptorSubtype */ \
|
||||
0x02, /* bmCapabilities */ \
|
||||
0x05, /* bLength */ \
|
||||
CDC_CS_INTERFACE, /* bDescriptorType */ \
|
||||
CDC_FUNC_DESC_UNION, /* bDescriptorSubtype */ \
|
||||
bFirstInterface, /* bMasterInterface */ \
|
||||
(uint8_t)(bFirstInterface + 1), /* bSlaveInterface0 */ \
|
||||
0x07, /* bLength */ \
|
||||
USB_DESCRIPTOR_TYPE_ENDPOINT, /* bDescriptorType */ \
|
||||
int_ep, /* bEndpointAddress */ \
|
||||
0x03, /* bmAttributes */ \
|
||||
0x08, 0x00, /* wMaxPacketSize */ \
|
||||
0x0a, /* bInterval */ \
|
||||
0x09, /* bLength */ \
|
||||
USB_DESCRIPTOR_TYPE_INTERFACE, /* bDescriptorType */ \
|
||||
(uint8_t)(bFirstInterface + 1), /* bInterfaceNumber */ \
|
||||
0x00, /* bAlternateSetting */ \
|
||||
0x02, /* bNumEndpoints */ \
|
||||
CDC_DATA_INTERFACE_CLASS, /* bInterfaceClass */ \
|
||||
0x00, /* bInterfaceSubClass */ \
|
||||
0x00, /* bInterfaceProtocol */ \
|
||||
0x00, /* iInterface */ \
|
||||
0x07, /* bLength */ \
|
||||
USB_DESCRIPTOR_TYPE_ENDPOINT, /* bDescriptorType */ \
|
||||
out_ep, /* bEndpointAddress */ \
|
||||
0x02, /* bmAttributes */ \
|
||||
WBVAL(wMaxPacketSize), /* wMaxPacketSize */ \
|
||||
0x00, /* bInterval */ \
|
||||
0x07, /* bLength */ \
|
||||
USB_DESCRIPTOR_TYPE_ENDPOINT, /* bDescriptorType */ \
|
||||
in_ep, /* bEndpointAddress */ \
|
||||
0x02, /* bmAttributes */ \
|
||||
WBVAL(wMaxPacketSize), /* wMaxPacketSize */ \
|
||||
0x00 /* bInterval */
|
||||
// clang-format on
|
||||
|
||||
/*Length of template descriptor: 66 bytes*/
|
||||
#define CDC_RNDIS_DESCRIPTOR_LEN (8 + 9 + 5 + 5 + 4 + 5 + 7 + 9 + 7 + 7)
|
||||
// clang-format off
|
||||
#define CDC_RNDIS_DESCRIPTOR_INIT(bFirstInterface, int_ep, out_ep, in_ep, wMaxPacketSize, str_idx) \
|
||||
/* Interface Associate */ \
|
||||
0x08, /* bLength */ \
|
||||
USB_DESCRIPTOR_TYPE_INTERFACE_ASSOCIATION, /* bDescriptorType */ \
|
||||
bFirstInterface, /* bFirstInterface */ \
|
||||
0x02, /* bInterfaceCount */ \
|
||||
USB_DEVICE_CLASS_WIRELESS, /* bFunctionClass */ \
|
||||
CDC_DIRECT_LINE_CONTROL_MODEL, /* bFunctionSubClass */ \
|
||||
CDC_COMMON_PROTOCOL_AT_COMMANDS_PCCA_101_AND_ANNEXO, /* bFunctionProtocol */ \
|
||||
0x00, /* iFunction */ \
|
||||
0x09, /* bLength */ \
|
||||
USB_DESCRIPTOR_TYPE_INTERFACE, /* bDescriptorType */ \
|
||||
bFirstInterface, /* bInterfaceNumber */ \
|
||||
0x00, /* bAlternateSetting */ \
|
||||
0x01, /* bNumEndpoints */ \
|
||||
USB_DEVICE_CLASS_WIRELESS, /* bInterfaceClass */ \
|
||||
CDC_DIRECT_LINE_CONTROL_MODEL, /* bInterfaceSubClass */ \
|
||||
CDC_COMMON_PROTOCOL_AT_COMMANDS_PCCA_101_AND_ANNEXO, /* bInterfaceProtocol */ \
|
||||
str_idx, /* iInterface */ \
|
||||
0x05, /* bLength */ \
|
||||
CDC_CS_INTERFACE, /* bDescriptorType */ \
|
||||
CDC_FUNC_DESC_HEADER, /* bDescriptorSubtype */ \
|
||||
WBVAL(CDC_V1_10), /* bcdCDC */ \
|
||||
0x05, /* bLength */ \
|
||||
CDC_CS_INTERFACE, /* bDescriptorType */ \
|
||||
CDC_FUNC_DESC_CALL_MANAGEMENT, /* bDescriptorSubtype */ \
|
||||
0x00, /* bmCapabilities */ \
|
||||
(uint8_t)(bFirstInterface + 1), /* bDataInterface */ \
|
||||
0x04, /* bLength */ \
|
||||
CDC_CS_INTERFACE, /* bDescriptorType */ \
|
||||
CDC_FUNC_DESC_ABSTRACT_CONTROL_MANAGEMENT, /* bDescriptorSubtype */ \
|
||||
0x00, /* bmCapabilities */ \
|
||||
0x05, /* bLength */ \
|
||||
CDC_CS_INTERFACE, /* bDescriptorType */ \
|
||||
CDC_FUNC_DESC_UNION, /* bDescriptorSubtype */ \
|
||||
bFirstInterface, /* bMasterInterface */ \
|
||||
(uint8_t)(bFirstInterface + 1), /* bSlaveInterface0 */ \
|
||||
0x07, /* bLength */ \
|
||||
USB_DESCRIPTOR_TYPE_ENDPOINT, /* bDescriptorType */ \
|
||||
int_ep, /* bEndpointAddress */ \
|
||||
0x03, /* bmAttributes */ \
|
||||
0x08, 0x00, /* wMaxPacketSize */ \
|
||||
0x10, /* bInterval */ \
|
||||
0x09, /* bLength */ \
|
||||
USB_DESCRIPTOR_TYPE_INTERFACE, /* bDescriptorType */ \
|
||||
(uint8_t)(bFirstInterface + 1), /* bInterfaceNumber */ \
|
||||
0x00, /* bAlternateSetting */ \
|
||||
0x02, /* bNumEndpoints */ \
|
||||
CDC_DATA_INTERFACE_CLASS, /* bInterfaceClass */ \
|
||||
0x00, /* bInterfaceSubClass */ \
|
||||
0x00, /* bInterfaceProtocol */ \
|
||||
0x00, /* iInterface */ \
|
||||
0x07, /* bLength */ \
|
||||
USB_DESCRIPTOR_TYPE_ENDPOINT, /* bDescriptorType */ \
|
||||
out_ep, /* bEndpointAddress */ \
|
||||
0x02, /* bmAttributes */ \
|
||||
WBVAL(wMaxPacketSize), /* wMaxPacketSize */ \
|
||||
0x00, /* bInterval */ \
|
||||
0x07, /* bLength */ \
|
||||
USB_DESCRIPTOR_TYPE_ENDPOINT, /* bDescriptorType */ \
|
||||
in_ep, /* bEndpointAddress */ \
|
||||
0x02, /* bmAttributes */ \
|
||||
WBVAL(wMaxPacketSize), /* wMaxPacketSize */ \
|
||||
0x00 /* bInterval */
|
||||
// clang-format on
|
||||
|
||||
#define DBVAL_BE(x) ((x >> 24) & 0xFF), ((x >> 16) & 0xFF), ((x >> 8) & 0xFF), (x & 0xFF)
|
||||
|
||||
/*Length of template descriptor: 71 bytes*/
|
||||
#define CDC_ECM_DESCRIPTOR_LEN (8 + 9 + 5 + 5 + 13 + 7 + 9 + 7 + 7)
|
||||
// clang-format off
|
||||
#define CDC_ECM_DESCRIPTOR_INIT(bFirstInterface, int_ep, out_ep, in_ep, wMaxPacketSize, \
|
||||
eth_statistics, wMaxSegmentSize, wNumberMCFilters, bNumberPowerFilters, str_idx) \
|
||||
/* Interface Associate */ \
|
||||
0x08, /* bLength */ \
|
||||
USB_DESCRIPTOR_TYPE_INTERFACE_ASSOCIATION, /* bDescriptorType */ \
|
||||
bFirstInterface, /* bFirstInterface */ \
|
||||
0x02, /* bInterfaceCount */ \
|
||||
USB_DEVICE_CLASS_CDC, /* bFunctionClass */ \
|
||||
CDC_ETHERNET_NETWORKING_CONTROL_MODEL, /* bFunctionSubClass */ \
|
||||
CDC_COMMON_PROTOCOL_NONE, /* bFunctionProtocol */ \
|
||||
0x00, /* iFunction */ \
|
||||
0x09, /* bLength */ \
|
||||
USB_DESCRIPTOR_TYPE_INTERFACE, /* bDescriptorType */ \
|
||||
bFirstInterface, /* bInterfaceNumber */ \
|
||||
0x00, /* bAlternateSetting */ \
|
||||
0x01, /* bNumEndpoints */ \
|
||||
USB_DEVICE_CLASS_CDC, /* bInterfaceClass */ \
|
||||
CDC_ETHERNET_NETWORKING_CONTROL_MODEL, /* bInterfaceSubClass */ \
|
||||
CDC_COMMON_PROTOCOL_NONE, /* bInterfaceProtocol */ \
|
||||
str_idx, /* iInterface */ \
|
||||
0x05, /* bLength */ \
|
||||
CDC_CS_INTERFACE, /* bDescriptorType */ \
|
||||
CDC_FUNC_DESC_HEADER, /* bDescriptorSubtype */ \
|
||||
WBVAL(CDC_V1_10), /* bcdCDC */ \
|
||||
0x05, /* bLength */ \
|
||||
CDC_CS_INTERFACE, /* bDescriptorType */ \
|
||||
CDC_FUNC_DESC_UNION, /* bDescriptorSubtype */ \
|
||||
bFirstInterface, /* bMasterInterface */ \
|
||||
(uint8_t)(bFirstInterface + 1), /* bSlaveInterface0 */ \
|
||||
/* CDC_ECM Functional Descriptor */ \
|
||||
0x0D, /* bFunctionLength */\
|
||||
CDC_CS_INTERFACE, /* bDescriptorType: CS_INTERFACE */\
|
||||
CDC_FUNC_DESC_ETHERNET_NETWORKING, /* Ethernet Networking functional descriptor subtype */\
|
||||
str_idx, /* Device's MAC string index */\
|
||||
DBVAL_BE(eth_statistics), /* Ethernet statistics (bitmap) */\
|
||||
WBVAL(wMaxPacketSize),/* wMaxSegmentSize: Ethernet Maximum Segment size, typically 1514 bytes */\
|
||||
WBVAL(wNumberMCFilters), /* wNumberMCFilters: the number of multicast filters */\
|
||||
bNumberPowerFilters, /* bNumberPowerFilters: the number of wakeup power filters */\
|
||||
0x07, /* bLength */ \
|
||||
USB_DESCRIPTOR_TYPE_ENDPOINT, /* bDescriptorType */ \
|
||||
int_ep, /* bEndpointAddress */ \
|
||||
0x03, /* bmAttributes */ \
|
||||
0x10, 0x00, /* wMaxPacketSize */ \
|
||||
0x10, /* bInterval */ \
|
||||
0x09, /* bLength */ \
|
||||
USB_DESCRIPTOR_TYPE_INTERFACE, /* bDescriptorType */ \
|
||||
(uint8_t)(bFirstInterface + 1), /* bInterfaceNumber */ \
|
||||
0x00, /* bAlternateSetting */ \
|
||||
0x02, /* bNumEndpoints */ \
|
||||
CDC_DATA_INTERFACE_CLASS, /* bInterfaceClass */ \
|
||||
0x00, /* bInterfaceSubClass */ \
|
||||
0x00, /* bInterfaceProtocol */ \
|
||||
0x00, /* iInterface */ \
|
||||
0x07, /* bLength */ \
|
||||
USB_DESCRIPTOR_TYPE_ENDPOINT, /* bDescriptorType */ \
|
||||
out_ep, /* bEndpointAddress */ \
|
||||
0x02, /* bmAttributes */ \
|
||||
WBVAL(wMaxPacketSize), /* wMaxPacketSize */ \
|
||||
0x00, /* bInterval */ \
|
||||
0x07, /* bLength */ \
|
||||
USB_DESCRIPTOR_TYPE_ENDPOINT, /* bDescriptorType */ \
|
||||
in_ep, /* bEndpointAddress */ \
|
||||
0x02, /* bmAttributes */ \
|
||||
WBVAL(wMaxPacketSize), /* wMaxPacketSize */ \
|
||||
0x00 /* bInterval */
|
||||
// clang-format on
|
||||
|
||||
/*Length of template descriptor: 77 bytes*/
|
||||
#define CDC_NCM_DESCRIPTOR_LEN (8 + 9 + 5 + 5 + 13 + 6 + 7 + 9 + 7 + 7)
|
||||
// clang-format off
|
||||
#define CDC_NCM_DESCRIPTOR_INIT(bFirstInterface, int_ep, out_ep, in_ep, wMaxPacketSize, \
|
||||
eth_statistics, wMaxSegmentSize, wNumberMCFilters, bNumberPowerFilters, str_idx) \
|
||||
/* Interface Associate */ \
|
||||
0x08, /* bLength */ \
|
||||
USB_DESCRIPTOR_TYPE_INTERFACE_ASSOCIATION, /* bDescriptorType */ \
|
||||
bFirstInterface, /* bFirstInterface */ \
|
||||
0x02, /* bInterfaceCount */ \
|
||||
USB_DEVICE_CLASS_CDC, /* bFunctionClass */ \
|
||||
CDC_NETWORK_CONTROL_MODEL, /* bFunctionSubClass */ \
|
||||
CDC_COMMON_PROTOCOL_NONE, /* bFunctionProtocol */ \
|
||||
0x00, /* iFunction */ \
|
||||
0x09, /* bLength */ \
|
||||
USB_DESCRIPTOR_TYPE_INTERFACE, /* bDescriptorType */ \
|
||||
bFirstInterface, /* bInterfaceNumber */ \
|
||||
0x00, /* bAlternateSetting */ \
|
||||
0x01, /* bNumEndpoints */ \
|
||||
USB_DEVICE_CLASS_CDC, /* bInterfaceClass */ \
|
||||
CDC_NETWORK_CONTROL_MODEL, /* bInterfaceSubClass */ \
|
||||
CDC_COMMON_PROTOCOL_NONE, /* bInterfaceProtocol */ \
|
||||
str_idx, /* iInterface */ \
|
||||
0x05, /* bLength */ \
|
||||
CDC_CS_INTERFACE, /* bDescriptorType */ \
|
||||
CDC_FUNC_DESC_HEADER, /* bDescriptorSubtype */ \
|
||||
WBVAL(CDC_V1_10), /* bcdCDC */ \
|
||||
0x05, /* bLength */ \
|
||||
CDC_CS_INTERFACE, /* bDescriptorType */ \
|
||||
CDC_FUNC_DESC_UNION, /* bDescriptorSubtype */ \
|
||||
bFirstInterface, /* bMasterInterface */ \
|
||||
(uint8_t)(bFirstInterface + 1), /* bSlaveInterface0 */ \
|
||||
/* CDC ETH Functional Descriptor */ \
|
||||
0x0D, /* bFunctionLength */\
|
||||
CDC_CS_INTERFACE, /* bDescriptorType: CS_INTERFACE */\
|
||||
CDC_FUNC_DESC_ETHERNET_NETWORKING, /* Ethernet Networking functional descriptor subtype */\
|
||||
str_idx, /* Device's MAC string index */\
|
||||
DBVAL_BE(eth_statistics), /* Ethernet statistics (bitmap) */\
|
||||
WBVAL(wMaxPacketSize),/* wMaxSegmentSize: Ethernet Maximum Segment size, typically 1514 bytes */\
|
||||
WBVAL(wNumberMCFilters), /* wNumberMCFilters: the number of multicast filters */\
|
||||
bNumberPowerFilters, /* bNumberPowerFilters: the number of wakeup power filters */\
|
||||
0x06, \
|
||||
CDC_CS_INTERFACE, \
|
||||
CDC_FUNC_DESC_NCM, \
|
||||
0x00, 0x01, \
|
||||
0x23, \
|
||||
0x07, /* bLength */ \
|
||||
USB_DESCRIPTOR_TYPE_ENDPOINT, /* bDescriptorType */ \
|
||||
int_ep, /* bEndpointAddress */ \
|
||||
0x03, /* bmAttributes */ \
|
||||
0x10, 0x00, /* wMaxPacketSize */ \
|
||||
0x10, /* bInterval */ \
|
||||
0x09, /* bLength */ \
|
||||
USB_DESCRIPTOR_TYPE_INTERFACE, /* bDescriptorType */ \
|
||||
(uint8_t)(bFirstInterface + 1), /* bInterfaceNumber */ \
|
||||
0x00, /* bAlternateSetting */ \
|
||||
0x02, /* bNumEndpoints */ \
|
||||
CDC_DATA_INTERFACE_CLASS, /* bInterfaceClass */ \
|
||||
0x00, /* bInterfaceSubClass */ \
|
||||
0x00, /* bInterfaceProtocol */ \
|
||||
0x00, /* iInterface */ \
|
||||
0x07, /* bLength */ \
|
||||
USB_DESCRIPTOR_TYPE_ENDPOINT, /* bDescriptorType */ \
|
||||
out_ep, /* bEndpointAddress */ \
|
||||
0x02, /* bmAttributes */ \
|
||||
WBVAL(wMaxPacketSize), /* wMaxPacketSize */ \
|
||||
0x00, /* bInterval */ \
|
||||
0x07, /* bLength */ \
|
||||
USB_DESCRIPTOR_TYPE_ENDPOINT, /* bDescriptorType */ \
|
||||
in_ep, /* bEndpointAddress */ \
|
||||
0x02, /* bmAttributes */ \
|
||||
WBVAL(wMaxPacketSize), /* wMaxPacketSize */ \
|
||||
0x00 /* bInterval */
|
||||
// clang-format on
|
||||
|
||||
#endif /* USB_CDC_H */
|
||||
@@ -0,0 +1,118 @@
|
||||
/*
|
||||
* Copyright (c) 2022, sakumisu
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
#include "usbd_core.h"
|
||||
#include "usbd_cdc.h"
|
||||
|
||||
const char *stop_name[] = { "1", "1.5", "2" };
|
||||
const char *parity_name[] = { "N", "O", "E", "M", "S" };
|
||||
|
||||
static int cdc_acm_class_interface_request_handler(uint8_t busid, struct usb_setup_packet *setup, uint8_t **data, uint32_t *len)
|
||||
{
|
||||
USB_LOG_DBG("CDC Class request: "
|
||||
"bRequest 0x%02x\r\n",
|
||||
setup->bRequest);
|
||||
|
||||
struct cdc_line_coding line_coding;
|
||||
bool dtr, rts;
|
||||
uint8_t intf_num = LO_BYTE(setup->wIndex);
|
||||
|
||||
switch (setup->bRequest) {
|
||||
case CDC_REQUEST_SET_LINE_CODING:
|
||||
|
||||
/*******************************************************************************/
|
||||
/* Line Coding Structure */
|
||||
/*-----------------------------------------------------------------------------*/
|
||||
/* Offset | Field | Size | Value | Description */
|
||||
/* 0 | dwDTERate | 4 | Number |Data terminal rate, in bits per second*/
|
||||
/* 4 | bCharFormat | 1 | Number | Stop bits */
|
||||
/* 0 - 1 Stop bit */
|
||||
/* 1 - 1.5 Stop bits */
|
||||
/* 2 - 2 Stop bits */
|
||||
/* 5 | bParityType | 1 | Number | Parity */
|
||||
/* 0 - None */
|
||||
/* 1 - Odd */
|
||||
/* 2 - Even */
|
||||
/* 3 - Mark */
|
||||
/* 4 - Space */
|
||||
/* 6 | bDataBits | 1 | Number Data bits (5, 6, 7, 8 or 16). */
|
||||
/*******************************************************************************/
|
||||
memcpy(&line_coding, *data, setup->wLength);
|
||||
USB_LOG_DBG("Set intf:%d linecoding <%d %d %s %s>\r\n",
|
||||
intf_num,
|
||||
line_coding.dwDTERate,
|
||||
line_coding.bDataBits,
|
||||
parity_name[line_coding.bParityType],
|
||||
stop_name[line_coding.bCharFormat]);
|
||||
|
||||
usbd_cdc_acm_set_line_coding(busid, intf_num, &line_coding);
|
||||
break;
|
||||
|
||||
case CDC_REQUEST_SET_CONTROL_LINE_STATE:
|
||||
dtr = (setup->wValue & 0x0001);
|
||||
rts = (setup->wValue & 0x0002);
|
||||
USB_LOG_DBG("Set intf:%d DTR 0x%x,RTS 0x%x\r\n",
|
||||
intf_num,
|
||||
dtr,
|
||||
rts);
|
||||
usbd_cdc_acm_set_dtr(busid, intf_num, dtr);
|
||||
usbd_cdc_acm_set_rts(busid, intf_num, rts);
|
||||
break;
|
||||
|
||||
case CDC_REQUEST_GET_LINE_CODING:
|
||||
usbd_cdc_acm_get_line_coding(busid, intf_num, &line_coding);
|
||||
memcpy(*data, &line_coding, 7);
|
||||
*len = 7;
|
||||
USB_LOG_DBG("Get intf:%d linecoding %d %d %d %d\r\n",
|
||||
intf_num,
|
||||
line_coding.dwDTERate,
|
||||
line_coding.bCharFormat,
|
||||
line_coding.bParityType,
|
||||
line_coding.bDataBits);
|
||||
break;
|
||||
case CDC_REQUEST_SEND_BREAK:
|
||||
usbd_cdc_acm_send_break(busid, intf_num);
|
||||
break;
|
||||
default:
|
||||
USB_LOG_WRN("Unhandled CDC Class bRequest 0x%02x\r\n", setup->bRequest);
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
struct usbd_interface *usbd_cdc_acm_init_intf(uint8_t busid, struct usbd_interface *intf)
|
||||
{
|
||||
intf->class_interface_handler = cdc_acm_class_interface_request_handler;
|
||||
intf->class_endpoint_handler = NULL;
|
||||
intf->vendor_handler = NULL;
|
||||
intf->notify_handler = NULL;
|
||||
|
||||
return intf;
|
||||
}
|
||||
|
||||
__WEAK void usbd_cdc_acm_set_line_coding(uint8_t busid, uint8_t intf, struct cdc_line_coding *line_coding)
|
||||
{
|
||||
}
|
||||
|
||||
__WEAK void usbd_cdc_acm_get_line_coding(uint8_t busid, uint8_t intf, struct cdc_line_coding *line_coding)
|
||||
{
|
||||
line_coding->dwDTERate = 2000000;
|
||||
line_coding->bDataBits = 8;
|
||||
line_coding->bParityType = 0;
|
||||
line_coding->bCharFormat = 0;
|
||||
}
|
||||
|
||||
__WEAK void usbd_cdc_acm_set_dtr(uint8_t busid, uint8_t intf, bool dtr)
|
||||
{
|
||||
}
|
||||
|
||||
__WEAK void usbd_cdc_acm_set_rts(uint8_t busid, uint8_t intf, bool rts)
|
||||
{
|
||||
}
|
||||
|
||||
__WEAK void usbd_cdc_acm_send_break(uint8_t busid, uint8_t intf)
|
||||
{
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
/*
|
||||
* Copyright (c) 2022, sakumisu
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
#ifndef USBD_CDC_H
|
||||
#define USBD_CDC_H
|
||||
|
||||
#include "usb_cdc.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* Init cdc acm interface driver */
|
||||
struct usbd_interface *usbd_cdc_acm_init_intf(uint8_t busid, struct usbd_interface *intf);
|
||||
|
||||
/* Setup request command callback api */
|
||||
void usbd_cdc_acm_set_line_coding(uint8_t busid, uint8_t intf, struct cdc_line_coding *line_coding);
|
||||
void usbd_cdc_acm_get_line_coding(uint8_t busid, uint8_t intf, struct cdc_line_coding *line_coding);
|
||||
void usbd_cdc_acm_set_dtr(uint8_t busid, uint8_t intf, bool dtr);
|
||||
void usbd_cdc_acm_set_rts(uint8_t busid, uint8_t intf, bool rts);
|
||||
void usbd_cdc_acm_send_break(uint8_t busid, uint8_t intf);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* USBD_CDC_H */
|
||||
@@ -0,0 +1,585 @@
|
||||
/*
|
||||
* Copyright (c) 2022, sakumisu
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
#ifndef USB_HID_H
|
||||
#define USB_HID_H
|
||||
|
||||
/* Subclass codes (HID 4.2) */
|
||||
#define HID_SUBCLASS_NONE 0 /* No subclass */
|
||||
#define HID_SUBCLASS_BOOTIF 1 /* Boot Interface Subclass */
|
||||
|
||||
/* HID Protocol Codes (HID 4.3) */
|
||||
#define HID_PROTOCOL_NONE 0x00
|
||||
#define HID_PROTOCOL_BOOT 0x00
|
||||
#define HID_PROTOCOL_KEYBOARD 0x01
|
||||
#define HID_PROTOCOL_REPORT 0x01
|
||||
#define HID_PROTOCOL_MOUSE 0x02
|
||||
|
||||
/* HID Class Descriptor Types (HID 7.1) */
|
||||
#define HID_DESCRIPTOR_TYPE_HID 0x21
|
||||
#define HID_DESCRIPTOR_TYPE_HID_REPORT 0x22
|
||||
#define HID_DESCRIPTOR_TYPE_HID_PHYSICAL 0x23
|
||||
|
||||
/* HID Class Specific Requests (HID 7.2) */
|
||||
#define HID_REQUEST_GET_REPORT 0x01
|
||||
#define HID_REQUEST_GET_IDLE 0x02
|
||||
#define HID_REQUEST_GET_PROTOCOL 0x03
|
||||
#define HID_REQUEST_SET_REPORT 0x09
|
||||
#define HID_REQUEST_SET_IDLE 0x0A
|
||||
#define HID_REQUEST_SET_PROTOCOL 0x0B
|
||||
|
||||
/* Report Type (MS byte of wValue for GET_REPORT) (HID 7.2.1) */
|
||||
#define HID_REPORT_INPUT 0x01
|
||||
#define HID_REPORT_OUTPUT 0x02
|
||||
#define HID_REPORT_FEATURE 0x03
|
||||
|
||||
/* HID Descriptor ***********************************************************/
|
||||
|
||||
#define HID_COUNTRY_NONE 0x00 /* Not Supported */
|
||||
#define HID_COUNTRY_ARABIC 0x01 /* Arabic */
|
||||
#define HID_COUNTRY_BELGIAN 0x02 /* Belgian */
|
||||
#define HID_COUNTRY_CANADA 0x03 /* Canadian-Bilingual */
|
||||
#define HID_COUNTRY_CANADRFR 0x04 /* Canadian-French */
|
||||
#define HID_COUNTRY_CZECH 0x05 /* Czech Republic */
|
||||
#define HID_COUNTRY_DANISH 0x06 /* Danish */
|
||||
#define HID_COUNTRY_FINNISH 0x07 /* Finnish */
|
||||
#define HID_COUNTRY_FRENCH 0x08 /* French */
|
||||
#define HID_COUNTRY_GERMAN 0x09 /* German */
|
||||
#define HID_COUNTRY_GREEK 0x10 /* Greek */
|
||||
#define HID_COUNTRY_HEBREW 0x11 /* Hebrew */
|
||||
#define HID_COUNTRY_HUNGARY 0x12 /* Hungary */
|
||||
#define HID_COUNTRY_ISO 0x13 /* International (ISO) */
|
||||
#define HID_COUNTRY_ITALIAN 0x14 /* Italian */
|
||||
#define HID_COUNTRY_JAPAN 0x15 /* Japan (Katakana) */
|
||||
#define HID_COUNTRY_KOREAN 0x16 /* Korean */
|
||||
#define HID_COUNTRY_LATINAM 0x17 /* Latin American */
|
||||
#define HID_COUNTRY_DUTCH 0x18 /* Netherlands/Dutch */
|
||||
#define HID_COUNTRY_NORWEGIAN 0x19 /* Norwegian */
|
||||
#define HID_COUNTRY_PERSIAN 0x20 /* Persian (Farsi) */
|
||||
#define HID_COUNTRY_POLAND 0x21 /* Poland */
|
||||
#define HID_COUNTRY_PORTUGUESE 0x22 /* Portuguese */
|
||||
#define HID_COUNTRY_RUSSIA 0x23 /* Russia */
|
||||
#define HID_COUNTRY_SLOVAKIA 0x24 /* Slovakia */
|
||||
#define HID_COUNTRY_SPANISH 0x25 /* Spanish */
|
||||
#define HID_COUNTRY_SWEDISH 0x26 /* Swedish */
|
||||
#define HID_COUNTRY_SWISSFR 0x27 /* Swiss/French */
|
||||
#define HID_COUNTRY_SWISSGR 0x28 /* Swiss/German */
|
||||
#define HID_COUNTRY_SWITZERLAND 0x29 /* Switzerland */
|
||||
#define HID_COUNTRY_TAIWAN 0x30 /* Taiwan */
|
||||
#define HID_COUNTRY_TURKISHQ 0x31 /* Turkish-Q */
|
||||
#define HID_COUNTRY_UK 0x32 /* UK */
|
||||
#define HID_COUNTRY_US 0x33 /* US */
|
||||
#define HID_COUNTRY_YUGOSLAVIA 0x34 /* Yugoslavia */
|
||||
#define HID_COUNTRY_TURKISHF 0x35 /* Turkish-F */
|
||||
|
||||
/* HID report items */
|
||||
#define HID_REPORT_ITEM_SIZE_MASK 0x03
|
||||
#define HID_REPORT_ITEM_SIZE_0 0x00 /* No data follows */
|
||||
#define HID_REPORT_ITEM_SIZE_1 0x01 /* 1 byte of data follows */
|
||||
#define HID_REPORT_ITEM_SIZE_2 0x02 /* 2 bytes of data follow */
|
||||
#define HID_REPORT_ITEM_SIZE_4 0x03 /* 4 bytes of data follow */
|
||||
#define HID_REPORT_ITEM_TYPE_MASK 0x0c
|
||||
#define HID_REPORT_ITEM_TYPE_MAIN 0x00
|
||||
#define HID_REPORT_ITEM_TYPE_GLOBAL 0x04
|
||||
#define HID_REPORT_ITEM_TYPE_LOCAL 0x08
|
||||
#define HID_REPORT_ITEM_TAG_MASK 0xf0
|
||||
|
||||
/* Main Items (HID 6.2.2.4) */
|
||||
#define HID_MAIN_ITEM_CONSTANT (1 << 0) /* Constant(1) vs Data(0) */
|
||||
#define HID_MAIN_ITEM_VARIABLE (1 << 1) /* Variable(1) vs Array(0) */
|
||||
#define HID_MAIN_ITEM_RELATIVE (1 << 2) /* Relative(1) vs Absolute(0) */
|
||||
#define HID_MAIN_ITEM_WRAP (1 << 3) /* Wrap(1) vs No Wrap(0) */
|
||||
#define HID_MAIN_ITEM_NONLINEAR (1 << 4) /* Non Linear(1) vs Linear(0) */
|
||||
#define HID_MAIN_ITEM_NOPREFERRED (1 << 5) /* No Preferred (1) vs Preferred State(0) */
|
||||
#define HID_MAIN_ITEM_NULLSTATE (1 << 6) /* Null state(1) vs No Null position(0) */
|
||||
#define HID_MAIN_ITEM_VOLATILE (1 << 7) /* Volatile(1) vs Non volatile(0) */
|
||||
#define HID_MAIN_ITEM_BUFFEREDBYTES (1 << 8) /* Buffered Bytes(1) vs Bit Field(0) */
|
||||
|
||||
#define HID_MAIN_ITEM_SIZE(pfx) ((pfx)&HID_REPORT_ITEM_SIZE_MASK)
|
||||
#define HID_MAIN_ITEM_INPUT_PREFIX 0x80
|
||||
#define HID_MAIN_ITEM_INPUT_CONSTANT HID_MAIN_ITEM_CONSTANT
|
||||
#define HID_MAIN_ITEM_INPUT_VARIABLE HID_MAIN_ITEM_VARIABLE
|
||||
#define HID_MAIN_ITEM_INPUT_RELATIVE HID_MAIN_ITEM_RELATIVE
|
||||
#define HID_MAIN_ITEM_INPUT_WRAP HID_MAIN_ITEM_WRAP
|
||||
#define HID_MAIN_ITEM_INPUT_NONLINEAR HID_MAIN_ITEM_NONLINEAR
|
||||
#define HID_MAIN_ITEM_INPUT_NOPREFERRED HID_MAIN_ITEM_NOPREFERRED
|
||||
#define HID_MAIN_ITEM_INPUT_NULLSTATE HID_MAIN_ITEM_NULLSTATE
|
||||
#define HID_MAIN_ITEM_INPUT_BUFFEREDBYTES HID_MAIN_ITEM_BUFFEREDBYTES
|
||||
|
||||
#define HID_MAIN_ITEM_OUTPUT_PREFIX 0x90
|
||||
#define HID_MAIN_ITEM_OUTPUT_CONSTANT HID_MAIN_ITEM_CONSTANT
|
||||
#define HID_MAIN_ITEM_OUTPUT_VARIABLE HID_MAIN_ITEM_VARIABLE
|
||||
#define HID_MAIN_ITEM_OUTPUT_RELATIVE HID_MAIN_ITEM_RELATIVE
|
||||
#define HID_MAIN_ITEM_OUTPUT_WRAP HID_MAIN_ITEM_WRAP
|
||||
#define HID_MAIN_ITEM_OUTPUT_NONLINEAR HID_MAIN_ITEM_NONLINEAR
|
||||
#define HID_MAIN_ITEM_OUTPUT_NOPREFERRED HID_MAIN_ITEM_NOPREFERRED
|
||||
#define HID_MAIN_ITEM_OUTPUT_NULLSTATE HID_MAIN_ITEM_NULLSTATE
|
||||
#define HID_MAIN_ITEM_OUTPUT_VOLATILE HID_MAIN_ITEM_VOLATILE
|
||||
#define HID_MAIN_ITEM_OUTPUT_BUFFEREDBYTES HID_MAIN_ITEM_BUFFEREDBYTES
|
||||
|
||||
#define HID_MAIN_ITEM_FEATURE_PREFIX 0xb0
|
||||
#define HID_MAIN_ITEM_FEATURE_CONSTANT HID_MAIN_ITEM_CONSTANT
|
||||
#define HID_MAIN_ITEM_FEATURE_VARIABLE HID_MAIN_ITEM_VARIABLE
|
||||
#define HID_MAIN_ITEM_FEATURE_RELATIVE HID_MAIN_ITEM_RELATIVE
|
||||
#define HID_MAIN_ITEM_FEATURE_WRAP HID_MAIN_ITEM_WRAP
|
||||
#define HID_MAIN_ITEM_FEATURE_NONLINEAR HID_MAIN_ITEM_NONLINEAR
|
||||
#define HID_MAIN_ITEM_FEATURE_NOPREFERRED HID_MAIN_ITEM_NOPREFERRED
|
||||
#define HID_MAIN_ITEM_FEATURE_NULLSTATE HID_MAIN_ITEM_NULLSTATE
|
||||
#define HID_MAIN_ITEM_FEATURE_VOLATILE HID_MAIN_ITEM_VOLATILE
|
||||
#define HID_MAIN_ITEM_FEATURE_BUFFEREDBYTES HID_MAIN_ITEM_BUFFEREDBYTES
|
||||
|
||||
#define HID_MAIN_ITEM_COLLECTION_PREFIX 0xa0
|
||||
#define HID_MAIN_ITEM_COLLECTION_PHYSICAL 0x00 /* Physical (group of axes) */
|
||||
#define HID_MAIN_ITEM_COLLECTION_APPL 0x01 /* Application (mouse, keyboard) */
|
||||
#define HID_MAIN_ITEM_COLLECTION_LOGICAL 0x02 /* Logical (interrelated data) */
|
||||
#define HID_MAIN_ITEM_COLLECTION_REPORT 0x03 /* Report */
|
||||
#define HID_MAIN_ITEM_COLLECTION_ARRAY 0x04 /* Named Array */
|
||||
#define HID_MAIN_ITEM_COLLECTION_SWITCH 0x05 /* Usage Switch */
|
||||
#define HID_MAIN_ITEM_COLLECTION_MODIFIER 0x06 /* Usage Modifier */
|
||||
#define HID_MAIN_ITEM_ENDCOLLECTION_PREFIX 0xc0
|
||||
|
||||
/* Global Items (HID 6.2.2.7) */
|
||||
#define HID_GLOBAL_ITEM_SIZE(pfx) ((pfx)&HID_REPORT_ITEM_SIZE_MASK)
|
||||
#define HID_GLOBAL_ITEM_USAGEPAGE_PREFIX 0x04 /* Usage Page */
|
||||
#define HID_GLOBAL_ITEM_LOGICALMIN_PREFIX 0x14 /* Logical Minimum */
|
||||
#define HID_GLOBAL_ITEM_LOGICALMAX_PREFIX 0x24 /* Logical Maximum */
|
||||
#define HID_GLOBAL_ITEM_PHYSICALMIN_PREFIX 0x34 /* Physical Minimum */
|
||||
#define HID_GLOBAL_ITEM_PHYSMICALAX_PREFIX 0x44 /* Physical Maximum */
|
||||
#define HID_GLOBAL_ITEM_UNITEXP_PREFIX 0x54 /* Unit Exponent */
|
||||
#define HID_GLOBAL_ITEM_UNIT_PREFIX 0x64 /* Unit */
|
||||
#define HID_GLOBAL_ITEM_REPORTSIZE_PREFIX 0x74 /* Report Size */
|
||||
#define HID_GLOBAL_ITEM_REPORTID_PREFIX 0x84 /* Report ID */
|
||||
#define HID_GLOBAL_ITEM_REPORTCOUNT_PREFIX 0x94 /* Report Count */
|
||||
#define HID_GLOBAL_ITEM_PUSH_PREFIX 0xa4 /* Push */
|
||||
#define HID_GLOBAL_ITEM_POP_PREFIX 0xb4 /* Pop */
|
||||
|
||||
/* Local Items (HID 6.2.2.8) */
|
||||
#define HID_LOCAL_ITEM_SIZE(pfx) ((pfx)&HID_REPORT_ITEM_SIZE_MASK)
|
||||
#define HID_LOCAL_ITEM_USAGE_PREFIX 0x08 /* Usage */
|
||||
#define HID_LOCAL_ITEM_USAGEMIN_PREFIX 0x18 /* Usage Minimum */
|
||||
#define HID_LOCAL_ITEM_USAGEMAX_PREFIX 0x28 /* Usage Maximum */
|
||||
#define HID_LOCAL_ITEM_DESIGNATORIDX_PREFIX 0x38 /* Designator Index */
|
||||
#define HID_LOCAL_ITEM_DESIGNATORMIN_PREFIX 0x48 /* Designator Minimum */
|
||||
#define HID_LOCAL_ITEM_DESIGNATORMAX_PREFIX 0x58 /* Designator Maximum */
|
||||
#define HID_LOCAL_ITEM_STRINGIDX_PREFIX 0x78 /* String Index */
|
||||
#define HID_LOCAL_ITEM_STRINGMIN_PREFIX 0x88 /* String Minimum */
|
||||
#define HID_LOCAL_ITEM_STRINGMAX_PREFIX 0x98 /* xx */
|
||||
#define HID_LOCAL_ITEM_DELIMITER_PREFIX 0xa8 /* Delimiter */
|
||||
|
||||
/* Modifier Keys (HID 8.3) */
|
||||
#define HID_MODIFER_LCTRL (1 << 0) /* Left Ctrl */
|
||||
#define HID_MODIFER_LSHIFT (1 << 1) /* Left Shift */
|
||||
#define HID_MODIFER_LALT (1 << 2) /* Left Alt */
|
||||
#define HID_MODIFER_LGUI (1 << 3) /* Left GUI */
|
||||
#define HID_MODIFER_RCTRL (1 << 4) /* Right Ctrl */
|
||||
#define HID_MODIFER_RSHIFT (1 << 5) /* Right Shift */
|
||||
#define HID_MODIFER_RALT (1 << 6) /* Right Alt */
|
||||
#define HID_MODIFER_RGUI (1 << 7) /* Right GUI */
|
||||
|
||||
/* Keyboard output report (1 byte) (HID B.1) */
|
||||
#define HID_KBD_OUTPUT_REPORT_NUMLOCK (1 << 0)
|
||||
#define HID_KBD_OUTPUT_REPORT_CAPSLOCK (1 << 1)
|
||||
#define HID_KBD_OUTPUT_REPORT_SCROLLLOCK (1 << 2)
|
||||
#define HID_KBD_OUTPUT_REPORT_COMPOSE (1 << 3)
|
||||
#define HID_KBD_OUTPUT_REPORT_KANA (1 << 4)
|
||||
|
||||
/* Mouse input report (HID B.2) */
|
||||
#define HID_MOUSE_INPUT_REPORT_BUTTON1 (1 << 0)
|
||||
#define HID_MOUSE_INPUT_REPORT_BUTTON2 (1 << 1)
|
||||
#define HID_MOUSE_INPUT_REPORT_BUTTON3 (1 << 2)
|
||||
#define HID_MOUSE_INPUT_REPORT_BUTTON_MASK (7)
|
||||
|
||||
#define HID_MOUSE_INPUT_BUTTON_LEFT (1 << 0)
|
||||
#define HID_MOUSE_INPUT_BUTTON_RIGHT (1 << 1)
|
||||
#define HID_MOUSE_INPUT_BUTTON_MIDDLE (1 << 2)
|
||||
#define HID_MOUSE_INPUT_BUTTON_BACKWARD (1 << 3)
|
||||
#define HID_MOUSE_INPUT_BUTTON_FORWARD (1 << 4)
|
||||
|
||||
/* Joystick input report (4 bytes) (HID D.1) */
|
||||
#define HID_JS_INPUT_REPORT_HATSWITCH_SHIFT (0)
|
||||
#define HID_JS_INPUT_REPORT_HATSWITCH_MASK (15 << HID_JSIN_HATSWITCH_SHIFT)
|
||||
#define HID_JS_INPUT_REPORT_BUTTON1 (1 << 4)
|
||||
#define HID_JS_INPUT_REPORT_BUTTON2 (1 << 5)
|
||||
#define HID_JS_INPUT_REPORT_BUTTON3 (1 << 6)
|
||||
#define HID_JS_INPUT_REPORT_BUTTON4 (1 << 7)
|
||||
|
||||
/* Usage pages (HuT 3) */
|
||||
#define HID_USAGE_PAGE_UNDEFINED 0x00 /* Undefined */
|
||||
#define HID_USAGE_PAGE_GENERIC_DCTRL 0x01 /* Generic Desktop Controls */
|
||||
#define HID_USAGE_PAGE_SIMCTRL 0x02 /* Simulation Controls */
|
||||
#define HID_USAGE_PAGE_VRCTRL 0x03 /* VR Controls */
|
||||
#define HID_USAGE_PAGE_SPORTCTRL 0x04 /* Sport Controls */
|
||||
#define HID_USAGE_PAGE_GAMECTRL 0x05 /* Game Controls */
|
||||
#define HID_USAGE_PAGE_GENERIC_DEVCTRL 0x06 /* Generic Device Controls */
|
||||
#define HID_USAGE_PAGE_KBD 0x07 /* Keyboard/Keypad */
|
||||
#define HID_USAGE_PAGE_LEDS 0x08 /* LEDs */
|
||||
#define HID_USAGE_PAGE_BUTTON 0x09 /* Button */
|
||||
#define HID_USAGE_PAGE_ORDINAL 0x0a /* Ordinal */
|
||||
#define HID_USAGE_PAGE_TELEPHONY 0x0b /* Telephony */
|
||||
#define HID_USAGE_PAGE_CONSUMER 0x0c /* Consumer */
|
||||
#define HID_USAGE_PAGE_DIGITIZER 0x0d /* Digitizer */
|
||||
/* 0x0e Reserved */
|
||||
#define HID_USAGE_PAGE_PIDPAGE 0x0f /* PID Page Physical Interface Device */
|
||||
#define HID_USAGE_PAGE_UNICODE 0x10 /* Unicode */
|
||||
/* 0x11-13 Reserved */
|
||||
#define HID_USAGE_PAGE_ALPHA_DISPLAY 0x14 /* Alphanumeric Display */
|
||||
/* 0x15-3f Reserved */
|
||||
#define HID_USAGE_PAGE_MEDICAL 0x40 /* Medical Instruments */
|
||||
/* 0x41-7f Reserved */
|
||||
/* 0x80-83 Monitor Devices */
|
||||
/* 0x84-87 Power Devices */
|
||||
/* 0x88-8b Reserved */
|
||||
#define HID_USAGE_PAGE_BARCODE_SCANNER 0x8c /* Bar Code Scanner page */
|
||||
#define HID_USAGE_PAGE_SCALE 0x8d /* Scale page */
|
||||
#define HID_USAGE_PAGE_MSR 0x8e /* Magnetic Stripe Reading (MSR) Devices */
|
||||
#define HID_USAGE_PAGE_POS 0x8f /* Point of Sale devices */
|
||||
#define HID_USAGE_PAGE_CAMERA_CTRL 0x90 /* Camera Control Page */
|
||||
|
||||
/* Generic Desktop Page Usage IDs (HuT 4) */
|
||||
#define HID_DESKTOP_USAGE_UNDEFINED 0x00 /* Undefined */
|
||||
#define HID_DESKTOP_USAGE_POINTER 0x01 /* Pointer */
|
||||
#define HID_DESKTOP_USAGE_MOUSE 0x02 /* Mouse */
|
||||
/* 0x03 Reserved */
|
||||
#define HID_DESKTOP_USAGE_JOYSTICK 0x04 /* Joystick */
|
||||
#define HID_DESKTOP_USAGE_GAMEPAD 0x05 /* Game Pad */
|
||||
#define HID_DESKTOP_USAGE_KEYBOARD 0x06 /* Keyboard */
|
||||
#define HID_DESKTOP_USAGE_KEYPAD 0x07 /* Keypad */
|
||||
#define HID_DESKTOP_USAGE_MULTIAXIS 0x08 /* Multi-axis Controller */
|
||||
#define HID_DESKTOP_USAGE_TABLET 0x09 /* Tablet PC System Controls */
|
||||
/* 0x0a-2f Reserved */
|
||||
#define HID_DESKTOP_USAGE_X 0x30 /* X */
|
||||
#define HID_DESKTOP_USAGE_Y 0x31 /* Y */
|
||||
#define HID_DESKTOP_USAGE_Z 0x32 /* Z */
|
||||
#define HID_DESKTOP_USAGE_RX 0x33 /* Rx */
|
||||
#define HID_DESKTOP_USAGE_RY 0x34 /* Ry */
|
||||
#define HID_DESKTOP_USAGE_RZ 0x35 /* Rz */
|
||||
#define HID_DESKTOP_USAGE_SLIDER 0x36 /* Slider */
|
||||
#define HID_DESKTOP_USAGE_DIAL 0x37 /* Dial */
|
||||
#define HID_DESKTOP_USAGE_WHEEL 0x38 /* Wheel */
|
||||
#define HID_DESKTOP_USAGE_HATSWITCH 0x39 /* Hat switch */
|
||||
#define HID_DESKTOP_USAGE_COUNTED 0x3a /* Counted Buffer */
|
||||
#define HID_DESKTOP_USAGE_BYTECOUNT 0x3b /* Byte Count */
|
||||
#define HID_DESKTOP_USAGE_MOTION 0x3c /* Motion Wakeup */
|
||||
#define HID_DESKTOP_USAGE_START 0x3d /* Start */
|
||||
#define HID_DESKTOP_USAGE_SELECT 0x3e /* Select */
|
||||
/* 0x3f Reserved */
|
||||
#define HID_DESKTOP_USAGE_VX 0x40 /* Vx */
|
||||
#define HID_DESKTOP_USAGE_VY 0x41 /* Vy */
|
||||
#define HID_DESKTOP_USAGE_VZ 0x42 /* Vz */
|
||||
#define HID_DESKTOP_USAGE_VBRX 0x43 /* Vbrx */
|
||||
#define HID_DESKTOP_USAGE_VBRY 0x44 /* Vbry */
|
||||
#define HID_DESKTOP_USAGE_VBRZ 0x45 /* Vbrz */
|
||||
#define HID_DESKTOP_USAGE_VNO 0x46 /* Vno */
|
||||
#define HID_DESKTOP_USAGE_FEATURE 0x47 /* Feature Notification */
|
||||
#define HID_DESKTOP_USAGE_RESOLUTION 0x48 /* Resolution Multiplier */
|
||||
/* 0x49-7f Reserved */
|
||||
#define HID_DESKTOP_USAGE_CONTROL 0x80 /* System Control */
|
||||
#define HID_DESKTOP_USAGE_POWERDOWN 0x81 /* System Power Down */
|
||||
#define HID_DESKTOP_USAGE_SLEEP 0x82 /* System Sleep */
|
||||
#define HID_DESKTOP_USAGE_WAKEUP 0x83 /* System Wake Up */
|
||||
#define HID_DESKTOP_USAGE_CONTEXT_MENU 0x84 /* System Context Menu */
|
||||
#define HID_DESKTOP_USAGE_MAIN_MENU 0x85 /* System Main Menu */
|
||||
#define HID_DESKTOP_USAGE_APP_MENU 0x86 /* System App Menu */
|
||||
#define HID_DESKTOP_USAGE_MENU_HELP 0x87 /* System Menu Help */
|
||||
#define HID_DESKTOP_USAGE_MENU_EXIT 0x88 /* System Menu Exit */
|
||||
#define HID_DESKTOP_USAGE_MENU_SELECT 0x89 /* System Menu Select */
|
||||
#define HID_DESKTOP_USAGE_MENU_RIGHT 0x8a /* System Menu Right */
|
||||
#define HID_DESKTOP_USAGE_MENU_LEFT 0x8b /* System Menu Left */
|
||||
#define HID_DESKTOP_USAGE_MENU_UP 0x8c /* System Menu Up */
|
||||
#define HID_DESKTOP_USAGE_MENU_DOWN 0x8d /* System Menu Down */
|
||||
#define HID_DESKTOP_USAGE_COLD_RESTART 0x8e /* System Cold Restart */
|
||||
#define HID_DESKTOP_USAGE_WARM_RESTART 0x8f /* System Warm Restart */
|
||||
#define HID_DESKTOP_USAGE_DPAD_UP 0x90 /* D-pad Up */
|
||||
#define HID_DESKTOP_USAGE_DPAD_DOWN 0x91 /* D-pad Down */
|
||||
#define HID_DESKTOP_USAGE_DPAD_RIGHT 0x92 /* D-pad Right */
|
||||
#define HID_DESKTOP_USAGE_DPAD_LEFT 0x93 /* D-pad Left */
|
||||
/* 0x94-9f Reserved */
|
||||
#define HID_DESKTOP_USAGE_DOCK 0xa0 /* System Dock */
|
||||
#define HID_DESKTOP_USAGE_UNDOCK 0xa1 /* System Undock */
|
||||
#define HID_DESKTOP_USAGE_SETUP 0xa2 /* System Setup */
|
||||
#define HID_DESKTOP_USAGE_BREAK 0xa3 /* System Break */
|
||||
#define HID_DESKTOP_USAGE_DEBUG_BREAK 0xa4 /* System Debugger Break */
|
||||
#define HID_DESKTOP_USAGE_APP_BREAK 0xa5 /* Application Break */
|
||||
#define HID_DESKTOP_USAGE_APP_DEBUG_BREAK 0xa6 /* Application Debugger Break */
|
||||
#define HID_DESKTOP_USAGE_MUTE 0xa7 /* System Speaker Mute */
|
||||
#define HID_DESKTOP_USAGE_HIBERNATE 0xa8 /* System Hibernate */
|
||||
/* 0xa9-af Reserved */
|
||||
#define HID_DESKTOP_USAGE_DISPLAY_INVERT 0xb0 /* System Display Invert */
|
||||
#define HID_DESKTOP_USAGE_DISPALY_INTERNAL 0xb1 /* System Display Internal */
|
||||
#define HID_DESKTOP_USAGE_DISPLAY_EXTERNAL 0xb2 /* System Display External */
|
||||
#define HID_DESKTOP_USAGE_DISPLAY_BOTH 0xb3 /* System Display Both */
|
||||
#define HID_DESKTOP_USAGE_DISPLAY_DUAL 0xb4 /* System Display Dual */
|
||||
#define HID_DESKTOP_USAGE_DISPLAY_TOGGLE 0xb5 /* System Display Toggle Int/Ext */
|
||||
#define HID_DESKTOP_USAGE_DISPLAY_SWAP 0xb6 /* System Display Swap */
|
||||
#define HID_DESKTOP_USAGE_ 0xb7 /* System Display LCD Autoscale */
|
||||
/* 0xb8-ffff Reserved */
|
||||
|
||||
/* Keyboard usage IDs (HuT 10) */
|
||||
#define HID_KBD_USAGE_NONE 0x00 /* Reserved (no event indicated) */
|
||||
#define HID_KBD_USAGE_ERRORROLLOVER 0x01 /* Keyboard ErrorRollOver */
|
||||
#define HID_KBD_USAGE_POSTFAIL 0x02 /* Keyboard POSTFail */
|
||||
#define HID_KBD_USAGE_ERRUNDEF 0x03 /* Keyboard ErrorUndefined */
|
||||
#define HID_KBD_USAGE_A 0x04 /* Keyboard a or A (B-Z follow) */
|
||||
#define HID_KBD_USAGE_1 0x1e /* Keyboard 1 (2-9 follow) */
|
||||
#define HID_KBD_USAGE_EXCLAM 0x1e /* Keyboard 1 and ! */
|
||||
#define HID_KBD_USAGE_AT 0x1f /* Keyboard 2 and @ */
|
||||
#define HID_KBD_USAGE_POUND 0x20 /* Keyboard 3 and # */
|
||||
#define HID_KBD_USAGE_DOLLAR 0x21 /* Keyboard 4 and $ */
|
||||
#define HID_KBD_USAGE_PERCENT 0x22 /* Keyboard 5 and % */
|
||||
#define HID_KBD_USAGE_CARAT 0x23 /* Keyboard 6 and ^ */
|
||||
#define HID_KBD_USAGE_AMPERSAND 0x24 /* Keyboard 7 and & */
|
||||
#define HID_KBD_USAGE_ASTERISK 0x25 /* Keyboard 8 and * */
|
||||
#define HID_KBD_USAGE_LPAREN 0x26 /* Keyboard 9 and ( */
|
||||
#define HID_KBD_USAGE_0 0x27 /* Keyboard 0 and ) */
|
||||
#define HID_KBD_USAGE_RPAREN 0x27 /* Keyboard 0 and ) */
|
||||
#define HID_KBD_USAGE_ENTER 0x28 /* Keyboard Return (ENTER) */
|
||||
#define HID_KBD_USAGE_ESCAPE 0x29 /* Keyboard ESCAPE */
|
||||
#define HID_KBD_USAGE_DELETE 0x2a /* Keyboard DELETE (Backspace) */
|
||||
#define HID_KBD_USAGE_TAB 0x2b /* Keyboard Tab */
|
||||
#define HID_KBD_USAGE_SPACE 0x2c /* Keyboard Spacebar */
|
||||
#define HID_KBD_USAGE_HYPHEN 0x2d /* Keyboard - and (underscore) */
|
||||
#define HID_KBD_USAGE_UNDERSCORE 0x2d /* Keyboard - and (underscore) */
|
||||
#define HID_KBD_USAGE_EQUAL 0x2e /* Keyboard = and + */
|
||||
#define HID_KBD_USAGE_PLUS 0x2e /* Keyboard = and + */
|
||||
#define HID_KBD_USAGE_LBRACKET 0x2f /* Keyboard [ and { */
|
||||
#define HID_KBD_USAGE_LBRACE 0x2f /* Keyboard [ and { */
|
||||
#define HID_KBD_USAGE_RBRACKET 0x30 /* Keyboard ] and } */
|
||||
#define HID_KBD_USAGE_RBRACE 0x30 /* Keyboard ] and } */
|
||||
#define HID_KBD_USAGE_BSLASH 0x31 /* Keyboard \ and | */
|
||||
#define HID_KBD_USAGE_VERTBAR 0x31 /* Keyboard \ and | */
|
||||
#define HID_KBD_USAGE_NONUSPOUND 0x32 /* Keyboard Non-US # and ~ */
|
||||
#define HID_KBD_USAGE_TILDE 0x32 /* Keyboard Non-US # and ~ */
|
||||
#define HID_KBD_USAGE_SEMICOLON 0x33 /* Keyboard ; and : */
|
||||
#define HID_KBD_USAGE_COLON 0x33 /* Keyboard ; and : */
|
||||
#define HID_KBD_USAGE_SQUOTE 0x34 /* Keyboard ' and " */
|
||||
#define HID_KBD_USAGE_DQUOUTE 0x34 /* Keyboard ' and " */
|
||||
#define HID_KBD_USAGE_GACCENT 0x35 /* Keyboard Grave Accent and Tilde */
|
||||
#define HID_KBD_USAGE_GTILDE 0x35 /* Keyboard Grave Accent and Tilde */
|
||||
#define HID_KBD_USAGE_COMMON 0x36 /* Keyboard , and < */
|
||||
#define HID_KBD_USAGE_LT 0x36 /* Keyboard , and < */
|
||||
#define HID_KBD_USAGE_PERIOD 0x37 /* Keyboard . and > */
|
||||
#define HID_KBD_USAGE_GT 0x37 /* Keyboard . and > */
|
||||
#define HID_KBD_USAGE_DIV 0x38 /* Keyboard / and ? */
|
||||
#define HID_KBD_USAGE_QUESTION 0x38 /* Keyboard / and ? */
|
||||
#define HID_KBD_USAGE_CAPSLOCK 0x39 /* Keyboard Caps Lock */
|
||||
#define HID_KBD_USAGE_F1 0x3a /* Keyboard F1 */
|
||||
#define HID_KBD_USAGE_F2 0x3b /* Keyboard F2 */
|
||||
#define HID_KBD_USAGE_F3 0x3c /* Keyboard F3 */
|
||||
#define HID_KBD_USAGE_F4 0x3d /* Keyboard F4 */
|
||||
#define HID_KBD_USAGE_F5 0x3e /* Keyboard F5 */
|
||||
#define HID_KBD_USAGE_F6 0x3f /* Keyboard F6 */
|
||||
#define HID_KBD_USAGE_F7 0x40 /* Keyboard F7 */
|
||||
#define HID_KBD_USAGE_F8 0x41 /* Keyboard F8 */
|
||||
#define HID_KBD_USAGE_F9 0x42 /* Keyboard F9 */
|
||||
#define HID_KBD_USAGE_F10 0x43 /* Keyboard F10 */
|
||||
#define HID_KBD_USAGE_F11 0x44 /* Keyboard F11 */
|
||||
#define HID_KBD_USAGE_F12 0x45 /* Keyboard F12 */
|
||||
#define HID_KBD_USAGE_PRINTSCN 0x46 /* Keyboard PrintScreen */
|
||||
#define HID_KBD_USAGE_SCROLLLOCK 0x47 /* Keyboard Scroll Lock */
|
||||
#define HID_KBD_USAGE_PAUSE 0x48 /* Keyboard Pause */
|
||||
#define HID_KBD_USAGE_INSERT 0x49 /* Keyboard Insert */
|
||||
#define HID_KBD_USAGE_HOME 0x4a /* Keyboard Home */
|
||||
#define HID_KBD_USAGE_PAGEUP 0x4b /* Keyboard PageUp */
|
||||
#define HID_KBD_USAGE_DELFWD 0x4c /* Keyboard Delete Forward */
|
||||
#define HID_KBD_USAGE_END 0x4d /* Keyboard End */
|
||||
#define HID_KBD_USAGE_PAGEDOWN 0x4e /* Keyboard PageDown */
|
||||
#define HID_KBD_USAGE_RIGHT 0x4f /* eyboard RightArrow */
|
||||
#define HID_KBD_USAGE_LEFT 0x50 /* Keyboard LeftArrow */
|
||||
#define HID_KBD_USAGE_DOWN 0x51 /* Keyboard DownArrow */
|
||||
#define HID_KBD_USAGE_UP 0x52 /* Keyboard UpArrow */
|
||||
#define HID_KBD_USAGE_KPDNUMLOCK 0x53 /* Keypad Num Lock and Clear */
|
||||
#define HID_KBD_USAGE_KPDNUMLOCKCLEAR 0x53 /* Keypad Num Lock and Clear */
|
||||
#define HID_KBD_USAGE_KPDDIV 0x54 /* Keypad / */
|
||||
#define HID_KBD_USAGE_KPDMUL 0x55 /* Keypad * */
|
||||
#define HID_KBD_USAGE_KPDHMINUS 0x56 /* Keypad - */
|
||||
#define HID_KBD_USAGE_KPDPLUS 0x57 /* Keypad + */
|
||||
#define HID_KBD_USAGE_KPDEMTER 0x58 /* Keypad ENTER */
|
||||
#define HID_KBD_USAGE_KPD1 0x59 /* Keypad 1 (2-9 follow) */
|
||||
#define HID_KBD_USAGE_KPDEND 0x59 /* Keypad 1 and End */
|
||||
#define HID_KBD_USAGE_KPDDOWN 0x5a /* Keypad 2 and Down Arrow */
|
||||
#define HID_KBD_USAGE_KPDPAGEDN 0x5b /* Keypad 3 and PageDn */
|
||||
#define HID_KBD_USAGE_KPDLEFT 0x5c /* Keypad 4 and Left Arrow */
|
||||
#define HID_KBD_USAGE_KPDRIGHT 0x5e /* Keypad 6 and Right Arrow */
|
||||
#define HID_KBD_USAGE_KPDHOME 0x5f /* Keypad 7 and Home */
|
||||
#define HID_KBD_USAGE_KPDUP 0x60 /* Keypad 8 and Up Arrow */
|
||||
#define HID_KBD_USAGE_KPDPAGEUP 0x61 /* Keypad 9 and PageUp */
|
||||
#define HID_KBD_USAGE_KPD0 0x62 /* Keypad 0 and Insert */
|
||||
#define HID_KBD_USAGE_KPDINSERT 0x62 /* Keypad 0 and Insert */
|
||||
#define HID_KBD_USAGE_KPDDECIMALPT 0x63 /* Keypad . and Delete */
|
||||
#define HID_KBD_USAGE_KPDDELETE 0x63 /* Keypad . and Delete */
|
||||
#define HID_KBD_USAGE_NONSLASH 0x64 /* Keyboard Non-US \ and | */
|
||||
#define HID_KBD_USAGE_NONUSVERT 0x64 /* Keyboard Non-US \ and | */
|
||||
#define HID_KBD_USAGE_APPLICATION 0x65 /* Keyboard Application */
|
||||
#define HID_KBD_USAGE_POWER 0x66 /* Keyboard Power */
|
||||
#define HID_KBD_USAGE_KPDEQUAL 0x67 /* Keypad = */
|
||||
#define HID_KBD_USAGE_F13 0x68 /* Keyboard F13 */
|
||||
#define HID_KBD_USAGE_F14 0x69 /* Keyboard F14 */
|
||||
#define HID_KBD_USAGE_F15 0x6a /* Keyboard F15 */
|
||||
#define HID_KBD_USAGE_F16 0x6b /* Keyboard F16 */
|
||||
#define HID_KBD_USAGE_F17 0x6c /* Keyboard F17 */
|
||||
#define HID_KBD_USAGE_F18 0x6d /* Keyboard F18 */
|
||||
#define HID_KBD_USAGE_F19 0x6e /* Keyboard F19 */
|
||||
#define HID_KBD_USAGE_F20 0x6f /* Keyboard F20 */
|
||||
#define HID_KBD_USAGE_F21 0x70 /* Keyboard F21 */
|
||||
#define HID_KBD_USAGE_F22 0x71 /* Keyboard F22 */
|
||||
#define HID_KBD_USAGE_F23 0x72 /* Keyboard F23 */
|
||||
#define HID_KBD_USAGE_F24 0x73 /* Keyboard F24 */
|
||||
#define HID_KBD_USAGE_EXECUTE 0x74 /* Keyboard Execute */
|
||||
#define HID_KBD_USAGE_HELP 0x75 /* Keyboard Help */
|
||||
#define HID_KBD_USAGE_MENU 0x76 /* Keyboard Menu */
|
||||
#define HID_KBD_USAGE_SELECT 0x77 /* Keyboard Select */
|
||||
#define HID_KBD_USAGE_STOP 0x78 /* Keyboard Stop */
|
||||
#define HID_KBD_USAGE_AGAIN 0x79 /* Keyboard Again */
|
||||
#define HID_KBD_USAGE_UNDO 0x7a /* Keyboard Undo */
|
||||
#define HID_KBD_USAGE_CUT 0x7b /* Keyboard Cut */
|
||||
#define HID_KBD_USAGE_COPY 0x7c /* Keyboard Copy */
|
||||
#define HID_KBD_USAGE_PASTE 0x7d /* Keyboard Paste */
|
||||
#define HID_KBD_USAGE_FIND 0x7e /* Keyboard Find */
|
||||
#define HID_KBD_USAGE_MUTE 0x7f /* Keyboard Mute */
|
||||
#define HID_KBD_USAGE_VOLUP 0x80 /* Keyboard Volume Up */
|
||||
#define HID_KBD_USAGE_VOLDOWN 0x81 /* Keyboard Volume Down */
|
||||
#define HID_KBD_USAGE_LCAPSLOCK 0x82 /* Keyboard Locking Caps Lock */
|
||||
#define HID_KBD_USAGE_LNUMLOCK 0x83 /* Keyboard Locking Num Lock */
|
||||
#define HID_KBD_USAGE_LSCROLLLOCK 0x84 /* Keyboard Locking Scroll Lock */
|
||||
#define HID_KBD_USAGE_KPDCOMMA 0x85 /* Keypad Comma */
|
||||
#define HID_KBD_USAGE_KPDEQUALSIGN 0x86 /* Keypad Equal Sign */
|
||||
#define HID_KBD_USAGE_INTERNATIONAL1 0x87 /* Keyboard International 1 */
|
||||
#define HID_KBD_USAGE_INTERNATIONAL2 0x88 /* Keyboard International 2 */
|
||||
#define HID_KBD_USAGE_INTERNATIONAL3 0x89 /* Keyboard International 3 */
|
||||
#define HID_KBD_USAGE_INTERNATIONAL4 0x8a /* Keyboard International 4 */
|
||||
#define HID_KBD_USAGE_INTERNATIONAL5 0x8b /* Keyboard International 5 */
|
||||
#define HID_KBD_USAGE_INTERNATIONAL6 0x8c /* Keyboard International 6 */
|
||||
#define HID_KBD_USAGE_INTERNATIONAL7 0x8d /* Keyboard International 7 */
|
||||
#define HID_KBD_USAGE_INTERNATIONAL8 0x8e /* Keyboard International 8 */
|
||||
#define HID_KBD_USAGE_INTERNATIONAL9 0x8f /* Keyboard International 9 */
|
||||
#define HID_KBD_USAGE_LANG1 0x90 /* Keyboard LANG1 */
|
||||
#define HID_KBD_USAGE_LANG2 0x91 /* Keyboard LANG2 */
|
||||
#define HID_KBD_USAGE_LANG3 0x92 /* Keyboard LANG3 */
|
||||
#define HID_KBD_USAGE_LANG4 0x93 /* Keyboard LANG4 */
|
||||
#define HID_KBD_USAGE_LANG5 0x94 /* Keyboard LANG5 */
|
||||
#define HID_KBD_USAGE_LANG6 0x95 /* Keyboard LANG6 */
|
||||
#define HID_KBD_USAGE_LANG7 0x96 /* Keyboard LANG7 */
|
||||
#define HID_KBD_USAGE_LANG8 0x97 /* Keyboard LANG8 */
|
||||
#define HID_KBD_USAGE_LANG9 0x98 /* Keyboard LANG9 */
|
||||
#define HID_KBD_USAGE_ALTERASE 0x99 /* Keyboard Alternate Erase */
|
||||
#define HID_KBD_USAGE_SYSREQ 0x9a /* Keyboard SysReq/Attention */
|
||||
#define HID_KBD_USAGE_CANCEL 0x9b /* Keyboard Cancel */
|
||||
#define HID_KBD_USAGE_CLEAR 0x9c /* Keyboard Clear */
|
||||
#define HID_KBD_USAGE_PRIOR 0x9d /* Keyboard Prior */
|
||||
#define HID_KBD_USAGE_RETURN 0x9e /* Keyboard Return */
|
||||
#define HID_KBD_USAGE_SEPARATOR 0x9f /* Keyboard Separator */
|
||||
#define HID_KBD_USAGE_OUT 0xa0 /* Keyboard Out */
|
||||
#define HID_KBD_USAGE_OPER 0xa1 /* Keyboard Oper */
|
||||
#define HID_KBD_USAGE_CLEARAGAIN 0xa2 /* Keyboard Clear/Again */
|
||||
#define HID_KBD_USAGE_CLRSEL 0xa3 /* Keyboard CrSel/Props */
|
||||
#define HID_KBD_USAGE_EXSEL 0xa4 /* Keyboard ExSel */
|
||||
#define HID_KBD_USAGE_KPD00 0xb0 /* Keypad 00 */
|
||||
#define HID_KBD_USAGE_KPD000 0xb1 /* Keypad 000 */
|
||||
#define HID_KBD_USAGE_THOUSEPARATOR 0xb2 /* Thousands Separator */
|
||||
#define HID_KBD_USAGE_DECSEPARATOR 0xb3 /* Decimal Separator */
|
||||
#define HID_KBD_USAGE_CURRUNIT 0xb4 /* Currency Unit */
|
||||
#define HID_KBD_USAGE_CURRSUBUNIT 0xb5 /* Currency Sub-unit */
|
||||
#define HID_KBD_USAGE_KPDLPAREN 0xb6 /* Keypad ( */
|
||||
#define HID_KBD_USAGE_KPDRPAREN 0xb7 /* Keypad ) */
|
||||
#define HID_KBD_USAGE_KPDLBRACE 0xb8 /* Keypad { */
|
||||
#define HID_KBD_USAGE_KPDRBRACE 0xb9 /* Keypad } */
|
||||
#define HID_KBD_USAGE_KPDTAB 0xba /* Keypad Tab */
|
||||
#define HID_KBD_USAGE_KPDBACKSPACE 0xbb /* Keypad Backspace */
|
||||
#define HID_KBD_USAGE_KPDA 0xbc /* Keypad A (B-F follow) */
|
||||
#define HID_KBD_USAGE_KPDXOR 0xc2 /* Keypad XOR */
|
||||
#define HID_KBD_USAGE_KPDEXP 0xc3 /* Keypad ^ */
|
||||
#define HID_KBD_USAGE_KPDPERCENT 0xc4 /* Keypad % */
|
||||
#define HID_KBD_USAGE_KPDLT 0xc5 /* Keypad < */
|
||||
#define HID_KBD_USAGE_KPDGT 0xc6 /* Keypad > */
|
||||
#define HID_KBD_USAGE_KPDAMPERSAND 0xc7 /* Keypad & */
|
||||
#define HID_KBD_USAGE_KPDAND 0xc8 /* Keypad && */
|
||||
#define HID_KBD_USAGE_KPDVERT 0xc9 /* Keypad | */
|
||||
#define HID_KBD_USAGE_KPDOR 0xca /* Keypad || */
|
||||
#define HID_KBD_USAGE_KPDCOLON 0xcb /* Keypad : */
|
||||
#define HID_KBD_USAGE_KPDPOUND 0xcc /* Keypad # */
|
||||
#define HID_KBD_USAGE_KPDSPACE 0xcd /* Keypad Space */
|
||||
#define HID_KBD_USAGE_KPDAT 0xce /* Keypad @ */
|
||||
#define HID_KBD_USAGE_KPDEXCLAM 0xcf /* Keypad ! */
|
||||
#define HID_KBD_USAGE_KPDMEMSTORE 0xd0 /* Keypad Memory Store */
|
||||
#define HID_KBD_USAGE_KPDMEMRECALL 0xd1 /* Keypad Memory Recall */
|
||||
#define HID_KBD_USAGE_KPDMEMCLEAR 0xd2 /* Keypad Memory Clear */
|
||||
#define HID_KBD_USAGE_KPDMEMADD 0xd3 /* Keypad Memory Add */
|
||||
#define HID_KBD_USAGE_KPDMEMSUB 0xd4 /* Keypad Memory Subtract */
|
||||
#define HID_KBD_USAGE_KPDMEMMULT 0xd5 /* Keypad Memory Multiply */
|
||||
#define HID_KBD_USAGE_KPDMEMDIV 0xd6 /* Keypad Memory Divide */
|
||||
#define HID_KBD_USAGE_KPDPLUSMINUS 0xd7 /* Keypad +/- */
|
||||
#define HID_KBD_USAGE_KPDCLEAR 0xd8 /* Keypad Clear */
|
||||
#define HID_KBD_USAGE_KPDCLEARENTRY 0xd9 /* Keypad Clear Entry */
|
||||
#define HID_KBD_USAGE_KPDBINARY 0xda /* Keypad Binary */
|
||||
#define HID_KBD_USAGE_KPDOCTAL 0xdb /* Keypad Octal */
|
||||
#define HID_KBD_USAGE_KPDDECIMAL 0xdc /* Keypad Decimal */
|
||||
#define HID_KBD_USAGE_KPDHEXADECIMAL 0xdd /* Keypad Hexadecimal */
|
||||
#define HID_KBD_USAGE_LCTRL 0xe0 /* Keyboard LeftControl */
|
||||
#define HID_KBD_USAGE_LSHIFT 0xe1 /* Keyboard LeftShift */
|
||||
#define HID_KBD_USAGE_LALT 0xe2 /* Keyboard LeftAlt */
|
||||
#define HID_KBD_USAGE_LGUI 0xe3 /* Keyboard Left GUI */
|
||||
#define HID_KBD_USAGE_RCTRL 0xe4 /* Keyboard RightControl */
|
||||
#define HID_KBD_USAGE_RSHIFT 0xe5 /* Keyboard RightShift */
|
||||
#define HID_KBD_USAGE_RALT 0xe6 /* Keyboard RightAlt */
|
||||
#define HID_KBD_USAGE_RGUI 0xe7 /* Keyboard Right GUI */
|
||||
|
||||
#define HID_KBD_USAGE_MAX 0xe7
|
||||
|
||||
/* HID Report Definitions */
|
||||
struct usb_hid_class_subdescriptor {
|
||||
uint8_t bDescriptorType;/* Class descriptor type (See 7.1) */
|
||||
uint16_t wDescriptorLength;/* Size of the report descriptor */
|
||||
} __PACKED;
|
||||
|
||||
struct usb_hid_descriptor {
|
||||
uint8_t bLength; /* Size of the HID descriptor */
|
||||
uint8_t bDescriptorType;/* HID descriptor type */
|
||||
uint16_t bcdHID;/* HID class specification release */
|
||||
uint8_t bCountryCode;/* Country code */
|
||||
uint8_t bNumDescriptors;/* Number of descriptors (>=1) */
|
||||
|
||||
/*
|
||||
* Specification says at least one Class Descriptor needs to
|
||||
* be present (Report Descriptor).
|
||||
*/
|
||||
struct usb_hid_class_subdescriptor subdesc[1];
|
||||
} __PACKED;
|
||||
|
||||
/* Standard Reports *********************************************************/
|
||||
|
||||
/* Keyboard input report (8 bytes) (HID B.1) */
|
||||
struct usb_hid_kbd_report
|
||||
{
|
||||
uint8_t modifier; /* Modifier keys. See HID_MODIFER_* definitions */
|
||||
uint8_t reserved;
|
||||
uint8_t key[6]; /* Keycode 1-6 */
|
||||
};
|
||||
|
||||
/* Keyboard output report (1 byte) (HID B.1),
|
||||
* see USBHID_KBDOUT_* definitions
|
||||
*/
|
||||
|
||||
/* Mouse input report (HID B.2) */
|
||||
struct usb_hid_mouse_report
|
||||
{
|
||||
uint8_t buttons; /* See HID_MOUSE_INPUT_BUTTON_* definitions */
|
||||
uint8_t xdisp; /* X displacement */
|
||||
uint8_t ydisp; /* y displacement */
|
||||
/* Device specific additional bytes may follow */
|
||||
#ifdef CONFIG_INPUT_MOUSE_WHEEL
|
||||
uint8_t wdisp; /* Wheel displacement */
|
||||
#endif
|
||||
};
|
||||
|
||||
/* Joystick input report (1 bytes) (HID D.1) */
|
||||
struct usb_hid_js_report
|
||||
{
|
||||
uint8_t xpos; /* X position */
|
||||
uint8_t ypos; /* X position */
|
||||
uint8_t buttons; /* See USBHID_JSIN_* definitions */
|
||||
uint8_t throttle; /* Throttle */
|
||||
};
|
||||
|
||||
#endif /* USB_HID_H */
|
||||
@@ -0,0 +1,89 @@
|
||||
/*
|
||||
* Copyright (c) 2022, sakumisu
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
#include "usbd_core.h"
|
||||
#include "usbd_hid.h"
|
||||
|
||||
static int hid_class_interface_request_handler(uint8_t busid, struct usb_setup_packet *setup, uint8_t **data, uint32_t *len)
|
||||
{
|
||||
USB_LOG_DBG("HID Class request: "
|
||||
"bRequest 0x%02x\r\n",
|
||||
setup->bRequest);
|
||||
|
||||
uint8_t intf_num = LO_BYTE(setup->wIndex);
|
||||
|
||||
switch (setup->bRequest) {
|
||||
case HID_REQUEST_GET_REPORT:
|
||||
/* report id ,report type */
|
||||
usbd_hid_get_report(busid, intf_num, LO_BYTE(setup->wValue), HI_BYTE(setup->wValue), data, len);
|
||||
break;
|
||||
case HID_REQUEST_GET_IDLE:
|
||||
(*data)[0] = usbd_hid_get_idle(busid, intf_num, LO_BYTE(setup->wValue));
|
||||
*len = 1;
|
||||
break;
|
||||
case HID_REQUEST_GET_PROTOCOL:
|
||||
(*data)[0] = usbd_hid_get_protocol(busid, intf_num);
|
||||
*len = 1;
|
||||
break;
|
||||
case HID_REQUEST_SET_REPORT:
|
||||
/* report id ,report type, report, report len */
|
||||
usbd_hid_set_report(busid, intf_num, LO_BYTE(setup->wValue), HI_BYTE(setup->wValue), *data, *len);
|
||||
break;
|
||||
case HID_REQUEST_SET_IDLE:
|
||||
/* report id, duration */
|
||||
usbd_hid_set_idle(busid, intf_num, LO_BYTE(setup->wValue), HI_BYTE(setup->wValue));
|
||||
break;
|
||||
case HID_REQUEST_SET_PROTOCOL:
|
||||
/* protocol */
|
||||
usbd_hid_set_protocol(busid, intf_num, LO_BYTE(setup->wValue));
|
||||
break;
|
||||
|
||||
default:
|
||||
USB_LOG_WRN("Unhandled HID Class bRequest 0x%02x\r\n", setup->bRequest);
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
struct usbd_interface *usbd_hid_init_intf(uint8_t busid, struct usbd_interface *intf, const uint8_t *desc, uint32_t desc_len)
|
||||
{
|
||||
intf->class_interface_handler = hid_class_interface_request_handler;
|
||||
intf->class_endpoint_handler = NULL;
|
||||
intf->vendor_handler = NULL;
|
||||
intf->notify_handler = NULL;
|
||||
|
||||
intf->hid_report_descriptor = desc;
|
||||
intf->hid_report_descriptor_len = desc_len;
|
||||
return intf;
|
||||
}
|
||||
|
||||
__WEAK void usbd_hid_get_report(uint8_t busid, uint8_t intf, uint8_t report_id, uint8_t report_type, uint8_t **data, uint32_t *len)
|
||||
{
|
||||
(*data[0]) = 0;
|
||||
*len = 1;
|
||||
}
|
||||
|
||||
__WEAK uint8_t usbd_hid_get_idle(uint8_t busid, uint8_t intf, uint8_t report_id)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
__WEAK uint8_t usbd_hid_get_protocol(uint8_t busid, uint8_t intf)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
__WEAK void usbd_hid_set_report(uint8_t busid, uint8_t intf, uint8_t report_id, uint8_t report_type, uint8_t *report, uint32_t report_len)
|
||||
{
|
||||
}
|
||||
|
||||
__WEAK void usbd_hid_set_idle(uint8_t busid, uint8_t intf, uint8_t report_id, uint8_t duration)
|
||||
{
|
||||
}
|
||||
|
||||
__WEAK void usbd_hid_set_protocol(uint8_t busid, uint8_t intf, uint8_t protocol)
|
||||
{
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
/*
|
||||
* Copyright (c) 2022, sakumisu
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
#ifndef USBD_HID_H
|
||||
#define USBD_HID_H
|
||||
|
||||
#include "usb_hid.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* Init hid interface driver */
|
||||
struct usbd_interface *usbd_hid_init_intf(uint8_t busid, struct usbd_interface *intf, const uint8_t *desc, uint32_t desc_len);
|
||||
|
||||
/* Register desc api */
|
||||
void usbd_hid_descriptor_register(uint8_t busid, uint8_t intf_num, const uint8_t *desc);
|
||||
void usbd_hid_report_descriptor_register(uint8_t busid, uint8_t intf_num, const uint8_t *desc, uint32_t desc_len);
|
||||
|
||||
/* Setup request command callback api */
|
||||
void usbd_hid_get_report(uint8_t busid, uint8_t intf, uint8_t report_id, uint8_t report_type, uint8_t **data, uint32_t *len);
|
||||
uint8_t usbd_hid_get_idle(uint8_t busid, uint8_t intf, uint8_t report_id);
|
||||
uint8_t usbd_hid_get_protocol(uint8_t busid, uint8_t intf);
|
||||
void usbd_hid_set_report(uint8_t busid, uint8_t intf, uint8_t report_id, uint8_t report_type, uint8_t *report, uint32_t report_len);
|
||||
void usbd_hid_set_idle(uint8_t busid, uint8_t intf, uint8_t report_id, uint8_t duration);
|
||||
void usbd_hid_set_protocol(uint8_t busid, uint8_t intf, uint8_t protocol);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* USBD_HID_H */
|
||||
@@ -0,0 +1,194 @@
|
||||
/*
|
||||
* Copyright (c) 2022, sakumisu
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
#ifndef USB_DC_H
|
||||
#define USB_DC_H
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief init device controller registers.
|
||||
* @return On success will return 0, and others indicate fail.
|
||||
*/
|
||||
int usb_dc_init(uint8_t busid);
|
||||
|
||||
/**
|
||||
* @brief deinit device controller registers.
|
||||
* @return On success will return 0, and others indicate fail.
|
||||
*/
|
||||
int usb_dc_deinit(uint8_t busid);
|
||||
|
||||
/**
|
||||
* @brief Set USB device address
|
||||
*
|
||||
* @param[in] addr Device address
|
||||
*
|
||||
* @return On success will return 0, and others indicate fail.
|
||||
*/
|
||||
int usbd_set_address(uint8_t busid, const uint8_t addr);
|
||||
|
||||
/**
|
||||
* @brief Get USB device speed
|
||||
*
|
||||
* @param[in] port port index
|
||||
*
|
||||
* @return port speed, USB_SPEED_LOW or USB_SPEED_FULL or USB_SPEED_HIGH
|
||||
*/
|
||||
uint8_t usbd_get_port_speed(uint8_t busid, const uint8_t port);
|
||||
|
||||
/**
|
||||
* @brief configure and enable endpoint.
|
||||
*
|
||||
* @param [in] ep_cfg Endpoint config.
|
||||
*
|
||||
* @return On success will return 0, and others indicate fail.
|
||||
*/
|
||||
int usbd_ep_open(uint8_t busid, const struct usb_endpoint_descriptor *ep);
|
||||
|
||||
/**
|
||||
* @brief Disable the selected endpoint
|
||||
*
|
||||
* @param[in] ep Endpoint address
|
||||
*
|
||||
* @return On success will return 0, and others indicate fail.
|
||||
*/
|
||||
int usbd_ep_close(uint8_t busid, const uint8_t ep);
|
||||
|
||||
/**
|
||||
* @brief Set stall condition for the selected endpoint
|
||||
*
|
||||
* @param[in] ep Endpoint address
|
||||
*
|
||||
*
|
||||
* @return On success will return 0, and others indicate fail.
|
||||
*/
|
||||
int usbd_ep_set_stall(uint8_t busid, const uint8_t ep);
|
||||
|
||||
/**
|
||||
* @brief Clear stall condition for the selected endpoint
|
||||
*
|
||||
* @param[in] ep Endpoint address corresponding to the one
|
||||
* listed in the device configuration table
|
||||
*
|
||||
* @return On success will return 0, and others indicate fail.
|
||||
*/
|
||||
int usbd_ep_clear_stall(uint8_t busid, const uint8_t ep);
|
||||
|
||||
/**
|
||||
* @brief Check if the selected endpoint is stalled
|
||||
*
|
||||
* @param[in] ep Endpoint address
|
||||
*
|
||||
* @param[out] stalled Endpoint stall status
|
||||
*
|
||||
* @return On success will return 0, and others indicate fail.
|
||||
*/
|
||||
int usbd_ep_is_stalled(uint8_t busid, const uint8_t ep, uint8_t *stalled);
|
||||
|
||||
/**
|
||||
* @brief Setup in ep transfer setting and start transfer.
|
||||
*
|
||||
* This function is asynchronous.
|
||||
* This function is similar to uart with tx dma.
|
||||
*
|
||||
* This function is called to write data to the specified endpoint. The
|
||||
* supplied usbd_endpoint_callback function will be called when data is transmitted
|
||||
* out.
|
||||
*
|
||||
* @param[in] ep Endpoint address corresponding to the one
|
||||
* listed in the device configuration table
|
||||
* @param[in] data Pointer to data to write
|
||||
* @param[in] data_len Length of the data requested to write. This may
|
||||
* be zero for a zero length status packet.
|
||||
* @return 0 on success, negative errno code on fail.
|
||||
*/
|
||||
int usbd_ep_start_write(uint8_t busid, const uint8_t ep, const uint8_t *data, uint32_t data_len);
|
||||
|
||||
/**
|
||||
* @brief Setup out ep transfer setting and start transfer.
|
||||
*
|
||||
* This function is asynchronous.
|
||||
* This function is similar to uart with rx dma.
|
||||
*
|
||||
* This function is called to read data to the specified endpoint. The
|
||||
* supplied usbd_endpoint_callback function will be called when data is received
|
||||
* in.
|
||||
*
|
||||
* @param[in] ep Endpoint address corresponding to the one
|
||||
* listed in the device configuration table
|
||||
* @param[in] data Pointer to data to read
|
||||
* @param[in] data_len Max length of the data requested to read.
|
||||
*
|
||||
* @return 0 on success, negative errno code on fail.
|
||||
*/
|
||||
int usbd_ep_start_read(uint8_t busid, const uint8_t ep, uint8_t *data, uint32_t data_len);
|
||||
|
||||
/* usb dcd irq callback */
|
||||
|
||||
/**
|
||||
* @brief Usb connect irq callback.
|
||||
*/
|
||||
void usbd_event_connect_handler(uint8_t busid);
|
||||
|
||||
/**
|
||||
* @brief Usb disconnect irq callback.
|
||||
*/
|
||||
void usbd_event_disconnect_handler(uint8_t busid);
|
||||
|
||||
/**
|
||||
* @brief Usb resume irq callback.
|
||||
*/
|
||||
void usbd_event_resume_handler(uint8_t busid);
|
||||
|
||||
/**
|
||||
* @brief Usb suspend irq callback.
|
||||
*/
|
||||
void usbd_event_suspend_handler(uint8_t busid);
|
||||
|
||||
/**
|
||||
* @brief Usb reset irq callback.
|
||||
*/
|
||||
void usbd_event_reset_handler(uint8_t busid);
|
||||
|
||||
/**
|
||||
* @brief Usb setup packet recv irq callback.
|
||||
* @param[in] psetup setup packet.
|
||||
*/
|
||||
void usbd_event_ep0_setup_complete_handler(uint8_t busid, uint8_t *psetup);
|
||||
|
||||
/**
|
||||
* @brief In ep transfer complete irq callback.
|
||||
* @param[in] ep Endpoint address corresponding to the one
|
||||
* listed in the device configuration table
|
||||
* @param[in] nbytes How many nbytes have transferred.
|
||||
*/
|
||||
void usbd_event_ep_in_complete_handler(uint8_t busid, uint8_t ep, uint32_t nbytes);
|
||||
|
||||
/**
|
||||
* @brief Out ep transfer complete irq callback.
|
||||
* @param[in] ep Endpoint address corresponding to the one
|
||||
* listed in the device configuration table
|
||||
* @param[in] nbytes How many nbytes have transferred.
|
||||
*/
|
||||
void usbd_event_ep_out_complete_handler(uint8_t busid, uint8_t ep, uint32_t nbytes);
|
||||
|
||||
#ifdef CONFIG_USBDEV_TEST_MODE
|
||||
/**
|
||||
* @brief Usb execute test mode
|
||||
* @param[in] busid device busid
|
||||
* @param[in] test_mode usb test mode
|
||||
*/
|
||||
void usbd_execute_test_mode(uint8_t busid, uint8_t test_mode);
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* USB_DC_H */
|
||||
@@ -0,0 +1,699 @@
|
||||
/*
|
||||
* Copyright (c) 2022, sakumisu
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
#ifndef USB_DEF_H
|
||||
#define USB_DEF_H
|
||||
|
||||
/* Useful define */
|
||||
#define USB_1_1 0x0110
|
||||
#define USB_2_0 0x0200
|
||||
/* Set USB version to 2.1 so that the host will request the BOS descriptor */
|
||||
#define USB_2_1 0x0210
|
||||
#define USB_3_0 0x0300
|
||||
#define USB_3_1 0x0310
|
||||
#define USB_3_2 0x0320
|
||||
|
||||
/* Device speeds */
|
||||
#define USB_SPEED_UNKNOWN 0 /* Transfer rate not yet set */
|
||||
#define USB_SPEED_LOW 1 /* USB 1.1 */
|
||||
#define USB_SPEED_FULL 2 /* USB 1.1 */
|
||||
#define USB_SPEED_HIGH 3 /* USB 2.0 */
|
||||
#define USB_SPEED_WIRELESS 4 /* Wireless USB 2.5 */
|
||||
#define USB_SPEED_SUPER 5 /* USB 3.0 */
|
||||
#define USB_SPEED_SUPER_PLUS 6 /* USB 3.1 */
|
||||
|
||||
/* Maximum number of devices per controller */
|
||||
#define USB_MAX_DEVICES (127)
|
||||
|
||||
/* Default USB control EP, always 0 and 0x80 */
|
||||
#define USB_CONTROL_OUT_EP0 0
|
||||
#define USB_CONTROL_IN_EP0 0x80
|
||||
|
||||
/**< maximum packet size (MPS) for EP 0 */
|
||||
#define USB_CTRL_EP_MPS 64
|
||||
|
||||
/* USB PID Types */
|
||||
#define USB_PID_OUT (0x01) /* Tokens */
|
||||
#define USB_PID_IN (0x09)
|
||||
#define USB_PID_SOF (0x05)
|
||||
#define USB_PID_SETUP (0x0d)
|
||||
|
||||
#define USB_PID_DATA0 (0x03) /* Data */
|
||||
#define USB_PID_DATA1 (0x0b)
|
||||
#define USB_PID_DATA2 (0x07)
|
||||
#define USB_PID_MDATA (0x0f)
|
||||
|
||||
#define USB_PID_ACK (0x02) /* Handshake */
|
||||
#define USB_PID_NAK (0x0a)
|
||||
#define USB_PID_STALL (0x0e)
|
||||
#define USB_PID_NYET (0x06)
|
||||
|
||||
#define USB_PID_PRE (0x0c) /* Special */
|
||||
#define USB_PID_ERR (0x0c)
|
||||
#define USB_PID_SPLIT (0x08)
|
||||
#define USB_PID_PING (0x04)
|
||||
#define USB_PID_RESERVED (0x00)
|
||||
|
||||
#define USB_REQUEST_DIR_SHIFT 7U /* Bits 7: Request dir */
|
||||
#define USB_REQUEST_DIR_OUT (0U << USB_REQUEST_DIR_SHIFT) /* Bit 7=0: Host-to-device */
|
||||
#define USB_REQUEST_DIR_IN (1U << USB_REQUEST_DIR_SHIFT) /* Bit 7=1: Device-to-host */
|
||||
#define USB_REQUEST_DIR_MASK (1U << USB_REQUEST_DIR_SHIFT) /* Bit 7=1: Direction bit */
|
||||
|
||||
#define USB_REQUEST_TYPE_SHIFT 5U /* Bits 5:6: Request type */
|
||||
#define USB_REQUEST_STANDARD (0U << USB_REQUEST_TYPE_SHIFT)
|
||||
#define USB_REQUEST_CLASS (1U << USB_REQUEST_TYPE_SHIFT)
|
||||
#define USB_REQUEST_VENDOR (2U << USB_REQUEST_TYPE_SHIFT)
|
||||
#define USB_REQUEST_RESERVED (3U << USB_REQUEST_TYPE_SHIFT)
|
||||
#define USB_REQUEST_TYPE_MASK (3U << USB_REQUEST_TYPE_SHIFT)
|
||||
|
||||
#define USB_REQUEST_RECIPIENT_SHIFT 0U /* Bits 0:4: Recipient */
|
||||
#define USB_REQUEST_RECIPIENT_DEVICE (0U << USB_REQUEST_RECIPIENT_SHIFT)
|
||||
#define USB_REQUEST_RECIPIENT_INTERFACE (1U << USB_REQUEST_RECIPIENT_SHIFT)
|
||||
#define USB_REQUEST_RECIPIENT_ENDPOINT (2U << USB_REQUEST_RECIPIENT_SHIFT)
|
||||
#define USB_REQUEST_RECIPIENT_OTHER (3U << USB_REQUEST_RECIPIENT_SHIFT)
|
||||
#define USB_REQUEST_RECIPIENT_MASK (3U << USB_REQUEST_RECIPIENT_SHIFT)
|
||||
|
||||
/* USB Standard Request Codes */
|
||||
#define USB_REQUEST_GET_STATUS 0x00
|
||||
#define USB_REQUEST_CLEAR_FEATURE 0x01
|
||||
#define USB_REQUEST_SET_FEATURE 0x03
|
||||
#define USB_REQUEST_SET_ADDRESS 0x05
|
||||
#define USB_REQUEST_GET_DESCRIPTOR 0x06
|
||||
#define USB_REQUEST_SET_DESCRIPTOR 0x07
|
||||
#define USB_REQUEST_GET_CONFIGURATION 0x08
|
||||
#define USB_REQUEST_SET_CONFIGURATION 0x09
|
||||
#define USB_REQUEST_GET_INTERFACE 0x0A
|
||||
#define USB_REQUEST_SET_INTERFACE 0x0B
|
||||
#define USB_REQUEST_SYNCH_FRAME 0x0C
|
||||
#define USB_REQUEST_SET_ENCRYPTION 0x0D
|
||||
#define USB_REQUEST_GET_ENCRYPTION 0x0E
|
||||
#define USB_REQUEST_RPIPE_ABORT 0x0E
|
||||
#define USB_REQUEST_SET_HANDSHAKE 0x0F
|
||||
#define USB_REQUEST_RPIPE_RESET 0x0F
|
||||
#define USB_REQUEST_GET_HANDSHAKE 0x10
|
||||
#define USB_REQUEST_SET_CONNECTION 0x11
|
||||
#define USB_REQUEST_SET_SECURITY_DATA 0x12
|
||||
#define USB_REQUEST_GET_SECURITY_DATA 0x13
|
||||
#define USB_REQUEST_SET_WUSB_DATA 0x14
|
||||
#define USB_REQUEST_LOOPBACK_DATA_WRITE 0x15
|
||||
#define USB_REQUEST_LOOPBACK_DATA_READ 0x16
|
||||
#define USB_REQUEST_SET_INTERFACE_DS 0x17
|
||||
|
||||
/* USB Standard Feature selectors */
|
||||
#define USB_FEATURE_ENDPOINT_HALT 0
|
||||
#define USB_FEATURE_SELF_POWERED 0
|
||||
#define USB_FEATURE_REMOTE_WAKEUP 1
|
||||
#define USB_FEATURE_TEST_MODE 2
|
||||
#define USB_FEATURE_BATTERY 2
|
||||
#define USB_FEATURE_BHNPENABLE 3
|
||||
#define USB_FEATURE_WUSBDEVICE 3
|
||||
#define USB_FEATURE_AHNPSUPPORT 4
|
||||
#define USB_FEATURE_AALTHNPSUPPORT 5
|
||||
#define USB_FEATURE_DEBUGMODE 6
|
||||
|
||||
/* USB GET_STATUS Bit Values */
|
||||
#define USB_GETSTATUS_ENDPOINT_HALT 0x01
|
||||
#define USB_GETSTATUS_SELF_POWERED 0x01
|
||||
#define USB_GETSTATUS_REMOTE_WAKEUP 0x02
|
||||
|
||||
/* USB Descriptor Types */
|
||||
#define USB_DESCRIPTOR_TYPE_DEVICE 0x01U
|
||||
#define USB_DESCRIPTOR_TYPE_CONFIGURATION 0x02U
|
||||
#define USB_DESCRIPTOR_TYPE_STRING 0x03U
|
||||
#define USB_DESCRIPTOR_TYPE_INTERFACE 0x04U
|
||||
#define USB_DESCRIPTOR_TYPE_ENDPOINT 0x05U
|
||||
#define USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER 0x06U
|
||||
#define USB_DESCRIPTOR_TYPE_OTHER_SPEED 0x07U
|
||||
#define USB_DESCRIPTOR_TYPE_INTERFACE_POWER 0x08U
|
||||
#define USB_DESCRIPTOR_TYPE_OTG 0x09U
|
||||
#define USB_DESCRIPTOR_TYPE_DEBUG 0x0AU
|
||||
#define USB_DESCRIPTOR_TYPE_INTERFACE_ASSOCIATION 0x0BU
|
||||
#define USB_DESCRIPTOR_TYPE_BINARY_OBJECT_STORE 0x0FU
|
||||
#define USB_DESCRIPTOR_TYPE_DEVICE_CAPABILITY 0x10U
|
||||
#define USB_DESCRIPTOR_TYPE_WIRELESS_ENDPOINTCOMP 0x11U
|
||||
|
||||
/* Class Specific Descriptor */
|
||||
#define USB_CS_DESCRIPTOR_TYPE_DEVICE 0x21U
|
||||
#define USB_CS_DESCRIPTOR_TYPE_CONFIGURATION 0x22U
|
||||
#define USB_CS_DESCRIPTOR_TYPE_STRING 0x23U
|
||||
#define USB_CS_DESCRIPTOR_TYPE_INTERFACE 0x24U
|
||||
#define USB_CS_DESCRIPTOR_TYPE_ENDPOINT 0x25U
|
||||
|
||||
#define USB_DESCRIPTOR_TYPE_SUPERSPEED_ENDPOINT_COMPANION 0x30U
|
||||
#define USB_DESCRIPTOR_TYPE_SUPERSPEED_ISO_ENDPOINT_COMPANION 0x31U
|
||||
|
||||
/* USB Device Classes */
|
||||
#define USB_DEVICE_CLASS_RESERVED 0x00
|
||||
#define USB_DEVICE_CLASS_AUDIO 0x01
|
||||
#define USB_DEVICE_CLASS_CDC 0x02
|
||||
#define USB_DEVICE_CLASS_HID 0x03
|
||||
#define USB_DEVICE_CLASS_MONITOR 0x04
|
||||
#define USB_DEVICE_CLASS_PHYSICAL 0x05
|
||||
#define USB_DEVICE_CLASS_IMAGE 0x06
|
||||
#define USB_DEVICE_CLASS_PRINTER 0x07
|
||||
#define USB_DEVICE_CLASS_MASS_STORAGE 0x08
|
||||
#define USB_DEVICE_CLASS_HUB 0x09
|
||||
#define USB_DEVICE_CLASS_CDC_DATA 0x0a
|
||||
#define USB_DEVICE_CLASS_SMART_CARD 0x0b
|
||||
#define USB_DEVICE_CLASS_SECURITY 0x0d
|
||||
#define USB_DEVICE_CLASS_VIDEO 0x0e
|
||||
#define USB_DEVICE_CLASS_HEALTHCARE 0x0f
|
||||
#define USB_DEVICE_CLASS_DIAG_DEVICE 0xdc
|
||||
#define USB_DEVICE_CLASS_WIRELESS 0xe0
|
||||
#define USB_DEVICE_CLASS_MISC 0xef
|
||||
#define USB_DEVICE_CLASS_APP_SPECIFIC 0xfe
|
||||
#define USB_DEVICE_CLASS_VEND_SPECIFIC 0xff
|
||||
|
||||
/* usb string index define */
|
||||
#define USB_STRING_LANGID_INDEX 0x00
|
||||
#define USB_STRING_MFC_INDEX 0x01
|
||||
#define USB_STRING_PRODUCT_INDEX 0x02
|
||||
#define USB_STRING_SERIAL_INDEX 0x03
|
||||
#define USB_STRING_CONFIG_INDEX 0x04
|
||||
#define USB_STRING_INTERFACE_INDEX 0x05
|
||||
#define USB_STRING_OS_INDEX 0x06
|
||||
#define USB_STRING_MAX USB_STRING_OS_INDEX
|
||||
/*
|
||||
* Devices supporting Microsoft OS Descriptors store special string
|
||||
* descriptor at fixed index (0xEE). It is read when a new device is
|
||||
* attached to a computer for the first time.
|
||||
*/
|
||||
#define USB_OSDESC_STRING_DESC_INDEX 0xEE
|
||||
|
||||
/* bmAttributes in Configuration Descriptor */
|
||||
#define USB_CONFIG_REMOTE_WAKEUP 0x20
|
||||
#define USB_CONFIG_POWERED_MASK 0x40
|
||||
#define USB_CONFIG_BUS_POWERED 0x80
|
||||
#define USB_CONFIG_SELF_POWERED 0xC0
|
||||
|
||||
/* bMaxPower in Configuration Descriptor */
|
||||
#define USB_CONFIG_POWER_MA(mA) ((mA) / 2)
|
||||
|
||||
/* bEndpointAddress in Endpoint Descriptor */
|
||||
#define USB_ENDPOINT_DIRECTION_MASK 0x80
|
||||
#define USB_ENDPOINT_OUT(addr) ((addr) | 0x00)
|
||||
#define USB_ENDPOINT_IN(addr) ((addr) | 0x80)
|
||||
|
||||
/**
|
||||
* USB endpoint direction and number.
|
||||
*/
|
||||
#define USB_EP_DIR_MASK 0x80U
|
||||
#define USB_EP_DIR_IN 0x80U
|
||||
#define USB_EP_DIR_OUT 0x00U
|
||||
|
||||
/** Get endpoint index (number) from endpoint address */
|
||||
#define USB_EP_GET_IDX(ep) ((ep) & ~USB_EP_DIR_MASK)
|
||||
/** Get direction from endpoint address */
|
||||
#define USB_EP_GET_DIR(ep) ((ep)&USB_EP_DIR_MASK)
|
||||
/** Get endpoint address from endpoint index and direction */
|
||||
#define USB_EP_GET_ADDR(idx, dir) ((idx) | ((dir)&USB_EP_DIR_MASK))
|
||||
/** True if the endpoint is an IN endpoint */
|
||||
#define USB_EP_DIR_IS_IN(ep) (USB_EP_GET_DIR(ep) == USB_EP_DIR_IN)
|
||||
/** True if the endpoint is an OUT endpoint */
|
||||
#define USB_EP_DIR_IS_OUT(ep) (USB_EP_GET_DIR(ep) == USB_EP_DIR_OUT)
|
||||
|
||||
/* bmAttributes in Endpoint Descriptor */
|
||||
#define USB_ENDPOINT_TYPE_SHIFT 0
|
||||
#define USB_ENDPOINT_TYPE_CONTROL (0 << USB_ENDPOINT_TYPE_SHIFT)
|
||||
#define USB_ENDPOINT_TYPE_ISOCHRONOUS (1 << USB_ENDPOINT_TYPE_SHIFT)
|
||||
#define USB_ENDPOINT_TYPE_BULK (2 << USB_ENDPOINT_TYPE_SHIFT)
|
||||
#define USB_ENDPOINT_TYPE_INTERRUPT (3 << USB_ENDPOINT_TYPE_SHIFT)
|
||||
#define USB_ENDPOINT_TYPE_MASK (3 << USB_ENDPOINT_TYPE_SHIFT)
|
||||
#define USB_GET_ENDPOINT_TYPE(x) ((x & USB_ENDPOINT_TYPE_MASK) >> USB_ENDPOINT_TYPE_SHIFT)
|
||||
|
||||
#define USB_ENDPOINT_SYNC_SHIFT 2
|
||||
#define USB_ENDPOINT_SYNC_NO_SYNCHRONIZATION (0 << USB_ENDPOINT_SYNC_SHIFT)
|
||||
#define USB_ENDPOINT_SYNC_ASYNCHRONOUS (1 << USB_ENDPOINT_SYNC_SHIFT)
|
||||
#define USB_ENDPOINT_SYNC_ADAPTIVE (2 << USB_ENDPOINT_SYNC_SHIFT)
|
||||
#define USB_ENDPOINT_SYNC_SYNCHRONOUS (3 << USB_ENDPOINT_SYNC_SHIFT)
|
||||
#define USB_ENDPOINT_SYNC_MASK (3 << USB_ENDPOINT_SYNC_SHIFT)
|
||||
|
||||
#define USB_ENDPOINT_USAGE_SHIFT 4
|
||||
#define USB_ENDPOINT_USAGE_DATA (0 << USB_ENDPOINT_USAGE_SHIFT)
|
||||
#define USB_ENDPOINT_USAGE_FEEDBACK (1 << USB_ENDPOINT_USAGE_SHIFT)
|
||||
#define USB_ENDPOINT_USAGE_IMPLICIT_FEEDBACK (2 << USB_ENDPOINT_USAGE_SHIFT)
|
||||
#define USB_ENDPOINT_USAGE_MASK (3 << USB_ENDPOINT_USAGE_SHIFT)
|
||||
|
||||
#define USB_ENDPOINT_MAX_ADJUSTABLE (1 << 7)
|
||||
|
||||
/* wMaxPacketSize in Endpoint Descriptor */
|
||||
#define USB_MAXPACKETSIZE_SHIFT 0
|
||||
#define USB_MAXPACKETSIZE_MASK (0x7ff << USB_MAXPACKETSIZE_SHIFT)
|
||||
#define USB_MAXPACKETSIZE_ADDITIONAL_TRANSCATION_SHIFT 11
|
||||
#define USB_MAXPACKETSIZE_ADDITIONAL_TRANSCATION_NONE (0 << USB_MAXPACKETSIZE_ADDITIONAL_TRANSCATION_SHIFT)
|
||||
#define USB_MAXPACKETSIZE_ADDITIONAL_TRANSCATION_ONE (1 << USB_MAXPACKETSIZE_ADDITIONAL_TRANSCATION_SHIFT)
|
||||
#define USB_MAXPACKETSIZE_ADDITIONAL_TRANSCATION_TWO (2 << USB_MAXPACKETSIZE_ADDITIONAL_TRANSCATION_SHIFT)
|
||||
#define USB_MAXPACKETSIZE_ADDITIONAL_TRANSCATION_MASK (3 << USB_MAXPACKETSIZE_ADDITIONAL_TRANSCATION_SHIFT)
|
||||
#define USB_GET_MAXPACKETSIZE(x) ((x & USB_MAXPACKETSIZE_MASK) >> USB_MAXPACKETSIZE_SHIFT)
|
||||
#define USB_GET_MULT(x) ((x & USB_MAXPACKETSIZE_ADDITIONAL_TRANSCATION_MASK) >> USB_MAXPACKETSIZE_ADDITIONAL_TRANSCATION_SHIFT)
|
||||
|
||||
/* bDevCapabilityType in Device Capability Descriptor */
|
||||
#define USB_DEVICE_CAPABILITY_WIRELESS_USB 1
|
||||
#define USB_DEVICE_CAPABILITY_USB_2_0_EXTENSION 2
|
||||
#define USB_DEVICE_CAPABILITY_SUPERSPEED_USB 3
|
||||
#define USB_DEVICE_CAPABILITY_CONTAINER_ID 4
|
||||
#define USB_DEVICE_CAPABILITY_PLATFORM 5
|
||||
#define USB_DEVICE_CAPABILITY_POWER_DELIVERY_CAPABILITY 6
|
||||
#define USB_DEVICE_CAPABILITY_BATTERY_INFO_CAPABILITY 7
|
||||
#define USB_DEVICE_CAPABILITY_PD_CONSUMER_PORT_CAPABILITY 8
|
||||
#define USB_DEVICE_CAPABILITY_PD_PROVIDER_PORT_CAPABILITY 9
|
||||
#define USB_DEVICE_CAPABILITY_SUPERSPEED_PLUS 10
|
||||
#define USB_DEVICE_CAPABILITY_PRECISION_TIME_MEASUREMENT 11
|
||||
#define USB_DEVICE_CAPABILITY_WIRELESS_USB_EXT 12
|
||||
|
||||
#define USB_BOS_CAPABILITY_EXTENSION 0x02
|
||||
#define USB_BOS_CAPABILITY_PLATFORM 0x05
|
||||
|
||||
/* OTG SET FEATURE Constants */
|
||||
#define USB_OTG_FEATURE_B_HNP_ENABLE 3 /* Enable B device to perform HNP */
|
||||
#define USB_OTG_FEATURE_A_HNP_SUPPORT 4 /* A device supports HNP */
|
||||
#define USB_OTG_FEATURE_A_ALT_HNP_SUPPORT 5 /* Another port on the A device supports HNP */
|
||||
|
||||
/* WinUSB Microsoft OS 2.0 descriptor request codes */
|
||||
#define WINUSB_REQUEST_GET_DESCRIPTOR_SET 0x07
|
||||
#define WINUSB_REQUEST_SET_ALT_ENUM 0x08
|
||||
|
||||
/* WinUSB Microsoft OS 2.0 descriptor sizes */
|
||||
#define WINUSB_DESCRIPTOR_SET_HEADER_SIZE 10
|
||||
#define WINUSB_FUNCTION_SUBSET_HEADER_SIZE 8
|
||||
#define WINUSB_FEATURE_COMPATIBLE_ID_SIZE 20
|
||||
|
||||
/* WinUSB Microsoft OS 2.0 Descriptor Types */
|
||||
#define WINUSB_SET_HEADER_DESCRIPTOR_TYPE 0x00
|
||||
#define WINUSB_SUBSET_HEADER_CONFIGURATION_TYPE 0x01
|
||||
#define WINUSB_SUBSET_HEADER_FUNCTION_TYPE 0x02
|
||||
#define WINUSB_FEATURE_COMPATIBLE_ID_TYPE 0x03
|
||||
#define WINUSB_FEATURE_REG_PROPERTY_TYPE 0x04
|
||||
#define WINUSB_FEATURE_MIN_RESUME_TIME_TYPE 0x05
|
||||
#define WINUSB_FEATURE_MODEL_ID_TYPE 0x06
|
||||
#define WINUSB_FEATURE_CCGP_DEVICE_TYPE 0x07
|
||||
|
||||
#define WINUSB_PROP_DATA_TYPE_REG_SZ 0x01
|
||||
#define WINUSB_PROP_DATA_TYPE_REG_MULTI_SZ 0x07
|
||||
|
||||
/* WebUSB Descriptor Types */
|
||||
#define WEBUSB_DESCRIPTOR_SET_HEADER_TYPE 0x00
|
||||
#define WEBUSB_CONFIGURATION_SUBSET_HEADER_TYPE 0x01
|
||||
#define WEBUSB_FUNCTION_SUBSET_HEADER_TYPE 0x02
|
||||
#define WEBUSB_URL_TYPE 0x03
|
||||
|
||||
/* WebUSB Request Codes */
|
||||
#define WEBUSB_REQUEST_GET_URL 0x02
|
||||
|
||||
/* bScheme in URL descriptor */
|
||||
#define WEBUSB_URL_SCHEME_HTTP 0x00
|
||||
#define WEBUSB_URL_SCHEME_HTTPS 0x01
|
||||
|
||||
/* WebUSB Descriptor sizes */
|
||||
#define WEBUSB_DESCRIPTOR_SET_HEADER_SIZE 5
|
||||
#define WEBUSB_CONFIGURATION_SUBSET_HEADER_SIZE 4
|
||||
#define WEBUSB_FUNCTION_SUBSET_HEADER_SIZE 3
|
||||
|
||||
/* Setup packet definition used to read raw data from USB line */
|
||||
struct usb_setup_packet {
|
||||
/** Request type. Bits 0:4 determine recipient, see
|
||||
* \ref usb_request_recipient. Bits 5:6 determine type, see
|
||||
* \ref usb_request_type. Bit 7 determines data transfer direction, see
|
||||
* \ref usb_endpoint_direction.
|
||||
*/
|
||||
uint8_t bmRequestType;
|
||||
|
||||
/** Request. If the type bits of bmRequestType are equal to
|
||||
* \ref usb_request_type::LIBUSB_REQUEST_TYPE_STANDARD
|
||||
* "USB_REQUEST_TYPE_STANDARD" then this field refers to
|
||||
* \ref usb_standard_request. For other cases, use of this field is
|
||||
* application-specific. */
|
||||
uint8_t bRequest;
|
||||
|
||||
/** Value. Varies according to request */
|
||||
uint16_t wValue;
|
||||
|
||||
/** Index. Varies according to request, typically used to pass an index
|
||||
* or offset */
|
||||
uint16_t wIndex;
|
||||
|
||||
/** Number of bytes to transfer */
|
||||
uint16_t wLength;
|
||||
} __PACKED;
|
||||
|
||||
#define USB_SIZEOF_SETUP_PACKET 8
|
||||
|
||||
/** Standard Device Descriptor */
|
||||
struct usb_device_descriptor {
|
||||
uint8_t bLength; /* Descriptor size in bytes = 18 */
|
||||
uint8_t bDescriptorType; /* DEVICE descriptor type = 1 */
|
||||
uint16_t bcdUSB; /* USB spec in BCD, e.g. 0x0200 */
|
||||
uint8_t bDeviceClass; /* Class code, if 0 see interface */
|
||||
uint8_t bDeviceSubClass; /* Sub-Class code, 0 if class = 0 */
|
||||
uint8_t bDeviceProtocol; /* Protocol, if 0 see interface */
|
||||
uint8_t bMaxPacketSize0; /* Endpoint 0 max. size */
|
||||
uint16_t idVendor; /* Vendor ID per USB-IF */
|
||||
uint16_t idProduct; /* Product ID per manufacturer */
|
||||
uint16_t bcdDevice; /* Device release # in BCD */
|
||||
uint8_t iManufacturer; /* Index to manufacturer string */
|
||||
uint8_t iProduct; /* Index to product string */
|
||||
uint8_t iSerialNumber; /* Index to serial number string */
|
||||
uint8_t bNumConfigurations; /* Number of possible configurations */
|
||||
} __PACKED;
|
||||
|
||||
#define USB_SIZEOF_DEVICE_DESC 18
|
||||
|
||||
/** Standard Configuration Descriptor */
|
||||
struct usb_configuration_descriptor {
|
||||
uint8_t bLength; /* Descriptor size in bytes = 9 */
|
||||
uint8_t bDescriptorType; /* CONFIGURATION type = 2 or 7 */
|
||||
uint16_t wTotalLength; /* Length of concatenated descriptors */
|
||||
uint8_t bNumInterfaces; /* Number of interfaces, this config. */
|
||||
uint8_t bConfigurationValue; /* Value to set this config. */
|
||||
uint8_t iConfiguration; /* Index to configuration string */
|
||||
uint8_t bmAttributes; /* Config. characteristics */
|
||||
uint8_t bMaxPower; /* Max.power from bus, 2mA units */
|
||||
} __PACKED;
|
||||
|
||||
#define USB_SIZEOF_CONFIG_DESC 9
|
||||
|
||||
/** Standard Interface Descriptor */
|
||||
struct usb_interface_descriptor {
|
||||
uint8_t bLength; /* Descriptor size in bytes = 9 */
|
||||
uint8_t bDescriptorType; /* INTERFACE descriptor type = 4 */
|
||||
uint8_t bInterfaceNumber; /* Interface no.*/
|
||||
uint8_t bAlternateSetting; /* Value to select this IF */
|
||||
uint8_t bNumEndpoints; /* Number of endpoints excluding 0 */
|
||||
uint8_t bInterfaceClass; /* Class code, 0xFF = vendor */
|
||||
uint8_t bInterfaceSubClass; /* Sub-Class code, 0 if class = 0 */
|
||||
uint8_t bInterfaceProtocol; /* Protocol, 0xFF = vendor */
|
||||
uint8_t iInterface; /* Index to interface string */
|
||||
} __PACKED;
|
||||
|
||||
#define USB_SIZEOF_INTERFACE_DESC 9
|
||||
|
||||
/** Standard Endpoint Descriptor */
|
||||
struct usb_endpoint_descriptor {
|
||||
uint8_t bLength; /* Descriptor size in bytes = 7 */
|
||||
uint8_t bDescriptorType; /* ENDPOINT descriptor type = 5 */
|
||||
uint8_t bEndpointAddress; /* Endpoint # 0 - 15 | IN/OUT */
|
||||
uint8_t bmAttributes; /* Transfer type */
|
||||
uint16_t wMaxPacketSize; /* Bits 10:0 = max. packet size */
|
||||
uint8_t bInterval; /* Polling interval in (micro) frames */
|
||||
} __PACKED;
|
||||
|
||||
#define USB_SIZEOF_ENDPOINT_DESC 7
|
||||
|
||||
/** Unicode (UTF16LE) String Descriptor */
|
||||
struct usb_string_descriptor {
|
||||
uint8_t bLength;
|
||||
uint8_t bDescriptorType;
|
||||
uint16_t bString;
|
||||
} __PACKED;
|
||||
|
||||
#define USB_SIZEOF_STRING_LANGID_DESC 4
|
||||
|
||||
/* USB Interface Association Descriptor */
|
||||
struct usb_interface_association_descriptor {
|
||||
uint8_t bLength;
|
||||
uint8_t bDescriptorType;
|
||||
uint8_t bFirstInterface;
|
||||
uint8_t bInterfaceCount;
|
||||
uint8_t bFunctionClass;
|
||||
uint8_t bFunctionSubClass;
|
||||
uint8_t bFunctionProtocol;
|
||||
uint8_t iFunction;
|
||||
} __PACKED;
|
||||
|
||||
#define USB_SIZEOF_IAD_DESC 8
|
||||
|
||||
/** USB device_qualifier descriptor */
|
||||
struct usb_device_qualifier_descriptor {
|
||||
uint8_t bLength; /* Descriptor size in bytes = 10 */
|
||||
uint8_t bDescriptorType; /* DEVICE QUALIFIER type = 6 */
|
||||
uint16_t bcdUSB; /* USB spec in BCD, e.g. 0x0200 */
|
||||
uint8_t bDeviceClass; /* Class code, if 0 see interface */
|
||||
uint8_t bDeviceSubClass; /* Sub-Class code, 0 if class = 0 */
|
||||
uint8_t bDeviceProtocol; /* Protocol, if 0 see interface */
|
||||
uint8_t bMaxPacketSize; /* Endpoint 0 max. size */
|
||||
uint8_t bNumConfigurations; /* Number of possible configurations */
|
||||
uint8_t bReserved; /* Reserved = 0 */
|
||||
} __PACKED;
|
||||
|
||||
#define USB_SIZEOF_DEVICE_QUALIFIER_DESC 10
|
||||
|
||||
/* Microsoft OS function descriptor.
|
||||
* This can be used to request a specific driver (such as WINUSB) to be
|
||||
* loaded on Windows. Unlike other descriptors, it is requested by a special
|
||||
* request USB_REQ_GETMSFTOSDESCRIPTOR.
|
||||
* More details:
|
||||
* https://msdn.microsoft.com/en-us/windows/hardware/gg463179
|
||||
* And excellent explanation:
|
||||
* https://github.com/pbatard/libwdi/wiki/WCID-Devices
|
||||
*
|
||||
* The device will have exactly one "Extended Compat ID Feature Descriptor",
|
||||
* which may contain multiple "Function Descriptors" associated with
|
||||
* different interfaces.
|
||||
*/
|
||||
|
||||
/* MS OS 1.0 string descriptor */
|
||||
struct usb_msosv1_string_descriptor {
|
||||
uint8_t bLength;
|
||||
uint8_t bDescriptorType;
|
||||
uint8_t bString[14];
|
||||
uint8_t bMS_VendorCode; /* Vendor Code, used for a control request */
|
||||
uint8_t bPad; /* Padding byte for VendorCode look as UTF16 */
|
||||
} __PACKED;
|
||||
|
||||
/* MS OS 1.0 Header descriptor */
|
||||
struct usb_msosv1_compat_id_header_descriptor {
|
||||
uint32_t dwLength;
|
||||
uint16_t bcdVersion;
|
||||
uint16_t wIndex;
|
||||
uint8_t bCount;
|
||||
uint8_t reserved[7];
|
||||
} __PACKED;
|
||||
|
||||
/* MS OS 1.0 Function descriptor */
|
||||
struct usb_msosv1_comp_id_function_descriptor {
|
||||
uint8_t bFirstInterfaceNumber;
|
||||
uint8_t reserved1;
|
||||
uint8_t compatibleID[8];
|
||||
uint8_t subCompatibleID[8];
|
||||
uint8_t reserved2[6];
|
||||
} __PACKED;
|
||||
|
||||
#define usb_msosv1_comp_id_create(x) \
|
||||
struct usb_msosv1_comp_id { \
|
||||
struct usb_msosv1_compat_id_header_descriptor compat_id_header; \
|
||||
struct usb_msosv1_comp_id_function_descriptor compat_id_function[x]; \
|
||||
};
|
||||
|
||||
struct usb_msosv1_descriptor {
|
||||
const uint8_t *string;
|
||||
uint8_t vendor_code;
|
||||
const uint8_t *compat_id;
|
||||
const uint8_t **comp_id_property;
|
||||
};
|
||||
|
||||
/* MS OS 2.0 Header descriptor */
|
||||
struct usb_msosv2_header_descriptor {
|
||||
uint32_t dwLength;
|
||||
uint16_t bcdVersion;
|
||||
uint16_t wIndex;
|
||||
uint8_t bCount;
|
||||
} __PACKED;
|
||||
|
||||
/*Microsoft OS 2.0 set header descriptor*/
|
||||
struct usb_msosv2_set_header_descriptor {
|
||||
uint16_t wLength;
|
||||
uint16_t wDescriptorType;
|
||||
uint32_t dwWindowsVersion;
|
||||
uint16_t wDescriptorSetTotalLength;
|
||||
} __PACKED;
|
||||
|
||||
/* Microsoft OS 2.0 compatibleID descriptor*/
|
||||
struct usb_msosv2_comp_id_descriptor {
|
||||
uint16_t wLength;
|
||||
uint16_t wDescriptorType;
|
||||
uint8_t compatibleID[8];
|
||||
uint8_t subCompatibleID[8];
|
||||
} __PACKED;
|
||||
|
||||
/* MS OS 2.0 property descriptor */
|
||||
struct usb_msosv2_property_descriptor {
|
||||
uint16_t wLength;
|
||||
uint16_t wDescriptorType;
|
||||
uint32_t dwPropertyDataType;
|
||||
uint16_t wPropertyNameLength;
|
||||
const char *bPropertyName;
|
||||
uint32_t dwPropertyDataLength;
|
||||
const char *bPropertyData;
|
||||
};
|
||||
|
||||
/* Microsoft OS 2.0 subset function descriptor */
|
||||
struct usb_msosv2_subset_function_descriptor {
|
||||
uint16_t wLength;
|
||||
uint16_t wDescriptorType;
|
||||
uint8_t bFirstInterface;
|
||||
uint8_t bReserved;
|
||||
uint16_t wSubsetLength;
|
||||
} __PACKED;
|
||||
|
||||
struct usb_msosv2_descriptor {
|
||||
uint8_t *compat_id;
|
||||
uint16_t compat_id_len;
|
||||
uint8_t vendor_code;
|
||||
};
|
||||
|
||||
/* BOS header Descriptor */
|
||||
struct usb_bos_header_descriptor {
|
||||
uint8_t bLength;
|
||||
uint8_t bDescriptorType;
|
||||
uint16_t wTotalLength;
|
||||
uint8_t bNumDeviceCaps;
|
||||
} __PACKED;
|
||||
|
||||
/* BOS Capability platform Descriptor */
|
||||
struct usb_bos_capability_platform_descriptor {
|
||||
uint8_t bLength;
|
||||
uint8_t bDescriptorType;
|
||||
uint8_t bDevCapabilityType;
|
||||
uint8_t bReserved;
|
||||
uint8_t PlatformCapabilityUUID[16];
|
||||
} __PACKED;
|
||||
|
||||
/* BOS Capability MS OS Descriptors version 2 */
|
||||
struct usb_bos_capability_msosv2_descriptor {
|
||||
uint32_t dwWindowsVersion;
|
||||
uint16_t wMSOSDescriptorSetTotalLength;
|
||||
uint8_t bVendorCode;
|
||||
uint8_t bAltEnumCode;
|
||||
} __PACKED;
|
||||
|
||||
/* BOS Capability webusb */
|
||||
struct usb_bos_capability_webusb_descriptor {
|
||||
uint16_t bcdVersion;
|
||||
uint8_t bVendorCode;
|
||||
uint8_t iLandingPage;
|
||||
} __PACKED;
|
||||
|
||||
/* BOS Capability extension Descriptor*/
|
||||
struct usb_bos_capability_extension_descriptor {
|
||||
uint8_t bLength;
|
||||
uint8_t bDescriptorType;
|
||||
uint8_t bDevCapabilityType;
|
||||
uint32_t bmAttributes;
|
||||
} __PACKED;
|
||||
|
||||
/* Microsoft OS 2.0 Platform Capability Descriptor
|
||||
* See https://docs.microsoft.com/en-us/windows-hardware/drivers/usbcon/
|
||||
* microsoft-defined-usb-descriptors
|
||||
* Adapted from the source:
|
||||
* https://github.com/sowbug/weblight/blob/master/firmware/webusb.c
|
||||
* (BSD-2) Thanks http://janaxelson.com/files/ms_os_20_descriptors.c
|
||||
*/
|
||||
struct usb_bos_capability_platform_msosv2_descriptor {
|
||||
struct usb_bos_capability_platform_descriptor platform_msos;
|
||||
struct usb_bos_capability_msosv2_descriptor data_msosv2;
|
||||
} __PACKED;
|
||||
|
||||
/* WebUSB Platform Capability Descriptor:
|
||||
* https://wicg.github.io/webusb/#webusb-platform-capability-descriptor
|
||||
*/
|
||||
struct usb_bos_capability_platform_webusb_descriptor {
|
||||
struct usb_bos_capability_platform_descriptor platform_webusb;
|
||||
struct usb_bos_capability_webusb_descriptor data_webusb;
|
||||
} __PACKED;
|
||||
|
||||
struct usb_webusb_url_descriptor {
|
||||
uint8_t bLength;
|
||||
uint8_t bDescriptorType;
|
||||
uint8_t bScheme;
|
||||
char URL[];
|
||||
} __PACKED;
|
||||
|
||||
struct usb_webusb_url_ex_descriptor {
|
||||
uint8_t vendor_code;
|
||||
uint8_t *string;
|
||||
uint32_t string_len;
|
||||
} __PACKED;
|
||||
|
||||
struct usb_bos_descriptor {
|
||||
uint8_t *string;
|
||||
uint32_t string_len;
|
||||
};
|
||||
|
||||
/* USB Device Capability Descriptor */
|
||||
struct usb_device_capability_descriptor {
|
||||
uint8_t bLength;
|
||||
uint8_t bDescriptorType;
|
||||
uint8_t bDevCapabilityType;
|
||||
} __PACKED;
|
||||
|
||||
/** USB descriptor header */
|
||||
struct usb_desc_header {
|
||||
uint8_t bLength; /**< descriptor length */
|
||||
uint8_t bDescriptorType; /**< descriptor type */
|
||||
};
|
||||
// clang-format off
|
||||
#define USB_DEVICE_DESCRIPTOR_INIT(bcdUSB, bDeviceClass, bDeviceSubClass, bDeviceProtocol, idVendor, idProduct, bcdDevice, bNumConfigurations) \
|
||||
0x12, /* bLength */ \
|
||||
USB_DESCRIPTOR_TYPE_DEVICE, /* bDescriptorType */ \
|
||||
WBVAL(bcdUSB), /* bcdUSB */ \
|
||||
bDeviceClass, /* bDeviceClass */ \
|
||||
bDeviceSubClass, /* bDeviceSubClass */ \
|
||||
bDeviceProtocol, /* bDeviceProtocol */ \
|
||||
0x40, /* bMaxPacketSize */ \
|
||||
WBVAL(idVendor), /* idVendor */ \
|
||||
WBVAL(idProduct), /* idProduct */ \
|
||||
WBVAL(bcdDevice), /* bcdDevice */ \
|
||||
USB_STRING_MFC_INDEX, /* iManufacturer */ \
|
||||
USB_STRING_PRODUCT_INDEX, /* iProduct */ \
|
||||
USB_STRING_SERIAL_INDEX, /* iSerial */ \
|
||||
bNumConfigurations /* bNumConfigurations */
|
||||
|
||||
#define USB_CONFIG_DESCRIPTOR_INIT(wTotalLength, bNumInterfaces, bConfigurationValue, bmAttributes, bMaxPower) \
|
||||
0x09, /* bLength */ \
|
||||
USB_DESCRIPTOR_TYPE_CONFIGURATION, /* bDescriptorType */ \
|
||||
WBVAL(wTotalLength), /* wTotalLength */ \
|
||||
bNumInterfaces, /* bNumInterfaces */ \
|
||||
bConfigurationValue, /* bConfigurationValue */ \
|
||||
0x00, /* iConfiguration */ \
|
||||
bmAttributes, /* bmAttributes */ \
|
||||
USB_CONFIG_POWER_MA(bMaxPower) /* bMaxPower */
|
||||
|
||||
#define USB_INTERFACE_DESCRIPTOR_INIT(bInterfaceNumber, bAlternateSetting, bNumEndpoints, \
|
||||
bInterfaceClass, bInterfaceSubClass, bInterfaceProtocol, iInterface) \
|
||||
0x09, /* bLength */ \
|
||||
USB_DESCRIPTOR_TYPE_INTERFACE, /* bDescriptorType */ \
|
||||
bInterfaceNumber, /* bInterfaceNumber */ \
|
||||
bAlternateSetting, /* bAlternateSetting */ \
|
||||
bNumEndpoints, /* bNumEndpoints */ \
|
||||
bInterfaceClass, /* bInterfaceClass */ \
|
||||
bInterfaceSubClass, /* bInterfaceSubClass */ \
|
||||
bInterfaceProtocol, /* bInterfaceProtocol */ \
|
||||
iInterface /* iInterface */
|
||||
|
||||
#define USB_ENDPOINT_DESCRIPTOR_INIT(bEndpointAddress, bmAttributes, wMaxPacketSize, bInterval) \
|
||||
0x07, /* bLength */ \
|
||||
USB_DESCRIPTOR_TYPE_ENDPOINT, /* bDescriptorType */ \
|
||||
bEndpointAddress, /* bEndpointAddress */ \
|
||||
bmAttributes, /* bmAttributes */ \
|
||||
WBVAL(wMaxPacketSize), /* wMaxPacketSize */ \
|
||||
bInterval /* bInterval */
|
||||
|
||||
#define USB_IAD_INIT(bFirstInterface, bInterfaceCount, bFunctionClass, bFunctionSubClass, bFunctionProtocol) \
|
||||
0x08, /* bLength */ \
|
||||
USB_DESCRIPTOR_TYPE_INTERFACE_ASSOCIATION, /* bDescriptorType */ \
|
||||
bFirstInterface, /* bFirstInterface */ \
|
||||
bInterfaceCount, /* bInterfaceCount */ \
|
||||
bFunctionClass, /* bFunctionClass */ \
|
||||
bFunctionSubClass, /* bFunctionSubClass */ \
|
||||
bFunctionProtocol, /* bFunctionProtocol */ \
|
||||
0x00 /* iFunction */
|
||||
|
||||
#define USB_LANGID_INIT(id) \
|
||||
0x04, /* bLength */ \
|
||||
USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ \
|
||||
WBVAL(id) /* wLangID0 */
|
||||
// clang-format on
|
||||
|
||||
#endif /* USB_DEF_H */
|
||||
@@ -0,0 +1,24 @@
|
||||
/*
|
||||
* Copyright (c) 2023, sakumisu
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
#ifndef USB_ERRNO_H
|
||||
#define USB_ERRNO_H
|
||||
|
||||
#define USB_ERR_NOMEM 1
|
||||
#define USB_ERR_INVAL 2
|
||||
#define USB_ERR_NODEV 3
|
||||
#define USB_ERR_NOTCONN 4
|
||||
#define USB_ERR_NOTSUPP 5
|
||||
#define USB_ERR_BUSY 6
|
||||
#define USB_ERR_RANGE 7
|
||||
#define USB_ERR_STALL 8
|
||||
#define USB_ERR_BABBLE 9
|
||||
#define USB_ERR_NAK 10
|
||||
#define USB_ERR_DT 11
|
||||
#define USB_ERR_IO 12
|
||||
#define USB_ERR_SHUTDOWN 13
|
||||
#define USB_ERR_TIMEOUT 14
|
||||
|
||||
#endif /* USB_ERRNO_H */
|
||||
@@ -0,0 +1,114 @@
|
||||
/*
|
||||
* Copyright (c) 2022, sakumisu
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
#ifndef USB_HC_H
|
||||
#define USB_HC_H
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
typedef void (*usbh_complete_callback_t)(void *arg, int nbytes);
|
||||
|
||||
struct usbh_bus;
|
||||
|
||||
/**
|
||||
* @brief USB Iso Configuration.
|
||||
*
|
||||
* Structure containing the USB Iso configuration.
|
||||
*/
|
||||
struct usbh_iso_frame_packet {
|
||||
uint8_t *transfer_buffer;
|
||||
uint32_t transfer_buffer_length;
|
||||
uint32_t actual_length;
|
||||
int errorcode;
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief USB Urb Configuration.
|
||||
*
|
||||
* Structure containing the USB Urb configuration.
|
||||
*/
|
||||
struct usbh_urb {
|
||||
void *hcpriv;
|
||||
struct usbh_hubport *hport;
|
||||
struct usb_endpoint_descriptor *ep;
|
||||
uint8_t data_toggle;
|
||||
uint8_t interval;
|
||||
struct usb_setup_packet *setup;
|
||||
uint8_t *transfer_buffer;
|
||||
uint32_t transfer_buffer_length;
|
||||
int transfer_flags;
|
||||
uint32_t actual_length;
|
||||
uint32_t timeout;
|
||||
int errorcode;
|
||||
uint32_t num_of_iso_packets;
|
||||
uint32_t start_frame;
|
||||
usbh_complete_callback_t complete;
|
||||
void *arg;
|
||||
#if defined(__ICCARM__) || defined(__ICCRISCV__) || defined(__ICCRX__)
|
||||
struct usbh_iso_frame_packet *iso_packet;
|
||||
#else
|
||||
struct usbh_iso_frame_packet iso_packet[0];
|
||||
#endif
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief usb host controller hardware init.
|
||||
*
|
||||
* @return On success will return 0, and others indicate fail.
|
||||
*/
|
||||
int usb_hc_init(struct usbh_bus *bus);
|
||||
|
||||
/**
|
||||
* @brief usb host controller hardware deinit.
|
||||
*
|
||||
* @return On success will return 0, and others indicate fail.
|
||||
*/
|
||||
int usb_hc_deinit(struct usbh_bus *bus);
|
||||
|
||||
/**
|
||||
* @brief Get frame number.
|
||||
*
|
||||
* @return frame number.
|
||||
*/
|
||||
uint16_t usbh_get_frame_number(struct usbh_bus *bus);
|
||||
/**
|
||||
* @brief control roothub.
|
||||
*
|
||||
* @param setup setup request buffer.
|
||||
* @param buf buf for reading response or write data.
|
||||
* @return On success will return 0, and others indicate fail.
|
||||
*/
|
||||
int usbh_roothub_control(struct usbh_bus *bus, struct usb_setup_packet *setup, uint8_t *buf);
|
||||
|
||||
/**
|
||||
* @brief Submit a usb transfer request to an endpoint.
|
||||
*
|
||||
* If timeout is not zero, this function will be in poll transfer mode,
|
||||
* otherwise will be in async transfer mode.
|
||||
*
|
||||
* @param urb Usb request block.
|
||||
* @return On success will return 0, and others indicate fail.
|
||||
*/
|
||||
int usbh_submit_urb(struct usbh_urb *urb);
|
||||
|
||||
/**
|
||||
* @brief Cancel a transfer request.
|
||||
*
|
||||
* This function will call When calls usbh_submit_urb and return -USB_ERR_TIMEOUT or -USB_ERR_SHUTDOWN.
|
||||
*
|
||||
* @param urb Usb request block.
|
||||
* @return On success will return 0, and others indicate fail.
|
||||
*/
|
||||
int usbh_kill_urb(struct usbh_urb *urb);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* USB_HC_H */
|
||||
@@ -0,0 +1,459 @@
|
||||
/*
|
||||
* Copyright (c) 2022, sakumisu
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
#ifndef USB_LIST_H
|
||||
#define USB_LIST_H
|
||||
|
||||
#include <string.h>
|
||||
#include <stdint.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/**
|
||||
* usb_container_of - return the member address of ptr, if the type of ptr is the
|
||||
* struct type.
|
||||
*/
|
||||
#define usb_container_of(ptr, type, member) \
|
||||
((type *)((char *)(ptr) - (unsigned long)(&((type *)0)->member)))
|
||||
|
||||
/**
|
||||
* Single List structure
|
||||
*/
|
||||
struct usb_slist_node {
|
||||
struct usb_slist_node *next; /**< point to next node. */
|
||||
};
|
||||
typedef struct usb_slist_node usb_slist_t; /**< Type for single list. */
|
||||
|
||||
/**
|
||||
* @brief initialize a single list
|
||||
*
|
||||
* @param l the single list to be initialized
|
||||
*/
|
||||
static inline void usb_slist_init(usb_slist_t *l)
|
||||
{
|
||||
l->next = NULL;
|
||||
}
|
||||
|
||||
static inline void usb_slist_add_head(usb_slist_t *l, usb_slist_t *n)
|
||||
{
|
||||
n->next = l->next;
|
||||
l->next = n;
|
||||
}
|
||||
|
||||
static inline void usb_slist_add_tail(usb_slist_t *l, usb_slist_t *n)
|
||||
{
|
||||
usb_slist_t *tmp = l;
|
||||
|
||||
while (tmp->next) {
|
||||
tmp = tmp->next;
|
||||
}
|
||||
|
||||
/* append the node to the tail */
|
||||
tmp->next = n;
|
||||
n->next = NULL;
|
||||
}
|
||||
|
||||
static inline void usb_slist_insert(usb_slist_t *l, usb_slist_t *next, usb_slist_t *n)
|
||||
{
|
||||
if (!next) {
|
||||
usb_slist_add_tail(next, l);
|
||||
return;
|
||||
}
|
||||
|
||||
while (l->next) {
|
||||
if (l->next == next) {
|
||||
l->next = n;
|
||||
n->next = next;
|
||||
}
|
||||
|
||||
l = l->next;
|
||||
}
|
||||
}
|
||||
|
||||
static inline usb_slist_t *usb_slist_remove(usb_slist_t *l, usb_slist_t *n)
|
||||
{
|
||||
usb_slist_t *tmp = l;
|
||||
/* remove slist head */
|
||||
while (tmp->next && tmp->next != n) {
|
||||
tmp = tmp->next;
|
||||
}
|
||||
|
||||
/* remove node */
|
||||
if (tmp->next != (usb_slist_t *)0) {
|
||||
tmp->next = tmp->next->next;
|
||||
}
|
||||
|
||||
return l;
|
||||
}
|
||||
|
||||
static inline unsigned int usb_slist_len(const usb_slist_t *l)
|
||||
{
|
||||
unsigned int len = 0;
|
||||
const usb_slist_t *list = l->next;
|
||||
|
||||
while (list != NULL) {
|
||||
list = list->next;
|
||||
len++;
|
||||
}
|
||||
|
||||
return len;
|
||||
}
|
||||
|
||||
static inline unsigned int usb_slist_contains(usb_slist_t *l, usb_slist_t *n)
|
||||
{
|
||||
while (l->next) {
|
||||
if (l->next == n) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
l = l->next;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static inline usb_slist_t *usb_slist_head(usb_slist_t *l)
|
||||
{
|
||||
return l->next;
|
||||
}
|
||||
|
||||
static inline usb_slist_t *usb_slist_tail(usb_slist_t *l)
|
||||
{
|
||||
while (l->next) {
|
||||
l = l->next;
|
||||
}
|
||||
|
||||
return l;
|
||||
}
|
||||
|
||||
static inline usb_slist_t *usb_slist_next(usb_slist_t *n)
|
||||
{
|
||||
return n->next;
|
||||
}
|
||||
|
||||
static inline int usb_slist_isempty(usb_slist_t *l)
|
||||
{
|
||||
return l->next == NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief initialize a slist object
|
||||
*/
|
||||
#define USB_SLIST_OBJECT_INIT(object) \
|
||||
{ \
|
||||
NULL \
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief initialize a slist object
|
||||
*/
|
||||
#define USB_SLIST_DEFINE(slist) \
|
||||
usb_slist_t slist = { NULL }
|
||||
|
||||
/**
|
||||
* @brief get the struct for this single list node
|
||||
* @param node the entry point
|
||||
* @param type the type of structure
|
||||
* @param member the name of list in structure
|
||||
*/
|
||||
#define usb_slist_entry(node, type, member) \
|
||||
usb_container_of(node, type, member)
|
||||
|
||||
/**
|
||||
* usb_slist_first_entry - get the first element from a slist
|
||||
* @ptr: the slist head to take the element from.
|
||||
* @type: the type of the struct this is embedded in.
|
||||
* @member: the name of the slist_struct within the struct.
|
||||
*
|
||||
* Note, that slist is expected to be not empty.
|
||||
*/
|
||||
#define usb_slist_first_entry(ptr, type, member) \
|
||||
usb_slist_entry((ptr)->next, type, member)
|
||||
|
||||
/**
|
||||
* usb_slist_tail_entry - get the tail element from a slist
|
||||
* @ptr: the slist head to take the element from.
|
||||
* @type: the type of the struct this is embedded in.
|
||||
* @member: the name of the slist_struct within the struct.
|
||||
*
|
||||
* Note, that slist is expected to be not empty.
|
||||
*/
|
||||
#define usb_slist_tail_entry(ptr, type, member) \
|
||||
usb_slist_entry(usb_slist_tail(ptr), type, member)
|
||||
|
||||
/**
|
||||
* usb_slist_first_entry_or_null - get the first element from a slist
|
||||
* @ptr: the slist head to take the element from.
|
||||
* @type: the type of the struct this is embedded in.
|
||||
* @member: the name of the slist_struct within the struct.
|
||||
*
|
||||
* Note, that slist is expected to be not empty.
|
||||
*/
|
||||
#define usb_slist_first_entry_or_null(ptr, type, member) \
|
||||
(usb_slist_isempty(ptr) ? NULL : usb_slist_first_entry(ptr, type, member))
|
||||
|
||||
/**
|
||||
* usb_slist_for_each - iterate over a single list
|
||||
* @pos: the usb_slist_t * to use as a loop cursor.
|
||||
* @head: the head for your single list.
|
||||
*/
|
||||
#define usb_slist_for_each(pos, head) \
|
||||
for (pos = (head)->next; pos != NULL; pos = pos->next)
|
||||
|
||||
#define usb_slist_for_each_safe(pos, next, head) \
|
||||
for (pos = (head)->next, next = pos->next; pos; \
|
||||
pos = next, next = pos->next)
|
||||
|
||||
/**
|
||||
* usb_slist_for_each_entry - iterate over single list of given type
|
||||
* @pos: the type * to use as a loop cursor.
|
||||
* @head: the head for your single list.
|
||||
* @member: the name of the list_struct within the struct.
|
||||
*/
|
||||
#define usb_slist_for_each_entry(pos, head, member) \
|
||||
for (pos = usb_slist_entry((head)->next, typeof(*pos), member); \
|
||||
&pos->member != (NULL); \
|
||||
pos = usb_slist_entry(pos->member.next, typeof(*pos), member))
|
||||
|
||||
#define usb_slist_for_each_entry_safe(pos, n, head, member) \
|
||||
for (pos = usb_slist_entry((head)->next, typeof(*pos), member), \
|
||||
n = usb_slist_entry(pos->member.next, typeof(*pos), member); \
|
||||
&pos->member != (NULL); \
|
||||
pos = n, n = usb_slist_entry(pos->member.next, typeof(*pos), member))
|
||||
|
||||
/**
|
||||
* Double List structure
|
||||
*/
|
||||
struct usb_dlist_node {
|
||||
struct usb_dlist_node *next; /**< point to next node. */
|
||||
struct usb_dlist_node *prev; /**< point to prev node. */
|
||||
};
|
||||
typedef struct usb_dlist_node usb_dlist_t; /**< Type for lists. */
|
||||
|
||||
/**
|
||||
* @brief initialize a list
|
||||
*
|
||||
* @param l list to be initialized
|
||||
*/
|
||||
static inline void usb_dlist_init(usb_dlist_t *l)
|
||||
{
|
||||
l->next = l->prev = l;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief insert a node after a list
|
||||
*
|
||||
* @param l list to insert it
|
||||
* @param n new node to be inserted
|
||||
*/
|
||||
static inline void usb_dlist_insert_after(usb_dlist_t *l, usb_dlist_t *n)
|
||||
{
|
||||
l->next->prev = n;
|
||||
n->next = l->next;
|
||||
|
||||
l->next = n;
|
||||
n->prev = l;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief insert a node before a list
|
||||
*
|
||||
* @param n new node to be inserted
|
||||
* @param l list to insert it
|
||||
*/
|
||||
static inline void usb_dlist_insert_before(usb_dlist_t *l, usb_dlist_t *n)
|
||||
{
|
||||
l->prev->next = n;
|
||||
n->prev = l->prev;
|
||||
|
||||
l->prev = n;
|
||||
n->next = l;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief remove node from list.
|
||||
* @param n the node to remove from the list.
|
||||
*/
|
||||
static inline void usb_dlist_remove(usb_dlist_t *n)
|
||||
{
|
||||
n->next->prev = n->prev;
|
||||
n->prev->next = n->next;
|
||||
|
||||
n->next = n->prev = n;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief move node from list.
|
||||
* @param n the node to remove from the list.
|
||||
*/
|
||||
static inline void usb_dlist_move_head(usb_dlist_t *l, usb_dlist_t *n)
|
||||
{
|
||||
usb_dlist_remove(n);
|
||||
usb_dlist_insert_after(l, n);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief move node from list.
|
||||
* @param n the node to remove from the list.
|
||||
*/
|
||||
static inline void usb_dlist_move_tail(usb_dlist_t *l, usb_dlist_t *n)
|
||||
{
|
||||
usb_dlist_remove(n);
|
||||
usb_dlist_insert_before(l, n);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief tests whether a list is empty
|
||||
* @param l the list to test.
|
||||
*/
|
||||
static inline int usb_dlist_isempty(const usb_dlist_t *l)
|
||||
{
|
||||
return l->next == l;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief get the list length
|
||||
* @param l the list to get.
|
||||
*/
|
||||
static inline unsigned int usb_dlist_len(const usb_dlist_t *l)
|
||||
{
|
||||
unsigned int len = 0;
|
||||
const usb_dlist_t *p = l;
|
||||
|
||||
while (p->next != l) {
|
||||
p = p->next;
|
||||
len++;
|
||||
}
|
||||
|
||||
return len;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief initialize a dlist object
|
||||
*/
|
||||
#define USB_DLIST_OBJECT_INIT(object) \
|
||||
{ \
|
||||
&(object), &(object) \
|
||||
}
|
||||
/**
|
||||
* @brief initialize a dlist object
|
||||
*/
|
||||
#define USB_DLIST_DEFINE(list) \
|
||||
usb_dlist_t list = { &(list), &(list) }
|
||||
|
||||
/**
|
||||
* @brief get the struct for this entry
|
||||
* @param node the entry point
|
||||
* @param type the type of structure
|
||||
* @param member the name of list in structure
|
||||
*/
|
||||
#define usb_dlist_entry(node, type, member) \
|
||||
usb_container_of(node, type, member)
|
||||
|
||||
/**
|
||||
* dlist_first_entry - get the first element from a list
|
||||
* @ptr: the list head to take the element from.
|
||||
* @type: the type of the struct this is embedded in.
|
||||
* @member: the name of the list_struct within the struct.
|
||||
*
|
||||
* Note, that list is expected to be not empty.
|
||||
*/
|
||||
#define usb_dlist_first_entry(ptr, type, member) \
|
||||
usb_dlist_entry((ptr)->next, type, member)
|
||||
/**
|
||||
* dlist_first_entry_or_null - get the first element from a list
|
||||
* @ptr: the list head to take the element from.
|
||||
* @type: the type of the struct this is embedded in.
|
||||
* @member: the name of the list_struct within the struct.
|
||||
*
|
||||
* Note, that list is expected to be not empty.
|
||||
*/
|
||||
#define usb_dlist_first_entry_or_null(ptr, type, member) \
|
||||
(usb_dlist_isempty(ptr) ? NULL : usb_dlist_first_entry(ptr, type, member))
|
||||
|
||||
/**
|
||||
* usb_dlist_for_each - iterate over a list
|
||||
* @pos: the usb_dlist_t * to use as a loop cursor.
|
||||
* @head: the head for your list.
|
||||
*/
|
||||
#define usb_dlist_for_each(pos, head) \
|
||||
for (pos = (head)->next; pos != (head); pos = pos->next)
|
||||
|
||||
/**
|
||||
* usb_dlist_for_each_prev - iterate over a list
|
||||
* @pos: the dlist_t * to use as a loop cursor.
|
||||
* @head: the head for your list.
|
||||
*/
|
||||
#define usb_dlist_for_each_prev(pos, head) \
|
||||
for (pos = (head)->prev; pos != (head); pos = pos->prev)
|
||||
|
||||
/**
|
||||
* usb_dlist_for_each_safe - iterate over a list safe against removal of list entry
|
||||
* @pos: the dlist_t * to use as a loop cursor.
|
||||
* @n: another dlist_t * to use as temporary storage
|
||||
* @head: the head for your list.
|
||||
*/
|
||||
#define usb_dlist_for_each_safe(pos, n, head) \
|
||||
for (pos = (head)->next, n = pos->next; pos != (head); \
|
||||
pos = n, n = pos->next)
|
||||
|
||||
#define usb_dlist_for_each_prev_safe(pos, n, head) \
|
||||
for (pos = (head)->prev, n = pos->prev; pos != (head); \
|
||||
pos = n, n = pos->prev)
|
||||
/**
|
||||
* usb_dlist_for_each_entry - iterate over list of given type
|
||||
* @pos: the type * to use as a loop cursor.
|
||||
* @head: the head for your list.
|
||||
* @member: the name of the list_struct within the struct.
|
||||
*/
|
||||
#define usb_dlist_for_each_entry(pos, head, member) \
|
||||
for (pos = usb_dlist_entry((head)->next, typeof(*pos), member); \
|
||||
&pos->member != (head); \
|
||||
pos = usb_dlist_entry(pos->member.next, typeof(*pos), member))
|
||||
|
||||
/**
|
||||
* usb_usb_dlist_for_each_entry_reverse - iterate over list of given type
|
||||
* @pos: the type * to use as a loop cursor.
|
||||
* @head: the head for your list.
|
||||
* @member: the name of the list_struct within the struct.
|
||||
*/
|
||||
#define usb_dlist_for_each_entry_reverse(pos, head, member) \
|
||||
for (pos = usb_dlist_entry((head)->prev, typeof(*pos), member); \
|
||||
&pos->member != (head); \
|
||||
pos = usb_dlist_entry(pos->member.prev, typeof(*pos), member))
|
||||
|
||||
/**
|
||||
* usb_usb_dlist_for_each_entry_safe - iterate over list of given type safe against removal of list entry
|
||||
* @pos: the type * to use as a loop cursor.
|
||||
* @n: another type * to use as temporary storage
|
||||
* @head: the head for your list.
|
||||
* @member: the name of the list_struct within the struct.
|
||||
*/
|
||||
#define usb_dlist_for_each_entry_safe(pos, n, head, member) \
|
||||
for (pos = usb_dlist_entry((head)->next, typeof(*pos), member), \
|
||||
n = usb_dlist_entry(pos->member.next, typeof(*pos), member); \
|
||||
&pos->member != (head); \
|
||||
pos = n, n = usb_dlist_entry(n->member.next, typeof(*n), member))
|
||||
|
||||
/**
|
||||
* usb_usb_dlist_for_each_entry_safe - iterate over list of given type safe against removal of list entry
|
||||
* @pos: the type * to use as a loop cursor.
|
||||
* @n: another type * to use as temporary storage
|
||||
* @head: the head for your list.
|
||||
* @member: the name of the list_struct within the struct.
|
||||
*/
|
||||
#define usb_dlist_for_each_entry_safe_reverse(pos, n, head, member) \
|
||||
for (pos = usb_dlist_entry((head)->prev, typeof(*pos), field), \
|
||||
n = usb_dlist_entry(pos->member.prev, typeof(*pos), member); \
|
||||
&pos->member != (head); \
|
||||
pos = n, n = usb_dlist_entry(pos->member.prev, typeof(*pos), member))
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* USB_LIST_H */
|
||||
@@ -0,0 +1,85 @@
|
||||
/*
|
||||
* Copyright (c) 2022, sakumisu
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
#ifndef USB_LOG_H
|
||||
#define USB_LOG_H
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
/* DEBUG level */
|
||||
#define USB_DBG_ERROR 0
|
||||
#define USB_DBG_WARNING 1
|
||||
#define USB_DBG_INFO 2
|
||||
#define USB_DBG_LOG 3
|
||||
|
||||
#ifndef USB_DBG_TAG
|
||||
#define USB_DBG_TAG "USB"
|
||||
#endif
|
||||
/*
|
||||
* The color for terminal (foreground)
|
||||
* BLACK 30
|
||||
* RED 31
|
||||
* GREEN 32
|
||||
* YELLOW 33
|
||||
* BLUE 34
|
||||
* PURPLE 35
|
||||
* CYAN 36
|
||||
* WHITE 37
|
||||
*/
|
||||
|
||||
#ifdef CONFIG_USB_PRINTF_COLOR_ENABLE
|
||||
#define _USB_DBG_COLOR(n) CONFIG_USB_PRINTF("\033[" #n "m")
|
||||
#define _USB_DBG_LOG_HDR(lvl_name, color_n) \
|
||||
CONFIG_USB_PRINTF("\033[" #color_n "m[" lvl_name "/" USB_DBG_TAG "] ")
|
||||
#define _USB_DBG_LOG_X_END \
|
||||
CONFIG_USB_PRINTF("\033[0m")
|
||||
#else
|
||||
#define _USB_DBG_COLOR(n)
|
||||
#define _USB_DBG_LOG_HDR(lvl_name, color_n) \
|
||||
CONFIG_USB_PRINTF("[" lvl_name "/" USB_DBG_TAG "] ")
|
||||
#define _USB_DBG_LOG_X_END
|
||||
#endif
|
||||
|
||||
#define usb_dbg_log_line(lvl, color_n, fmt, ...) \
|
||||
do { \
|
||||
_USB_DBG_LOG_HDR(lvl, color_n); \
|
||||
CONFIG_USB_PRINTF(fmt, ##__VA_ARGS__); \
|
||||
_USB_DBG_LOG_X_END; \
|
||||
} while (0)
|
||||
|
||||
#if (CONFIG_USB_DBG_LEVEL >= USB_DBG_LOG)
|
||||
#define USB_LOG_DBG(fmt, ...) usb_dbg_log_line("D", 0, fmt, ##__VA_ARGS__)
|
||||
#else
|
||||
#define USB_LOG_DBG(...) {}
|
||||
#endif
|
||||
|
||||
#if (CONFIG_USB_DBG_LEVEL >= USB_DBG_INFO)
|
||||
#define USB_LOG_INFO(fmt, ...) usb_dbg_log_line("I", 32, fmt, ##__VA_ARGS__)
|
||||
#else
|
||||
#define USB_LOG_INFO(...) {}
|
||||
#endif
|
||||
|
||||
#if (CONFIG_USB_DBG_LEVEL >= USB_DBG_WARNING)
|
||||
#define USB_LOG_WRN(fmt, ...) usb_dbg_log_line("W", 33, fmt, ##__VA_ARGS__)
|
||||
#else
|
||||
#define USB_LOG_WRN(...) {}
|
||||
#endif
|
||||
|
||||
#if (CONFIG_USB_DBG_LEVEL >= USB_DBG_ERROR)
|
||||
#define USB_LOG_ERR(fmt, ...) usb_dbg_log_line("E", 31, fmt, ##__VA_ARGS__)
|
||||
#else
|
||||
#define USB_LOG_ERR(...) {}
|
||||
#endif
|
||||
|
||||
#define USB_LOG_RAW(...) CONFIG_USB_PRINTF(__VA_ARGS__)
|
||||
|
||||
void usb_assert(const char *filename, int linenum);
|
||||
#define USB_ASSERT(f) \
|
||||
do { \
|
||||
if (!(f)) \
|
||||
usb_assert(__FILE__, __LINE__); \
|
||||
} while (0)
|
||||
|
||||
#endif /* USB_LOG_H */
|
||||
@@ -0,0 +1,59 @@
|
||||
/*
|
||||
* Copyright (c) 2022, sakumisu
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
#ifndef USB_OSAL_H
|
||||
#define USB_OSAL_H
|
||||
|
||||
#include <stdint.h>
|
||||
#include <string.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
#define USB_OSAL_WAITING_FOREVER (0xFFFFFFFFU)
|
||||
|
||||
typedef void *usb_osal_thread_t;
|
||||
typedef void *usb_osal_sem_t;
|
||||
typedef void *usb_osal_mutex_t;
|
||||
typedef void *usb_osal_mq_t;
|
||||
typedef void (*usb_thread_entry_t)(void *argument);
|
||||
typedef void (*usb_timer_handler_t)(void *argument);
|
||||
struct usb_osal_timer {
|
||||
usb_timer_handler_t handler;
|
||||
void *argument;
|
||||
void *timer;
|
||||
};
|
||||
|
||||
/*
|
||||
* Task with smaller priority value indicates higher task priority
|
||||
*/
|
||||
usb_osal_thread_t usb_osal_thread_create(const char *name, uint32_t stack_size, uint32_t prio, usb_thread_entry_t entry, void *args);
|
||||
void usb_osal_thread_delete(usb_osal_thread_t thread);
|
||||
|
||||
usb_osal_sem_t usb_osal_sem_create(uint32_t initial_count);
|
||||
void usb_osal_sem_delete(usb_osal_sem_t sem);
|
||||
int usb_osal_sem_take(usb_osal_sem_t sem, uint32_t timeout);
|
||||
int usb_osal_sem_give(usb_osal_sem_t sem);
|
||||
void usb_osal_sem_reset(usb_osal_sem_t sem);
|
||||
|
||||
usb_osal_mutex_t usb_osal_mutex_create(void);
|
||||
void usb_osal_mutex_delete(usb_osal_mutex_t mutex);
|
||||
int usb_osal_mutex_take(usb_osal_mutex_t mutex);
|
||||
int usb_osal_mutex_give(usb_osal_mutex_t mutex);
|
||||
|
||||
usb_osal_mq_t usb_osal_mq_create(uint32_t max_msgs);
|
||||
void usb_osal_mq_delete(usb_osal_mq_t mq);
|
||||
int usb_osal_mq_send(usb_osal_mq_t mq, uintptr_t addr);
|
||||
int usb_osal_mq_recv(usb_osal_mq_t mq, uintptr_t *addr, uint32_t timeout);
|
||||
|
||||
struct usb_osal_timer *usb_osal_timer_create(const char *name, uint32_t timeout_ms, usb_timer_handler_t handler, void *argument, bool is_period);
|
||||
void usb_osal_timer_delete(struct usb_osal_timer *timer);
|
||||
void usb_osal_timer_start(struct usb_osal_timer *timer);
|
||||
void usb_osal_timer_stop(struct usb_osal_timer *timer);
|
||||
|
||||
size_t usb_osal_enter_critical_section(void);
|
||||
void usb_osal_leave_critical_section(size_t flag);
|
||||
|
||||
void usb_osal_msleep(uint32_t delay);
|
||||
|
||||
#endif /* USB_OSAL_H */
|
||||
@@ -0,0 +1,210 @@
|
||||
/*
|
||||
* Copyright (c) 2022-2023, sakumisu
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
#ifndef USB_UTIL_H
|
||||
#define USB_UTIL_H
|
||||
|
||||
#if defined(__CC_ARM)
|
||||
#ifndef __USED
|
||||
#define __USED __attribute__((used))
|
||||
#endif
|
||||
#ifndef __WEAK
|
||||
#define __WEAK __attribute__((weak))
|
||||
#endif
|
||||
#ifndef __PACKED
|
||||
#define __PACKED __attribute__((packed))
|
||||
#endif
|
||||
#ifndef __PACKED_STRUCT
|
||||
#define __PACKED_STRUCT __packed struct
|
||||
#endif
|
||||
#ifndef __PACKED_UNION
|
||||
#define __PACKED_UNION __packed union
|
||||
#endif
|
||||
#ifndef __ALIGNED
|
||||
#define __ALIGNED(x) __attribute__((aligned(x)))
|
||||
#endif
|
||||
#elif defined(__GNUC__)
|
||||
#ifndef __USED
|
||||
#define __USED __attribute__((used))
|
||||
#endif
|
||||
#ifndef __WEAK
|
||||
#define __WEAK __attribute__((weak))
|
||||
#endif
|
||||
#ifndef __PACKED
|
||||
#define __PACKED __attribute__((packed, aligned(1)))
|
||||
#endif
|
||||
#ifndef __PACKED_STRUCT
|
||||
#define __PACKED_STRUCT struct __attribute__((packed, aligned(1)))
|
||||
#endif
|
||||
#ifndef __PACKED_UNION
|
||||
#define __PACKED_UNION union __attribute__((packed, aligned(1)))
|
||||
#endif
|
||||
#ifndef __ALIGNED
|
||||
#define __ALIGNED(x) __attribute__((aligned(x)))
|
||||
#endif
|
||||
#elif defined(__ICCARM__) || defined(__ICCRX__) || defined(__ICCRISCV__)
|
||||
#ifndef __USED
|
||||
#if defined(__ICCARM_V8) || defined(__ICCRISCV__)
|
||||
#define __USED __attribute__((used))
|
||||
#else
|
||||
#define __USED __root
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef __WEAK
|
||||
#if defined(__ICCARM_V8) || defined(__ICCRISCV__)
|
||||
#define __WEAK __attribute__((weak))
|
||||
#else
|
||||
#define __WEAK _Pragma("__weak")
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef __PACKED
|
||||
#if defined(__ICCARM_V8) || defined(__ICCRISCV__)
|
||||
#define __PACKED __attribute__((packed, aligned(1)))
|
||||
#else
|
||||
/* Needs IAR language extensions */
|
||||
#define __PACKED __packed
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef __PACKED_STRUCT
|
||||
#if defined(__ICCARM_V8) || defined(__ICCRISCV__)
|
||||
#define __PACKED_STRUCT struct __attribute__((packed, aligned(1)))
|
||||
#else
|
||||
/* Needs IAR language extensions */
|
||||
#define __PACKED_STRUCT __packed struct
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef __PACKED_UNION
|
||||
#if defined(__ICCARM_V8) || defined(__ICCRISCV__)
|
||||
#define __PACKED_UNION union __attribute__((packed, aligned(1)))
|
||||
#else
|
||||
/* Needs IAR language extensions */
|
||||
#define __PACKED_UNION __packed union
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef __ALIGNED
|
||||
#if defined(__ICCARM_V8) || defined(__ICCRISCV__)
|
||||
#define __ALIGNED(x) __attribute__((aligned(x)))
|
||||
#elif (__VER__ >= 7080000)
|
||||
/* Needs IAR language extensions */
|
||||
#define __ALIGNED(x) __attribute__((aligned(x)))
|
||||
#else
|
||||
#warning No compiler specific solution for __ALIGNED.__ALIGNED is ignored.
|
||||
#define __ALIGNED(x)
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
#ifndef __ALIGN_BEGIN
|
||||
#define __ALIGN_BEGIN
|
||||
#endif
|
||||
#ifndef __ALIGN_END
|
||||
#define __ALIGN_END __attribute__((aligned(4)))
|
||||
#endif
|
||||
|
||||
#ifndef ARG_UNUSED
|
||||
#define ARG_UNUSED(x) (void)(x)
|
||||
#endif
|
||||
|
||||
#ifndef LO_BYTE
|
||||
#define LO_BYTE(x) ((uint8_t)(x & 0x00FF))
|
||||
#endif
|
||||
|
||||
#ifndef HI_BYTE
|
||||
#define HI_BYTE(x) ((uint8_t)((x & 0xFF00) >> 8))
|
||||
#endif
|
||||
|
||||
#ifndef MAX
|
||||
#define MAX(a, b) (((a) > (b)) ? (a) : (b))
|
||||
#endif
|
||||
|
||||
#ifndef MIN
|
||||
#define MIN(a, b) (((a) < (b)) ? (a) : (b))
|
||||
#endif
|
||||
|
||||
#ifndef BCD
|
||||
#define BCD(x) ((((x) / 10) << 4) | ((x) % 10))
|
||||
#endif
|
||||
|
||||
#ifdef BIT
|
||||
#undef BIT
|
||||
#define BIT(n) (1UL << (n))
|
||||
#else
|
||||
#define BIT(n) (1UL << (n))
|
||||
#endif
|
||||
|
||||
#ifndef ARRAY_SIZE
|
||||
#define ARRAY_SIZE(array) \
|
||||
((int)((sizeof(array) / sizeof((array)[0]))))
|
||||
#endif
|
||||
|
||||
#ifndef BSWAP16
|
||||
#define BSWAP16(u16) (__builtin_bswap16(u16))
|
||||
#endif
|
||||
#ifndef BSWAP32
|
||||
#define BSWAP32(u32) (__builtin_bswap32(u32))
|
||||
#endif
|
||||
|
||||
#define GET_BE16(field) \
|
||||
(((uint16_t)(field)[0] << 8) | ((uint16_t)(field)[1]))
|
||||
|
||||
#define GET_BE32(field) \
|
||||
(((uint32_t)(field)[0] << 24) | ((uint32_t)(field)[1] << 16) | ((uint32_t)(field)[2] << 8) | ((uint32_t)(field)[3] << 0))
|
||||
|
||||
#define SET_BE16(field, value) \
|
||||
do { \
|
||||
(field)[0] = (uint8_t)((value) >> 8); \
|
||||
(field)[1] = (uint8_t)((value) >> 0); \
|
||||
} while (0)
|
||||
|
||||
#define SET_BE24(field, value) \
|
||||
do { \
|
||||
(field)[0] = (uint8_t)((value) >> 16); \
|
||||
(field)[1] = (uint8_t)((value) >> 8); \
|
||||
(field)[2] = (uint8_t)((value) >> 0); \
|
||||
} while (0)
|
||||
|
||||
#define SET_BE32(field, value) \
|
||||
do { \
|
||||
(field)[0] = (uint8_t)((value) >> 24); \
|
||||
(field)[1] = (uint8_t)((value) >> 16); \
|
||||
(field)[2] = (uint8_t)((value) >> 8); \
|
||||
(field)[3] = (uint8_t)((value) >> 0); \
|
||||
} while (0)
|
||||
|
||||
#define WBVAL(x) (x & 0xFF), ((x >> 8) & 0xFF)
|
||||
#define DBVAL(x) (x & 0xFF), ((x >> 8) & 0xFF), ((x >> 16) & 0xFF), ((x >> 24) & 0xFF)
|
||||
|
||||
#define PP_NARG(...) \
|
||||
PP_NARG_(__VA_ARGS__, PP_RSEQ_N())
|
||||
#define PP_NARG_(...) \
|
||||
PP_ARG_N(__VA_ARGS__)
|
||||
#define PP_ARG_N( \
|
||||
_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, \
|
||||
_11, _12, _13, _14, _15, _16, _17, _18, _19, _20, \
|
||||
_21, _22, _23, _24, _25, _26, _27, _28, _29, _30, \
|
||||
_31, _32, _33, _34, _35, _36, _37, _38, _39, _40, \
|
||||
_41, _42, _43, _44, _45, _46, _47, _48, _49, _50, \
|
||||
_51, _52, _53, _54, _55, _56, _57, _58, _59, _60, \
|
||||
_61, _62, _63, N, ...) N
|
||||
#define PP_RSEQ_N() \
|
||||
63, 62, 61, 60, \
|
||||
59, 58, 57, 56, 55, 54, 53, 52, 51, 50, \
|
||||
49, 48, 47, 46, 45, 44, 43, 42, 41, 40, \
|
||||
39, 38, 37, 36, 35, 34, 33, 32, 31, 30, \
|
||||
29, 28, 27, 26, 25, 24, 23, 22, 21, 20, \
|
||||
19, 18, 17, 16, 15, 14, 13, 12, 11, 10, \
|
||||
9, 8, 7, 6, 5, 4, 3, 2, 1, 0
|
||||
|
||||
#define USB_MEM_ALIGNX __attribute__((aligned(CONFIG_USB_ALIGN_SIZE)))
|
||||
|
||||
#define USB_ALIGN_UP(size, align) (((size) + (align)-1) & ~((align)-1))
|
||||
|
||||
#endif /* USB_UTIL_H */
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,108 @@
|
||||
/*
|
||||
* Copyright (c) 2022, sakumisu
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
#ifndef USBD_CORE_H
|
||||
#define USBD_CORE_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <string.h>
|
||||
#include <stdint.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "usb_config.h"
|
||||
#include "usb_util.h"
|
||||
#include "usb_errno.h"
|
||||
#include "usb_def.h"
|
||||
#include "usb_list.h"
|
||||
#include "usb_log.h"
|
||||
#include "usb_dc.h"
|
||||
|
||||
enum usbd_event_type {
|
||||
/* USB DCD IRQ */
|
||||
USBD_EVENT_ERROR, /** USB error reported by the controller */
|
||||
USBD_EVENT_RESET, /** USB reset */
|
||||
USBD_EVENT_SOF, /** Start of Frame received */
|
||||
USBD_EVENT_CONNECTED, /** USB connected*/
|
||||
USBD_EVENT_DISCONNECTED, /** USB disconnected */
|
||||
USBD_EVENT_SUSPEND, /** USB connection suspended by the HOST */
|
||||
USBD_EVENT_RESUME, /** USB connection resumed by the HOST */
|
||||
|
||||
/* USB DEVICE STATUS */
|
||||
USBD_EVENT_CONFIGURED, /** USB configuration done */
|
||||
USBD_EVENT_SET_INTERFACE, /** USB interface selected */
|
||||
USBD_EVENT_SET_REMOTE_WAKEUP, /** USB set remote wakeup */
|
||||
USBD_EVENT_CLR_REMOTE_WAKEUP, /** USB clear remote wakeup */
|
||||
USBD_EVENT_INIT, /** USB init done when call usbd_initialize */
|
||||
USBD_EVENT_DEINIT, /** USB deinit done when call usbd_deinitialize */
|
||||
USBD_EVENT_UNKNOWN
|
||||
};
|
||||
|
||||
typedef int (*usbd_request_handler)(uint8_t busid, struct usb_setup_packet *setup, uint8_t **data, uint32_t *len);
|
||||
typedef void (*usbd_endpoint_callback)(uint8_t busid, uint8_t ep, uint32_t nbytes);
|
||||
typedef void (*usbd_notify_handler)(uint8_t busid, uint8_t event, void *arg);
|
||||
|
||||
struct usbd_endpoint {
|
||||
uint8_t ep_addr;
|
||||
usbd_endpoint_callback ep_cb;
|
||||
};
|
||||
|
||||
struct usbd_interface {
|
||||
usbd_request_handler class_interface_handler;
|
||||
usbd_request_handler class_endpoint_handler;
|
||||
usbd_request_handler vendor_handler;
|
||||
usbd_notify_handler notify_handler;
|
||||
const uint8_t *hid_report_descriptor;
|
||||
uint32_t hid_report_descriptor_len;
|
||||
uint8_t intf_num;
|
||||
};
|
||||
|
||||
struct usb_descriptor {
|
||||
const uint8_t *(*device_descriptor_callback)(uint8_t speed);
|
||||
const uint8_t *(*config_descriptor_callback)(uint8_t speed);
|
||||
const uint8_t *(*device_quality_descriptor_callback)(uint8_t speed);
|
||||
const uint8_t *(*other_speed_descriptor_callback)(uint8_t speed);
|
||||
const uint8_t *(*string_descriptor_callback)(uint8_t speed, uint8_t index);
|
||||
const struct usb_msosv1_descriptor *msosv1_descriptor;
|
||||
const struct usb_msosv2_descriptor *msosv2_descriptor;
|
||||
const struct usb_webusb_url_ex_descriptor *webusb_url_descriptor;
|
||||
const struct usb_bos_descriptor *bos_descriptor;
|
||||
};
|
||||
|
||||
struct usbd_bus {
|
||||
uint8_t busid;
|
||||
uint32_t reg_base;
|
||||
};
|
||||
|
||||
extern struct usbd_bus g_usbdev_bus[];
|
||||
|
||||
#ifdef USBD_IRQHandler
|
||||
#error USBD_IRQHandler is obsolete, please call USBD_IRQHandler(xxx) in your irq
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_USBDEV_ADVANCE_DESC
|
||||
void usbd_desc_register(uint8_t busid, const struct usb_descriptor *desc);
|
||||
#else
|
||||
void usbd_desc_register(uint8_t busid, const uint8_t *desc);
|
||||
void usbd_msosv1_desc_register(uint8_t busid, struct usb_msosv1_descriptor *desc);
|
||||
void usbd_msosv2_desc_register(uint8_t busid, struct usb_msosv2_descriptor *desc);
|
||||
void usbd_bos_desc_register(uint8_t busid, struct usb_bos_descriptor *desc);
|
||||
#endif
|
||||
|
||||
void usbd_add_interface(uint8_t busid, struct usbd_interface *intf);
|
||||
void usbd_add_endpoint(uint8_t busid, struct usbd_endpoint *ep);
|
||||
|
||||
bool usb_device_is_configured(uint8_t busid);
|
||||
int usbd_initialize(uint8_t busid, uint32_t reg_base, void (*event_handler)(uint8_t busid, uint8_t event));
|
||||
int usbd_deinitialize(uint8_t busid);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* USBD_CORE_H */
|
||||
@@ -0,0 +1,626 @@
|
||||
#include "usbd_core.h"
|
||||
#include "usb_ch58x_usbfs_reg.h"
|
||||
|
||||
/**
|
||||
* @brief Related register macro
|
||||
*/
|
||||
#define USB0_BASE 0x40023400u
|
||||
#define USB1_BASE 0x40008400u
|
||||
|
||||
#ifndef USBD
|
||||
#define USBD USB0_BASE
|
||||
#endif
|
||||
#define CH58x_USBFS_DEV ((USB_FS_TypeDef *)USBD)
|
||||
|
||||
#ifndef USBD_IRQHandler
|
||||
#define USBD_IRQHandler USBFS_IRQHandler //use actual usb irq name instead
|
||||
#endif
|
||||
void USBD_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast")));
|
||||
|
||||
/*!< 8-bit value of endpoint control register */
|
||||
#define EPn_CTRL(epid) \
|
||||
*(volatile uint8_t *)(&(CH58x_USBFS_DEV->UEP0_CTRL) + epid * 4 + (epid / 5) * 48)
|
||||
|
||||
/*!< The length register value of the endpoint send buffer */
|
||||
#define EPn_TX_LEN(epid) \
|
||||
*(volatile uint8_t *)(&(CH58x_USBFS_DEV->UEP0_T_LEN) + epid * 4 + (epid / 5) * 48)
|
||||
|
||||
/*!< Read setup packet to use in ep0 in */
|
||||
#define GET_SETUP_PACKET(data_add) \
|
||||
*(struct usb_setup_packet *)data_add
|
||||
|
||||
/*!< Set epid ep tx valid // Not an isochronous endpoint */
|
||||
#define EPn_SET_TX_VALID(epid) \
|
||||
EPn_CTRL(epid) = (EPn_CTRL(epid) & ~MASK_UEP_T_RES) | UEP_T_RES_ACK;
|
||||
/*!< Set epid ep rx valid // Not an isochronous endpoint */
|
||||
#define EPn_SET_RX_VALID(epid) \
|
||||
EPn_CTRL(epid) = (EPn_CTRL(epid) & ~MASK_UEP_R_RES) | UEP_R_RES_ACK;
|
||||
/*!< Set epid ep tx valid // Isochronous endpoint */
|
||||
#define EPn_SET_TX_ISO_VALID(epid) \
|
||||
EPn_CTRL(epid) = (EPn_CTRL(epid) & ~MASK_UEP_T_RES) | UEP_T_RES_TOUT;
|
||||
/*!< Set epid ep rx valid // Isochronous endpoint */
|
||||
#define EPn_SET_RX_ISO_VALID(epid) \
|
||||
EPn_CTRL(epid) = (EPn_CTRL(epid) & ~MASK_UEP_R_RES) | UEP_R_RES_TOUT;
|
||||
/*!< Set epid ep tx nak */
|
||||
#define EPn_SET_TX_NAK(epid) \
|
||||
EPn_CTRL(epid) = (EPn_CTRL(epid) & ~MASK_UEP_T_RES) | UEP_T_RES_NAK;
|
||||
/*!< Set epid ep rx nak */
|
||||
#define EPn_SET_RX_NAK(epid) \
|
||||
EPn_CTRL(epid) = (EPn_CTRL(epid) & ~MASK_UEP_R_RES) | UEP_R_RES_NAK;
|
||||
/*!< Set epid ep tx stall */
|
||||
#define EPn_SET_TX_STALL(epid) \
|
||||
EPn_CTRL(epid) = (EPn_CTRL(epid) & ~MASK_UEP_T_RES) | UEP_T_RES_STALL
|
||||
/*!< Set epid ep rx stall */
|
||||
#define EPn_SET_RX_STALL(epid) \
|
||||
EPn_CTRL(epid) = (EPn_CTRL(epid) & ~MASK_UEP_R_RES) | UEP_R_RES_STALL
|
||||
/*!< Clear epid ep tx stall */
|
||||
#define EPn_CLR_TX_STALL(epid) \
|
||||
EPn_CTRL(epid) = (EPn_CTRL(epid) & ~(RB_UEP_T_TOG | MASK_UEP_T_RES)) | UEP_T_RES_NAK
|
||||
/*!< Clear epid ep rx stall */
|
||||
#define EPn_CLR_RX_STALL(epid) \
|
||||
EPn_CTRL(epid) = (EPn_CTRL(epid) & ~(RB_UEP_R_TOG | MASK_UEP_R_RES)) | UEP_R_RES_ACK
|
||||
/*!< Set epid ep tx len */
|
||||
#define EPn_SET_TX_LEN(epid, len) \
|
||||
EPn_TX_LEN(epid) = len
|
||||
/*!< Get epid ep rx len */
|
||||
#define EPn_GET_RX_LEN(epid) \
|
||||
CH58x_USBFS_DEV->USB_RX_LEN
|
||||
|
||||
/*!< ep nums */
|
||||
#ifndef USB_NUM_BIDIR_ENDPOINTS
|
||||
#define USB_NUM_BIDIR_ENDPOINTS 8
|
||||
#endif
|
||||
/*!< ep mps */
|
||||
#define EP_MPS 64
|
||||
/*!< set ep4 in mps 64 */
|
||||
#define EP4_IN_MPS EP_MPS
|
||||
/*!< set ep4 out mps 64 */
|
||||
#define EP4_OUT_MPS EP_MPS
|
||||
|
||||
/*!< User defined assignment endpoint RAM */
|
||||
__attribute__((aligned(4))) uint8_t ep0_data_buff[64 + EP4_OUT_MPS + EP4_IN_MPS]; /*!< ep0(64)+ep4_out(64)+ep4_in(64) */
|
||||
__attribute__((aligned(4))) uint8_t ep1_data_buff[64 + 64]; /*!< ep1_out(64)+ep1_in(64) */
|
||||
__attribute__((aligned(4))) uint8_t ep2_data_buff[64 + 64]; /*!< ep2_out(64)+ep2_in(64) */
|
||||
__attribute__((aligned(4))) uint8_t ep3_data_buff[64 + 64]; /*!< ep3_out(64)+ep3_in(64) */
|
||||
#if (USB_NUM_BIDIR_ENDPOINTS == 8)
|
||||
/**
|
||||
* This dcd porting can be used on ch581, ch582, ch583,
|
||||
* and also on ch571, ch572, and ch573. Note that only five endpoints are available for ch571, ch572, and ch573.
|
||||
*/
|
||||
__attribute__((aligned(4))) uint8_t ep5_data_buff[64 + 64]; /*!< ep5_out(64)+ep5_in(64) */
|
||||
__attribute__((aligned(4))) uint8_t ep6_data_buff[64 + 64]; /*!< ep6_out(64)+ep6_in(64) */
|
||||
__attribute__((aligned(4))) uint8_t ep7_data_buff[64 + 64]; /*!< ep7_out(64)+ep7_in(64) */
|
||||
#endif
|
||||
/**
|
||||
* @brief Endpoint information structure
|
||||
*/
|
||||
typedef struct _usbd_ep_info {
|
||||
uint8_t mps; /*!< Maximum packet length of endpoint */
|
||||
uint8_t eptype; /*!< Endpoint Type */
|
||||
uint8_t *ep_ram_addr; /*!< Endpoint buffer address */
|
||||
|
||||
uint8_t ep_enable; /* Endpoint enable */
|
||||
uint8_t *xfer_buf;
|
||||
uint32_t xfer_len;
|
||||
uint32_t actual_xfer_len;
|
||||
} usbd_ep_info;
|
||||
|
||||
/*!< ch58x usb */
|
||||
static struct _ch58x_core_prvi {
|
||||
uint8_t address; /*!< Address */
|
||||
usbd_ep_info ep_in[USB_NUM_BIDIR_ENDPOINTS];
|
||||
usbd_ep_info ep_out[USB_NUM_BIDIR_ENDPOINTS];
|
||||
struct usb_setup_packet setup;
|
||||
} usb_dc_cfg;
|
||||
|
||||
__WEAK void usb_dc_low_level_init(void)
|
||||
{
|
||||
}
|
||||
|
||||
__WEAK void usb_dc_low_level_deinit(void)
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief USB initialization
|
||||
* @pre None
|
||||
* @param[in] None
|
||||
* @retval >=0 success otherwise failure
|
||||
*/
|
||||
int usb_dc_init(uint8_t busid)
|
||||
{
|
||||
usb_dc_cfg.ep_in[0].ep_ram_addr = ep0_data_buff;
|
||||
usb_dc_cfg.ep_out[0].ep_ram_addr = ep0_data_buff;
|
||||
|
||||
usb_dc_cfg.ep_in[1].ep_ram_addr = ep1_data_buff + 64;
|
||||
usb_dc_cfg.ep_out[1].ep_ram_addr = ep1_data_buff;
|
||||
|
||||
usb_dc_cfg.ep_in[2].ep_ram_addr = ep2_data_buff + 64;
|
||||
usb_dc_cfg.ep_out[2].ep_ram_addr = ep2_data_buff;
|
||||
|
||||
usb_dc_cfg.ep_in[3].ep_ram_addr = ep3_data_buff + 64;
|
||||
usb_dc_cfg.ep_out[3].ep_ram_addr = ep3_data_buff;
|
||||
|
||||
usb_dc_cfg.ep_in[4].ep_ram_addr = ep0_data_buff + 64 + EP4_OUT_MPS;
|
||||
usb_dc_cfg.ep_out[4].ep_ram_addr = ep0_data_buff + 64;
|
||||
#if (USB_NUM_BIDIR_ENDPOINTS == 8)
|
||||
usb_dc_cfg.ep_in[5].ep_ram_addr = ep5_data_buff + 64;
|
||||
usb_dc_cfg.ep_out[5].ep_ram_addr = ep5_data_buff;
|
||||
|
||||
usb_dc_cfg.ep_in[6].ep_ram_addr = ep6_data_buff + 64;
|
||||
usb_dc_cfg.ep_out[6].ep_ram_addr = ep6_data_buff;
|
||||
|
||||
usb_dc_cfg.ep_in[7].ep_ram_addr = ep7_data_buff + 64;
|
||||
usb_dc_cfg.ep_out[7].ep_ram_addr = ep7_data_buff;
|
||||
#endif
|
||||
/*!< Set the mode first and cancel RB_UC_CLR_ALL */
|
||||
CH58x_USBFS_DEV->USB_CTRL = 0x00;
|
||||
CH58x_USBFS_DEV->UEP4_1_MOD = RB_UEP4_RX_EN | RB_UEP4_TX_EN | RB_UEP1_RX_EN | RB_UEP1_TX_EN; /*!< EP4 OUT+IN EP1 OUT+IN */
|
||||
CH58x_USBFS_DEV->UEP2_3_MOD = RB_UEP2_RX_EN | RB_UEP2_TX_EN | RB_UEP3_RX_EN | RB_UEP3_TX_EN; /*!< EP2 OUT+IN EP3 OUT+IN */
|
||||
#if (USB_NUM_BIDIR_ENDPOINTS == 8)
|
||||
CH58x_USBFS_DEV->UEP567_MOD = RB_UEP5_RX_EN | RB_UEP5_TX_EN | RB_UEP6_RX_EN | RB_UEP6_TX_EN | RB_UEP7_RX_EN | RB_UEP7_TX_EN; /*!< EP5 EP6 EP7 OUT+IN */
|
||||
#endif
|
||||
CH58x_USBFS_DEV->UEP0_DMA = (uint16_t)(uint32_t)ep0_data_buff;
|
||||
CH58x_USBFS_DEV->UEP1_DMA = (uint16_t)(uint32_t)ep1_data_buff;
|
||||
CH58x_USBFS_DEV->UEP2_DMA = (uint16_t)(uint32_t)ep2_data_buff;
|
||||
CH58x_USBFS_DEV->UEP3_DMA = (uint16_t)(uint32_t)ep3_data_buff;
|
||||
#if (USB_NUM_BIDIR_ENDPOINTS == 8)
|
||||
CH58x_USBFS_DEV->UEP5_DMA = (uint16_t)(uint32_t)ep5_data_buff;
|
||||
CH58x_USBFS_DEV->UEP6_DMA = (uint16_t)(uint32_t)ep6_data_buff;
|
||||
CH58x_USBFS_DEV->UEP7_DMA = (uint16_t)(uint32_t)ep7_data_buff;
|
||||
#endif
|
||||
CH58x_USBFS_DEV->UEP0_CTRL = UEP_R_RES_NAK | UEP_T_RES_NAK;
|
||||
CH58x_USBFS_DEV->UEP1_CTRL = UEP_R_RES_NAK | UEP_T_RES_NAK | RB_UEP_AUTO_TOG;
|
||||
CH58x_USBFS_DEV->UEP2_CTRL = UEP_R_RES_NAK | UEP_T_RES_NAK | RB_UEP_AUTO_TOG;
|
||||
CH58x_USBFS_DEV->UEP3_CTRL = UEP_R_RES_NAK | UEP_T_RES_NAK | RB_UEP_AUTO_TOG;
|
||||
CH58x_USBFS_DEV->UEP4_CTRL = UEP_R_RES_NAK | UEP_T_RES_NAK;
|
||||
#if (USB_NUM_BIDIR_ENDPOINTS == 8)
|
||||
CH58x_USBFS_DEV->UEP5_CTRL = UEP_R_RES_NAK | UEP_T_RES_NAK | RB_UEP_AUTO_TOG;
|
||||
CH58x_USBFS_DEV->UEP6_CTRL = UEP_R_RES_NAK | UEP_T_RES_NAK | RB_UEP_AUTO_TOG;
|
||||
CH58x_USBFS_DEV->UEP7_CTRL = UEP_R_RES_NAK | UEP_T_RES_NAK | RB_UEP_AUTO_TOG;
|
||||
#endif
|
||||
CH58x_USBFS_DEV->USB_DEV_AD = 0x00;
|
||||
|
||||
/*!< Start the USB device and DMA, and automatically return to NAK before the interrupt flag is cleared during the interrupt */
|
||||
CH58x_USBFS_DEV->USB_CTRL = RB_UC_DEV_PU_EN | RB_UC_INT_BUSY | RB_UC_DMA_EN;
|
||||
if ((uint32_t) & (CH58x_USBFS_DEV->USB_CTRL) == (uint32_t)USB0_BASE) {
|
||||
/*!< USB0 */
|
||||
R16_PIN_ANALOG_IE |= RB_PIN_USB_IE | RB_PIN_USB_DP_PU;
|
||||
} else if ((uint32_t) & (CH58x_USBFS_DEV->USB_CTRL) == (uint32_t)USB1_BASE) {
|
||||
/*!< USB1 */
|
||||
R16_PIN_ANALOG_IE |= RB_PIN_USB2_IE | RB_PIN_USB2_DP_PU;
|
||||
}
|
||||
|
||||
CH58x_USBFS_DEV->USB_INT_FG = 0xff; /*!< Clear interrupt flag */
|
||||
CH58x_USBFS_DEV->UDEV_CTRL = RB_UD_PD_DIS | RB_UD_PORT_EN; /*!< Allow USB port */
|
||||
CH58x_USBFS_DEV->USB_INT_EN = RB_UIE_SUSPEND | RB_UIE_BUS_RST | RB_UIE_TRANSFER;
|
||||
|
||||
usb_dc_low_level_init();
|
||||
return 0;
|
||||
}
|
||||
|
||||
int usb_dc_deinit(uint8_t busid)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Set address
|
||||
* @pre None
|
||||
* @param[in] address :8-bit valid address
|
||||
* @retval >=0 success otherwise failure
|
||||
*/
|
||||
int usbd_set_address(uint8_t busid, const uint8_t address)
|
||||
{
|
||||
if (address == 0) {
|
||||
CH58x_USBFS_DEV->USB_DEV_AD = (CH58x_USBFS_DEV->USB_DEV_AD & 0x80) | address;
|
||||
}
|
||||
usb_dc_cfg.address = address;
|
||||
return 0;
|
||||
}
|
||||
|
||||
uint8_t usbd_get_port_speed(uint8_t busid, const uint8_t port)
|
||||
{
|
||||
return USB_SPEED_FULL;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Open endpoint
|
||||
* @pre None
|
||||
* @param[in] ep_cfg : Endpoint configuration structure pointer
|
||||
* @retval >=0 success otherwise failure
|
||||
*/
|
||||
int usbd_ep_open(uint8_t busid, const struct usb_endpoint_descriptor *ep)
|
||||
{
|
||||
/*!< ep id */
|
||||
uint8_t epid = USB_EP_GET_IDX(ep->bEndpointAddress);
|
||||
if (epid > (USB_NUM_BIDIR_ENDPOINTS - 1)) {
|
||||
/**
|
||||
* If you use ch58x, you can change the USB_NUM_BIDIR_ENDPOINTS set to 8
|
||||
*/
|
||||
USB_LOG_ERR("Ep addr %02x overflow\r\n", ep->bEndpointAddress);
|
||||
return -1;
|
||||
}
|
||||
|
||||
/*!< ep max packet length */
|
||||
uint8_t mps = USB_GET_MAXPACKETSIZE(ep->wMaxPacketSize);
|
||||
/*!< update ep max packet length */
|
||||
if (USB_EP_DIR_IS_IN(ep->bEndpointAddress)) {
|
||||
/*!< in */
|
||||
usb_dc_cfg.ep_in[epid].ep_enable = true;
|
||||
usb_dc_cfg.ep_in[epid].mps = mps;
|
||||
usb_dc_cfg.ep_in[epid].eptype = USB_GET_ENDPOINT_TYPE(ep->bmAttributes);
|
||||
} else if (USB_EP_DIR_IS_OUT(ep->bEndpointAddress)) {
|
||||
/*!< out */
|
||||
usb_dc_cfg.ep_out[epid].ep_enable = true;
|
||||
usb_dc_cfg.ep_out[epid].mps = mps;
|
||||
usb_dc_cfg.ep_out[epid].eptype = USB_GET_ENDPOINT_TYPE(ep->bmAttributes);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Close endpoint
|
||||
* @pre None
|
||||
* @param[in] ep : Endpoint address
|
||||
* @retval >=0 success otherwise failure
|
||||
*/
|
||||
int usbd_ep_close(uint8_t busid, const uint8_t ep)
|
||||
{
|
||||
/*!< ep id */
|
||||
uint8_t epid = USB_EP_GET_IDX(ep);
|
||||
if (USB_EP_DIR_IS_IN(ep)) {
|
||||
/*!< in */
|
||||
usb_dc_cfg.ep_in[epid].ep_enable = false;
|
||||
} else if (USB_EP_DIR_IS_OUT(ep)) {
|
||||
/*!< out */
|
||||
usb_dc_cfg.ep_out[epid].ep_enable = false;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @brief Endpoint setting stall
|
||||
* @pre None
|
||||
* @param[in] ep : Endpoint address
|
||||
* @retval >=0 success otherwise failure
|
||||
*/
|
||||
int usbd_ep_set_stall(uint8_t busid, const uint8_t ep)
|
||||
{
|
||||
/*!< ep id */
|
||||
uint8_t epid = USB_EP_GET_IDX(ep);
|
||||
if (USB_EP_DIR_IS_OUT(ep)) {
|
||||
EPn_SET_RX_STALL(epid);
|
||||
} else {
|
||||
EPn_SET_TX_STALL(epid);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Endpoint clear stall
|
||||
* @pre None
|
||||
* @param[in] ep : Endpoint address
|
||||
* @retval >=0 success otherwise failure
|
||||
*/
|
||||
int usbd_ep_clear_stall(uint8_t busid, const uint8_t ep)
|
||||
{
|
||||
uint8_t epid = USB_EP_GET_IDX(ep);
|
||||
if (USB_EP_DIR_IS_OUT(ep)) {
|
||||
EPn_CLR_RX_STALL(epid);
|
||||
} else {
|
||||
EPn_CLR_TX_STALL(epid);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Check endpoint status
|
||||
* @pre None
|
||||
* @param[in] ep : Endpoint address
|
||||
* @param[out] stalled : Outgoing endpoint status
|
||||
* @retval >=0 success otherwise failure
|
||||
*/
|
||||
int usbd_ep_is_stalled(uint8_t busid, const uint8_t ep, uint8_t *stalled)
|
||||
{
|
||||
if (USB_EP_DIR_IS_OUT(ep)) {
|
||||
} else {
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Setup in ep transfer setting and start transfer.
|
||||
*
|
||||
* This function is asynchronous.
|
||||
* This function is similar to uart with tx dma.
|
||||
*
|
||||
* This function is called to write data to the specified endpoint. The
|
||||
* supplied usbd_endpoint_callback function will be called when data is transmitted
|
||||
* out.
|
||||
*
|
||||
* @param[in] ep Endpoint address corresponding to the one
|
||||
* listed in the device configuration table
|
||||
* @param[in] data Pointer to data to write
|
||||
* @param[in] data_len Length of the data requested to write. This may
|
||||
* be zero for a zero length status packet.
|
||||
* @return 0 on success, negative errno code on fail.
|
||||
*/
|
||||
int usbd_ep_start_write(uint8_t busid, const uint8_t ep, const uint8_t *data, uint32_t data_len)
|
||||
{
|
||||
uint8_t ep_idx = USB_EP_GET_IDX(ep);
|
||||
|
||||
if (!data && data_len) {
|
||||
return -1;
|
||||
}
|
||||
if (!usb_dc_cfg.ep_in[ep_idx].ep_enable) {
|
||||
return -2;
|
||||
}
|
||||
if ((uint32_t)data & 0x03) {
|
||||
return -3;
|
||||
}
|
||||
|
||||
usb_dc_cfg.ep_in[ep_idx].xfer_buf = (uint8_t *)data;
|
||||
usb_dc_cfg.ep_in[ep_idx].xfer_len = data_len;
|
||||
usb_dc_cfg.ep_in[ep_idx].actual_xfer_len = 0;
|
||||
|
||||
if (data_len == 0) {
|
||||
/*!< write 0 len data */
|
||||
EPn_SET_TX_LEN(ep_idx, 0);
|
||||
/*!< enable tx */
|
||||
if (usb_dc_cfg.ep_in[ep_idx].eptype != USB_ENDPOINT_TYPE_ISOCHRONOUS) {
|
||||
EPn_SET_TX_VALID(ep_idx);
|
||||
} else {
|
||||
EPn_SET_TX_ISO_VALID(ep_idx);
|
||||
}
|
||||
/*!< return */
|
||||
return 0;
|
||||
} else {
|
||||
/*!< Not zlp */
|
||||
data_len = MIN(data_len, usb_dc_cfg.ep_in[ep_idx].mps);
|
||||
/*!< write buff */
|
||||
memcpy(usb_dc_cfg.ep_in[ep_idx].ep_ram_addr, data, data_len);
|
||||
/*!< write real_wt_nums len data */
|
||||
EPn_SET_TX_LEN(ep_idx, data_len);
|
||||
/*!< enable tx */
|
||||
if (usb_dc_cfg.ep_in[ep_idx].eptype != USB_ENDPOINT_TYPE_ISOCHRONOUS) {
|
||||
EPn_SET_TX_VALID(ep_idx);
|
||||
} else {
|
||||
EPn_SET_TX_ISO_VALID(ep_idx);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Setup out ep transfer setting and start transfer.
|
||||
*
|
||||
* This function is asynchronous.
|
||||
* This function is similar to uart with rx dma.
|
||||
*
|
||||
* This function is called to read data to the specified endpoint. The
|
||||
* supplied usbd_endpoint_callback function will be called when data is received
|
||||
* in.
|
||||
*
|
||||
* @param[in] ep Endpoint address corresponding to the one
|
||||
* listed in the device configuration table
|
||||
* @param[in] data Pointer to data to read
|
||||
* @param[in] data_len Max length of the data requested to read.
|
||||
*
|
||||
* @return 0 on success, negative errno code on fail.
|
||||
*/
|
||||
int usbd_ep_start_read(uint8_t busid, const uint8_t ep, uint8_t *data, uint32_t data_len)
|
||||
{
|
||||
uint8_t ep_idx = USB_EP_GET_IDX(ep);
|
||||
|
||||
if (!data && data_len) {
|
||||
return -1;
|
||||
}
|
||||
if (!usb_dc_cfg.ep_out[ep_idx].ep_enable) {
|
||||
return -2;
|
||||
}
|
||||
if ((uint32_t)data & 0x03) {
|
||||
return -3;
|
||||
}
|
||||
|
||||
usb_dc_cfg.ep_out[ep_idx].xfer_buf = (uint8_t *)data;
|
||||
usb_dc_cfg.ep_out[ep_idx].xfer_len = data_len;
|
||||
usb_dc_cfg.ep_out[ep_idx].actual_xfer_len = 0;
|
||||
|
||||
if (data_len == 0) {
|
||||
} else {
|
||||
data_len = MIN(data_len, usb_dc_cfg.ep_out[ep_idx].mps);
|
||||
}
|
||||
|
||||
if (usb_dc_cfg.ep_out[ep_idx].eptype != USB_ENDPOINT_TYPE_ISOCHRONOUS) {
|
||||
EPn_SET_RX_VALID(ep_idx);
|
||||
} else {
|
||||
EPn_SET_RX_ISO_VALID(ep_idx);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief USB interrupt processing function
|
||||
* @pre None
|
||||
* @param[in] None
|
||||
* @retval None
|
||||
*/
|
||||
void USBD_IRQHandler(void)
|
||||
{
|
||||
volatile uint8_t intflag = 0;
|
||||
intflag = CH58x_USBFS_DEV->USB_INT_FG;
|
||||
|
||||
if (intflag & RB_UIF_TRANSFER) {
|
||||
if ((CH58x_USBFS_DEV->USB_INT_ST & MASK_UIS_TOKEN) != MASK_UIS_TOKEN) {
|
||||
uint8_t epid = ((CH58x_USBFS_DEV->USB_INT_ST & (MASK_UIS_TOKEN | MASK_UIS_ENDP)) & 0x0f);
|
||||
switch ((CH58x_USBFS_DEV->USB_INT_ST & (MASK_UIS_TOKEN | MASK_UIS_ENDP)) & 0xf0) {
|
||||
case UIS_TOKEN_IN:
|
||||
if (epid == 0) {
|
||||
/**
|
||||
* IN The host takes away the data that has been stored in FIFO
|
||||
*/
|
||||
switch (usb_dc_cfg.setup.bmRequestType >> USB_REQUEST_DIR_SHIFT) {
|
||||
case 1:
|
||||
/*!< Get */
|
||||
CH58x_USBFS_DEV->UEP0_CTRL ^= RB_UEP_T_TOG;
|
||||
/**
|
||||
* Here is to take away the last data, and the IN interrupt will be triggered only after it is successfully taken away.
|
||||
* Therefore, the status of the in endpoint is set to NAK here. If there is data transmission,
|
||||
* the endpoint status will be set to ack again in the in handler of EP0.
|
||||
*/
|
||||
EPn_SET_TX_NAK(0);
|
||||
|
||||
/*!< IN */
|
||||
if (usb_dc_cfg.ep_in[0].xfer_len > usb_dc_cfg.ep_in[0].mps) {
|
||||
usb_dc_cfg.ep_in[0].xfer_len -= usb_dc_cfg.ep_in[0].mps;
|
||||
usb_dc_cfg.ep_in[0].actual_xfer_len += usb_dc_cfg.ep_in[0].mps;
|
||||
usbd_event_ep_in_complete_handler(0, 0 | 0x80, usb_dc_cfg.ep_in[0].actual_xfer_len);
|
||||
} else {
|
||||
usb_dc_cfg.ep_in[0].actual_xfer_len += usb_dc_cfg.ep_in[0].xfer_len;
|
||||
usb_dc_cfg.ep_in[0].xfer_len = 0;
|
||||
usbd_event_ep_in_complete_handler(0, 0 | 0x80, usb_dc_cfg.ep_in[0].actual_xfer_len);
|
||||
}
|
||||
break;
|
||||
case 0:
|
||||
/*!< Set */
|
||||
switch (usb_dc_cfg.setup.bRequest) {
|
||||
case USB_REQUEST_SET_ADDRESS:
|
||||
/*!< Fill in the equipment address */
|
||||
CH58x_USBFS_DEV->USB_DEV_AD = (CH58x_USBFS_DEV->USB_DEV_AD & RB_UDA_GP_BIT) | usb_dc_cfg.address;
|
||||
/**
|
||||
* In the state phase after setting the address, the host has sent an in token packet of data1 to take the packet of 0 length,
|
||||
* Ch58x USB IP needs to manually set the status of the in endpoint to NAK
|
||||
*/
|
||||
EPn_SET_TX_NAK(0);
|
||||
EPn_SET_RX_VALID(0);
|
||||
break;
|
||||
default:
|
||||
/*!< Normal out state phase */
|
||||
/**
|
||||
* The host has sent an in token packet of data1 and taken the packet of 0 length.
|
||||
* Here, you only need to set the status of the in endpoint to NAK and out endpoint ACK
|
||||
*/
|
||||
EPn_SET_TX_NAK(0);
|
||||
EPn_SET_RX_VALID(0);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
if (epid == 4) {
|
||||
CH58x_USBFS_DEV->UEP4_CTRL ^= RB_UEP_T_TOG;
|
||||
}
|
||||
EPn_SET_TX_NAK(epid);
|
||||
if (usb_dc_cfg.ep_in[epid].xfer_len > usb_dc_cfg.ep_in[epid].mps) {
|
||||
/*!< Need start in again */
|
||||
usb_dc_cfg.ep_in[epid].xfer_buf += usb_dc_cfg.ep_in[epid].mps;
|
||||
usb_dc_cfg.ep_in[epid].xfer_len -= usb_dc_cfg.ep_in[epid].mps;
|
||||
usb_dc_cfg.ep_in[epid].actual_xfer_len += usb_dc_cfg.ep_in[epid].mps;
|
||||
if (usb_dc_cfg.ep_in[epid].xfer_len > usb_dc_cfg.ep_in[epid].mps) {
|
||||
memcpy(usb_dc_cfg.ep_in[epid].ep_ram_addr, usb_dc_cfg.ep_in[epid].xfer_buf, usb_dc_cfg.ep_in[epid].mps);
|
||||
} else {
|
||||
memcpy(usb_dc_cfg.ep_in[epid].ep_ram_addr, usb_dc_cfg.ep_in[epid].xfer_buf, usb_dc_cfg.ep_in[epid].xfer_len);
|
||||
}
|
||||
if (usb_dc_cfg.ep_in[epid].eptype != USB_ENDPOINT_TYPE_ISOCHRONOUS) {
|
||||
EPn_SET_TX_VALID(epid);
|
||||
} else {
|
||||
EPn_SET_TX_ISO_VALID(epid);
|
||||
}
|
||||
} else {
|
||||
usb_dc_cfg.ep_in[epid].actual_xfer_len += usb_dc_cfg.ep_in[epid].xfer_len;
|
||||
usb_dc_cfg.ep_in[epid].xfer_len = 0;
|
||||
usbd_event_ep_in_complete_handler(0, epid | 0x80, usb_dc_cfg.ep_in[epid].actual_xfer_len);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case UIS_TOKEN_OUT:
|
||||
if (epid == 0) {
|
||||
/*!< ep0 out */
|
||||
CH58x_USBFS_DEV->UEP0_CTRL ^= RB_UEP_R_TOG;
|
||||
uint32_t read_count = EPn_GET_RX_LEN(0);
|
||||
memcpy(usb_dc_cfg.ep_out[epid].xfer_buf, usb_dc_cfg.ep_out[epid].ep_ram_addr, read_count);
|
||||
|
||||
usb_dc_cfg.ep_out[0].actual_xfer_len += read_count;
|
||||
usb_dc_cfg.ep_out[0].xfer_len -= read_count;
|
||||
usbd_event_ep_out_complete_handler(0, 0x00, usb_dc_cfg.ep_out[0].actual_xfer_len);
|
||||
if (read_count == 0) {
|
||||
/*!< Out status, start reading setup */
|
||||
EPn_SET_RX_VALID(0);
|
||||
}
|
||||
} else {
|
||||
if ((CH58x_USBFS_DEV->USB_INT_ST) & RB_UIS_TOG_OK) {
|
||||
EPn_SET_RX_NAK(epid);
|
||||
if (epid == 4) {
|
||||
CH58x_USBFS_DEV->UEP4_CTRL ^= RB_UEP_R_TOG;
|
||||
}
|
||||
uint32_t read_count = EPn_GET_RX_LEN(epid);
|
||||
memcpy(usb_dc_cfg.ep_out[epid].xfer_buf, usb_dc_cfg.ep_out[epid].ep_ram_addr, read_count);
|
||||
usb_dc_cfg.ep_out[epid].xfer_buf += read_count;
|
||||
usb_dc_cfg.ep_out[epid].actual_xfer_len += read_count;
|
||||
usb_dc_cfg.ep_out[epid].xfer_len -= read_count;
|
||||
|
||||
if ((read_count < usb_dc_cfg.ep_out[epid].mps) || (usb_dc_cfg.ep_out[epid].xfer_len == 0)) {
|
||||
|
||||
usbd_event_ep_out_complete_handler(0, ((epid)&0x7f), usb_dc_cfg.ep_out[epid].actual_xfer_len);
|
||||
} else {
|
||||
if (usb_dc_cfg.ep_out[epid].eptype != USB_ENDPOINT_TYPE_ISOCHRONOUS) {
|
||||
EPn_SET_RX_VALID(epid);
|
||||
} else {
|
||||
EPn_SET_RX_ISO_VALID(epid);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
CH58x_USBFS_DEV->USB_INT_FG = RB_UIF_TRANSFER;
|
||||
}
|
||||
|
||||
if (CH58x_USBFS_DEV->USB_INT_ST & RB_UIS_SETUP_ACT) {
|
||||
/*!< Setup */
|
||||
/**
|
||||
* Setup the device must respond with ACK, and the next data phase is DATA1
|
||||
* If it is sent, the data1 packet will be sent.
|
||||
* If it is received, the data1 packet is expected to be received.
|
||||
* If it is in, the host will send the data1 out packet to complete the status phase after the in completes.
|
||||
* If it is out, the host will send the data1 in packet to complete the status phase after the out completes.
|
||||
*/
|
||||
CH58x_USBFS_DEV->UEP0_CTRL = RB_UEP_R_TOG | RB_UEP_T_TOG | UEP_T_RES_NAK;
|
||||
/*!< get setup packet */
|
||||
usb_dc_cfg.setup = GET_SETUP_PACKET(usb_dc_cfg.ep_out[0].ep_ram_addr);
|
||||
if (usb_dc_cfg.setup.bmRequestType >> USB_REQUEST_DIR_SHIFT == 0) {
|
||||
/**
|
||||
* Ep0 The next in must be the status stage.
|
||||
* The device must reply to the host data 0 length packet.
|
||||
* Here, set the transmission length to 0 and the transmission status to ACK,
|
||||
* and wait for the host to send the in token to retrieve
|
||||
*/
|
||||
EPn_SET_TX_LEN(0, 0);
|
||||
EPn_SET_TX_VALID(0);
|
||||
}
|
||||
EPn_SET_RX_NAK(0);
|
||||
usbd_event_ep0_setup_complete_handler(0, (uint8_t *)&(usb_dc_cfg.setup));
|
||||
CH58x_USBFS_DEV->USB_INT_FG = RB_UIF_TRANSFER;
|
||||
}
|
||||
} else if (intflag & RB_UIF_BUS_RST) {
|
||||
/*!< Reset */
|
||||
CH58x_USBFS_DEV->USB_DEV_AD = 0;
|
||||
usbd_event_reset_handler(0);
|
||||
/*!< Set ep0 rx vaild to start receive setup packet */
|
||||
EPn_SET_RX_VALID(0);
|
||||
CH58x_USBFS_DEV->USB_INT_FG = RB_UIF_BUS_RST;
|
||||
} else if (intflag & RB_UIF_SUSPEND) {
|
||||
if (CH58x_USBFS_DEV->USB_MIS_ST & RB_UMS_SUSPEND) {
|
||||
/*!< Suspend */
|
||||
} else {
|
||||
/*!< Wake up */
|
||||
}
|
||||
CH58x_USBFS_DEV->USB_INT_FG = RB_UIF_SUSPEND;
|
||||
} else {
|
||||
CH58x_USBFS_DEV->USB_INT_FG = intflag;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,244 @@
|
||||
#pragma once
|
||||
|
||||
#define __IO volatile
|
||||
#include <stdint.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#define RB_UC_HOST_MODE 0x80 // enable USB host mode: 0=device mode, 1=host mode
|
||||
#define RB_UC_LOW_SPEED 0x40 // enable USB low speed: 0=12Mbps, 1=1.5Mbps
|
||||
#define RB_UC_DEV_PU_EN 0x20 // USB device enable and internal pullup resistance enable
|
||||
#define RB_UC_SYS_CTRL1 0x20 // USB system control high bit
|
||||
#define RB_UC_SYS_CTRL0 0x10 // USB system control low bit
|
||||
#define MASK_UC_SYS_CTRL 0x30 // bit mask of USB system control
|
||||
#define RB_UC_INT_BUSY 0x08 // enable automatic responding busy for device mode or automatic pause for host mode during interrupt flag UIF_TRANSFER valid
|
||||
#define RB_UC_RESET_SIE 0x04 // force reset USB SIE, need software clear
|
||||
#define RB_UC_CLR_ALL 0x02 // force clear FIFO and count of USB
|
||||
#define RB_UC_DMA_EN 0x01 // DMA enable and DMA interrupt enable for USB
|
||||
|
||||
#define RB_UD_PD_DIS 0x80 // disable USB UDP/UDM pulldown resistance: 0=enable pulldown, 1=disable
|
||||
#define RB_UD_DP_PIN 0x20 // ReadOnly: indicate current UDP pin level
|
||||
#define RB_UD_DM_PIN 0x10 // ReadOnly: indicate current UDM pin level
|
||||
#define RB_UD_LOW_SPEED 0x04 // enable USB physical port low speed: 0=full speed, 1=low speed
|
||||
#define RB_UD_GP_BIT 0x02 // general purpose bit
|
||||
#define RB_UD_PORT_EN 0x01 // enable USB physical port I/O: 0=disable, 1=enable
|
||||
|
||||
#define RB_UH_PD_DIS 0x80 // disable USB UDP/UDM pulldown resistance: 0=enable pulldown, 1=disable
|
||||
#define RB_UH_DP_PIN 0x20 // ReadOnly: indicate current UDP pin level
|
||||
#define RB_UH_DM_PIN 0x10 // ReadOnly: indicate current UDM pin level
|
||||
#define RB_UH_LOW_SPEED 0x04 // enable USB port low speed: 0=full speed, 1=low speed
|
||||
#define RB_UH_BUS_RESET 0x02 // control USB bus reset: 0=normal, 1=force bus reset
|
||||
#define RB_UH_PORT_EN 0x01 // enable USB port: 0=disable, 1=enable port, automatic disabled if USB device detached
|
||||
|
||||
#define RB_UIE_DEV_SOF 0x80 // enable interrupt for SOF received for USB device mode
|
||||
#define RB_UIE_DEV_NAK 0x40 // enable interrupt for NAK responded for USB device mode
|
||||
#define RB_UIE_FIFO_OV 0x10 // enable interrupt for FIFO overflow
|
||||
#define RB_UIE_HST_SOF 0x08 // enable interrupt for host SOF timer action for USB host mode
|
||||
#define RB_UIE_SUSPEND 0x04 // enable interrupt for USB suspend or resume event
|
||||
#define RB_UIE_TRANSFER 0x02 // enable interrupt for USB transfer completion
|
||||
#define RB_UIE_DETECT 0x01 // enable interrupt for USB device detected event for USB host mode
|
||||
#define RB_UIE_BUS_RST 0x01 // enable interrupt for USB bus reset event for USB device mode
|
||||
|
||||
#define RB_UDA_GP_BIT 0x80 // general purpose bit
|
||||
#define MASK_USB_ADDR 0x7F // bit mask for USB device address
|
||||
|
||||
#define RB_UMS_SOF_PRES 0x80 // RO, indicate host SOF timer presage status
|
||||
#define RB_UMS_SOF_ACT 0x40 // RO, indicate host SOF timer action status for USB host
|
||||
#define RB_UMS_SIE_FREE 0x20 // RO, indicate USB SIE free status
|
||||
#define RB_UMS_R_FIFO_RDY 0x10 // RO, indicate USB receiving FIFO ready status (not empty)
|
||||
#define RB_UMS_BUS_RESET 0x08 // RO, indicate USB bus reset status
|
||||
#define RB_UMS_SUSPEND 0x04 // RO, indicate USB suspend status
|
||||
#define RB_UMS_DM_LEVEL 0x02 // RO, indicate UDM level saved at device attached to USB host
|
||||
#define RB_UMS_DEV_ATTACH 0x01 // RO, indicate device attached status on USB host
|
||||
|
||||
#define RB_U_IS_NAK 0x80 // RO, indicate current USB transfer is NAK received
|
||||
#define RB_U_TOG_OK 0x40 // RO, indicate current USB transfer toggle is OK
|
||||
#define RB_U_SIE_FREE 0x20 // RO, indicate USB SIE free status
|
||||
#define RB_UIF_FIFO_OV 0x10 // FIFO overflow interrupt flag for USB, direct bit address clear or write 1 to clear
|
||||
#define RB_UIF_HST_SOF 0x08 // host SOF timer interrupt flag for USB host, direct bit address clear or write 1 to clear
|
||||
#define RB_UIF_SUSPEND 0x04 // USB suspend or resume event interrupt flag, direct bit address clear or write 1 to clear
|
||||
#define RB_UIF_TRANSFER 0x02 // USB transfer completion interrupt flag, direct bit address clear or write 1 to clear
|
||||
#define RB_UIF_DETECT 0x01 // device detected event interrupt flag for USB host mode, direct bit address clear or write 1 to clear
|
||||
#define RB_UIF_BUS_RST 0x01 // bus reset event interrupt flag for USB device mode, direct bit address clear or write 1 to clear
|
||||
|
||||
#define RB_UIS_SETUP_ACT 0x80 // RO, indicate SETUP token & 8 bytes setup request received for USB device mode
|
||||
#define RB_UIS_TOG_OK 0x40 // RO, indicate current USB transfer toggle is OK
|
||||
#define RB_UIS_TOKEN1 0x20 // RO, current token PID code bit 1 received for USB device mode
|
||||
#define RB_UIS_TOKEN0 0x10 // RO, current token PID code bit 0 received for USB device mode
|
||||
#define MASK_UIS_TOKEN 0x30 // RO, bit mask of current token PID code received for USB device mode
|
||||
#define UIS_TOKEN_OUT 0x00
|
||||
#define UIS_TOKEN_SOF 0x10
|
||||
#define UIS_TOKEN_IN 0x20
|
||||
#define UIS_TOKEN_SETUP 0x30
|
||||
|
||||
#define MASK_UIS_ENDP 0x0F // RO, bit mask of current transfer endpoint number for USB device mode
|
||||
#define MASK_UIS_H_RES 0x0F // RO, bit mask of current transfer handshake response for USB host mode: 0000=no response, time out from device, others=handshake response PID received
|
||||
|
||||
#define R8_USB_RX_LEN (*((uint8_t *)0x40008008)) // USB receiving length
|
||||
#define RB_UEP1_RX_EN 0x80 // enable USB endpoint 1 receiving (OUT)
|
||||
#define RB_UEP1_TX_EN 0x40 // enable USB endpoint 1 transmittal (IN)
|
||||
#define RB_UEP1_BUF_MOD 0x10 // buffer mode of USB endpoint 1
|
||||
|
||||
#define RB_UEP4_RX_EN 0x08 // enable USB endpoint 4 receiving (OUT)
|
||||
#define RB_UEP4_TX_EN 0x04 // enable USB endpoint 4 transmittal (IN)
|
||||
|
||||
#define RB_UEP3_RX_EN 0x80 // enable USB endpoint 3 receiving (OUT)
|
||||
#define RB_UEP3_TX_EN 0x40 // enable USB endpoint 3 transmittal (IN)
|
||||
#define RB_UEP3_BUF_MOD 0x10 // buffer mode of USB endpoint 3
|
||||
#define RB_UEP2_RX_EN 0x08 // enable USB endpoint 2 receiving (OUT)
|
||||
#define RB_UEP2_TX_EN 0x04 // enable USB endpoint 2 transmittal (IN)
|
||||
#define RB_UEP2_BUF_MOD 0x01 // buffer mode of USB endpoint 2
|
||||
|
||||
#define RB_UEP7_RX_EN 0x20 // enable USB endpoint 7 receiving (OUT)
|
||||
#define RB_UEP7_TX_EN 0x10 // enable USB endpoint 7 transmittal (IN)
|
||||
#define RB_UEP6_RX_EN 0x08 // enable USB endpoint 6 receiving (OUT)
|
||||
#define RB_UEP6_TX_EN 0x04 // enable USB endpoint 6 transmittal (IN)
|
||||
#define RB_UEP5_RX_EN 0x02 // enable USB endpoint 5 receiving (OUT)
|
||||
#define RB_UEP5_TX_EN 0x01 // enable USB endpoint 5 transmittal (IN)
|
||||
|
||||
#define RB_UH_EP_TX_EN 0x40 // enable USB host OUT endpoint transmittal
|
||||
#define RB_UH_EP_TBUF_MOD 0x10 // buffer mode of USB host OUT endpoint
|
||||
|
||||
#define RB_UH_EP_RX_EN 0x08 // enable USB host IN endpoint receiving
|
||||
#define RB_UH_EP_RBUF_MOD 0x01 // buffer mode of USB host IN endpoint
|
||||
|
||||
#define RB_UEP_R_TOG 0x80 // expected data toggle flag of USB endpoint X receiving (OUT): 0=DATA0, 1=DATA1
|
||||
#define RB_UEP_T_TOG 0x40 // prepared data toggle flag of USB endpoint X transmittal (IN): 0=DATA0, 1=DATA1
|
||||
#define RB_UEP_AUTO_TOG 0x10 // enable automatic toggle after successful transfer completion on endpoint 1/2/3: 0=manual toggle, 1=automatic toggle
|
||||
#define RB_UEP_R_RES1 0x08 // handshake response type high bit for USB endpoint X receiving (OUT)
|
||||
#define RB_UEP_R_RES0 0x04 // handshake response type low bit for USB endpoint X receiving (OUT)
|
||||
#define MASK_UEP_R_RES 0x0C // bit mask of handshake response type for USB endpoint X receiving (OUT)
|
||||
#define UEP_R_RES_ACK 0x00
|
||||
#define UEP_R_RES_TOUT 0x04
|
||||
#define UEP_R_RES_NAK 0x08
|
||||
#define UEP_R_RES_STALL 0x0C
|
||||
|
||||
#define RB_UEP_T_RES1 0x02 // handshake response type high bit for USB endpoint X transmittal (IN)
|
||||
#define RB_UEP_T_RES0 0x01 // handshake response type low bit for USB endpoint X transmittal (IN)
|
||||
#define MASK_UEP_T_RES 0x03 // bit mask of handshake response type for USB endpoint X transmittal (IN)
|
||||
#define UEP_T_RES_ACK 0x00
|
||||
#define UEP_T_RES_TOUT 0x01
|
||||
#define UEP_T_RES_NAK 0x02
|
||||
#define UEP_T_RES_STALL 0x03
|
||||
|
||||
#define RB_UH_PRE_PID_EN 0x80 // USB host PRE PID enable for low speed device via hub
|
||||
#define RB_UH_SOF_EN 0x40 // USB host automatic SOF enable
|
||||
|
||||
#define R8_UH_EP_PID R8_UEP2_T_LEN // host endpoint and PID
|
||||
#define MASK_UH_TOKEN 0xF0 // bit mask of token PID for USB host transfer
|
||||
#define MASK_UH_ENDP 0x0F // bit mask of endpoint number for USB host transfer
|
||||
|
||||
#define R8_UH_RX_CTRL R8_UEP2_CTRL // host receiver endpoint control
|
||||
#define RB_UH_R_TOG 0x80 // expected data toggle flag of host receiving (IN): 0=DATA0, 1=DATA1
|
||||
#define RB_UH_R_AUTO_TOG 0x10 // enable automatic toggle after successful transfer completion: 0=manual toggle, 1=automatic toggle
|
||||
#define RB_UH_R_RES 0x04 // prepared handshake response type for host receiving (IN): 0=ACK (ready), 1=no response, time out to device, for isochronous transactions
|
||||
|
||||
#define R8_UH_TX_LEN R8_UEP3_T_LEN // host transmittal endpoint transmittal length
|
||||
|
||||
#define RB_UH_T_TOG 0x40 // prepared data toggle flag of host transmittal (SETUP/OUT): 0=DATA0, 1=DATA1
|
||||
#define RB_UH_T_AUTO_TOG 0x10 // enable automatic toggle after successful transfer completion: 0=manual toggle, 1=automatic toggle
|
||||
#define RB_UH_T_RES 0x01 // expected handshake response type for host transmittal (SETUP/OUT): 0=ACK (ready), 1=no response, time out from device, for isochronous transactions
|
||||
|
||||
#define R16_PIN_ANALOG_IE (*((uint16_t *)0x4000101A)) // RW, analog pin enable and digital input disable
|
||||
#define RB_PIN_USB_IE 0x80 // RW, USB analog I/O enable: 0=analog I/O disable, 1=analog I/O enable
|
||||
#define RB_PIN_USB_DP_PU 0x40 // RW, USB UDP internal pullup resistance enable: 0=enable/disable by RB_UC_DEV_PU_EN, 1=enable pullup, replace RB_UC_DEV_PU_EN under sleep mode
|
||||
#define RB_PIN_USB2_IE 0x20 // RW, USB2 analog I/O enable: 0=analog I/O disable, 1=analog I/O enable
|
||||
#define RB_PIN_USB2_DP_PU 0x10 // RW, USB2 UDP internal pullup resistance enable: 0=enable/disable by RB_UC_DEV_PU_EN, 1=enable pullup, replace RB_UC_DEV_PU_EN under sleep mode
|
||||
/*!< USB Regs */
|
||||
typedef struct
|
||||
{
|
||||
__IO uint8_t USB_CTRL; /*!< 0x40008000 */
|
||||
union {
|
||||
__IO uint8_t UDEV_CTRL; /*!< 0x40008001 */
|
||||
__IO uint8_t UHOST_CTRL; /*!< 0x40008001 */
|
||||
};
|
||||
__IO uint8_t USB_INT_EN; /*!< 0x40008002 */
|
||||
__IO uint8_t USB_DEV_AD; /*!< 0x40008003 */
|
||||
__IO uint8_t USB_STATUS0; /*!< 0x40008004 */
|
||||
__IO uint8_t USB_MIS_ST; /*!< 0x40008005 */
|
||||
__IO uint8_t USB_INT_FG; /*!< 0x40008006 */
|
||||
__IO uint8_t USB_INT_ST; /*!< 0x40008007 */
|
||||
__IO uint8_t USB_RX_LEN; /*!< 0x40008008 */
|
||||
__IO uint8_t Reserve1; /*!< 0x40008009 */
|
||||
__IO uint8_t Reserve2; /*!< 0x4000800a */
|
||||
__IO uint8_t Reserve3; /*!< 0x4000800b */
|
||||
__IO uint8_t UEP4_1_MOD; /*!< 0x4000800c */
|
||||
union {
|
||||
__IO uint8_t UEP2_3_MOD; /*!< 0x4000800d */
|
||||
__IO uint8_t UH_EP_MOD; /*!< 0x4000800d */
|
||||
};
|
||||
__IO uint8_t UEP567_MOD; /*!< 0x4000800e */
|
||||
__IO uint8_t Reserve4; /*!< 0x4000800f */
|
||||
__IO uint16_t UEP0_DMA; /*!< 0x40008010 */
|
||||
__IO uint16_t Reserve5; /*!< 0x40008012 */
|
||||
__IO uint16_t UEP1_DMA; /*!< 0x40008014 */
|
||||
__IO uint16_t Reserve6; /*!< 0x40008016 */
|
||||
union {
|
||||
__IO uint16_t UEP2_DMA; /*!< 0x40008018 */
|
||||
__IO uint16_t UH_RX_DMA; /*!< 0x40008018 */
|
||||
};
|
||||
__IO uint16_t Reserve7; /*!< 0x4000801a */
|
||||
union {
|
||||
__IO uint16_t UEP3_DMA; /*!< 0x4000801c */
|
||||
__IO uint16_t UH_TX_DMA; /*!< 0x4000801c */
|
||||
};
|
||||
__IO uint16_t Reserve8; /*!< 0x4000801e */
|
||||
__IO uint8_t UEP0_T_LEN; /*!< 0x40008020 */
|
||||
__IO uint8_t Reserve9; /*!< 0x40008021 */
|
||||
__IO uint8_t UEP0_CTRL; /*!< 0x40008022 */
|
||||
__IO uint8_t Reserve10; /*!< 0x40008023 */
|
||||
__IO uint8_t UEP1_T_LEN; /*!< 0x40008024 */
|
||||
__IO uint8_t Reserve11; /*!< 0x40008025 */
|
||||
union {
|
||||
__IO uint8_t UEP1_CTRL; /*!< 0x40008026 */
|
||||
__IO uint8_t UH_SETUP; /*!< 0x40008026 */
|
||||
};
|
||||
__IO uint8_t Reserve12; /*!< 0x40008027 */
|
||||
union {
|
||||
__IO uint8_t UEP2_T_LEN; /*!< 0x40008028 */
|
||||
__IO uint8_t UH_EP_PID; /*!< 0x40008028 */
|
||||
};
|
||||
__IO uint8_t Reserve13; /*!< 0x40008029 */
|
||||
union {
|
||||
__IO uint8_t UEP2_CTRL; /*!< 0x4000802a */
|
||||
__IO uint8_t UH_RX_CTRL; /*!< 0x4000802a */
|
||||
};
|
||||
__IO uint8_t Reserve14; /*!< 0x4000802b */
|
||||
union {
|
||||
__IO uint8_t UEP3_T_LEN; /*!< 0x4000802c */
|
||||
__IO uint8_t UH_TX_LEN; /*!< 0x4000802c */
|
||||
};
|
||||
__IO uint8_t Reserve15; /*!< 0x4000802d */
|
||||
union {
|
||||
__IO uint8_t UEP3_CTRL; /*!< 0x4000802e */
|
||||
__IO uint8_t UH_TX_CTRL; /*!< 0x4000802e */
|
||||
};
|
||||
__IO uint8_t Reserve16; /*!< 0x4000802f */
|
||||
__IO uint8_t UEP4_T_LEN; /*!< 0x40008030 */
|
||||
__IO uint8_t Reserve17; /*!< 0x40008031 */
|
||||
__IO uint8_t UEP4_CTRL; /*!< 0x40008032 */
|
||||
__IO uint8_t Reserve18[33]; /*!< 0x40008033 */
|
||||
__IO uint16_t UEP5_DMA; /*!< 0x40008054 */
|
||||
__IO uint16_t Reserve19; /*!< 0x40008056 */
|
||||
__IO uint16_t UEP6_DMA; /*!< 0x40008058 */
|
||||
__IO uint16_t Reserve20; /*!< 0x4000805a */
|
||||
__IO uint16_t UEP7_DMA; /*!< 0x4000805c */
|
||||
__IO uint8_t Reserve21[6]; /*!< 0x4000805e */
|
||||
__IO uint8_t UEP5_T_LEN; /*!< 0x40008064 */
|
||||
__IO uint8_t Reserve22; /*!< 0x40008065 */
|
||||
__IO uint8_t UEP5_CTRL; /*!< 0x40008066 */
|
||||
__IO uint8_t Reserve23; /*!< 0x40008067 */
|
||||
__IO uint8_t UEP6_T_LEN; /*!< 0x40008068 */
|
||||
__IO uint8_t Reserve24; /*!< 0x40008069 */
|
||||
__IO uint8_t UEP6_CTRL; /*!< 0x4000806a */
|
||||
__IO uint8_t Reserve25; /*!< 0x4000806b */
|
||||
__IO uint8_t UEP7_T_LEN; /*!< 0x4000806c */
|
||||
__IO uint8_t Reserve26; /*!< 0x4000806d */
|
||||
__IO uint8_t UEP7_CTRL; /*!< 0x4000806e */
|
||||
} USB_FS_TypeDef;
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
@@ -0,0 +1,169 @@
|
||||
/*
|
||||
* Copyright (c) 2022, sakumisu
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
#ifndef CHERRYUSB_CONFIG_H
|
||||
#define CHERRYUSB_CONFIG_H
|
||||
|
||||
#define CHERRYUSB_VERSION 0x010200
|
||||
#define CHERRYUSB_VERSION_STR "v1.2.0"
|
||||
|
||||
/* ================ USB common Configuration ================ */
|
||||
|
||||
#define CONFIG_USB_PRINTF(...) //printf(__VA_ARGS__)
|
||||
|
||||
#define usb_malloc(size) malloc(size)
|
||||
#define usb_free(ptr) free(ptr)
|
||||
|
||||
#ifndef CONFIG_USB_DBG_LEVEL
|
||||
#define CONFIG_USB_DBG_LEVEL USB_DBG_ERROR
|
||||
#endif
|
||||
|
||||
/* Enable print with color */
|
||||
#define CONFIG_USB_PRINTF_COLOR_ENABLE
|
||||
|
||||
/* data align size when use dma */
|
||||
#ifndef CONFIG_USB_ALIGN_SIZE
|
||||
#define CONFIG_USB_ALIGN_SIZE 4
|
||||
#endif
|
||||
|
||||
/* attribute data into no cache ram */
|
||||
#define USB_NOCACHE_RAM_SECTION __attribute__((section(".noncacheable")))
|
||||
|
||||
/* ================= USB Device Stack Configuration ================ */
|
||||
|
||||
#define CONFIG_USBDEV_MAX_BUS 1 // for now, bus num must be 1 except hpm ip
|
||||
|
||||
/* Ep0 max transfer buffer, specially for receiving data from ep0 out */
|
||||
#define CONFIG_USBDEV_REQUEST_BUFFER_LEN 256
|
||||
|
||||
/* Setup packet log for debug */
|
||||
// #define CONFIG_USBDEV_SETUP_LOG_PRINT
|
||||
|
||||
/* Check if the input descriptor is correct */
|
||||
// #define CONFIG_USBDEV_DESC_CHECK
|
||||
|
||||
/* Enable test mode */
|
||||
// #define CONFIG_USBDEV_TEST_MODE
|
||||
|
||||
#ifndef CONFIG_USBDEV_MSC_MAX_LUN
|
||||
#define CONFIG_USBDEV_MSC_MAX_LUN 1
|
||||
#endif
|
||||
|
||||
#ifndef CONFIG_USBDEV_MSC_MAX_BUFSIZE
|
||||
#define CONFIG_USBDEV_MSC_MAX_BUFSIZE 512
|
||||
#endif
|
||||
|
||||
#ifndef CONFIG_USBDEV_MSC_MANUFACTURER_STRING
|
||||
#define CONFIG_USBDEV_MSC_MANUFACTURER_STRING ""
|
||||
#endif
|
||||
|
||||
#ifndef CONFIG_USBDEV_MSC_PRODUCT_STRING
|
||||
#define CONFIG_USBDEV_MSC_PRODUCT_STRING ""
|
||||
#endif
|
||||
|
||||
#ifndef CONFIG_USBDEV_MSC_VERSION_STRING
|
||||
#define CONFIG_USBDEV_MSC_VERSION_STRING "0.01"
|
||||
#endif
|
||||
|
||||
// #define CONFIG_USBDEV_MSC_THREAD
|
||||
|
||||
#ifndef CONFIG_USBDEV_MSC_PRIO
|
||||
#define CONFIG_USBDEV_MSC_PRIO 4
|
||||
#endif
|
||||
|
||||
#ifndef CONFIG_USBDEV_MSC_STACKSIZE
|
||||
#define CONFIG_USBDEV_MSC_STACKSIZE 2048
|
||||
#endif
|
||||
|
||||
#ifndef CONFIG_USBDEV_RNDIS_RESP_BUFFER_SIZE
|
||||
#define CONFIG_USBDEV_RNDIS_RESP_BUFFER_SIZE 156
|
||||
#endif
|
||||
|
||||
#ifndef CONFIG_USBDEV_RNDIS_ETH_MAX_FRAME_SIZE
|
||||
#define CONFIG_USBDEV_RNDIS_ETH_MAX_FRAME_SIZE 1536
|
||||
#endif
|
||||
|
||||
#ifndef CONFIG_USBDEV_RNDIS_VENDOR_ID
|
||||
#define CONFIG_USBDEV_RNDIS_VENDOR_ID 0x0000ffff
|
||||
#endif
|
||||
|
||||
#ifndef CONFIG_USBDEV_RNDIS_VENDOR_DESC
|
||||
#define CONFIG_USBDEV_RNDIS_VENDOR_DESC "CherryUSB"
|
||||
#endif
|
||||
|
||||
#define CONFIG_USBDEV_RNDIS_USING_LWIP
|
||||
|
||||
/* ================ USB HOST Stack Configuration ================== */
|
||||
|
||||
#define CONFIG_USBHOST_MAX_BUS 1
|
||||
#define CONFIG_USBHOST_MAX_RHPORTS 1
|
||||
#define CONFIG_USBHOST_MAX_EXTHUBS 1
|
||||
#define CONFIG_USBHOST_MAX_EHPORTS 4
|
||||
#define CONFIG_USBHOST_MAX_INTERFACES 8
|
||||
#define CONFIG_USBHOST_MAX_INTF_ALTSETTINGS 8
|
||||
#define CONFIG_USBHOST_MAX_ENDPOINTS 4
|
||||
|
||||
#define CONFIG_USBHOST_MAX_CDC_ACM_CLASS 4
|
||||
#define CONFIG_USBHOST_MAX_HID_CLASS 4
|
||||
#define CONFIG_USBHOST_MAX_MSC_CLASS 2
|
||||
#define CONFIG_USBHOST_MAX_AUDIO_CLASS 1
|
||||
#define CONFIG_USBHOST_MAX_VIDEO_CLASS 1
|
||||
|
||||
#define CONFIG_USBHOST_DEV_NAMELEN 16
|
||||
|
||||
#ifndef CONFIG_USBHOST_PSC_PRIO
|
||||
#define CONFIG_USBHOST_PSC_PRIO 0
|
||||
#endif
|
||||
#ifndef CONFIG_USBHOST_PSC_STACKSIZE
|
||||
#define CONFIG_USBHOST_PSC_STACKSIZE 2048
|
||||
#endif
|
||||
|
||||
//#define CONFIG_USBHOST_GET_STRING_DESC
|
||||
|
||||
// #define CONFIG_USBHOST_MSOS_ENABLE
|
||||
#define CONFIG_USBHOST_MSOS_VENDOR_CODE 0x00
|
||||
|
||||
/* Ep0 max transfer buffer */
|
||||
#define CONFIG_USBHOST_REQUEST_BUFFER_LEN 512
|
||||
|
||||
#ifndef CONFIG_USBHOST_CONTROL_TRANSFER_TIMEOUT
|
||||
#define CONFIG_USBHOST_CONTROL_TRANSFER_TIMEOUT 500
|
||||
#endif
|
||||
|
||||
#ifndef CONFIG_USBHOST_MSC_TIMEOUT
|
||||
#define CONFIG_USBHOST_MSC_TIMEOUT 5000
|
||||
#endif
|
||||
|
||||
#define CONFIG_USBHOST_BLUETOOTH_HCI_H4
|
||||
// #define CONFIG_USBHOST_BLUETOOTH_HCI_LOG
|
||||
|
||||
#ifndef CONFIG_USBHOST_BLUETOOTH_TX_SIZE
|
||||
#define CONFIG_USBHOST_BLUETOOTH_TX_SIZE 2048
|
||||
#endif
|
||||
#ifndef CONFIG_USBHOST_BLUETOOTH_RX_SIZE
|
||||
#define CONFIG_USBHOST_BLUETOOTH_RX_SIZE 2048
|
||||
#endif
|
||||
|
||||
/* ================ USB Device Port Configuration ================*/
|
||||
|
||||
#ifndef CONFIG_USBDEV_EP_NUM
|
||||
#define CONFIG_USBDEV_EP_NUM 8
|
||||
#endif
|
||||
|
||||
/* ================ USB Host Port Configuration ==================*/
|
||||
|
||||
// #define CONFIG_USBHOST_PIPE_NUM 10
|
||||
|
||||
/* ================ EHCI Configuration ================ */
|
||||
|
||||
#define CONFIG_USB_EHCI_HCCR_OFFSET (0x0)
|
||||
#define CONFIG_USB_EHCI_HCOR_OFFSET (0x10)
|
||||
#define CONFIG_USB_EHCI_FRAME_LIST_SIZE 1024
|
||||
// #define CONFIG_USB_EHCI_HCOR_RESERVED_DISABLE
|
||||
// #define CONFIG_USB_EHCI_CONFIGFLAG
|
||||
// #define CONFIG_USB_EHCI_PORT_POWER
|
||||
// #define CONFIG_USB_EHCI_PRINT_HW_PARAM
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user