| 
									
										
										
										
											2021-08-19 20:28:28 +08:00
										 |  |  | /*
 | 
					
						
							| 
									
										
										
										
											2021-11-18 02:07:53 +08:00
										 |  |  |  * SPDX-FileCopyrightText: 2015-2022 Espressif Systems (Shanghai) CO LTD | 
					
						
							| 
									
										
										
										
											2021-08-19 20:28:28 +08:00
										 |  |  |  * | 
					
						
							|  |  |  |  * SPDX-License-Identifier: Apache-2.0 | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #pragma once
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <stdint.h>
 | 
					
						
							|  |  |  | #include <stdbool.h>
 | 
					
						
							|  |  |  | #include "soc/soc_caps.h"
 | 
					
						
							|  |  |  | #include "hal/usb_phy_types.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifdef __cplusplus
 | 
					
						
							|  |  |  | extern "C" { | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-06 09:04:53 +02:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * @brief Initialization for usb_phy_otg_io_conf_t: Self-powered device | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | #define USB_PHY_SELF_POWERED_DEVICE(vbus_monitor_io)                                                                          \
 | 
					
						
							|  |  |  |     {                                                                                                                  \ | 
					
						
							|  |  |  |         .iddig_io_num = -1,                                                                                            \ | 
					
						
							|  |  |  |         .avalid_io_num = -1,                                                                                           \ | 
					
						
							|  |  |  |         .vbusvalid_io_num = -1,                                                                                        \ | 
					
						
							|  |  |  |         .idpullup_io_num = -1,                                                                                         \ | 
					
						
							|  |  |  |         .dppulldown_io_num = -1,                                                                                       \ | 
					
						
							|  |  |  |         .dmpulldown_io_num = -1,                                                                                       \ | 
					
						
							|  |  |  |         .drvvbus_io_num = -1,                                                                                          \ | 
					
						
							|  |  |  |         .bvalid_io_num = vbus_monitor_io,                                                                              \ | 
					
						
							|  |  |  |         .sessend_io_num = -1,                                                                                          \ | 
					
						
							|  |  |  |         .chrgvbus_io_num = -1,                                                                                         \ | 
					
						
							|  |  |  |         .dischrgvbus_io_num = -1,                                                                                      \ | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-19 20:28:28 +08:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * @brief USB PHY status | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | typedef enum { | 
					
						
							|  |  |  |     USB_PHY_STATUS_FREE,             /**< PHY is not being used */ | 
					
						
							|  |  |  |     USB_PHY_STATUS_IN_USE,           /**< PHY is in use */ | 
					
						
							|  |  |  | } usb_phy_status_t; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /**
 | 
					
						
							|  |  |  |  * @brief USB PHY available actions | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | typedef enum { | 
					
						
							|  |  |  |     USB_PHY_ACTION_HOST_ALLOW_CONN,             /**< Enable physical connection when operating as an OTG Host */ | 
					
						
							|  |  |  |     USB_PHY_ACTION_HOST_FORCE_DISCONN,          /**< Disable physical connection when operating as an OTG Host */ | 
					
						
							|  |  |  |     USB_PHY_ACTION_MAX, | 
					
						
							|  |  |  | } usb_phy_action_t; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /**
 | 
					
						
							| 
									
										
										
										
											2022-10-06 09:04:53 +02:00
										 |  |  |  * @brief USB external PHY IO pins configuration structure | 
					
						
							| 
									
										
										
										
											2021-08-19 20:28:28 +08:00
										 |  |  |  */ | 
					
						
							|  |  |  | typedef struct { | 
					
						
							|  |  |  |     int vp_io_num;             /**< GPIO pin to USB_EXTPHY_VP_IDX */ | 
					
						
							|  |  |  |     int vm_io_num;             /**< GPIO pin to USB_EXTPHY_VM_IDX */ | 
					
						
							|  |  |  |     int rcv_io_num;            /**< GPIO pin to USB_EXTPHY_RCV_IDX */ | 
					
						
							|  |  |  |     int oen_io_num;            /**< GPIO pin to USB_EXTPHY_OEN_IDX */ | 
					
						
							|  |  |  |     int vpo_io_num;            /**< GPIO pin to USB_EXTPHY_VPO_IDX */ | 
					
						
							|  |  |  |     int vmo_io_num;            /**< GPIO pin to USB_EXTPHY_VMO_IDX */ | 
					
						
							| 
									
										
										
										
											2022-10-06 09:04:53 +02:00
										 |  |  | } usb_phy_ext_io_conf_t; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /**
 | 
					
						
							|  |  |  |  * @brief USB OTG IO pins configuration structure | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | typedef struct { | 
					
						
							|  |  |  |     int iddig_io_num;          /**< GPIO pin to USB_OTG_IDDIG_IN_IDX */ | 
					
						
							|  |  |  |     int avalid_io_num;         /**< GPIO pin to USB_OTG_AVALID_IN_IDX */ | 
					
						
							|  |  |  |     int vbusvalid_io_num;      /**< GPIO pin to USB_OTG_VBUSVALID_IN_IDX */ | 
					
						
							|  |  |  |     int idpullup_io_num;       /**< GPIO pin to USB_OTG_IDPULLUP_IDX */ | 
					
						
							|  |  |  |     int dppulldown_io_num;     /**< GPIO pin to USB_OTG_DPPULLDOWN_IDX */ | 
					
						
							|  |  |  |     int dmpulldown_io_num;     /**< GPIO pin to USB_OTG_DMPULLDOWN_IDX */ | 
					
						
							|  |  |  |     int drvvbus_io_num;        /**< GPIO pin to USB_OTG_DRVVBUS_IDX */ | 
					
						
							|  |  |  |     int bvalid_io_num;         /**< GPIO pin to USB_SRP_BVALID_IN_IDX */ | 
					
						
							|  |  |  |     int sessend_io_num;        /**< GPIO pin to USB_SRP_SESSEND_IN_IDX */ | 
					
						
							|  |  |  |     int chrgvbus_io_num;       /**< GPIO pin to USB_SRP_CHRGVBUS_IDX */ | 
					
						
							|  |  |  |     int dischrgvbus_io_num;    /**< GPIO pin to USB_SRP_DISCHRGVBUS_IDX */ | 
					
						
							|  |  |  | } usb_phy_otg_io_conf_t; | 
					
						
							| 
									
										
										
										
											2021-08-19 20:28:28 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | /**
 | 
					
						
							|  |  |  |  * @brief USB PHY configure struct | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * At minimum the PHY controller and PHY target must be initialized. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | typedef struct { | 
					
						
							| 
									
										
										
										
											2022-10-06 09:04:53 +02:00
										 |  |  |     usb_phy_controller_t controller;          /**< USB PHY controller */ | 
					
						
							|  |  |  |     usb_phy_target_t target;                  /**< USB PHY target INT/EXT */ | 
					
						
							|  |  |  |     usb_otg_mode_t otg_mode;                  /**< USB OTG mode */ | 
					
						
							|  |  |  |     usb_phy_speed_t otg_speed;                /**< USB OTG speed */ | 
					
						
							|  |  |  |     const usb_phy_ext_io_conf_t *ext_io_conf; /**< USB external PHY IO pins configuration */ | 
					
						
							|  |  |  |     const usb_phy_otg_io_conf_t *otg_io_conf; /**< USB OTG IO pins configuration */ | 
					
						
							| 
									
										
										
										
											2021-08-19 20:28:28 +08:00
										 |  |  | } usb_phy_config_t; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | typedef struct phy_context_t *usb_phy_handle_t;    /**< USB PHY context handle */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /**
 | 
					
						
							|  |  |  |  * @brief Initialize a new USB PHY | 
					
						
							|  |  |  |  *        Configure at least PHY source. | 
					
						
							| 
									
										
										
										
											2021-11-18 02:07:53 +08:00
										 |  |  |  * | 
					
						
							|  |  |  |  * This function will enable the OTG Controller | 
					
						
							| 
									
										
										
										
											2021-08-19 20:28:28 +08:00
										 |  |  |  * | 
					
						
							|  |  |  |  * @param[in] config USB PHY configurtion struct | 
					
						
							|  |  |  |  * @param[out] handle_ret USB PHY context handle | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * @return | 
					
						
							|  |  |  |  *     - ESP_OK Success | 
					
						
							|  |  |  |  *     - ESP_FAIL USB PHY init error. | 
					
						
							|  |  |  |  *     - ESP_ERR_INVALID_STATE USB PHY not installed. | 
					
						
							|  |  |  |  *     - ESP_ERR_NO_MEM USB_OTG installation failed due to no mem. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | esp_err_t usb_new_phy(const usb_phy_config_t *config, usb_phy_handle_t *handle_ret); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /**
 | 
					
						
							|  |  |  |  * @brief Configure OTG mode for a USB PHY | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * @param handle Pointer of USB PHY context handle | 
					
						
							|  |  |  |  * @param mode USB OTG mode | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * @return | 
					
						
							|  |  |  |  *     - ESP_OK Success | 
					
						
							|  |  |  |  *     - ESP_ERR_INVALID_ARG Parameter error. | 
					
						
							|  |  |  |  *     - ESP_FAIL OTG set mode fail. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | esp_err_t usb_phy_otg_set_mode(usb_phy_handle_t handle, usb_otg_mode_t mode); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /**
 | 
					
						
							|  |  |  |  * @brief Configure USB speed for a USB PHY that is operating as an OTG Device | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * @param handle Pointer of USB PHY context handle | 
					
						
							|  |  |  |  * @param mode USB speed | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * @return | 
					
						
							|  |  |  |  *     - ESP_OK Success | 
					
						
							|  |  |  |  *     - ESP_ERR_INVALID_ARG Parameter error. | 
					
						
							|  |  |  |  *     - ESP_FAIL OTG set speed fail. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | esp_err_t usb_phy_otg_dev_set_speed(usb_phy_handle_t handle, usb_phy_speed_t speed); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /**
 | 
					
						
							|  |  |  |  * @brief Take a action for a USB PHY | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * @param handle Pointer of USB PHY context handle | 
					
						
							|  |  |  |  * @param action USB PHY action | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * @return | 
					
						
							|  |  |  |  *     - ESP_OK Success | 
					
						
							|  |  |  |  *     - ESP_ERR_INVALID_ARG Parameter error. | 
					
						
							|  |  |  |  *     - ESP_FAIL Action cannot be performed. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | esp_err_t usb_phy_action(usb_phy_handle_t handle, usb_phy_action_t action); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /**
 | 
					
						
							|  |  |  |  * @brief Delete a USB PHY | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * @param handle Pointer of USB PHY context handle | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * @return | 
					
						
							|  |  |  |  *     - ESP_OK Success | 
					
						
							|  |  |  |  *     - ESP_ERR_INVALID_ARG Parameter error. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | esp_err_t usb_del_phy(usb_phy_handle_t handle); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /**
 | 
					
						
							|  |  |  |  * @brief Get status of a USB PHY | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * @param[in] target The specific PHY target to check | 
					
						
							|  |  |  |  * @param[out] status Status of the PHY | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * @return | 
					
						
							|  |  |  |  *     - ESP_OK Success | 
					
						
							|  |  |  |  *     - ESP_ERR_INVALID_ARG Parameter error. | 
					
						
							|  |  |  |  *     - ESP_ERR_INVALID_STATE USB PHY not installed. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | esp_err_t usb_phy_get_phy_status(usb_phy_target_t target, usb_phy_status_t *status); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifdef __cplusplus
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | #endif
 |