blob: 02f544c1eda92f4bcd2725f85ed580aa0b457577 [file] [log] [blame]
/* 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_*/