blob: 5dbb2295205c4a156f19a8798478600bf181d000 [file] [log] [blame]
/* SPDX-License-Identifier: Apache-2.0 */
/* mbed Microcontroller Library
* Copyright (c) 2017 ARM Limited
* Copyright (c) 2018-2019 Linaro Limited
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/*
* This header is originally based on mbedOS header
* targets/TARGET_ARM_SSG/TARGET_CM3DS_MPS2/device/drivers/smsc9220_eth.h,
* but was considerably refactored since then.
*/
/* This file is the re-implementation of mps2_ethernet_api and Selftest's
* ETH_MPS2.
* MPS2 Selftest:https://silver.arm.com/browse/VEI10 ->
* \ISCM-1-0\AN491\software\Selftest\v2m_mps2\
*/
#ifndef ZEPHYR_DRIVERS_ETHERNET_ETH_SMSC911X_PRIV_H_
#define ZEPHYR_DRIVERS_ETHERNET_ETH_SMSC911X_PRIV_H_
#ifndef __I
#define __I
#endif
#ifndef __O
#define __O
#endif
#ifndef __IO
#define __IO
#endif
#define GET_BITFIELD(val, lsb, msb) \
(((val) >> (lsb)) & ((1 << ((msb) - (lsb) + 1)) - 1))
#define BFIELD(val, name) GET_BITFIELD(val, name ## _Lsb, name ## _Msb)
#define SMSC9220_BFIELD(reg, bfield) BFIELD(SMSC9220->reg, reg ## _ ## bfield)
/******************************************************************************/
/* SMSC9220 Register Definitions */
/******************************************************************************/
typedef struct {
/* Receive FIFO Ports (offset 0x0) */
__I uint32_t RX_DATA_PORT;
uint32_t RESERVED1[0x7];
/* Transmit FIFO Ports (offset 0x20) */
__O uint32_t TX_DATA_PORT;
uint32_t RESERVED2[0x7];
/* Receive FIFO status port (offset 0x40) */
__I uint32_t RX_STAT_PORT;
/* Receive FIFO status peek (offset 0x44) */
__I uint32_t RX_STAT_PEEK;
/* Transmit FIFO status port (offset 0x48) */
__I uint32_t TX_STAT_PORT;
/* Transmit FIFO status peek (offset 0x4C) */
__I uint32_t TX_STAT_PEEK;
/* Chip ID and Revision (offset 0x50) */
__I uint32_t ID_REV;
/* Main Interrupt Configuration (offset 0x54) */
__IO uint32_t IRQ_CFG;
/* Interrupt Status (offset 0x58) */
__IO uint32_t INT_STS;
/* Interrupt Enable Register (offset 0x5C) */
__IO uint32_t INT_EN;
/* Reserved for future use (offset 0x60) */
uint32_t RESERVED3;
/* Read-only byte order testing register 87654321h (offset 0x64) */
__I uint32_t BYTE_TEST;
/* FIFO Level Interrupts (offset 0x68) */
__IO uint32_t FIFO_INT;
/* Receive Configuration (offset 0x6C) */
__IO uint32_t RX_CFG;
/* Transmit Configuration (offset 0x70) */
__IO uint32_t TX_CFG;
/* Hardware Configuration (offset 0x74) */
__IO uint32_t HW_CFG;
/* RX Datapath Control (offset 0x78) */
__IO uint32_t RX_DP_CTRL;
/* Receive FIFO Information (offset 0x7C) */
__I uint32_t RX_FIFO_INF;
/* Transmit FIFO Information (offset 0x80) */
__I uint32_t TX_FIFO_INF;
/* Power Management Control (offset 0x84) */
__IO uint32_t PMT_CTRL;
/* General Purpose IO Configuration (offset 0x88) */
__IO uint32_t GPIO_CFG;
/* General Purpose Timer Configuration (offset 0x8C) */
__IO uint32_t GPT_CFG;
/* General Purpose Timer Count (offset 0x90) */
__I uint32_t GPT_CNT;
/* Reserved for future use (offset 0x94) */
uint32_t RESERVED4;
/* WORD SWAP Register (offset 0x98) */
__IO uint32_t ENDIAN;
/* Free Run Counter (offset 0x9C) */
__I uint32_t FREE_RUN;
/* RX Dropped Frames Counter (offset 0xA0) */
__I uint32_t RX_DROP;
/* MAC CSR Synchronizer Command (offset 0xA4) */
__IO uint32_t MAC_CSR_CMD;
/* MAC CSR Synchronizer Data (offset 0xA8) */
__IO uint32_t MAC_CSR_DATA;
/* Automatic Flow Control Configuration (offset 0xAC) */
__IO uint32_t AFC_CFG;
/* EEPROM Command (offset 0xB0) */
__IO uint32_t E2P_CMD;
/* EEPROM Data (offset 0xB4) */
__IO uint32_t E2P_DATA;
} SMSC9220_TypeDef;
#define HW_CFG_SRST BIT(0)
#define RX_STAT_PORT_PKT_LEN_Lsb 16
#define RX_STAT_PORT_PKT_LEN_Msb 29
#define PMT_CTRL_READY BIT(0)
#define RX_DP_CTRL_RX_FFWD BIT(31)
#define RX_FIFO_INF_RXSUSED_Lsb 16
#define RX_FIFO_INF_RXSUSED_Msb 23
#define RX_FIFO_INF_RXDUSED_Lsb 0
#define RX_FIFO_INF_RXDUSED_Msb 15
#define MAC_CSR_CMD_BUSY BIT(31)
#define MAC_CSR_CMD_READ BIT(30)
#define MAC_CSR_CMD_WRITE 0
/* SMSC9220 MAC Registers Indices */
#define SMSC9220_MAC_CR 0x1
#define SMSC9220_MAC_ADDRH 0x2
#define SMSC9220_MAC_ADDRL 0x3
#define SMSC9220_MAC_HASHH 0x4
#define SMSC9220_MAC_HASHL 0x5
#define SMSC9220_MAC_MII_ACC 0x6
#define SMSC9220_MAC_MII_DATA 0x7
#define SMSC9220_MAC_FLOW 0x8
#define SMSC9220_MAC_VLAN1 0x9
#define SMSC9220_MAC_VLAN2 0xA
#define SMSC9220_MAC_WUFF 0xB
#define SMSC9220_MAC_WUCSR 0xC
#define MAC_MII_ACC_MIIBZY BIT(0)
#define MAC_MII_ACC_WRITE BIT(1)
#define MAC_MII_ACC_READ 0
/* SMSC9220 PHY Registers Indices */
#define SMSC9220_PHY_BCONTROL 0
#define SMSC9220_PHY_BSTATUS 1
#define SMSC9220_PHY_ID1 2
#define SMSC9220_PHY_ID2 3
#define SMSC9220_PHY_ANEG_ADV 4
#define SMSC9220_PHY_ANEG_LPA 5
#define SMSC9220_PHY_ANEG_EXP 6
#define SMSC9220_PHY_MCONTROL 17
#define SMSC9220_PHY_MSTATUS 18
#define SMSC9220_PHY_CSINDICATE 27
#define SMSC9220_PHY_INTSRC 29
#define SMSC9220_PHY_INTMASK 30
#define SMSC9220_PHY_CS 31
#ifndef SMSC9220_BASE
#define SMSC9220_BASE DT_INST_REG_ADDR(0)
#endif
#define SMSC9220 ((volatile SMSC9220_TypeDef *)SMSC9220_BASE)
enum smsc9220_interrupt_source {
SMSC9220_INTERRUPT_GPIO0 = 0,
SMSC9220_INTERRUPT_GPIO1 = 1,
SMSC9220_INTERRUPT_GPIO2 = 2,
SMSC9220_INTERRUPT_RXSTATUS_FIFO_LEVEL = 3,
SMSC9220_INTERRUPT_RXSTATUS_FIFO_FULL = 4,
/* 5 Reserved according to Datasheet */
SMSC9220_INTERRUPT_RX_DROPPED_FRAME = 6,
SMSC9220_INTERRUPT_TXSTATUS_FIFO_LEVEL = 7,
SMSC9220_INTERRUPT_TXSTATUS_FIFO_FULL = 8,
SMSC9220_INTERRUPT_TXDATA_FIFO_AVAILABLE = 9,
SMSC9220_INTERRUPT_TXDATA_FIFO_OVERRUN = 10,
/* 11, 12 Reserved according to Datasheet */
SMSC9220_INTERRUPT_TRANSMIT_ERROR = 13,
SMSC9220_INTERRUPT_RECEIVE_ERROR = 14,
SMSC9220_INTERRUPT_RECEIVE_WATCHDOG_TIMEOUT = 15,
SMSC9220_INTERRUPT_TXSTATUS_OVERFLOW = 16,
SMSC9220_INTERRUPT_POWER_MANAGEMENT = 17,
SMSC9220_INTERRUPT_PHY = 18,
SMSC9220_INTERRUPT_GP_TIMER = 19,
SMSC9220_INTERRUPT_RX_DMA = 20,
SMSC9220_INTERRUPT_TX_IOC = 21,
/* 22 Reserved according to Datasheet*/
SMSC9220_INTERRUPT_RX_DROPPED_FRAME_HALF = 23,
SMSC9220_INTERRUPT_RX_STOPPED = 24,
SMSC9220_INTERRUPT_TX_STOPPED = 25,
/* 26 - 30 Reserved according to Datasheet*/
SMSC9220_INTERRUPT_SW = 31
};
#endif /* ZEPHYR_DRIVERS_ETHERNET_ETH_SMSC911X_PRIV_H_ */