From e7f51e1e801454672b02bc1cd96488bf6120bd8a Mon Sep 17 00:00:00 2001 From: Matteo Golin Date: Sat, 19 Oct 2024 00:28:07 -0400 Subject: [PATCH] board support: added support for the Seeed Studio XIAO SAMD21 board --- .../samd2l2/boards/xiao-seeeduino/index.rst | 138 ++++++ .../xiao-seeeduino/seeed-xiao-samd21.jpg | Bin 0 -> 35775 bytes boards/Kconfig | 13 + boards/arm/samd2l2/xiao-seeeduino/Kconfig | 12 + .../xiao-seeeduino/configs/nsh/defconfig | 59 +++ .../samd2l2/xiao-seeeduino/include/board.h | 410 ++++++++++++++++++ .../samd2l2/xiao-seeeduino/scripts/Make.defs | 39 ++ .../samd2l2/xiao-seeeduino/scripts/flash.ld | 112 +++++ .../arm/samd2l2/xiao-seeeduino/src/Makefile | 33 ++ .../samd2l2/xiao-seeeduino/src/sam_appinit.c | 71 +++ .../samd2l2/xiao-seeeduino/src/sam_autoleds.c | 142 ++++++ .../arm/samd2l2/xiao-seeeduino/src/sam_boot.c | 64 +++ .../xiao-seeeduino/src/xiao-seeeduino.h | 89 ++++ 13 files changed, 1182 insertions(+) create mode 100644 Documentation/platforms/arm/samd2l2/boards/xiao-seeeduino/index.rst create mode 100644 Documentation/platforms/arm/samd2l2/boards/xiao-seeeduino/seeed-xiao-samd21.jpg create mode 100644 boards/arm/samd2l2/xiao-seeeduino/Kconfig create mode 100644 boards/arm/samd2l2/xiao-seeeduino/configs/nsh/defconfig create mode 100644 boards/arm/samd2l2/xiao-seeeduino/include/board.h create mode 100644 boards/arm/samd2l2/xiao-seeeduino/scripts/Make.defs create mode 100644 boards/arm/samd2l2/xiao-seeeduino/scripts/flash.ld create mode 100644 boards/arm/samd2l2/xiao-seeeduino/src/Makefile create mode 100644 boards/arm/samd2l2/xiao-seeeduino/src/sam_appinit.c create mode 100644 boards/arm/samd2l2/xiao-seeeduino/src/sam_autoleds.c create mode 100644 boards/arm/samd2l2/xiao-seeeduino/src/sam_boot.c create mode 100644 boards/arm/samd2l2/xiao-seeeduino/src/xiao-seeeduino.h diff --git a/Documentation/platforms/arm/samd2l2/boards/xiao-seeeduino/index.rst b/Documentation/platforms/arm/samd2l2/boards/xiao-seeeduino/index.rst new file mode 100644 index 0000000000000..5c35151b2a3c8 --- /dev/null +++ b/Documentation/platforms/arm/samd2l2/boards/xiao-seeeduino/index.rst @@ -0,0 +1,138 @@ +======================== +Seeed Studio Xiao SAMD21 +======================== + +The `Seeed Studio Xiao SAM21 `_ is the first of the XIAO family, and is a +general purpose, low-power and tiny board. It can be referred to as the "Seeed Studio Xiao SAMD21" or the "Xiao +Seeeduino". + +.. figure:: seeed-xiao-samd21.jpg + :align: center + +Features +======== + +* ATSAMD21G18A-MU microcontroller chip @48MHz +* 256KB flash +* 32KB SRAM +* 14 pins (11 analog, 11 digital) +* 10 PWM interfaces +* 1 DAC output pin +* Serial wire debug interface +* 1 I2C interface +* 1 SPI interface +* 1 UART interface +* USBC interface +* Serial communication indicator LEDs for TX and RX (blue) +* Power indicator LED (green) +* Blinkable LED (yellow) + +Serial Console +============== + +By default, the serial console appears on the board's UART interface. Pin 9 is +TX and pin 7 is RX. + +Pin Mapping +=========== + +Pins are numbered anticlockwise from the USB connector. + +===== ======== ======================================== +Pin Signal Notes +===== ======== ======================================== +0 PA2 A0/D0/DAC +1 PA4 A1/D1 +2 PA10 A2/D2 +3 PA11 A3/D3 +4 PA8 A4/D4/SDA (I2C) +5 PA9 A5/D5/SCL (I2C) +6 PB08 A6/D6/TX (UART) +7 PB09 A7/D7/RX (UART) +8 PA7 A8/D8/SCK (SPI) +9 PA5 A9/D9/MISO (SPI) +10 PA6 A10/D10/MOSI (SPI) +11 3V3 +12 GND +13 5V You can supply 5V power on this pin too. +===== ======== ======================================== + +There are also four pads on the back side of the board. SWCLK, SWDIO for serial +wire debugging, and RST and GND for resetting the board. These same two pins are +also exposed on the top of the board. + +Power Supply +============ + +The board can be powered through a USB-C connection. It can also be supplied 5V +power through it's 5V power pin. + +There is an additional two pads for powering the board (VIN and GND) on the back +side. The board accepts anywhere between 3.3V and 5V. + +Installation +============ + +To build NuttX for the Xiao Seeduino, you can use the following configuration +commands within the cloned ``nuttx`` repository: + +.. code-block:: console + + $ ./tools/configure.sh xiao-seeeduino:nsh + $ make + +This will generate a ``nuttx.hex`` file. To put the program on your board, you +can choose from one of the following: + +1. Convert the hex file to a uf2 file using the `Microsoft uf2 tool `_: + + .. code-block:: console + + $ git clone https://github.com/microsoft/uf2.git + $ cd uf2/utils + $ python uf2conv.py -f 0x68ed2b88 -b 0x2000 nuttx.hex -o nuttx.uf2 + + Then, plug your board into the host computer using the USB-C interface. Short + the RST (reset) pad with ground twice in a row quickly. The board will be + detected as mass storage under the name "Arduino", and its orange LED will be + pulsing slowly. You can then copy the UF2 file to the drive/storage device + which appears. Once the file is done copying, the board will auto-eject and + you will have an NSH console on the UART pins! + + .. todo:: + Maybe this process should be part of the post-build scripts, since the + Microsoft UF2 tools is MIT licensed. + +2. Flash the hex file using the ``bossac`` tool. You can find the source for it + `here `_, or you can install it on Arch + Linux via the AUR with this command: + + .. code-block:: console + + $ yay -S bossa + + Then, plug your Seeduino in via USB-C to the host computer and short the RST + (reset) and ground pins twice in a row quickly. The board will be detected as + mass storage under the name "Arduino", and its orange LED should be pulsing. + You can then run the following command: + + .. code-block:: console + + $ sudo stty -F 1200 + $ sudo bossac -i -d --port= -i -w -v nuttx.hex -R + + .. todo:: + The ``bossac`` utility doesn't actually work for programming in my testing + yet. It is what the Arduino IDE uses but I haven't managed to get the + commmand line working. Using the commands listed above does actually + detect the board but the programming itself fails with "Flash command + failed". This needs more debugging. + +Configurations +============== + +nsh +--- + +Basic NuttShell configuration with the console enabled on the UART interface at +115200 bps. Comes with "Hello world" demo. diff --git a/Documentation/platforms/arm/samd2l2/boards/xiao-seeeduino/seeed-xiao-samd21.jpg b/Documentation/platforms/arm/samd2l2/boards/xiao-seeeduino/seeed-xiao-samd21.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c0e6a12b1a997527715a9c9a1e0ce205708688c6 GIT binary patch literal 35775 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 literal 0 HcmV?d00001 diff --git a/boards/Kconfig b/boards/Kconfig index e98058c9e6a65..c123b7729c3d9 100644 --- a/boards/Kconfig +++ b/boards/Kconfig @@ -2329,6 +2329,15 @@ config ARCH_BOARD_SAMD21_XPLAINED This board features the ATSAMD21J18A MCU (Cortex-M0+ with 256KB of FLASH and 32KB of SRAM). +config ARCH_BOARD_XIAO_SEEEDUINO + bool "Seeed Studio XIAO SAMD21" + depends on ARCH_CHIP_SAMD21J18A + select ARCH_HAVE_LEDS + ---help--- + The port of NuttX to the Seeed Studio XIAO SAMD21 board. + This board features the ATSAMD21J18A MCU (Cortex-M0+ with 256KB of FLASH + and 32KB of SRAM) in a tiny footprint. + config ARCH_BOARD_SAME54_XPLAINED_PRO bool "Atmel SAME54-Xplained Pro development board" depends on ARCH_CHIP_SAME54P20 @@ -3467,6 +3476,7 @@ config ARCH_BOARD default "sama5d4-ek" if ARCH_BOARD_SAMA5D4_EK default "samd20-xplained" if ARCH_BOARD_SAMD20_XPLAINED default "samd21-xplained" if ARCH_BOARD_SAMD21_XPLAINED + default "xiao-seeeduino" if ARCH_BOARD_XIAO_SEEEDUINO default "same54-xplained-pro" if ARCH_BOARD_SAME54_XPLAINED_PRO default "saml21-xplained" if ARCH_BOARD_SAML21_XPLAINED default "sam3u-ek" if ARCH_BOARD_SAM3UEK @@ -3945,6 +3955,9 @@ endif if ARCH_BOARD_SAMD21_XPLAINED source "boards/arm/samd2l2/samd21-xplained/Kconfig" endif +if ARCH_BOARD_XIAO_SEEEDUINO +source "boards/arm/samd2l2/xiao-seeeduino/Kconfig" +endif if ARCH_BOARD_SAME54_XPLAINED_PRO source "boards/arm/samd5e5/same54-xplained-pro/Kconfig" endif diff --git a/boards/arm/samd2l2/xiao-seeeduino/Kconfig b/boards/arm/samd2l2/xiao-seeeduino/Kconfig new file mode 100644 index 0000000000000..2d9fa0fa92197 --- /dev/null +++ b/boards/arm/samd2l2/xiao-seeeduino/Kconfig @@ -0,0 +1,12 @@ +# +# For a description of the syntax of this configuration file, +# see the file kconfig-language.txt in the NuttX tools repository. +# + +if ARCH_BOARD_XIAO_SEEEDUINO + +menu "XIAO Seeeduino" + +endmenu # XIAO Seeeduino + +endif # ARCH_BOARD_XIAO_SEEEDUINO diff --git a/boards/arm/samd2l2/xiao-seeeduino/configs/nsh/defconfig b/boards/arm/samd2l2/xiao-seeeduino/configs/nsh/defconfig new file mode 100644 index 0000000000000..e961f34749069 --- /dev/null +++ b/boards/arm/samd2l2/xiao-seeeduino/configs/nsh/defconfig @@ -0,0 +1,59 @@ +# +# 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_DISABLE_POSIX_TIMERS is not set +# CONFIG_NSH_DISABLEBG is not set +# CONFIG_NSH_DISABLESCRIPT is not set +# CONFIG_NSH_DISABLE_CMP is not set +# CONFIG_NSH_DISABLE_DD is not set +# CONFIG_NSH_DISABLE_EXEC is not set +# CONFIG_NSH_DISABLE_EXIT is not set +# CONFIG_NSH_DISABLE_GET is not set +# CONFIG_NSH_DISABLE_HEXDUMP is not set +# CONFIG_NSH_DISABLE_IFCONFIG is not set +# CONFIG_NSH_DISABLE_ITEF is not set +# CONFIG_NSH_DISABLE_LOOPS is not set +# CONFIG_NSH_DISABLE_LOSETUP is not set +# CONFIG_NSH_DISABLE_MKRD is not set +# CONFIG_NSH_DISABLE_PS is not set +# CONFIG_NSH_DISABLE_PUT is not set +# CONFIG_NSH_DISABLE_SEMICOLON is not set +# CONFIG_NSH_DISABLE_UNAME is not set +# CONFIG_NSH_DISABLE_WGET is not set +# CONFIG_NSH_DISABLE_XD is not set +CONFIG_ARCH="arm" +CONFIG_ARCH_BOARD="xiao-seeeduino" +CONFIG_ARCH_BOARD_XIAO_SEEEDUINO=y +CONFIG_ARCH_CHIP="samd2l2" +CONFIG_ARCH_CHIP_SAMD21J18A=y +CONFIG_ARCH_CHIP_SAMD2X=y +CONFIG_ARCH_STACKDUMP=y +CONFIG_BOARD_LOOPSPERMSEC=3410 +CONFIG_BUILTIN=y +CONFIG_DEFAULT_SMALL=y +CONFIG_EXAMPLES_HELLO=y +CONFIG_HAVE_CXX=y +CONFIG_HAVE_CXXINITIALIZE=y +CONFIG_INIT_ENTRYPOINT="nsh_main" +CONFIG_INIT_STACKSIZE=1536 +CONFIG_INTELHEX_BINARY=y +CONFIG_NSH_BUILTIN_APPS=y +CONFIG_POSIX_SPAWN_DEFAULT_STACKSIZE=1536 +CONFIG_PTHREAD_STACK_DEFAULT=1536 +CONFIG_RAM_SIZE=32768 +CONFIG_RAM_START=0x20000000 +CONFIG_RR_INTERVAL=200 +CONFIG_SAMD2L2_SERCOM4=y +CONFIG_SCHED_WAITPID=y +CONFIG_START_DAY=18 +CONFIG_START_MONTH=10 +CONFIG_START_YEAR=2024 +CONFIG_SYSTEM_NSH=y +CONFIG_TASK_NAME_SIZE=0 +CONFIG_USART4_RXBUFSIZE=64 +CONFIG_USART4_SERIAL_CONSOLE=y +CONFIG_USART4_TXBUFSIZE=64 diff --git a/boards/arm/samd2l2/xiao-seeeduino/include/board.h b/boards/arm/samd2l2/xiao-seeeduino/include/board.h new file mode 100644 index 0000000000000..961bf6a0e5101 --- /dev/null +++ b/boards/arm/samd2l2/xiao-seeeduino/include/board.h @@ -0,0 +1,410 @@ +/**************************************************************************** + * boards/arm/samd2l2/xiao-seeeduino/include/board.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 __BOARDS_ARM_SAMD2L2_XIAO_SEEEDUINO_INCLUDE_BOARD_H +#define __BOARDS_ARM_SAMD2L2_XIAO_SEEEDUINO_INCLUDE_BOARD_H + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#ifndef __ASSEMBLY__ +# include +# ifdef CONFIG_SAMD2L2_GPIOIRQ +# include +# endif +#endif + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +/* Clocking *****************************************************************/ + +/* Overview + * + * OSC8M Output = 8MHz + * `- GCLK1 Input = 8MHz Prescaler = 1 output = 8MHz + * `- DFLL Input = 8MHz Multiplier = 6 output = 48MHz + * `- GCLK0 Input = 48MHz Prescaler = 1 output = 48MHz + * `- PM Input = 48Mhz CPU divider = 1 CPU frequency = 48MHz + * APBA divider = 1 APBA frequency = 48MHz + * APBB divider = 1 APBB frequency = 48MHz + * APBC divider = 1 APBC frequency = 48MHz + * + * The SAMD21 Xplained Pro has one on-board crystal: + * + * XC101 32.768KHz XOSC32 + * + * REVISIT: Not currently used, may want to use as GCLK1 source with + * DFLL multiplier of ((48000000+16384)/32768) = 1465 which would yield + * a clock of 48,005,120 MHz. + */ + +/* XOSC Configuration -- Not available + * + * BOARD_XOSC_ENABLE - Boolean (defined / not defined) + * BOARD_XOSC_FREQUENCY - In Hz + * BOARD_XOSC_STARTUPTIME - See SYSCTRL_XOSC_STARTUP_* definitions + * BOARD_XOSC_ISCRYSTAL - Boolean (defined / not defined) + * BOARD_XOSC_AMPGC - Boolean (defined / not defined) + * BOARD_XOSC_ONDEMAND - Boolean (defined / not defined) + * BOARD_XOSC_RUNINSTANDBY - Boolean (defined / not defined) + */ + +#undef BOARD_XOSC_ENABLE +#define BOARD_XOSC_FREQUENCY 12000000UL +#define BOARD_XOSC_STARTUPTIME SYSCTRL_XOSC_STARTUP_1S +#define BOARD_XOSC_ISCRYSTAL 1 +#define BOARD_XOSC_AMPGC 1 +#define BOARD_XOSC_ONDEMAND 1 +#undef BOARD_XOSC_RUNINSTANDBY + +/* XOSC32 Configuration -- Not used + * + * BOARD_XOSC32K_ENABLE - Boolean (defined / not defined) + * BOARD_XOSC32K_FREQUENCY - In Hz + * BOARD_XOSC32K_STARTUPTIME - See SYSCTRL_XOSC32K_STARTUP_* definitions + * BOARD_XOSC32K_ISCRYSTAL - Boolean (defined / not defined) + * BOARD_XOSC32K_AAMPEN - Boolean (defined / not defined) + * BOARD_XOSC32K_EN1KHZ - Boolean (defined / not defined) + * BOARD_XOSC32K_EN32KHZ - Boolean (defined / not defined) + * BOARD_XOSC32K_ONDEMAND - Boolean (defined / not defined) + * BOARD_XOSC32K_RUNINSTANDBY - Boolean (defined / not defined) + */ + +#undef BOARD_XOSC32K_ENABLE +#define BOARD_XOSC32K_FREQUENCY 32768 /* 32.768KHz XTAL */ +#define BOARD_XOSC32K_STARTUPTIME SYSCTRL_XOSC32K_STARTUP_2S +#define BOARD_XOSC32K_ISCRYSTAL 1 +#define BOARD_XOSC32K_AAMPEN 1 +#undef BOARD_XOSC32K_EN1KHZ +#define BOARD_XOSC32K_EN32KHZ 1 +#define BOARD_XOSC32K_ONDEMAND 1 +#undef BOARD_XOSC32K_RUNINSTANDBY + +/* OSC32 Configuration -- not used + * + * BOARD_OSC32K_ENABLE - Boolean (defined / not defined) + * BOARD_OSC32K_FREQUENCY - In Hz + * BOARD_OSC32K_STARTUPTIME - See SYSCTRL_OSC32K_STARTUP_* definitions + * BOARD_OSC32K_EN1KHZ - Boolean (defined / not defined) + * BOARD_OSC32K_EN32KHZ - Boolean (defined / not defined) + * BOARD_OSC32K_ONDEMAND - Boolean (defined / not defined) + * BOARD_OSC32K_RUNINSTANDBY - Boolean (defined / not defined) + */ + +#undef BOARD_OSC32K_ENABLE +#define BOARD_OSC32K_FREQUENCY 32768 /* 32.768kHz internal oscillator */ +#define BOARD_OSC32K_STARTUPTIME SYSCTRL_OSC32K_STARTUP_4MS +#define BOARD_OSC32K_EN1KHZ 1 +#define BOARD_OSC32K_EN32KHZ 1 +#define BOARD_OSC32K_ONDEMAND 1 +#undef BOARD_OSC32K_RUNINSTANDBY + +/* OSC8M Configuration -- always enabled + * + * BOARD_OSC8M_PRESCALER - See SYSCTRL_OSC8M_PRESC_DIV* definitions + * BOARD_OSC8M_ONDEMAND - Boolean (defined / not defined) + * BOARD_OSC8M_RUNINSTANDBY - Boolean (defined / not defined) + */ + +#define BOARD_OSC8M_PRESCALER SYSCTRL_OSC8M_PRESC_DIV1 +#define BOARD_OSC8M_ONDEMAND 1 +#undef BOARD_OSC8M_RUNINSTANDBY + +#define BOARD_OSC8M_FREQUENCY 8000000 /* 8MHz high-accuracy internal oscillator */ + +/* OSCULP32K Configuration -- not used. */ + +#define BOARD_OSCULP32K_FREQUENCY 32000 /* 32kHz ultra-low-power internal oscillator */ + +/* Digital Frequency Locked Loop configuration. In closed-loop mode, the + * DFLL output frequency (Fdfll) is given by: + * + * Fdfll = DFLLmul * Frefclk + * = 6 * 8000000 = 48MHz + * + * Where the reference clock is Generic Clock Channel 0 output of GLCK1. + * GCLCK1 provides OSC8M, undivided. + * + * When operating in open-loop mode, the output frequency of the DFLL will + * be determined by the values written to the DFLL Coarse Value bit group + * and the DFLL Fine Value bit group in the DFLL Value register. + * + * BOARD_DFLL_OPENLOOP - Boolean (defined / not defined) + * BOARD_DFLL_TRACKAFTERFINELOCK - Boolean (defined / not defined) + * BOARD_DFLL_KEEPLOCKONWAKEUP - Boolean (defined / not defined) + * BOARD_DFLL_ENABLECHILLCYCLE - Boolean (defined / not defined) + * BOARD_DFLL_QUICKLOCK - Boolean (defined / not defined) + * BOARD_DFLL_ONDEMAND - Boolean (defined / not defined) + * + * Closed loop mode only: + * BOARD_DFLL_GCLKGEN - GCLK index + * BOARD_DFLL_MULTIPLIER - Value + * BOARD_DFLL_MAXCOARSESTEP - Value + * BOARD_DFLL_MAXFINESTEP - Value + * + * BOARD_DFLL_FREQUENCY - The resulting frequency + */ + +#define BOARD_DFLL_ENABLE 1 +#define BOARD_DFLL_OPENLOOP 1 +#undef BOARD_DFLL_ONDEMAND +#undef BOARD_DFLL_RUNINSTANDBY + +/* DFLL closed loop mode configuration */ + +#define BOARD_DFLL_SRCGCLKGEN 1 +#define BOARD_DFLL_MULTIPLIER 6 +#define BOARD_DFLL_QUICKLOCK 1 +#define BOARD_DFLL_TRACKAFTERFINELOCK 1 +#define BOARD_DFLL_KEEPLOCKONWAKEUP 1 +#define BOARD_DFLL_ENABLECHILLCYCLE 1 +#define BOARD_DFLL_MAXCOARSESTEP (0x1f / 4) +#define BOARD_DFLL_MAXFINESTEP (0xff / 4) + +#define BOARD_DFLL_FREQUENCY (48000000) + +/* GCLK Configuration + * + * Global enable/disable. + * + * BOARD_GCLK_ENABLE - Boolean (defined / not defined) + * + * For n=1-7: + * BOARD_GCLKn_ENABLE - Boolean (defined / not defined) + * + * For n=0-8: + * BOARD_GCLKn_RUN_IN_STANDBY - Boolean (defined / not defined) + * BOARD_GCLKn_CLOCK_SOURCE - See GCLK_GENCTRL_SRC_* definitions + * BOARD_GCLKn_PRESCALER - Value + * BOARD_GCLKn_OUTPUT_ENABLE - Boolean (defined / not defined) + */ + +#define BOARD_GCLK_ENABLE 1 + +/* GCLK generator 0 (Main Clock) - Source is the DFLL */ + +#undef BOARD_GCLK0_RUN_IN_STANDBY +#define BOARD_GCLK0_CLOCK_SOURCE GCLK_GENCTRL_SRC_DFLL48M +#define BOARD_GCLK0_PRESCALER 1 +#undef BOARD_GCLK0_OUTPUT_ENABLE +#define BOARD_GCLK0_FREQUENCY (BOARD_DFLL_FREQUENCY / BOARD_GCLK0_PRESCALER) + +/* Configure GCLK generator 1 - Drives the DFLL */ + +#define BOARD_GCLK1_ENABLE 1 +#undef BOARD_GCLK1_RUN_IN_STANDBY +#define BOARD_GCLK1_CLOCK_SOURCE GCLK_GENCTRL_SRC_OSC8M +#define BOARD_GCLK1_PRESCALER 1 +#undef BOARD_GCLK1_OUTPUT_ENABLE +#define BOARD_GCLK1_FREQUENCY (BOARD_OSC8M_FREQUENCY / BOARD_GCLK1_PRESCALER) + +/* Configure GCLK generator 2 (RTC) */ + +#undef BOARD_GCLK2_ENABLE +#undef BOARD_GCLK2_RUN_IN_STANDBY +#define BOARD_GCLK2_CLOCK_SOURCE GCLK_GENCTRL_SRC_OSC32K +#define BOARD_GCLK2_PRESCALER 32 +#undef BOARD_GCLK2_OUTPUT_ENABLE +#define BOARD_GCLK2_FREQUENCY (BOARD_OSC8M_FREQUENCY / BOARD_GCLK2_PRESCALER) + +/* Configure GCLK generator 3 */ + +#undef BOARD_GCLK3_ENABLE +#undef BOARD_GCLK3_RUN_IN_STANDBY +#define BOARD_GCLK3_CLOCK_SOURCE GCLK_GENCTRL_SRC_OSC8M +#define BOARD_GCLK3_PRESCALER 1 +#undef BOARD_GCLK3_OUTPUT_ENABLE +#define BOARD_GCLK3_FREQUENCY (BOARD_OSC8M_FREQUENCY / BOARD_GCLK3_PRESCALER) + +/* Configure GCLK generator 4 */ + +#undef BOARD_GCLK4_ENABLE +#undef BOARD_GCLK4_RUN_IN_STANDBY +#define BOARD_GCLK4_CLOCK_SOURCE GCLK_GENCTRL_SRC_OSC8M +#define BOARD_GCLK4_PRESCALER 1 +#undef BOARD_GCLK4_OUTPUT_ENABLE +#define BOARD_GCLK4_FREQUENCY (BOARD_OSC8M_FREQUENCY / BOARD_GCLK4_PRESCALER) + +/* Configure GCLK generator 5 */ + +#undef BOARD_GCLK5_ENABLE +#undef BOARD_GCLK5_RUN_IN_STANDBY +#define BOARD_GCLK5_CLOCK_SOURCE GCLK_GENCTRL_SRC_OSC8M +#define BOARD_GCLK5_PRESCALER 1 +#undef BOARD_GCLK5_OUTPUT_ENABLE +#define BOARD_GCLK5_FREQUENCY (BOARD_OSC8M_FREQUENCY / BOARD_GCLK5_PRESCALER) + +/* Configure GCLK generator 6 */ + +#undef BOARD_GCLK6_ENABLE +#undef BOARD_GCLK6_RUN_IN_STANDBY +#define BOARD_GCLK6_CLOCK_SOURCE GCLK_GENCTRL_SRC_OSC8M +#define BOARD_GCLK6_PRESCALER 1 +#undef BOARD_GCLK6_OUTPUT_ENABLE +#define BOARD_GCLK6_FREQUENCY (BOARD_OSC8M_FREQUENCY / BOARD_GCLK6_PRESCALER) + +/* Configure GCLK generator 7 */ + +#undef BOARD_GCLK7_ENABLE +#undef BOARD_GCLK7_RUN_IN_STANDBY +#define BOARD_GCLK7_CLOCK_SOURCE GCLK_GENCTRL_SRC_OSC8M +#define BOARD_GCLK7_PRESCALER 1 +#undef BOARD_GCLK7_OUTPUT_ENABLE +#define BOARD_GCLK7_FREQUENCY (BOARD_OSC8M_FREQUENCY / BOARD_GCLK7_PRESCALER) + +/* The source of the main clock is always GCLK_MAIN. Also called GCLKGEN[0], + * this is the clock feeding the Power Manager. + * The Power Manager, in turn, generates main clock which is divided down to + * produce the CPU, AHB, and APB clocks. + * + * The main clock is initially OSC8M divided by 8. + */ + +#define BOARD_GCLK_MAIN_FREQUENCY BOARD_GCLK0_FREQUENCY + +/* Main clock dividers + * + * BOARD_CPU_DIVIDER - See PM_CPUSEL_CPUDIV_* definitions + * BOARD_CPU_FREQUENCY - In Hz + * BOARD_CPU_FAILDECT - Boolean (defined / not defined) + * BOARD_APBA_DIVIDER - See M_APBASEL_APBADIV_* definitions + * BOARD_APBA_FREQUENCY - In Hz + * BOARD_APBB_DIVIDER - See M_APBBSEL_APBBDIV_* definitions + * BOARD_APBB_FREQUENCY - In Hz + * BOARD_APBC_DIVIDER - See M_APBCSEL_APBCDIV_* definitions + * BOARD_APBC_FREQUENCY - In Hz + */ + +#define BOARD_CPU_FAILDECT 1 +#define BOARD_CPU_DIVIDER PM_CPUSEL_CPUDIV_1 +#define BOARD_APBA_DIVIDER PM_APBASEL_APBADIV_1 +#define BOARD_APBB_DIVIDER PM_APBBSEL_APBBDIV_1 +#define BOARD_APBC_DIVIDER PM_APBCSEL_APBCDIV_1 + +/* Resulting frequencies */ + +#define BOARD_MCK_FREQUENCY (BOARD_GCLK_MAIN_FREQUENCY) +#define BOARD_CPU_FREQUENCY (BOARD_MCK_FREQUENCY) +#define BOARD_PBA_FREQUENCY (BOARD_MCK_FREQUENCY) +#define BOARD_PBB_FREQUENCY (BOARD_MCK_FREQUENCY) +#define BOARD_PBC_FREQUENCY (BOARD_MCK_FREQUENCY) +#define BOARD_PBD_FREQUENCY (BOARD_MCK_FREQUENCY) + +/* FLASH wait states + * + * Vdd Range Wait states Maximum Operating Frequency + * ------------- -------------- --------------------------- + * 1.62V to 2.7V 0 14 MHz + * 1 28 MHz + * 2 42 MHz + * 3 48 MHz + * 2.7V to 3.63V 0 24 MHz + * 1 48 MHz + */ + +#if 0 /* REVISIT -- should not be necessary */ +# define BOARD_FLASH_WAITSTATES 1 +#else +# define BOARD_FLASH_WAITSTATES 2 +#endif + +/* SERCOM definitions *******************************************************/ + +/* This is the source clock generator for the GCLK_SERCOM_SLOW clock that is + * common to all SERCOM modules. + */ + +#define BOARD_SERCOM05_SLOW_GCLKGEN 0 + +/* The SERCOM4 USART is available on the pins below. + * + * PIN EXT1 GPIO Function + * ---- ---- ------------------ + * 13 PB09 SERCOM4 / USART RX + * 14 PB08 SERCOM4 / USART TX + * 19 GND N/A + * 20 VCC N/A + * + * If you have a TTL to RS-232 converter then this is the most convenient + * serial console to use (because you don't lose the console device each time + * you lose the USB connection). It is the default in all of the SAMD21 + * configurations. + */ + +#define BOARD_SERCOM4_GCLKGEN 0 +#define BOARD_SERCOM4_SLOW_GCLKGEN BOARD_SERCOM05_SLOW_GCLKGEN + +#if defined(CONFIG_USART4_SERIAL_CONSOLE) +# define BOARD_SERCOM4_MUXCONFIG (USART_CTRLA_RXPAD1 | USART_CTRLA_TXPAD0_1) +# define BOARD_SERCOM4_PINMAP_PAD0 PORT_SERCOM4_PAD0_3 /* USART TX */ +# define BOARD_SERCOM4_PINMAP_PAD1 PORT_SERCOM4_PAD1_3 /* USART RX */ +# define BOARD_SERCOM4_PINMAP_PAD2 0 +# define BOARD_SERCOM4_PINMAP_PAD3 0 +#endif /* CONFIG_USART4_SERIAL_CONSOLE */ + +#define BOARD_SERCOM4_FREQUENCY BOARD_GCLK0_FREQUENCY + +/* USB definitions **********************************************************/ + +/* This is the source clock generator for the GCLK_USB clock + */ + +#define BOARD_USB_GCLKGEN 0 +#define BOARD_USB_FREQUENCY BOARD_GCLK0_FREQUENCY + +/* default USB Pad calibration (not used yet by USB driver) */ + +#define BOARD_USB_PADCAL_P 29 +#define BOARD_USB_PADCAL_N 5 +#define BOARD_USB_PADCAL_TRIM 3 + +/* LED definitions **********************************************************/ + +/* LED index values for use with board_userled() */ + +#define BOARD_STATUS_LED 0 +#define BOARD_NLEDS 1 + +/* LED bits for use with board_userled_all() */ + +#define BOARD_STATUS LED_BIT (1 << BOARD_STATUS_LED) + +/* When CONFIG_ARCH_LEDS is defined in the NuttX configuration, NuttX will + * control the LED as defined below. Thus if the LED is statically on, NuttX + * has successfully booted and is, apparently, running normally. + * If the LED is flashing at approximately 2Hz, then a fatal error + * has been detected and the system has halted. + */ + +#define LED_STARTED 0 /* STATUS LED=OFF */ +#define LED_HEAPALLOCATE 0 /* STATUS LED=OFF */ +#define LED_IRQSENABLED 0 /* STATUS LED=OFF */ +#define LED_STACKCREATED 1 /* STATUS LED=ON */ +#define LED_INIRQ 2 /* STATUS LED=no change */ +#define LED_SIGNAL 2 /* STATUS LED=no change */ +#define LED_ASSERTION 2 /* STATUS LED=no change */ +#define LED_PANIC 3 /* STATUS LED=flashing */ + +#endif /* __BOARDS_ARM_SAMD2L2_XIAO_SEEEDUINO_INCLUDE_BOARD_H */ diff --git a/boards/arm/samd2l2/xiao-seeeduino/scripts/Make.defs b/boards/arm/samd2l2/xiao-seeeduino/scripts/Make.defs new file mode 100644 index 0000000000000..a90a9c5d1ba20 --- /dev/null +++ b/boards/arm/samd2l2/xiao-seeeduino/scripts/Make.defs @@ -0,0 +1,39 @@ +############################################################################ +# boards/arm/samd2l2/xiao-seeeduino/scripts/Make.defs +# +# 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. +# +############################################################################ + +include $(TOPDIR)/.config +include $(TOPDIR)/tools/Config.mk +include $(TOPDIR)/arch/arm/src/armv6-m/Toolchain.defs + +LDSCRIPT = flash.ld +ARCHSCRIPT += $(BOARD_DIR)$(DELIM)scripts$(DELIM)$(LDSCRIPT) + +ARCHPICFLAGS = -fpic -msingle-pic-base -mpic-register=r10 + +CFLAGS := $(ARCHCFLAGS) $(ARCHOPTIMIZATION) $(ARCHCPUFLAGS) $(ARCHINCLUDES) $(ARCHDEFINES) $(EXTRAFLAGS) +CPICFLAGS = $(ARCHPICFLAGS) $(CFLAGS) +CXXFLAGS := $(ARCHCXXFLAGS) $(ARCHOPTIMIZATION) $(ARCHCPUFLAGS) $(ARCHXXINCLUDES) $(ARCHDEFINES) $(EXTRAFLAGS) +CXXPICFLAGS = $(ARCHPICFLAGS) $(CXXFLAGS) +CPPFLAGS := $(ARCHINCLUDES) $(ARCHDEFINES) $(EXTRAFLAGS) +AFLAGS := $(CFLAGS) -D__ASSEMBLY__ + +NXFLATLDFLAGS1 = -r -d -warn-common +NXFLATLDFLAGS2 = $(NXFLATLDFLAGS1) -T$(TOPDIR)/binfmt/libnxflat/gnu-nxflat-pcrel.ld -no-check-sections +LDNXFLATFLAGS = -e main -s 2048 diff --git a/boards/arm/samd2l2/xiao-seeeduino/scripts/flash.ld b/boards/arm/samd2l2/xiao-seeeduino/scripts/flash.ld new file mode 100644 index 0000000000000..d276d4098df45 --- /dev/null +++ b/boards/arm/samd2l2/xiao-seeeduino/scripts/flash.ld @@ -0,0 +1,112 @@ +/**************************************************************************** + * boards/arm/samd2l2/xiao-seeeduino/scripts/flash.ld + * + * 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. + * + ****************************************************************************/ + +/* The ATSAMD21J18A has 256KB of FLASH beginning at address 0x0000:0000 and + * 32KB of SRAM beginning at address 0x2000:0000 + * However, the XIAO Seeeduino has its UF2 bootloader in the first 8KB. + */ + +MEMORY +{ + flash (rx) : ORIGIN = 0x00002000, LENGTH = 248K + sram (rwx) : ORIGIN = 0x20000000, LENGTH = 32K +} + +OUTPUT_ARCH(arm) +EXTERN(_vectors) +ENTRY(_stext) + +SECTIONS +{ + .text : { + _stext = ABSOLUTE(.); + *(.vectors) + *(.text .text.*) + *(.fixup) + *(.gnu.warning) + *(.rodata .rodata.*) + *(.gnu.linkonce.t.*) + *(.glue_7) + *(.glue_7t) + *(.got) + *(.gcc_except_table) + *(.gnu.linkonce.r.*) + _etext = ABSOLUTE(.); + } > flash + + .init_section : { + _sinit = ABSOLUTE(.); + KEEP(*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*))) + KEEP(*(.init_array EXCLUDE_FILE(*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o) .ctors)) + _einit = ABSOLUTE(.); + } > flash + + .ARM.extab : { + *(.ARM.extab*) + } >flash + + .ARM.exidx : { + __exidx_start = ABSOLUTE(.); + *(.ARM.exidx*) + __exidx_end = ABSOLUTE(.); + } >flash + + .data : { + _sdata = ABSOLUTE(.); + *(.data .data.*) + *(.gnu.linkonce.d.*) + CONSTRUCTORS + . = ALIGN(4); + _edata = ABSOLUTE(.); + } > sram AT > flash + + _eronly = LOADADDR(.data); + + .ramfunc ALIGN(4): { + _sramfuncs = ABSOLUTE(.); + *(.ramfunc .ramfunc.*) + _eramfuncs = ABSOLUTE(.); + } > sram AT > flash + + _framfuncs = LOADADDR(.ramfunc); + + .bss : { + _sbss = ABSOLUTE(.); + *(.bss .bss.*) + *(.gnu.linkonce.b.*) + *(COMMON) + . = ALIGN(4); + _ebss = ABSOLUTE(.); + } > sram + + /* Stabs debugging sections. */ + .stab 0 : { *(.stab) } + .stabstr 0 : { *(.stabstr) } + .stab.excl 0 : { *(.stab.excl) } + .stab.exclstr 0 : { *(.stab.exclstr) } + .stab.index 0 : { *(.stab.index) } + .stab.indexstr 0 : { *(.stab.indexstr) } + .comment 0 : { *(.comment) } + .debug_abbrev 0 : { *(.debug_abbrev) } + .debug_info 0 : { *(.debug_info) } + .debug_line 0 : { *(.debug_line) } + .debug_pubnames 0 : { *(.debug_pubnames) } + .debug_aranges 0 : { *(.debug_aranges) } +} diff --git a/boards/arm/samd2l2/xiao-seeeduino/src/Makefile b/boards/arm/samd2l2/xiao-seeeduino/src/Makefile new file mode 100644 index 0000000000000..cab39390b0362 --- /dev/null +++ b/boards/arm/samd2l2/xiao-seeeduino/src/Makefile @@ -0,0 +1,33 @@ +############################################################################ +# boards/arm/samd2l2/xiao-seeeduino/src/Makefile +# +# 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. +# +############################################################################ + +include $(TOPDIR)/Make.defs + +CSRCS = sam_boot.c + +ifeq ($(CONFIG_ARCH_LEDS),y) +CSRCS += sam_autoleds.c +endif + +ifeq ($(CONFIG_BOARDCTL),y) +CSRCS += sam_appinit.c +endif + +include $(TOPDIR)/boards/Board.mk diff --git a/boards/arm/samd2l2/xiao-seeeduino/src/sam_appinit.c b/boards/arm/samd2l2/xiao-seeeduino/src/sam_appinit.c new file mode 100644 index 0000000000000..f951d6497c5e4 --- /dev/null +++ b/boards/arm/samd2l2/xiao-seeeduino/src/sam_appinit.c @@ -0,0 +1,71 @@ +/**************************************************************************** + * boards/arm/samd2l2/xiao-seeeduino/src/sam_appinit.c + * + * 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 + +#include +#include + +#include + +#include "sam_config.h" +#include "xiao-seeeduino.h" + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: board_app_initialize + * + * Description: + * Perform application specific initialization. This function is never + * called directly from application code, but only indirectly via the + * (non-standard) boardctl() interface using the command BOARDIOC_INIT. + * + * Input Parameters: + * arg - The boardctl() argument is passed to the board_app_initialize() + * implementation without modification. The argument has no + * meaning to NuttX; the meaning of the argument is a contract + * between the board-specific initialization logic and the + * matching application logic. The value could be such things as a + * mode enumeration value, a set of DIP switch switch settings, a + * pointer to configuration data read from a file or serial FLASH, + * or whatever you would like to do with it. Every implementation + * should accept zero/NULL as a default configuration. + * + * Returned Value: + * Zero (OK) is returned on success; a negated errno value is returned on + * any failure to indicate the nature of the failure. + * + ****************************************************************************/ + +int board_app_initialize(uintptr_t arg) +{ + return OK; +} diff --git a/boards/arm/samd2l2/xiao-seeeduino/src/sam_autoleds.c b/boards/arm/samd2l2/xiao-seeeduino/src/sam_autoleds.c new file mode 100644 index 0000000000000..57c724e7acdb7 --- /dev/null +++ b/boards/arm/samd2l2/xiao-seeeduino/src/sam_autoleds.c @@ -0,0 +1,142 @@ +/**************************************************************************** + * boards/arm/samd2l2/xiao-seeeduino/src/sam_autoleds.c + * + * 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. + * + ****************************************************************************/ + +/* When CONFIG_ARCH_LEDS is defined in the NuttX configuration, NuttX will + * control the LED as follows: + * + * SYMBOL Meaning LED + * ------------------- ----------------------- ------ + * LED_STARTED NuttX has been started OFF + * LED_HEAPALLOCATE Heap has been allocated OFF + * LED_IRQSENABLED Interrupts enabled OFF + * LED_STACKCREATED Idle stack created ON + * LED_INIRQ In an interrupt** N/C + * LED_SIGNAL In a signal handler*** N/C + * LED_ASSERTION An assertion failed N/C + * LED_PANIC The system has crashed FLASH + * + * Thus if the LED is statically on, NuttX has successfully booted and is, + * apparently, running normally. If the LED is flashing at approximately + * 2Hz, then a fatal error has been detected and the system has halted. + */ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include +#include +#include +#include + +#include +#include + +#include "sam_port.h" +#include "xiao-seeeduino.h" + +#ifdef CONFIG_ARCH_LEDS + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: board_autoled_initialize + ****************************************************************************/ + +void board_autoled_initialize(void) +{ + sam_configport(PORT_STATUS_LED); +} + +/**************************************************************************** + * Name: board_autoled_on + ****************************************************************************/ + +void board_autoled_on(int led) +{ + bool ledstate = true; + + switch (led) + { + case 0: /* LED_STARTED: NuttX has been started STATUS LED=OFF + * LED_HEAPALLOCATE: Heap has been allocated STATUS LED=OFF + * LED_IRQSENABLED: Interrupts enabled STATUS LED=OFF + */ + + break; /* Leave ledstate == true to turn OFF */ + + default: + case 2: /* LED_INIRQ: In an interrupt STATUS LED=N/C + * LED_SIGNAL: In a signal handler STATUS LED=N/C + * LED_ASSERTION: An assertion failed STATUS LED=N/C + */ + + return; /* Return to leave STATUS LED unchanged */ + + case 3: /* LED_PANIC: The system has crashed STATUS LED=FLASH */ + case 1: /* LED_STACKCREATED: Idle stack created STATUS LED=ON */ + + ledstate = false; /* Set ledstate == false to turn ON */ + break; + } + + sam_portwrite(PORT_STATUS_LED, ledstate); +} + +/**************************************************************************** + * Name: board_autoled_off + ****************************************************************************/ + +void board_autoled_off(int led) +{ + switch (led) + { + /* These should not happen and are ignored */ + + default: + case 0: /* LED_STARTED: NuttX has been started STATUS LED=OFF + * LED_HEAPALLOCATE: Heap has been allocated STATUS LED=OFF + * LED_IRQSENABLED: Interrupts enabled STATUS LED=OFF + */ + + case 1: /* LED_STACKCREATED: Idle stack created STATUS LED=ON */ + + /* These result in no-change */ + + case 2: /* LED_INIRQ: In an interrupt STATUS LED=N/C + * LED_SIGNAL: In a signal handler STATUS LED=N/C + * LED_ASSERTION: An assertion failed STATUS LED=N/C + */ + + return; /* Return to leave STATUS LED unchanged */ + + /* Turn STATUS LED off set driving the output high */ + + case 3: /* LED_PANIC: The system has crashed STATUS LED=FLASH */ + sam_portwrite(PORT_STATUS_LED, true); + break; + } +} + +#endif /* CONFIG_ARCH_LEDS */ diff --git a/boards/arm/samd2l2/xiao-seeeduino/src/sam_boot.c b/boards/arm/samd2l2/xiao-seeeduino/src/sam_boot.c new file mode 100644 index 0000000000000..8f7f041242156 --- /dev/null +++ b/boards/arm/samd2l2/xiao-seeeduino/src/sam_boot.c @@ -0,0 +1,64 @@ +/**************************************************************************** + * boards/arm/samd2l2/xiao-seeeduino/src/sam_boot.c + * + * 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 + +#include + +#include + +#include "sam_config.h" +#include "xiao-seeeduino.h" + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +/**************************************************************************** + * Private Functions + ****************************************************************************/ + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: sam_boardinitialize + * + * Description: + * All SAM3U architectures must provide the following entry point. + * This entry point is called early in the initialization -- after all + * memory has been configured and mapped but before any devices have been + * initialized. + * + ****************************************************************************/ + +void sam_boardinitialize(void) +{ + /* Configure on-board LEDs if LED support has been selected. */ + +#ifdef CONFIG_ARCH_LEDS + board_autoled_initialize(); +#endif +} diff --git a/boards/arm/samd2l2/xiao-seeeduino/src/xiao-seeeduino.h b/boards/arm/samd2l2/xiao-seeeduino/src/xiao-seeeduino.h new file mode 100644 index 0000000000000..d15dce7480e7c --- /dev/null +++ b/boards/arm/samd2l2/xiao-seeeduino/src/xiao-seeeduino.h @@ -0,0 +1,89 @@ +/**************************************************************************** + * boards/arm/samd2l2/xiao-seeeduino/src/xiao-seeeduino.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 __BOARDS_ARM_SAMD2L2_XIAO_SEEEDUINO_SRC_XIAO_SEEEDUINO_H +#define __BOARDS_ARM_SAMD2L2_XIAO_SEEEDUINO_SRC_XIAO_SEEEDUINO_H + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include +#include + +#include + +#include +#include + +#include "sam_config.h" +#include "sam_pinmap.h" + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +/* LEDs: + * There are three LEDs on board the SAMD21 Xplained Pro board: The EDBG + * controls two of the LEDs, a power LED and a status LED. There is only + * one user controllable LED, a yellow LED labelled STATIS near the SAMD21 + * USB connector. + * + * This LED is controlled by PB30 and the LED can be activated by driving + * PB30 to GND. + * + * When CONFIG_ARCH_LEDS is defined in the NuttX configuration, NuttX will + * control the LED as follows: + * + * SYMBOL Meaning LED + * ------------------- ----------------------- ------ + * LED_STARTED NuttX has been started OFF + * LED_HEAPALLOCATE Heap has been allocated OFF + * LED_IRQSENABLED Interrupts enabled OFF + * LED_STACKCREATED Idle stack created ON + * LED_INIRQ In an interrupt N/C + * LED_SIGNAL In a signal handler N/C + * LED_ASSERTION An assertion failed N/C + * LED_PANIC The system has crashed FLASH + * + * Thus if the LED is statically on, NuttX has successfully booted and is, + * apparently, running normally. If the LED is flashing at approximately + * 2Hz, then a fatal error has been detected and the system has halted. + */ + +#define PORT_STATUS_LED (PORT_OUTPUT | PORT_PULL_NONE | PORT_OUTPUT_SET | \ + PORTA | PORT_PIN4) + +/**************************************************************************** + * Public Types + ****************************************************************************/ + +/**************************************************************************** + * Public Data + ****************************************************************************/ + +#ifndef __ASSEMBLY__ + +/**************************************************************************** + * Public Functions Definitions + ****************************************************************************/ + +#endif /* __ASSEMBLY__ */ +#endif /* __BOARDS_ARM_SAMD2L2_XIAO_SEEEDUINO_SRC_XIAO_SEEEDUINO_H */