]> granicus.if.org Git - esp-idf/commitdiff
ethernet: add a gpio to enable/disable phy power
authorshangke <shangke@espressif.com>
Sat, 11 Feb 2017 07:19:53 +0000 (15:19 +0800)
committershangke <shangke@espressif.com>
Sat, 11 Feb 2017 07:19:53 +0000 (15:19 +0800)
components/ethernet/emac_common.h
components/ethernet/emac_main.c
components/ethernet/include/esp_eth.h
examples/ethernet/ethernet/main/ethernet_main.c

index 957337d2a7808ed96e472cc22c99e2f4544a9e65..d68c20a05645cc9ad9a04503353ffbd1f08fe7cd 100644 (file)
@@ -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 {
index fd0f59604f637eaaa474529803bb6278fc9cc37a..5479ec399e0c8efa6ac7c1d45e8b435de731e63b 100644 (file)
@@ -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) {
index e36c3ebfe6a68d9c70804002cc128ff09c058695..2fea05c923cc29f5b951f811f550d8bdbd1297b7 100644 (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 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;
 
index 57c6f9735799550d558f62ef6b32fbf26b9d7c95..8cb9ca5e52b10acf42135e2ac941de31ad8b3be5 100644 (file)
@@ -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);