m5531_eth_driver.h
Go to the documentation of this file.
1 /**
2  * @file m5531_eth_driver.h
3  * @brief Nuvoton M5531 Ethernet MAC driver
4  *
5  * @section License
6  *
7  * SPDX-License-Identifier: GPL-2.0-or-later
8  *
9  * Copyright (C) 2010-2026 Oryx Embedded SARL. All rights reserved.
10  *
11  * This file is part of CycloneTCP Open.
12  *
13  * This program is free software; you can redistribute it and/or
14  * modify it under the terms of the GNU General Public License
15  * as published by the Free Software Foundation; either version 2
16  * of the License, or (at your option) any later version.
17  *
18  * This program is distributed in the hope that it will be useful,
19  * but WITHOUT ANY WARRANTY; without even the implied warranty of
20  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21  * GNU General Public License for more details.
22  *
23  * You should have received a copy of the GNU General Public License
24  * along with this program; if not, write to the Free Software Foundation,
25  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
26  *
27  * @author Oryx Embedded SARL (www.oryx-embedded.com)
28  * @version 2.6.4
29  **/
30 
31 #ifndef _M5531_ETH_DRIVER_H
32 #define _M5531_ETH_DRIVER_H
33 
34 //Dependencies
35 #include "core/nic.h"
36 
37 //Number of TX buffers
38 #ifndef M5531_ETH_TX_BUFFER_COUNT
39  #define M5531_ETH_TX_BUFFER_COUNT 8
40 #elif (M5531_ETH_TX_BUFFER_COUNT < 1)
41  #error M5531_ETH_TX_BUFFER_COUNT parameter is not valid
42 #endif
43 
44 //TX buffer size
45 #ifndef M5531_ETH_TX_BUFFER_SIZE
46  #define M5531_ETH_TX_BUFFER_SIZE 1536
47 #elif (M5531_ETH_TX_BUFFER_SIZE != 1536)
48  #error M5531_ETH_TX_BUFFER_SIZE parameter is not valid
49 #endif
50 
51 //Number of RX buffers
52 #ifndef M5531_ETH_RX_BUFFER_COUNT
53  #define M5531_ETH_RX_BUFFER_COUNT 8
54 #elif (M5531_ETH_RX_BUFFER_COUNT < 1)
55  #error M5531_ETH_RX_BUFFER_COUNT parameter is not valid
56 #endif
57 
58 //RX buffer size
59 #ifndef M5531_ETH_RX_BUFFER_SIZE
60  #define M5531_ETH_RX_BUFFER_SIZE 1536
61 #elif (M5531_ETH_RX_BUFFER_SIZE != 1536)
62  #error M5531_ETH_RX_BUFFER_SIZE parameter is not valid
63 #endif
64 
65 //Interrupt priority grouping
66 #ifndef M5531_ETH_IRQ_PRIORITY_GROUPING
67  #define M5531_ETH_IRQ_PRIORITY_GROUPING 4
68 #elif (M5531_ETH_IRQ_PRIORITY_GROUPING < 0)
69  #error M5531_ETH_IRQ_PRIORITY_GROUPING parameter is not valid
70 #endif
71 
72 //Ethernet interrupt group priority
73 #ifndef M5531_ETH_IRQ_GROUP_PRIORITY
74  #define M5531_ETH_IRQ_GROUP_PRIORITY 6
75 #elif (M5531_ETH_IRQ_GROUP_PRIORITY < 0)
76  #error M5531_ETH_IRQ_GROUP_PRIORITY parameter is not valid
77 #endif
78 
79 //Ethernet interrupt subpriority
80 #ifndef M5531_ETH_IRQ_SUB_PRIORITY
81  #define M5531_ETH_IRQ_SUB_PRIORITY 0
82 #elif (M5531_ETH_IRQ_SUB_PRIORITY < 0)
83  #error M5531_ETH_IRQ_SUB_PRIORITY parameter is not valid
84 #endif
85 
86 //Name of the section where to place DMA buffers
87 #ifndef M5531_ETH_RAM_SECTION
88  #define M5531_ETH_RAM_SECTION ".bss.NonCacheable.ZeroInit"
89 #endif
90 
91 //EMAC registers
92 #define EMAC_MAC_CONFIG *((volatile uint32_t *) (EMAC0_BASE + 0x0000))
93 #define EMAC_MAC_FRAME_FILTER *((volatile uint32_t *) (EMAC0_BASE + 0x0004))
94 #define EMAC_GMII_ADDR *((volatile uint32_t *) (EMAC0_BASE + 0x0010))
95 #define EMAC_GMII_DATA *((volatile uint32_t *) (EMAC0_BASE + 0x0014))
96 #define EMAC_FLOW_CONTROL *((volatile uint32_t *) (EMAC0_BASE + 0x0018))
97 #define EMAC_VLAN_TAG *((volatile uint32_t *) (EMAC0_BASE + 0x001C))
98 #define EMAC_VERSION *((volatile uint32_t *) (EMAC0_BASE + 0x0020))
99 #define EMAC_DEBUG *((volatile uint32_t *) (EMAC0_BASE + 0x0024))
100 #define EMAC_PMT_CONTROL_STATUS *((volatile uint32_t *) (EMAC0_BASE + 0x002C))
101 #define EMAC_INTERRUPT_STATUS *((volatile uint32_t *) (EMAC0_BASE + 0x0038))
102 #define EMAC_INTERRUPT_MASK *((volatile uint32_t *) (EMAC0_BASE + 0x003C))
103 #define EMAC_MAC_ADDR0_HIGH *((volatile uint32_t *) (EMAC0_BASE + 0x0040))
104 #define EMAC_MAC_ADDR0_LOW *((volatile uint32_t *) (EMAC0_BASE + 0x0044))
105 #define EMAC_MAC_ADDR1_HIGH *((volatile uint32_t *) (EMAC0_BASE + 0x0048))
106 #define EMAC_MAC_ADDR1_LOW *((volatile uint32_t *) (EMAC0_BASE + 0x004C))
107 #define EMAC_MAC_ADDR2_HIGH *((volatile uint32_t *) (EMAC0_BASE + 0x0050))
108 #define EMAC_MAC_ADDR2_LOW *((volatile uint32_t *) (EMAC0_BASE + 0x0054))
109 #define EMAC_MAC_ADDR3_HIGH *((volatile uint32_t *) (EMAC0_BASE + 0x0058))
110 #define EMAC_MAC_ADDR3_LOW *((volatile uint32_t *) (EMAC0_BASE + 0x005C))
111 #define EMAC_MAC_ADDR4_HIGH *((volatile uint32_t *) (EMAC0_BASE + 0x0060))
112 #define EMAC_MAC_ADDR4_LOW *((volatile uint32_t *) (EMAC0_BASE + 0x0064))
113 #define EMAC_MAC_ADDR5_HIGH *((volatile uint32_t *) (EMAC0_BASE + 0x0068))
114 #define EMAC_MAC_ADDR5_LOW *((volatile uint32_t *) (EMAC0_BASE + 0x006C))
115 #define EMAC_MAC_ADDR6_HIGH *((volatile uint32_t *) (EMAC0_BASE + 0x0070))
116 #define EMAC_MAC_ADDR6_LOW *((volatile uint32_t *) (EMAC0_BASE + 0x0074))
117 #define EMAC_MAC_ADDR7_HIGH *((volatile uint32_t *) (EMAC0_BASE + 0x0078))
118 #define EMAC_MAC_ADDR7_LOW *((volatile uint32_t *) (EMAC0_BASE + 0x007C))
119 #define EMAC_MAC_ADDR8_HIGH *((volatile uint32_t *) (EMAC0_BASE + 0x0080))
120 #define EMAC_MAC_ADDR8_LOW *((volatile uint32_t *) (EMAC0_BASE + 0x0084))
121 #define EMAC_WDOG_TIMEOUT *((volatile uint32_t *) (EMAC0_BASE + 0x00DC))
122 #define EMAC_VLAN_INCL_REG *((volatile uint32_t *) (EMAC0_BASE + 0x0584))
123 #define EMAC_TIMESTAMP_CONTROL *((volatile uint32_t *) (EMAC0_BASE + 0x0700))
124 #define EMAC_SUB_SECOND_INCREMENT *((volatile uint32_t *) (EMAC0_BASE + 0x0704))
125 #define EMAC_SYSTEM_TIME_SECONDS *((volatile uint32_t *) (EMAC0_BASE + 0x0708))
126 #define EMAC_SYSTEM_TIME_NANOSECONDS *((volatile uint32_t *) (EMAC0_BASE + 0x070C))
127 #define EMAC_SYSTEM_TIME_SECONDS_UPDATE *((volatile uint32_t *) (EMAC0_BASE + 0x0710))
128 #define EMAC_SYSTEM_TIME_NANOSECONDS_UPDATE *((volatile uint32_t *) (EMAC0_BASE + 0x0714))
129 #define EMAC_TIMESTAMP_ADDEND *((volatile uint32_t *) (EMAC0_BASE + 0x0718))
130 #define EMAC_TARGET_TIME_SECONDS *((volatile uint32_t *) (EMAC0_BASE + 0x071C))
131 #define EMAC_TARGET_TIME_NANOSECONDS *((volatile uint32_t *) (EMAC0_BASE + 0x0720))
132 #define EMAC_SYSTEM_TIME_HIGHER_WORD_SECONDS *((volatile uint32_t *) (EMAC0_BASE + 0x0724))
133 #define EMAC_TIMESTAMP_STATUS *((volatile uint32_t *) (EMAC0_BASE + 0x0728))
134 #define EMAC_PPS_CONTROL *((volatile uint32_t *) (EMAC0_BASE + 0x072C))
135 #define EMAC_PPS0_INTERVAL *((volatile uint32_t *) (EMAC0_BASE + 0x0760))
136 #define EMAC_PPS0_WIDTH *((volatile uint32_t *) (EMAC0_BASE + 0x0764))
137 #define EMAC_BUS_MODE *((volatile uint32_t *) (EMAC0_BASE + 0x1000))
138 #define EMAC_TRANSMIT_POLL_DEMAND *((volatile uint32_t *) (EMAC0_BASE + 0x1004))
139 #define EMAC_RECEIVE_POLL_DEMAND *((volatile uint32_t *) (EMAC0_BASE + 0x1008))
140 #define EMAC_RECEIVE_DESCRIPTOR_LIST_ADDR *((volatile uint32_t *) (EMAC0_BASE + 0x100C))
141 #define EMAC_TRANSMIT_DESCRIPTOR_LIST_ADDR *((volatile uint32_t *) (EMAC0_BASE + 0x1010))
142 #define EMAC_STATUS *((volatile uint32_t *) (EMAC0_BASE + 0x1014))
143 #define EMAC_OPERATION_MODE *((volatile uint32_t *) (EMAC0_BASE + 0x1018))
144 #define EMAC_INTERRUPT_ENABLE *((volatile uint32_t *) (EMAC0_BASE + 0x101C))
145 #define EMAC_MISSED_FRAME_AND_BUFFER_OVERFLOW_CNT *((volatile uint32_t *) (EMAC0_BASE + 0x1020))
146 #define EMAC_RECEIVE_INTERRUPT_WATCHDOG_TIMER *((volatile uint32_t *) (EMAC0_BASE + 0x1024))
147 #define EMAC_AHB_STATUS *((volatile uint32_t *) (EMAC0_BASE + 0x102C))
148 #define EMAC_CURRENT_HOST_TRANSMIT_DESCRIPTOR *((volatile uint32_t *) (EMAC0_BASE + 0x1048))
149 #define EMAC_CURRENT_HOST_RECEIVE_DESCRIPTOR *((volatile uint32_t *) (EMAC0_BASE + 0x104C))
150 #define EMAC_CURRENT_HOST_TRANSMIT_BUFFER_ADDR *((volatile uint32_t *) (EMAC0_BASE + 0x1050))
151 #define EMAC_CURRENT_HOST_RECEIVE_BUFFER_ADDR *((volatile uint32_t *) (EMAC0_BASE + 0x1054))
152 #define EMAC_HW_FEATURE *((volatile uint32_t *) (EMAC0_BASE + 0x1058))
153 
154 //MAC Configuration register
155 #define EMAC_MAC_CONFIG_SARC 0x70000000
156 #define EMAC_MAC_CONFIG_TWOKPE 0x08000000
157 #define EMAC_MAC_CONFIG_CST 0x02000000
158 #define EMAC_MAC_CONFIG_WD 0x00800000
159 #define EMAC_MAC_CONFIG_JD 0x00400000
160 #define EMAC_MAC_CONFIG_JE 0x00100000
161 #define EMAC_MAC_CONFIG_IFG 0x000E0000
162 #define EMAC_MAC_CONFIG_DCRS 0x00010000
163 #define EMAC_MAC_CONFIG_RESERVED15 0x00008000
164 #define EMAC_MAC_CONFIG_FES 0x00004000
165 #define EMAC_MAC_CONFIG_DO 0x00002000
166 #define EMAC_MAC_CONFIG_LM 0x00001000
167 #define EMAC_MAC_CONFIG_DM 0x00000800
168 #define EMAC_MAC_CONFIG_IPC 0x00000400
169 #define EMAC_MAC_CONFIG_DR 0x00000200
170 #define EMAC_MAC_CONFIG_ACS 0x00000080
171 #define EMAC_MAC_CONFIG_BL 0x00000060
172 #define EMAC_MAC_CONFIG_DC 0x00000010
173 #define EMAC_MAC_CONFIG_TE 0x00000008
174 #define EMAC_MAC_CONFIG_RE 0x00000004
175 #define EMAC_MAC_CONFIG_PRELEN 0x00000003
176 
177 //MAC Frame Filter register
178 #define EMAC_MAC_FRAME_FILTER_RA 0x80000000
179 #define EMAC_MAC_FRAME_FILTER_VTFE 0x00010000
180 #define EMAC_MAC_FRAME_FILTER_SAF 0x00000200
181 #define EMAC_MAC_FRAME_FILTER_SAIF 0x00000100
182 #define EMAC_MAC_FRAME_FILTER_PCF 0x000000C0
183 #define EMAC_MAC_FRAME_FILTER_DBF 0x00000020
184 #define EMAC_MAC_FRAME_FILTER_PM 0x00000010
185 #define EMAC_MAC_FRAME_FILTER_DAIF 0x00000008
186 #define EMAC_MAC_FRAME_FILTER_PR 0x00000001
187 
188 //GMII Address register
189 #define EMAC_GMII_ADDR_PA 0x0000F800
190 #define EMAC_GMII_ADDR_GR 0x000007C0
191 #define EMAC_GMII_ADDR_CR 0x0000003C
192 #define EMAC_GMII_ADDR_CR_DIV_42 0x00000000
193 #define EMAC_GMII_ADDR_CR_DIV_62 0x00000004
194 #define EMAC_GMII_ADDR_CR_DIV_16 0x00000008
195 #define EMAC_GMII_ADDR_CR_DIV_26 0x0000000C
196 #define EMAC_GMII_ADDR_CR_DIV_102 0x00000010
197 #define EMAC_GMII_ADDR_CR_DIV_124 0x00000014
198 #define EMAC_GMII_ADDR_GW 0x00000002
199 #define EMAC_GMII_ADDR_GB 0x00000001
200 
201 //GMII Data register
202 #define EMAC_GMII_DATA_GD 0x0000FFFF
203 
204 //Flow Control register
205 #define EMAC_FLOW_CONTROL_PT 0xFFFF0000
206 #define EMAC_FLOW_CONTROL_DZQP 0x00000080
207 #define EMAC_FLOW_CONTROL_PLT 0x00000030
208 #define EMAC_FLOW_CONTROL_UP 0x00000008
209 #define EMAC_FLOW_CONTROL_RFE 0x00000004
210 #define EMAC_FLOW_CONTROL_TFE 0x00000002
211 #define EMAC_FLOW_CONTROL_FCA_BPA 0x00000001
212 
213 //VLAN Tag register
214 #define EMAC_VLAN_TAG_ESVL 0x00040000
215 #define EMAC_VLAN_TAG_VTIM 0x00020000
216 #define EMAC_VLAN_TAG_ETV 0x00010000
217 #define EMAC_VLAN_TAG_VL 0x0000FFFF
218 
219 //Debug register
220 #define EMAC_DEBUG_TXSTSFSTS 0x02000000
221 #define EMAC_DEBUG_TXFSTS 0x01000000
222 #define EMAC_DEBUG_TWCSTS 0x00400000
223 #define EMAC_DEBUG_TRCSTS 0x00300000
224 #define EMAC_DEBUG_TXPAUSED 0x00080000
225 #define EMAC_DEBUG_TFCSTS 0x00060000
226 #define EMAC_DEBUG_TPESTS 0x00010000
227 #define EMAC_DEBUG_RXFSTS 0x00000300
228 #define EMAC_DEBUG_RRCSTS 0x00000060
229 #define EMAC_DEBUG_RWCSTS 0x00000010
230 #define EMAC_DEBUG_RFCFCSTS 0x00000006
231 #define EMAC_DEBUG_RPESTS 0x00000001
232 
233 //PMT Control and Status register
234 #define EMAC_PMT_CONTROL_STATUS_MGKPRCVD 0x00000020
235 #define EMAC_PMT_CONTROL_STATUS_MGKPKTEN 0x00000002
236 #define EMAC_PMT_CONTROL_STATUS_PWRDWN 0x00000001
237 
238 //Interrupt register
239 #define EMAC_INTERRUPT_STATUS_TSIS 0x00000200
240 #define EMAC_INTERRUPT_STATUS_PMTIS 0x00000008
241 
242 //Interrupt Mask register
243 #define EMAC_INTERRUPT_MASK_TSIM 0x00000200
244 #define EMAC_INTERRUPT_MASK_PMTIM 0x00000008
245 
246 //MAC Address0 High register
247 #define EMAC_MAC_ADDR0_HIGH_AE 0x80000000
248 #define EMAC_MAC_ADDR0_HIGH_ADDRHI 0x0000FFFF
249 
250 //MAC Address0 Low register
251 #define EMAC_MAC_ADDR0_LOW_ADDRLO 0xFFFFFFFF
252 
253 //MAC Address1 High register
254 #define EMAC_MAC_ADDR1_HIGH_AE 0x80000000
255 #define EMAC_MAC_ADDR1_HIGH_SA 0x40000000
256 #define EMAC_MAC_ADDR1_HIGH_MBC 0x3F000000
257 #define EMAC_MAC_ADDR1_HIGH_ADDRHI 0x0000FFFF
258 
259 //MAC Address1 Low register
260 #define EMAC_MAC_ADDR1_LOW_ADDRLO 0xFFFFFFFF
261 
262 //MAC Address2 High register
263 #define EMAC_MAC_ADDR2_HIGH_AE 0x80000000
264 #define EMAC_MAC_ADDR2_HIGH_SA 0x40000000
265 #define EMAC_MAC_ADDR2_HIGH_MBC 0x3F000000
266 #define EMAC_MAC_ADDR2_HIGH_ADDRHI 0x0000FFFF
267 
268 //MAC Address2 Low register
269 #define EMAC_MAC_ADDR2_LOW_ADDRLO 0xFFFFFFFF
270 
271 //MAC Address3 High register
272 #define EMAC_MAC_ADDR3_HIGH_AE 0x80000000
273 #define EMAC_MAC_ADDR3_HIGH_SA 0x40000000
274 #define EMAC_MAC_ADDR3_HIGH_MBC 0x3F000000
275 #define EMAC_MAC_ADDR3_HIGH_ADDRHI 0x0000FFFF
276 
277 //MAC Address3 Low register
278 #define EMAC_MAC_ADDR3_LOW_ADDRLO 0xFFFFFFFF
279 
280 //MAC Address4 High register
281 #define EMAC_MAC_ADDR4_HIGH_AE 0x80000000
282 #define EMAC_MAC_ADDR4_HIGH_SA 0x40000000
283 #define EMAC_MAC_ADDR4_HIGH_MBC 0x3F000000
284 #define EMAC_MAC_ADDR4_HIGH_ADDRHI 0x0000FFFF
285 
286 //MAC Address4 Low register
287 #define EMAC_MAC_ADDR4_LOW_ADDRLO 0xFFFFFFFF
288 
289 //MAC Address5 High register
290 #define EMAC_MAC_ADDR5_HIGH_AE 0x80000000
291 #define EMAC_MAC_ADDR5_HIGH_SA 0x40000000
292 #define EMAC_MAC_ADDR5_HIGH_MBC 0x3F000000
293 #define EMAC_MAC_ADDR5_HIGH_ADDRHI 0x0000FFFF
294 
295 //MAC Address5 Low register
296 #define EMAC_MAC_ADDR5_LOW_ADDRLO 0xFFFFFFFF
297 
298 //MAC Address6 High register
299 #define EMAC_MAC_ADDR6_HIGH_AE 0x80000000
300 #define EMAC_MAC_ADDR6_HIGH_SA 0x40000000
301 #define EMAC_MAC_ADDR6_HIGH_MBC 0x3F000000
302 #define EMAC_MAC_ADDR6_HIGH_ADDRHI 0x0000FFFF
303 
304 //MAC Address6 Low register
305 #define EMAC_MAC_ADDR6_LOW_ADDRLO 0xFFFFFFFF
306 
307 //MAC Address7 High register
308 #define EMAC_MAC_ADDR7_HIGH_AE 0x80000000
309 #define EMAC_MAC_ADDR7_HIGH_SA 0x40000000
310 #define EMAC_MAC_ADDR7_HIGH_MBC 0x3F000000
311 #define EMAC_MAC_ADDR7_HIGH_ADDRHI 0x0000FFFF
312 
313 //MAC Address7 Low register
314 #define EMAC_MAC_ADDR7_LOW_ADDRLO 0xFFFFFFFF
315 
316 //MAC Address8 High register
317 #define EMAC_MAC_ADDR8_HIGH_AE 0x80000000
318 #define EMAC_MAC_ADDR8_HIGH_SA 0x40000000
319 #define EMAC_MAC_ADDR8_HIGH_MBC 0x3F000000
320 #define EMAC_MAC_ADDR8_HIGH_ADDRHI 0x0000FFFF
321 
322 //MAC Address8 Low register
323 #define EMAC_MAC_ADDR8_LOW_ADDRLO 0xFFFFFFFF
324 
325 //Watchdog Timeout register
326 #define EMAC_WDOG_TIMEOUT_PWE 0x00010000
327 #define EMAC_WDOG_TIMEOUT_WTO 0x00003FFF
328 
329 //VLAN Tag Inclusion or Replacement register
330 #define EMAC_VLAN_INCL_REG_CSVL 0x00080000
331 #define EMAC_VLAN_INCL_REG_VLP 0x00040000
332 #define EMAC_VLAN_INCL_REG_VLC 0x00030000
333 #define EMAC_VLAN_INCL_REG_VLT 0x0000FFFF
334 
335 //Timestamp Control register
336 #define EMAC_TIMESTAMP_CONTROL_TSENMACADDR 0x00040000
337 #define EMAC_TIMESTAMP_CONTROL_SNAPTYPSEL 0x00030000
338 #define EMAC_TIMESTAMP_CONTROL_TSMSTRENA 0x00008000
339 #define EMAC_TIMESTAMP_CONTROL_TSEVNTENA 0x00004000
340 #define EMAC_TIMESTAMP_CONTROL_TSIPV4ENA 0x00002000
341 #define EMAC_TIMESTAMP_CONTROL_TSIPV6ENA 0x00001000
342 #define EMAC_TIMESTAMP_CONTROL_TSIPENA 0x00000800
343 #define EMAC_TIMESTAMP_CONTROL_TSVER2ENA 0x00000400
344 #define EMAC_TIMESTAMP_CONTROL_TSCTRLSSR 0x00000200
345 #define EMAC_TIMESTAMP_CONTROL_TSENALL 0x00000100
346 #define EMAC_TIMESTAMP_CONTROL_TSADDREG 0x00000020
347 #define EMAC_TIMESTAMP_CONTROL_TSTRIG 0x00000010
348 #define EMAC_TIMESTAMP_CONTROL_TSUPDT 0x00000008
349 #define EMAC_TIMESTAMP_CONTROL_TSINIT 0x00000004
350 #define EMAC_TIMESTAMP_CONTROL_TSCFUPDT 0x00000002
351 #define EMAC_TIMESTAMP_CONTROL_TSENA 0x00000001
352 
353 //Sub-Second Increment register
354 #define EMAC_SUB_SECOND_INCREMENT_SSINC 0x000000FF
355 
356 //System Time Seconds register
357 #define EMAC_SYSTEM_TIME_SECONDS_TSS 0xFFFFFFFF
358 
359 //System Time Nanoseconds register
360 #define EMAC_SYSTEM_TIME_NANOSECONDS_TSSS 0x7FFFFFFF
361 
362 //System Time Seconds Update register
363 #define EMAC_SYSTEM_TIME_SECONDS_UPDATE_TSS 0xFFFFFFFF
364 
365 //System Time Nanoseconds Update register
366 #define EMAC_SYSTEM_TIME_NANOSECONDS_UPDATE_ADDSUB 0x80000000
367 #define EMAC_SYSTEM_TIME_NANOSECONDS_UPDATE_TSSS 0x7FFFFFFF
368 
369 //Timestamp Addend register
370 #define EMAC_TIMESTAMP_ADDEND_TSAR 0xFFFFFFFF
371 
372 //Target Time Seconds register
373 #define EMAC_TARGET_TIME_SECONDS_TSTR 0xFFFFFFFF
374 
375 //Target Time Nanoseconds register
376 #define EMAC_TARGET_TIME_NANOSECONDS_TTSLO 0xFFFFFFFF
377 
378 //System Time Higher Word Seconds register
379 #define EMAC_SYSTEM_TIME_HIGHER_WORD_SECONDS_TSHWR 0x0000FFFF
380 
381 //Timestamp Status register
382 #define EMAC_TIMESTAMP_STATUS_ATSSTN 0x000F0000
383 #define EMAC_TIMESTAMP_STATUS_TSTRGTERR 0x00000008
384 #define EMAC_TIMESTAMP_STATUS_TSTARGT 0x00000002
385 #define EMAC_TIMESTAMP_STATUS_TSSOVF 0x00000001
386 
387 //PPS Control register
388 #define EMAC_PPS_CONTROL_TRGTMODSEL0 0x00000060
389 #define EMAC_PPS_CONTROL_PPSEN0 0x00000010
390 #define EMAC_PPS_CONTROL_PPSCTRL_PPSCMD 0x0000000F
391 
392 //PPS0 Interval register
393 #define EMAC_PPS0_INTERVAL_PPSINT 0xFFFFFFFF
394 
395 //PPS0 Width register
396 #define EMAC_PPS0_WIDTH_PPSWIDTH 0xFFFFFFFF
397 
398 //Bus Mode register
399 #define EMAC_BUS_MODE_AAB 0x02000000
400 #define EMAC_BUS_MODE_PBLX8 0x01000000
401 #define EMAC_BUS_MODE_USP 0x00800000
402 #define EMAC_BUS_MODE_RPBL 0x007E0000
403 #define EMAC_BUS_MODE_RPBL_1 0x00020000
404 #define EMAC_BUS_MODE_RPBL_2 0x00040000
405 #define EMAC_BUS_MODE_RPBL_4 0x00080000
406 #define EMAC_BUS_MODE_RPBL_8 0x00100000
407 #define EMAC_BUS_MODE_RPBL_16 0x00200000
408 #define EMAC_BUS_MODE_RPBL_32 0x00400000
409 #define EMAC_BUS_MODE_FB 0x00010000
410 #define EMAC_BUS_MODE_PBL 0x00003F00
411 #define EMAC_BUS_MODE_PBL_1 0x00000100
412 #define EMAC_BUS_MODE_PBL_2 0x00000200
413 #define EMAC_BUS_MODE_PBL_4 0x00000400
414 #define EMAC_BUS_MODE_PBL_8 0x00000800
415 #define EMAC_BUS_MODE_PBL_16 0x00001000
416 #define EMAC_BUS_MODE_PBL_32 0x00002000
417 #define EMAC_BUS_MODE_ATDS 0x00000080
418 #define EMAC_BUS_MODE_DSL 0x0000007C
419 #define EMAC_BUS_MODE_DSL_0 0x00000000
420 #define EMAC_BUS_MODE_DSL_1 0x00000004
421 #define EMAC_BUS_MODE_DSL_2 0x00000008
422 #define EMAC_BUS_MODE_DSL_4 0x00000010
423 #define EMAC_BUS_MODE_DSL_8 0x00000020
424 #define EMAC_BUS_MODE_DSL_16 0x00000040
425 #define EMAC_BUS_MODE_SWR 0x00000001
426 
427 //Transmit Poll Demand register
428 #define EMAC_TRANSMIT_POLL_DEMAND_TPD 0xFFFFFFFF
429 
430 //Receive Poll Demand register
431 #define EMAC_RECEIVE_POLL_DEMAND_RPD 0xFFFFFFFF
432 
433 //Receive Descriptor List Address register
434 #define EMAC_RECEIVE_DESCRIPTOR_LIST_ADDR_RDESLA 0xFFFFFFFF
435 
436 //Transmit Descriptor List Address register
437 #define EMAC_TRANSMIT_DESCRIPTOR_LIST_ADDR_TDESLA 0xFFFFFFFF
438 
439 //Status register
440 #define EMAC_STATUS_TTI 0x20000000
441 #define EMAC_STATUS_GPI 0x10000000
442 #define EMAC_STATUS_EB 0x03800000
443 #define EMAC_STATUS_TS 0x00700000
444 #define EMAC_STATUS_RS 0x000E0000
445 #define EMAC_STATUS_NIS 0x00010000
446 #define EMAC_STATUS_AIS 0x00008000
447 #define EMAC_STATUS_ERI 0x00004000
448 #define EMAC_STATUS_FBI 0x00002000
449 #define EMAC_STATUS_ETI 0x00000400
450 #define EMAC_STATUS_RWT 0x00000200
451 #define EMAC_STATUS_RPS 0x00000100
452 #define EMAC_STATUS_RU 0x00000080
453 #define EMAC_STATUS_RI 0x00000040
454 #define EMAC_STATUS_UNF 0x00000020
455 #define EMAC_STATUS_OVF 0x00000010
456 #define EMAC_STATUS_TJT 0x00000008
457 #define EMAC_STATUS_TU 0x00000004
458 #define EMAC_STATUS_TPS 0x00000002
459 #define EMAC_STATUS_TI 0x00000001
460 
461 //Operation Mode register
462 #define EMAC_OPERATION_MODE_DT 0x04000000
463 #define EMAC_OPERATION_MODE_RSF 0x02000000
464 #define EMAC_OPERATION_MODE_DFF 0x01000000
465 #define EMAC_OPERATION_MODE_TSF 0x00200000
466 #define EMAC_OPERATION_MODE_FTF 0x00100000
467 #define EMAC_OPERATION_MODE_TTC 0x0001C000
468 #define EMAC_OPERATION_MODE_ST 0x00002000
469 #define EMAC_OPERATION_MODE_RFD 0x00001800
470 #define EMAC_OPERATION_MODE_RFA 0x00000600
471 #define EMAC_OPERATION_MODE_EFC 0x00000100
472 #define EMAC_OPERATION_MODE_FEF 0x00000080
473 #define EMAC_OPERATION_MODE_FUF 0x00000040
474 #define EMAC_OPERATION_MODE_DGF 0x00000020
475 #define EMAC_OPERATION_MODE_RTC 0x00000018
476 #define EMAC_OPERATION_MODE_OSF 0x00000004
477 #define EMAC_OPERATION_MODE_SR 0x00000002
478 
479 //Interrupt Enable register
480 #define EMAC_INTERRUPT_ENABLE_NIE 0x00010000
481 #define EMAC_INTERRUPT_ENABLE_AIE 0x00008000
482 #define EMAC_INTERRUPT_ENABLE_ERE 0x00004000
483 #define EMAC_INTERRUPT_ENABLE_FBE 0x00002000
484 #define EMAC_INTERRUPT_ENABLE_ETE 0x00000400
485 #define EMAC_INTERRUPT_ENABLE_RWE 0x00000200
486 #define EMAC_INTERRUPT_ENABLE_RSE 0x00000100
487 #define EMAC_INTERRUPT_ENABLE_RUE 0x00000080
488 #define EMAC_INTERRUPT_ENABLE_RIE 0x00000040
489 #define EMAC_INTERRUPT_ENABLE_UNE 0x00000020
490 #define EMAC_INTERRUPT_ENABLE_OVE 0x00000010
491 #define EMAC_INTERRUPT_ENABLE_TJE 0x00000008
492 #define EMAC_INTERRUPT_ENABLE_TUE 0x00000004
493 #define EMAC_INTERRUPT_ENABLE_TSE 0x00000002
494 #define EMAC_INTERRUPT_ENABLE_TIE 0x00000001
495 
496 //Missed Frame and Buffer Overflow Counter register
497 #define EMAC_MISSED_FRAME_AND_BUFFER_OVERFLOW_CNT_OVFCNTOVF 0x10000000
498 #define EMAC_MISSED_FRAME_AND_BUFFER_OVERFLOW_CNT_OVFFRMCNT 0x0FFE0000
499 #define EMAC_MISSED_FRAME_AND_BUFFER_OVERFLOW_CNT_MISCNTOVF 0x00010000
500 #define EMAC_MISSED_FRAME_AND_BUFFER_OVERFLOW_CNT_MISFRMCNT 0x0000FFFF
501 
502 //Receive Interrupt Watchdog Timer register
503 #define EMAC_RECEIVE_INTERRUPT_WATCHDOG_TIMER_RIWT 0x000000FF
504 
505 //AHB Status register
506 #define EMAC_AHB_STATUS_AXIRDSTS 0x00000002
507 #define EMAC_AHB_STATUS_AXWHSTS 0x00000001
508 
509 //Current Host Transmit Descriptor register
510 #define EMAC_CURRENT_HOST_TRANSMIT_DESCRIPTOR_CURTDESAPTR 0xFFFFFFFF
511 
512 //Current Host Receive Descriptor register
513 #define EMAC_CURRENT_HOST_RECEIVE_DESCRIPTOR_CURRDESAPTR 0xFFFFFFFF
514 
515 //Current Host Transmit Buffer Address register
516 #define EMAC_CURRENT_HOST_TRANSMIT_BUFFER_ADDR_CURTBUFAPTR 0xFFFFFFFF
517 
518 //Current Host Receive Buffer Address register
519 #define EMAC_CURRENT_HOST_RECEIVE_BUFFER_ADDR_CURRBUFAPTR 0xFFFFFFFF
520 
521 //HW Feature register
522 #define EMAC_HW_FEATURE_ACTPHYIF 0x70000000
523 #define EMAC_HW_FEATURE_SAVLANINS 0x08000000
524 #define EMAC_HW_FEATURE_FLEXIPPSEN 0x04000000
525 #define EMAC_HW_FEATURE_INTTSEN 0x02000000
526 #define EMAC_HW_FEATURE_ENHDESSEL 0x01000000
527 #define EMAC_HW_FEATURE_TXCHCNT 0x00C00000
528 #define EMAC_HW_FEATURE_RXCHCNT 0x00300000
529 #define EMAC_HW_FEATURE_RXFIFOSIZE 0x00080000
530 #define EMAC_HW_FEATURE_RXTYP2COE 0x00040000
531 #define EMAC_HW_FEATURE_RXTYP1COE 0x00020000
532 #define EMAC_HW_FEATURE_TXCOESEL 0x00010000
533 #define EMAC_HW_FEATURE_EEESEL 0x00004000
534 #define EMAC_HW_FEATURE_TSVER2SEL 0x00002000
535 #define EMAC_HW_FEATURE_TSVER1SEL 0x00001000
536 #define EMAC_HW_FEATURE_MMCSEL 0x00000800
537 #define EMAC_HW_FEATURE_MGKSEL 0x00000400
538 #define EMAC_HW_FEATURE_RWKSEL 0x00000200
539 #define EMAC_HW_FEATURE_SMASEL 0x00000100
540 #define EMAC_HW_FEATURE_L3L4FLTREN 0x00000080
541 #define EMAC_HW_FEATURE_PCSSEL 0x00000040
542 #define EMAC_HW_FEATURE_ADDMACADRSEL 0x00000020
543 #define EMAC_HW_FEATURE_HASHSEL 0x00000010
544 #define EMAC_HW_FEATURE_EXTHASHEN 0x00000008
545 #define EMAC_HW_FEATURE_HDSEL 0x00000004
546 #define EMAC_HW_FEATURE_MIISEL 0x00000001
547 
548 //Transmit DMA descriptor flags
549 #define EMAC_TDES0_OWN 0x80000000
550 #define EMAC_TDES0_IC 0x40000000
551 #define EMAC_TDES0_LS 0x20000000
552 #define EMAC_TDES0_FS 0x10000000
553 #define EMAC_TDES0_DC 0x08000000
554 #define EMAC_TDES0_DP 0x04000000
555 #define EMAC_TDES0_TTSE 0x02000000
556 #define EMAC_TDES0_CRCR 0x01000000
557 #define EMAC_TDES0_CIC 0x00C00000
558 #define EMAC_TDES0_TER 0x00200000
559 #define EMAC_TDES0_TCH 0x00100000
560 #define EMAC_TDES0_VLIC 0x000C0000
561 #define EMAC_TDES0_TTSS 0x00020000
562 #define EMAC_TDES0_IHE 0x00010000
563 #define EMAC_TDES0_ES 0x00008000
564 #define EMAC_TDES0_JT 0x00004000
565 #define EMAC_TDES0_FF 0x00002000
566 #define EMAC_TDES0_IPE 0x00001000
567 #define EMAC_TDES0_LOC 0x00000800
568 #define EMAC_TDES0_NC 0x00000400
569 #define EMAC_TDES0_LC 0x00000200
570 #define EMAC_TDES0_EC 0x00000100
571 #define EMAC_TDES0_VF 0x00000080
572 #define EMAC_TDES0_CC 0x00000078
573 #define EMAC_TDES0_ED 0x00000004
574 #define EMAC_TDES0_UF 0x00000002
575 #define EMAC_TDES0_DB 0x00000001
576 #define EMAC_TDES1_SAIC 0xE0000000
577 #define EMAC_TDES1_TBS2 0x1FFF0000
578 #define EMAC_TDES1_TBS1 0x00001FFF
579 #define EMAC_TDES2_TBAP1 0xFFFFFFFF
580 #define EMAC_TDES3_TBAP2 0xFFFFFFFF
581 #define EMAC_TDES6_TTSL 0xFFFFFFFF
582 #define EMAC_TDES7_TTSH 0xFFFFFFFF
583 
584 //Receive DMA descriptor flags
585 #define EMAC_RDES0_OWN 0x80000000
586 #define EMAC_RDES0_AFM 0x40000000
587 #define EMAC_RDES0_FL 0x3FFF0000
588 #define EMAC_RDES0_ES 0x00008000
589 #define EMAC_RDES0_DE 0x00004000
590 #define EMAC_RDES0_SAF 0x00002000
591 #define EMAC_RDES0_LE 0x00001000
592 #define EMAC_RDES0_OE 0x00000800
593 #define EMAC_RDES0_VLAN 0x00000400
594 #define EMAC_RDES0_FS 0x00000200
595 #define EMAC_RDES0_LS 0x00000100
596 #define EMAC_RDES0_IPHCE_TSV 0x00000080
597 #define EMAC_RDES0_LC 0x00000040
598 #define EMAC_RDES0_FT 0x00000020
599 #define EMAC_RDES0_RWT 0x00000010
600 #define EMAC_RDES0_RE 0x00000008
601 #define EMAC_RDES0_DBE 0x00000004
602 #define EMAC_RDES0_CE 0x00000002
603 #define EMAC_RDES0_PCE_ESA 0x00000001
604 #define EMAC_RDES1_DIC 0x80000000
605 #define EMAC_RDES1_RBS2 0x1FFF0000
606 #define EMAC_RDES1_RER 0x00008000
607 #define EMAC_RDES1_RCH 0x00004000
608 #define EMAC_RDES1_RBS1 0x00001FFF
609 #define EMAC_RDES2_RBAP1 0xFFFFFFFF
610 #define EMAC_RDES3_RBAP2 0xFFFFFFFF
611 #define EMAC_RDES4_L3L4FNM 0x0C000000
612 #define EMAC_RDES4_L4FM 0x02000000
613 #define EMAC_RDES4_L3FM 0x01000000
614 #define EMAC_RDES4_TSD 0x00004000
615 #define EMAC_RDES4_PV 0x00002000
616 #define EMAC_RDES4_PFT 0x00001000
617 #define EMAC_RDES4_PMT 0x00000F00
618 #define EMAC_RDES4_IPV6PR 0x00000080
619 #define EMAC_RDES4_IPV4PR 0x00000040
620 #define EMAC_RDES4_IPCB 0x00000020
621 #define EMAC_RDES4_IPPE 0x00000010
622 #define EMAC_RDES4_IPHE 0x00000008
623 #define EMAC_RDES4_IPPT 0x00000007
624 #define EMAC_RDES6_RTSL 0xFFFFFFFF
625 #define EMAC_RDES7_RTSH 0xFFFFFFFF
626 
627 //C++ guard
628 #ifdef __cplusplus
629 extern "C" {
630 #endif
631 
632 
633 /**
634  * @brief Enhanced TX DMA descriptor
635  **/
636 
637 typedef struct
638 {
639  uint32_t tdes0;
640  uint32_t tdes1;
641  uint32_t tdes2;
642  uint32_t tdes3;
643  uint32_t tdes4;
644  uint32_t tdes5;
645  uint32_t tdes6;
646  uint32_t tdes7;
648 
649 
650 /**
651  * @brief Enhanced RX DMA descriptor
652  **/
653 
654 typedef struct
655 {
656  uint32_t rdes0;
657  uint32_t rdes1;
658  uint32_t rdes2;
659  uint32_t rdes3;
660  uint32_t rdes4;
661  uint32_t rdes5;
662  uint32_t rdes6;
663  uint32_t rdes7;
665 
666 
667 //M5531 Ethernet MAC driver
668 extern const NicDriver m5531EthDriver;
669 
670 //M5531 Ethernet MAC related functions
671 error_t m5531EthInit(NetInterface *interface);
672 void m5531EthInitGpio(NetInterface *interface);
673 void m5531EthInitDmaDesc(NetInterface *interface);
674 
675 void m5531EthTick(NetInterface *interface);
676 
677 void m5531EthEnableIrq(NetInterface *interface);
678 void m5531EthDisableIrq(NetInterface *interface);
679 void m5531EthEventHandler(NetInterface *interface);
680 
682  const NetBuffer *buffer, size_t offset, NetTxAncillary *ancillary);
683 
685 
688 
689 void m5531EthWritePhyReg(uint8_t opcode, uint8_t phyAddr,
690  uint8_t regAddr, uint16_t data);
691 
692 uint16_t m5531EthReadPhyReg(uint8_t opcode, uint8_t phyAddr,
693  uint8_t regAddr);
694 
695 //C++ guard
696 #ifdef __cplusplus
697 }
698 #endif
699 
700 #endif
Enhanced TX DMA descriptor.
void m5531EthWritePhyReg(uint8_t opcode, uint8_t phyAddr, uint8_t regAddr, uint16_t data)
Write PHY register.
uint8_t opcode
Definition: dns_common.h:191
Structure describing a buffer that spans multiple chunks.
Definition: net_mem.h:89
void m5531EthTick(NetInterface *interface)
M5531 Ethernet MAC timer handler.
uint8_t data[]
Definition: ethernet.h:224
error_t m5531EthUpdateMacConfig(NetInterface *interface)
Adjust MAC configuration parameters for proper operation.
Enhanced RX DMA descriptor.
error_t m5531EthReceivePacket(NetInterface *interface)
Receive a packet.
error_t m5531EthUpdateMacAddrFilter(NetInterface *interface)
Configure MAC address filtering.
error_t
Error codes.
Definition: error.h:43
error_t m5531EthSendPacket(NetInterface *interface, const NetBuffer *buffer, size_t offset, NetTxAncillary *ancillary)
Send a packet.
#define NetInterface
Definition: net.h:40
const NicDriver m5531EthDriver
M5531 Ethernet MAC driver.
void m5531EthEnableIrq(NetInterface *interface)
Enable interrupts.
#define NetTxAncillary
Definition: net_misc.h:36
error_t m5531EthInit(NetInterface *interface)
M5531 Ethernet MAC initialization.
uint16_t regAddr
uint16_t m5531EthReadPhyReg(uint8_t opcode, uint8_t phyAddr, uint8_t regAddr)
Read PHY register.
Network interface controller abstraction layer.
void m5531EthDisableIrq(NetInterface *interface)
Disable interrupts.
void m5531EthInitDmaDesc(NetInterface *interface)
Initialize DMA descriptor lists.
void m5531EthInitGpio(NetInterface *interface)
GPIO configuration.
NIC driver.
Definition: nic.h:286
void m5531EthEventHandler(NetInterface *interface)
M5531 Ethernet MAC event handler.