arch/arm64/src/imx9: Add Ethernet driver

This adds a driver for i.MX93 ENET1 MAC block

Signed-off-by: Jukka Laitinen <jukkax@ssrc.tii.ae>
This commit is contained in:
Jukka Laitinen
2024-05-02 16:20:36 +03:00
committed by Alan Carvalho de Assis
parent 9277be2503
commit cc9c3ed80b
7 changed files with 4180 additions and 0 deletions
+113
View File
@@ -316,6 +316,12 @@ endmenu # USB device controller driver (DCD) options
endif # IMX9_USBDEV endif # IMX9_USBDEV
config IMX9_ENET
bool "Ethernet"
default n
select ARCH_HAVE_PHY
select ARCH_HAVE_NETDEV_STATISTICS
config IMX9_GPIO_IRQ config IMX9_GPIO_IRQ
bool "GPIO Interrupt Support" bool "GPIO Interrupt Support"
default n default n
@@ -783,6 +789,113 @@ config IMX9_LPSPI8_DMA
endmenu # LPSPI Configuration endmenu # LPSPI Configuration
menu "Ethernet Configuration"
depends on IMX9_ENET
config IMX9_ENET1
bool "Ethernet MAC (non-QoS)"
depends on IMX9_ENET
default y
config IMX9_ENET_NRXBUFFERS
int "Number of Rx buffers"
default 6
config IMX9_ENET_NTXBUFFERS
int "Number of Tx buffers"
default 2
config IMX9_ENET_USE_OTP_MAC
bool "Use MAC address from OCOTP"
default n
depends on IMX9_ENET
config IMX9_ENET1_OTP_MAC_ADDR
hex "MAC address offset in OCOTP"
default 0x4ec
depends on IMX9_ENET_USE_OTP_MAC
config IMX9_ENET1_PROMISCUOUS
bool "Set promiscuous mode"
depends on IMX9_ENET1
default n
choice
prompt "i.MX9 ENET1 interface type"
default IMX9_ENET1_RMII
depends on IMX9_ENET1
config IMX9_ENET1_RMII
bool "RMII"
config IMX9_ENET1_RGMII
bool "RGMII"
endchoice
config IMX9_ENET1_PHY_AUTONEG
bool "ENET1 PHY autonegotiation enable"
default y
---help---
Enable PHY autonegotiation. If set to n, configure the speed
and duplex mode manually. Note that only disabling this doesn't
disable the autonegotiation completely; it just sets the MAC
speed and duplex, and disables autonegotiation advertisement
for other than the configured mode. To disable autonegotiation
completely, also set the FORCE_SPEED flag.
choice
prompt "Select ENET1 PHY link duplex mode"
default IMX9_ENET1_PHY_FD
depends on !IMX9_ENET1_PHY_AUTONEG
config IMX9_ENET1_PHY_FD
bool "Full Duplex"
config IMX9_ENET1_PHY_HD
bool "Half Duplex"
endchoice
choice
prompt "Select ENET1 PHY link speed"
default IMX9_ENET1_PHY_100MBPS if IMX9_ENET1_RMII
default IMX9_ENET1_PHY_1000MBPS if IMX9_ENET1_RGMII
depends on !IMX9_ENET1_PHY_AUTONEG
config IMX9_ENET1_PHY_10MBPS
bool "10 MBPS"
config IMX9_ENET1_PHY_100MBPS
bool "100 MBPS"
config IMX9_ENET1_PHY_1000MBPS
bool "1000 MBPS"
depends on IMX9_ENET1_RGMII
endchoice
config IMX9_ENET1_PHY_FORCE_SPEED
bool "Disable PHY autonegotiation and force speed and duplex"
depends on !IMX9_ENET1_PHY_AUTONEG
default n
---help---
This disables PHY autonegotiation completely. Note that
if the link partner has got autonegotiation enabled, the
duplex mode is not auto-detected by the link partner. Only
enable if you really know what you are doing!
config IMX9_ENET1_PHYINIT
bool "Board-specific PHY Initialization for ENET1"
default n
---help---
Some boards require specialized initialization of the PHY before it
can be used. This may include such things as configuring GPIOs,
resetting the PHY, etc. If CONFIG_IMX9_ENET_PHYINIT is defined in
the configuration then the board specific logic must provide
imx9_phy_boardinitialize(); The i.MX9 ENET driver will call this
function one time before it first uses the PHY.
endmenu # IMX9_ENET
endmenu # iMX Peripheral Selection endmenu # iMX Peripheral Selection
endif # ARCH_CHIP_IMX9 endif # ARCH_CHIP_IMX9
+4
View File
@@ -59,3 +59,7 @@ endif
ifeq ($(CONFIG_IMX9_DMA_ALLOC),y) ifeq ($(CONFIG_IMX9_DMA_ALLOC),y)
CHIP_CSRCS += imx9_dma_alloc.c CHIP_CSRCS += imx9_dma_alloc.c
endif endif
ifeq ($(CONFIG_IMX9_ENET),y)
CHIP_CSRCS += imx9_enet.c
endif
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+106
View File
@@ -0,0 +1,106 @@
/****************************************************************************
* arch/arm64/src/imx9/imx9_enet.h
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. The
* ASF licenses this file to you 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.
*
****************************************************************************/
#ifndef __ARCH_ARM64_SRC_IMX9_IMX9_ENET_H
#define __ARCH_ARM64_SRC_IMX9_IMX9_ENET_H
/****************************************************************************
* Included Files
****************************************************************************/
#include <nuttx/config.h>
#include "hardware/imx9_enet.h"
#ifdef CONFIG_IMX9_ENET
/****************************************************************************
* Pre-processor Definitions
****************************************************************************/
/* Definitions for use with imx9_phy_boardinitialize */
#define EMAC_INTF 0
/****************************************************************************
* Public Functions Prototypes
****************************************************************************/
#ifndef __ASSEMBLY__
#undef EXTERN
#if defined(__cplusplus)
#define EXTERN extern "C"
extern "C"
{
#else
#define EXTERN extern
#endif
/****************************************************************************
* Function: imx9_netinitialize
*
* Description:
* Initialize the Ethernet controller and driver
*
* Input Parameters:
* intf - In the case where there are multiple EMACs, this value
* identifies which EMAC is to be initialized.
*
* Returned Value:
* OK on success; Negated errno on failure.
*
* Assumptions:
*
****************************************************************************/
int imx9_netinitialize(int intf);
/****************************************************************************
* Function: imx9_phy_boardinitialize
*
* Description:
* Some boards require specialized initialization of the PHY before it can
* be used. This may include such things as configuring GPIOs, resetting
* the PHY, etc. If CONFIG_IMX9_ENET_PHYINIT is defined in the
* configuration then the board specific logic must provide
* imx9_phyinitialize(); The i.MX RT Ethernet driver will call this
* function one time before it first uses the PHY.
*
* Input Parameters:
* intf - Always zero for now.
*
* Returned Value:
* OK on success; Negated errno on failure.
*
****************************************************************************/
#ifdef CONFIG_IMX9_ENET_PHYINIT
int imx9_phy_boardinitialize(int intf);
#endif
#undef EXTERN
#if defined(__cplusplus)
}
#endif
#endif /* __ASSEMBLY__ */
#endif /* CONFIG_IMX9_ENET */
#endif /* __ARCH_ARM_SRC_IMX9_IMX9_ENET_H */
@@ -22,7 +22,10 @@ CONFIG_DEBUG_FULLOPT=y
CONFIG_DEBUG_SYMBOLS=y CONFIG_DEBUG_SYMBOLS=y
CONFIG_DEFAULT_TASK_STACKSIZE=8192 CONFIG_DEFAULT_TASK_STACKSIZE=8192
CONFIG_DEV_ZERO=y CONFIG_DEV_ZERO=y
CONFIG_ETH0_PHY_MULTI=y
CONFIG_EXAMPLES_HELLO=y CONFIG_EXAMPLES_HELLO=y
CONFIG_EXAMPLES_TCPBLASTER=y
CONFIG_EXAMPLES_UDPBLASTER=y
CONFIG_EXPERIMENTAL=y CONFIG_EXPERIMENTAL=y
CONFIG_FS_PROCFS=y CONFIG_FS_PROCFS=y
CONFIG_FS_ROMFS=y CONFIG_FS_ROMFS=y
@@ -35,6 +38,9 @@ CONFIG_IDLETHREAD_STACKSIZE=8192
CONFIG_IMX9_DMA_ALLOC=y CONFIG_IMX9_DMA_ALLOC=y
CONFIG_IMX9_DMA_ALLOC_POOL_SIZE=81920 CONFIG_IMX9_DMA_ALLOC_POOL_SIZE=81920
CONFIG_IMX9_EDMA=y CONFIG_IMX9_EDMA=y
CONFIG_IMX9_ENET1_RGMII=y
CONFIG_IMX9_ENET=y
CONFIG_IMX9_ENET_USE_OTP_MAC=y
CONFIG_IMX9_FLEXIO1_PWM=y CONFIG_IMX9_FLEXIO1_PWM=y
CONFIG_IMX9_GPIO_IRQ=y CONFIG_IMX9_GPIO_IRQ=y
CONFIG_IMX9_LPI2C1=y CONFIG_IMX9_LPI2C1=y
@@ -52,6 +58,14 @@ CONFIG_IMX9_USBDEV_USBC1=y
CONFIG_INIT_ENTRYPOINT="nsh_main" CONFIG_INIT_ENTRYPOINT="nsh_main"
CONFIG_INTELHEX_BINARY=y CONFIG_INTELHEX_BINARY=y
CONFIG_LPUART1_SERIAL_CONSOLE=y CONFIG_LPUART1_SERIAL_CONSOLE=y
CONFIG_NDEBUG=y
CONFIG_NET=y
CONFIG_NETDB_DNSCLIENT=y
CONFIG_NETDEV_PHY_IOCTL=y
CONFIG_NET_ICMP=y
CONFIG_NET_ICMP_SOCKET=y
CONFIG_NET_TCP=y
CONFIG_NET_UDP=y
CONFIG_NSH_ARCHINIT=y CONFIG_NSH_ARCHINIT=y
CONFIG_NSH_BUILTIN_APPS=y CONFIG_NSH_BUILTIN_APPS=y
CONFIG_NSH_FILEIOSIZE=512 CONFIG_NSH_FILEIOSIZE=512
@@ -78,6 +92,7 @@ CONFIG_SYMTAB_ORDEREDBYNAME=y
CONFIG_SYSTEM_CDCACM=y CONFIG_SYSTEM_CDCACM=y
CONFIG_SYSTEM_I2CTOOL=y CONFIG_SYSTEM_I2CTOOL=y
CONFIG_SYSTEM_NSH=y CONFIG_SYSTEM_NSH=y
CONFIG_SYSTEM_PING=y
CONFIG_SYSTEM_SPITOOL=y CONFIG_SYSTEM_SPITOOL=y
CONFIG_SYSTEM_SYSTEM=y CONFIG_SYSTEM_SYSTEM=y
CONFIG_SYSTEM_TIME64=y CONFIG_SYSTEM_TIME64=y
@@ -26,6 +26,8 @@
****************************************************************************/ ****************************************************************************/
#include <nuttx/config.h> #include <nuttx/config.h>
#include <nuttx/net/mii.h>
#include <nuttx/net/gmii.h>
/**************************************************************************** /****************************************************************************
* Pre-processor Definitions * Pre-processor Definitions
@@ -121,6 +123,85 @@
PFD_CFG(IMX9_SYSPLL_BASE, 2, PFD_PARMS(6, 2, true)), \ PFD_CFG(IMX9_SYSPLL_BASE, 2, PFD_PARMS(6, 2, true)), \
} }
/* Ethernet configuration */
#define BOARD_ENET1_PHY_LIST \
{ \
{ \
.name = GMII_RTL8211F_NAME, \
.id1 = GMII_PHYID1_RTL8211F, \
.id2 = GMII_PHYID2_RTL8211F, \
.status = GMII_RTL8211F_PHYSR_A43, \
.address_lo = 2, \
.address_high = 0xffff, \
.mbps10 = GMII_RTL8211F_PHYSR_10MBPS, \
.mbps100 = GMII_RTL8211F_PHYSR_100MBPS, \
.duplex = GMII_RTL8211F_PHYSR_DUPLEX, \
.clause = 22, \
.mbps1000 = GMII_RTL8211F_PHYSR_1000MBPS, \
.speed_mask = GMII_RTL8211F_PHYSR_SPEED_MASK, \
}, \
}
#endif /* CONFIG_IMX9_ENET1 */
#ifdef CONFIG_IMX9_ENET1
#define MUX_ENET1_MDIO IOMUX_CFG(IOMUXC_PAD_ENET2_MDIO_ENET1_MDIO, IOMUXC_PAD_FSEL_FAST | IOMUXC_PAD_DSE_X6, IOMUXC_MUX_SION_ON)
#define MUX_ENET1_MDC IOMUX_CFG(IOMUXC_PAD_ENET2_MDC_ENET1_MDC, IOMUXC_PAD_FSEL_FAST | IOMUXC_PAD_DSE_X6, 0)
#define MUX_ENET1_RX_DATA00 IOMUX_CFG(IOMUXC_PAD_ENET2_RD0_ENET1_RGMII_RD0, 0, 0)
#define MUX_ENET1_RX_DATA01 IOMUX_CFG(IOMUXC_PAD_ENET2_RD1_ENET1_RGMII_RD1, 0, 0)
#define MUX_ENET1_TX_DATA00 IOMUX_CFG(IOMUXC_PAD_ENET2_TD0_ENET1_RGMII_TD0, IOMUXC_PAD_FSEL_FAST | IOMUXC_PAD_DSE_X6, 0)
#define MUX_ENET1_TX_DATA01 IOMUX_CFG(IOMUXC_PAD_ENET2_TD1_ENET1_RGMII_TD1, IOMUXC_PAD_FSEL_FAST | IOMUXC_PAD_DSE_X6, 0)
#if defined(CONFIG_IMX9_ENET1_RGMII)
# define MUX_ENET1_RX_DATA02 IOMUX_CFG(IOMUXC_PAD_ENET2_RD2_ENET1_RGMII_RD2, 0, 0)
# define MUX_ENET1_RX_DATA03 IOMUX_CFG(IOMUXC_PAD_ENET2_RD3_ENET1_RGMII_RD3, 0, 0)
# define MUX_ENET1_TX_DATA02 IOMUX_CFG(IOMUXC_PAD_ENET2_TD2_ENET1_RGMII_TD2, IOMUXC_PAD_FSEL_FAST | IOMUXC_PAD_DSE_X6, 0)
# define MUX_ENET1_TX_DATA03 IOMUX_CFG(IOMUXC_PAD_ENET2_TD3_ENET1_RGMII_TD3, IOMUXC_PAD_FSEL_FAST | IOMUXC_PAD_DSE_X6, 0)
# define MUX_ENET1_RXC IOMUX_CFG(IOMUXC_PAD_ENET2_RXC_ENET1_RGMII_RXC, 0, 0)
# define MUX_ENET1_TX_CTL IOMUX_CFG(IOMUXC_PAD_ENET2_TX_CTL_ENET1_RGMII_TX_CTL, IOMUXC_PAD_FSEL_FAST | IOMUXC_PAD_DSE_X6, 0)
# define MUX_ENET1_RX_CTL IOMUX_CFG(IOMUXC_PAD_ENET2_RX_CTL_ENET1_RGMII_RX_CTL, 0, 0)
#elif defined(CONFIG_IMX9_ENET1_RMII)
/* Same pin as TX_CTL for RGMII */
# define MUX_ENET1_TX_EN IOMUX_CFG(IOMUXC_PAD_ENET2_TX_CTL_ENET1_RGMII_TX_CTL, IOMUXC_PAD_FSEL_FAST | IOMUXC_PAD_DSE_X6, 0)
/* Same pin as TX_DATA02 for RGMII */
# define MUX_ENET1_REF_CLK IOMUX_CFG(IOMUXC_PAD_ENET2_TD2_ENET1_RGMII_TD2, IOMUXC_PAD_FSEL_FAST | IOMUXC_PAD_DSE_X6, 0)
/* Same pin as RX_CTL for RGMII */
# define MUX_ENET1_CRS_DV IOMUX_CFG(IOMUXC_PAD_ENET2_RX_CTL_ENET1_RGMII_RX_CTL, 0, 0)
#else
#error ENET1 supports only RMII and RGMII
#endif
#define BOARD_ENET1_PHY_LIST \
{ \
{ \
GMII_RTL8211F_NAME, \
GMII_PHYID1_RTL8211F, \
GMII_PHYID2_RTL8211F, \
GMII_RTL8211F_PHYSR_A43, \
2, \
0xffff, \
GMII_RTL8211F_PHYSR_10MBPS, \
GMII_RTL8211F_PHYSR_100MBPS, \
GMII_RTL8211F_PHYSR_DUPLEX, \
22, \
GMII_RTL8211F_PHYSR_1000MBPS, \
GMII_RTL8211F_PHYSR_SPEED_MASK, \
}, \
}
/**************************************************************************** /****************************************************************************
* Public Data * Public Data
****************************************************************************/ ****************************************************************************/