1 /* ENC28J60 Stand-alone Ethernet Controller with SPI
2  *
3  * Copyright (c) 2016 Intel Corporation
4  *
5  * SPDX-License-Identifier: Apache-2.0
6  */
7 
8 #include <zephyr/kernel.h>
9 #include <zephyr/drivers/gpio.h>
10 #include <zephyr/drivers/spi.h>
11 
12 #ifndef _ENC28J60_
13 #define _ENC28J60_
14 
15 /* Any Bank Registers */
16 #define ENC28J60_REG_EIE   0x1B
17 #define ENC28J60_REG_EIR   0x1C
18 #define ENC28J60_REG_ESTAT 0x1D
19 #define ENC28J60_REG_ECON2 0x1E
20 #define ENC28J60_REG_ECON1 0x1F
21 
22 /* Register Encoding
23  * Nibble 3  : 0x0 ETH Register
24  *             0x1 MAC Register
25  *             0x2 MII Register
26  * Nibble 2  : Bank number
27  * Nibble 1-0: Register address
28  */
29 
30 /* Bank 0 Registers */
31 #define ENC28J60_REG_ERDPTL   0x0000
32 #define ENC28J60_REG_ERDPTH   0x0001
33 #define ENC28J60_REG_EWRPTL   0x0002
34 #define ENC28J60_REG_EWRPTH   0x0003
35 #define ENC28J60_REG_ETXSTL   0x0004
36 #define ENC28J60_REG_ETXSTH   0x0005
37 #define ENC28J60_REG_ETXNDL   0x0006
38 #define ENC28J60_REG_ETXNDH   0x0007
39 #define ENC28J60_REG_ERXSTL   0x0008
40 #define ENC28J60_REG_ERXSTH   0x0009
41 #define ENC28J60_REG_ERXNDL   0x000A
42 #define ENC28J60_REG_ERXNDH   0x000B
43 #define ENC28J60_REG_ERXRDPTL 0x000C
44 #define ENC28J60_REG_ERXRDPTH 0x000D
45 #define ENC28J60_REG_ERXWRPTL 0x000E
46 #define ENC28J60_REG_ERXWRPTH 0x000F
47 #define ENC28J60_REG_EDMASTL  0x0010
48 #define ENC28J60_REG_EDMASTH  0x0011
49 #define ENC28J60_REG_EDMANDL  0x0012
50 #define ENC28J60_REG_EDMANDH  0x0013
51 #define ENC28J60_REG_EDMADSTL 0x0014
52 #define ENC28J60_REG_EDMADSTH 0x0015
53 #define ENC28J60_REG_EDMACSL  0x0016
54 #define ENC28J60_REG_EDMACSH  0x0017
55 
56 /* Bank 1 Registers */
57 #define ENC28J60_REG_EHT0    0x0100
58 #define ENC28J60_REG_EHT1    0x0101
59 #define ENC28J60_REG_EHT2    0x0102
60 #define ENC28J60_REG_EHT3    0x0103
61 #define ENC28J60_REG_EHT4    0x0104
62 #define ENC28J60_REG_EHT5    0x0105
63 #define ENC28J60_REG_EHT6    0x0106
64 #define ENC28J60_REG_EHT7    0x0107
65 #define ENC28J60_REG_EPMM0   0x0108
66 #define ENC28J60_REG_EPMM1   0x0109
67 #define ENC28J60_REG_EPMM2   0x010A
68 #define ENC28J60_REG_EPMM3   0x010B
69 #define ENC28J60_REG_EPMM4   0x010C
70 #define ENC28J60_REG_EPMM5   0x010D
71 #define ENC28J60_REG_EPMM6   0x010E
72 #define ENC28J60_REG_EPMM7   0x010F
73 #define ENC28J60_REG_EPMCSL  0x0110
74 #define ENC28J60_REG_EPMCSH  0x0111
75 #define ENC28J60_REG_EPMOL   0x0114
76 #define ENC28J60_REG_EPMOH   0x0115
77 #define ENC28J60_REG_EWOLIE  0x0116
78 #define ENC28J60_REG_EWOLIR  0x0117
79 #define ENC28J60_REG_ERXFCON 0x0118
80 #define ENC28J60_REG_EPKTCNT 0x0119
81 
82 /* Bank 2 Registers */
83 #define ENC28J60_REG_MACON1   0x1200
84 #define ENC28J60_REG_MACON3   0x1202
85 #define ENC28J60_REG_MACON4   0x1203
86 #define ENC28J60_REG_MABBIPG  0x1204
87 #define ENC28J60_REG_MAIPGL   0x1206
88 #define ENC28J60_REG_MAIPGH   0x1207
89 #define ENC28J60_REG_MACLCON1 0x1208
90 #define ENC28J60_REG_MACLCON2 0x1209
91 #define ENC28J60_REG_MAMXFLL  0x120A
92 #define ENC28J60_REG_MAMXFLH  0x120B
93 #define ENC28J60_REG_MAPHSUP  0x120C
94 #define ENC28J60_REG_MICON    0x2211
95 #define ENC28J60_REG_MICMD    0x2212
96 #define ENC28J60_REG_MIREGADR 0x2214
97 #define ENC28J60_REG_MIWRL    0x2216
98 #define ENC28J60_REG_MIWRH    0x2217
99 #define ENC28J60_REG_MIRDL    0x2218
100 #define ENC28J60_REG_MIRDH    0x2219
101 
102 /* Bank 3 Registers */
103 #define ENC28J60_REG_MAADR5   0x1300
104 #define ENC28J60_REG_MAADR6   0x1301
105 #define ENC28J60_REG_MAADR3   0x1302
106 #define ENC28J60_REG_MAADR4   0x1303
107 #define ENC28J60_REG_MAADR1   0x1304
108 #define ENC28J60_REG_MAADR2   0x1305
109 #define ENC28J60_REG_EBSTSD   0x0306
110 #define ENC28J60_REG_EBSTCON  0x0307
111 #define ENC28J60_REG_EBSTCSL  0x0308
112 #define ENC28J60_REG_EBSTCSH  0x0309
113 #define ENC28J60_REG_MISTAT   0x230A
114 #define ENC28J60_REG_EREVID   0x0312
115 #define ENC28J60_REG_ECOCON   0x0315
116 #define ENC28J60_REG_EFLOCON  0x0317
117 #define ENC28J60_REG_EPAUSL   0x0318
118 #define ENC28J60_REG_EPAUSH   0x0319
119 
120 /* PHY Registers */
121 #define ENC28J60_PHY_PHCON1  0x00
122 #define ENC28J60_PHY_PHSTAT1 0x01
123 #define ENC28J60_PHY_PHID1   0x02
124 #define ENC28J60_PHY_PHID2   0x03
125 #define ENC28J60_PHY_PHCON2  0x10
126 #define ENC28J60_PHY_PHSTAT2 0x11
127 #define ENC28J60_PHY_PHIE    0x12
128 #define ENC28J60_PHY_PHIR    0x13
129 #define ENC28J60_PHY_PHLCON  0x14
130 
131 /* SPI Instruction Opcodes */
132 #define  ENC28J60_SPI_RCR (0x0)
133 #define  ENC28J60_SPI_RBM (0x3A)
134 #define  ENC28J60_SPI_WCR (0x2 << 5)
135 #define  ENC28J60_SPI_WBM (0x7A)
136 #define  ENC28J60_SPI_BFS (0x4 << 5)
137 #define  ENC28J60_SPI_BFC (0x5 << 5)
138 #define  ENC28J60_SPI_SC  (0xFF)
139 
140 /* Significant bits */
141 #define ENC28J60_BIT_MICMD_MIIRD   (0x01)
142 #define ENC28J60_BIT_MISTAT_BUSY   (0x01)
143 #define ENC28J60_BIT_ESTAT_CLKRDY  (0x01)
144 #define ENC28J60_BIT_MACON1_MARXEN (0x01)
145 #define ENC28J60_BIT_MACON1_RXPAUS (0x04)
146 #define ENC28J60_BIT_MACON1_TXPAUS (0x08)
147 #define ENC28J60_BIT_MACON1_MARXEN (0x01)
148 #define ENC28J60_BIT_MACON2_MARST  (0x80)
149 #define ENC28J60_BIT_MACON3_FULDPX (0x01)
150 #define ENC28J60_BIT_ECON1_TXRST   (0x80)
151 #define ENC28J60_BIT_ECON1_TXRTS   (0x08)
152 #define ENC28J60_BIT_ECON1_RXEN    (0x04)
153 #define ENC28J60_BIT_ECON2_PKTDEC  (0x40)
154 #define ENC28J60_BIT_EIR_PKTIF     (0x40)
155 #define ENC28J60_BIT_EIE_TXIE      (0x08)
156 #define ENC28J60_BIT_EIE_PKTIE     (0x40)
157 #define ENC28J60_BIT_EIE_LINKIE    (0x10)
158 #define ENC28J60_BIT_EIE_INTIE     (0x80)
159 #define ENC28J60_BIT_EIR_PKTIF     (0x40)
160 #define ENC28J60_BIT_EIR_DMAIF     (0x20)
161 #define ENC28J60_BIT_EIR_LINKIF    (0x10)
162 #define ENC28J60_BIT_EIR_TXIF      (0x08)
163 #define ENC28J60_BIT_EIR_WOLIF     (0x04)
164 #define ENC28J60_BIT_EIR_TXERIF    (0x02)
165 #define ENC28J60_BIT_EIR_RXERIF    (0x01)
166 #define ENC28J60_BIT_ESTAT_TXABRT  (0x02)
167 #define ENC28J60_BIT_ESTAT_LATECOL (0x10)
168 #define ENC28J60_BIT_PHCON1_PDPXMD (0x0100)
169 #define ENC28J60_BIT_PHCON2_HDLDIS (0x0001)
170 #define ENC28J60_BIT_PHSTAT2_LSTAT (0x0400)
171 #define ENC28J60_BIT_PHIE_PGEIE    (0x0002)
172 #define ENC28J60_BIT_PHIE_PLNKIE   (0x0010)
173 
174 /* Driver Static Configuration */
175 
176 /*  Receive filters enabled:
177  *  - Unicast
178  *  - Multicast
179  *  - Broadcast
180  *  - CRC Check
181  */
182 #define ENC28J60_RECEIVE_FILTERS 0xA3
183 
184 /*  MAC configuration:
185  *  - Automatic Padding
186  *  - Automatic CRC
187  *  - Frame Length Checking
188  */
189 #define ENC28J60_MAC_CONFIG   0x32
190 #define ENC28J60_MAC_BBIPG_HD 0x12
191 #define ENC28J60_MAC_BBIPG_FD 0x15
192 #define ENC28J60_MAC_NBBIPGL  0x12
193 #define ENC28J60_MAC_NBBIPGH  0x0C
194 #define ENC28J60_PHY_LEDCONF  0x3422
195 /* Status Vector size plus per packet control byte: 8 bytes */
196 #define ENC28J60_SV_SIZE 8
197 /* Per Packet Control Byte configured to follow MACON3 configuration */
198 #define ENC28J60_PPCTL_BYTE 0x0
199 
200 /* Start of RX buffer, (must be zero, Rev. B4 Errata point 5) */
201 #define ENC28J60_RXSTART 0x0000
202 /* End of RX buffer, room for 2 packets */
203 #define ENC28J60_RXEND 0x0BFF
204 
205 /* Start of TX buffer, room for 1 packet */
206 #define ENC28J60_TXSTART 0x0C00
207 /* End of TX buffer */
208 #define ENC28J60_TXEND 0x11FF
209 
210 /* Status vectors array size */
211 #define TSV_SIZE 7
212 #define RSV_SIZE 4
213 
214 /* Microchip's OUI*/
215 #define MICROCHIP_OUI_B0 0x00
216 #define MICROCHIP_OUI_B1 0x04
217 #define MICROCHIP_OUI_B2 0xA3
218 
219 #define MAX_BUFFER_LENGTH 128
220 
221 struct eth_enc28j60_config {
222 	struct spi_dt_spec spi;
223 	struct gpio_dt_spec interrupt;
224 	uint8_t full_duplex;
225 	int32_t timeout;
226 };
227 
228 struct eth_enc28j60_runtime {
229 	struct net_if *iface;
230 	K_KERNEL_STACK_MEMBER(thread_stack,
231 			      CONFIG_ETH_ENC28J60_RX_THREAD_STACK_SIZE);
232 	struct k_thread thread;
233 	uint8_t mac_address[6];
234 	struct gpio_callback gpio_cb;
235 	struct k_sem tx_rx_sem;
236 	struct k_sem int_sem;
237 	bool iface_initialized : 1;
238 };
239 
240 #endif /*_ENC28J60_*/
241