mirror of
https://github.com/espressif/esp-idf.git
synced 2025-12-07 09:02:08 +00:00
refactor(hal/usb): Add new USB PHY related HAL API
This commit adds/updates the USB PHY related HAL APIs. The following changes are made: - Updated 'usb_wrap_hal.h' API - Added 'usb_serial_jtag_hal.h' API
This commit is contained in:
@@ -13,7 +13,7 @@
|
||||
#include "esp_private/usb_phy.h"
|
||||
#include "soc/usb_dwc_periph.h"
|
||||
#include "hal/usb_wrap_hal.h"
|
||||
#include "hal/usb_wrap_ll.h"
|
||||
#include "hal/usb_serial_jtag_hal.h"
|
||||
#include "esp_rom_gpio.h"
|
||||
#include "driver/gpio.h"
|
||||
#include "hal/gpio_ll.h"
|
||||
@@ -39,7 +39,10 @@ struct phy_context_t {
|
||||
usb_otg_mode_t otg_mode; /**< USB OTG mode */
|
||||
usb_phy_speed_t otg_speed; /**< USB speed */
|
||||
usb_phy_ext_io_conf_t *iopins; /**< external PHY I/O pins */
|
||||
usb_fsls_phy_hal_context_t hal_context; /**< USB_PHY hal context */
|
||||
usb_wrap_hal_context_t wrap_hal; /**< USB WRAP HAL context */
|
||||
#if SOC_USB_SERIAL_JTAG_SUPPORTED
|
||||
usb_serial_jtag_hal_context_t usj_hal; /**< USJ HAL context */
|
||||
#endif
|
||||
};
|
||||
|
||||
typedef struct {
|
||||
@@ -126,7 +129,14 @@ esp_err_t usb_phy_otg_set_mode(usb_phy_handle_t handle, usb_otg_mode_t mode)
|
||||
esp_rom_gpio_connect_in_signal(GPIO_MATRIX_CONST_ONE_INPUT, USB_OTG_VBUSVALID_IN_IDX, false); // receiving a valid Vbus from host
|
||||
esp_rom_gpio_connect_in_signal(GPIO_MATRIX_CONST_ONE_INPUT, USB_OTG_AVALID_IN_IDX, false); // HIGH to force USB host mode
|
||||
if (handle->target == USB_PHY_TARGET_INT) {
|
||||
usb_fsls_phy_hal_int_load_conf_host(&(handle->hal_context));
|
||||
// Configure pull resistors for host
|
||||
usb_wrap_pull_override_vals_t vals = {
|
||||
.dp_pu = false,
|
||||
.dm_pu = false,
|
||||
.dp_pd = true,
|
||||
.dm_pd = true,
|
||||
};
|
||||
usb_wrap_hal_phy_enable_pull_override(&handle->wrap_hal, &vals);
|
||||
}
|
||||
} else if (mode == USB_OTG_MODE_DEVICE) {
|
||||
esp_rom_gpio_connect_in_signal(GPIO_MATRIX_CONST_ONE_INPUT, USB_OTG_IDDIG_IN_IDX, false); // connected connector is mini-B side
|
||||
@@ -147,7 +157,19 @@ esp_err_t usb_phy_otg_dev_set_speed(usb_phy_handle_t handle, usb_phy_speed_t spe
|
||||
USBPHY_TAG, "set speed not supported");
|
||||
|
||||
handle->otg_speed = speed;
|
||||
usb_fsls_phy_hal_int_load_conf_dev(&(handle->hal_context), speed);
|
||||
// Configure pull resistors for device
|
||||
usb_wrap_pull_override_vals_t vals = {
|
||||
.dp_pd = false,
|
||||
.dm_pd = false,
|
||||
};
|
||||
if (speed == USB_PHY_SPEED_LOW) {
|
||||
vals.dp_pu = false;
|
||||
vals.dm_pu = true;
|
||||
} else {
|
||||
vals.dp_pu = true;
|
||||
vals.dm_pu = false;
|
||||
}
|
||||
usb_wrap_hal_phy_enable_pull_override(&handle->wrap_hal, &vals);
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
@@ -163,7 +185,7 @@ esp_err_t usb_phy_action(usb_phy_handle_t handle, usb_phy_action_t action)
|
||||
switch (action) {
|
||||
case USB_PHY_ACTION_HOST_ALLOW_CONN:
|
||||
if (handle->target == USB_PHY_TARGET_INT) {
|
||||
usb_fsls_phy_hal_int_mimick_disconn(&(handle->hal_context), false);
|
||||
usb_wrap_hal_phy_enable_test_mode(&handle->wrap_hal, false);
|
||||
} else {
|
||||
if (!handle->iopins) {
|
||||
ret = ESP_FAIL;
|
||||
@@ -180,7 +202,21 @@ esp_err_t usb_phy_action(usb_phy_handle_t handle, usb_phy_action_t action)
|
||||
|
||||
case USB_PHY_ACTION_HOST_FORCE_DISCONN:
|
||||
if (handle->target == USB_PHY_TARGET_INT) {
|
||||
usb_fsls_phy_hal_int_mimick_disconn(&(handle->hal_context), true);
|
||||
/*
|
||||
We mimic a disconnect by enabling the internal PHY's test mode,
|
||||
then forcing the output_enable to HIGH. This will cause the received
|
||||
VP and VM to be zero, thus mimicking a disconnection.
|
||||
*/
|
||||
const usb_wrap_test_mode_vals_t vals = {
|
||||
.tx_enable_n = true,
|
||||
.tx_dp = false,
|
||||
.tx_dm = false,
|
||||
.rx_dp = false,
|
||||
.rx_dm = false,
|
||||
.rx_rcv = false,
|
||||
};
|
||||
usb_wrap_hal_phy_test_mode_set_signals(&handle->wrap_hal, &vals);
|
||||
usb_wrap_hal_phy_enable_test_mode(&handle->wrap_hal, true);
|
||||
} else {
|
||||
/*
|
||||
Disable connections on the external PHY by connecting the VP and VM signals to the constant LOW signal.
|
||||
@@ -263,15 +299,18 @@ esp_err_t usb_new_phy(const usb_phy_config_t *config, usb_phy_handle_t *handle_r
|
||||
phy_context->controller = config->controller;
|
||||
phy_context->status = USB_PHY_STATUS_IN_USE;
|
||||
|
||||
usb_fsls_phy_hal_init(&(phy_context->hal_context));
|
||||
usb_wrap_hal_init(&phy_context->wrap_hal);
|
||||
#if SOC_USB_SERIAL_JTAG_SUPPORTED
|
||||
usb_serial_jtag_hal_init(&phy_context->usj_hal);
|
||||
#endif
|
||||
if (config->controller == USB_PHY_CTRL_OTG) {
|
||||
#if USB_WRAP_LL_EXT_PHY_SUPPORTED
|
||||
usb_fsls_phy_hal_otg_conf(&(phy_context->hal_context), config->target == USB_PHY_TARGET_EXT);
|
||||
usb_wrap_hal_phy_set_external(&phy_context->wrap_hal, (config->target == USB_PHY_TARGET_EXT));
|
||||
#endif
|
||||
}
|
||||
#if SOC_USB_SERIAL_JTAG_SUPPORTED
|
||||
else if (config->controller == USB_PHY_CTRL_SERIAL_JTAG) {
|
||||
usb_fsls_phy_hal_jtag_conf(&(phy_context->hal_context), config->target == USB_PHY_TARGET_EXT);
|
||||
usb_serial_jtag_hal_phy_set_external(&phy_context->usj_hal, (config->target == USB_PHY_TARGET_EXT));
|
||||
phy_context->otg_mode = USB_OTG_MODE_DEVICE;
|
||||
phy_context->otg_speed = USB_PHY_SPEED_FULL;
|
||||
}
|
||||
@@ -336,14 +375,7 @@ esp_err_t usb_del_phy(usb_phy_handle_t handle)
|
||||
p_phy_ctrl_obj->external_phy = NULL;
|
||||
} else {
|
||||
// Clear pullup and pulldown loads on D+ / D-, and disable the pads
|
||||
usb_wrap_pull_override_vals_t vals = {
|
||||
.dp_pu = false,
|
||||
.dm_pu = false,
|
||||
.dp_pd = false,
|
||||
.dm_pd = false,
|
||||
};
|
||||
usb_wrap_ll_phy_enable_pull_override(handle->hal_context.wrap_dev, &vals);
|
||||
usb_wrap_ll_phy_enable_pad(handle->hal_context.wrap_dev, false);
|
||||
usb_wrap_hal_phy_disable_pull_override(&handle->wrap_hal);
|
||||
p_phy_ctrl_obj->internal_phy = NULL;
|
||||
}
|
||||
portEXIT_CRITICAL(&phy_spinlock);
|
||||
|
||||
Reference in New Issue
Block a user