1 /*
2  * SPDX-FileCopyrightText: 2017 PHYTEC Messtechnik GmbH
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  */
6 
7 
8 /**
9  * @file
10  * @brief USB Communications Device Class (CDC) public header
11  *
12  * Header follows the Class Definitions for
13  * Communications Devices Specification (CDC120-20101103-track.pdf),
14  * PSTN Devices Specification (PSTN120.pdf) and
15  * Ethernet Control Model Devices Specification (ECM120.pdf).
16  * Header is limited to ACM and ECM Subclasses.
17  */
18 
19 #pragma once
20 
21 #include <stdint.h>
22 #include <sys/cdefs.h>
23 
24 #ifdef __cplusplus
25 extern "C" {
26 #endif
27 
28 /** CDC Specification release number in BCD format */
29 #define CDC_SRN_1_20            0x0120
30 
31 /** Communications Class Subclass Codes */
32 #define ACM_SUBCLASS            0x02
33 #define ECM_SUBCLASS            0x06
34 #define EEM_SUBCLASS            0x0c
35 
36 /** Communications Class Protocol Codes */
37 #define AT_CMD_V250_PROTOCOL        0x01
38 #define EEM_PROTOCOL            0x07
39 
40 /**
41  * @brief Data Class Interface Codes
42  * @note CDC120-20101103-track.pdf, 4.5, Table 6
43  */
44 #define DATA_INTERFACE_CLASS        0x0A
45 
46 /**
47  * @brief Values for the bDescriptorType Field
48  * @note CDC120-20101103-track.pdf, 5.2.3, Table 12
49  */
50 #define CS_INTERFACE            0x24
51 #define CS_ENDPOINT         0x25
52 
53 /**
54  * @brief bDescriptor SubType for Communications
55  * Class Functional Descriptors
56  * @note CDC120-20101103-track.pdf, 5.2.3, Table 13
57  */
58 #define HEADER_FUNC_DESC        0x00
59 #define CALL_MANAGEMENT_FUNC_DESC   0x01
60 #define ACM_FUNC_DESC           0x02
61 #define UNION_FUNC_DESC         0x06
62 #define ETHERNET_FUNC_DESC      0x0F
63 
64 /**
65  * @brief PSTN Subclass Specific Requests
66  * for ACM devices
67  * @note PSTN120.pdf, 6.3, Table 13
68  */
69 #define CDC_SEND_ENC_CMD        0x00
70 #define CDC_GET_ENC_RSP         0x01
71 #define SET_LINE_CODING         0x20
72 #define GET_LINE_CODING         0x21
73 #define SET_CONTROL_LINE_STATE      0x22
74 
75 /** Control Signal Bitmap Values for SetControlLineState */
76 #define SET_CONTROL_LINE_STATE_RTS  0x02
77 #define SET_CONTROL_LINE_STATE_DTR  0x01
78 
79 /** UART State Bitmap Values */
80 #define SERIAL_STATE_OVERRUN        0x40
81 #define SERIAL_STATE_PARITY     0x20
82 #define SERIAL_STATE_FRAMING        0x10
83 #define SERIAL_STATE_RING       0x08
84 #define SERIAL_STATE_BREAK      0x04
85 #define SERIAL_STATE_TX_CARRIER     0x02
86 #define SERIAL_STATE_RX_CARRIER     0x01
87 
88 /**
89  * @brief Class-Specific Request Codes for Ethernet subclass
90  * @note ECM120.pdf, 6.2, Table 6
91  */
92 #define SET_ETHERNET_MULTICAST_FILTERS  0x40
93 #define SET_ETHERNET_PM_FILTER      0x41
94 #define GET_ETHERNET_PM_FILTER      0x42
95 #define SET_ETHERNET_PACKET_FILTER  0x43
96 #define GET_ETHERNET_STATISTIC      0x44
97 
98 /** Ethernet Packet Filter Bitmap */
99 #define PACKET_TYPE_MULTICAST       0x10
100 #define PACKET_TYPE_BROADCAST       0x08
101 #define PACKET_TYPE_DIRECTED        0x04
102 #define PACKET_TYPE_ALL_MULTICAST   0x02
103 #define PACKET_TYPE_PROMISCUOUS     0x01
104 
105 /** Header Functional Descriptor */
106 struct cdc_header_descriptor {
107     uint8_t bFunctionLength;
108     uint8_t bDescriptorType;
109     uint8_t bDescriptorSubtype;
110     uint16_t bcdCDC;
111 } __packed;
112 
113 /** Union Interface Functional Descriptor */
114 struct cdc_union_descriptor {
115     uint8_t bFunctionLength;
116     uint8_t bDescriptorType;
117     uint8_t bDescriptorSubtype;
118     uint8_t bControlInterface;
119     uint8_t bSubordinateInterface0;
120 } __packed;
121 
122 /** Call Management Functional Descriptor */
123 struct cdc_cm_descriptor {
124     uint8_t bFunctionLength;
125     uint8_t bDescriptorType;
126     uint8_t bDescriptorSubtype;
127     uint8_t bmCapabilities;
128     uint8_t bDataInterface;
129 } __packed;
130 
131 /** Abstract Control Management Functional Descriptor */
132 struct cdc_acm_descriptor {
133     uint8_t bFunctionLength;
134     uint8_t bDescriptorType;
135     uint8_t bDescriptorSubtype;
136     uint8_t bmCapabilities;
137 } __packed;
138 
139 
140 /** Data structure for GET_LINE_CODING / SET_LINE_CODING class requests */
141 struct cdc_acm_line_coding {
142     uint32_t dwDTERate;
143     uint8_t bCharFormat;
144     uint8_t bParityType;
145     uint8_t bDataBits;
146 } __packed;
147 
148 /** Data structure for the notification about SerialState */
149 struct cdc_acm_notification {
150     uint8_t bmRequestType;
151     uint8_t bNotificationType;
152     uint16_t wValue;
153     uint16_t wIndex;
154     uint16_t wLength;
155     uint16_t data;
156 } __packed;
157 
158 /** Ethernet Networking Functional Descriptor */
159 struct cdc_ecm_descriptor {
160     uint8_t bFunctionLength;
161     uint8_t bDescriptorType;
162     uint8_t bDescriptorSubtype;
163     uint8_t iMACAddress;
164     uint32_t bmEthernetStatistics;
165     uint16_t wMaxSegmentSize;
166     uint16_t wNumberMCFilters;
167     uint8_t bNumberPowerFilters;
168 } __packed;
169 
170 #ifdef __cplusplus
171 }
172 #endif
173