From 9893b71096a2d2e0ee2e377128cd775226741170 Mon Sep 17 00:00:00 2001 From: shangke Date: Sat, 11 Feb 2017 15:19:53 +0800 Subject: [PATCH] ethernet: add a gpio to enable/disable phy power --- components/ethernet/emac_common.h | 1 + components/ethernet/emac_main.c | 8 +++++++ components/ethernet/include/esp_eth.h | 3 ++- .../ethernet/ethernet/main/ethernet_main.c | 22 ++++++++++++++----- 4 files changed, 28 insertions(+), 6 deletions(-) diff --git a/components/ethernet/emac_common.h b/components/ethernet/emac_common.h index 957337d2a7..d68c20a056 100644 --- a/components/ethernet/emac_common.h +++ b/components/ethernet/emac_common.h @@ -75,6 +75,7 @@ struct emac_config_data { bool emac_flow_ctrl_enable; bool emac_flow_ctrl_partner_support; 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 { diff --git a/components/ethernet/emac_main.c b/components/ethernet/emac_main.c index fd0f59604f..5479ec399e 100644 --- a/components/ethernet/emac_main.c +++ b/components/ethernet/emac_main.c @@ -225,6 +225,7 @@ static void emac_set_user_config_data(eth_config_t *config ) emac_config.emac_flow_ctrl_enable = false; #endif 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() @@ -291,6 +292,11 @@ static esp_err_t emac_verify_args(void) 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; } @@ -943,6 +949,8 @@ esp_err_t esp_eth_init(eth_config_t *config) emac_set_user_config_data(config); } + emac_config.emac_phy_power_enable(true); + ret = emac_verify_args(); if (ret != ESP_OK) { diff --git a/components/ethernet/include/esp_eth.h b/components/ethernet/include/esp_eth.h index e36c3ebfe6..2fea05c923 100644 --- a/components/ethernet/include/esp_eth.h +++ b/components/ethernet/include/esp_eth.h @@ -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 void (*eth_gpio_config_func)(void); typedef bool (*eth_phy_get_partner_pause_enable_func)(void); - +typedef void (*eth_phy_power_enable_func)(bool enable); /** * @brief ethernet configuration @@ -98,6 +98,7 @@ typedef struct { eth_gpio_config_func gpio_config; /*!< gpio config func */ 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_power_enable_func phy_power_enable; } eth_config_t; diff --git a/examples/ethernet/ethernet/main/ethernet_main.c b/examples/ethernet/ethernet/main/ethernet_main.c index 57c6f97357..8cb9ca5e52 100644 --- a/examples/ethernet/ethernet/main/ethernet_main.c +++ b/examples/ethernet/ethernet/main/ethernet_main.c @@ -87,6 +87,17 @@ void phy_enable_flow_ctrl(void) 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) { 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 gpio_set_direction(0, GPIO_MODE_INPUT); - //mdc to gpio4 - gpio_matrix_out(4, EMAC_MDC_O_IDX, 0, 0); - //mdio to gpio2 - gpio_matrix_out(2, EMAC_MDO_O_IDX, 0, 0); - gpio_matrix_in(2, EMAC_MDI_I_IDX, 0); + //mdc to gpio23 + gpio_matrix_out(23, EMAC_MDC_O_IDX, 0, 0); + //mdio to gpio18 + gpio_matrix_out(18, EMAC_MDO_O_IDX, 0, 0); + gpio_matrix_in(18, EMAC_MDI_I_IDX, 0); } void eth_task(void *pvParameter) @@ -163,6 +174,7 @@ void app_main() //Only FULLDUPLEX mode support flow ctrl now! config.flow_ctrl_enable = true; 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);