This is an automated email from the ASF dual-hosted git repository. xiaoxiang pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/nuttx.git
The following commit(s) were added to refs/heads/master by this push: new 12486d21dc7 boards/arm/samv7/samv71-xult: Add support for the OA-TC6 10BASE-T1x MAC-PHYs 12486d21dc7 is described below commit 12486d21dc7e749e5730db14e68aabe5e52d8710 Author: michal matias <mich4l.mat...@gmail.com> AuthorDate: Mon Aug 25 03:37:22 2025 +0200 boards/arm/samv7/samv71-xult: Add support for the OA-TC6 10BASE-T1x MAC-PHYs Add support for the OA-TC6 10BASE-T1x driver to the SAMV71 Xplained ultra board. Signed-off-by: michal matias <mich4l.mat...@gmail.com> --- boards/arm/samv7/common/include/board_oa_tc6.h | 58 ++++++ .../arm/samv7/samv71-xult/configs/oa_tc6/defconfig | 94 +++++++++ boards/arm/samv7/samv71-xult/src/Make.defs | 4 + boards/arm/samv7/samv71-xult/src/sam_bringup.c | 12 ++ boards/arm/samv7/samv71-xult/src/sam_oa_tc6.c | 211 +++++++++++++++++++++ boards/arm/samv7/samv71-xult/src/sam_spi.c | 10 + 6 files changed, 389 insertions(+) diff --git a/boards/arm/samv7/common/include/board_oa_tc6.h b/boards/arm/samv7/common/include/board_oa_tc6.h new file mode 100644 index 00000000000..0d21f1bca05 --- /dev/null +++ b/boards/arm/samv7/common/include/board_oa_tc6.h @@ -0,0 +1,58 @@ +/**************************************************************************** + * boards/arm/samv7/common/include/board_oa_tc6.h + * + * SPDX-License-Identifier: Apache-2.0 + * + * 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 __BOARDS_ARM_SAMV7_COMMON_INCLUDE_BOARD_OA_TC6_H +#define __BOARDS_ARM_SAMV7_COMMON_INCLUDE_BOARD_OA_TC6_H + +#ifndef __ASSEMBLY__ + +#undef EXTERN +#if defined(__cplusplus) +#define EXTERN extern "C" +extern "C" +{ +#else +#define EXTERN extern +#endif + +/**************************************************************************** + * Public Function Prototypes + ****************************************************************************/ + +/**************************************************************************** + * Name: board_oa_tc6_initialize + * + * Description: + * Initialize and register the OA-TC6 10BASE-T1x network driver. + * + * Input Parameters: + * None + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure. + * + ****************************************************************************/ + +int board_oa_tc6_initialize(void); + +#endif /* __ASSEMBLY__ */ +#endif /* __BOARDS_ARM_SAMV7_COMMON_INCLUDE_BOARD_OA_TC6_H */ diff --git a/boards/arm/samv7/samv71-xult/configs/oa_tc6/defconfig b/boards/arm/samv7/samv71-xult/configs/oa_tc6/defconfig new file mode 100644 index 00000000000..a864074920e --- /dev/null +++ b/boards/arm/samv7/samv71-xult/configs/oa_tc6/defconfig @@ -0,0 +1,94 @@ +# +# This file is autogenerated: PLEASE DO NOT EDIT IT. +# +# You can use "make menuconfig" to make any modifications to the installed .config file. +# You can then do "make savedefconfig" to generate a new defconfig file that includes your +# modifications. +# +# CONFIG_ARCH_RAMFUNCS is not set +# CONFIG_MMCSD_MMCSUPPORT is not set +# CONFIG_MMCSD_SPI is not set +# CONFIG_NET_UDP_CHECKSUMS is not set +# CONFIG_SAMV7_UART0 is not set +# CONFIG_SAMV7_UART2 is not set +# CONFIG_SAMV7_UART4 is not set +CONFIG_ARCH="arm" +CONFIG_ARCH_BOARD="samv71-xult" +CONFIG_ARCH_BOARD_COMMON=y +CONFIG_ARCH_BOARD_SAMV71_XULT=y +CONFIG_ARCH_BUTTONS=y +CONFIG_ARCH_CHIP="samv7" +CONFIG_ARCH_CHIP_SAMV71=y +CONFIG_ARCH_CHIP_SAMV71Q21=y +CONFIG_ARCH_CHIP_SAMV71Q=y +CONFIG_ARCH_CHIP_SAMV7=y +CONFIG_ARCH_CHIP_SAMV7_MEM_FLASH=0x200000 +CONFIG_ARCH_CHIP_SAMV7_MEM_RAM=0x60000 +CONFIG_ARCH_INTERRUPTSTACK=2048 +CONFIG_ARCH_IRQBUTTONS=y +CONFIG_ARCH_STACKDUMP=y +CONFIG_ARMV7M_DCACHE=y +CONFIG_ARMV7M_ICACHE=y +CONFIG_BOARD_LOOPSPERMSEC=51262 +CONFIG_BUILTIN=y +CONFIG_FAT_LCNAMES=y +CONFIG_FAT_LFN=y +CONFIG_FS_FAT=y +CONFIG_FS_PROCFS=y +CONFIG_INIT_ENTRYPOINT="nsh_main" +CONFIG_LIBC_HOSTNAME="SAMV71-XULT" +CONFIG_LINE_MAX=64 +CONFIG_MMCSD_MULTIBLOCK_LIMIT=1 +CONFIG_MMCSD_SDIO=y +CONFIG_NET=y +CONFIG_NETDB_DNSCLIENT=y +CONFIG_NETDEV_HPWORK_THREAD=y +CONFIG_NETDEV_LATEINIT=y +CONFIG_NETDEV_PHY_IOCTL=y +CONFIG_NET_BROADCAST=y +CONFIG_NET_ICMP_SOCKET=y +CONFIG_NET_ICMPv6=y +CONFIG_NET_IPFRAG=y +CONFIG_NET_IPv6=y +CONFIG_NET_OA_TC6=y +CONFIG_NET_OA_TC6_LAN865X=y +CONFIG_NET_OA_TC6_NCV7410=y +CONFIG_NET_STATISTICS=y +CONFIG_NET_TCP=y +CONFIG_NET_TCP_DELAYED_ACK=y +CONFIG_NET_TCP_KEEPALIVE=y +CONFIG_NET_TCP_WRITE_BUFFERS=y +CONFIG_NET_UDP=y +CONFIG_NSH_ARCHINIT=y +CONFIG_NSH_BUILTIN_APPS=y +CONFIG_NSH_FILEIOSIZE=512 +CONFIG_NSH_READLINE=y +CONFIG_PREALLOC_TIMERS=4 +CONFIG_RAM_SIZE=393216 +CONFIG_RAM_START=0x20400000 +CONFIG_RAW_BINARY=y +CONFIG_RR_INTERVAL=200 +CONFIG_SAMV7_GPIOA_IRQ=y +CONFIG_SAMV7_GPIOB_IRQ=y +CONFIG_SAMV7_GPIOD_IRQ=y +CONFIG_SAMV7_GPIO_IRQ=y +CONFIG_SAMV7_HSMCI0=y +CONFIG_SAMV7_JTAG_FULL_SW_ENABLE=y +CONFIG_SAMV7_SPI0=y +CONFIG_SAMV7_SPI_DMA=y +CONFIG_SAMV7_SPI_DMATHRESHOLD=0 +CONFIG_SAMV7_TWIHS0=y +CONFIG_SAMV7_USART1=y +CONFIG_SAMV7_XDMAC=y +CONFIG_SCHED_HPWORK=y +CONFIG_SCHED_LPWORK=y +CONFIG_SCHED_WAITPID=y +CONFIG_SDIO_BLOCKSETUP=y +CONFIG_SPI_DELAY_CONTROL=y +CONFIG_START_DAY=10 +CONFIG_START_MONTH=3 +CONFIG_START_YEAR=2014 +CONFIG_SYSTEM_NSH=y +CONFIG_SYSTEM_PING6=y +CONFIG_SYSTEM_PING=y +CONFIG_USART1_SERIAL_CONSOLE=y diff --git a/boards/arm/samv7/samv71-xult/src/Make.defs b/boards/arm/samv7/samv71-xult/src/Make.defs index 15df7aea068..8ef5a489749 100644 --- a/boards/arm/samv7/samv71-xult/src/Make.defs +++ b/boards/arm/samv7/samv71-xult/src/Make.defs @@ -105,6 +105,10 @@ ifeq ($(CONFIG_LCD_ST7789),y) CSRCS += sam_st7789.c endif +ifeq ($(CONFIG_NET_OA_TC6),y) +CSRCS += sam_oa_tc6.c +endif + .PHONY = context distclean $(SCRIPTOUT): $(LDSCRIPT_TEMPLATE) $(CONFIGFILE) diff --git a/boards/arm/samv7/samv71-xult/src/sam_bringup.c b/boards/arm/samv7/samv71-xult/src/sam_bringup.c index 7053c515799..2a4dbffec98 100644 --- a/boards/arm/samv7/samv71-xult/src/sam_bringup.c +++ b/boards/arm/samv7/samv71-xult/src/sam_bringup.c @@ -94,6 +94,10 @@ # include "board_progmem.h" #endif +#ifdef CONFIG_NET_OA_TC6 +# include "board_oa_tc6.h" +#endif + /**************************************************************************** * Pre-processor Definitions ****************************************************************************/ @@ -566,6 +570,14 @@ int sam_bringup(void) # endif #endif +#ifdef CONFIG_NET_OA_TC6 + ret = board_oa_tc6_initialize(); + if (ret < 0) + { + syslog(LOG_ERR, "ERROR: board_oa_tc6_initialize() failed: %d\n", ret); + } +#endif + /* If we got here then perhaps not all initialization was successful, but * at least enough succeeded to bring-up NSH with perhaps reduced * capabilities. diff --git a/boards/arm/samv7/samv71-xult/src/sam_oa_tc6.c b/boards/arm/samv7/samv71-xult/src/sam_oa_tc6.c new file mode 100644 index 00000000000..0f338486e0f --- /dev/null +++ b/boards/arm/samv7/samv71-xult/src/sam_oa_tc6.c @@ -0,0 +1,211 @@ +/**************************************************************************** + * boards/arm/samv7/samv71-xult/src/sam_oa_tc6.c + * + * SPDX-License-Identifier: Apache-2.0 + * + * 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. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include <nuttx/config.h> + +#include <debug.h> + +#include <nuttx/spi/spi.h> +#include <nuttx/irq.h> +#include <nuttx/net/oa_tc6.h> + +#include "sam_spi.h" +#include "sam_gpio.h" + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +#define BOARD_OA_TC6_0_INT_PIN ( GPIO_INPUT | GPIO_CFG_PULLUP \ + | GPIO_INT_FALLING | GPIO_PORT_PIOA \ + | GPIO_PIN4) +#define BOARD_OA_TC6_0_IRQ SAM_IRQ_PA4 + +/**************************************************************************** + * Private Function Prototypes + ****************************************************************************/ + +static int board_oa_tc6_attach(FAR const struct oa_tc6_config_s *config, + xcpt_t handler, + FAR void *arg); + +static int board_oa_tc6_enable(FAR const struct oa_tc6_config_s *config, + bool enable); + +/**************************************************************************** + * Private Data + ****************************************************************************/ + +static const struct oa_tc6_config_s g_esp_oa_tc6_config = +{ + .id = SPIDEV_ETHERNET(0), + .frequency = 25000000, + .chunk_payload_size = 64, + .rx_cut_through = true, + .attach = board_oa_tc6_attach, + .enable = board_oa_tc6_enable, +}; + +/**************************************************************************** + * Private Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: board_oa_tc6_attach + * + * Description: + * Configure interrupt and attach handler to the interrupt signal + * from the MAC-PHY. + * + * Input Parameters: + * config - reference to the MAC-PHY configuration + * handler - the interrupt handler function + * arg - reference passed to the handler on invocation + * + * Returned Value: + * On success OK is returned, otherwise ERROR is returned. + * + ****************************************************************************/ + +static int board_oa_tc6_attach(FAR const struct oa_tc6_config_s *config, + xcpt_t handler, FAR void *arg) +{ + gpio_pinset_t pin; + int irq; + + switch (config->id) + { + case SPIDEV_ETHERNET(0): + pin = BOARD_OA_TC6_0_INT_PIN; + irq = BOARD_OA_TC6_0_IRQ; + break; + default: + + /* Unknown id */ + + DEBUGPANIC(); + return ERROR; + } + + sam_configgpio(pin); + sam_gpioirq(pin); + irq_attach(irq, handler, arg); + + return OK; +} + +/**************************************************************************** + * Name: board_oa_tc6_enable + * + * Description: + * Enable or disable the interrupt on the hardware level. + * Enable when the enable argument is true, otherwise disable. + * + * Input Parameters: + * config - reference to the MAC-PHY configuration + * enable - enable / disable control + * + * Returned Value: + * On success OK is returned, otherwise ERROR is returned. + * + ****************************************************************************/ + +static int board_oa_tc6_enable(FAR const struct oa_tc6_config_s *config, + bool enable) +{ + int irq; + + switch (config->id) + { + case SPIDEV_ETHERNET(0): + irq = BOARD_OA_TC6_0_IRQ; + break; + default: + + /* Unknown id */ + + DEBUGPANIC(); + return ERROR; + } + + if (enable) + { + sam_gpioirqenable(irq); + } + else + { + sam_gpioirqdisable(irq); + } + + return OK; +} + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: board_oa_tc6_initialize + * + * Description: + * Initialize and register the OA-TC6 10BASE-T1x network driver. + * + * Input Parameters: + * None + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure. + * + ****************************************************************************/ + +int board_oa_tc6_initialize(void) +{ + FAR struct spi_dev_s *spi; + int ret; + + spi = sam_spibus_initialize(SPI0_CS1); + if (!spi) + { + syslog(LOG_ERR, "ERROR: Failed to initialize SPI port %d\n", SPI0_CS1); + return -ENODEV; + } + + /* Bind the SPI port and config to the OA-TC6 driver */ + + ret = oa_tc6_initialize(spi, &g_esp_oa_tc6_config); + if (ret < 0) + { + syslog(LOG_ERR, + "ERROR: Failed to bind SPI port and config to the OA-TC6" + " network driver: %d\n", ret); + return ret; + } + + syslog(LOG_INFO, + "Bound SPI and config to the OA-TC6 network driver\n"); + + return OK; +} diff --git a/boards/arm/samv7/samv71-xult/src/sam_spi.c b/boards/arm/samv7/samv71-xult/src/sam_spi.c index 55404d56473..9d5feb189c8 100644 --- a/boards/arm/samv7/samv71-xult/src/sam_spi.c +++ b/boards/arm/samv7/samv71-xult/src/sam_spi.c @@ -84,6 +84,12 @@ void sam_spidev_initialize(void) sam_configgpio(GPIO_LCD_CD); #endif +#ifdef CONFIG_NET_OA_TC6 + /* Enable chip select for OA-TC6 MAC-PHY */ + + sam_configgpio(SPI0_NPCS1); +#endif + #endif /* CONFIG_SAMV7_SPI0_MASTER */ #ifdef CONFIG_SAMV7_SPI0_SLAVE @@ -183,6 +189,10 @@ void sam_spi0select(uint32_t devid, bool selected) sam_gpiowrite(SPI0_NPCS1, !selected); break; #endif +#ifdef CONFIG_NET_OA_TC6 + case SPIDEV_ETHERNET(0): + sam_gpiowrite(SPI0_NPCS1, !selected); +#endif default: break;