forked from zephyrproject-rtos/zephyr
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy patheth_enc424j600_priv.h
300 lines (268 loc) · 9.76 KB
/
eth_enc424j600_priv.h
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
289
290
291
292
293
294
295
296
297
298
299
300
/* ENC424J600 Stand-alone Ethernet Controller with SPI
*
* Copyright (c) 2016 Intel Corporation
* Copyright (c) 2019 PHYTEC Messtechnik GmbH
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <zephyr/kernel.h>
#include <zephyr/drivers/gpio.h>
#include <zephyr/drivers/spi.h>
#ifndef _ENC424J600_
#define _ENC424J600_
/* Bank 0 Registers */
#define ENC424J600_SFR0_ETXSTL 0x00
#define ENC424J600_SFR0_ETXSTH 0x01
#define ENC424J600_SFR0_ETXLENL 0x02
#define ENC424J600_SFR0_ETXLENH 0x03
#define ENC424J600_SFR0_ERXSTL 0x04
#define ENC424J600_SFR0_ERXSTH 0x05
#define ENC424J600_SFR0_ERXTAILL 0x06
#define ENC424J600_SFR0_ERXTAILH 0x07
#define ENC424J600_SFR0_ERXHEADL 0x08
#define ENC424J600_SFR0_ERXHEADH 0x09
#define ENC424J600_SFR0_EDMASTL 0x0A
#define ENC424J600_SFR0_EDMASTH 0x0B
#define ENC424J600_SFR0_EDMALENL 0x0C
#define ENC424J600_SFR0_EDMALENH 0x0D
#define ENC424J600_SFR0_EDMADSTL 0x0E
#define ENC424J600_SFR0_EDMADSTH 0x0F
#define ENC424J600_SFR0_EDMACSL 0x10
#define ENC424J600_SFR0_EDMACSH 0x11
#define ENC424J600_SFR0_ETXSTATL 0x12
#define ENC424J600_SFR0_ETXSTATH 0x13
#define ENC424J600_SFR0_ETXWIREL 0x14
#define ENC424J600_SFR0_ETXWIREH 0x15
/* Common Registers */
#define ENC424J600_SFRX_EUDASTL 0x16
#define ENC424J600_SFRX_EUDASTH 0x17
#define ENC424J600_SFRX_EUDANDL 0x18
#define ENC424J600_SFRX_EUDANDH 0x19
#define ENC424J600_SFRX_ESTATL 0x1A
#define ENC424J600_SFRX_ESTATH 0x1B
#define ENC424J600_SFRX_EIRL 0x1C
#define ENC424J600_SFRX_EIRH 0x1D
#define ENC424J600_SFRX_ECON1L 0x1E
#define ENC424J600_SFRX_ECON1H 0x1F
/* Bank 1 Registers */
#define ENC424J600_SFR1_EHT1L 0x20
#define ENC424J600_SFR1_EHT1H 0x21
#define ENC424J600_SFR1_EHT2L 0x22
#define ENC424J600_SFR1_EHT2H 0x23
#define ENC424J600_SFR1_EHT3L 0x24
#define ENC424J600_SFR1_EHT3H 0x25
#define ENC424J600_SFR1_EHT4L 0x26
#define ENC424J600_SFR1_EHT4H 0x27
#define ENC424J600_SFR1_EPMM1L 0x28
#define ENC424J600_SFR1_EPMM1H 0x29
#define ENC424J600_SFR1_EPMM2L 0x2A
#define ENC424J600_SFR1_EPMM2H 0x2B
#define ENC424J600_SFR1_EPMM3L 0x2C
#define ENC424J600_SFR1_EPMM3H 0x2D
#define ENC424J600_SFR1_EPMM4L 0x2E
#define ENC424J600_SFR1_EPMM4H 0x2F
#define ENC424J600_SFR1_EPMCSL 0x30
#define ENC424J600_SFR1_EPMCSH 0x31
#define ENC424J600_SFR1_EPMOL 0x32
#define ENC424J600_SFR1_EPMOH 0x33
#define ENC424J600_SFR1_ERXFCONL 0x34
#define ENC424J600_SFR1_ERXFCONH 0x35
/* Bank 2 Registers */
#define ENC424J600_SFR2_MACON1L 0x40
#define ENC424J600_SFR2_MACON1H 0x41
#define ENC424J600_SFR2_MACON2L 0x42
#define ENC424J600_SFR2_MACON2H 0x43
#define ENC424J600_SFR2_MABBIPGL 0x44
#define ENC424J600_SFR2_MABBIPGH 0x45
#define ENC424J600_SFR2_MAIPGL 0x46
#define ENC424J600_SFR2_MAIPGH 0x47
#define ENC424J600_SFR2_MACLCONL 0x48
#define ENC424J600_SFR2_MACLCONH 0x49
#define ENC424J600_SFR2_MAMXFLL 0x4A
#define ENC424J600_SFR2_MAMXFLH 0x4B
#define ENC424J600_SFR2_MICMDL 0x52
#define ENC424J600_SFR2_MICMDH 0x53
#define ENC424J600_SFR2_MIREGADRL 0x54
#define ENC424J600_SFR2_MIREGADRH 0x55
/* Bank 3 Registers */
#define ENC424J600_SFR3_MAADR3L 0x60
#define ENC424J600_SFR3_MAADR3H 0x61
#define ENC424J600_SFR3_MAADR2L 0x62
#define ENC424J600_SFR3_MAADR2H 0x63
#define ENC424J600_SFR3_MAADR1L 0x64
#define ENC424J600_SFR3_MAADR1H 0x65
#define ENC424J600_SFR3_MIWRL 0x66
#define ENC424J600_SFR3_MIWRH 0x67
#define ENC424J600_SFR3_MIRDL 0x68
#define ENC424J600_SFR3_MIRDH 0x69
#define ENC424J600_SFR3_MISTATL 0x6A
#define ENC424J600_SFR3_MISTATH 0x6B
#define ENC424J600_SFR3_EPAUSL 0x6C
#define ENC424J600_SFR3_EPAUSH 0x6D
#define ENC424J600_SFR3_ECON2L 0x6E
#define ENC424J600_SFR3_ECON2H 0x6F
#define ENC424J600_SFR3_ERXWML 0x70
#define ENC424J600_SFR3_ERXWMH 0x71
#define ENC424J600_SFR3_EIEL 0x72
#define ENC424J600_SFR3_EIEH 0x73
#define ENC424J600_SFR3_EIDLEDL 0x74
#define ENC424J600_SFR3_EIDLEDH 0x75
/* Unbanked SFRs */
#define ENC424J600_SFR4_EGPDATA 0x80
#define ENC424J600_SFR4_ERXDATA 0x82
#define ENC424J600_SFR4_EUDADATA 0x84
#define ENC424J600_SFR4_EGPRDPTL 0x86
#define ENC424J600_SFR4_EGPRDPTH 0x87
#define ENC424J600_SFR4_EGPWRPTL 0x88
#define ENC424J600_SFR4_EGPWRPTH 0x89
#define ENC424J600_SFR4_ERXRDPTL 0x8A
#define ENC424J600_SFR4_ERXRDPTH 0x8B
#define ENC424J600_SFR4_ERXWRPTL 0x8C
#define ENC424J600_SFR4_ERXWRPTH 0x8D
#define ENC424J600_SFR4_EUDARDPTL 0x8E
#define ENC424J600_SFR4_EUDARDPTH 0x8F
#define ENC424J600_SFR4_EUDAWRPTL 0x90
#define ENC424J600_SFR4_EUDAWRPTH 0x91
/* PHY Registers */
#define ENC424J600_PSFR_PHCON1 (BIT(8) | 0x00)
#define ENC424J600_PSFR_PHSTAT1 (BIT(8) | 0x01)
#define ENC424J600_PSFR_PHANA (BIT(8) | 0x04)
#define ENC424J600_PSFR_PHANLPA (BIT(8) | 0x05)
#define ENC424J600_PSFR_PHANE (BIT(8) | 0x06)
#define ENC424J600_PSFR_PHCON2 (BIT(8) | 0x11)
#define ENC424J600_PSFR_PHSTAT2 (BIT(8) | 0x1B)
#define ENC424J600_PSFR_PHSTAT3 (BIT(8) | 0x1F)
/* SPI Instructions */
#define ENC424J600_1BC_B0SEL 0xC0
#define ENC424J600_1BC_B1SEL 0xC2
#define ENC424J600_1BC_B2SEL 0xC4
#define ENC424J600_1BC_B3SEL 0xC6
#define ENC424J600_1BC_SETETHRST 0xCA
#define ENC424J600_1BC_FCDISABLE 0xE0
#define ENC424J600_1BC_FCSINGLE 0xE2
#define ENC424J600_1BC_FCMULTIPLE 0xE4
#define ENC424J600_1BC_FCCLEAR 0xE6
#define ENC424J600_1BC_SETPKTDEC 0xCC
#define ENC424J600_1BC_DMASTOP 0xD2
#define ENC424J600_1BC_DMACKSUM 0xD8
#define ENC424J600_1BC_DMACKSUMS 0xDA
#define ENC424J600_1BC_DMACOPY 0xDC
#define ENC424J600_1BC_DMACOPYS 0xDE
#define ENC424J600_1BC_SETTXRTS 0xD4
#define ENC424J600_1BC_ENABLERX 0xE8
#define ENC424J600_1BC_DISABLERX 0xEA
#define ENC424J600_1BC_SETEIE 0xEC
#define ENC424J600_1BC_CLREIE 0xEE
#define ENC424J600_2BC_RBSEL 0xC8
#define ENC424J600_3BC_WGPRDPT 0x60
#define ENC424J600_3BC_RGPRDPT 0x62
#define ENC424J600_3BC_WRXRDPT 0x64
#define ENC424J600_3BC_RRXRDPT 0x66
#define ENC424J600_3BC_WUDARDPT 0x68
#define ENC424J600_3BC_RUDARDPT 0x6A
#define ENC424J600_3BC_WGPWRPT 0x6C
#define ENC424J600_3BC_RGPWRPT 0x6E
#define ENC424J600_3BC_WRXWRPT 0x70
#define ENC424J600_3BC_RRXWRPT 0x72
#define ENC424J600_3BC_WUDAWRPT 0x74
#define ENC424J600_3BC_RUDAWRPT 0x76
#define ENC424J600_NBC_RCR 0x00
#define ENC424J600_NBC_WCR 0x40
#define ENC424J600_NBC_RCRU 0x20
#define ENC424J600_NBC_WCRU 0x22
#define ENC424J600_NBC_BFS 0x80
#define ENC424J600_NBC_BFC 0xA0
#define ENC424J600_NBC_BFSU 0x24
#define ENC424J600_NBC_BFCU 0x26
#define ENC424J600_NBC_RGPDATA 0x28
#define ENC424J600_NBC_WGPDATA 0x2A
#define ENC424J600_NBC_RRXDATA 0x2C
#define ENC424J600_NBC_WRXDATA 0x2E
#define ENC424J600_NBC_RUDADATA 0x30
#define ENC424J600_NBC_WUDADATA 0x32
/* Significant bits */
#define ENC424J600_MICMD_MIIRD BIT(0)
#define ENC424J600_MISTAT_BUSY BIT(0)
#define ENC424J600_ESTAT_RXBUSY BIT(13)
#define ENC424J600_ESTAT_CLKRDY BIT(12)
#define ENC424J600_ESTAT_PHYLNK BIT(8)
#define ENC424J600_MACON2_FULDPX BIT(0)
#define ENC424J600_ERXFCON_CRCEN BIT(6)
#define ENC424J600_ERXFCON_RUNTEEN BIT(5)
#define ENC424J600_ERXFCON_RUNTEN BIT(4)
#define ENC424J600_ERXFCON_UCEN BIT(3)
#define ENC424J600_ERXFCON_NOTMEEN BIT(2)
#define ENC424J600_ERXFCON_MCEN BIT(1)
#define ENC424J600_ERXFCON_BCEN BIT(0)
#define ENC424J600_PHANA_ADNP BIT(15)
#define ENC424J600_PHANA_ADFAULT BIT(13)
#define ENC424J600_PHANA_ADPAUS_SYMMETRIC_ONLY BIT(10)
#define ENC424J600_PHANA_AD100FD BIT(8)
#define ENC424J600_PHANA_AD100 BIT(7)
#define ENC424J600_PHANA_AD10FD BIT(6)
#define ENC424J600_PHANA_AD10 BIT(5)
#define ENC424J600_PHANA_ADIEEE_DEFAULT BIT(0)
#define ENC424J600_EIE_INTIE BIT(15)
#define ENC424J600_EIE_MODEXIE BIT(14)
#define ENC424J600_EIE_HASHIE BIT(13)
#define ENC424J600_EIE_AESIE BIT(12)
#define ENC424J600_EIE_LINKIE BIT(11)
#define ENC424J600_EIE_PKTIE BIT(6)
#define ENC424J600_EIE_DMAIE BIT(5)
#define ENC424J600_EIE_TXIE BIT(3)
#define ENC424J600_EIE_TXABTIE BIT(2)
#define ENC424J600_EIE_RXABTIE BIT(1)
#define ENC424J600_EIE_PCFULIE BIT(0)
#define ENC424J600_ECON1_PKTDEC BIT(8)
#define ENC424J600_ECON1_TXRTS BIT(1)
#define ENC424J600_ECON1_RXEN BIT(0)
#define ENC424J600_ECON2_ETHEN BIT(15)
#define ENC424J600_ECON2_STRCH BIT(14)
#define ENC424J600_EIR_LINKIF BIT(11)
#define ENC424J600_EIR_PKTIF BIT(6)
#define ENC424J600_EIR_TXIF BIT(3)
#define ENC424J600_EIR_TXABTIF BIT(2)
#define ENC424J600_EIR_RXABTIF BIT(1)
#define ENC424J600_EIR_PCFULIF BIT(0)
#define ENC424J600_PHCON1_PSLEEP BIT(11)
#define ENC424J600_PHCON1_RENEG BIT(9)
#define ENC424J600_PHSTAT3_SPDDPX_FD BIT(4)
#define ENC424J600_PHSTAT3_SPDDPX_100 BIT(3)
#define ENC424J600_PHSTAT3_SPDDPX_10 BIT(2)
/* Buffer Configuration */
#define ENC424J600_TXSTART 0x0000U
#define ENC424J600_TXEND 0x2FFFU
#define ENC424J600_RXSTART (ENC424J600_TXEND + 1)
#define ENC424J600_RXEND 0x5FFFU
#define ENC424J600_EUDAST_DEFAULT 0x6000U
#define ENC424J600_EUDAND_DEFAULT (ENC424J600_EUDAST + 1)
/* Status vectors array size */
#define ENC424J600_RSV_SIZE 6U
#define ENC424J600_PTR_NXP_PKT_SIZE 2U
/* Full-Duplex mode Inter-Packet Gap default value */
#define ENC424J600_MABBIPG_DEFAULT 0x15U
#define ENC424J600_DEFAULT_NUMOF_RETRIES 3U
/* Delay for PHY write/read operations (25.6 us) */
#define ENC424J600_PHY_ACCESS_DELAY 26U
#define ENC424J600_PHY_READY_DELAY 260U
struct enc424j600_config {
struct spi_dt_spec spi;
struct gpio_dt_spec interrupt;
uint8_t full_duplex;
int32_t timeout;
};
struct enc424j600_runtime {
struct net_if *iface;
const struct device *dev;
K_KERNEL_STACK_MEMBER(thread_stack,
CONFIG_ETH_ENC424J600_RX_THREAD_STACK_SIZE);
struct k_thread thread;
uint8_t mac_address[6];
struct gpio_callback gpio_cb;
struct k_sem tx_rx_sem;
struct k_sem int_sem;
uint16_t next_pkt_ptr;
bool suspended : 1;
bool iface_initialized : 1;
};
#endif /*_ENC424J600_*/