]> granicus.if.org Git - esp-idf/blob - components/ethernet/emac_dev.c
5a8b61cba0f803b11c210aa69f957484f5e778e3
[esp-idf] / components / ethernet / emac_dev.c
1 // Copyright 2015-2016 Espressif Systems (Shanghai) PTE LTD
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6
7 //     http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14
15 #include <stdio.h>
16 #include <string.h>
17
18 #include "rom/ets_sys.h"
19 #include "rom/gpio.h"
20
21 #include "soc/dport_reg.h"
22 #include "soc/io_mux_reg.h"
23 #include "soc/rtc_cntl_reg.h"
24 #include "soc/gpio_reg.h"
25 #include "soc/gpio_sig_map.h"
26 #include "soc/emac_reg_v2.h"
27 #include "soc/emac_ex_reg.h"
28
29 #include "esp_log.h"
30 #include "driver/gpio.h"
31 #include "sdkconfig.h"
32
33 #include "emac_common.h"
34
35 static const char *TAG = "emac";
36
37 void emac_enable_flowctrl(void)
38 {
39     REG_SET_BIT(EMAC_GMACFLOWCONTROL_REG, EMAC_TRANSMIT_FLOW_CONTROL_ENABLE);
40     REG_SET_BIT(EMAC_GMACFLOWCONTROL_REG, EMAC_RECEIVE_FLOW_CONTROL_ENABLE);
41     REG_CLR_BIT(EMAC_GMACFLOWCONTROL_REG, EMAC_DISABLE_ZERO_QUANTA_PAUSE);
42     REG_SET_FIELD(EMAC_GMACFLOWCONTROL_REG, EMAC_PAUSE_TIME, 0x1648);
43     REG_SET_FIELD(EMAC_GMACFLOWCONTROL_REG, EMAC_PAUSE_LOW_THRESHOLD, 0x1);
44 }
45
46 void emac_disable_flowctrl(void)
47 {
48     REG_CLR_BIT(EMAC_GMACFLOWCONTROL_REG, EMAC_TRANSMIT_FLOW_CONTROL_ENABLE);
49     REG_CLR_BIT(EMAC_GMACFLOWCONTROL_REG, EMAC_RECEIVE_FLOW_CONTROL_ENABLE);
50     REG_CLR_BIT(EMAC_GMACFLOWCONTROL_REG, EMAC_DISABLE_ZERO_QUANTA_PAUSE);
51     REG_SET_FIELD(EMAC_GMACFLOWCONTROL_REG, EMAC_PAUSE_TIME, 0);
52     REG_SET_FIELD(EMAC_GMACFLOWCONTROL_REG, EMAC_PAUSE_LOW_THRESHOLD, 0);
53 }
54
55 void emac_enable_dma_tx(void)
56 {
57     REG_SET_BIT(EMAC_DMAOPERATION_MODE_REG, EMAC_START_STOP_TRANSMISSION_COMMAND);
58 }
59
60 void emac_enable_dma_rx(void)
61 {
62     REG_SET_BIT(EMAC_DMAOPERATION_MODE_REG, EMAC_START_STOP_RECEIVE);
63 }
64
65 void emac_disable_dma_tx(void)
66 {
67     REG_CLR_BIT(EMAC_DMAOPERATION_MODE_REG, EMAC_OPERATE_SECOND_FRAME);
68 }
69
70 void emac_disable_dma_rx(void)
71 {
72     REG_CLR_BIT(EMAC_DMAOPERATION_MODE_REG, EMAC_START_STOP_RECEIVE);
73 }
74
75
76 uint32_t emac_read_mac_version(void)
77 {
78     uint32_t data = 0;
79     data = REG_READ(EMAC_GMACVERSION_REG);
80     return data;
81 }
82
83 void emac_reset(void)
84 {
85     REG_SET_BIT(EMAC_DMABUSMODE_REG, EMAC_SW_RST);
86
87     while (REG_GET_BIT(EMAC_DMABUSMODE_REG, EMAC_SW_RST) == 1) {
88         //nothing to do ,if stop here,maybe emac have not clk input.
89         ESP_LOGI(TAG, "emac resetting ....");
90     }
91
92     ESP_LOGI(TAG, "emac reset done");
93 }
94
95 void emac_enable_clk(bool enable)
96 {
97     if (enable == true) {
98         DPORT_REG_SET_BIT(EMAC_CLK_EN_REG, EMAC_CLK_EN);
99     } else {
100         DPORT_REG_CLR_BIT(EMAC_CLK_EN_REG, EMAC_CLK_EN);
101     }
102 }
103
104 void emac_dma_init(void)
105 {
106     REG_SET_BIT(EMAC_DMAOPERATION_MODE_REG, EMAC_FORWARD_UNDERSIZED_GOOD_FRAMES);
107     REG_SET_BIT(EMAC_DMAOPERATION_MODE_REG, EMAC_OPERATE_SECOND_FRAME);
108     REG_SET_FIELD(EMAC_DMABUSMODE_REG, EMAC_PROG_BURST_LEN, 4);
109     REG_SET_BIT(EMAC_DMAOPERATION_MODE_REG, EMAC_DMAOPERATION_MODE_REG);
110 }
111
112 void emac_mac_enable_txrx(void)
113 {
114     REG_SET_BIT(EMAC_GMACCONFIG_REG, EMAC_GMACRX);
115     REG_SET_BIT(EMAC_GMACCONFIG_REG, EMAC_GMACTX);
116 }
117
118 void emac_mac_init(void)
119 {
120     REG_SET_BIT(EMAC_GMACCONFIG_REG, EMAC_GMACDUPLEX);
121     REG_SET_BIT(EMAC_GMACCONFIG_REG, EMAC_GMACMIIGMII);
122     REG_CLR_BIT(EMAC_GMACCONFIG_REG, EMAC_GMACFESPEED);
123     REG_SET_BIT(EMAC_GMACFRAMEFILTER_REG, EMAC_PROMISCUOUS_MODE);
124 }