]> granicus.if.org Git - esp-idf/commitdiff
emac:add set_eth_mac api
authorshangke <shangke@espressif.com>
Mon, 27 Nov 2017 07:58:35 +0000 (15:58 +0800)
committershangke <shangke@espressif.com>
Fri, 15 Dec 2017 09:15:53 +0000 (17:15 +0800)
components/ethernet/emac_main.c
components/ethernet/include/esp_eth.h

index c58c1315400ef15e88c0e142d69e42889ad093f7..b8c94b0fade3105d7378e9962575787d2ceae977 100644 (file)
@@ -90,6 +90,16 @@ void esp_eth_get_mac(uint8_t mac[6])
     memcpy(mac, &(emac_config.macaddr[0]), 6);
 }
 
+esp_err_t esp_eth_set_mac(const uint8_t mac[6])
+{
+    if((mac[0] & 0x01) == 0) {
+        memcpy(&(emac_config.macaddr[0]),mac, 6);
+        return ESP_OK;
+    } else {
+        return ESP_ERR_INVALID_MAC;
+    }
+}
+
 static void emac_setup_tx_desc(struct dma_extended_desc *tx_desc , uint32_t size)
 {
     tx_desc->basic.desc1 = size & 0xfff;
@@ -350,16 +360,6 @@ static esp_err_t emac_verify_args(void)
     return ret;
 }
 
-//TODO for mac filter
-void emac_set_mac_addr(void)
-{
-}
-
-//TODO
-void emac_check_mac_addr(void)
-{
-}
-
 static void emac_process_tx(void)
 {
     uint32_t cur_tx_desc = emac_read_tx_cur_reg();
@@ -414,7 +414,7 @@ static uint32_t IRAM_ATTR emac_get_rxbuf_count_in_intr(void)
     uint32_t cur_rx_desc = emac_read_rx_cur_reg();
     struct dma_extended_desc *cur_desc = (struct dma_extended_desc *)cur_rx_desc;
 
-    while (cur_desc->basic.desc0 == EMAC_DESC_RX_OWN) {
+    while (cur_desc->basic.desc0 == EMAC_DESC_RX_OWN && cnt < DMA_RX_BUF_NUM) {
         cnt++;
         cur_desc = (struct dma_extended_desc *)cur_desc->basic.desc3;
     }
@@ -769,11 +769,7 @@ static void emac_start(void *param)
     emac_enable_clk(true);
 
     emac_reset();
-    emac_macaddr_init();
-
-    emac_check_mac_addr();
 
-    emac_set_mac_addr();
     emac_set_macaddr_reg();
 
     emac_set_tx_base_reg();
@@ -1097,6 +1093,7 @@ esp_err_t esp_eth_init_internal(eth_config_t *config)
 
     ESP_LOGI(TAG, "mac version %04xa", emac_read_mac_version());
     emac_hw_init();
+    emac_macaddr_init();
 
     //watchdog  TODO
 
index 0a9f3e770fbb827837be00a8875a979fe8b0aff5..f4622d0ee7bafad4a9b3a2e732680f3ce3de6d62 100644 (file)
@@ -250,6 +250,27 @@ static inline esp_err_t esp_eth_smi_wait_set(uint32_t reg_num, uint16_t value_ma
  */
 void esp_eth_free_rx_buf(void *buf);
 
+/**
+ * @brief  Get mac of ethernet interface.
+ *
+ * @param[out] mac: store mac of the interface.
+ *
+ */
+void esp_eth_get_mac(uint8_t mac[6]);
+
+/**
+ * @brief  Set mac of ethernet interface.
+ *
+ * @note user can call this function after emac_init,and the new mac address will be enabled after emac_enable.
+ *
+ * @param[in] mac: the Mac address.
+ *
+ * @return 
+ *    - ESP_OK: succeed
+ *    - ESP_ERR_INVALID_MAC: invalid mac address
+ */
+esp_err_t esp_eth_set_mac(const uint8_t mac[6]);
+
 #ifdef __cplusplus
 }
 #endif