Browse Source

drivers: ethernet: support for numaker m55m1x series

Add support for Nuvoton numaker m55m1x series EMAC controller.
Also include NOCACHE_MEMORY allocation.
Support to generate random mac address and remove emac data flash.

Signed-off-by: cyliang tw <cyliang@nuvoton.com>
pull/88436/head
cyliang tw 3 months ago committed by Benjamin Cabé
parent
commit
ea1129ee1a
  1. 16
      boards/nuvoton/numaker_m55m1/Kconfig.defconfig
  2. 19
      boards/nuvoton/numaker_m55m1/numaker_m55m1-pinctrl.dtsi
  3. 6
      boards/nuvoton/numaker_m55m1/numaker_m55m1.dts
  4. 3
      doc/releases/migration-guide-4.2.rst
  5. 1
      drivers/ethernet/Kconfig.numaker
  6. 53
      drivers/ethernet/eth_numaker.c
  7. 5
      drivers/ethernet/eth_numaker_priv.h
  8. 10
      dts/arm/nuvoton/m55m1x.dtsi
  9. 2
      west.yml

16
boards/nuvoton/numaker_m55m1/Kconfig.defconfig

@ -0,0 +1,16 @@ @@ -0,0 +1,16 @@
# SPDX-License-Identifier: Apache-2.0
#
# Nuvoton NuMaker M55M1 board configuration
#
# Copyright (c) 2025 Nuvoton Technology Corporation.
if BOARD_NUMAKER_M55M1
if NETWORKING
config NET_L2_ETHERNET
default y if !MODEM
endif # NETWORKING
endif # BOARD_NUMAKER_M55M1

19
boards/nuvoton/numaker_m55m1/numaker_m55m1-pinctrl.dtsi

@ -24,4 +24,23 @@ @@ -24,4 +24,23 @@
<PC9MFP_GPIO>;
};
};
/* EMAC multi-function pins for MDIO, TX, REFCLK, RX pins */
emac_default: emac_default {
group0 {
pinmux = <PE8MFP_EMAC0_RMII_MDC>,
<PE9MFP_EMAC0_RMII_MDIO>,
<PC8MFP_EMAC0_RMII_REFCLK>,
<PC7MFP_EMAC0_RMII_RXD0>,
<PC6MFP_EMAC0_RMII_RXD1>,
<PA7MFP_EMAC0_RMII_CRSDV>,
<PA6MFP_EMAC0_RMII_RXERR>;
};
group1 {
pinmux = <PE10MFP_EMAC0_RMII_TXD0>,
<PE11MFP_EMAC0_RMII_TXD1>,
<PE12MFP_EMAC0_RMII_TXEN>;
slew-rate = "fast";
};
};
};

6
boards/nuvoton/numaker_m55m1/numaker_m55m1.dts

@ -86,3 +86,9 @@ @@ -86,3 +86,9 @@
pinctrl-names = "default";
status = "okay";
};
&emac {
pinctrl-0 = <&emac_default>;
pinctrl-names = "default";
status = "okay";
};

3
doc/releases/migration-guide-4.2.rst

@ -133,6 +133,9 @@ Ethernet @@ -133,6 +133,9 @@ Ethernet
kconfig options: :kconfig:option:`CONFIG_ETH_NATIVE_POSIX` and its related options have been
deprecated in favor of :kconfig:option:`CONFIG_ETH_NATIVE_TAP` (:github:`86578`).
* NuMaker Ethernet driver ``eth_numaker.c`` now supports ``gen_random_mac``,
and the EMAC data flash feature has been removed (:github:`87953`).
Enhanced Serial Peripheral Interface (eSPI)
===========================================

1
drivers/ethernet/Kconfig.numaker

@ -9,6 +9,7 @@ config ETH_NUMAKER @@ -9,6 +9,7 @@ config ETH_NUMAKER
select HAS_NUMAKER_ETH
select PINCTRL
depends on DT_HAS_NUVOTON_NUMAKER_ETHERNET_ENABLED
select NOCACHE_MEMORY if ARCH_HAS_NOCACHE_MEMORY_SUPPORT
help
This option enables the Ethernet driver for Nuvoton NuMaker family of
processors.

53
drivers/ethernet/eth_numaker.c

@ -21,22 +21,31 @@ @@ -21,22 +21,31 @@
#ifdef CONFIG_SOC_M467
#include <m460_eth.h>
#else
#include <numaker_eth.h>
#endif
LOG_MODULE_REGISTER(eth_numaker, CONFIG_ETHERNET_LOG_LEVEL);
/* Device EMAC Interface port */
#define NUMAKER_GMAC_INTF 0
/* 2KB Data Flash at 0xFF800 */
#define NUMAKER_DATA_FLASH (0xFF800U)
#define NUMAKER_MASK_32 (0xFFFFFFFFU)
#define NUMAKER_MII_CONFIG (ADVERTISE_CSMA | ADVERTISE_10HALF | ADVERTISE_10FULL | \
ADVERTISE_100HALF | ADVERTISE_100FULL)
#define NUMAKER_MII_LINKED (BMSR_ANEGCOMPLETE | BMSR_LSTATUS)
extern synopGMACdevice GMACdev[GMAC_CNT];
#ifdef CONFIG_NOCACHE_MEMORY
DmaDesc tx_desc[GMAC_CNT][TRANSMIT_DESC_SIZE] __nocache __aligned(64);
DmaDesc rx_desc[GMAC_CNT][RECEIVE_DESC_SIZE] __nocache __aligned(64);
struct sk_buff tx_buf[GMAC_CNT][TRANSMIT_DESC_SIZE] __nocache __aligned(64);
struct sk_buff rx_buf[GMAC_CNT][RECEIVE_DESC_SIZE] __nocache __aligned(64);
#else
extern struct sk_buff tx_buf[GMAC_CNT][TRANSMIT_DESC_SIZE];
extern struct sk_buff rx_buf[GMAC_CNT][RECEIVE_DESC_SIZE];
#endif
static uint32_t eth_phy_addr;
@ -167,33 +176,31 @@ static int reset_phy(synopGMACdevice *gmacdev) @@ -167,33 +176,31 @@ static int reset_phy(synopGMACdevice *gmacdev)
static void m_numaker_read_mac_addr(char *mac)
{
#if DT_INST_PROP(0, zephyr_random_mac_address)
gen_random_mac(mac, NUMAKER_OUI_B0, NUMAKER_OUI_B1, NUMAKER_OUI_B2);
#else
uint32_t uid1;
/* Fetch word 0 of data flash */
uint32_t word0 = *(uint32_t *)(NUMAKER_DATA_FLASH + 0x04U);
uint32_t word0;
/*
* Fetch word 1 of data flash
* we only want bottom 16 bits of word1 (MAC bits 32-47)
* and bit 9 forced to 1, bit 8 forced to 0
* Locally administered MAC, reduced conflicts
* http://en.wikipedia.org/wiki/MAC_address
*/
uint32_t word1 = *(uint32_t *)NUMAKER_DATA_FLASH;
/* Not burn any mac address at the beginning of data flash */
if (word0 == NUMAKER_MASK_32) {
/* Generate a semi-unique MAC address from the UUID */
SYS_UnlockReg();
/* Enable FMC ISP function */
FMC_Open();
uid1 = FMC_ReadUID(1);
word1 = (uid1 & 0x003FFFFF) | ((uid1 & 0x030000) << 6) >> 8;
word0 = ((FMC_ReadUID(0) >> 4) << 20) | ((uid1 & 0xFF) << 12) |
(FMC_ReadUID(2) & 0xFFF);
/* Disable FMC ISP function */
FMC_Close();
/* Lock protected registers */
SYS_LockReg();
}
uint32_t word1;
/* Generate a semi-unique MAC address from the UUID */
SYS_UnlockReg();
/* Enable FMC ISP function */
FMC_Open();
uid1 = FMC_ReadUID(1);
word1 = (uid1 & 0x003FFFFF) | ((uid1 & 0x030000) << 6) >> 8;
word0 = ((FMC_ReadUID(0) >> 4) << 20) | ((uid1 & 0xFF) << 12) |
(FMC_ReadUID(2) & 0xFFF);
/* Disable FMC ISP function */
FMC_Close();
/* Lock protected registers */
SYS_LockReg();
word1 |= 0x00000200;
word1 &= 0x0000FEFF;
@ -204,7 +211,7 @@ static void m_numaker_read_mac_addr(char *mac) @@ -204,7 +211,7 @@ static void m_numaker_read_mac_addr(char *mac)
mac[3] = (word0 & 0x00ff0000) >> 16;
mac[4] = (word0 & 0x0000ff00) >> 8;
mac[5] = (word0 & 0x000000ff);
#endif
LOG_INF("mac address %02x:%02x:%02x:%02x:%02x:%02x", mac[0], mac[1], mac[2], mac[3],
mac[4], mac[5]);
}

5
drivers/ethernet/eth_numaker_priv.h

@ -15,4 +15,9 @@ @@ -15,4 +15,9 @@
#define NU_ETH_MTU_SIZE 1500
/* NuMaker chip's OUI*/
#define NUMAKER_OUI_B0 0xDA
#define NUMAKER_OUI_B1 0x00
#define NUMAKER_OUI_B2 0x53
#endif /* ZEPHYR_DRIVERS_ETHERNET_ETH_NUMAKER_PRIV_H_ */

10
dts/arm/nuvoton/m55m1x.dtsi

@ -335,6 +335,16 @@ @@ -335,6 +335,16 @@
#size-cells = <0>;
status = "disabled";
};
emac: ethernet@40208000 {
compatible = "nuvoton,numaker-ethernet";
reg = <0x40208000 0x2000>;
interrupts = <63 0>;
resets = <&rst NUMAKER_SYS_EMAC0RST>;
phy-addr = <0>;
clocks = <&pcc NUMAKER_EMAC0_MODULE 0 0>;
status = "disabled";
};
};
};

2
west.yml

@ -198,7 +198,7 @@ manifest: @@ -198,7 +198,7 @@ manifest:
groups:
- hal
- name: hal_nuvoton
revision: 8eec051270fe45c3f9a1a12de60220e1ab26b579
revision: be1042dc8a96ebe9ea4c5d714f07c617539106d6
path: modules/hal/nuvoton
groups:
- hal

Loading…
Cancel
Save