summaryrefslogtreecommitdiff
path: root/nuttx/arch/z80/src/ez80/ez80f91_emac.h
blob: ddd8299a0e3e2964069a6cad3aa0b97831f6bc98 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
/************************************************************************************
 * arch/z80/src/ez80/ez80f91_emac.h
 * arch/z80/src/chip/ez80f91_emac.h
 *
 *   Copyright (C) 2008-2009 Gregory Nutt. All rights reserved.
 *   Author: Gregory Nutt <gnutt@nuttx.org>
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the
 *    distribution.
 * 3. Neither the name NuttX nor the names of its contributors may be
 *    used to endorse or promote products derived from this software
 *    without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
 * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 *
 ************************************************************************************/

#ifndef __ARCH_Z80_SRC_EZ80_EZ80F91_EMAC_H
#define __ARCH_Z80_SRC_EZ80_EZ80F91_EMAC_H

/************************************************************************************
 * Included Files
 ************************************************************************************/

#ifndef __ASSEMBLY__
#  include <stdint.h>
#endif

/************************************************************************************
 * Definitions
 ************************************************************************************/

/* EMACC Registers  *****************************************************************/

/* Provided in ez80f91.h */

/* EMAC configuration 1/2/3 register bit settings ***********************************/

#define EMAC_CFG1_DCRCC        0x01  /* Bit 0: 1=4 bytes of proprietary header */
#define EMAC_CFG1_HUGEN        0x02  /* Bit 1: 1=Allow unlimited size frames to be recieved */
#define EMAC_CFG1_FLCHK        0x04  /* Bit 2: 1=Frame lengths compared to length/type */
#define EMAC_CFG1_FULLHD       0x08  /* Bit 3: 1=Enable full duplex mode */
#define EMAC_CFG1_CRCEN        0x10  /* Bit 4: 1=Append CRC to every frame */
#define EMAC_CFG1_VLPAD        0x20  /* Bit 5: 1=Pad all short frames to 64 bytes, append CRC */
#define EMAC_CFG1_ADPADN       0x40  /* Bit 6: 1=Enable frame detection by check VALN protocol ID */
#define EMAC_CFG1_PADEN        0x80  /* Bit 7: 1=Pad all short frames with zeros. */

#define EMAC_CFG2_LCOLMASK     0x3f  /* Bits 0-5: Number bytes after start frame for collision */
#define EMAC_CFG2_NOBO         0x40  /* Bit 6: 1=immediate transmit after collision */
#define EMAC_CFG2_BPNB         0x80  /* Bit 7: 1=after collision retransmit without back-off */

#define EMAC_CFG3_RETRYMASK    0x0f  /* Bits 0-3: Number retransmissions before abort */
#define EMAC_CFG3_BITMD        0x10  /* Bit 4: 1=Enable 10Mbps ENDEC mode */
#define EMAC_CFG3_XSDFR        0x20  /* Bit 5: 1=Defer to carrier indefinitely */
#define EMAC_CFG3_PUREP        0x40  /* Bit 6: 1=Verify preamble */
#define EMAC_CFG3_LONGP        0x80  /* Bit 7: 1=only allow preamble < 12 bytes */

#define EMAC_CFG4_RXEN         0x01  /* Bit 0: 1=Receive frames */
#define EMAC_CFG4_TPAUSE       0x02  /* Bit 1: 1=Force pause condition */
#define EMAC_CFG4_TXFC         0x04  /* Bit 2: 1=Transmit pause control frames */
#define EMAC_CFG4_RXFC         0x08  /* Bit 3: 1=Act on receive pause control frames */
#define EMAC_CFG4_PARF         0x10  /* Bit 4: 1=Receive all frames */
#define EMAC_CFG4_THDF         0x20  /* Bit 5: 1=Asser back-pressure */
#define EMAC_CFG4_TPCF         0x40  /* Bit 6: 1=Transmit pause control frame. */
                                     /* Bit 7: reserved */

/* EMAC AFR register bit settings ***************************************************/

#define EMAC_AFR_BC            0x01  /* Bit 0: 1=Accept broadcast messages */
#define EMAC_AFR_QMC           0x02  /* Bit 1: 1=Accept only qualified multicast messages */
#define EMAC_AFR_MC            0x04  /* Bit 2: 1=Accept any multicast message */
#define EMAC_AFR_PROM          0x08  /* Bit 3: 1=Enable promiscuous mode */
                                     /* Bits 4-7: Reserved */

/* EMAC MII management register bit settings ****************************************/

#define EMAC_MIIMGMT_CLKMASK   0x07  /* Bits 0-2: Divisor that produces MDC from SCLK */
#  define EMAC_MDC_DIV4        0x01  /*        MDC = SCLK / 4 */
#  define EMAC_MDC_DIV6        0x02  /*        MDC = SCLK / 6 */
#  define EMAC_MDC_DIV8        0x03  /*        MDC = SCLK / 8 */
#  define EMAC_MDC_DIV10       0x04  /*        MDC = SCLK / 10 */
#  define EMAC_MDC_DIV14       0x05  /*        MDC = SCLK / 14 */
#  define EMAC_MDC_DIV20       0x06  /*        MDC = SCLK / 20 */
#  define EMAC_MDC_DIV28       0x07  /*        MDC = SCLK / 28 */
#define EMAC_MIIMGMT_SPRE      0x08  /* Bit 3: 1=Suppress MDO preamble */
#define EMAC_MIIMGMT_SCAN      0x10  /* Bit 4: 1=Perform continus read cycles */
#define EMAC_MIIMGMT_SCINC     0x20  /* Bit 5: 1=Increment PHY address on scan cycle */
#define EMAC_MIIMGMT_RSTAT     0x40  /* Bit 6: 1=Read status from PHY (via PRSD) */
#define EMAC_MIIMGMT_LCTLD     0x80  /* Bit 7: 1=Send CTLD control data to PHY */

/* EMAC PHY unit select address register bit settings *******************************/

#define EMAC_RGAD_MASK         0x1f  /* 5-bit value selects address within PHY */

/* EMAC PHY address register bit settings *******************************************/

#define EMAC_FIAD_MASK         0x1f  /* 5-bit value selects the external PHY */

/* EMAC reset control register bit settings *****************************************/

#define EMAC_RST_HRMGT         0x01  /* Bit 0: 1=Reset EMAC management function */
#define EMAC_RST_HRRMC         0x02  /* Bit 1: 1=Reset EMAC receive control function */
#define EMAC_RST_HRTMC         0x04  /* Bit 2: 1=Reset EMAC transmit control function */
#define EMAC_RST_HRRFN         0x08  /* Bit 3: 1=Reset receive function */
#define EMAC_RST_HRTFN         0x10  /* Bit 4: 1=Reset transmit function */
#define EMAC_RST_SRST          0x20  /* Bit 5: 1=Software reset active */
                                     /* Bits 6-7: Reserved */

/* EMAC bufsize register bit settings ***********************************************/

#define EMAC_BUFSZ_BUFSZMASK   0xc0  /* Bits 6-6: Rx/Tx buffer size */
#  define EMAC_BUFSZ_256b      0x00  /*   EMAC Rx/Tx buffer size = 256 bytes */
#  define EMAC_BUFSZ_128b      0x40  /*   EMAC Rx/Tx buffer size = 128 bytes */
#  define EMAC_BUFSZ_64b       0x80  /*   EMAC Rx/Tx buffer size = 64 bytes */
#  define EMAC_BUFSZ_32b       0xc0  /*   EMAC Rx/Tx buffer size = 32 bytes */
#define EMAC_BUFSZ_TPCFLMASK   0x3f /* Bits 0-5: Tranmsit pause frame level */

/* EMAC interrupt enable register bit settings **************************************/

#define EMAC_EIN_TXDONE       0x01  /* Bit 0: 1=Enable transmit done interrupt */
#define EMAC_EIN_TXCF         0x02  /* Bit 1: 1=Enable transmit control frame interrupt */
#define EMAC_EIN_RXOVR        0x04  /* Bit 2: 1=Enable receive overrun interrupt */
#define EMAC_EIN_RXDONE       0x08  /* Bit 3: 1=Enable receive done interrupt */
#define EMAC_EIN_RXPCF        0x10  /* Bit 4: 1=Enable receive pause control frame interrupt */
#define EMAC_EIN_RXCF         0x20  /* Bit 5: 1=Enable receive control frame interrupt */
#define EMAC_EIN_MGTDONE      0x40  /* Bit 6: 1=Enable MII Mgmt done interrupt */
#define EMAC_EIN_TXFSMERR     0x80  /* Bit 7: 1=Enable transmit state machine error interrupt */

/* EMAC interrupt status register bit settings **************************************/

#define EMAC_ISTAT_TXDONE     0x01  /* Bit 0: 1=Transmit done interrupt */
#define EMAC_ISTAT_TXCF       0x02  /* Bit 1: 1=Transmit control frame interrupt */
#define EMAC_ISTAT_RXOVR      0x04  /* Bit 2: 1=Receive overrun interrupt */
#define EMAC_ISTAT_RXDONE     0x08  /* Bit 3: 1=Receive done interrupt */
#define EMAC_ISTAT_RXPCF      0x10  /* Bit 4: 1=Receive pause control frame interrupt */
#define EMAC_ISTAT_RXCF       0x20  /* Bit 5: 1=Receive control frame interrupt */
#define EMAC_ISTAT_MGTDONE    0x40  /* Bit 6: 1=MII Mgmt done interrupt */
#define EMAC_ISTAT_TXFSMERR   0x80  /* Bit 7: 1=Transmit state machine error interrupt */

/* EMAC MII status register bit settings ********************************************/

#define EMAC_MIISTAT_RDADRMK  0x1f  /* Bits 0-4: PHY addressed in current scan cyle */
#define EMAC_MIISTAT_NVALID   0x20  /* Bit 5: 1=PRSD is valid */
#define EMAC_MIISTAT_MIILF    0x40  /* Bit 6: 1=PHY link OK */
#define EMAC_MIISTAT_BUSY     0x80  /* Bit 7: 1=MII management in progress */

/* EMAC FIFO flags register bit settings ********************************************/

#define EMAC_FFLAGS_RFE       0x01 /* Bit 0: 1=Receive FIFO empty */
#define EMAC_FFLAGS_RFAE      0x02 /* Bit 0: 1=Receive FIFO almost empty */
#define EMAC_FFLAGS_RFAF      0x04 /* Bit 0: 1=Receive FIFO almost full */
#define EMAC_FFLAGS_RFF       0x08 /* Bit 0: 1=Receive FIFO full */
#define EMAC_FFLAGS_TFE       0x10 /* Bit 0: 1=Transmit FIFO empty */
#define EMAC_FFLAGS_TFAE      0x20 /* Bit 0: 1=Transmit FIFO almost empty */
#define EMAC_FFLAGS_TFF       0x80 /* Bit 0: 1=Trasnmit FIFO full */

/* EMAC Transmit Descriptor Status **************************************************/

#define EMAC_TXDESC_NCOLL     0x0001 /* Bits 0-3: Bumber of collisions that occurred
                                      * while transmitting the packet. */
#define EMAC_TXDESC_MXCOLL    0x0010 /* Bit 4: 1=maximum number of collisions.
                                      * number > CFG3[3:0]. packet aborted */
#define EMAC_TXDESC_LATECOLL  0x0020 /* Bit 5: 1=late collision. Collision is detected
                                      * at a byte count > CFG2[5:0]. Collisions detected
                                      * before the byte count reaches CFG2[5:0] are early
                                      * collisions and retried. */
#define EMAC_TXDESC_FIFOUNDR  0x0040 /* Bit 6: TxFIFO Underrun. Check the TxAbort
                                      * bit to see if the packet is aborted or retried. */
#define EMAC_TXDESC_XSDFR     0x0080 /* Bit 7: Packet is excessively deferred. (> 6071 nibble
                                      * times in 100 BaseT or 24,287 bit times in 10 BaseT). */
#define EMAC_TXDESC_PKTDEFFRD 0x0100 /* Bit 8: Packet is deferred */
#define EMAC_TXDESC_CRCERROR  0x0200 /* Bit 9: Invalid FCS (CRC). Set CRCEN = 0 and the
                                      * last 4 bytes of the packet are not the valid FCS. */
#define EMAC_TXDESC_LCERROR   0x0400 /* Bit 10: Type/Length field is not a Type field and
                                      * does not match the actual data byte length of
                                      * the Ethernet packet. The data byte length is
                                      * the number of bytes of data in the Ethernet
                                      * packet between the Type/Length field and the FCS. */
#define EMAC_TXDESC_LOOR      0x0800 /* Bit 11: Type/Length field is out of range (larger
                                      * than 1518 bytes). */
#define EMAC_TXDESC_HUGE      0x1000 /* Bit 12: 1=Packet size is very large(Pkt_Size > MAXF). */
#define EMAC_TXDESC_BPA       0x2000 /* Bit 13: 1=Back pressure applied */
#define EMAC_TXDESC_ABORT     0x4000 /* Bit 14: 1=Packet aborted (not transmitted). */
#define EMAC_TXDESC_OWNER     0x8000 /* Bit 15: 0=Host (eZ80 CPU) owns, 1=EMAC owns. */

/* Receive Descriptor Status ********************************************************/

#define EMAC_RXDESC_OVR       0x0001 /* Bit 0: 1=A Receive Overrun occurs in this packet. An
                                      * overrun occurs when all of the EMAC Receive
                                      * buffers are in use and the Receive FIFO is full.
                                      * The hardware ignores all incoming packets until the
                                      * ISTAT Register [RXOVR] bit is cleared by the software.
                                      * There is no indication as to how many packets are
                                      * ignored. */
#define EMAC_RXDESC_DVEVENT   0x0002 /* Bit 1: 1=Receive data (RxDV) event is previously seen.
                                      * Indicates that the last Receive event is not long
                                      * enough to be a valid packet. */
#define EMAC_RXDESC_CEVENT    0x0004 /* Bit 2: 1=Carrier event is previously seen. This event is
                                      * defined as Rx error RxER = 1, receive data valid
                                      * (RxDV) = 0 and receive data (RxD) = Eh */
#define EMAC_RXDESC_CODEV     0x0008 /* Bit 3: 1=A code violation is detected. The PHY asserts
                                      * Rx error (RxER). */
#define EMAC_RXDESC_LCERROR   0x0010 /* Bit 4 1=Type/Length field is not a Type field and it does
                                      * not match the actual data byte length of the
                                      * Ethernet packet. The data byte length is the
                                      * number of bytes of data in the Ethernet packet
                                      * between the Type/Length field and the FCS. */
#define EMAC_RXDESC_LOOR      0x0020 /* Bit 5: 1=Type/Length field is out of range (larger
                                      * than 1518 bytes). */
#define EMAC_RXDESC_UOPCODE   0x0040 /* Bit 6: 1=Unsupported Op Code is indicated in the Op
                                      * Code field of the Ethernet packet. */
#define EMAC_RXDESC_VLAN      0x0080 /* Bit 7: 1=The packet is a VLAN packet */
#define EMAC_RXDESC_BCPKT     0x0100 /* Bit 8: 1=packet contains a broadcast address */
#define EMAC_RXDESC_MCPKT     0x0200 /* Bit 9: 1=The packet contains a multicast address */
#define EMAC_RXDESC_CR        0x0400 /* Bit 10: 1=The packet is a control frame */
#define EMAC_RXDESC_PCF       0x0800 /* Bit 11: 1=The packet is a pause control frame */
#define EMAC_RXDESC_LONGEVNT  0x1000 /* Bit 12: 1= A Long or Dropped Event occurs. A Long Event is
                                      * when a packet over 50,000 bit times occurs. A
                                      * Dropped Packet can occur if the minimum interpacket
                                      * gap is not met, the preamble is not pure, and
                                      * the CFG3[PUREP] bit is set, or if a preamble over
                                      * 11 bytes in length is detected and the CFG3[LONGP]
                                      * bit is set to 1. */
#define EMAC_RXDESC_CRCERR    0x2000 /* Bit 13: 1=The CRC (FCS) is in error */
#define EMAC_RXDESC_ALGNERR   0x4000 /* Bit 14: 1=An odd number of nibbles is received. */
#define EMAC_RXDESC_OK        0x8000 /* Bit 15: 1=Packet received intact. */

/************************************************************************************
 * Public Types
 ************************************************************************************/

/* EMAC descriptor structure (7 bytes) */

#ifndef __ASSEMBLY__
struct ez80emac_desc_s
{
  uint24_t np;      /* Pointer to the start of the next packet */
  uint16_t pktsize; /* Number of bytes in the packet, including the 4 CRC
                     * bytes, but excluding the 7 descriptor table bytes. */
  uint16_t stat;    /* Status of the packet. Differs for TX and RX packets
                     * (see EMAC_RX/TXDESC_* definitions) */
};
#endif

#define SIZEOF_EMACSDESC 7

/************************************************************************************
 * Public Data
 ************************************************************************************/

#ifndef __ASSEMBLY__
#ifdef __cplusplus
#define EXTERN extern "C"
extern "C" {
#else
#define EXTERN extern
#endif /* __cplusplus */

/************************************************************************************
 * Public Functions
 ************************************************************************************/

#undef EXTERN
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* __ASSEMBLY__ */

#endif  /* __ARCH_Z80_SRC_EZ80_EZ80F91_EMAC_H */