mirror of
				https://github.com/espressif/esp-idf.git
				synced 2025-11-03 22:08:28 +00:00 
			
		
		
		
	refactor(usb_host): Added chapter11 header, refactor chapter9 header
This commit is contained in:
		
				
					committed by
					
						
						Darian Leung
					
				
			
			
				
	
			
			
			
						parent
						
							78515b3fef
						
					
				
				
					commit
					01761f4c99
				
			@@ -14,6 +14,7 @@ Warning: The USB Host Library API is still a beta version and may be subject to
 | 
			
		||||
#include "esp_err.h"
 | 
			
		||||
#include "usb/usb_types_stack.h"
 | 
			
		||||
#include "usb/usb_types_ch9.h"
 | 
			
		||||
#include "usb/usb_types_ch11.h"
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
extern "C" {
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										221
									
								
								components/usb/include/usb/usb_types_ch11.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										221
									
								
								components/usb/include/usb/usb_types_ch11.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,221 @@
 | 
			
		||||
/*
 | 
			
		||||
 * SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD
 | 
			
		||||
 *
 | 
			
		||||
 * SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#pragma once
 | 
			
		||||
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
#include "esp_assert.h"
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
extern "C" {
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @brief USB Hub request types
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define USB_BM_REQUEST_TYPE_HUB         (USB_BM_REQUEST_TYPE_TYPE_CLASS | USB_BM_REQUEST_TYPE_RECIP_DEVICE)
 | 
			
		||||
#define USB_BM_REQUEST_TYPE_PORT        (USB_BM_REQUEST_TYPE_TYPE_CLASS | USB_BM_REQUEST_TYPE_RECIP_OTHER)
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @brief USB Hub descriptor type
 | 
			
		||||
 */
 | 
			
		||||
#define USB_CLASS_DESCRIPTOR_TYPE_HUB   0x29
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @brief USB Hub Class bRequest codes
 | 
			
		||||
 *
 | 
			
		||||
 * See USB 2.0 spec Table 11-16
 | 
			
		||||
 */
 | 
			
		||||
typedef enum {
 | 
			
		||||
    USB_B_REQUEST_HUB_GET_PORT_STATUS     = 0x00,   /**< Get port status.  */
 | 
			
		||||
    USB_B_REQUEST_HUB_CLEAR_FEATURE       = 0x01,   /**< Clearing a feature disables that feature or starts a process associated with the feature. */
 | 
			
		||||
    USB_B_REQUEST_HUB_GET_STATE           = 0x02,   /**< Outdated. Used in previous specifications for GET_STATE */
 | 
			
		||||
    USB_B_REQUEST_HUB_SET_PORT_FEATURE    = 0x03,   /**< Set port feature. */
 | 
			
		||||
    USB_B_REQUEST_HUB_GET_DESCRIPTOR      = 0x06,   /**< Get HUB descriptor. */
 | 
			
		||||
    USB_B_REQUEST_HUB_SET_DESCRIPTOR      = 0x07,   /**< Set HUB descriptor. */
 | 
			
		||||
    USB_B_REQUEST_HUB_CLEAR_TT_BUFFER     = 0x08,   /**< This request clears the state of a Transaction Translator(TT) bulk/control buffer after it has been left in a busy state due to high-speed errors. */
 | 
			
		||||
    USB_B_REQUEST_HUB_RESET_TT            = 0x09,   /**< Reset TT. */
 | 
			
		||||
    USB_B_REQUEST_HUB_GET_TT_STATE        = 0x0A,   /**< Get TT state. */
 | 
			
		||||
    USB_B_REQUEST_HUB_STOP_TT             = 0x0B,   /**< Stop TT. */
 | 
			
		||||
} usb_hub_class_request_t ;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @brief USB Hub Port feature selector codes
 | 
			
		||||
 *
 | 
			
		||||
 * See USB 2.0 spec Table 11-17
 | 
			
		||||
 */
 | 
			
		||||
typedef enum {
 | 
			
		||||
    USB_FEATURE_PORT_CONNECTION         = 0x00,
 | 
			
		||||
    USB_FEATURE_PORT_ENABLE             = 0x01,
 | 
			
		||||
    USB_FEATURE_PORT_SUSPEND            = 0x02,
 | 
			
		||||
    USB_FEATURE_PORT_OVER_CURRENT       = 0x03,
 | 
			
		||||
    USB_FEATURE_PORT_RESET              = 0x04,
 | 
			
		||||
    USB_FEATURE_PORT_POWER              = 0x08,
 | 
			
		||||
    USB_FEATURE_PORT_LOWSPEED           = 0x09,
 | 
			
		||||
    USB_FEATURE_C_PORT_CONNECTION       = 0x10,
 | 
			
		||||
    USB_FEATURE_C_PORT_ENABLE           = 0x11,
 | 
			
		||||
    USB_FEATURE_C_PORT_SUSPEND          = 0x12,
 | 
			
		||||
    USB_FEATURE_C_PORT_OVER_CURRENT     = 0x13,
 | 
			
		||||
    USB_FEATURE_C_PORT_RESET            = 0x14,
 | 
			
		||||
    USB_FEATURE_PORT_TEST               = 0x15,
 | 
			
		||||
    USB_FEATURE_PORT_INDICATOR          = 0x16,
 | 
			
		||||
} usb_hub_port_feature_t;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @brief Size of a USB Hub Port Status and Hub Change results
 | 
			
		||||
 */
 | 
			
		||||
#define USB_PORT_STATUS_SIZE            4
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @brief USB Hub Port Status and Hub Change results
 | 
			
		||||
 *
 | 
			
		||||
 * See USB 2.0 spec Table 11-19 and Table 11-20
 | 
			
		||||
 */
 | 
			
		||||
typedef struct {
 | 
			
		||||
    union {
 | 
			
		||||
        struct {
 | 
			
		||||
            uint8_t     PORT_CONNECTION      : 1;   /**< 0 = No device is present. 1 = A device is present on this port.*/
 | 
			
		||||
            uint8_t     PORT_ENABLE          : 1;   /**< 0 = Port is disabled. 1 = Port is enabled.*/
 | 
			
		||||
            uint8_t     PORT_SUSPEND         : 1;   /**< 0 = Not suspended. 1 = Suspended or resuming. */
 | 
			
		||||
            uint8_t     PORT_OVER_CURRENT    : 1;   /**< 0 = All no over-current condition exists on this port. 1 = An over-current condition exists on this port. */
 | 
			
		||||
            uint8_t     PORT_RESET           : 1;   /**< 0 = Reset signaling not asserted. 1 = Reset signaling asserted. */
 | 
			
		||||
            uint8_t     RESERVED_1           : 3;   /**< Reserved field */
 | 
			
		||||
            uint8_t     PORT_POWER           : 1;   /**< 0 = This port is in the Powered-off state. 1 = This port is not in the Powered-off state. */
 | 
			
		||||
            uint8_t     PORT_LOW_SPEED       : 1;   /**< 0 = Full-speed or High-speed device attached to this port (determined by bit 10). 1 = Low-speed device attached to this port.*/
 | 
			
		||||
            uint8_t     PORT_HIGH_SPEED      : 1;   /**< 0 = Full-speed device attached to this port. 1 = High-speed device attached to this port. */
 | 
			
		||||
            uint8_t     PORT_TEST            : 1;   /**< 0 = This port is not in the Port Test Mode. 1 = This port is in Port Test Mode. */
 | 
			
		||||
            uint8_t     PORT_INDICATOR       : 1;   /**< 0 = Port indicator displays default colors. 1 = Port indicator displays software controlled color. */
 | 
			
		||||
            uint8_t     RESERVED_2           : 3;   /**< Reserved field */
 | 
			
		||||
        };
 | 
			
		||||
        uint16_t val;                               /**< Port status value */
 | 
			
		||||
    }   wPortStatus;
 | 
			
		||||
 | 
			
		||||
    union {
 | 
			
		||||
        struct {
 | 
			
		||||
            uint8_t     C_PORT_CONNECTION    : 1;   /**< 0 = No change has occurred to Current Connect status. 1 = Current Connect status has changed. */
 | 
			
		||||
            uint8_t     C_PORT_ENABLE        : 1;   /**< This field is set to one when a port is disabled because of a Port_Error condition */
 | 
			
		||||
            uint8_t     C_PORT_SUSPEND       : 1;   /**< 0 = No change. 1 = Resume complete. */
 | 
			
		||||
            uint8_t     C_PORT_OVER_CURRENT  : 1;   /**< 0 = No change has occurred to Over-Current Indicator. 1 = Over-Current Indicator has changed. */
 | 
			
		||||
            uint8_t     C_PORT_RESET         : 1;   /**< This field is set when reset processing on this port is complete. 0 = No change. 1 = Reset complete.*/
 | 
			
		||||
            uint16_t    RESERVED             : 11;  /**< Reserved field */
 | 
			
		||||
        };
 | 
			
		||||
        uint16_t val;                               /**< Port change value */
 | 
			
		||||
    }   wPortChange;
 | 
			
		||||
} __attribute__((packed)) usb_port_status_t;
 | 
			
		||||
ESP_STATIC_ASSERT(sizeof(usb_port_status_t) == USB_PORT_STATUS_SIZE, "Size of usb_port_status_t incorrect");
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @brief Size of a USB Hub Status
 | 
			
		||||
 */
 | 
			
		||||
#define USB_HUB_STATUS_SIZE             4
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @brief USB Hub Status
 | 
			
		||||
 */
 | 
			
		||||
typedef struct {
 | 
			
		||||
    union {
 | 
			
		||||
        struct {
 | 
			
		||||
            uint8_t HUB_LOCAL_POWER     : 1;    /**< 0 = Local power supply good. 1 = Local power supply lost (inactive)*/
 | 
			
		||||
            uint8_t HUB_OVER_CURRENT    : 1;    /**< 0 = No over-current condition currently exists. 1 = A hub over-current condition exists.*/
 | 
			
		||||
            uint16_t RESERVED           : 14;   /**< Reserved fields */
 | 
			
		||||
        };
 | 
			
		||||
        uint16_t val;                           /**< Hub status value */
 | 
			
		||||
    } wHubStatus;
 | 
			
		||||
    union {
 | 
			
		||||
        struct {
 | 
			
		||||
            uint8_t C_HUB_LOCAL_POWER   : 1;    /**< 0 = No change has occurred to Local Power Status. 1 = Local Power Status has changed.*/
 | 
			
		||||
            uint8_t C_HUB_OVER_CURRENT  : 1;    /**< 0 = No change has occurred to the Over-Current Status. 1 = Over-Current Status has changed.*/
 | 
			
		||||
            uint16_t RESERVED           : 14;   /**< Reserved fields */
 | 
			
		||||
        };
 | 
			
		||||
        uint16_t val;                           /**< Hub change value */
 | 
			
		||||
    } wHubChange;
 | 
			
		||||
} __attribute__((packed)) usb_hub_status_t;
 | 
			
		||||
ESP_STATIC_ASSERT(sizeof(usb_hub_status_t) == USB_HUB_STATUS_SIZE, "Size of usb_hub_status_t incorrect");
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @brief Size of a USB Hub Device descriptor
 | 
			
		||||
 */
 | 
			
		||||
#define USB_HUB_DESCRIPTOR_SIZE         (7)
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @brief USB Hub Device descriptor
 | 
			
		||||
 */
 | 
			
		||||
typedef struct {
 | 
			
		||||
    uint8_t  bDescLength;                   /**< Number of bytes in this descriptor, including this byte */
 | 
			
		||||
    uint8_t  bDescriptorType;               /**< Descriptor Type, value: 29H for Hub descriptor */
 | 
			
		||||
    uint8_t  bNbrPorts;                     /**< Number of downstream facing ports that this Hub supports */
 | 
			
		||||
    uint16_t wHubCharacteristics;           /**< Logical Power Switching Mode, Compound Device, Over-current Protection Mode, TT Think Time, Port Indicators Supported */
 | 
			
		||||
    uint8_t  bPwrOn2PwrGood;                /**< Time (in 2 ms intervals) from the time the power-on sequence begins on a port until power is good on that port */
 | 
			
		||||
    uint8_t  bHubContrCurrent;              /**< Maximum current requirements of the Hub Controller electronics in mA. */
 | 
			
		||||
} __attribute__((packed)) usb_hub_descriptor_t;
 | 
			
		||||
ESP_STATIC_ASSERT(sizeof(usb_hub_descriptor_t) == USB_HUB_DESCRIPTOR_SIZE, "Size of usb_hub_descriptor_t incorrect");
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @brief Initializer for a request to get HUB descriptor
 | 
			
		||||
 */
 | 
			
		||||
#define USB_SETUP_PACKET_INIT_GET_HUB_DESCRIPTOR(setup_pkt_ptr) ({  \
 | 
			
		||||
    (setup_pkt_ptr)->bmRequestType = USB_BM_REQUEST_TYPE_DIR_IN | USB_BM_REQUEST_TYPE_HUB;   \
 | 
			
		||||
    (setup_pkt_ptr)->bRequest = USB_B_REQUEST_HUB_GET_DESCRIPTOR;   \
 | 
			
		||||
    (setup_pkt_ptr)->wValue = (USB_CLASS_DESCRIPTOR_TYPE_HUB << 8); \
 | 
			
		||||
    (setup_pkt_ptr)->wIndex = 0;    \
 | 
			
		||||
    (setup_pkt_ptr)->wLength = sizeof(usb_hub_descriptor_t);  \
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @brief Initializer for a request to get HUB status
 | 
			
		||||
 */
 | 
			
		||||
#define USB_SETUP_PACKET_INIT_GET_HUB_STATUS(setup_pkt_ptr) ({  \
 | 
			
		||||
    (setup_pkt_ptr)->bmRequestType = USB_BM_REQUEST_TYPE_DIR_IN | USB_BM_REQUEST_TYPE_HUB;   \
 | 
			
		||||
    (setup_pkt_ptr)->bRequest = USB_B_REQUEST_HUB_GET_PORT_STATUS;   \
 | 
			
		||||
    (setup_pkt_ptr)->wValue = 0; \
 | 
			
		||||
    (setup_pkt_ptr)->wIndex = 0;    \
 | 
			
		||||
    (setup_pkt_ptr)->wLength = sizeof(usb_hub_status_t);  \
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @brief Initializer for a request to get port status
 | 
			
		||||
 */
 | 
			
		||||
#define USB_SETUP_PACKET_INIT_GET_PORT_STATUS(setup_pkt_ptr, port) ({  \
 | 
			
		||||
    (setup_pkt_ptr)->bmRequestType = USB_BM_REQUEST_TYPE_DIR_IN | USB_BM_REQUEST_TYPE_PORT;   \
 | 
			
		||||
    (setup_pkt_ptr)->bRequest = USB_B_REQUEST_HUB_GET_PORT_STATUS;   \
 | 
			
		||||
    (setup_pkt_ptr)->wValue = 0; \
 | 
			
		||||
    (setup_pkt_ptr)->wIndex = (port);    \
 | 
			
		||||
    (setup_pkt_ptr)->wLength = sizeof(usb_port_status_t);  \
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @brief Initializer for a set port feature
 | 
			
		||||
 */
 | 
			
		||||
#define USB_SETUP_PACKET_INIT_SET_PORT_FEATURE(setup_pkt_ptr, port, feature) ({  \
 | 
			
		||||
    (setup_pkt_ptr)->bmRequestType = USB_BM_REQUEST_TYPE_DIR_OUT | USB_BM_REQUEST_TYPE_PORT;   \
 | 
			
		||||
    (setup_pkt_ptr)->bRequest = USB_B_REQUEST_HUB_SET_PORT_FEATURE;   \
 | 
			
		||||
    (setup_pkt_ptr)->wValue = (feature); \
 | 
			
		||||
    (setup_pkt_ptr)->wIndex = (port);    \
 | 
			
		||||
    (setup_pkt_ptr)->wLength = 0;  \
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @brief Initializer for a clear port feature
 | 
			
		||||
 */
 | 
			
		||||
#define USB_SETUP_PACKET_INIT_CLEAR_PORT_FEATURE(setup_pkt_ptr, port, feature) ({  \
 | 
			
		||||
    (setup_pkt_ptr)->bmRequestType = USB_BM_REQUEST_TYPE_DIR_OUT | USB_BM_REQUEST_TYPE_PORT;   \
 | 
			
		||||
    (setup_pkt_ptr)->bRequest = USB_B_REQUEST_HUB_CLEAR_FEATURE;   \
 | 
			
		||||
    (setup_pkt_ptr)->wValue = (feature); \
 | 
			
		||||
    (setup_pkt_ptr)->wIndex = (port);    \
 | 
			
		||||
    (setup_pkt_ptr)->wLength = 0;  \
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @brief Get Port Number from a setup packet
 | 
			
		||||
 */
 | 
			
		||||
#define USB_SETUP_PACKET_GET_PORT(setup_pkt_ptr) ({  \
 | 
			
		||||
    (setup_pkt_ptr)->wIndex;    \
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
}
 | 
			
		||||
#endif //__cplusplus
 | 
			
		||||
@@ -96,7 +96,7 @@ typedef union {
 | 
			
		||||
        uint16_t wValue;                    /**< Word-sized field that varies according to request */
 | 
			
		||||
        uint16_t wIndex;                    /**< Word-sized field that varies according to request; typically used to pass an index or offset */
 | 
			
		||||
        uint16_t wLength;                   /**< Number of bytes to transfer if there is a data stage */
 | 
			
		||||
    } __attribute__((packed));
 | 
			
		||||
    } USB_DESC_ATTR;                        /**< USB descriptor attributes */
 | 
			
		||||
    uint8_t val[USB_SETUP_PACKET_SIZE];     /**< Descriptor value */
 | 
			
		||||
} usb_setup_packet_t;
 | 
			
		||||
ESP_STATIC_ASSERT(sizeof(usb_setup_packet_t) == USB_SETUP_PACKET_SIZE, "Size of usb_setup_packet_t incorrect");
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user