|  | /* 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_*/ |