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