mirror of
https://github.com/espressif/esp-idf.git
synced 2026-04-28 03:23:14 +00:00
9ab7d5eb03
Add ESP32-S31 USB DWC/UTMI LL headers, SoC register structures, peripheral descriptors, capabilities, and linker mappings so the HS OTG controller and UTMI PHY can be built in esp_hal_usb. Introduce SOC_USB_FSLS_PHY_NUM on USB-OTG targets to separate FSLS USB_WRAP support from OTG/UTMI support. Use it to gate usb_wrap, the USB PHY driver, docs, and example build rules on targets without an FSLS PHY. Also add UTMI data pulldown control to the HAL, clear the boot-time DWC suspend state on ESP32-S31, alias the legacy internal PHY target to UTMI for backward compatibility, and extend usb_phy tests for UTMI-only targets.
120 lines
3.2 KiB
C
120 lines
3.2 KiB
C
/*
|
|
* SPDX-FileCopyrightText: 2015-2026 Espressif Systems (Shanghai) CO LTD
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <stdbool.h>
|
|
#include "soc/soc_caps.h"
|
|
#if (SOC_USB_FSLS_PHY_NUM > 0)
|
|
#include "soc/usb_wrap_struct.h"
|
|
#include "hal/usb_wrap_ll.h"
|
|
#endif // (SOC_USB_FSLS_PHY_NUM > 0)
|
|
#include "hal/usb_wrap_types.h"
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
#if (SOC_USB_FSLS_PHY_NUM > 0)
|
|
|
|
/**
|
|
* @brief HAL context type of USB WRAP driver
|
|
*/
|
|
typedef struct {
|
|
usb_wrap_dev_t *dev;
|
|
} usb_wrap_hal_context_t;
|
|
|
|
/**
|
|
* @brief Initialize the USB WRAP HAL driver
|
|
*
|
|
* @param hal USB WRAP HAL context
|
|
*/
|
|
void _usb_wrap_hal_init(usb_wrap_hal_context_t *hal);
|
|
|
|
#if SOC_RCC_IS_INDEPENDENT
|
|
#define usb_wrap_hal_init(...) _usb_wrap_hal_init(__VA_ARGS__)
|
|
#else
|
|
// Use a macro to wrap the function, force the caller to use it in a critical section
|
|
// the critical section needs to declare the __DECLARE_RCC_ATOMIC_ENV variable in advance
|
|
#define usb_wrap_hal_init(...) do {(void)__DECLARE_RCC_ATOMIC_ENV; _usb_wrap_hal_init(__VA_ARGS__);} while(0)
|
|
#endif
|
|
|
|
/**
|
|
* @brief Disable USB WRAP
|
|
*
|
|
* Disable clock to the peripheral
|
|
*/
|
|
void _usb_wrap_hal_disable(void);
|
|
|
|
#if SOC_RCC_IS_INDEPENDENT
|
|
#define usb_wrap_hal_disable(...) _usb_wrap_hal_disable(__VA_ARGS__)
|
|
#else
|
|
// Use a macro to wrap the function, force the caller to use it in a critical section
|
|
// the critical section needs to declare the __DECLARE_RCC_ATOMIC_ENV variable in advance
|
|
#define usb_wrap_hal_disable(...) do {(void)__DECLARE_RCC_ATOMIC_ENV; _usb_wrap_hal_disable(__VA_ARGS__);} while(0)
|
|
#endif
|
|
|
|
/* ---------------------------- USB PHY Control ---------------------------- */
|
|
|
|
#if USB_WRAP_LL_EXT_PHY_SUPPORTED
|
|
/**
|
|
* @brief Configure whether USB WRAP is routed to internal/external FSLS PHY
|
|
*
|
|
* @param hal USB WRAP HAL context
|
|
* @param external True if external, False if internal
|
|
*/
|
|
void usb_wrap_hal_phy_set_external(usb_wrap_hal_context_t *hal, bool external);
|
|
#endif // USB_WRAP_LL_EXT_PHY_SUPPORTED
|
|
|
|
/**
|
|
* @brief Enables and sets override of pull up/down resistors
|
|
*
|
|
* @param hal USB WRAP HAL context
|
|
* @param vals Override values
|
|
*/
|
|
static inline void usb_wrap_hal_phy_enable_pull_override(usb_wrap_hal_context_t *hal, const usb_wrap_pull_override_vals_t *vals)
|
|
{
|
|
usb_wrap_ll_phy_enable_pull_override(hal->dev, vals);
|
|
}
|
|
|
|
/**
|
|
* @brief Disables pull up/down resistor override
|
|
*
|
|
* @param hal USB WRAP HAL context
|
|
*/
|
|
static inline void usb_wrap_hal_phy_disable_pull_override(usb_wrap_hal_context_t *hal)
|
|
{
|
|
usb_wrap_ll_phy_disable_pull_override(hal->dev);
|
|
}
|
|
|
|
/**
|
|
* @brief Enables/disables the USB FSLS PHY's test mode
|
|
*
|
|
* @param hal USB WRAP HAL context
|
|
* @param enable Whether to enable test mode
|
|
*/
|
|
static inline void usb_wrap_hal_phy_enable_test_mode(usb_wrap_hal_context_t *hal, bool enable)
|
|
{
|
|
usb_wrap_ll_phy_enable_test_mode(hal->dev, enable);
|
|
}
|
|
|
|
/**
|
|
* @brief Set the USB FSLS PHY's signal test values
|
|
*
|
|
* @param hal USB WRAP HAL context
|
|
* @param vals Test values
|
|
*/
|
|
static inline void usb_wrap_hal_phy_test_mode_set_signals(usb_wrap_hal_context_t *hal, const usb_wrap_test_mode_vals_t *vals)
|
|
{
|
|
usb_wrap_ll_phy_test_mode_set_signals(hal->dev, vals);
|
|
}
|
|
|
|
#endif // (SOC_USB_FSLS_PHY_NUM > 0)
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|