Zephyr API Documentation 4.3.99
A Scalable Open Source RTOS
Loading...
Searching...
No Matches
usb_ch9.h
Go to the documentation of this file.
1/*
2 * Copyright (c) 2020 PHYTEC Messtechnik GmbH
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 */
6
14
15#include <zephyr/version.h>
16#include <zephyr/sys/util.h>
17#include <zephyr/math/ilog2.h>
19
20#ifndef ZEPHYR_INCLUDE_USB_CH9_H_
21#define ZEPHYR_INCLUDE_USB_CH9_H_
22
23#ifdef __cplusplus
24extern "C" {
25#endif
26
31#ifdef CONFIG_LITTLE_ENDIAN
35 uint8_t type : 2;
38#else
45#endif
46} __packed;
47
66
73#define USB_REQTYPE_DIR_TO_DEVICE 0
75#define USB_REQTYPE_DIR_TO_HOST 1
77
84#define USB_REQTYPE_TYPE_STANDARD 0
86#define USB_REQTYPE_TYPE_CLASS 1
88#define USB_REQTYPE_TYPE_VENDOR 2
90#define USB_REQTYPE_TYPE_RESERVED 3
92
99#define USB_REQTYPE_RECIPIENT_DEVICE 0
101#define USB_REQTYPE_RECIPIENT_INTERFACE 1
103#define USB_REQTYPE_RECIPIENT_ENDPOINT 2
105#define USB_REQTYPE_RECIPIENT_OTHER 3
107
115#define USB_REQTYPE_GET_DIR(bmRequestType) (((bmRequestType) >> 7) & 0x01U)
116
124#define USB_REQTYPE_GET_TYPE(bmRequestType) (((bmRequestType) >> 5) & 0x03U)
125
133#define USB_REQTYPE_GET_RECIPIENT(bmRequestType) ((bmRequestType) & 0x1FU)
134
143static inline bool usb_reqtype_is_to_host(const struct usb_setup_packet *setup)
144{
146}
147
156static inline bool usb_reqtype_is_to_device(const struct usb_setup_packet *setup)
157{
159}
160
166#define USB_SREQ_GET_STATUS 0x00
168#define USB_SREQ_CLEAR_FEATURE 0x01
170#define USB_SREQ_SET_FEATURE 0x03
172#define USB_SREQ_SET_ADDRESS 0x05
174#define USB_SREQ_GET_DESCRIPTOR 0x06
176#define USB_SREQ_SET_DESCRIPTOR 0x07
178#define USB_SREQ_GET_CONFIGURATION 0x08
180#define USB_SREQ_SET_CONFIGURATION 0x09
182#define USB_SREQ_GET_INTERFACE 0x0A
184#define USB_SREQ_SET_INTERFACE 0x0B
186#define USB_SREQ_SYNCH_FRAME 0x0C
188
194#define USB_DESC_DEVICE 1
196#define USB_DESC_CONFIGURATION 2
198#define USB_DESC_STRING 3
200#define USB_DESC_INTERFACE 4
202#define USB_DESC_ENDPOINT 5
204#define USB_DESC_DEVICE_QUALIFIER 6
206#define USB_DESC_OTHER_SPEED 7
208#define USB_DESC_INTERFACE_POWER 8
210
216#define USB_DESC_OTG 9
218#define USB_DESC_DEBUG 10
220#define USB_DESC_INTERFACE_ASSOC 11
222#define USB_DESC_BOS 15
224#define USB_DESC_DEVICE_CAPABILITY 16
226
232#define USB_DESC_CS_DEVICE 0x21
234#define USB_DESC_CS_CONFIGURATION 0x22
236#define USB_DESC_CS_STRING 0x23
238#define USB_DESC_CS_INTERFACE 0x24
240#define USB_DESC_CS_ENDPOINT 0x25
242
248#define USB_SFS_ENDPOINT_HALT 0x00
250#define USB_SFS_REMOTE_WAKEUP 0x01
252#define USB_SFS_TEST_MODE 0x02
254
260#define USB_SFS_TEST_MODE_J 0x01
262#define USB_SFS_TEST_MODE_K 0x02
264#define USB_SFS_TEST_MODE_SE0_NAK 0x03
266#define USB_SFS_TEST_MODE_PACKET 0x04
268#define USB_SFS_TEST_MODE_FORCE_ENABLE 0x05
270
276#define USB_GET_STATUS_SELF_POWERED BIT(0)
278#define USB_GET_STATUS_REMOTE_WAKEUP BIT(1)
280
290
300
334
358
378
402
407#ifdef CONFIG_LITTLE_ENDIAN
409 uint8_t transfer : 2;
411 uint8_t synch : 2;
413 uint8_t usage : 2;
415 uint8_t reserved : 2;
416#else
425#endif
426} __packed;
427
449
461
483
489#define USB_SCD_RESERVED BIT(7)
491#define USB_SCD_SELF_POWERED BIT(6)
493#define USB_SCD_REMOTE_WAKEUP BIT(5)
495
501#define USB_BCC_AUDIO 0x01
503#define USB_BCC_CDC_CONTROL 0x02
505#define USB_BCC_HID 0x03
507#define USB_BCC_MASS_STORAGE 0x08
509#define USB_BCC_CDC_DATA 0x0A
511#define USB_BCC_VIDEO 0x0E
513#define USB_BCC_MCTP 0x14
515#define USB_BCC_WIRELESS_CONTROLLER 0xE0
517#define USB_BCC_MISCELLANEOUS 0xEF
519#define USB_BCC_APPLICATION 0xFE
521#define USB_BCC_VENDOR 0xFF
523
529#define USB_SRN_1_1 0x0110
531#define USB_SRN_2_0 0x0200
533#define USB_SRN_2_0_1 0x0201
535#define USB_SRN_2_1 0x0210
537
545#define USB_DEC_TO_BCD(dec) ((((dec) / 10) << 4) | ((dec) % 10))
546
548#define USB_BCD_DRN (USB_DEC_TO_BCD(KERNEL_VERSION_MAJOR) << 8 | \
549 USB_DEC_TO_BCD(KERNEL_VERSION_MINOR))
550
558#define USB_GET_DESCRIPTOR_TYPE(wValue) ((uint8_t)((wValue) >> 8))
559
567#define USB_GET_DESCRIPTOR_INDEX(wValue) ((uint8_t)(wValue))
568
575#define USB_CONTROL_EP_MPS 64U
576
578#define USB_EP_DIR_MASK (uint8_t)BIT(7)
579
581#define USB_EP_DIR_IN (uint8_t)BIT(7)
582
584#define USB_EP_DIR_OUT 0U
585
586/*
587 * REVISE: this should actually be (ep) & 0x0F, but is causes
588 * many regressions in the current device support that are difficult
589 * to handle.
590 */
591
599#define USB_EP_GET_IDX(ep) ((ep) & ~USB_EP_DIR_MASK)
600
608#define USB_EP_GET_DIR(ep) ((ep) & USB_EP_DIR_MASK)
609
618#define USB_EP_GET_ADDR(idx, dir) ((idx) | ((dir) & USB_EP_DIR_MASK))
619
628#define USB_EP_DIR_IS_IN(ep) (USB_EP_GET_DIR(ep) == USB_EP_DIR_IN)
629
638#define USB_EP_DIR_IS_OUT(ep) (USB_EP_GET_DIR(ep) == USB_EP_DIR_OUT)
639
641#define USB_CONTROL_EP_OUT (USB_EP_DIR_OUT | 0U)
642
644#define USB_CONTROL_EP_IN (USB_EP_DIR_IN | 0U)
645
651#define USB_EP_TRANSFER_TYPE_MASK 0x3U
653#define USB_EP_TYPE_CONTROL 0U
655#define USB_EP_TYPE_ISO 1U
657#define USB_EP_TYPE_BULK 2U
659#define USB_EP_TYPE_INTERRUPT 3U
661
669#define USB_FS_INT_EP_INTERVAL(us) CLAMP(((us) / 1000U), 1U, 255U)
670
678#define USB_HS_INT_EP_INTERVAL(us) CLAMP((ilog2((us) / 125U) + 1U), 1U, 16U)
679
687#define USB_FS_ISO_EP_INTERVAL(us) CLAMP((ilog2((us) / 1000U) + 1U), 1U, 16U)
688
696#define USB_HS_ISO_EP_INTERVAL(us) CLAMP((ilog2((us) / 125U) + 1U), 1U, 16U)
697
705#define USB_MPS_EP_SIZE(mps) ((mps) & BIT_MASK(11))
706
714#define USB_MPS_ADDITIONAL_TRANSACTIONS(mps) (((mps) & 0x1800) >> 11)
715
723#define USB_MPS_TO_TPL(mps) \
724 ((1 + USB_MPS_ADDITIONAL_TRANSACTIONS(mps)) * USB_MPS_EP_SIZE(mps))
725
733#define USB_TPL_TO_MPS(tpl) \
734 (((tpl) > 2048) ? ((2 << 11) | ((tpl) / 3)) : \
735 ((tpl) > 1024) ? ((1 << 11) | ((tpl) / 2)) : \
736 (tpl))
737
745#define USB_TPL_ROUND_UP(tpl) \
746 (((tpl) > 2048) ? ROUND_UP(tpl, 3) : \
747 ((tpl) > 1024) ? ROUND_UP(tpl, 2) : \
748 (tpl))
749
758#define USB_TPL_IS_VALID(tpl) \
759 (((tpl) > 3072) ? false : \
760 ((tpl) > 2048) ? ((tpl) % 3 == 0) : \
761 ((tpl) > 1024) ? ((tpl) % 2 == 0) : \
762 ((tpl) >= 0))
763
764#ifdef __cplusplus
765}
766#endif
767
768#endif /* ZEPHYR_INCLUDE_USB_CH9_H_ */
Provide ilog2() function.
__UINT8_TYPE__ uint8_t
Definition stdint.h:88
__UINT16_TYPE__ uint16_t
Definition stdint.h:89
USB Association Descriptor defined in USB 3 spec.
Definition usb_ch9.h:465
uint8_t bLength
Descriptor length.
Definition usb_ch9.h:467
uint8_t bFunctionClass
Function class.
Definition usb_ch9.h:475
uint8_t bFunctionSubClass
Function subclass.
Definition usb_ch9.h:477
uint8_t iFunction
Function string index.
Definition usb_ch9.h:481
uint8_t bFunctionProtocol
Function protocol.
Definition usb_ch9.h:479
uint8_t bInterfaceCount
Number of associated interfaces.
Definition usb_ch9.h:473
uint8_t bFirstInterface
First interface number.
Definition usb_ch9.h:471
uint8_t bDescriptorType
Descriptor type.
Definition usb_ch9.h:469
USB Standard Configuration Descriptor.
Definition usb_ch9.h:360
uint8_t bLength
Descriptor length.
Definition usb_ch9.h:362
uint8_t bmAttributes
Configuration characteristics.
Definition usb_ch9.h:374
uint8_t bMaxPower
Maximum power consumption.
Definition usb_ch9.h:376
uint8_t bConfigurationValue
Configuration value.
Definition usb_ch9.h:370
uint8_t bDescriptorType
Descriptor type.
Definition usb_ch9.h:364
uint8_t iConfiguration
Configuration string index.
Definition usb_ch9.h:372
uint8_t bNumInterfaces
Number of interfaces.
Definition usb_ch9.h:368
uint16_t wTotalLength
Total length of configuration.
Definition usb_ch9.h:366
Header of an USB class-specific descriptor.
Definition usb_ch9.h:292
uint8_t bDescriptorType
Type of the descriptor.
Definition usb_ch9.h:296
uint8_t bDescriptorSubtype
Class-specific type of the descriptor.
Definition usb_ch9.h:298
uint8_t bLength
Length of the descriptor in bytes.
Definition usb_ch9.h:294
Header of a USB descriptor.
Definition usb_ch9.h:284
uint8_t bDescriptorType
Descriptor type.
Definition usb_ch9.h:288
uint8_t bLength
Descriptor length.
Definition usb_ch9.h:286
USB Standard Device Descriptor.
Definition usb_ch9.h:304
uint16_t idVendor
Vendor ID.
Definition usb_ch9.h:320
uint8_t iSerialNumber
Serial number string index.
Definition usb_ch9.h:330
uint16_t bcdDevice
Device release number.
Definition usb_ch9.h:324
uint8_t bDeviceProtocol
Device protocol.
Definition usb_ch9.h:316
uint8_t bNumConfigurations
Number of configurations.
Definition usb_ch9.h:332
uint16_t idProduct
Product ID.
Definition usb_ch9.h:322
uint16_t bcdUSB
USB specification release number.
Definition usb_ch9.h:310
uint8_t bDeviceClass
Device class.
Definition usb_ch9.h:312
uint8_t bMaxPacketSize0
Maximum packet size for endpoint zero.
Definition usb_ch9.h:318
uint8_t iProduct
Product string index.
Definition usb_ch9.h:328
uint8_t iManufacturer
Manufacturer string index.
Definition usb_ch9.h:326
uint8_t bDescriptorType
Descriptor type.
Definition usb_ch9.h:308
uint8_t bDeviceSubClass
Device subclass.
Definition usb_ch9.h:314
uint8_t bLength
Descriptor length.
Definition usb_ch9.h:306
USB Device Qualifier Descriptor.
Definition usb_ch9.h:338
uint8_t bDescriptorType
Descriptor type.
Definition usb_ch9.h:342
uint8_t bNumConfigurations
Number of configurations.
Definition usb_ch9.h:354
uint8_t bDeviceSubClass
Device subclass.
Definition usb_ch9.h:348
uint8_t bDeviceProtocol
Device protocol.
Definition usb_ch9.h:350
uint8_t bReserved
Reserved field.
Definition usb_ch9.h:356
uint16_t bcdUSB
USB specification release number.
Definition usb_ch9.h:344
uint8_t bLength
Descriptor length.
Definition usb_ch9.h:340
uint8_t bMaxPacketSize0
Maximum packet size for endpoint zero.
Definition usb_ch9.h:352
uint8_t bDeviceClass
Device class.
Definition usb_ch9.h:346
Endpoint attribute bit fields.
Definition usb_ch9.h:406
uint8_t transfer
Transfer type.
Definition usb_ch9.h:424
uint8_t synch
Synchronization type.
Definition usb_ch9.h:422
uint8_t reserved
Reserved bits.
Definition usb_ch9.h:418
uint8_t usage
Usage type.
Definition usb_ch9.h:420
USB Standard Endpoint Descriptor.
Definition usb_ch9.h:431
uint8_t bDescriptorType
Descriptor type.
Definition usb_ch9.h:435
uint8_t bEndpointAddress
Endpoint address.
Definition usb_ch9.h:437
struct usb_ep_desc_bmattr Attributes
Structured endpoint attributes.
Definition usb_ch9.h:442
uint8_t bInterval
Polling interval.
Definition usb_ch9.h:447
uint16_t wMaxPacketSize
Maximum packet size.
Definition usb_ch9.h:445
uint8_t bmAttributes
Raw endpoint attributes.
Definition usb_ch9.h:440
uint8_t bLength
Descriptor length.
Definition usb_ch9.h:433
USB Standard Interface Descriptor.
Definition usb_ch9.h:382
uint8_t bAlternateSetting
Alternate setting value.
Definition usb_ch9.h:390
uint8_t bInterfaceSubClass
Interface subclass.
Definition usb_ch9.h:396
uint8_t bInterfaceProtocol
Interface protocol.
Definition usb_ch9.h:398
uint8_t bNumEndpoints
Number of endpoints.
Definition usb_ch9.h:392
uint8_t bInterfaceClass
Interface class.
Definition usb_ch9.h:394
uint8_t iInterface
Interface string index.
Definition usb_ch9.h:400
uint8_t bDescriptorType
Descriptor type.
Definition usb_ch9.h:386
uint8_t bLength
Descriptor length.
Definition usb_ch9.h:384
uint8_t bInterfaceNumber
Interface number.
Definition usb_ch9.h:388
Representation of the bmRequestType bit field.
Definition usb_ch9.h:30
uint8_t recipient
Request recipient.
Definition usb_ch9.h:44
uint8_t type
Request type.
Definition usb_ch9.h:42
uint8_t direction
Data transfer direction.
Definition usb_ch9.h:40
USB Setup Data packet.
Definition usb_ch9.h:49
uint8_t bmRequestType
Raw request type value.
Definition usb_ch9.h:53
uint16_t wLength
Expected data length.
Definition usb_ch9.h:64
uint16_t wValue
Request-specific value.
Definition usb_ch9.h:60
uint16_t wIndex
Request-specific index.
Definition usb_ch9.h:62
uint8_t bRequest
Request code.
Definition usb_ch9.h:58
struct usb_req_type_field RequestType
Request type bit fields.
Definition usb_ch9.h:55
USB Unicode (UTF16LE) String Descriptor.
Definition usb_ch9.h:453
uint8_t bDescriptorType
Descriptor type.
Definition usb_ch9.h:457
uint8_t bLength
Descriptor length.
Definition usb_ch9.h:455
uint16_t bString
UTF-16LE encoded character.
Definition usb_ch9.h:459
Misc utilities.
#define USB_REQTYPE_DIR_TO_DEVICE
Host-to-device data direction.
Definition usb_ch9.h:73
static bool usb_reqtype_is_to_device(const struct usb_setup_packet *setup)
Check if request transfer direction is to device.
Definition usb_ch9.h:156
static bool usb_reqtype_is_to_host(const struct usb_setup_packet *setup)
Check if request transfer direction is to host.
Definition usb_ch9.h:143
#define USB_REQTYPE_DIR_TO_HOST
Device-to-host data direction.
Definition usb_ch9.h:75
USB Hub Class device API header.