1 /*
2 * Copyright (c) 2020-2021 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 /**
17 * @addtogroup USB
18 * @{
19 *
20 * @brief Declares USB-related APIs, including the custom data types and functions
21 * used to obtain descriptors, interface objects, and request objects, and to submit requests.
22 *
23 * @since 1.0
24 * @version 1.0
25 */
26
27 /**
28 * @file usb_ddk.h
29 *
30 * @brief Defines the USB-related structures.
31 *
32 * @since 1.0
33 * @version 1.0
34 */
35
36 #ifndef USB_DDK_H
37 #define USB_DDK_H
38
39 #include "hdf_base.h"
40 #include <endian.h>
41
42 #ifdef __BYTE_ORDER
43 #if __BYTE_ORDER == __LITTLE_ENDIAN
44 /**
45 * @brief Implements 16-bit little-endian conversion.
46 */
47 #define CPU_TO_LE16(x) (x)
48 /**
49 * @brief Implements 32-bit little-endian conversion.
50 */
51 #define CPU_TO_LE32(x) (x)
52 #else
53 /**
54 * @brief Implements 16-bit little-endian conversion.
55 */
56 #define CPU_TO_LE16(x) ((((x) >> 8) & 0xffu) | (((x)&0xffu) << 8))
57 /**
58 * @brief Implements 32-bit little-endian conversion.
59 */
60 #define CPU_TO_LE32(x) \
61 ((((x)&0xff000000u) >> 24) | (((x)&0x00ff0000u) >> 8) | (((x)&0x0000ff00u) << 8) | (((x)&0x000000ffu) << 24))
62 #endif
63 #endif
64
65 /**
66 * @brief Implements 16-bit little-endian conversion.
67 */
68 #define LE16_TO_CPU CPU_TO_LE16
69 /**
70 * @brief Implements 16-bit little-endian conversion.
71 */
72 #define LE32_TO_CPU CPU_TO_LE32
73
74 /**
75 * @brief Configures the bus power-on feature.
76 */
77 #define USB_CFG_BUS_POWERED 0x80
78
79 /**
80 * @brief Configures the automatic power-on feature.
81 */
82 #define USB_CFG_SELF_POWERED 0x40
83
84 /**
85 * @brief Configures the remote wakeup feature.
86 */
87 #define USB_CFG_REMOTE_WAKEUP 0x20
88
89 /**
90 * @brief Defines the data direction bit offset. For details, see {@link UsbRequestDirection}.
91 */
92 #define USB_DIR_OFFSET 0x07
93
94 /**
95 * @brief Defines the control request type offset. For details, see {@link UsbControlRequestType}.
96 */
97 #define USB_TYPE_OFFSET 0x05
98
99 /**
100 * @brief Defines the control request packet type offset. For details, see {@link UsbRequestTargetType}.
101 */
102 #define USB_RECIP_OFFSET 0x00
103
104 /**
105 * @brief Defines the USB string index.
106 */
107 enum {
108 /** Manufacturer index */
109 USB_FUNC_MANUFACTURER_IDX,
110 /** Product index */
111 USB_FUNC_PRODUCT_IDX,
112 /** Product SN index */
113 USB_FUNC_SERIAL_IDX,
114 /** Index of the first valid string */
115 USB_FUNC_FIRST_AVAIL_IDX,
116 };
117
118 /**
119 * @brief Renames a descriptor structure.
120 */
121 enum {
122 FUNCTIONFS_DESCRIPTORS_MAGIC = 1,
123 FUNCTIONFS_STRINGS_MAGIC = 2,
124 FUNCTIONFS_DESCRIPTORS_MAGIC_V2 = 3,
125 };
126
127 enum FunctionfsFlags {
128 FUNCTIONFS_HAS_FS_DESC = 1,
129 FUNCTIONFS_HAS_HS_DESC = 2,
130 FUNCTIONFS_HAS_SS_DESC = 4,
131 FUNCTIONFS_HAS_MS_OS_DESC = 8,
132 FUNCTIONFS_VIRTUAL_ADDR = 16,
133 FUNCTIONFS_EVENTFD = 32,
134 FUNCTIONFS_ALL_CTRL_RECIP = 64,
135 FUNCTIONFS_CONFIG0_SETUP = 128,
136 };
137
138 enum UsbDeviceSpeed {
139 USB_DDK_SPEED_UNKNOWN = 0,
140 USB_DDK_SPEED_LOW,
141 USB_DDK_SPEED_FULL,
142 USB_DDK_SPEED_HIGH,
143 USB_DDK_SPEED_WIRELESS,
144 USB_DDK_SPEED_SUPER,
145 USB_DDK_SPEED_SUPER_PLUS,
146 };
147
148 struct UsbCtrlRequest {
149 uint8_t bRequestType;
150 uint8_t bRequest;
151 uint16_t wValue;
152 uint16_t wIndex;
153 uint16_t wLength;
154 } __attribute__((packed));
155
156 struct UsbDescriptorHeader {
157 uint8_t bLength;
158 uint8_t bDescriptorType;
159 } __attribute__((packed));
160
161 typedef struct UsbDeviceDescriptor {
162 uint8_t bLength;
163 uint8_t bDescriptorType;
164 uint16_t bcdUSB;
165 uint8_t bDeviceClass;
166 uint8_t bDeviceSubClass;
167 uint8_t bDeviceProtocol;
168 uint8_t bMaxPacketSize0;
169 uint16_t idVendor;
170 uint16_t idProduct;
171 uint16_t bcdDevice;
172 uint8_t iManufacturer;
173 uint8_t iProduct;
174 uint8_t iSerialNumber;
175 uint8_t bNumConfigurations;
176 } __attribute__((packed)) UsbDeviceDescriptor;
177
178 struct UsbConfigDescriptor {
179 uint8_t bLength;
180 uint8_t bDescriptorType;
181 uint16_t wTotalLength;
182 uint8_t bNumInterfaces;
183 uint8_t bConfigurationValue;
184 uint8_t iConfiguration;
185 uint8_t bmAttributes;
186 uint8_t bMaxPower;
187 } __attribute__((packed));
188
189 struct UsbStringDescriptor {
190 uint8_t bLength;
191 uint8_t bDescriptorType;
192 uint16_t wData[1];
193 } __attribute__((packed));
194
195 struct UsbInterfaceDescriptor {
196 uint8_t bLength;
197 uint8_t bDescriptorType;
198 uint8_t bInterfaceNumber;
199 uint8_t bAlternateSetting;
200 uint8_t bNumEndpoints;
201 uint8_t bInterfaceClass;
202 uint8_t bInterfaceSubClass;
203 uint8_t bInterfaceProtocol;
204 uint8_t iInterface;
205 } __attribute__((packed));
206
207 struct UsbEndpointDescriptor {
208 uint8_t bLength;
209 uint8_t bDescriptorType;
210 uint8_t bEndpointAddress;
211 uint8_t bmAttributes;
212 uint16_t wMaxPacketSize;
213 uint8_t bInterval;
214 uint8_t bRefresh;
215 uint8_t bSynchAddress;
216 } __attribute__((packed));
217
218 struct UsbSspIsocEpCompDescriptor {
219 uint8_t bLength;
220 uint8_t bDescriptorType;
221 uint16_t wReseved;
222 uint32_t dwBytesPerInterval;
223 } __attribute__((packed));
224
225 struct UsbSsEpCompDescriptor {
226 uint8_t bLength;
227 uint8_t bDescriptorType;
228 uint8_t bMaxBurst;
229 uint8_t bmAttributes;
230 uint16_t wBytesPerInterval;
231 } __attribute__((packed));
232
233 struct UsbQualifierDescriptor {
234 uint8_t bLength;
235 uint8_t bDescriptorType;
236 uint16_t bcdUSB;
237 uint8_t bDeviceClass;
238 uint8_t bDeviceSubClass;
239 uint8_t bDeviceProtocol;
240 uint8_t bMaxPacketSize0;
241 uint8_t bNumConfigurations;
242 uint8_t bRESERVED;
243 } __attribute__((packed));
244
245 struct UsbOtgDescriptor {
246 uint8_t bLength;
247 uint8_t bDescriptorType;
248 uint8_t bmAttributes;
249 } __attribute__((packed));
250
251 struct UsbOtg20Descriptor {
252 uint8_t bLength;
253 uint8_t bDescriptorType;
254 uint8_t bmAttributes;
255 uint16_t bcdOTG;
256 } __attribute__((packed));
257
258 struct UsbInterfaceAssocDescriptor {
259 uint8_t bLength;
260 uint8_t bDescriptorType;
261 uint8_t bFirstInterface;
262 uint8_t bInterfaceCount;
263 uint8_t bFunctionClass;
264 uint8_t bFunctionSubClass;
265 uint8_t bFunctionProtocol;
266 uint8_t iFunction;
267 } __attribute__((packed));
268
269 struct UsbFunctionfsStringsHead {
270 uint32_t magic;
271 uint32_t length;
272 uint32_t strCount;
273 uint32_t langCount;
274 } __attribute__((packed));
275
276 struct UsbFunctionfsDescsHeadV2 {
277 uint32_t magic;
278 uint32_t length;
279 uint32_t flags;
280 } __attribute__((packed));
281
282 struct UsbSecurityDescriptor {
283 uint8_t bLength;
284 uint8_t bDescriptorType;
285 uint16_t wTotalLength;
286 uint8_t bNumEncryptionTypes;
287 } __attribute__((packed));
288
289 struct UsbCdcLineCoding {
290 uint32_t dwDTERate;
291 uint8_t bCharFormat;
292
293 #define USB_CDC_1_STOP_BITS 0
294 #define USB_CDC_1_5_STOP_BITS 1
295 #define USB_CDC_2_STOP_BITS 2
296 uint8_t bParityType;
297
298 #define USB_CDC_NO_PARITY 0
299 #define USB_CDC_ODD_PARITY 1
300 #define USB_CDC_EVEN_PARITY 2
301 #define USB_CDC_MARK_PARITY 3
302 #define USB_CDC_SPACE_PARITY 4
303 uint8_t bDataBits;
304 } __attribute__((packed));
305
306 struct UsbCdcNotification {
307 uint8_t bmRequestType;
308 uint8_t bNotificationType;
309 uint16_t wValue;
310 uint16_t wIndex;
311 uint16_t wLength;
312 } __attribute__((packed));
313
314 struct UsbCdcHeaderDesc {
315 uint8_t bLength;
316 uint8_t bDescriptorType;
317 uint8_t bDescriptorSubType;
318 uint16_t bcdCDC;
319 } __attribute__((packed));
320
321 struct UsbCdcCallMgmtDescriptor {
322 uint8_t bLength;
323 uint8_t bDescriptorType;
324 uint8_t bDescriptorSubType;
325 uint8_t bmCapabilities;
326
327 #define USB_CDC_CALL_MGMT_CAP_CALL_MGMT 0x01
328 #define USB_CDC_CALL_MGMT_CAP_DATA_INTF 0x02
329 uint8_t bDataInterface;
330 } __attribute__((packed));
331
332 struct UsbCdcAcmDescriptor {
333 uint8_t bLength;
334 uint8_t bDescriptorType;
335 uint8_t bDescriptorSubType;
336 uint8_t bmCapabilities;
337 } __attribute__((packed));
338
339 struct UsbCdcUnionDesc {
340 uint8_t bLength;
341 uint8_t bDescriptorType;
342 uint8_t bDescriptorSubType;
343 uint8_t bMasterInterface0;
344 uint8_t bSlaveInterface0;
345 } __attribute__((packed));
346
347 struct UsbDebugDescriptor {
348 uint8_t bLength;
349 uint8_t bDescriptorType;
350 uint8_t bDebugInEndpoint;
351 uint8_t bDebugOutEndpoint;
352 } __attribute__((packed));
353
354 struct UsbCdcEtherDesc {
355 uint8_t bLength;
356 uint8_t bDescriptorType;
357 uint8_t bDescriptorSubType;
358
359 uint8_t iMACAddress;
360 uint32_t bmEthernetStatistics;
361 uint16_t wMaxSegmentSize;
362 uint16_t wNumberMCFilters;
363 uint8_t bNumberPowerFilters;
364 } __attribute__((packed));
365
366 #define USB_DDK_ENDPOINT_NUMBER_MASK 0x0F
367 #define USB_DDK_ENDPOINT_DIR_MASK 0x80
368 #define USB_DDK_DIR_OUT 0x00
369 #define USB_DDK_DIR_IN 0x80
370
371 #define USB_DDK_DT_DEVICE 0x01
372 #define USB_DDK_DT_CONFIG 0x02
373 #define USB_DDK_DT_STRING 0x03
374 #define USB_DDK_DT_INTERFACE 0x04
375 #define USB_DDK_DT_ENDPOINT 0x05
376 #define USB_DDK_DT_DEVICE_QUALIFIER 0x06
377 #define USB_DDK_DT_OTHER_SPEED_CONFIG 0x07
378 #define USB_DDK_DT_INTERFACE_POWER 0x08
379 #define USB_DDK_DT_OTG 0x09
380 #define USB_DDK_DT_DEBUG 0x0A
381 #define USB_DDK_DT_INTERFACE_ASSOCIATION 0x0B
382 #define USB_DDK_DT_SECURITY 0x0C
383 #define USB_DDK_DT_KEY 0x0D
384 #define USB_DDK_DT_ENCRYPTION_TYPE 0x0E
385 #define USB_DDK_DT_BOS 0x0F
386 #define USB_DDK_DT_DEVICE_CAPABILITY 0x10
387 #define USB_DDK_DT_WIRELESS_ENDPOINT_COMP 0x11
388 #define USB_DDK_DT_WIRE_ADAPTER 0x21
389 #define USB_DDK_DT_RPIPE 0x22
390 #define USB_DDK_DT_CS_RADIO_CONTROL 0x23
391 #define USB_DDK_DT_PIPE_USAGE 0x24
392 #define USB_DDK_DT_SS_ENDPOINT_COMP 0x30
393 #define USB_DDK_DT_SSP_ISOC_ENDPOINT_COMP 0x31
394 #define USB_DDK_DT_CS_DEVICE (USB_DDK_TYPE_CLASS | USB_DDK_DT_DEVICE)
395 #define USB_DDK_DT_CS_CONFIG (USB_DDK_TYPE_CLASS | USB_DDK_DT_CONFIG)
396 #define USB_DDK_DT_CS_STRING (USB_DDK_TYPE_CLASS | USB_DDK_DT_STRING)
397 #define USB_DDK_DT_CS_INTERFACE (USB_DDK_TYPE_CLASS | USB_DDK_DT_INTERFACE)
398 #define USB_DDK_DT_CS_ENDPOINT (USB_DDK_TYPE_CLASS | USB_DDK_DT_ENDPOINT)
399
400 #define USB_DDK_DT_SS_EP_COMP_SIZE 0x06
401 #define USB_DDK_DT_ENDPOINT_SIZE 0x07
402 #define USB_DDK_DT_SSP_ISOC_EP_COMP_SIZE 0x08
403 #define USB_DDK_DT_INTERFACE_ASSOCIATION_SIZE 0x08
404 #define USB_DDK_DT_CONFIG_SIZE 0x09
405 #define USB_DDK_DT_INTERFACE_SIZE 0x09
406 #define USB_DDK_DT_ENDPOINT_AUDIO_SIZE 0x09
407 #define USB_DDK_DT_DEVICE_SIZE 0x12
408
409 #define USB_DDK_CLASS_PER_INTERFACE 0x00
410 #define USB_DDK_CLASS_AUDIO 0x01
411 #define USB_DDK_CLASS_COMM 0x02
412 #define USB_DDK_CLASS_HID 0x03
413 #define USB_DDK_CLASS_PHYSICAL 0x05
414 #define USB_DDK_CLASS_STILL_IMAGE 0x06
415 #define USB_DDK_CLASS_PRINTER 0x07
416 #define USB_DDK_CLASS_MASS_STORAGE 0x08
417 #define USB_DDK_CLASS_HUB 0x09
418 #define USB_DDK_CLASS_CDC_DATA 0x0A
419 #define USB_DDK_CLASS_CSCID 0x0B
420 #define USB_DDK_CLASS_CONTENT_SEC 0x0D
421 #define USB_DDK_CLASS_VIDEO 0x0E
422 #define USB_DDK_CLASS_WIRELESS_CONTROLLER 0xE0
423 #define USB_DDK_CLASS_MISC 0xEF
424 #define USB_DDK_CLASS_APP_SPEC 0xFE
425 #define USB_DDK_CLASS_VENDOR_SPEC 0xFF
426 #define USB_DDK_SUBCLASS_VENDOR_SPEC 0xFF
427
428 #define USB_DDK_CDC_NOTIFY_NETWORK_CONNECTION 0x00
429 #define USB_DDK_CDC_NOTIFY_RESPONSE_AVAILABLE 0x01
430 #define USB_DDK_CDC_NOTIFY_SERIAL_STATE 0x20
431 #define USB_DDK_CDC_NOTIFY_SPEED_CHANGE 0x2A
432
433 #define USB_DDK_CDC_SEND_ENCAPSULATED_COMMAND 0x00
434 #define USB_DDK_CDC_GET_ENCAPSULATED_RESPONSE 0x01
435 #define USB_DDK_CDC_REQ_SET_LINE_CODING 0x20
436 #define USB_DDK_CDC_REQ_GET_LINE_CODING 0x21
437 #define USB_DDK_CDC_REQ_SET_CONTROL_LINE_STATE 0x22
438 #define USB_DDK_CDC_REQ_SEND_BREAK 0x23
439 #define USB_DDK_CDC_SET_ETHERNET_MULTICAST_FILTERS 0x40
440 #define USB_DDK_CDC_SET_ETHERNET_PM_PATTERN_FILTER 0x41
441 #define USB_DDK_CDC_GET_ETHERNET_PM_PATTERN_FILTER 0x42
442 #define USB_DDK_CDC_SET_ETHERNET_PACKET_FILTER 0x43
443 #define USB_DDK_CDC_GET_ETHERNET_STATISTIC 0x44
444 #define USB_DDK_CDC_GET_NTB_PARAMETERS 0x80
445 #define USB_DDK_CDC_GET_NET_ADDRESS 0x81
446 #define USB_DDK_CDC_SET_NET_ADDRESS 0x82
447 #define USB_DDK_CDC_GET_NTB_FORMAT 0x83
448 #define USB_DDK_CDC_SET_NTB_FORMAT 0x84
449 #define USB_DDK_CDC_GET_NTB_INPUT_SIZE 0x85
450 #define USB_DDK_CDC_SET_NTB_INPUT_SIZE 0x86
451 #define USB_DDK_CDC_GET_MAX_DATAGRAM_SIZE 0x87
452 #define USB_DDK_CDC_SET_MAX_DATAGRAM_SIZE 0x88
453 #define USB_DDK_CDC_GET_CRC_MODE 0x89
454 #define USB_DDK_CDC_SET_CRC_MODE 0x8A
455
456 #define USB_DDK_CDC_COMM_FEATURE 0x01
457 #define USB_DDK_CDC_CAP_LINE 0x02
458 #define USB_DDK_CDC_CAP_BRK 0x04
459 #define USB_DDK_CDC_CAP_NOTIFY 0x08
460
461 #define USB_DDK_CDC_HEADER_TYPE 0x00
462 #define USB_DDK_CDC_CALL_MANAGEMENT_TYPE 0x01
463 #define USB_DDK_CDC_ACM_TYPE 0x02
464 #define USB_DDK_CDC_UNION_TYPE 0x06
465 #define USB_DDK_CDC_COUNTRY_TYPE 0x07
466 #define USB_DDK_CDC_NETWORK_TERMINAL_TYPE 0x0a
467 #define USB_DDK_CDC_ETHERNET_TYPE 0x0f
468 #define USB_DDK_CDC_WHCM_TYPE 0x11
469 #define USB_DDK_CDC_MDLM_TYPE 0x12
470 #define USB_DDK_CDC_MDLM_DETAIL_TYPE 0x13
471 #define USB_DDK_CDC_DMM_TYPE 0x14
472 #define USB_DDK_CDC_OBEX_TYPE 0x15
473 #define USB_DDK_CDC_NCM_TYPE 0x1A
474 #define USB_DDK_CDC_MBIM_TYPE 0x1B
475 #define USB_DDK_CDC_MBIM_EXTENDED_TYPE 0x1C
476
477 #define USB_DDK_CDC_PROTO_NONE 0x00
478 #define USB_DDK_CDC_ACM_PROTO_AT_V25TER 0x01
479 #define USB_DDK_CDC_ACM_PROTO_AT_PCCA101 0x02
480 #define USB_DDK_CDC_ACM_PROTO_AT_PCCA101_WAKE 0x03
481 #define USB_DDK_CDC_ACM_PROTO_AT_GSM 0x04
482 #define USB_DDK_CDC_ACM_PROTO_AT_3G 0x05
483 #define USB_DDK_CDC_ACM_PROTO_AT_CDMA 0x06
484 #define USB_DDK_CDC_PROTO_EEM 0x07
485
486 #define USB_DDK_CDC_NCM_PROTO_NTB 0x01
487 #define USB_DDK_CDC_MBIM_PROTO_NTB 0x02
488
489 #define USB_DDK_CDC_SUBCLASS_ACM 0x02
490 #define USB_DDK_CDC_SUBCLASS_ETHERNET 0x06
491 #define USB_DDK_CDC_SUBCLASS_WHCM 0x08
492 #define USB_DDK_CDC_SUBCLASS_DMM 0x09
493 #define USB_DDK_CDC_SUBCLASS_MDLM 0x0A
494 #define USB_DDK_CDC_SUBCLASS_OBEX 0x0B
495 #define USB_DDK_CDC_SUBCLASS_EEM 0x0C
496 #define USB_DDK_CDC_SUBCLASS_NCM 0x0D
497 #define USB_DDK_CDC_SUBCLASS_MBIM 0x0E
498
499 #define USB_DDK_CDC_PACKET_TYPE_PROMISCUOUS (1 << 0)
500 #define USB_DDK_CDC_PACKET_TYPE_ALL_MULTICAST (1 << 1)
501 #define USB_DDK_CDC_PACKET_TYPE_DIRECTED (1 << 2)
502 #define USB_DDK_CDC_PACKET_TYPE_BROADCAST (1 << 3)
503 #define USB_DDK_CDC_PACKET_TYPE_MULTICAST (1 << 4)
504
505 #define USB_DDK_CDC_ACM_PROTO_VENDOR 0xFF
506
507 #define USB_DDK_TYPE_MASK (0x03 << 5)
508 #define USB_DDK_TYPE_STANDARD (0x00 << 5)
509 #define USB_DDK_TYPE_CLASS (0x01 << 5)
510 #define USB_DDK_TYPE_VENDOR (0x02 << 5)
511 #define USB_DDK_TYPE_RESERVED (0x03 << 5)
512
513 #define USB_DDK_ENDPOINT_XFERTYPE_MASK 0x03
514 #define USB_DDK_ENDPOINT_XFER_CONTROL 0x00
515 #define USB_DDK_ENDPOINT_XFER_ISOC 0x01
516 #define USB_DDK_ENDPOINT_XFER_BULK 0x02
517 #define USB_DDK_ENDPOINT_XFER_INT 0x03
518 #define USB_DDK_ENDPOINT_MAX_ADJUSTABLE 0x80
519
520 #define USB_DDK_RECIP_MASK 0x1F
521 #define USB_DDK_RECIP_DEVICE 0x00
522 #define USB_DDK_RECIP_INTERFACE 0x01
523 #define USB_DDK_RECIP_ENDPOINT 0x02
524 #define USB_DDK_RECIP_OTHER 0x03
525
526 #define USB_DDK_REQ_GET_STATUS 0x00
527 #define USB_DDK_REQ_CLEAR_FEATURE 0x01
528 #define USB_DDK_REQ_SET_FEATURE 0x03
529 #define USB_DDK_REQ_SET_ADDRESS 0x05
530 #define USB_DDK_REQ_GET_DESCRIPTOR 0x06
531 #define USB_DDK_REQ_SET_DESCRIPTOR 0x07
532 #define USB_DDK_REQ_GET_CONFIGURATION 0x08
533 #define USB_DDK_REQ_SET_CONFIGURATION 0x09
534 #define USB_DDK_REQ_GET_INTERFACE 0x0A
535 #define USB_DDK_REQ_SET_INTERFACE 0x0B
536 #define USB_DDK_REQ_SYNCH_FRAME 0x0C
537 #define USB_DDK_REQ_SET_SEL 0x30
538 #define USB_DDK_REQ_SET_ISOCH_DELAY 0x31
539
540 /**
541 * @brief Checks whether the specified endpoint is in the input direction (the direction in
542 * which data is transferred from the device to the host). For details, see {@link UsbRequestDirection}.
543 *
544 * @param ep Indicates the endpoint address, which is in the <b>uint8_t</b> format.
545 *
546 * @return Returns <b>1</b> if the specified endpoint is in the input direction; returns <b>0</b> otherwise.
547 */
UsbEndpointDirIn(uint8_t ep)548 inline int32_t UsbEndpointDirIn(uint8_t ep)
549 {
550 return ((ep & USB_DDK_ENDPOINT_DIR_MASK) == USB_DDK_DIR_IN);
551 }
552
553 /**
554 * @brief Checks whether the specified endpoint is in the output direction (the direction in which data is
555 * transferred from the host to the device). For details, see {@link UsbRequestDirection}.
556 *
557 * @param ep Indicates the endpoint address, which is in the <b>uint8_t</b> format.
558 *
559 * @return Returns <b>1</b> if the specified endpoint is in the output direction; returns <b>0</b> otherwise.
560 */
UsbEndpointDirOut(uint8_t ep)561 inline int32_t UsbEndpointDirOut(uint8_t ep)
562 {
563 return ((ep & USB_DDK_ENDPOINT_DIR_MASK) == USB_DDK_DIR_OUT);
564 }
565
566 #endif /* USB_DDK_H */
567 /** @} */
568