-
Notifications
You must be signed in to change notification settings - Fork 7.4k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge branch 'refactor/usb_host_enum_as_driver' into 'master'
refactor(hub): ENUM Driver Closes IDF-9523 See merge request espressif/esp-idf!29892
- Loading branch information
Showing
16 changed files
with
1,729 additions
and
769 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Large diffs are not rendered by default.
Oops, something went wrong.
Large diffs are not rendered by default.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,159 @@ | ||
/* | ||
* SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD | ||
* | ||
* SPDX-License-Identifier: Apache-2.0 | ||
*/ | ||
#pragma once | ||
|
||
#include <stdint.h> | ||
#include "sdkconfig.h" | ||
#include "esp_err.h" | ||
#include "hcd.h" | ||
#include "usbh.h" | ||
#include "usb/usb_types_stack.h" | ||
#include "usb/usb_types_ch9.h" | ||
|
||
#ifdef __cplusplus | ||
extern "C" { | ||
#endif | ||
|
||
// ---------------------- Settings & Configuration ----------------------------- | ||
#ifdef CONFIG_USB_HOST_ENABLE_ENUM_FILTER_CALLBACK | ||
#define ENABLE_ENUM_FILTER_CALLBACK 1 | ||
#endif // CONFIG_USB_HOST_ENABLE_ENUM_FILTER_CALLBACK | ||
|
||
// -------------------------- Public Types ------------------------------------- | ||
|
||
// ---------------------------- Handles ---------------------------------------- | ||
|
||
/** | ||
* @brief Handle of enumeration control object | ||
*/ | ||
typedef struct enum_ctx_handle_s * enum_ctx_handle_t; | ||
|
||
// ------------------------------ Events --------------------------------------- | ||
|
||
/** | ||
* @brief Event data object for Enumerator driver events | ||
*/ | ||
typedef enum { | ||
ENUM_EVENT_STARTED, /**< Enumeration of a device has started */ | ||
ENUM_EVENT_RESET_REQUIRED, /**< Enumerating device requires a reset */ | ||
ENUM_EVENT_COMPLETED, /**< Enumeration of a device has completed */ | ||
ENUM_EVENT_CANCELED, /**< Enumeration of a device was canceled */ | ||
} enum_event_t; | ||
|
||
typedef struct { | ||
enum_event_t event; /**< Enumerator driver event */ | ||
union { | ||
struct { | ||
unsigned int uid; /**< Device unique ID */ | ||
usb_device_handle_t parent_dev_hdl; /**< Parent of the enumerating device */ | ||
uint8_t parent_port_num; /**< Parent port number of the enumerating device */ | ||
} started; /**< ENUM_EVENT_STARTED specific data */ | ||
|
||
struct { | ||
usb_device_handle_t parent_dev_hdl; /**< Parent of the enumerating device */ | ||
uint8_t parent_port_num; /**< Parent port number of the enumerating device */ | ||
} reset_req; /**< ENUM_EVENT_RESET_REQUIRED specific data */ | ||
|
||
struct { | ||
usb_device_handle_t parent_dev_hdl; /**< Parent of the enumerating device */ | ||
uint8_t parent_port_num; /**< Parent port number of the enumerating device */ | ||
usb_device_handle_t dev_hdl; /**< Handle of the enumerating device */ | ||
uint8_t dev_addr; /**< Address of the enumerating device */ | ||
} complete; /**< ENUM_EVENT_COMPLETED specific data */ | ||
|
||
struct { | ||
usb_device_handle_t parent_dev_hdl; /**< Parent of the enumerating device */ | ||
uint8_t parent_port_num; /**< Parent port number of the enumerating device */ | ||
} canceled; /**< ENUM_EVENT_CANCELED specific data */ | ||
}; | ||
} enum_event_data_t; | ||
|
||
// ---------------------------- Callbacks -------------------------------------- | ||
|
||
/** | ||
* @brief Callback used to indicate that the Enumerator has an event | ||
*/ | ||
typedef void (*enum_event_cb_t)(enum_event_data_t *event_data, void *arg); | ||
|
||
/** | ||
* @brief Enum driver configuration | ||
*/ | ||
typedef struct { | ||
usb_proc_req_cb_t proc_req_cb; /**< Processing request callback */ | ||
void *proc_req_cb_arg; /**< Processing request callback argument */ | ||
enum_event_cb_t enum_event_cb; /**< Enum event callback */ | ||
void *enum_event_cb_arg; /**< Enum event callback argument */ | ||
#if ENABLE_ENUM_FILTER_CALLBACK | ||
usb_host_enum_filter_cb_t enum_filter_cb; /**< Set device configuration callback */ | ||
void *enum_filter_cb_arg; /**< Set device configuration callback argument */ | ||
#endif // ENABLE_ENUM_FILTER_CALLBACK | ||
} enum_config_t; | ||
|
||
/** | ||
* @brief Install Enumerator driver | ||
* | ||
* Entry: | ||
* - USBH must already be installed | ||
* - HUB must already be installed | ||
* | ||
* @param[in] enum_config Enumeration driver configuration | ||
* @param[out] client_ret Unique pointer to identify Enum Driver as a USB Host client | ||
* @return esp_err_t | ||
*/ | ||
esp_err_t enum_install(enum_config_t *enum_config, void **client_ret); | ||
|
||
/** | ||
* @brief Uninstall Enumerator driver | ||
* | ||
* This must be called before uninstalling the HUB and USBH | ||
* | ||
* @return esp_err_t | ||
*/ | ||
esp_err_t enum_uninstall(void); | ||
|
||
/** | ||
* @brief Start the enumeration process | ||
* | ||
* This will start the enumeration process for the device currently at address 0 | ||
* | ||
* @param[in] uid Unique device ID | ||
* @retval ESP_OK: Enumeration process started | ||
* @retval ESP_ERR_NOT_FOUND: No device at address 0 | ||
*/ | ||
esp_err_t enum_start(unsigned int uid); | ||
|
||
/** | ||
* @brief Continue enumeration process | ||
* | ||
* This will continue the enumeration process. Typically called after the successful | ||
* handling of a request from the Enumerator driver (such as ENUM_EVENT_RESET_REQUIRED) | ||
* | ||
* @param[in] uid Unique device ID | ||
* @return esp_err_t | ||
*/ | ||
esp_err_t enum_proceed(unsigned int uid); | ||
|
||
/** | ||
* @brief Cancel the enumeration process | ||
* | ||
* This will cancel enumeration process for device object under enumeration | ||
* | ||
* @return esp_err_t | ||
*/ | ||
esp_err_t enum_cancel(unsigned int uid); | ||
|
||
/** | ||
* @brief Enumerator processing function | ||
* | ||
* Processing function that must be called repeatedly to process enumeration stages | ||
* | ||
* @return esp_err_t | ||
*/ | ||
esp_err_t enum_process(void); | ||
|
||
#ifdef __cplusplus | ||
} | ||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Oops, something went wrong.