ethernet: add a gpio to enable/disable phy power

This commit is contained in:
shangke 2017-02-11 15:19:53 +08:00
parent 02460ff864
commit 9893b71096
4 changed files with 28 additions and 6 deletions

View File

@ -75,6 +75,7 @@ struct emac_config_data {
bool emac_flow_ctrl_enable; bool emac_flow_ctrl_enable;
bool emac_flow_ctrl_partner_support; bool emac_flow_ctrl_partner_support;
eth_phy_get_partner_pause_enable_func emac_phy_get_partner_pause_enable; eth_phy_get_partner_pause_enable_func emac_phy_get_partner_pause_enable;
eth_phy_power_enable_func emac_phy_power_enable;
}; };
enum emac_post_type { enum emac_post_type {

View File

@ -225,6 +225,7 @@ static void emac_set_user_config_data(eth_config_t *config )
emac_config.emac_flow_ctrl_enable = false; emac_config.emac_flow_ctrl_enable = false;
#endif #endif
emac_config.emac_phy_get_partner_pause_enable = config->phy_get_partner_pause_enable; emac_config.emac_phy_get_partner_pause_enable = config->phy_get_partner_pause_enable;
emac_config.emac_phy_power_enable = config->phy_power_enable;
} }
static void emac_enable_intr() static void emac_enable_intr()
@ -291,6 +292,11 @@ static esp_err_t emac_verify_args(void)
ret = ESP_FAIL; ret = ESP_FAIL;
} }
if(emac_config.emac_phy_power_enable == NULL) {
ESP_LOGE(TAG, "phy power enable func is null");
ret = ESP_FAIL;
}
return ret; return ret;
} }
@ -943,6 +949,8 @@ esp_err_t esp_eth_init(eth_config_t *config)
emac_set_user_config_data(config); emac_set_user_config_data(config);
} }
emac_config.emac_phy_power_enable(true);
ret = emac_verify_args(); ret = emac_verify_args();
if (ret != ESP_OK) { if (ret != ESP_OK) {

View File

@ -80,7 +80,7 @@ typedef void (*eth_phy_func)(void);
typedef esp_err_t (*eth_tcpip_input_func)(void *buffer, uint16_t len, void *eb); typedef esp_err_t (*eth_tcpip_input_func)(void *buffer, uint16_t len, void *eb);
typedef void (*eth_gpio_config_func)(void); typedef void (*eth_gpio_config_func)(void);
typedef bool (*eth_phy_get_partner_pause_enable_func)(void); typedef bool (*eth_phy_get_partner_pause_enable_func)(void);
typedef void (*eth_phy_power_enable_func)(bool enable);
/** /**
* @brief ethernet configuration * @brief ethernet configuration
@ -98,6 +98,7 @@ typedef struct {
eth_gpio_config_func gpio_config; /*!< gpio config func */ eth_gpio_config_func gpio_config; /*!< gpio config func */
bool flow_ctrl_enable; /*!< flag of flow ctrl enable */ bool flow_ctrl_enable; /*!< flag of flow ctrl enable */
eth_phy_get_partner_pause_enable_func phy_get_partner_pause_enable; /*!< get partner pause enable */ eth_phy_get_partner_pause_enable_func phy_get_partner_pause_enable; /*!< get partner pause enable */
eth_phy_power_enable_func phy_power_enable;
} eth_config_t; } eth_config_t;

View File

@ -87,6 +87,17 @@ void phy_enable_flow_ctrl(void)
esp_eth_smi_write(AUTO_NEG_ADVERTISEMENT_REG,data|ASM_DIR|PAUSE); esp_eth_smi_write(AUTO_NEG_ADVERTISEMENT_REG,data|ASM_DIR|PAUSE);
} }
void phy_tlk110_power_enable(bool enable)
{
PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO17_U, FUNC_GPIO17_GPIO17);
gpio_set_direction(17,GPIO_MODE_OUTPUT);
if(enable == true) {
gpio_set_level(17, 1);
} else {
gpio_set_level(17, 0);
}
}
void phy_tlk110_init(void) void phy_tlk110_init(void)
{ {
esp_eth_smi_write(PHY_RESET_CONTROL_REG, SOFTWARE_RESET); esp_eth_smi_write(PHY_RESET_CONTROL_REG, SOFTWARE_RESET);
@ -117,11 +128,11 @@ void eth_gpio_config_rmii(void)
//rmii clk ,can not change //rmii clk ,can not change
gpio_set_direction(0, GPIO_MODE_INPUT); gpio_set_direction(0, GPIO_MODE_INPUT);
//mdc to gpio4 //mdc to gpio23
gpio_matrix_out(4, EMAC_MDC_O_IDX, 0, 0); gpio_matrix_out(23, EMAC_MDC_O_IDX, 0, 0);
//mdio to gpio2 //mdio to gpio18
gpio_matrix_out(2, EMAC_MDO_O_IDX, 0, 0); gpio_matrix_out(18, EMAC_MDO_O_IDX, 0, 0);
gpio_matrix_in(2, EMAC_MDI_I_IDX, 0); gpio_matrix_in(18, EMAC_MDI_I_IDX, 0);
} }
void eth_task(void *pvParameter) void eth_task(void *pvParameter)
@ -163,6 +174,7 @@ void app_main()
//Only FULLDUPLEX mode support flow ctrl now! //Only FULLDUPLEX mode support flow ctrl now!
config.flow_ctrl_enable = true; config.flow_ctrl_enable = true;
config.phy_get_partner_pause_enable = phy_tlk110_get_partner_pause_enable; config.phy_get_partner_pause_enable = phy_tlk110_get_partner_pause_enable;
config.phy_power_enable = phy_tlk110_power_enable;
ret = esp_eth_init(&config); ret = esp_eth_init(&config);