forked from xuos/xiuos
				
			modify nuttx bug about lack of a file from Tang yiwen
it is OK
This commit is contained in:
		
						commit
						3a7e7dee79
					
				| 
						 | 
				
			
			@ -0,0 +1 @@
 | 
			
		|||
this is readme
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,8 @@
 | 
			
		|||
#
 | 
			
		||||
# For a description of the syntax of this configuration file,
 | 
			
		||||
# see the file kconfig-language.txt in the NuttX tools repository.
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
if ARCH_BOARD_ARDUINO_M0
 | 
			
		||||
 | 
			
		||||
endif
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,149 @@
 | 
			
		|||
README
 | 
			
		||||
======
 | 
			
		||||
 | 
			
		||||
This README discusses issues unique to NuttX configurations for the
 | 
			
		||||
Arduino M0.  I used a compatible board called Wemos SAMD21 M0 board,
 | 
			
		||||
but there are other equivalent boards, like the RobotDyn SAMD21 M0.
 | 
			
		||||
 | 
			
		||||
Unfortunately because the Arduino.cc vs Arduino.org conflict in the past,
 | 
			
		||||
we have three types of boards: Arduino Zero, Arduino M0 and Arduino M0 Pro.
 | 
			
		||||
 | 
			
		||||
The Wemos SAMD21 M0 is compatible with Arduino M0, but not exactly a clone.
 | 
			
		||||
 | 
			
		||||
You have two options to program it: using the SWD (EDBG) connector that
 | 
			
		||||
comes in the board or the Arduino M0 bootloader that comes flashed on it.
 | 
			
		||||
Currently only SWD programming is supported.  Bootloader skip area should be
 | 
			
		||||
implemented to avoid overwriting the bootloader area.
 | 
			
		||||
 | 
			
		||||
The board uses the ATSAMD21G18A MCU and can work over the Native USB Port.
 | 
			
		||||
 | 
			
		||||
Contents
 | 
			
		||||
========
 | 
			
		||||
 | 
			
		||||
  - STATUS/ISSUES
 | 
			
		||||
  - LEDs
 | 
			
		||||
  - Serial Consoles
 | 
			
		||||
  - Configurations
 | 
			
		||||
 | 
			
		||||
STATUS/ISSUES
 | 
			
		||||
=============
 | 
			
		||||
 | 
			
		||||
  Because the Arduino M0 doesn't have a 12MHz crystal, it uses the internal
 | 
			
		||||
  RC oscillator.
 | 
			
		||||
 | 
			
		||||
LEDs
 | 
			
		||||
====
 | 
			
		||||
 | 
			
		||||
  There is one yellow LED available on the Arduino M0 and it can be turned
 | 
			
		||||
  on and off. The LED can be activated by driving the connected
 | 
			
		||||
  PA17 I/O line to high level.
 | 
			
		||||
 | 
			
		||||
  When CONFIG_ARCH_LEDS is defined in the NuttX configuration, NuttX will
 | 
			
		||||
  control the LED as follows:
 | 
			
		||||
 | 
			
		||||
    SYMBOL              Meaning                 LED0
 | 
			
		||||
    ------------------- ----------------------- ------
 | 
			
		||||
    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 is LED is statically on, NuttX has successfully  booted and is,
 | 
			
		||||
  apparently, running normally.  If LED is flashing at approximately
 | 
			
		||||
  2Hz, then a fatal error has been detected and the system has halted.
 | 
			
		||||
 | 
			
		||||
Serial Consoles
 | 
			
		||||
===============
 | 
			
		||||
 | 
			
		||||
  SERCOM5
 | 
			
		||||
  ------
 | 
			
		||||
 | 
			
		||||
  SERCOM5 is available on pins PB22 (TXD) and PB23 (RXD). You will need to
 | 
			
		||||
  solder a two pins header to RXD and TXD labels, near to ICSP pin header.
 | 
			
		||||
 | 
			
		||||
    PIN   GPIO Function
 | 
			
		||||
    ----  ---- ------------------
 | 
			
		||||
     37   PB22 SERCOM5 / USART RX
 | 
			
		||||
     38   PB23 SERCOM5 / USART TX
 | 
			
		||||
 | 
			
		||||
  If you have a 3.3V USB/Serial adapter 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 these
 | 
			
		||||
  configurations.  An option is to use the virtual COM port.
 | 
			
		||||
 | 
			
		||||
  Native USB Port
 | 
			
		||||
  ---------------
 | 
			
		||||
 | 
			
		||||
  You can access the NSH shell directly using the USB connector. All you need
 | 
			
		||||
  to do is use the "usbnsh" board profile.
 | 
			
		||||
 | 
			
		||||
Configurations
 | 
			
		||||
==============
 | 
			
		||||
 | 
			
		||||
  Each Arduino M0 configuration is maintained in a sub-directory and
 | 
			
		||||
  can be selected as follow:
 | 
			
		||||
 | 
			
		||||
    tools/configure.sh arduino-m0:<subdir>
 | 
			
		||||
 | 
			
		||||
  Before building, make sure the PATH environment variable include the
 | 
			
		||||
  correct path to the directory than holds your toolchain binaries.
 | 
			
		||||
 | 
			
		||||
  And then build NuttX by simply typing the following.  At the conclusion of
 | 
			
		||||
  the make, the nuttx binary will reside in an ELF file called, simply, nuttx.
 | 
			
		||||
 | 
			
		||||
    make
 | 
			
		||||
 | 
			
		||||
  The <subdir> that is provided above as an argument to the tools/configure.sh
 | 
			
		||||
  must be is one of the following.
 | 
			
		||||
 | 
			
		||||
  NOTE:  These configurations use the mconf-based configuration tool.  To
 | 
			
		||||
  change any of these configurations using that tool, you should:
 | 
			
		||||
 | 
			
		||||
    a. Build and install the kconfig-mconf tool.  See nuttx/README.txt
 | 
			
		||||
       see additional README.txt files in the NuttX tools repository.
 | 
			
		||||
 | 
			
		||||
    b. Execute 'make menuconfig' in nuttx/ in order to start the
 | 
			
		||||
       reconfiguration process.
 | 
			
		||||
 | 
			
		||||
  NOTES:
 | 
			
		||||
 | 
			
		||||
  1. These configurations use the mconf-based configuration tool.  To
 | 
			
		||||
    change any of these configurations using that tool, you should:
 | 
			
		||||
 | 
			
		||||
    a. Build and install the kconfig-mconf tool.  See nuttx/README.txt
 | 
			
		||||
       see additional README.txt files in the NuttX tools repository.
 | 
			
		||||
 | 
			
		||||
    b. Execute 'make menuconfig' in nuttx/ in order to start the
 | 
			
		||||
       reconfiguration process.
 | 
			
		||||
 | 
			
		||||
Configuration sub-directories
 | 
			
		||||
-----------------------------
 | 
			
		||||
 | 
			
		||||
  nsh:
 | 
			
		||||
    This configuration directory will built the NuttShell.  See NOTES above
 | 
			
		||||
    and below:
 | 
			
		||||
 | 
			
		||||
    NOTES:
 | 
			
		||||
 | 
			
		||||
    1. This configuration is set up to build on Windows using the Cygwin
 | 
			
		||||
       environment using the ARM EABI toolchain.  This can be easily
 | 
			
		||||
       changed as described above under "Configurations."
 | 
			
		||||
 | 
			
		||||
    2. By default, this configuration provides a serial console on SERCOM5
 | 
			
		||||
       at 115200 8N1 via RXD/TXD pads:
 | 
			
		||||
 | 
			
		||||
       PIN   EXT3 GPIO Function
 | 
			
		||||
       ----  ---- ------------------
 | 
			
		||||
        37   PB22 SERCOM5 / USART RX
 | 
			
		||||
        38   PB23 SERCOM5 / USART TX
 | 
			
		||||
 | 
			
		||||
  usbnsh:
 | 
			
		||||
    This configuration directory will build the NuttShell to work over USB.
 | 
			
		||||
    It uses the internal SAMD21 USB port working as CDC/ACM Serial/Modem.
 | 
			
		||||
 | 
			
		||||
    Using the configuration you don't need to solder the header pins RXD/TXD
 | 
			
		||||
    to get access the NSH terminal.
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,64 @@
 | 
			
		|||
#
 | 
			
		||||
# 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_WGET is not set
 | 
			
		||||
# CONFIG_NSH_DISABLE_XD is not set
 | 
			
		||||
CONFIG_ARCH="arm"
 | 
			
		||||
CONFIG_ARCH_BOARD="arduino-m0"
 | 
			
		||||
CONFIG_ARCH_BOARD_ARDUINO_M0=y
 | 
			
		||||
CONFIG_ARCH_CHIP="samd2l2"
 | 
			
		||||
CONFIG_ARCH_CHIP_SAMD21G18A=y
 | 
			
		||||
CONFIG_ARCH_CHIP_SAMD2X=y
 | 
			
		||||
CONFIG_ARCH_STACKDUMP=y
 | 
			
		||||
CONFIG_BOARD_LOOPSPERMSEC=3410
 | 
			
		||||
CONFIG_BUILTIN=y
 | 
			
		||||
CONFIG_DEFAULT_SMALL=y
 | 
			
		||||
CONFIG_HAVE_CXX=y
 | 
			
		||||
CONFIG_HAVE_CXXINITIALIZE=y
 | 
			
		||||
CONFIG_MAX_TASKS=16
 | 
			
		||||
CONFIG_NSH_BUILTIN_APPS=y
 | 
			
		||||
CONFIG_PREALLOC_TIMERS=4
 | 
			
		||||
CONFIG_PTHREAD_STACK_DEFAULT=1536
 | 
			
		||||
CONFIG_RAM_SIZE=32768
 | 
			
		||||
CONFIG_RAM_START=0x20000000
 | 
			
		||||
CONFIG_RAW_BINARY=y
 | 
			
		||||
CONFIG_RR_INTERVAL=200
 | 
			
		||||
CONFIG_SAMD2L2_SERCOM3=y
 | 
			
		||||
CONFIG_SAMD2L2_SERCOM4=y
 | 
			
		||||
CONFIG_SAMD2L2_SERCOM5=y
 | 
			
		||||
CONFIG_SCHED_WAITPID=y
 | 
			
		||||
CONFIG_SDCLONE_DISABLE=y
 | 
			
		||||
CONFIG_START_DAY=21
 | 
			
		||||
CONFIG_START_MONTH=6
 | 
			
		||||
CONFIG_START_YEAR=2015
 | 
			
		||||
CONFIG_SYSTEM_NSH=y
 | 
			
		||||
CONFIG_TASK_NAME_SIZE=0
 | 
			
		||||
CONFIG_TASK_SPAWN_DEFAULT_STACKSIZE=1536
 | 
			
		||||
CONFIG_USART3_RXBUFSIZE=64
 | 
			
		||||
CONFIG_USART3_TXBUFSIZE=64
 | 
			
		||||
CONFIG_USART4_RXBUFSIZE=64
 | 
			
		||||
CONFIG_USART4_TXBUFSIZE=64
 | 
			
		||||
CONFIG_USART5_SERIAL_CONSOLE=y
 | 
			
		||||
CONFIG_USERMAIN_STACKSIZE=1536
 | 
			
		||||
CONFIG_USER_ENTRYPOINT="nsh_main"
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,62 @@
 | 
			
		|||
#
 | 
			
		||||
# 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_WGET is not set
 | 
			
		||||
# CONFIG_NSH_DISABLE_XD is not set
 | 
			
		||||
CONFIG_ARCH="arm"
 | 
			
		||||
CONFIG_ARCH_BOARD="arduino-m0"
 | 
			
		||||
CONFIG_ARCH_BOARD_ARDUINO_M0=y
 | 
			
		||||
CONFIG_ARCH_CHIP="samd2l2"
 | 
			
		||||
CONFIG_ARCH_CHIP_SAMD21G18A=y
 | 
			
		||||
CONFIG_ARCH_CHIP_SAMD2X=y
 | 
			
		||||
CONFIG_ARCH_STACKDUMP=y
 | 
			
		||||
CONFIG_BOARDCTL_USBDEVCTRL=y
 | 
			
		||||
CONFIG_BOARD_LOOPSPERMSEC=3410
 | 
			
		||||
CONFIG_BUILTIN=y
 | 
			
		||||
CONFIG_CDCACM=y
 | 
			
		||||
CONFIG_CDCACM_CONSOLE=y
 | 
			
		||||
CONFIG_DEFAULT_SMALL=y
 | 
			
		||||
CONFIG_HAVE_CXX=y
 | 
			
		||||
CONFIG_HAVE_CXXINITIALIZE=y
 | 
			
		||||
CONFIG_MAX_TASKS=16
 | 
			
		||||
CONFIG_NSH_BUILTIN_APPS=y
 | 
			
		||||
CONFIG_PREALLOC_TIMERS=4
 | 
			
		||||
CONFIG_PTHREAD_STACK_DEFAULT=1536
 | 
			
		||||
CONFIG_RAM_SIZE=32768
 | 
			
		||||
CONFIG_RAM_START=0x20000000
 | 
			
		||||
CONFIG_RAW_BINARY=y
 | 
			
		||||
CONFIG_RR_INTERVAL=200
 | 
			
		||||
CONFIG_SAMD2L2_SERCOM5=y
 | 
			
		||||
CONFIG_SAMD2L2_USB=y
 | 
			
		||||
CONFIG_SCHED_WAITPID=y
 | 
			
		||||
CONFIG_SDCLONE_DISABLE=y
 | 
			
		||||
CONFIG_START_DAY=22
 | 
			
		||||
CONFIG_START_MONTH=9
 | 
			
		||||
CONFIG_START_YEAR=2019
 | 
			
		||||
CONFIG_SYSTEM_NSH=y
 | 
			
		||||
CONFIG_TASK_NAME_SIZE=0
 | 
			
		||||
CONFIG_TASK_SPAWN_DEFAULT_STACKSIZE=1536
 | 
			
		||||
CONFIG_USBDEV=y
 | 
			
		||||
CONFIG_USERMAIN_STACKSIZE=1536
 | 
			
		||||
CONFIG_USER_ENTRYPOINT="nsh_main"
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,535 @@
 | 
			
		|||
/****************************************************************************
 | 
			
		||||
 * boards/arm/samd2l2/arduino-m0/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_ARDUINO_M0_INCLUDE_BOARD_H
 | 
			
		||||
#define __BOARDS_ARM_SAMD2L2_ARDUINO_M0_INCLUDE_BOARD_H
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Included Files
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#include <nuttx/config.h>
 | 
			
		||||
 | 
			
		||||
#ifndef __ASSEMBLY__
 | 
			
		||||
#  include <stdint.h>
 | 
			
		||||
#  ifdef CONFIG_SAMD2L2_GPIOIRQ
 | 
			
		||||
#    include <arch/irq.h>
 | 
			
		||||
#  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 Arduino M0 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_FRQUENCY  - In Hz
 | 
			
		||||
 *    BOARD_CPU_FAILDECT  - Boolean (defined / not defined)
 | 
			
		||||
 *    BOARD_APBA_DIVIDER  - See M_APBASEL_APBADIV_* definitions
 | 
			
		||||
 *    BOARD_APBA_FRQUENCY - In Hz
 | 
			
		||||
 *    BOARD_APBB_DIVIDER  - See M_APBBSEL_APBBDIV_* definitions
 | 
			
		||||
 *    BOARD_APBB_FRQUENCY - In Hz
 | 
			
		||||
 *    BOARD_APBC_DIVIDER  - See M_APBCSEL_APBCDIV_* definitions
 | 
			
		||||
 *    BOARD_APBC_FRQUENCY - 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
 | 
			
		||||
 | 
			
		||||
/* SERCOM0 SPI is available on EXT1
 | 
			
		||||
 *
 | 
			
		||||
 *  PIN PORT SERCOM        FUNCTION
 | 
			
		||||
 *  --- ------------------ -----------
 | 
			
		||||
 *  15  PA5  SERCOM0 PAD1  SPI SS
 | 
			
		||||
 *  16  PA6  SERCOM0 PAD2  SPI MOSI
 | 
			
		||||
 *  17  PA4  SERCOM0 PAD0  SPI MISO
 | 
			
		||||
 *  18  PA7  SERCOM0 PAD3  SPI SCK
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define BOARD_SERCOM0_GCLKGEN        0
 | 
			
		||||
#define BOARD_SERCOM0_SLOW_GCLKGEN   BOARD_SERCOM05_SLOW_GCLKGEN
 | 
			
		||||
#define BOARD_SERCOM0_MUXCONFIG      (SPI_CTRLA_DOPO_DOPAD231 | SPI_CTRLA_DIPAD0)
 | 
			
		||||
#define BOARD_SERCOM0_PINMAP_PAD0    PORT_SERCOM0_PAD0_2 /* SPI_MISO */
 | 
			
		||||
#define BOARD_SERCOM0_PINMAP_PAD1    0                   /* microSD_SS */
 | 
			
		||||
#define BOARD_SERCOM0_PINMAP_PAD2    PORT_SERCOM0_PAD2_2 /* SPI_MOSI */
 | 
			
		||||
#define BOARD_SERCOM0_PINMAP_PAD3    PORT_SERCOM0_PAD3_2 /* SPI_SCK */
 | 
			
		||||
 | 
			
		||||
#define BOARD_SERCOM0_FREQUENCY      BOARD_GCLK0_FREQUENCY
 | 
			
		||||
 | 
			
		||||
/* SERCOM1 SPI is available on EXT2
 | 
			
		||||
 *
 | 
			
		||||
 *  PIN PORT SERCOM        FUNCTION
 | 
			
		||||
 *  --- ------------------ -----------
 | 
			
		||||
 *  15  PA17 SERCOM1 PAD1  SPI SS
 | 
			
		||||
 *  16  PA18 SERCOM1 PAD2  SPI MOSI
 | 
			
		||||
 *  17  PA16 SERCOM1 PAD0  SPI MISO
 | 
			
		||||
 *  18  PA19 SERCOM1 PAD3  SPI SCK
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define BOARD_SERCOM1_GCLKGEN        0
 | 
			
		||||
#define BOARD_SERCOM1_SLOW_GCLKGEN   BOARD_SERCOM05_SLOW_GCLKGEN
 | 
			
		||||
#define BOARD_SERCOM1_MUXCONFIG      (SPI_CTRLA_DOPO_DOPAD231 | SPI_CTRLA_DIPAD0)
 | 
			
		||||
#define BOARD_SERCOM1_PINMAP_PAD0    PORT_SERCOM1_PAD0_1 /* SPI_MISO */
 | 
			
		||||
#define BOARD_SERCOM1_PINMAP_PAD1    0                   /* microSD_SS */
 | 
			
		||||
#define BOARD_SERCOM1_PINMAP_PAD2    PORT_SERCOM1_PAD2_1 /* SPI_MOSI */
 | 
			
		||||
#define BOARD_SERCOM1_PINMAP_PAD3    PORT_SERCOM1_PAD3_1 /* SPI_SCK */
 | 
			
		||||
 | 
			
		||||
#define BOARD_SERCOM1_FREQUENCY      BOARD_GCLK0_FREQUENCY
 | 
			
		||||
 | 
			
		||||
/* The Arduino M0 contains an Embedded Debugger (EDBG) that can be
 | 
			
		||||
 * used to program and debug the ATSAMD21J18A using Serial Wire Debug (SWD).
 | 
			
		||||
 * The Embedded debugger also include a Virtual COM port interface over
 | 
			
		||||
 * SERCOM3.  Virtual COM port connections:
 | 
			
		||||
 *
 | 
			
		||||
 *   PA22 SERCOM3 PAD[0] / USART TXD
 | 
			
		||||
 *   PA23 SERCOM3 PAD[1] / USART RXD
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define BOARD_SERCOM3_GCLKGEN        0
 | 
			
		||||
#define BOARD_SERCOM3_SLOW_GCLKGEN   BOARD_SERCOM05_SLOW_GCLKGEN
 | 
			
		||||
#define BOARD_SERCOM3_MUXCONFIG      (USART_CTRLA_RXPAD1 | USART_CTRLA_TXPAD0_1)
 | 
			
		||||
#define BOARD_SERCOM3_PINMAP_PAD0    PORT_SERCOM3_PAD0_1 /* USART TX */
 | 
			
		||||
#define BOARD_SERCOM3_PINMAP_PAD1    PORT_SERCOM3_PAD1_1 /* USART RX */
 | 
			
		||||
#define BOARD_SERCOM3_PINMAP_PAD2    0
 | 
			
		||||
#define BOARD_SERCOM3_PINMAP_PAD3    0
 | 
			
		||||
 | 
			
		||||
#define BOARD_SERCOM3_FREQUENCY      BOARD_GCLK0_FREQUENCY
 | 
			
		||||
 | 
			
		||||
/* The SERCOM4 USART is available on connectors EXT1, EXT2, and EXT3
 | 
			
		||||
 *
 | 
			
		||||
 *   PIN   EXT1 EXT2 EXT3 GPIO Function
 | 
			
		||||
 *   ----  ---- ---- ---- ------------------
 | 
			
		||||
 *    13   PB09 PB10 PB10 SERCOM4 / USART RX
 | 
			
		||||
 *    14   PB08 PB11 PB11 SERCOM4 / USART TX
 | 
			
		||||
 *    19   GND  GND  GND  N/A
 | 
			
		||||
 *    20   VCC  VCC  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_ARDUINO_M0_USART4_EXT1)
 | 
			
		||||
#  define BOARD_SERCOM4_MUXCONFIG    (USART_CTRLA_RXPAD1 | USART_CTRLA_TXPAD0)
 | 
			
		||||
#  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
 | 
			
		||||
#elif defined(CONFIG_ARDUINO_M0_USART4_EXT2)
 | 
			
		||||
#  define BOARD_SERCOM4_MUXCONFIG    (USART_CTRLA_RXPAD3 | USART_CTRLA_TXPAD2)
 | 
			
		||||
#  define BOARD_SERCOM4_PINMAP_PAD0  0
 | 
			
		||||
#  define BOARD_SERCOM4_PINMAP_PAD1  0
 | 
			
		||||
#  define BOARD_SERCOM4_PINMAP_PAD2  PORT_SERCOM4_PAD2_3 /* USART TX */
 | 
			
		||||
#  define BOARD_SERCOM4_PINMAP_PAD3  PORT_SERCOM4_PAD3_3 /* USART RX */
 | 
			
		||||
#else /* if defined(CONFIG_ARDUINO_M0_USART4_EXT3) */
 | 
			
		||||
#  define BOARD_SERCOM4_MUXCONFIG    (USART_CTRLA_RXPAD3 | USART_CTRLA_TXPAD2)
 | 
			
		||||
#  define BOARD_SERCOM4_PINMAP_PAD0  0
 | 
			
		||||
#  define BOARD_SERCOM4_PINMAP_PAD1  0
 | 
			
		||||
#  define BOARD_SERCOM4_PINMAP_PAD2  PORT_SERCOM4_PAD2_3 /* USART TX */
 | 
			
		||||
#  define BOARD_SERCOM4_PINMAP_PAD3  PORT_SERCOM4_PAD3_3 /* USART RX */
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define BOARD_SERCOM4_FREQUENCY      BOARD_GCLK0_FREQUENCY
 | 
			
		||||
 | 
			
		||||
/* SERCOM5 USART used to Serial Console
 | 
			
		||||
 *
 | 
			
		||||
 *  PIN PORT SERCOM        FUNCTION
 | 
			
		||||
 *  --- ------------------ -----------
 | 
			
		||||
 *  31  PB02 SERCOM5 PAD0  USART TXD
 | 
			
		||||
 *  32  PB03 SERCOM5 PAD1  USART RXD
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define BOARD_SERCOM5_GCLKGEN        0
 | 
			
		||||
#define BOARD_SERCOM5_SLOW_GCLKGEN   BOARD_SERCOM05_SLOW_GCLKGEN
 | 
			
		||||
#define BOARD_SERCOM5_MUXCONFIG      (USART_CTRLA_RXPAD3 | USART_CTRLA_TXPAD2)
 | 
			
		||||
#define BOARD_SERCOM5_PINMAP_PAD0    0
 | 
			
		||||
#define BOARD_SERCOM5_PINMAP_PAD1    0
 | 
			
		||||
#define BOARD_SERCOM5_PINMAP_PAD2    PORT_SERCOM5_PAD2_4 /* USART 5 TXD */
 | 
			
		||||
#define BOARD_SERCOM5_PINMAP_PAD3    PORT_SERCOM5_PAD3_4 /* USART 5 RXD */
 | 
			
		||||
 | 
			
		||||
#define BOARD_SERCOM5_FREQUENCY      BOARD_GCLK0_FREQUENCY
 | 
			
		||||
 | 
			
		||||
/* ADC definitions **********************************************************/
 | 
			
		||||
 | 
			
		||||
#define BOARD_ADC_GCLKGEN        0
 | 
			
		||||
 | 
			
		||||
/* We are using PA3 as Analog Input */
 | 
			
		||||
 | 
			
		||||
#define PORT_AIN1                PORT_AIN1_1
 | 
			
		||||
#define BOARD_ADC_INPUT1         1
 | 
			
		||||
#define BOARD_ADC_NUM_CHANNELS   1
 | 
			
		||||
 | 
			
		||||
/* The negative input is the internal GND */
 | 
			
		||||
 | 
			
		||||
#define BOARD_ADC_NEG            ADC_INPUTCTRL_MUXNEG_GND
 | 
			
		||||
 | 
			
		||||
/* The VREF is the INTVCC1 = 1/2 VDDANA */
 | 
			
		||||
 | 
			
		||||
#define BOARD_ADC_REF            ADC_REFCTRL_REFSEL_INTVCC1
 | 
			
		||||
 | 
			
		||||
/* 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 **********************************************************/
 | 
			
		||||
 | 
			
		||||
/* There are three LEDs on board the Arduino M0 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 STATUS near the SAMD21
 | 
			
		||||
 * USB connector.
 | 
			
		||||
 *
 | 
			
		||||
 * This LED is controlled by PC07 and the LED can be activated by driving
 | 
			
		||||
 * the PB30 to GND.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/* 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 */
 | 
			
		||||
 | 
			
		||||
/* Button definitions *******************************************************/
 | 
			
		||||
 | 
			
		||||
/* Mechanical buttons:
 | 
			
		||||
 *
 | 
			
		||||
 * The Arduino M0 doesn't contain mechanical buttons.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define NUM_BUTTONS                  0
 | 
			
		||||
 | 
			
		||||
#endif /* __BOARDS_ARM_SAMD2L2_ARDUINO_M0_INCLUDE_BOARD_H */
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,63 @@
 | 
			
		|||
############################################################################
 | 
			
		||||
# boards/arm/samd2l2/arduino-m0/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
 | 
			
		||||
 | 
			
		||||
ifeq ($(CONFIG_CYGWIN_WINTOOL),y)
 | 
			
		||||
  ARCHSCRIPT = -T "${shell cygpath -w $(BOARD_DIR)$(DELIM)scripts$(DELIM)$(LDSCRIPT)}"
 | 
			
		||||
else
 | 
			
		||||
  ARCHSCRIPT = -T$(BOARD_DIR)$(DELIM)scripts$(DELIM)$(LDSCRIPT)
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
ifeq ($(CONFIG_DEBUG_SYMBOLS),y)
 | 
			
		||||
  ARCHOPTIMIZATION = -g
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
ifneq ($(CONFIG_DEBUG_NOOPT),y)
 | 
			
		||||
  ARCHOPTIMIZATION += $(MAXOPTIMIZATION) -fno-strict-aliasing -fno-strength-reduce -fomit-frame-pointer
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
ARCHCFLAGS = -fno-builtin
 | 
			
		||||
ARCHCXXFLAGS = -fno-builtin -fno-exceptions -fcheck-new -fno-rtti
 | 
			
		||||
ARCHWARNINGS = -Wall -Wstrict-prototypes -Wshadow -Wundef
 | 
			
		||||
ARCHWARNINGSXX = -Wall -Wshadow -Wundef
 | 
			
		||||
ARCHPICFLAGS = -fpic -msingle-pic-base -mpic-register=r10
 | 
			
		||||
 | 
			
		||||
CFLAGS := $(ARCHCFLAGS) $(ARCHWARNINGS) $(ARCHOPTIMIZATION) $(ARCHCPUFLAGS) $(ARCHINCLUDES) $(ARCHDEFINES) $(EXTRAFLAGS) -pipe
 | 
			
		||||
CPICFLAGS = $(ARCHPICFLAGS) $(CFLAGS)
 | 
			
		||||
CXXFLAGS := $(ARCHCXXFLAGS) $(ARCHWARNINGSXX) $(ARCHOPTIMIZATION) $(ARCHCPUFLAGS) $(ARCHXXINCLUDES) $(ARCHDEFINES) $(EXTRAFLAGS) -pipe
 | 
			
		||||
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
 | 
			
		||||
 | 
			
		||||
ifneq ($(CROSSDEV),arm-nuttx-elf-)
 | 
			
		||||
  LDFLAGS += -nostartfiles -nodefaultlibs
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(CONFIG_DEBUG_SYMBOLS),y)
 | 
			
		||||
  LDFLAGS += -g
 | 
			
		||||
endif
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,111 @@
 | 
			
		|||
/****************************************************************************
 | 
			
		||||
 * boards/arm/samd2l2/arduino-m0/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
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
MEMORY
 | 
			
		||||
{
 | 
			
		||||
  flash (rx)  : ORIGIN = 0x00000000, LENGTH = 256K
 | 
			
		||||
  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(.);
 | 
			
		||||
        *(.init_array .init_array.*)
 | 
			
		||||
        _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) }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,51 @@
 | 
			
		|||
############################################################################
 | 
			
		||||
# boards/arm/samd2l2/arduino-m0/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 sam_bringup.c
 | 
			
		||||
 | 
			
		||||
ifeq ($(CONFIG_SAMD2L2_SERCOM0),y)
 | 
			
		||||
CSRCS += sam_spi.c
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
ifeq ($(CONFIG_ARCH_LEDS),y)
 | 
			
		||||
CSRCS += sam_autoleds.c
 | 
			
		||||
else
 | 
			
		||||
CSRCS += sam_userleds.c
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
ifeq ($(CONFIG_ARCH_BUTTONS),y)
 | 
			
		||||
CSRCS += sam_buttons.c
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
ifeq ($(CONFIG_SAMD2L2_ADC),y)
 | 
			
		||||
CSRCS += sam_adc.c
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
ifeq ($(CONFIG_LIB_BOARDCTL),y)
 | 
			
		||||
CSRCS += sam_appinit.c
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
ifeq ($(CONFIG_USBDEV),y)
 | 
			
		||||
CSRCS += sam_usb.c
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
include $(TOPDIR)/boards/Board.mk
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,122 @@
 | 
			
		|||
/****************************************************************************
 | 
			
		||||
 * boards/arm/samd2l2/arduino-m0/src/arduino_m0.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_ARDUINO_M0_SRC_ARDUINO_M0_H
 | 
			
		||||
#define __BOARDS_ARM_SAMD2L2_ARDUINO_M0_SRC_ARDUINO_M0_H
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Included Files
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#include <nuttx/config.h>
 | 
			
		||||
#include <nuttx/compiler.h>
 | 
			
		||||
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
 | 
			
		||||
#include <arch/irq.h>
 | 
			
		||||
#include <nuttx/irq.h>
 | 
			
		||||
 | 
			
		||||
#include "sam_config.h"
 | 
			
		||||
#include "sam_pinmap.h"
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Pre-processor Definitions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/* LEDs:
 | 
			
		||||
 * There is a LED on board the Arduino M0 board.
 | 
			
		||||
 *
 | 
			
		||||
 * This LED is controlled by PA17 and the LED can be activated by driving
 | 
			
		||||
 * PA17 to High.
 | 
			
		||||
 *
 | 
			
		||||
 * 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_PIN17)
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Public Types
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Public Data
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#ifndef __ASSEMBLY__
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Public Functions Definitions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: sam_bringup
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   Perform architecture-specific initialization
 | 
			
		||||
 *
 | 
			
		||||
 *   CONFIG_BOARD_LATE_INITIALIZE=y :
 | 
			
		||||
 *     Called from board_late_initialize().
 | 
			
		||||
 *
 | 
			
		||||
 *   CONFIG_BOARD_LATE_INITIALIZE=y && CONFIG_LIB_BOARDCTL=y :
 | 
			
		||||
 *     Called from the NSH library
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
int sam_bringup(void);
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: sam_adc_setup
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   Initialize ADC and register the ADC driver.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
int sam_adc_setup(void);
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: sam_spidev_initialize
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   Called to configure SPI chip select PORT pins for the SAM3U-EK board.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
void weak_function sam_spidev_initialize(void);
 | 
			
		||||
 | 
			
		||||
#endif /* __ASSEMBLY__ */
 | 
			
		||||
#endif /* __BOARDS_ARM_SAMD2L2_ARDUINO_M0_SRC_ARDUINO_M0_H */
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,89 @@
 | 
			
		|||
/****************************************************************************
 | 
			
		||||
 * boards/arm/samd2l2/arduino-m0/src/sam_adc.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 <nuttx/config.h>
 | 
			
		||||
 | 
			
		||||
#include <errno.h>
 | 
			
		||||
#include <debug.h>
 | 
			
		||||
 | 
			
		||||
#include <nuttx/board.h>
 | 
			
		||||
#include <nuttx/analog/adc.h>
 | 
			
		||||
#include <arch/board/board.h>
 | 
			
		||||
 | 
			
		||||
#include "chip.h"
 | 
			
		||||
#include "sam_adc.h"
 | 
			
		||||
 | 
			
		||||
#include "arduino_m0.h"
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_ADC
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Public Functions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: sam_adc_setup
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   Initialize ADC and register the ADC driver.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
int sam_adc_setup(void)
 | 
			
		||||
{
 | 
			
		||||
  static bool initialized = false;
 | 
			
		||||
  struct adc_dev_s *adc;
 | 
			
		||||
  int ret;
 | 
			
		||||
 | 
			
		||||
  /* Check if we have already initialized */
 | 
			
		||||
 | 
			
		||||
  if (!initialized)
 | 
			
		||||
    {
 | 
			
		||||
      /* Call sam_adcinitialize() to get an instance of the ADC interface */
 | 
			
		||||
 | 
			
		||||
      adc = sam_adcinitialize(0);
 | 
			
		||||
      if (adc == NULL)
 | 
			
		||||
        {
 | 
			
		||||
          aerr("ERROR: Failed to get ADC interface\n");
 | 
			
		||||
          return -ENODEV;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
      /* Register the ADC driver at "/dev/adc0" */
 | 
			
		||||
 | 
			
		||||
      ret = adc_register("/dev/adc0", adc);
 | 
			
		||||
      if (ret < 0)
 | 
			
		||||
        {
 | 
			
		||||
          aerr("ERROR: adc_register failed: %d\n", ret);
 | 
			
		||||
          return ret;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
      /* Now we are initialized */
 | 
			
		||||
 | 
			
		||||
      initialized = true;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  return OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif /* CONFIG_ADC */
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,71 @@
 | 
			
		|||
/****************************************************************************
 | 
			
		||||
 * boards/arm/samd2l2/arduino-m0/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 <nuttx/config.h>
 | 
			
		||||
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <syslog.h>
 | 
			
		||||
 | 
			
		||||
#include <nuttx/board.h>
 | 
			
		||||
 | 
			
		||||
#include "sam_config.h"
 | 
			
		||||
#include "arduino_m0.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;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,143 @@
 | 
			
		|||
/****************************************************************************
 | 
			
		||||
 * boards/arm/samd2l2/arduino-m0/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.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/* There is a LED on board the Arduino M0 board.
 | 
			
		||||
 *
 | 
			
		||||
 * 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 <nuttx/config.h>
 | 
			
		||||
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
#include <stdbool.h>
 | 
			
		||||
#include <debug.h>
 | 
			
		||||
 | 
			
		||||
#include <nuttx/board.h>
 | 
			
		||||
#include <arch/board/board.h>
 | 
			
		||||
 | 
			
		||||
#include "sam_port.h"
 | 
			
		||||
#include "arduino_m0.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 = false;
 | 
			
		||||
 | 
			
		||||
  switch (led)
 | 
			
		||||
    {
 | 
			
		||||
    case 0:   /* LED_STARTED:      NuttX has been started  STATUS LED=ON
 | 
			
		||||
               * LED_HEAPALLOCATE: Heap has been allocated STATUS LED=ON
 | 
			
		||||
               * LED_IRQSENABLED:  Interrupts enabled      STATUS LED=ON
 | 
			
		||||
               */
 | 
			
		||||
 | 
			
		||||
      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 = true;       /* Set ledstate == false to turn OFF */
 | 
			
		||||
      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, false);
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif /* CONFIG_ARCH_LEDS */
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,99 @@
 | 
			
		|||
/****************************************************************************
 | 
			
		||||
 * boards/arm/samd2l2/arduino-m0/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 <nuttx/config.h>
 | 
			
		||||
 | 
			
		||||
#include <debug.h>
 | 
			
		||||
 | 
			
		||||
#include <nuttx/board.h>
 | 
			
		||||
 | 
			
		||||
#include "sam_config.h"
 | 
			
		||||
#include "arduino_m0.h"
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Pre-processor Definitions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Private Functions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Public Functions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: sam_boardinitialize
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   All SAMD21 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 SPI chip selects if
 | 
			
		||||
   * 1) SPI is not disabled, and
 | 
			
		||||
   * 2) the weak function
 | 
			
		||||
   * sam_spidev_initialize() has been brought into the link.
 | 
			
		||||
   */
 | 
			
		||||
 | 
			
		||||
#ifdef SAMD2L2_HAVE_SPI
 | 
			
		||||
  if (sam_spidev_initialize)
 | 
			
		||||
    {
 | 
			
		||||
      sam_spidev_initialize();
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
  /* Configure on-board LEDs if LED support has been selected. */
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_ARCH_LEDS
 | 
			
		||||
  board_autoled_initialize();
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: board_late_initialize
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   If CONFIG_BOARD_LATE_INITIALIZE is selected, then an additional
 | 
			
		||||
 *   initialization call will be performed in the boot-up sequence to a
 | 
			
		||||
 *   function called board_late_initialize(). board_late_initialize() will be
 | 
			
		||||
 *   called immediately after up_intitialize() is called and just before the
 | 
			
		||||
 *   initial application is started.  This additional initialization phase
 | 
			
		||||
 *   may be used, for example, to initialize board-specific device drivers.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_BOARD_LATE_INITIALIZE
 | 
			
		||||
void board_late_initialize(void)
 | 
			
		||||
{
 | 
			
		||||
  /* Perform board initialization */
 | 
			
		||||
 | 
			
		||||
  (void)sam_bringup();
 | 
			
		||||
}
 | 
			
		||||
#endif /* CONFIG_BOARD_LATE_INITIALIZE */
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,71 @@
 | 
			
		|||
/****************************************************************************
 | 
			
		||||
 * boards/arm/samd2l2/arduino-m0/src/sam_bringup.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 <nuttx/config.h>
 | 
			
		||||
 | 
			
		||||
#include <sys/types.h>
 | 
			
		||||
#include <debug.h>
 | 
			
		||||
 | 
			
		||||
#include <nuttx/board.h>
 | 
			
		||||
 | 
			
		||||
#include "sam_config.h"
 | 
			
		||||
#include "arduino_m0.h"
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Pre-processor Definitions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Private Functions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Public Functions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: sam_bringup
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   Bring up board features
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
int sam_bringup(void)
 | 
			
		||||
{
 | 
			
		||||
  int ret = OK;
 | 
			
		||||
 | 
			
		||||
  /* Configure the ADC driver */
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_SAMD2L2_ADC
 | 
			
		||||
  ret = sam_adc_setup();
 | 
			
		||||
  if (ret < 0)
 | 
			
		||||
    {
 | 
			
		||||
      syslog(LOG_ERR, "Failed to initialize the ADC driver: %d\n", ret);
 | 
			
		||||
      return ret;
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
  return ret;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,289 @@
 | 
			
		|||
/****************************************************************************
 | 
			
		||||
 * boards/arm/samd2l2/arduino-m0/src/sam_spi.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 <nuttx/config.h>
 | 
			
		||||
 | 
			
		||||
#include <stdbool.h>
 | 
			
		||||
#include <debug.h>
 | 
			
		||||
#include <errno.h>
 | 
			
		||||
 | 
			
		||||
#include <nuttx/spi/spi.h>
 | 
			
		||||
 | 
			
		||||
#include "sam_config.h"
 | 
			
		||||
#include "sam_port.h"
 | 
			
		||||
#include "sam_spi.h"
 | 
			
		||||
 | 
			
		||||
#include "arduino_m0.h"
 | 
			
		||||
 | 
			
		||||
#ifdef SAMD2L2_HAVE_SPI
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Public Functions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: sam_spidev_initialize
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   Called to configure SPI chip select PORT pins for the SAMD21 Xplained
 | 
			
		||||
 *   Pro board.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
void weak_function sam_spidev_initialize(void)
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name:  sam_spi[n]select, sam_spi[n]status, and sam_spi[n]cmddata
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   These external functions must be provided by board-specific logic.  They
 | 
			
		||||
 *   include:
 | 
			
		||||
 *
 | 
			
		||||
 *   o sam_spi[n]select is a functions to manage the board-specific chip
 | 
			
		||||
 *     selects
 | 
			
		||||
 *   o sam_spi[n]status and sam_spi[n]cmddata:  Implementations of the status
 | 
			
		||||
 *     and cmddata methods of the SPI interface defined by struct spi_ops_
 | 
			
		||||
 *     (see include/nuttx/spi/spi.h). All other methods including
 | 
			
		||||
 *     sam_spibus_initialize()) are provided by common SAMD/L logic.
 | 
			
		||||
 *
 | 
			
		||||
 *   Where [n] is the SERCOM number for the SPI module.
 | 
			
		||||
 *
 | 
			
		||||
 *   To use this common SPI logic on your board:
 | 
			
		||||
 *
 | 
			
		||||
 *   1. Provide logic in sam_boardinitialize() to configure SPI chip select
 | 
			
		||||
 *      pins.
 | 
			
		||||
 *   2. Provide sam_spi[n]select() and sam_spi[n]status() functions in your
 | 
			
		||||
 *      board-specific logic.  These functions will perform chip selection
 | 
			
		||||
 *      and status operations using GPIOs in the way your board is
 | 
			
		||||
 *      configured.
 | 
			
		||||
 *   2. If CONFIG_SPI_CMDDATA is defined in the NuttX configuration, provide
 | 
			
		||||
 *      sam_spi[n]cmddata() functions in your board-specific logic.  This
 | 
			
		||||
 *      function will perform cmd/data selection operations using GPIOs in
 | 
			
		||||
 *      the way your board is configured.
 | 
			
		||||
 *   3. Add a call to sam_spibus_initialize() in your low level application
 | 
			
		||||
 *      initialization logic
 | 
			
		||||
 *   4. The handle returned by sam_spibus_initialize() may then be used to
 | 
			
		||||
 *      bind the  SPI driver to higher level logic (e.g., calling
 | 
			
		||||
 *      mmcsd_spislotinitialize(), for example, will bind the SPI driver to
 | 
			
		||||
 *      the SPI MMC/SD driver).
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: sam_spi[n]select
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   PIO chip select pins may be programmed by the board specific logic in
 | 
			
		||||
 *   one of two different ways.  First, the pins may be programmed as SPI
 | 
			
		||||
 *   peripherals.  In that case, the pins are completely controlled by the
 | 
			
		||||
 *   SPI driver.  This method still needs to be provided, but it may be only
 | 
			
		||||
 *   a stub.
 | 
			
		||||
 *
 | 
			
		||||
 *   An alternative way to program the PIO chip select pins is as a normal
 | 
			
		||||
 *   GPIO output.  In that case, the automatic control of the CS pins is
 | 
			
		||||
 *   bypassed and this function must provide control of the chip select.
 | 
			
		||||
 *   NOTE:  In this case, the GPIO output pin does *not* have to be the
 | 
			
		||||
 *   same as the NPCS pin normal associated with the chip select number.
 | 
			
		||||
 *
 | 
			
		||||
 * Input Parameters:
 | 
			
		||||
 *   dev - SPI device info
 | 
			
		||||
 *   devid - Identifies the (logical) device
 | 
			
		||||
 *   selected - TRUE:Select the device, FALSE:De-select the device
 | 
			
		||||
 *
 | 
			
		||||
 * Returned Value:
 | 
			
		||||
 *   None
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#ifdef SAMD2L2_HAVE_SPI0
 | 
			
		||||
void sam_spi0select(FAR struct spi_dev_s *dev, uint32_t devid,
 | 
			
		||||
                    bool selected)
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef SAMD2L2_HAVE_SPI1
 | 
			
		||||
void sam_spi1select(FAR struct spi_dev_s *dev, uint32_t devid,
 | 
			
		||||
                    bool selected)
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef SAMD2L2_HAVE_SPI2
 | 
			
		||||
void sam_spi2select(FAR struct spi_dev_s *dev, uint32_t devid,
 | 
			
		||||
                    bool selected)
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef SAMD2L2_HAVE_SPI3
 | 
			
		||||
void sam_spi3select(FAR struct spi_dev_s *dev, uint32_t devid,
 | 
			
		||||
                    bool selected)
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef SAMD2L2_HAVE_SPI4
 | 
			
		||||
void sam_spi4select(FAR struct spi_dev_s *dev, uint32_t devid,
 | 
			
		||||
                    bool selected)
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef SAMD2L2_HAVE_SPI5
 | 
			
		||||
void sam_spi5select(FAR struct spi_dev_s *dev, uint32_t devid,
 | 
			
		||||
                    bool selected)
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: sam_spi[n]status
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   Return status information associated with the SPI device.
 | 
			
		||||
 *
 | 
			
		||||
 * Input Parameters:
 | 
			
		||||
 *   dev - SPI device info
 | 
			
		||||
 *   devid - Identifies the (logical) device
 | 
			
		||||
 *
 | 
			
		||||
 * Returned Value:
 | 
			
		||||
 *   Bit-encoded SPI status (see include/nuttx/spi/spi.h.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#ifdef SAMD2L2_HAVE_SPI0
 | 
			
		||||
uint8_t sam_spi0status(FAR struct spi_dev_s *dev, uint32_t devid)
 | 
			
		||||
{
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef SAMD2L2_HAVE_SPI1
 | 
			
		||||
uint8_t sam_spi1status(FAR struct spi_dev_s *dev, uint32_t devid)
 | 
			
		||||
{
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef SAMD2L2_HAVE_SPI2
 | 
			
		||||
uint8_t sam_spi2status(FAR struct spi_dev_s *dev, uint32_t devid)
 | 
			
		||||
{
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef SAMD2L2_HAVE_SPI3
 | 
			
		||||
uint8_t sam_spi3status(FAR struct spi_dev_s *dev, uint32_t devid)
 | 
			
		||||
{
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef SAMD2L2_HAVE_SPI4
 | 
			
		||||
uint8_t sam_spi4status(FAR struct spi_dev_s *dev, uint32_t devid)
 | 
			
		||||
{
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef SAMD2L2_HAVE_SPI5
 | 
			
		||||
uint8_t sam_spi5status(FAR struct spi_dev_s *dev, uint32_t devid)
 | 
			
		||||
{
 | 
			
		||||
  uint8_t ret = 0;
 | 
			
		||||
  return ret;
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: sam_spi[n]cmddata
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   Some SPI devices require an additional control to determine if the SPI
 | 
			
		||||
 *   data being sent is a command or is data.  If CONFIG_SPI_CMDDATA then
 | 
			
		||||
 *   this function will be called to different be command and data transfers.
 | 
			
		||||
 *
 | 
			
		||||
 *   This is often needed, for example, by LCD drivers.  Some LCD hardware
 | 
			
		||||
 *   may be configured to use 9-bit data transfers with the 9th bit
 | 
			
		||||
 *   indicating command or data.  That same hardware may be configurable,
 | 
			
		||||
 *   instead, to use 8-bit data but to require an additional, board-
 | 
			
		||||
 *   specific GPIO control to distinguish command and data.  This function
 | 
			
		||||
 *   would be needed in that latter case.
 | 
			
		||||
 *
 | 
			
		||||
 * Input Parameters:
 | 
			
		||||
 *   dev - SPI device info
 | 
			
		||||
 *   devid - Identifies the (logical) device
 | 
			
		||||
 *
 | 
			
		||||
 * Returned Value:
 | 
			
		||||
 *   Zero on success; a negated errno on failure.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_SPI_CMDDATA
 | 
			
		||||
#ifdef SAMD2L2_HAVE_SPI0
 | 
			
		||||
int sam_spi0cmddata(FAR struct spi_dev_s *dev, uint32_t devid, bool cmd)
 | 
			
		||||
{
 | 
			
		||||
  return OK;
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef SAMD2L2_HAVE_SPI1
 | 
			
		||||
int sam_spi1cmddata(FAR struct spi_dev_s *dev, uint32_t devid, bool cmd)
 | 
			
		||||
{
 | 
			
		||||
  return OK;
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef SAMD2L2_HAVE_SPI2
 | 
			
		||||
int sam_spi2cmddata(FAR struct spi_dev_s *dev, uint32_t devid, bool cmd)
 | 
			
		||||
{
 | 
			
		||||
  return OK;
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef SAMD2L2_HAVE_SPI3
 | 
			
		||||
int sam_spi3cmddata(FAR struct spi_dev_s *dev, uint32_t devid, bool cmd)
 | 
			
		||||
{
 | 
			
		||||
  return OK;
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef SAMD2L2_HAVE_SPI4
 | 
			
		||||
int sam_spi4cmddata(FAR struct spi_dev_s *dev, uint32_t devid, bool cmd)
 | 
			
		||||
{
 | 
			
		||||
  return OK;
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef SAMD2L2_HAVE_SPI5
 | 
			
		||||
int sam_spi5cmddata(FAR struct spi_dev_s *dev, uint32_t devid, bool cmd)
 | 
			
		||||
{
 | 
			
		||||
  return OK;
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif /* CONFIG_SPI_CMDDATA */
 | 
			
		||||
#endif /* SAMD2L2_HAVE_SPI */
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,110 @@
 | 
			
		|||
/****************************************************************************
 | 
			
		||||
 * boards/arm/samd2l2/arduino-m0/src/sam_usb.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 <nuttx/config.h>
 | 
			
		||||
 | 
			
		||||
#include <sys/types.h>
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
#include <stdbool.h>
 | 
			
		||||
#include <sched.h>
 | 
			
		||||
#include <errno.h>
 | 
			
		||||
#include <assert.h>
 | 
			
		||||
#include <debug.h>
 | 
			
		||||
 | 
			
		||||
#include <nuttx/usb/usbdev.h>
 | 
			
		||||
#include <nuttx/usb/usbhost.h>
 | 
			
		||||
#include <nuttx/usb/usbdev_trace.h>
 | 
			
		||||
 | 
			
		||||
#include "debug.h"
 | 
			
		||||
#include "chip.h"
 | 
			
		||||
#include "sam_port.h"
 | 
			
		||||
#include "saml_periphclks.h"
 | 
			
		||||
#include "arduino_m0.h"
 | 
			
		||||
 | 
			
		||||
#if defined(CONFIG_SAMD2L2_USB)
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Public Functions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: sam_usbinitialize
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   Called from sam_boot very early in initialization to setup
 | 
			
		||||
 *   USB-related GPIO pins for the SAML21-Xplained board.
 | 
			
		||||
 *
 | 
			
		||||
 * USB Ports
 | 
			
		||||
 *   The SAML21 features USB device and host:
 | 
			
		||||
 *
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
void weak_function sam_usbinitialize(void)
 | 
			
		||||
{
 | 
			
		||||
#ifdef HAVE_USBDEV
 | 
			
		||||
 | 
			
		||||
  /* Detect when a target USB cable is connected in self-powered mode */
 | 
			
		||||
 | 
			
		||||
  /* The Engie CE0035 doesn't have VBUS SENSE support */
 | 
			
		||||
 | 
			
		||||
  /* sam_configport(PORT_USB_VBUS_SENSE); */
 | 
			
		||||
 | 
			
		||||
  /* TODO:  Configure an interrupt on VBUS sense */
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef HAVE_USBHOST
 | 
			
		||||
  /* In USB host mode VBUS voltage is provided by the kit and can thus not
 | 
			
		||||
   * identify a connected device, so another GPIO is used to detect
 | 
			
		||||
   * the USB ID of the device.
 | 
			
		||||
   */
 | 
			
		||||
 | 
			
		||||
  /* The Engie CE0035 doesn't have the USB ID pin connected */
 | 
			
		||||
 | 
			
		||||
  /* sam_configport(PORT_USB_ID_DETECT); */  /* ID detect */
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name:  sam_usbsuspend
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   Board logic must provide the sam_usbsuspend logic if the USBDEV driver
 | 
			
		||||
 *   is used.
 | 
			
		||||
 *   This function is called whenever the USB enters or leaves suspend mode.
 | 
			
		||||
 *   This is an opportunity for the board logic to shutdown clocks, power,
 | 
			
		||||
 *   etc. while the USB is suspended.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_USBDEV
 | 
			
		||||
void sam_usb_suspend(FAR struct usbdev_s *dev, bool resume)
 | 
			
		||||
{
 | 
			
		||||
  uinfo("board: resume: %d\n", resume);
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif /* CONFIG_SAMDL_USB */
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,104 @@
 | 
			
		|||
/****************************************************************************
 | 
			
		||||
 * boards/arm/samd2l2/arduino-m0/src/sam_userleds.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.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/* There is a LED on board the Arduino M0.
 | 
			
		||||
 *
 | 
			
		||||
 * This LED is controlled by PA17 and the LED can be activated by driving
 | 
			
		||||
 * PA17 to High.
 | 
			
		||||
 *
 | 
			
		||||
 * When CONFIG_ARCH_LEDS is defined in the NuttX configuration, NuttX will
 | 
			
		||||
 * control the LED.  Otherwise, the LED can be controlled from user
 | 
			
		||||
 * applications using the logic in this file.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Included Files
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#include <nuttx/config.h>
 | 
			
		||||
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
#include <stdbool.h>
 | 
			
		||||
#include <debug.h>
 | 
			
		||||
 | 
			
		||||
#include <arch/board/board.h>
 | 
			
		||||
 | 
			
		||||
#include "sam_port.h"
 | 
			
		||||
#include "arduino_m0.h"
 | 
			
		||||
 | 
			
		||||
#ifndef CONFIG_ARCH_LEDS
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Public Functions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: board_userled_initialize
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   If CONFIG_ARCH_LEDS is defined, then NuttX will control the on-board
 | 
			
		||||
 *   LEDs.  If CONFIG_ARCH_LEDS is not defined, then the
 | 
			
		||||
 *   board_userled_initialize() is available to initialize the LED from user
 | 
			
		||||
 *   application logic.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
uint32_t board_userled_initialize(void)
 | 
			
		||||
{
 | 
			
		||||
  sam_configport(PORT_STATUS_LED);
 | 
			
		||||
  return BOARD_NLEDS;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: board_userled
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   If CONFIG_ARCH_LEDS is defined, then NuttX will control the on-board
 | 
			
		||||
 *  LEDs.  If CONFIG_ARCH_LEDS is not defined, then the board_userled() is
 | 
			
		||||
 *  available to control the LED from user application logic.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
void board_userled(int led, bool ledon)
 | 
			
		||||
{
 | 
			
		||||
  if (led == BOARD_STATUS_LED)
 | 
			
		||||
    {
 | 
			
		||||
      sam_portwrite(PORT_STATUS_LED, !ledon);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: board_userled_all
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   If CONFIG_ARCH_LEDS is defined, then NuttX will control the on-board
 | 
			
		||||
 *   LEDs.
 | 
			
		||||
 *   If CONFIG_ARCH_LEDS is not defined, then the board_userled_all() is
 | 
			
		||||
 *   available to control the LED from user application logic.  NOTE:  since
 | 
			
		||||
 *   there is only a single LED on-board, this is function isn't very useful.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
void board_userled_all(uint32_t ledset)
 | 
			
		||||
{
 | 
			
		||||
  board_userled(BOARD_STATUS_LED, (ledset & BOARD_STATUS_LED_BIT) != 0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif /* !CONFIG_ARCH_LEDS */
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,82 @@
 | 
			
		|||
#
 | 
			
		||||
# For a description of the syntax of this configuration file,
 | 
			
		||||
# see the file kconfig-language.txt in the NuttX tools repository.
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
if ARCH_BOARD_SAMD20_XPLAINED
 | 
			
		||||
 | 
			
		||||
menu "SAMD20 Xplained Pro Modules"
 | 
			
		||||
 | 
			
		||||
config SAMD20_XPLAINED_IOMODULE
 | 
			
		||||
	bool "I/O1 Module"
 | 
			
		||||
	default n
 | 
			
		||||
	---help---
 | 
			
		||||
		The I/O 1 module is attached.  This module provides an MMC/SD card
 | 
			
		||||
		slot.
 | 
			
		||||
 | 
			
		||||
if SAMD20_XPLAINED_IOMODULE
 | 
			
		||||
 | 
			
		||||
choice
 | 
			
		||||
	prompt "I/O1 Module Location"
 | 
			
		||||
	default SAMD20_XPLAINED_IOMODULE_EXT1
 | 
			
		||||
 | 
			
		||||
config SAMD20_XPLAINED_IOMODULE_EXT1
 | 
			
		||||
	bool "EXT1"
 | 
			
		||||
 | 
			
		||||
config SAMD20_XPLAINED_IOMODULE_EXT2
 | 
			
		||||
	bool "EXT2"
 | 
			
		||||
 | 
			
		||||
endchoice
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
config SAMD20_XPLAINED_OLED1MODULE
 | 
			
		||||
	bool "OLED1 Module"
 | 
			
		||||
	default n
 | 
			
		||||
	---help---
 | 
			
		||||
		The OLED 1 module is attached.  This module provides an OLED plus 3
 | 
			
		||||
		additional switches and 3 additional LEDs.
 | 
			
		||||
 | 
			
		||||
if SAMD20_XPLAINED_OLED1MODULE
 | 
			
		||||
 | 
			
		||||
choice
 | 
			
		||||
	prompt "OLED1 Module Location"
 | 
			
		||||
	default SAMD20_XPLAINED_OLED1MODULE_EXT1
 | 
			
		||||
 | 
			
		||||
config SAMD20_XPLAINED_OLED1MODULE_EXT1
 | 
			
		||||
	bool "EXT1"
 | 
			
		||||
 | 
			
		||||
config SAMD20_XPLAINED_OLED1MODULE_EXT2
 | 
			
		||||
	bool "EXT2"
 | 
			
		||||
 | 
			
		||||
endchoice
 | 
			
		||||
endif
 | 
			
		||||
endmenu
 | 
			
		||||
 | 
			
		||||
if USART4_SERIAL_CONSOLE
 | 
			
		||||
choice
 | 
			
		||||
	prompt "USART 4 Connection"
 | 
			
		||||
	default SAMD20_XPLAINED_USART4_EXT3
 | 
			
		||||
 | 
			
		||||
config SAMD20_XPLAINED_USART4_EXT1
 | 
			
		||||
	bool "EXT1"
 | 
			
		||||
	depends on !SAMD20_XPLAINED_OLED1MODULE_EXT1 && !SAMD20_XPLAINED_IOMODULE_EXT1
 | 
			
		||||
	---help---
 | 
			
		||||
		Select this option if the serial console is on SERCOM4 connected via
 | 
			
		||||
		EXT1.  The RX will be on PB9 and TX signal will be on PB8.
 | 
			
		||||
 | 
			
		||||
config SAMD20_XPLAINED_USART4_EXT2
 | 
			
		||||
	bool "EXT2"
 | 
			
		||||
	depends on !SAMD20_XPLAINED_OLED1MODULE_EXT2 && !SAMD20_XPLAINED_IOMODULE_EXT2
 | 
			
		||||
	---help---
 | 
			
		||||
		Select this option if the serial console is on SERCOM4 connected via
 | 
			
		||||
		EXT2.  The RX will be on PB13 and TX signal will be on PB12.
 | 
			
		||||
 | 
			
		||||
config SAMD20_XPLAINED_USART4_EXT3
 | 
			
		||||
	bool "EXT3"
 | 
			
		||||
	---help---
 | 
			
		||||
		Select this option if the serial console is on SERCOM4 connect via
 | 
			
		||||
		EXT3.  The RX will be on PB11 and TX signal will be on PB10.
 | 
			
		||||
 | 
			
		||||
endchoice
 | 
			
		||||
endif
 | 
			
		||||
endif
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,873 @@
 | 
			
		|||
README
 | 
			
		||||
======
 | 
			
		||||
 | 
			
		||||
This README discusses issues unique to NuttX configurations for the
 | 
			
		||||
Atmel SAMD20 Xplained Pro development board.  This board features the
 | 
			
		||||
ATSAMD20J18A MCU.
 | 
			
		||||
 | 
			
		||||
The SAMD20 Xplained Pro Starter Kit may be bundled with three modules:
 | 
			
		||||
 | 
			
		||||
1) I/O1   - An MMC/SD card slot, PWM LED control, ADC light sensor, USART
 | 
			
		||||
            loopback, TWI AT30TSE758 Temperature sensor.
 | 
			
		||||
2) OLED1  - An OLED plus 3 additional switches and 3 additional LEDs
 | 
			
		||||
3) PROTO1 - A prototyping board with logic on board (other than power-related
 | 
			
		||||
            logic).
 | 
			
		||||
 | 
			
		||||
Contents
 | 
			
		||||
========
 | 
			
		||||
 | 
			
		||||
  - STATUS/ISSUES
 | 
			
		||||
  - Modules
 | 
			
		||||
  - Development Environment
 | 
			
		||||
  - GNU Toolchain Options
 | 
			
		||||
  - IDEs
 | 
			
		||||
  - NuttX EABI "buildroot" Toolchain
 | 
			
		||||
  - LEDs
 | 
			
		||||
  - Serial Consoles
 | 
			
		||||
  - Atmel Studio 6.1
 | 
			
		||||
  - SAMD20 Xplained Pro-specific Configuration Options
 | 
			
		||||
  - Configurations
 | 
			
		||||
 | 
			
		||||
STATUS/ISSUES
 | 
			
		||||
=============
 | 
			
		||||
 | 
			
		||||
    1. The FLASH wait states is set to 2 (see include/board.h).  According to
 | 
			
		||||
       the data sheet, it should work at 1 but I sometimes see crashes when
 | 
			
		||||
       the wait states are set to one (about half of the time) (2014-2-18).
 | 
			
		||||
 | 
			
		||||
    2. Garbage appears on the display sometimes after a reset (maybe 20% of
 | 
			
		||||
       the time) or after a power cycle (less after a power cycle).  I don't
 | 
			
		||||
       understand the cause of this but most of this can be eliminated by
 | 
			
		||||
       simply holding the reset button longer and releasing it cleanly
 | 
			
		||||
       (then it fails maybe 5-10% of the time, maybe because of button
 | 
			
		||||
       chatter?) (2014-2-18).
 | 
			
		||||
 | 
			
		||||
       - The garbage is not random:  It is always the same.
 | 
			
		||||
       - This is not effected by BAUD rate.  Curiously, the same garbage
 | 
			
		||||
         appears at different BAUD settings implying that this may not even
 | 
			
		||||
         be clock related???
 | 
			
		||||
       - The program seems to be running normally, just producing bad output.
 | 
			
		||||
 | 
			
		||||
    3. SPI current hangs so not much progress has been made testing the I/O1
 | 
			
		||||
       module.  The hang occurs because the SPI is waiting for SYNCBUSY to
 | 
			
		||||
       be cleared after enabling the SPI.  This even does not happen and so
 | 
			
		||||
       causes the hang.
 | 
			
		||||
 | 
			
		||||
       Another note:  Enabling the SPI on SERCOM0 also seems to interfere
 | 
			
		||||
       with the USART output on SERCOM4.  Both symptoms imply some clock-
 | 
			
		||||
       related issue.
 | 
			
		||||
 | 
			
		||||
       The configuration suggests CONFIG_MMCSD_HAVE_CARDDETECT=y, but as of
 | 
			
		||||
       this writing, there is no support for EIC pin interrupts.
 | 
			
		||||
 | 
			
		||||
    4. OLED1 module is untested.  These instructions were just lifted from
 | 
			
		||||
       the SAM4L Xplained Pro README.txt file.
 | 
			
		||||
 | 
			
		||||
Modules
 | 
			
		||||
=======
 | 
			
		||||
 | 
			
		||||
  The SAMD20 Xplained Pro Starter Kit is bundled with four modules:
 | 
			
		||||
 | 
			
		||||
  I/O1
 | 
			
		||||
  ----
 | 
			
		||||
    The primary function of this module is to provide SD card support, but
 | 
			
		||||
    the full list of modules features include:
 | 
			
		||||
 | 
			
		||||
    - microSD card connector (SPI interface)
 | 
			
		||||
    - PWM (LED control)
 | 
			
		||||
    - ADC (light sensor)
 | 
			
		||||
    - USART loopback
 | 
			
		||||
    - TWI AT30TSE758 Temperature sensor with EEPROM
 | 
			
		||||
 | 
			
		||||
    SPI is available on two of the SAMD20 Xplained connectors, EXT1 and EXT2.
 | 
			
		||||
    They mate with the I/O1 connector as indicated in this table.
 | 
			
		||||
 | 
			
		||||
    I/O1 CONNECTOR
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    I/O1              EXT1                   EXT2                   Other use of either pin
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    1  ID             1                      1                      Communication line to ID chip on
 | 
			
		||||
                                                                    extension board.
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    2  GND            2       GND            2  GND
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    3  LIGHT_SENSOR   3  PB00 AIN[8]         3  PA10 AIN[18]
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    4  LP_OUT         4  PB01 AIN[9]         4  PA11 AIN[19]
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    5  GPIO1          5  PB06 GPIO           5  PA20 GPIO
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    6  GPIO2          6  PB07 GPIO           6  PA21 GPIO
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    7  LED            7  PB02 TC6/WO[0]      7  PA22 TC4/WO[0]
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    8  LP_IN          8  PB03 TC6/WO[1]      8  PA23 TC4/WO[1]
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    9  TEMP_ALERT     9  PB04 EXTINT[4]      9  PB14 EXTINT[14]
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    10 microSD_DETECT 10 PB05 GPIO           10 PB15 GPIO
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    11 TWI SDA        11 PA08 SERCOM2 PAD[0] 11 PA08 SERCOM2 PAD[0] EXT1, EXT2, EXT3 and EDBG
 | 
			
		||||
                              I²C SDA                I²C SDA
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    12 TWI SCL        12 PA09 SERCOM2 PAD[1] 12 PA09 SERCOM2 PAD[1] EXT2, EXT3 and EDBG
 | 
			
		||||
                              I²C SCL                I²C SCL
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    13 USART RX       13 PB09 SERCOM4 PAD[1] 13 PB13 SERCOM4 PAD[1] The SERCOM4 module is shared between
 | 
			
		||||
                              USART RX               USART RX       EXT1, 2 and 3 USART's, but uses
 | 
			
		||||
                                                                    different pins
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    14 USART TX       14 PB08 SERCOM4 PAD[0] 14 PB12 SERCOM4 PAD[0] The SERCOM4 module is shared between
 | 
			
		||||
                              USART TX               USART TX       EXT1, 2 and 3 USART's, but uses
 | 
			
		||||
                                                                    different pins
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    15 microSD_SS     15 PA05 SERCOM0 PAD[1] 15 PA17 SERCOM1 PAD[1]
 | 
			
		||||
                              SPI SS                 SPI SS
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    16 SPI_MOSI       16 PA06 SERCOM0 PAD[2] 16 PA18 SERCOM1 PAD[2]
 | 
			
		||||
                              SPI MOSI               SPI MOSI
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    17 SPI_MISO       17 PA04 SERCOM0 PAD[0] 17 PA16 SERCOM1 PAD[0]
 | 
			
		||||
                              SPI MISO               SPI MISO
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    18 SPI_SCK        18 PA07 SERCOM0 PAD[3] 18 PA19 SERCOM1 PAD[3]
 | 
			
		||||
                              SPI SCK                SPI SCK
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    19 GND            19      GND               GND
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    20 VCC            20      VCC               VCC
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
 | 
			
		||||
    The mapping between the I/O1 pins and the SD connector are shown in the
 | 
			
		||||
    following table.
 | 
			
		||||
 | 
			
		||||
    SD Card Connection
 | 
			
		||||
    ------------------
 | 
			
		||||
    I/O1 SD   PIN Description
 | 
			
		||||
    ---- ---- --- -------------------------------------------------
 | 
			
		||||
         D2   1   Data line 2 (not used)
 | 
			
		||||
    15   D3   2   Data line 3. Active low chip select, pulled high
 | 
			
		||||
    16   CMD  3   Command line, connected to SPI_MOSI.
 | 
			
		||||
    20   VDD  4
 | 
			
		||||
    18   CLK  5   Clock line, connected to SPI_SCK.
 | 
			
		||||
    2/19 GND  6
 | 
			
		||||
    17   D0   7   Data line 0, connected to SPI_MISO.
 | 
			
		||||
         D1   8   Data line 1 (not used)
 | 
			
		||||
    10   SW_A 9   Card detect
 | 
			
		||||
    2/19 SW_B 10  GND
 | 
			
		||||
 | 
			
		||||
    Card Detect
 | 
			
		||||
    -----------
 | 
			
		||||
    When a microSD card is put into the connector SW_A and SW_B are short-
 | 
			
		||||
    circuited. SW_A is connected to the microSD_DETECT signal. To use this
 | 
			
		||||
    as a card indicator remember to enable internal pullup in the target
 | 
			
		||||
    device.
 | 
			
		||||
 | 
			
		||||
    GPIOs
 | 
			
		||||
    -----
 | 
			
		||||
    So all that is required to connect the SD is configure the SPI
 | 
			
		||||
 | 
			
		||||
    --- ------------------ ---------------------- -------------------------------------
 | 
			
		||||
    PIN EXT1               EXT2                   Description
 | 
			
		||||
    --- ------------------ ---------------------- -------------------------------------
 | 
			
		||||
    15 PA05 SERCOM0 PAD[1] 15 PA17 SERCOM1 PAD[1]  Active low chip select OUTPUT, pulled
 | 
			
		||||
            SPI SS                 SPI SS          high on board.
 | 
			
		||||
    --- ------------------ ---------------------- -------------------------------------
 | 
			
		||||
    10 PB05 GPIO           10 PB15 GPIO            Active low card detect INPUT, must
 | 
			
		||||
                                                   use internal pull-up.
 | 
			
		||||
    --- ------------------ ---------------------- -------------------------------------
 | 
			
		||||
 | 
			
		||||
    Configuration Options:
 | 
			
		||||
    ----------------------
 | 
			
		||||
      CONFIG_SAMD20_XPLAINED_IOMODULE=y      : Informs the system that the
 | 
			
		||||
                                              I/O1 module is installed
 | 
			
		||||
      CONFIG_SAMD20_XPLAINED_IOMODULE_EXT1=y : The module is installed in EXT1
 | 
			
		||||
      CONFIG_SAMD20_XPLAINED_IOMODULE_EXT2=y : The mdoule is installed in EXT2
 | 
			
		||||
 | 
			
		||||
    See the set-up in the discussion of the nsh configuration below for other
 | 
			
		||||
    required configuration options.
 | 
			
		||||
 | 
			
		||||
    NOTE: As of this writing, only the SD card slot is supported in the I/O1
 | 
			
		||||
    module.
 | 
			
		||||
 | 
			
		||||
  OLED1
 | 
			
		||||
  -----
 | 
			
		||||
    This module provides an OLED plus 3 additional switches and 3 additional
 | 
			
		||||
    LEDs.
 | 
			
		||||
 | 
			
		||||
    OLED1 CONNECTOR
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    OLED1             EXT1                   EXT2                   Other use of either pin
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    1  ID             1                      1                      Communication line to ID chip on
 | 
			
		||||
                                                                    extension board.
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    2  GND            2       GND            2  GND
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    3  BUTTON2        3  PB00 AIN[8]         3  PA10 AIN[18]
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    4  BUTTON3        4  PB01 AIN[9]         4  PA11 AIN[19]
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    5  DATA_CMD_SEL   5  PB06 GPIO           5  PA20 GPIO
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    6  LED3           6  PB07 GPIO           6  PA21 GPIO
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    7  LED1           7  PB02 TC6/WO[0]      7  PA22 TC4/WO[0]
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    8  LED2           8  PB03 TC6/WO[1]      8  PA23 TC4/WO[1]
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    9  BUTTON1        9  PB04 EXTINT[4]      9  PB14 EXTINT[14]
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    10 DISPLAY_RESET  10 PB05 GPIO           10 PB15 GPIO
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    11 N/C            11 PA08 SERCOM2 PAD[0] 11 PA08 SERCOM2 PAD[0] EXT1, EXT2, EXT3 and EDBG
 | 
			
		||||
                              I²C SDA                I²C SDA
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    12 N/C            12 PA09 SERCOM2 PAD[1] 12 PA09 SERCOM2 PAD[1] EXT2, EXT3 and EDBG
 | 
			
		||||
                              I²C SCL                I²C SCL
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    13 N/C            13 PB09 SERCOM4 PAD[1] 13 PB13 SERCOM4 PAD[1] The SERCOM4 module is shared between
 | 
			
		||||
                              USART RX               USART RX       EXT1, 2 and 3 USART's, but uses
 | 
			
		||||
                                                                    different pins
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    14 N/C            14 PB08 SERCOM4 PAD[0] 14 PB12 SERCOM4 PAD[0] The SERCOM4 module is shared between
 | 
			
		||||
                              USART TX               USART TX       EXT1, 2 and 3 USART's, but uses
 | 
			
		||||
                                                                    different pins
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    15 DISPLAY_SS     15 PA05 SERCOM0 PAD[1] 15 PA17 SERCOM1 PAD[1]
 | 
			
		||||
                              SPI SS                 SPI SS
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    16 SPI_MOSI       16 PA06 SERCOM0 PAD[2] 16 PA18 SERCOM1 PAD[2]
 | 
			
		||||
                              SPI MOSI               SPI MOSI
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    17 N/C            17 PA04 SERCOM0 PAD[0] 17 PA16 SERCOM1 PAD[0]
 | 
			
		||||
                              SPI MISO               SPI MISO
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    18 SPI_SCK        18 PA07 SERCOM0 PAD[3] 18 PA19 SERCOM1 PAD[3]
 | 
			
		||||
                              SPI SCK                SPI SCK
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    19 GND            19      GND               GND
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    20 VCC            20      VCC               VCC
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
 | 
			
		||||
    Configuration Options:
 | 
			
		||||
    ----------------------
 | 
			
		||||
      CONFIG_SAMD20_XPLAINED_OLED1MODULE=y      : Informs the system that the
 | 
			
		||||
                                                 I/O1 module is installed
 | 
			
		||||
      CONFIG_SAMD20_XPLAINED_OLED1MODULE_EXT1=y : The module is installed in EXT1
 | 
			
		||||
      CONFIG_SAMD20_XPLAINED_OLED1MODULE_EXT2=y : The mdoule is installed in EXT2
 | 
			
		||||
 | 
			
		||||
    See the set-up in the discussion of the nsh configuration below for other
 | 
			
		||||
    required configuration options.
 | 
			
		||||
 | 
			
		||||
  PROTO1
 | 
			
		||||
  ------
 | 
			
		||||
  A prototyping board with logic on board (other than power-related logic).
 | 
			
		||||
  There is no built-in support for the PROTO1 module.
 | 
			
		||||
 | 
			
		||||
Development Environment
 | 
			
		||||
=======================
 | 
			
		||||
 | 
			
		||||
  Either Linux or Cygwin on Windows can be used for the development environment.
 | 
			
		||||
  The source has been built only using the GNU toolchain (see below).  Other
 | 
			
		||||
  toolchains will likely cause problems. Testing was performed using the Cygwin
 | 
			
		||||
  environment.
 | 
			
		||||
 | 
			
		||||
GNU Toolchain Options
 | 
			
		||||
=====================
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  The NuttX make system can be configured to support the various different
 | 
			
		||||
  toolchain options.  All testing has been conducted using the NuttX buildroot
 | 
			
		||||
  toolchain.  To use alternative toolchain, you simply need to add change of
 | 
			
		||||
  the following configuration options to your .config (or defconfig) file:
 | 
			
		||||
 | 
			
		||||
    CONFIG_ARMV6M_TOOLCHAIN_BUILDROOT=y  : NuttX buildroot under Linux or Cygwin (default)
 | 
			
		||||
    CONFIG_ARMV6M_TOOLCHAIN_GNU_EABIL=y  : Generic GCC ARM EABI toolchain for Linux
 | 
			
		||||
    CONFIG_ARMV6M_TOOLCHAIN_GNU_EABIW=y  : Generic GCC ARM EABI toolchain for Windows
 | 
			
		||||
 | 
			
		||||
  NOTE about Windows native toolchains
 | 
			
		||||
  ------------------------------------
 | 
			
		||||
 | 
			
		||||
  There are basically three kinds of GCC toolchains that can be used:
 | 
			
		||||
 | 
			
		||||
    1. A Linux native toolchain in a Linux environment,
 | 
			
		||||
    2. The buildroot Cygwin tool chain built in the Cygwin environment,
 | 
			
		||||
    3. A Windows native toolchain.
 | 
			
		||||
 | 
			
		||||
  There are several limitations to using a Windows based toolchain (#3) in a
 | 
			
		||||
  Cygwin environment.  The three biggest are:
 | 
			
		||||
 | 
			
		||||
  1. The Windows toolchain cannot follow Cygwin paths.  Path conversions are
 | 
			
		||||
     performed automatically in the Cygwin makefiles using the 'cygpath'
 | 
			
		||||
     utility but you might easily find some new path problems.  If so, check
 | 
			
		||||
     out 'cygpath -w'
 | 
			
		||||
 | 
			
		||||
  2. Windows toolchains cannot follow Cygwin symbolic links.  Many symbolic
 | 
			
		||||
     links are used in NuttX (e.g., include/arch).  The make system works
 | 
			
		||||
     around these problems for the Windows tools by copying directories
 | 
			
		||||
     instead of linking them. But this can also cause some confusion for
 | 
			
		||||
     you:  For example, you may edit a file in a "linked" directory and find
 | 
			
		||||
     that your changes had no effect.  That is because you are building the
 | 
			
		||||
     copy of the file in the "fake" symbolic directory.  If you use a
 | 
			
		||||
     Windows toolchain, you should get in the habit of making like this:
 | 
			
		||||
 | 
			
		||||
       make clean_context all
 | 
			
		||||
 | 
			
		||||
     An alias in your .bashrc file might make that less painful.
 | 
			
		||||
 | 
			
		||||
IDEs
 | 
			
		||||
====
 | 
			
		||||
 | 
			
		||||
  NuttX is built using command-line make.  It can be used with an IDE, but some
 | 
			
		||||
  effort will be required to create the project.
 | 
			
		||||
 | 
			
		||||
  Makefile Build
 | 
			
		||||
  --------------
 | 
			
		||||
  Under Eclipse, it is pretty easy to set up an "empty makefile project" and
 | 
			
		||||
  simply use the NuttX makefile to build the system.  That is almost for free
 | 
			
		||||
  under Linux.  Under Windows, you will need to set up the "Cygwin GCC" empty
 | 
			
		||||
  makefile project in order to work with Windows (Google for "Eclipse Cygwin" -
 | 
			
		||||
  there is a lot of help on the internet).
 | 
			
		||||
 | 
			
		||||
  Native Build
 | 
			
		||||
  ------------
 | 
			
		||||
  Here are a few tips before you start that effort:
 | 
			
		||||
 | 
			
		||||
  1) Select the toolchain that you will be using in your .config file
 | 
			
		||||
  2) Start the NuttX build at least one time from the Cygwin command line
 | 
			
		||||
     before trying to create your project.  This is necessary to create
 | 
			
		||||
     certain auto-generated files and directories that will be needed.
 | 
			
		||||
  3) Set up include paths:  You will need include/, arch/arm/src/sam34,
 | 
			
		||||
     arch/arm/src/common, arch/arm/src/armv7-m, and sched/.
 | 
			
		||||
  4) All assembly files need to have the definition option -D __ASSEMBLY__
 | 
			
		||||
     on the command line.
 | 
			
		||||
 | 
			
		||||
  Startup files will probably cause you some headaches.  The NuttX startup file
 | 
			
		||||
  is arch/arm/src/sam34/sam_vectors.S.  You may need to build NuttX
 | 
			
		||||
  one time from the Cygwin command line in order to obtain the pre-built
 | 
			
		||||
  startup object needed by an IDE.
 | 
			
		||||
 | 
			
		||||
NuttX EABI "buildroot" Toolchain
 | 
			
		||||
================================
 | 
			
		||||
 | 
			
		||||
  A GNU GCC-based toolchain is assumed.  The PATH environment variable should
 | 
			
		||||
  be modified to point to the correct path to the Cortex-M0 GCC toolchain (if
 | 
			
		||||
  different from the default in your PATH variable).
 | 
			
		||||
 | 
			
		||||
  If you have no Cortex-M0 toolchain, one can be downloaded from the NuttX
 | 
			
		||||
  Bitbucket download site (https://bitbucket.org/nuttx/buildroot/downloads/).
 | 
			
		||||
  This GNU toolchain builds and executes in the Linux or Cygwin environment.
 | 
			
		||||
 | 
			
		||||
  1. You must have already configured NuttX in <some-dir>/nuttx.
 | 
			
		||||
 | 
			
		||||
     tools/configure.sh samd20-xplained:<sub-dir>
 | 
			
		||||
 | 
			
		||||
  2. Download the latest buildroot package into <some-dir>
 | 
			
		||||
 | 
			
		||||
  3. unpack the buildroot tarball.  The resulting directory may
 | 
			
		||||
     have versioning information on it like buildroot-x.y.z.  If so,
 | 
			
		||||
     rename <some-dir>/buildroot-x.y.z to <some-dir>/buildroot.
 | 
			
		||||
 | 
			
		||||
  4. cd <some-dir>/buildroot
 | 
			
		||||
 | 
			
		||||
  5. cp boards/cortexm0-eabi-defconfig-4.6.3 .config
 | 
			
		||||
 | 
			
		||||
  6. make oldconfig
 | 
			
		||||
 | 
			
		||||
  7. make
 | 
			
		||||
 | 
			
		||||
  8. Make sure that the PATH variable includes the path to the newly built
 | 
			
		||||
     binaries.
 | 
			
		||||
 | 
			
		||||
  See the file boards/README.txt in the buildroot source tree.  That has more
 | 
			
		||||
  details PLUS some special instructions that you will need to follow if you are
 | 
			
		||||
  building a Cortex-M0 toolchain for Cygwin under Windows.
 | 
			
		||||
 | 
			
		||||
LEDs
 | 
			
		||||
====
 | 
			
		||||
 | 
			
		||||
  There is one yellow LED available on the SAM D20 Xplained Pro board that
 | 
			
		||||
  can be turned on and off. The LED can be activated by driving the connected
 | 
			
		||||
  PA14 I/O line to GND.
 | 
			
		||||
 | 
			
		||||
  When CONFIG_ARCH_LEDS is defined in the NuttX configuration, NuttX will
 | 
			
		||||
  control the LED as follows:
 | 
			
		||||
 | 
			
		||||
    SYMBOL              Meaning                 LED0
 | 
			
		||||
    ------------------- ----------------------- ------
 | 
			
		||||
    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 is LED is statically on, NuttX has successfully  booted and is,
 | 
			
		||||
  apparently, running normally.  If LED is flashing at approximately
 | 
			
		||||
  2Hz, then a fatal error has been detected and the system has halted.
 | 
			
		||||
 | 
			
		||||
Serial Consoles
 | 
			
		||||
===============
 | 
			
		||||
 | 
			
		||||
  SERCOM4
 | 
			
		||||
  ------
 | 
			
		||||
 | 
			
		||||
  SERCOM4 is available on connectors EXT1, EXT2, and EXT3, but using
 | 
			
		||||
  different PORT pins:
 | 
			
		||||
 | 
			
		||||
    PIN   EXT1 EXT2 EXT3 GPIO Function
 | 
			
		||||
    ----  ---- ---- ---- ------------------
 | 
			
		||||
     13   PB09 PB13 PB11 SERCOM4 / USART RX
 | 
			
		||||
     14   PB08 PB12 PB12 SERCOM4 / USART TX
 | 
			
		||||
     19   GND  GND  GND  N/A
 | 
			
		||||
     20   VCC  VCC  VCC  N/A
 | 
			
		||||
 | 
			
		||||
  There are options available in the NuttX configuration to select which
 | 
			
		||||
  connector SERCOM4 is on:  SAMD20_XPLAINED_USART4_EXTn, where n=1, 2, or 3.
 | 
			
		||||
 | 
			
		||||
  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 these
 | 
			
		||||
  configurations.  An option is to use the virtual COM port.
 | 
			
		||||
 | 
			
		||||
  Virtual COM Port
 | 
			
		||||
  ----------------
 | 
			
		||||
 | 
			
		||||
  The SAMD20 Xplained Pro contains an Embedded Debugger (EDBG) that can be
 | 
			
		||||
  used to program and debug the ATSAMD20J18A using Serial Wire Debug (SWD).
 | 
			
		||||
  The Embedded debugger also include a Virtual COM port interface over
 | 
			
		||||
  SERCOM3.  Virtual COM port connections:
 | 
			
		||||
 | 
			
		||||
    PA24 SERCOM3 / USART TXD
 | 
			
		||||
    PA25 SERCOM3 / USART RXD
 | 
			
		||||
 | 
			
		||||
Atmel Studio 6.1
 | 
			
		||||
================
 | 
			
		||||
 | 
			
		||||
  Loading Code into FLASH:
 | 
			
		||||
  -----------------------
 | 
			
		||||
 | 
			
		||||
  Tools menus:  Tools -> Device Programming.
 | 
			
		||||
 | 
			
		||||
  Debugging the NuttX Object File
 | 
			
		||||
  -------------------------------
 | 
			
		||||
 | 
			
		||||
  1) Rename object file from nutt to nuttx.elf.  That is an extension that
 | 
			
		||||
     will be recognized by the file menu.
 | 
			
		||||
 | 
			
		||||
  2) File menu: File -> Open -> Open object file for debugging
 | 
			
		||||
 | 
			
		||||
     - Select nuttx.elf object file
 | 
			
		||||
     - Select AT91SAMD20J18
 | 
			
		||||
     - Select files for symbols as desired
 | 
			
		||||
     - Select debugger
 | 
			
		||||
 | 
			
		||||
  3) Debug menu: Debug -> Start debugging and break
 | 
			
		||||
 | 
			
		||||
     - This will reload the nuttx.elf file into FLASH
 | 
			
		||||
 | 
			
		||||
SAMD20 Xplained Pro-specific Configuration Options
 | 
			
		||||
==================================================
 | 
			
		||||
 | 
			
		||||
    CONFIG_ARCH - Identifies the arch/ subdirectory.  This should
 | 
			
		||||
       be set to:
 | 
			
		||||
 | 
			
		||||
       CONFIG_ARCH=arm
 | 
			
		||||
 | 
			
		||||
    CONFIG_ARCH_family - For use in C code:
 | 
			
		||||
 | 
			
		||||
       CONFIG_ARCH_ARM=y
 | 
			
		||||
 | 
			
		||||
    CONFIG_ARCH_architecture - For use in C code:
 | 
			
		||||
 | 
			
		||||
       CONFIG_ARCH_CORTEXM0=y
 | 
			
		||||
 | 
			
		||||
    CONFIG_ARCH_CHIP - Identifies the arch/*/chip subdirectory
 | 
			
		||||
 | 
			
		||||
       CONFIG_ARCH_CHIP="samd2l2"
 | 
			
		||||
 | 
			
		||||
    CONFIG_ARCH_CHIP_name - For use in C code to identify the exact
 | 
			
		||||
       chip:
 | 
			
		||||
 | 
			
		||||
       CONFIG_ARCH_CHIP_SAMD2X
 | 
			
		||||
       CONFIG_ARCH_CHIP_SAMD20
 | 
			
		||||
       CONFIG_ARCH_CHIP_ATSAMD20J18
 | 
			
		||||
 | 
			
		||||
    CONFIG_ARCH_BOARD - Identifies the boards/ subdirectory and
 | 
			
		||||
       hence, the board that supports the particular chip or SoC.
 | 
			
		||||
 | 
			
		||||
       CONFIG_ARCH_BOARD=samd20-xplained (for the SAMD20 Xplained Pro development board)
 | 
			
		||||
 | 
			
		||||
    CONFIG_ARCH_BOARD_name - For use in C code
 | 
			
		||||
 | 
			
		||||
       CONFIG_ARCH_BOARD_SAMD20_XPLAINED=y
 | 
			
		||||
 | 
			
		||||
    CONFIG_ARCH_LOOPSPERMSEC - Must be calibrated for correct operation
 | 
			
		||||
       of delay loops
 | 
			
		||||
 | 
			
		||||
    CONFIG_ENDIAN_BIG - define if big endian (default is little
 | 
			
		||||
       endian)
 | 
			
		||||
 | 
			
		||||
    CONFIG_RAM_SIZE - Describes the installed DRAM (SRAM in this case):
 | 
			
		||||
 | 
			
		||||
       CONFIG_RAM_SIZE=0x00010000 (64KB)
 | 
			
		||||
 | 
			
		||||
    CONFIG_RAM_START - The start address of installed DRAM
 | 
			
		||||
 | 
			
		||||
       CONFIG_RAM_START=0x20000000
 | 
			
		||||
 | 
			
		||||
    CONFIG_ARCH_LEDS - Use LEDs to show state. Unique to boards that
 | 
			
		||||
       have LEDs
 | 
			
		||||
 | 
			
		||||
    CONFIG_ARCH_INTERRUPTSTACK - This architecture supports an interrupt
 | 
			
		||||
       stack. If defined, this symbol is the size of the interrupt
 | 
			
		||||
        stack in bytes.  If not defined, the user task stacks will be
 | 
			
		||||
      used during interrupt handling.
 | 
			
		||||
 | 
			
		||||
    CONFIG_ARCH_STACKDUMP - Do stack dumps after assertions
 | 
			
		||||
 | 
			
		||||
    CONFIG_ARCH_LEDS -  Use LEDs to show state. Unique to board architecture.
 | 
			
		||||
 | 
			
		||||
  Individual subsystems can be enabled:
 | 
			
		||||
 | 
			
		||||
    CONFIG_SAMD2L2_WDT     - Watchdog Timer"
 | 
			
		||||
    CONFIG_SAMD2L2_RTC     - Real Time Counter"
 | 
			
		||||
    CONFIG_SAMD2L2_NVMCTRL - Non-Volatile Memory Controller"
 | 
			
		||||
    CONFIG_SAMD2L2_EVSYS   - Event System"
 | 
			
		||||
    CONFIG_SAMD2L2_SERCOM0 - Serial Communication Interface 0"
 | 
			
		||||
    CONFIG_SAMD2L2_SERCOM1 - Serial Communication Interface 1"
 | 
			
		||||
    CONFIG_SAMD2L2_SERCOM2 - Serial Communication Interface 2"
 | 
			
		||||
    CONFIG_SAMD2L2_SERCOM3 - Serial Communication Interface 3"
 | 
			
		||||
    CONFIG_SAMD2L2_SERCOM4 - Serial Communication Interface 4"
 | 
			
		||||
    CONFIG_SAMD2L2_SERCOM5 - Serial Communication Interface 5"
 | 
			
		||||
    CONFIG_SAMD2L2_TC0     - Timer/Counter 0"
 | 
			
		||||
    CONFIG_SAMD2L2_TC1     - Timer/Counter 1"
 | 
			
		||||
    CONFIG_SAMD2L2_TC2     - Timer/Counter 2"
 | 
			
		||||
    CONFIG_SAMD2L2_TC3     - Timer/Counter 3"
 | 
			
		||||
    CONFIG_SAMD2L2_TC4     - Timer/Counter 4"
 | 
			
		||||
    CONFIG_SAMD2L2_TC5     - Timer/Counter 5"
 | 
			
		||||
    CONFIG_SAMD2L2_TC6     - Timer/Counter 6"
 | 
			
		||||
    CONFIG_SAMD2L2_TC7     - Timer/Counter 6"
 | 
			
		||||
    CONFIG_SAMD2L2_ADC     - Analog-to-Digital Converter"
 | 
			
		||||
    CONFIG_SAMD2L2_AC      - Analog Comparator"
 | 
			
		||||
    CONFIG_SAMD2L2_DAC     - Digital-to-Analog Converter"
 | 
			
		||||
    CONFIG_SAMD2L2_PTC     - Peripheral Touch Controller"
 | 
			
		||||
 | 
			
		||||
  Some subsystems can be configured to operate in different ways. The drivers
 | 
			
		||||
  need to know how to configure the subsystem.
 | 
			
		||||
 | 
			
		||||
    CONFIG_SAMD2L2_SERCOM0_ISI2C, CONFIG_SAMD2L2_SERCOM0_ISSPI, or CONFIG_SAMD2L2_SERCOM0_ISUSART
 | 
			
		||||
    CONFIG_SAMD2L2_SERCOM1_ISI2C, CONFIG_SAMD2L2_SERCOM1_ISSPI, or CONFIG_SAMD2L2_SERCOM1_ISUSART
 | 
			
		||||
    CONFIG_SAMD2L2_SERCOM2_ISI2C, CONFIG_SAMD2L2_SERCOM2_ISSPI, or CONFIG_SAMD2L2_SERCOM2_ISUSART
 | 
			
		||||
    CONFIG_SAMD2L2_SERCOM3_ISI2C, CONFIG_SAMD2L2_SERCOM3_ISSPI, or CONFIG_SAMD2L2_SERCOM3_ISUSART
 | 
			
		||||
    CONFIG_SAMD2L2_SERCOM4_ISI2C, CONFIG_SAMD2L2_SERCOM4_ISSPI, or CONFIG_SAMD2L2_SERCOM4_ISUSART
 | 
			
		||||
    CONFIG_SAMD2L2_SERCOM5_ISI2C, CONFIG_SAMD2L2_SERCOM5_ISSPI, or CONFIG_SAMD2L2_SERCOM5_ISUSART
 | 
			
		||||
 | 
			
		||||
  SAMD20 specific device driver settings
 | 
			
		||||
 | 
			
		||||
    CONFIG_USARTn_SERIAL_CONSOLE - selects the USARTn (n=0,1,2,..5) for the
 | 
			
		||||
      console and ttys0 (default is the USART4).
 | 
			
		||||
    CONFIG_USARTn_RXBUFSIZE - Characters are buffered as received.
 | 
			
		||||
       This specific the size of the receive buffer
 | 
			
		||||
    CONFIG_USARTn_TXBUFSIZE - Characters are buffered before
 | 
			
		||||
       being sent.  This specific the size of the transmit buffer
 | 
			
		||||
    CONFIG_USARTn_BAUD - The configure BAUD of the USART.  Must be
 | 
			
		||||
    CONFIG_USARTn_BITS - The number of bits.  Must be either 7 or 8.
 | 
			
		||||
    CONFIG_USARTn_PARTIY - 0=no parity, 1=odd parity, 2=even parity
 | 
			
		||||
    CONFIG_USARTn_2STOP - Two stop bits
 | 
			
		||||
 | 
			
		||||
Configurations
 | 
			
		||||
==============
 | 
			
		||||
 | 
			
		||||
  Each SAMD20 Xplained Pro configuration is maintained in a sub-directory and
 | 
			
		||||
  can be selected as follow:
 | 
			
		||||
 | 
			
		||||
    tools/configure.sh samd20-xplained:<subdir>
 | 
			
		||||
 | 
			
		||||
  Before building, make sure that the PATH environment variable include the
 | 
			
		||||
  correct path to the directory than holds your toolchain binaries.
 | 
			
		||||
 | 
			
		||||
  And then build NuttX by simply typing the following.  At the conclusion of
 | 
			
		||||
  the make, the nuttx binary will reside in an ELF file called, simply, nuttx.
 | 
			
		||||
 | 
			
		||||
    make
 | 
			
		||||
 | 
			
		||||
  The <subdir> that is provided above as an argument to the tools/configure.sh
 | 
			
		||||
  must be is one of the following.
 | 
			
		||||
 | 
			
		||||
  NOTE:  These configurations use the mconf-based configuration tool.  To
 | 
			
		||||
  change any of these configurations using that tool, you should:
 | 
			
		||||
 | 
			
		||||
    a. Build and install the kconfig-mconf tool.  See nuttx/README.txt
 | 
			
		||||
       see additional README.txt files in the NuttX tools repository.
 | 
			
		||||
 | 
			
		||||
    b. Execute 'make menuconfig' in nuttx/ in order to start the
 | 
			
		||||
       reconfiguration process.
 | 
			
		||||
 | 
			
		||||
  NOTES:
 | 
			
		||||
 | 
			
		||||
  1. These configurations use the mconf-based configuration tool.  To
 | 
			
		||||
    change any of these configurations using that tool, you should:
 | 
			
		||||
 | 
			
		||||
    a. Build and install the kconfig-mconf tool.  See nuttx/README.txt
 | 
			
		||||
       see additional README.txt files in the NuttX tools repository.
 | 
			
		||||
 | 
			
		||||
    b. Execute 'make menuconfig' in nuttx/ in order to start the
 | 
			
		||||
       reconfiguration process.
 | 
			
		||||
 | 
			
		||||
  2. Unless stated otherwise, all configurations generate console
 | 
			
		||||
     output of on SERCOM4 which is available on EXT1, EXT2, or EXT3 (see
 | 
			
		||||
     the section "Serial Consoles" above).  The virtual COM port could
 | 
			
		||||
     be used, instead, by reconfiguring to use SERCOM3 instead of
 | 
			
		||||
     SERCOM4:
 | 
			
		||||
 | 
			
		||||
       System Type -> SAMD/L Peripheral Support
 | 
			
		||||
         CONFIG_SAMD2L2_SERCOM3=y  : Enable one or both
 | 
			
		||||
         CONFIG_SAMD2L2_SERCOM4=n
 | 
			
		||||
 | 
			
		||||
       Device Drivers -> Serial Driver Support -> Serial Console
 | 
			
		||||
         CONFIG_USART4_SERIAL_CONSOLE=y  : Select only one for the console
 | 
			
		||||
         CONFIG_USART4_SERIAL_CONSOLE=n
 | 
			
		||||
 | 
			
		||||
       Device Drivers -> Serial Driver Support -> SERCOM3 Configuration
 | 
			
		||||
         CONFIG_USART3_2STOP=0
 | 
			
		||||
         CONFIG_USART3_BAUD=115200
 | 
			
		||||
         CONFIG_USART3_BITS=8
 | 
			
		||||
         CONFIG_USART3_PARITY=0
 | 
			
		||||
         CONFIG_USART3_RXBUFSIZE=256
 | 
			
		||||
         CONFIG_USART3_TXBUFSIZE=256
 | 
			
		||||
 | 
			
		||||
       Device Drivers -> Serial Driver Support -> SERCOM4 Configuration
 | 
			
		||||
         CONFIG_USART4_2STOP=0
 | 
			
		||||
         CONFIG_USART4_BAUD=115200
 | 
			
		||||
         CONFIG_USART4_BITS=8
 | 
			
		||||
         CONFIG_USART4_PARITY=0
 | 
			
		||||
         CONFIG_USART4_RXBUFSIZE=256
 | 
			
		||||
         CONFIG_USART4_TXBUFSIZE=256
 | 
			
		||||
 | 
			
		||||
       Board Selection -> USART4 Connection
 | 
			
		||||
         CONFIG_SAMD20_XPLAINED_USART4_EXT1=n : Pick on if USART4 used
 | 
			
		||||
         CONFIG_SAMD20_XPLAINED_USART4_EXT2=n
 | 
			
		||||
         CONFIG_SAMD20_XPLAINED_USART4_EXT3=y
 | 
			
		||||
 | 
			
		||||
  3. Unless otherwise stated, the configurations are setup for
 | 
			
		||||
     Cygwin under Windows:
 | 
			
		||||
 | 
			
		||||
     Build Setup:
 | 
			
		||||
       CONFIG_HOST_WINDOWS=y   : Windows Host
 | 
			
		||||
       CONFIG_WINDOWS_CYGWIN=y : Cygwin environment on windows
 | 
			
		||||
 | 
			
		||||
  4. These configurations use the GNU EABI toolchain.  But
 | 
			
		||||
     that is easily reconfigured:
 | 
			
		||||
 | 
			
		||||
     System Type -> Toolchain:
 | 
			
		||||
       CONFIG_ARMV6M_TOOLCHAIN_GNU_EABIW=y
 | 
			
		||||
 | 
			
		||||
     Any re-configuration should be done before making NuttX or else the
 | 
			
		||||
     subsequent 'make' will fail.  If you have already attempted building
 | 
			
		||||
     NuttX then you will have to 1) 'make distclean' to remove the old
 | 
			
		||||
     configuration, 2) 'tools/configure.sh sam3u-ek/ksnh' to start
 | 
			
		||||
     with a fresh configuration, and 3) perform the configuration changes
 | 
			
		||||
     above.
 | 
			
		||||
 | 
			
		||||
     Also, make sure that your PATH variable has the new path to your
 | 
			
		||||
     Atmel tools.  Try 'which arm-none-eabi-gcc' to make sure that you
 | 
			
		||||
     are selecting the right tool.
 | 
			
		||||
 | 
			
		||||
     See also the "NOTE about Windows native toolchains" in the section
 | 
			
		||||
     called "GNU Toolchain Options" above.
 | 
			
		||||
 | 
			
		||||
Configuration sub-directories
 | 
			
		||||
-----------------------------
 | 
			
		||||
 | 
			
		||||
  nsh:
 | 
			
		||||
    This configuration directory will built the NuttShell.  See NOTES above
 | 
			
		||||
    and below:
 | 
			
		||||
 | 
			
		||||
    NOTES:
 | 
			
		||||
 | 
			
		||||
    1. This configuration is set up to build on Windows using the Cygwin
 | 
			
		||||
       environment using the ARM EABI toolchain.  This can be easily
 | 
			
		||||
       changed as described above under "Configurations."
 | 
			
		||||
 | 
			
		||||
    2. By default, this configuration provides a serial console on SERCOM4
 | 
			
		||||
       at 115200 8N1 via EXT3:
 | 
			
		||||
 | 
			
		||||
       PIN   EXT3 GPIO Function
 | 
			
		||||
       ----  ---- ------------------
 | 
			
		||||
        13   PB11 SERCOM4 / USART RX
 | 
			
		||||
        14   PB12 SERCOM4 / USART TX
 | 
			
		||||
        19   GND  N/A
 | 
			
		||||
        20   VCC  N/A
 | 
			
		||||
 | 
			
		||||
       If you would prefer to use the EDBG serial COM port or would prefer
 | 
			
		||||
       to use SERCOM4 on EXT1 or EXT2, you will need to reconfigure the
 | 
			
		||||
       SERCOM as described under "Configurations".  See also the section
 | 
			
		||||
       entitled "Serial Consoles" above.
 | 
			
		||||
 | 
			
		||||
    3. NOTE: If you get a compilation error like:
 | 
			
		||||
 | 
			
		||||
         libxx_new.cxx:74:40: error: 'operator new' takes type 'size_t'
 | 
			
		||||
                              ('unsigned int') as first parameter [-fper
 | 
			
		||||
 | 
			
		||||
       Sometimes NuttX and your toolchain will disagree on the underlying
 | 
			
		||||
       type of size_t; sometimes it is an 'unsigned int' and sometimes it is
 | 
			
		||||
       an 'unsigned long int'.  If this error occurs, then you may need to
 | 
			
		||||
       toggle the value of CONFIG_ARCH_SIZET_LONG.
 | 
			
		||||
 | 
			
		||||
    4. If the I/O1 module is connected to the SAMD20 Xplained Pro, then
 | 
			
		||||
       support for the SD card slot can be enabled by making the following
 | 
			
		||||
       changes to the configuration.  These changes assume that the I/O1
 | 
			
		||||
       modules is connected in EXT1.  Most of the modifications necessary
 | 
			
		||||
       to work with the I/O1 in a different connector are obvious.. except
 | 
			
		||||
       for the selection of SERCOM SPI support:
 | 
			
		||||
 | 
			
		||||
         EXT1: SPI is provided through SERCOM0
 | 
			
		||||
         EXT2: SPI is provided through SERCOM1
 | 
			
		||||
         EXT3: SPI is provided through SERCOM5
 | 
			
		||||
 | 
			
		||||
       File Systems:
 | 
			
		||||
         CONFIG_FS_FAT=y                   : Enable the FAT file system
 | 
			
		||||
         CONFIG_FAT_LCNAMES=y              : Enable upper/lower case 8.3 file names (Optional, see below)
 | 
			
		||||
         CONFIG_FAT_LFN=y                  : Enable long file named (Optional, see below)
 | 
			
		||||
         CONFIG_FAT_MAXFNAME=32            : Maximum supported file name length
 | 
			
		||||
 | 
			
		||||
         There are issues related to patents that Microsoft holds on FAT long
 | 
			
		||||
         file name technologies.  See the top level NOTICE file for further
 | 
			
		||||
         details.
 | 
			
		||||
 | 
			
		||||
       System Type -> Peripherals:
 | 
			
		||||
         CONFIG_SAMD2L2_SERCOM0=y          : Use SERCOM0 if the I/O is in EXT1
 | 
			
		||||
         CONFIG_SAMD2L2_SERCOM0_ISSPI=y    : Configure SERCOM0 as an SPI master
 | 
			
		||||
 | 
			
		||||
       Device Drivers
 | 
			
		||||
         CONFIG_SPI=y                      : Enable SPI support
 | 
			
		||||
         CONFIG_SPI_EXCHANGE=y             : The exchange() method is supported
 | 
			
		||||
 | 
			
		||||
         CONFIG_MMCSD=y                    : Enable MMC/SD support
 | 
			
		||||
         CONFIG_MMCSD_NSLOTS=1             : Only one MMC/SD card slot
 | 
			
		||||
         CONFIG_MMCSD_MULTIBLOCK_DISABLE=n : Should not need to disable multi-block transfers
 | 
			
		||||
         CONFIG_MMCSD_MMCSUPPORT=n         : May interfere with some SD cards
 | 
			
		||||
         CONFIG_MMCSD_HAVE_CARDDETECT=y     : I/O1 module as a card detect GPIO
 | 
			
		||||
         CONFIG_MMCSD_SPI=y                : Use the SPI interface to the MMC/SD card
 | 
			
		||||
         CONFIG_MMCSD_SPICLOCK=20000000    : This is a guess for the optimal MMC/SD frequency
 | 
			
		||||
         CONFIG_MMCSD_SPIMODE=0            : Mode 0 is required
 | 
			
		||||
 | 
			
		||||
       Board Selection -> Common Board Options
 | 
			
		||||
         CONFIG_NSH_MMCSDSLOTNO=0          : Only one MMC/SD slot, slot 0
 | 
			
		||||
         CONFIG_NSH_MMCSDSPIPORTNO=0       : Use port=0 -> SERCOM0 if the I/O1 is in EXT1
 | 
			
		||||
 | 
			
		||||
       Board Selection -> SAMD20 Xplained Pro Modules
 | 
			
		||||
         CONFIG_SAMD20_XPLAINED_IOMODULE=y      : I/O1 module is connected
 | 
			
		||||
         CONFIG_SAMD20_XPLAINED_IOMODULE_EXT1=y : I/O1 modules is in EXT1
 | 
			
		||||
 | 
			
		||||
       Application Configuration -> NSH Library
 | 
			
		||||
         CONFIG_NSH_ARCHINIT=y             : Board has architecture-specific initialization
 | 
			
		||||
 | 
			
		||||
       NOTE: If you enable the I/O1 this configuration with SERCOM4 as the
 | 
			
		||||
       console and with the I/O1 module in EXT1, you *must* remove USART
 | 
			
		||||
       jumper.  Otherwise, you have lookpack on SERCOM4 and NSH will *not*
 | 
			
		||||
       behave very well (since its outgoing prompts also appear as incoming
 | 
			
		||||
       commands).
 | 
			
		||||
 | 
			
		||||
       STATUS:  As of 2013-6-18, this configuration appears completely
 | 
			
		||||
       functional.  Testing, however, has been very light.  Example:
 | 
			
		||||
 | 
			
		||||
         NuttShell (NSH) NuttX-6.34
 | 
			
		||||
         nsh> mount -t vfat /dev/mmcsd0 /mnt/stuff
 | 
			
		||||
         nsh> ls /mnt/stuff
 | 
			
		||||
         /mnt/stuff:
 | 
			
		||||
         nsh> echo "This is a test" >/mnt/stuff/atest.txt
 | 
			
		||||
         nsh> ls /mnt/stuff
 | 
			
		||||
         /mnt/stuff:
 | 
			
		||||
          atest.txt
 | 
			
		||||
         nsh> cat /mnt/stuff/atest.txt
 | 
			
		||||
         This is a test
 | 
			
		||||
         nsh>
 | 
			
		||||
 | 
			
		||||
    5. If the OLED1 module is connected to the SAMD20 Xplained Pro, then
 | 
			
		||||
       support for the OLED display can be enabled by making the following
 | 
			
		||||
       changes to the configuration.  These changes assume that the I/O1
 | 
			
		||||
       modules is connected in EXT1.  Most of the modifications necessary
 | 
			
		||||
       to work with the I/O1 in a different connector are obvious.. except
 | 
			
		||||
       for the selection of SERCOM SPI support:
 | 
			
		||||
 | 
			
		||||
         EXT1: SPI is provided through SERCOM0
 | 
			
		||||
         EXT2: SPI is provided through SERCOM1
 | 
			
		||||
         EXT3: SPI is provided through SERCOM5
 | 
			
		||||
 | 
			
		||||
       System Type -> Peripherals:
 | 
			
		||||
         CONFIG_SAMD2L2_SERCOM1=y           : Use SERCOM1 if the I/O is in EXT2
 | 
			
		||||
         CONFIG_SAMD2L2_SERCOM1_ISSPI=y     : Configure SERCOM1 as an SPI master
 | 
			
		||||
 | 
			
		||||
       Device Drivers -> SPI
 | 
			
		||||
         CONFIG_SPI=y                       : Enable SPI support
 | 
			
		||||
         CONFIG_SPI_EXCHANGE=y              : The exchange() method is supported
 | 
			
		||||
         CONFIG_SPI_CMDDATA=y               : CMD/DATA support is required
 | 
			
		||||
 | 
			
		||||
       Device Drivers -> LCDs
 | 
			
		||||
         CONFIG_LCD=y                       : Enable LCD support
 | 
			
		||||
         CONFIG_LCD_MAXCONTRAST=255         : Maximum contrast value
 | 
			
		||||
         CONFIG_LCD_LANDSCAPE=y             : Landscape orientation (see below*)
 | 
			
		||||
         CONFIG_LCD_UG2832HSWEG04=y         : Enable support for the OLED
 | 
			
		||||
         CONFIG_LCD_SSD1306_SPIMODE=0       : SPI Mode 0
 | 
			
		||||
         CONFIG_LCD_SSD1306_SPIMODE=3500000 : Pick an SPI frequency
 | 
			
		||||
 | 
			
		||||
       Board Selection -> SAMD20 Xplained Pro Modules
 | 
			
		||||
         CONFIG_SAMD20_XPLAINED_OLED1MODULE=y      : OLED1 module is connected
 | 
			
		||||
         CONFIG_SAMD20_XPLAINED_OLED1MODULE_EXT2=y : OLED1 modules is in EXT2
 | 
			
		||||
 | 
			
		||||
       The NX graphics subsystem also needs to be configured:
 | 
			
		||||
 | 
			
		||||
         CONFIG_NX=y                        : Enable graphics support
 | 
			
		||||
         CONFIG_NX_LCDDRIVER=y              : Using an LCD driver
 | 
			
		||||
         CONFIG_NX_NPLANES=1                : With a single color plane
 | 
			
		||||
         CONFIG_NX_WRITEONLY=n              : You can read from the LCD (see below**)
 | 
			
		||||
         CONFIG_NX_DISABLE_2BPP=y           : Disable all resolutions except 1BPP
 | 
			
		||||
         CONFIG_NX_DISABLE_4BPP=y
 | 
			
		||||
         CONFIG_NX_DISABLE_8BPP=y
 | 
			
		||||
         CONFIG_NX_DISABLE_16BPP=y
 | 
			
		||||
         CONFIG_NX_DISABLE_24BPP=y
 | 
			
		||||
         CONFIG_NX_DISABLE_32BPP=y
 | 
			
		||||
         CONFIG_NX_PACKEDMSFIRST=y          : LSB packed first (shouldn't matter)
 | 
			
		||||
         CONFIG_NXSTART_EXTERNINIT=y        : We have board_graphics_setup()
 | 
			
		||||
         CONFIG_NXTK_BORDERWIDTH=2          : Use a small border
 | 
			
		||||
         CONFIG_NXTK_DEFAULT_BORDERCOLORS=y : Default border colors
 | 
			
		||||
         CONFIG_NXFONTS_CHARBITS=7          : 7-bit fonts
 | 
			
		||||
         CONFIG_NXFONT_SANS17X23B=y         : Pick a font (any that will fit)
 | 
			
		||||
 | 
			
		||||
        * This orientation will put the buttons "above" the LCD.  The
 | 
			
		||||
          reverse landscape configuration (CONFIG_LCD_RLANDSCAPE) will
 | 
			
		||||
          "flip" the display so that the buttons are "below" the LCD.
 | 
			
		||||
 | 
			
		||||
       ** The hardware is write only, but the driver maintains a frame buffer
 | 
			
		||||
          to support read and read-write-modiry operations on the LCD.
 | 
			
		||||
          Reading from the frame buffer is, however, untested.
 | 
			
		||||
 | 
			
		||||
       Then, in order to use the OLED, you will need to build some kind of
 | 
			
		||||
       graphics application or use one of the NuttX graphics examples.
 | 
			
		||||
       Here, for example, is the setup for the graphic "Hello, World!"
 | 
			
		||||
       example:
 | 
			
		||||
 | 
			
		||||
         CONFIG_EXAMPLES_NXHELLO=y                : Enables the example
 | 
			
		||||
         CONFIG_EXAMPLES_NXHELLO_DEFAULT_COLORS=y : Use default colors (see below *)
 | 
			
		||||
         CONFIG_EXAMPLES_NXHELLO_DEFAULT_FONT=y   : Use the default font
 | 
			
		||||
         CONFIG_EXAMPLES_NXHELLO_BPP=1            : One bit per pixel
 | 
			
		||||
         CONFIG_EXAMPLES_NXHELLO_EXTERNINIT=y     : Special initialization is required.
 | 
			
		||||
 | 
			
		||||
        * The OLED is monochrome so the only "colors" are blacka nd white.
 | 
			
		||||
          The default "colors" will give you while text on a black background.
 | 
			
		||||
          You can override the faults it you want black text on a while background.
 | 
			
		||||
 | 
			
		||||
       NOTE:  One issue that I have seen with the NXHello example when
 | 
			
		||||
       running as an NSH command is that it only works the first time.
 | 
			
		||||
       So, after you run the 'nxhello' command one time, you will have to
 | 
			
		||||
       reset the board before you run it again.
 | 
			
		||||
 | 
			
		||||
       This is clearly some issue with initializing, un-initializing, and
 | 
			
		||||
       then re-initializing. If you want to fix this, patches are quite
 | 
			
		||||
       welcome.
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,65 @@
 | 
			
		|||
#
 | 
			
		||||
# 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_WGET is not set
 | 
			
		||||
# CONFIG_NSH_DISABLE_XD is not set
 | 
			
		||||
CONFIG_ARCH="arm"
 | 
			
		||||
CONFIG_ARCH_BOARD="samd20-xplained"
 | 
			
		||||
CONFIG_ARCH_BOARD_SAMD20_XPLAINED=y
 | 
			
		||||
CONFIG_ARCH_BUTTONS=y
 | 
			
		||||
CONFIG_ARCH_CHIP="samd2l2"
 | 
			
		||||
CONFIG_ARCH_CHIP_SAMD20J18=y
 | 
			
		||||
CONFIG_ARCH_CHIP_SAMD2X=y
 | 
			
		||||
CONFIG_ARCH_STACKDUMP=y
 | 
			
		||||
CONFIG_BOARD_LOOPSPERMSEC=3410
 | 
			
		||||
CONFIG_BUILTIN=y
 | 
			
		||||
CONFIG_DEFAULT_SMALL=y
 | 
			
		||||
CONFIG_HAVE_CXX=y
 | 
			
		||||
CONFIG_HAVE_CXXINITIALIZE=y
 | 
			
		||||
CONFIG_HOST_WINDOWS=y
 | 
			
		||||
CONFIG_MAX_TASKS=16
 | 
			
		||||
CONFIG_NSH_BUILTIN_APPS=y
 | 
			
		||||
CONFIG_PREALLOC_TIMERS=4
 | 
			
		||||
CONFIG_PTHREAD_STACK_DEFAULT=1536
 | 
			
		||||
CONFIG_RAM_SIZE=32768
 | 
			
		||||
CONFIG_RAM_START=0x20000000
 | 
			
		||||
CONFIG_RAW_BINARY=y
 | 
			
		||||
CONFIG_RR_INTERVAL=200
 | 
			
		||||
CONFIG_SAMD2L2_SERCOM3=y
 | 
			
		||||
CONFIG_SAMD2L2_SERCOM4=y
 | 
			
		||||
CONFIG_SCHED_WAITPID=y
 | 
			
		||||
CONFIG_SDCLONE_DISABLE=y
 | 
			
		||||
CONFIG_START_DAY=12
 | 
			
		||||
CONFIG_START_MONTH=2
 | 
			
		||||
CONFIG_START_YEAR=2014
 | 
			
		||||
CONFIG_SYSTEM_NSH=y
 | 
			
		||||
CONFIG_TASK_NAME_SIZE=0
 | 
			
		||||
CONFIG_TASK_SPAWN_DEFAULT_STACKSIZE=1536
 | 
			
		||||
CONFIG_USART3_RXBUFSIZE=64
 | 
			
		||||
CONFIG_USART3_TXBUFSIZE=64
 | 
			
		||||
CONFIG_USART4_RXBUFSIZE=64
 | 
			
		||||
CONFIG_USART4_SERIAL_CONSOLE=y
 | 
			
		||||
CONFIG_USART4_TXBUFSIZE=64
 | 
			
		||||
CONFIG_USERMAIN_STACKSIZE=1536
 | 
			
		||||
CONFIG_USER_ENTRYPOINT="nsh_main"
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,515 @@
 | 
			
		|||
/****************************************************************************
 | 
			
		||||
 * boards/arm/samd2l2/samd20-xplained/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_SAMD20_XPLAINED_INCLUDE_BOARD_H
 | 
			
		||||
#define __BOARDS_ARM_SAMD2L2_SAMD20_XPLAINED_INCLUDE_BOARD_H
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Included Files
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#include <nuttx/config.h>
 | 
			
		||||
 | 
			
		||||
#ifndef __ASSEMBLY__
 | 
			
		||||
#  include <stdint.h>
 | 
			
		||||
#  ifdef CONFIG_SAMD2L2_GPIOIRQ
 | 
			
		||||
#    include <arch/irq.h>
 | 
			
		||||
#  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 SAMD20 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_FRQUENCY  - In Hz
 | 
			
		||||
 *    BOARD_CPU_FAILDECT  - Boolean (defined / not defined)
 | 
			
		||||
 *    BOARD_APBA_DIVIDER  - See M_APBASEL_APBADIV_* definitions
 | 
			
		||||
 *    BOARD_APBA_FRQUENCY - In Hz
 | 
			
		||||
 *    BOARD_APBB_DIVIDER  - See M_APBBSEL_APBBDIV_* definitions
 | 
			
		||||
 *    BOARD_APBB_FRQUENCY - In Hz
 | 
			
		||||
 *    BOARD_APBC_DIVIDER  - See M_APBCSEL_APBCDIV_* definitions
 | 
			
		||||
 *    BOARD_APBC_FRQUENCY - 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
 | 
			
		||||
 | 
			
		||||
/* SERCOM0 SPI is available on EXT1
 | 
			
		||||
 *
 | 
			
		||||
 *  PIN PORT SERCOM        FUNCTION
 | 
			
		||||
 *  --- ------------------ -----------
 | 
			
		||||
 *  15  PA5  SERCOM0 PAD1  SPI SS
 | 
			
		||||
 *  16  PA6  SERCOM0 PAD2  SPI MOSI
 | 
			
		||||
 *  17  PA4  SERCOM0 PAD0  SPI MISO
 | 
			
		||||
 *  18  PA7  SERCOM0 PAD3  SPI SCK
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define BOARD_SERCOM0_GCLKGEN        0
 | 
			
		||||
#define BOARD_SERCOM0_SLOW_GCLKGEN   BOARD_SERCOM05_SLOW_GCLKGEN
 | 
			
		||||
#define BOARD_SERCOM0_MUXCONFIG      (SPI_CTRLA_DOPO_DOPAD231 | SPI_CTRLA_DIPAD0)
 | 
			
		||||
#define BOARD_SERCOM0_PINMAP_PAD0    PORT_SERCOM0_PAD0_2 /* SPI_MISO */
 | 
			
		||||
#define BOARD_SERCOM0_PINMAP_PAD1    0                   /* microSD_SS */
 | 
			
		||||
#define BOARD_SERCOM0_PINMAP_PAD2    PORT_SERCOM0_PAD2_2 /* SPI_MOSI */
 | 
			
		||||
#define BOARD_SERCOM0_PINMAP_PAD3    PORT_SERCOM0_PAD3_2 /* SPI_SCK */
 | 
			
		||||
 | 
			
		||||
#define BOARD_SERCOM0_FREQUENCY      BOARD_GCLK0_FREQUENCY
 | 
			
		||||
 | 
			
		||||
/* SERCOM1 SPI is available on EXT2
 | 
			
		||||
 *
 | 
			
		||||
 *  PIN PORT SERCOM        FUNCTION
 | 
			
		||||
 *  --- ------------------ -----------
 | 
			
		||||
 *  15  PA17 SERCOM1 PAD1  SPI SS
 | 
			
		||||
 *  16  PA18 SERCOM1 PAD2  SPI MOSI
 | 
			
		||||
 *  17  PA16 SERCOM1 PAD0  SPI MISO
 | 
			
		||||
 *  18  PA19 SERCOM1 PAD3  SPI SCK
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define BOARD_SERCOM1_GCLKGEN        0
 | 
			
		||||
#define BOARD_SERCOM1_SLOW_GCLKGEN   BOARD_SERCOM05_SLOW_GCLKGEN
 | 
			
		||||
#define BOARD_SERCOM1_MUXCONFIG      (SPI_CTRLA_DOPO_DOPAD231 | SPI_CTRLA_DIPAD0)
 | 
			
		||||
#define BOARD_SERCOM1_PINMAP_PAD0    PORT_SERCOM1_PAD0_1 /* SPI_MISO */
 | 
			
		||||
#define BOARD_SERCOM1_PINMAP_PAD1    0                   /* microSD_SS */
 | 
			
		||||
#define BOARD_SERCOM1_PINMAP_PAD2    PORT_SERCOM1_PAD2_1 /* SPI_MOSI */
 | 
			
		||||
#define BOARD_SERCOM1_PINMAP_PAD3    PORT_SERCOM1_PAD3_1 /* SPI_SCK */
 | 
			
		||||
 | 
			
		||||
#define BOARD_SERCOM1_FREQUENCY      BOARD_GCLK0_FREQUENCY
 | 
			
		||||
 | 
			
		||||
/* The SAMD20 Xplained Pro contains an Embedded Debugger (EDBG) that can be
 | 
			
		||||
 * used to program and debug the ATSAMD20J18A using Serial Wire Debug (SWD).
 | 
			
		||||
 * The Embedded debugger also include a Virtual COM port interface over
 | 
			
		||||
 * SERCOM3.  Virtual COM port connections:
 | 
			
		||||
 *
 | 
			
		||||
 *   PA24 SERCOM3 / USART TXD
 | 
			
		||||
 *   PA25 SERCOM3 / USART RXD
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define BOARD_SERCOM3_GCLKGEN        0
 | 
			
		||||
#define BOARD_SERCOM3_SLOW_GCLKGEN   BOARD_SERCOM05_SLOW_GCLKGEN
 | 
			
		||||
#define BOARD_SERCOM3_MUXCONFIG      (USART_CTRLA_RXPAD3 | USART_CTRLA_TXPAD2)
 | 
			
		||||
#define BOARD_SERCOM3_PINMAP_PAD0    0
 | 
			
		||||
#define BOARD_SERCOM3_PINMAP_PAD1    0
 | 
			
		||||
#define BOARD_SERCOM3_PINMAP_PAD2    PORT_SERCOM3_PAD2_1 /* USART TX */
 | 
			
		||||
#define BOARD_SERCOM3_PINMAP_PAD3    PORT_SERCOM3_PAD3_1 /* USART RX */
 | 
			
		||||
 | 
			
		||||
#define BOARD_SERCOM3_FREQUENCY      BOARD_GCLK0_FREQUENCY
 | 
			
		||||
 | 
			
		||||
/* The SERCOM4 USART is available on connectors EXT1, EXT2, and EXT3
 | 
			
		||||
 *
 | 
			
		||||
 *   PIN   EXT1 EXT2 EXT3 GPIO Function
 | 
			
		||||
 *   ----  ---- ---- ---- ------------------
 | 
			
		||||
 *    13   PB09 PB13 PB11 SERCOM4 / USART RX
 | 
			
		||||
 *    14   PB08 PB12 PB12 SERCOM4 / USART TX
 | 
			
		||||
 *    19   GND  GND  GND  N/A
 | 
			
		||||
 *    20   VCC  VCC  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 SAMD20
 | 
			
		||||
 * configurations.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define BOARD_SERCOM4_GCLKGEN        0
 | 
			
		||||
#define BOARD_SERCOM4_SLOW_GCLKGEN   BOARD_SERCOM05_SLOW_GCLKGEN
 | 
			
		||||
 | 
			
		||||
#if defined(CONFIG_SAMD20_XPLAINED_USART4_EXT1)
 | 
			
		||||
#  define BOARD_SERCOM4_MUXCONFIG    (USART_CTRLA_RXPAD1 | USART_CTRLA_TXPAD0)
 | 
			
		||||
#  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
 | 
			
		||||
#elif defined(CONFIG_SAMD20_XPLAINED_USART4_EXT2)
 | 
			
		||||
#  define BOARD_SERCOM4_MUXCONFIG    (USART_CTRLA_RXPAD1 | USART_CTRLA_TXPAD0)
 | 
			
		||||
#  define BOARD_SERCOM4_PINMAP_PAD0  PORT_SERCOM4_PAD0_1 /* USART TX */
 | 
			
		||||
#  define BOARD_SERCOM4_PINMAP_PAD1  PORT_SERCOM4_PAD1_1 /* USART RX */
 | 
			
		||||
#  define BOARD_SERCOM4_PINMAP_PAD2  0
 | 
			
		||||
#  define BOARD_SERCOM4_PINMAP_PAD3  0
 | 
			
		||||
#else /* if defined(CONFIG_SAMD20_XPLAINED_USART4_EXT3) */
 | 
			
		||||
#  define BOARD_SERCOM4_MUXCONFIG    (USART_CTRLA_RXPAD3 | USART_CTRLA_TXPAD2)
 | 
			
		||||
#  define BOARD_SERCOM4_PINMAP_PAD0  0
 | 
			
		||||
#  define BOARD_SERCOM4_PINMAP_PAD1  0
 | 
			
		||||
#  define BOARD_SERCOM4_PINMAP_PAD2  PORT_SERCOM4_PAD2_3 /* USART TX */
 | 
			
		||||
#  define BOARD_SERCOM4_PINMAP_PAD3  PORT_SERCOM4_PAD3_3 /* USART RX */
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define BOARD_SERCOM4_FREQUENCY      BOARD_GCLK0_FREQUENCY
 | 
			
		||||
 | 
			
		||||
/* SERCOM5 SPI is available on EXT3
 | 
			
		||||
 *
 | 
			
		||||
 *  PIN PORT SERCOM        FUNCTION
 | 
			
		||||
 *  --- ------------------ -----------
 | 
			
		||||
 *  15  PB17 SERCOM5 PAD1  SPI SS
 | 
			
		||||
 *  16  PB22 SERCOM5 PAD2  SPI MOSI
 | 
			
		||||
 *  17  PB16 SERCOM5 PAD0  SPI MISO
 | 
			
		||||
 *  18  PB23 SERCOM5 PAD3  SPI SCK
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define BOARD_SERCOM5_GCLKGEN        0
 | 
			
		||||
#define BOARD_SERCOM5_SLOW_GCLKGEN   BOARD_SERCOM05_SLOW_GCLKGEN
 | 
			
		||||
#define BOARD_SERCOM5_MUXCONFIG      (SPI_CTRLA_DOPO_DOPAD231 | SPI_CTRLA_DIPAD0)
 | 
			
		||||
#define BOARD_SERCOM5_PINMAP_PAD0    PORT_SERCOM5_PAD0_1 /* SPI_MISO */
 | 
			
		||||
#define BOARD_SERCOM5_PINMAP_PAD1    0                   /* microSD_SS */
 | 
			
		||||
#define BOARD_SERCOM5_PINMAP_PAD2    PORT_SERCOM5_PAD2_4 /* SPI_MOSI */
 | 
			
		||||
#define BOARD_SERCOM5_PINMAP_PAD3    PORT_SERCOM5_PAD3_4 /* SPI_SCK */
 | 
			
		||||
 | 
			
		||||
#define BOARD_SERCOM5_FREQUENCY      BOARD_GCLK0_FREQUENCY
 | 
			
		||||
 | 
			
		||||
/* LED definitions **********************************************************/
 | 
			
		||||
 | 
			
		||||
/* There are three LEDs on board the SAMD20 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 STATUS near the SAMD20
 | 
			
		||||
 * USB connector.
 | 
			
		||||
 *
 | 
			
		||||
 * This LED is controlled by PC07 and the LED can be activated by driving
 | 
			
		||||
 * the PA14 to GND.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/* 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 */
 | 
			
		||||
 | 
			
		||||
/* Button definitions *******************************************************/
 | 
			
		||||
 | 
			
		||||
/* Mechanical buttons:
 | 
			
		||||
 *
 | 
			
		||||
 * The SAMD20 Xplained Pro contains two mechanical buttons.
 | 
			
		||||
 * One button is the RESET button connected to the SAMD20 reset line and
 | 
			
		||||
 * the other is a generic user configurable button.
 | 
			
		||||
 * When a button is pressed it will drive the I/O line to GND.
 | 
			
		||||
 *
 | 
			
		||||
 *   PA15 SW0
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/* The SAMD20 Xplained Pro supports one button: */
 | 
			
		||||
 | 
			
		||||
#define BUTTON_SW0                   0
 | 
			
		||||
#define NUM_BUTTONS                  1
 | 
			
		||||
 | 
			
		||||
#define BUTTON_SW0_BIT               (1 << BUTTON_SW0)
 | 
			
		||||
 | 
			
		||||
#endif /* __BOARDS_ARM_SAMD2L2_SAMD20_XPLAINED_INCLUDE_BOARD_H */
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,63 @@
 | 
			
		|||
############################################################################
 | 
			
		||||
# boards/arm/samd2l2/samd20-xplained/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
 | 
			
		||||
 | 
			
		||||
ifeq ($(CONFIG_CYGWIN_WINTOOL),y)
 | 
			
		||||
  ARCHSCRIPT = -T "${shell cygpath -w $(BOARD_DIR)$(DELIM)scripts$(DELIM)$(LDSCRIPT)}"
 | 
			
		||||
else
 | 
			
		||||
  ARCHSCRIPT = -T$(BOARD_DIR)$(DELIM)scripts$(DELIM)$(LDSCRIPT)
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
ifeq ($(CONFIG_DEBUG_SYMBOLS),y)
 | 
			
		||||
  ARCHOPTIMIZATION = -g
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
ifneq ($(CONFIG_DEBUG_NOOPT),y)
 | 
			
		||||
  ARCHOPTIMIZATION += $(MAXOPTIMIZATION) -fno-strict-aliasing -fno-strength-reduce -fomit-frame-pointer
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
ARCHCFLAGS = -fno-builtin
 | 
			
		||||
ARCHCXXFLAGS = -fno-builtin -fno-exceptions -fcheck-new -fno-rtti
 | 
			
		||||
ARCHWARNINGS = -Wall -Wstrict-prototypes -Wshadow -Wundef
 | 
			
		||||
ARCHWARNINGSXX = -Wall -Wshadow -Wundef
 | 
			
		||||
ARCHPICFLAGS = -fpic -msingle-pic-base -mpic-register=r10
 | 
			
		||||
 | 
			
		||||
CFLAGS := $(ARCHCFLAGS) $(ARCHWARNINGS) $(ARCHOPTIMIZATION) $(ARCHCPUFLAGS) $(ARCHINCLUDES) $(ARCHDEFINES) $(EXTRAFLAGS) -pipe
 | 
			
		||||
CPICFLAGS = $(ARCHPICFLAGS) $(CFLAGS)
 | 
			
		||||
CXXFLAGS := $(ARCHCXXFLAGS) $(ARCHWARNINGSXX) $(ARCHOPTIMIZATION) $(ARCHCPUFLAGS) $(ARCHXXINCLUDES) $(ARCHDEFINES) $(EXTRAFLAGS) -pipe
 | 
			
		||||
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
 | 
			
		||||
 | 
			
		||||
ifneq ($(CROSSDEV),arm-nuttx-elf-)
 | 
			
		||||
  LDFLAGS += -nostartfiles -nodefaultlibs
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(CONFIG_DEBUG_SYMBOLS),y)
 | 
			
		||||
  LDFLAGS += -g
 | 
			
		||||
endif
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,110 @@
 | 
			
		|||
/****************************************************************************
 | 
			
		||||
 * boards/arm/samd2l2/samd20-xplained/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 ATSAMD20J18A has 256KB of FLASH beginning at address 0x0000:0000 and
 | 
			
		||||
 * 32KB of SRAM beginning at address 0x2000:0000
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
MEMORY
 | 
			
		||||
{
 | 
			
		||||
  flash (rx)  : ORIGIN = 0x00000000, LENGTH = 256K
 | 
			
		||||
  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(.);
 | 
			
		||||
        *(.init_array .init_array.*)
 | 
			
		||||
        _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) }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,53 @@
 | 
			
		|||
############################################################################
 | 
			
		||||
# boards/arm/samd2l2/samd20-xplained/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_SAMD2L2_SERCOM0),y)
 | 
			
		||||
CSRCS += sam_spi.c
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
ifeq ($(CONFIG_ARCH_LEDS),y)
 | 
			
		||||
CSRCS += sam_autoleds.c
 | 
			
		||||
else
 | 
			
		||||
CSRCS += sam_userleds.c
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
ifeq ($(CONFIG_ARCH_BUTTONS),y)
 | 
			
		||||
CSRCS += sam_buttons.c
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
ifeq ($(CONFIG_LIB_BOARDCTL),y)
 | 
			
		||||
CSRCS += sam_appinit.c
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
ifeq ($(CONFIG_SAMD20_XPLAINED_IOMODULE),y)
 | 
			
		||||
CSRCS += sam_mmcsd.c
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
ifeq ($(CONFIG_SAMD20_XPLAINED_OLED1MODULE),y)
 | 
			
		||||
ifeq ($(CONFIG_LCD_UG2832HSWEG04),y)
 | 
			
		||||
CSRCS += sam_ug2832hsweg04.c
 | 
			
		||||
endif
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
include $(TOPDIR)/boards/Board.mk
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,123 @@
 | 
			
		|||
/****************************************************************************
 | 
			
		||||
 * boards/arm/samd2l2/samd20-xplained/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 <nuttx/config.h>
 | 
			
		||||
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <syslog.h>
 | 
			
		||||
 | 
			
		||||
#include <nuttx/board.h>
 | 
			
		||||
 | 
			
		||||
#include "sam_config.h"
 | 
			
		||||
#include "samd20-xplained.h"
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Pre-processor Definitions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/* Some configuration checks */
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_SAMD20_XPLAINED_IOMODULE_EXT1
 | 
			
		||||
#  ifndef SAMD2L2_HAVE_SPI0
 | 
			
		||||
#    error I/O1 module on EXT1 requires SERCOM SPI0
 | 
			
		||||
#    undef CONFIG_SAMD20_XPLAINED_IOMODULE
 | 
			
		||||
#  endif
 | 
			
		||||
#  define SPI_PORTNO 0
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_SAMD20_XPLAINED_IOMODULE_EXT2
 | 
			
		||||
#  ifndef SAMD2L2_HAVE_SPI1
 | 
			
		||||
#    error I/O1 module on EXT2 requires SERCOM SPI1
 | 
			
		||||
#    undef CONFIG_SAMD20_XPLAINED_IOMODULE
 | 
			
		||||
#  endif
 | 
			
		||||
#  define SPI_PORTNO 1
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_SAMD20_XPLAINED_IOMODULE
 | 
			
		||||
/* Support for the SD card slot on the I/O1 module */
 | 
			
		||||
 | 
			
		||||
/* Verify NSH PORT and SLOT settings */
 | 
			
		||||
 | 
			
		||||
#  define SAMD2L2_MMCSDSLOTNO  0 /* There is only one slot */
 | 
			
		||||
 | 
			
		||||
#  if defined(CONFIG_NSH_MMCSDSLOTNO) && CONFIG_NSH_MMCSDSLOTNO != SAMD2L2_MMCSDSLOTNO
 | 
			
		||||
#    error Only one MMC/SD slot:  Slot 0 (CONFIG_NSH_MMCSDSLOTNO)
 | 
			
		||||
#  endif
 | 
			
		||||
 | 
			
		||||
#  if defined(CONFIG_NSH_MMCSDSPIPORTNO) && CONFIG_NSH_MMCSDSPIPORTNO != SPI_PORTNO
 | 
			
		||||
#    error CONFIG_NSH_MMCSDSPIPORTNO must have the same value as SPI_PORTNO
 | 
			
		||||
#  endif
 | 
			
		||||
 | 
			
		||||
/* Default MMC/SD minor number */
 | 
			
		||||
 | 
			
		||||
#  ifndef CONFIG_NSH_MMCSDMINOR
 | 
			
		||||
#    define CONFIG_NSH_MMCSDMINOR 0
 | 
			
		||||
#  endif
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * 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)
 | 
			
		||||
{
 | 
			
		||||
#if defined(SAMD2L2_HAVE_SPI0) && defined(CONFIG_SAMD20_XPLAINED_IOMODULE)
 | 
			
		||||
  /* Initialize the SPI-based MMC/SD slot */
 | 
			
		||||
 | 
			
		||||
  int ret = sam_sdinitialize(SPI_PORTNO, CONFIG_NSH_MMCSDMINOR);
 | 
			
		||||
  if (ret < 0)
 | 
			
		||||
    {
 | 
			
		||||
      syslog(LOG_ERR, "ERROR: Failed to initialize MMC/SD slot: %d\n",
 | 
			
		||||
             ret);
 | 
			
		||||
      return ret;
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
  return OK;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,151 @@
 | 
			
		|||
/****************************************************************************
 | 
			
		||||
 * boards/arm/samd2l2/samd20-xplained/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.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/* There are three LEDs on board the SAMD20 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 STATUS near the SAMD20
 | 
			
		||||
 * USB connector.
 | 
			
		||||
 *
 | 
			
		||||
 * This LED is controlled by PA14 and the LED can be activated by driving
 | 
			
		||||
 * PA14 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.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Included Files
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#include <nuttx/config.h>
 | 
			
		||||
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
#include <stdbool.h>
 | 
			
		||||
#include <debug.h>
 | 
			
		||||
 | 
			
		||||
#include <nuttx/board.h>
 | 
			
		||||
#include <arch/board/board.h>
 | 
			
		||||
 | 
			
		||||
#include "sam_port.h"
 | 
			
		||||
#include "samd20-xplained.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 */
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,76 @@
 | 
			
		|||
/****************************************************************************
 | 
			
		||||
 * boards/arm/samd2l2/samd20-xplained/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 <nuttx/config.h>
 | 
			
		||||
 | 
			
		||||
#include <debug.h>
 | 
			
		||||
 | 
			
		||||
#include <nuttx/board.h>
 | 
			
		||||
 | 
			
		||||
#include "sam_config.h"
 | 
			
		||||
#include "samd20-xplained.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 SPI chip selects if
 | 
			
		||||
   * 1) SPI is not disabled, and 2) the weak function
 | 
			
		||||
   * sam_spidev_initialize() has been brought into the link.
 | 
			
		||||
   */
 | 
			
		||||
 | 
			
		||||
#ifdef SAMD2L2_HAVE_SPI
 | 
			
		||||
  if (sam_spidev_initialize)
 | 
			
		||||
    {
 | 
			
		||||
      sam_spidev_initialize();
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
  /* Configure on-board LEDs if LED support has been selected. */
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_ARCH_LEDS
 | 
			
		||||
  board_autoled_initialize();
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,127 @@
 | 
			
		|||
/****************************************************************************
 | 
			
		||||
 * boards/arm/samd2l2/samd20-xplained/src/sam_buttons.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 <nuttx/config.h>
 | 
			
		||||
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
#include <errno.h>
 | 
			
		||||
 | 
			
		||||
#include <nuttx/arch.h>
 | 
			
		||||
#include <nuttx/board.h>
 | 
			
		||||
#include <nuttx/irq.h>
 | 
			
		||||
 | 
			
		||||
#include <nuttx/irq.h>
 | 
			
		||||
#include <arch/board/board.h>
 | 
			
		||||
 | 
			
		||||
#include "sam_port.h"
 | 
			
		||||
#include "samd20-xplained.h"
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_ARCH_BUTTONS
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Public Functions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: board_button_initialize
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   board_button_initialize() must be called to initialize button resources.
 | 
			
		||||
 *   After that, board_buttons() may be called to collect the current state
 | 
			
		||||
 *   of all buttons or board_button_irq() may be called to register button
 | 
			
		||||
 *   interrupt handlers.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
uint32_t board_button_initialize(void)
 | 
			
		||||
{
 | 
			
		||||
  sam_configport(PORT_SW0);
 | 
			
		||||
  return NUM_BUTTONS;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: board_buttons
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   After board_button_initialize() has been called, board_buttons()
 | 
			
		||||
 *   may be called to collect the state of all buttons.
 | 
			
		||||
 *   board_buttons() returns an 32-bit bit set with each bit
 | 
			
		||||
 *   associated with a button.
 | 
			
		||||
 *   See the BUTTON* definitions above for the meaning of
 | 
			
		||||
 *   each bit in the returned value.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
uint32_t board_buttons(void)
 | 
			
		||||
{
 | 
			
		||||
  return sam_portread(PORT_SW0) ? 0 : BUTTON_SW0_BIT;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: board_button_irq
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   This function may be called to register an interrupt handler that will
 | 
			
		||||
 *   be called when a button is depressed or released.  The ID value is one
 | 
			
		||||
 *   of the BUTTON* definitions provided above.
 | 
			
		||||
 *
 | 
			
		||||
 * Configuration Notes:
 | 
			
		||||
 *   Configuration CONFIG_AVR32_PORTIRQ must be selected to enable the
 | 
			
		||||
 *   overall PORT IRQ feature and CONFIG_AVR32_PORTIRQSETA and/or
 | 
			
		||||
 *   CONFIG_AVR32_PORTIRQSETB must be enabled to select PORTs to support
 | 
			
		||||
 *   interrupts on.  For button support, bits 2 and 3 must be set in
 | 
			
		||||
 *   CONFIG_AVR32_PORTIRQSETB (PB2 and PB3).
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#if defined(CONFIG_PORTA_IRQ) && defined(CONFIG_ARCH_IRQBUTTONS)
 | 
			
		||||
int board_button_irq(int id, xcpt_t irqhandler, FAR void *arg)
 | 
			
		||||
{
 | 
			
		||||
  int ret = -EINVAL;
 | 
			
		||||
 | 
			
		||||
  if (id == BUTTON_SW0)
 | 
			
		||||
    {
 | 
			
		||||
      irqstate_t flags;
 | 
			
		||||
 | 
			
		||||
      /* Disable interrupts until we are done.  This guarantees that the
 | 
			
		||||
       * following operations are atomic.
 | 
			
		||||
       */
 | 
			
		||||
 | 
			
		||||
      flags = enter_critical_section();
 | 
			
		||||
 | 
			
		||||
      /* Configure the interrupt */
 | 
			
		||||
 | 
			
		||||
      sam_portirq(IRQ_SW0);
 | 
			
		||||
      irq_attach(IRQ_SW0, irqhandler, arg);
 | 
			
		||||
      sam_portirqenable(IRQ_SW0);
 | 
			
		||||
 | 
			
		||||
      leave_critical_section(flags);
 | 
			
		||||
      ret = OK;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  return oldhandler;
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif /* CONFIG_ARCH_BUTTONS */
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,114 @@
 | 
			
		|||
/****************************************************************************
 | 
			
		||||
 * boards/arm/samd2l2/samd20-xplained/src/sam_mmcsd.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 <nuttx/config.h>
 | 
			
		||||
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <debug.h>
 | 
			
		||||
#include <errno.h>
 | 
			
		||||
 | 
			
		||||
#include <nuttx/spi/spi.h>
 | 
			
		||||
#include <nuttx/mmcsd.h>
 | 
			
		||||
 | 
			
		||||
#include "sam_config.h"
 | 
			
		||||
#include "sam_spi.h"
 | 
			
		||||
 | 
			
		||||
#include "samd20-xplained.h"
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_SAMD20_XPLAINED_IOMODULE
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Pre-processor Definitions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/* Configuration ************************************************************/
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_DISABLE_MOUNTPOINT
 | 
			
		||||
#  error Mountpoints are disabled (CONFIG_DISABLE_MOUNTPOINT=y)
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifndef SAMD2L2_HAVE_SPI0
 | 
			
		||||
#  error SERCOM0 SPI support is required
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifndef CONFIG_MMCSD
 | 
			
		||||
#  error MMC/SD support is required (CONFIG_MMCSD)
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define SAMD2L2_MMCSDSLOTNO  0 /* There is only one slot */
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Public Functions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: sam_sdinitialize
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   Initialize the SPI-based SD card.  Requires
 | 
			
		||||
 *   - CONFIG_SAMD20_XPLAINED_IOMODULE=y,
 | 
			
		||||
 *   - CONFIG_DISABLE_MOUNTPOINT=n,
 | 
			
		||||
 *   - CONFIG_MMCSD=y, and
 | 
			
		||||
 *   - SAMD2L2_HAVE_SPI0=y
 | 
			
		||||
 *     (CONFIG_SAMD2L2_SERCOM0 && CONFIG_SAMD2L2_SERCOM0_ISSPI)
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
int sam_sdinitialize(int port, int minor)
 | 
			
		||||
{
 | 
			
		||||
  FAR struct spi_dev_s *spi;
 | 
			
		||||
  int ret;
 | 
			
		||||
 | 
			
		||||
  /* Get the SPI driver instance for the SD chip select */
 | 
			
		||||
 | 
			
		||||
  finfo("Initializing SERCOM SPI%d\n", port);
 | 
			
		||||
 | 
			
		||||
  spi = sam_spibus_initialize(port);
 | 
			
		||||
  if (!spi)
 | 
			
		||||
    {
 | 
			
		||||
      ferr("ERROR: Failed to initialize SPI%d\n", port);
 | 
			
		||||
      return -ENODEV;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  finfo("Successfully initialized SPI%d\n", port);
 | 
			
		||||
 | 
			
		||||
  /* Bind the SPI device for the chip select to the slot */
 | 
			
		||||
 | 
			
		||||
  finfo("Binding SPI%d to MMC/SD slot %d\n", port, SAMD2L2_MMCSDSLOTNO);
 | 
			
		||||
 | 
			
		||||
  ret = mmcsd_spislotinitialize(minor, SAMD2L2_MMCSDSLOTNO, spi);
 | 
			
		||||
  if (ret < 0)
 | 
			
		||||
    {
 | 
			
		||||
      ferr("ERROR: Failed to bind SPI%d to MMC/SD slot %d: %d\n",
 | 
			
		||||
            port, SAMD2L2_MMCSDSLOTNO, ret);
 | 
			
		||||
      return ret;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  finfo("Successfully bound SPI%d to MMC/SD slot %d\n",
 | 
			
		||||
        port, SAMD2L2_MMCSDSLOTNO);
 | 
			
		||||
 | 
			
		||||
  return OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif /* CONFIG_SAMD20_XPLAINED_IOMODULE */
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,406 @@
 | 
			
		|||
/****************************************************************************
 | 
			
		||||
 * boards/arm/samd2l2/samd20-xplained/src/sam_spi.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 <nuttx/config.h>
 | 
			
		||||
 | 
			
		||||
#include <stdbool.h>
 | 
			
		||||
#include <debug.h>
 | 
			
		||||
#include <errno.h>
 | 
			
		||||
 | 
			
		||||
#include <nuttx/spi/spi.h>
 | 
			
		||||
 | 
			
		||||
#include "sam_config.h"
 | 
			
		||||
#include "sam_port.h"
 | 
			
		||||
#include "sam_spi.h"
 | 
			
		||||
 | 
			
		||||
#include "samd20-xplained.h"
 | 
			
		||||
 | 
			
		||||
#ifdef SAMD2L2_HAVE_SPI
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Public Functions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: sam_spidev_initialize
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   Called to configure SPI chip select PORT pins for the SAMD20 Xplained
 | 
			
		||||
 *   Pro board.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
void weak_function sam_spidev_initialize(void)
 | 
			
		||||
{
 | 
			
		||||
  /* The I/O module containing the SD connector may or may not be installed.
 | 
			
		||||
   * And, if it is installed, it may be in connector EXT1 or EXT2.
 | 
			
		||||
   */
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_SAMD20_XPLAINED_IOMODULE
 | 
			
		||||
  /* TODO: enable interrupt on card detect */
 | 
			
		||||
 | 
			
		||||
  sam_configport(PORT_SD_CD);     /* Card detect input */
 | 
			
		||||
  sam_configport(PORT_SD_CS);     /* Chip select output */
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_SAMD20_XPLAINED_OLED1MODULE
 | 
			
		||||
  sam_configport(PORT_OLED_DATA); /* Command/data */
 | 
			
		||||
  sam_configport(PORT_OLED_CS);   /* Card detect input */
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name:  sam_spi[n]select, sam_spi[n]status, and sam_spi[n]cmddata
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   These external functions must be provided by board-specific logic.
 | 
			
		||||
 *   They include:
 | 
			
		||||
 *
 | 
			
		||||
 *   o sam_spi[n]select is a functions to manage the board-specific chip
 | 
			
		||||
 *     selects
 | 
			
		||||
 *   o sam_spi[n]status and sam_spi[n]cmddata:  Implementations of the status
 | 
			
		||||
 *     and cmddata methods of the SPI interface defined by struct spi_ops_
 | 
			
		||||
 *     (see include/nuttx/spi/spi.h). All other methods including
 | 
			
		||||
 *     sam_spibus_initialize()) are provided by common SAMD/L logic.
 | 
			
		||||
 *
 | 
			
		||||
 *   Where [n] is the SERCOM number for the SPI module.
 | 
			
		||||
 *
 | 
			
		||||
 *   To use this common SPI logic on your board:
 | 
			
		||||
 *
 | 
			
		||||
 *   1. Provide logic in sam_boardinitialize() to configure SPI chip select
 | 
			
		||||
 *      pins.
 | 
			
		||||
 *   2. Provide sam_spi[n]select() and sam_spi[n]status() functions in your
 | 
			
		||||
 *      board-specific logic.  These functions will perform chip selection
 | 
			
		||||
 *      and status operations using GPIOs in the way your board is
 | 
			
		||||
 *      configured.
 | 
			
		||||
 *   2. If CONFIG_SPI_CMDDATA is defined in the NuttX configuration, provide
 | 
			
		||||
 *      sam_spi[n]cmddata() functions in your board-specific logic.  This
 | 
			
		||||
 *      function will perform cmd/data selection operations using GPIOs in
 | 
			
		||||
 *      the way your board is configured.
 | 
			
		||||
 *   3. Add a call to sam_spibus_initialize() in your low level application
 | 
			
		||||
 *      initialization logic
 | 
			
		||||
 *   4. The handle returned by sam_spibus_initialize() may then be used to
 | 
			
		||||
 *      bind the  SPI driver to higher level logic (e.g., calling
 | 
			
		||||
 *      mmcsd_spislotinitialize(), for example, will bind the SPI driver to
 | 
			
		||||
 *      the SPI MMC/SD driver).
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: sam_spi[n]select
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   PIO chip select pins may be programmed by the board specific logic in
 | 
			
		||||
 *   one of two different ways.  First, the pins may be programmed as SPI
 | 
			
		||||
 *   peripherals.  In that case, the pins are completely controlled by the
 | 
			
		||||
 *   SPI driver.  This method still needs to be provided, but it may be only
 | 
			
		||||
 *   a stub.
 | 
			
		||||
 *
 | 
			
		||||
 *   An alternative way to program the PIO chip select pins is as a normal
 | 
			
		||||
 *   GPIO output.  In that case, the automatic control of the CS pins is
 | 
			
		||||
 *   bypassed and this function must provide control of the chip select.
 | 
			
		||||
 *   NOTE:  In this case, the GPIO output pin does *not* have to be the
 | 
			
		||||
 *   same as the NPCS pin normal associated with the chip select number.
 | 
			
		||||
 *
 | 
			
		||||
 * Input Parameters:
 | 
			
		||||
 *   dev - SPI device info
 | 
			
		||||
 *   devid - Identifies the (logical) device
 | 
			
		||||
 *   selected - TRUE:Select the device, FALSE:De-select the device
 | 
			
		||||
 *
 | 
			
		||||
 * Returned Value:
 | 
			
		||||
 *   None
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#ifdef SAMD2L2_HAVE_SPI0
 | 
			
		||||
void sam_spi0select(FAR struct spi_dev_s *dev, uint32_t devid,
 | 
			
		||||
                    bool selected)
 | 
			
		||||
{
 | 
			
		||||
#ifdef CONFIG_SAMD20_XPLAINED_IOMODULE_EXT1
 | 
			
		||||
  /* Select/de-select the SD card */
 | 
			
		||||
 | 
			
		||||
  if (devid == SPIDEV_MMCSD(0))
 | 
			
		||||
    {
 | 
			
		||||
      /* Active low */
 | 
			
		||||
 | 
			
		||||
      sam_portwrite(PORT_SD_CS, !selected);
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_SAMD20_XPLAINED_OLED1MODULE_EXT1
 | 
			
		||||
  /* Select/de-select the OLED */
 | 
			
		||||
 | 
			
		||||
  if (devid == SPIDEV_DISPLAY(0))
 | 
			
		||||
    {
 | 
			
		||||
      /* Active low */
 | 
			
		||||
 | 
			
		||||
      sam_portwrite(PORT_OLED_CS, !selected);
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef SAMD2L2_HAVE_SPI1
 | 
			
		||||
void sam_spi1select(FAR struct spi_dev_s *dev, uint32_t devid,
 | 
			
		||||
                    bool selected)
 | 
			
		||||
{
 | 
			
		||||
#ifdef CONFIG_SAMD20_XPLAINED_IOMODULE_EXT2
 | 
			
		||||
  /* Select/de-select the SD card */
 | 
			
		||||
 | 
			
		||||
  if (devid == SPIDEV_MMCSD(0))
 | 
			
		||||
    {
 | 
			
		||||
      /* Active low */
 | 
			
		||||
 | 
			
		||||
      sam_portwrite(PORT_SD_CS, !selected);
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_SAMD20_XPLAINED_OLED1MODULE_EXT2
 | 
			
		||||
  /* Select/de-select the OLED */
 | 
			
		||||
 | 
			
		||||
  if (devid == SPIDEV_DISPLAY(0))
 | 
			
		||||
    {
 | 
			
		||||
      /* Active low */
 | 
			
		||||
 | 
			
		||||
      sam_portwrite(PORT_OLED_CS, !selected);
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef SAMD2L2_HAVE_SPI2
 | 
			
		||||
void sam_spi2select(FAR struct spi_dev_s *dev, uint32_t devid,
 | 
			
		||||
                    bool selected)
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef SAMD2L2_HAVE_SPI3
 | 
			
		||||
void sam_spi3select(FAR struct spi_dev_s *dev, uint32_t devid,
 | 
			
		||||
                    bool selected)
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef SAMD2L2_HAVE_SPI4
 | 
			
		||||
void sam_spi4select(FAR struct spi_dev_s *dev, uint32_t devid,
 | 
			
		||||
                    bool selected)
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef SAMD2L2_HAVE_SPI5
 | 
			
		||||
void sam_spi5select(FAR struct spi_dev_s *dev, uint32_t devid,
 | 
			
		||||
                    bool selected)
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: sam_spi[n]status
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   Return status information associated with the SPI device.
 | 
			
		||||
 *
 | 
			
		||||
 * Input Parameters:
 | 
			
		||||
 *   dev - SPI device info
 | 
			
		||||
 *   devid - Identifies the (logical) device
 | 
			
		||||
 *
 | 
			
		||||
 * Returned Value:
 | 
			
		||||
 *   Bit-encoded SPI status (see include/nuttx/spi/spi.h.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#ifdef SAMD2L2_HAVE_SPI0
 | 
			
		||||
uint8_t sam_spi0status(FAR struct spi_dev_s *dev, uint32_t devid)
 | 
			
		||||
{
 | 
			
		||||
  uint8_t ret = 0;
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_SAMD20_XPLAINED_IOMODULE_EXT1
 | 
			
		||||
  /* Check if an SD card is present in the microSD slot */
 | 
			
		||||
 | 
			
		||||
  if (devid == SPIDEV_MMCSD(0))
 | 
			
		||||
    {
 | 
			
		||||
      /* Active low */
 | 
			
		||||
 | 
			
		||||
      if (!sam_portread(PORT_SD_CD))
 | 
			
		||||
        {
 | 
			
		||||
          ret |= SPI_STATUS_PRESENT;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
  return ret;
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef SAMD2L2_HAVE_SPI1
 | 
			
		||||
uint8_t sam_spi1status(FAR struct spi_dev_s *dev, uint32_t devid)
 | 
			
		||||
{
 | 
			
		||||
  uint8_t ret = 0;
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_SAMD20_XPLAINED_IOMODULE_EXT2
 | 
			
		||||
  /* Check if an SD card is present in the microSD slot */
 | 
			
		||||
 | 
			
		||||
  if (devid == SPIDEV_MMCSD(0))
 | 
			
		||||
    {
 | 
			
		||||
      /* Active low */
 | 
			
		||||
 | 
			
		||||
      if (!sam_portread(PORT_SD_CD))
 | 
			
		||||
        {
 | 
			
		||||
          ret |= SPI_STATUS_PRESENT;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
  return ret;
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef SAMD2L2_HAVE_SPI2
 | 
			
		||||
uint8_t sam_spi2status(FAR struct spi_dev_s *dev, uint32_t devid)
 | 
			
		||||
{
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef SAMD2L2_HAVE_SPI3
 | 
			
		||||
uint8_t sam_spi3status(FAR struct spi_dev_s *dev, uint32_t devid)
 | 
			
		||||
{
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef SAMD2L2_HAVE_SPI4
 | 
			
		||||
uint8_t sam_spi4status(FAR struct spi_dev_s *dev, uint32_t devid)
 | 
			
		||||
{
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef SAMD2L2_HAVE_SPI5
 | 
			
		||||
uint8_t sam_spi5status(FAR struct spi_dev_s *dev, uint32_t devid)
 | 
			
		||||
{
 | 
			
		||||
  uint8_t ret = 0;
 | 
			
		||||
  return ret;
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: sam_spi[n]cmddata
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   Some SPI devices require an additional control to determine if the SPI
 | 
			
		||||
 *   data being sent is a command or is data.  If CONFIG_SPI_CMDDATA then
 | 
			
		||||
 *   this function will be called to different be command and data transfers.
 | 
			
		||||
 *
 | 
			
		||||
 *   This is often needed, for example, by LCD drivers.  Some LCD hardware
 | 
			
		||||
 *   may be configured to use 9-bit data transfers with the 9th bit
 | 
			
		||||
 *   indicating command or data.  That same hardware may be configurable,
 | 
			
		||||
 *   instead, to use 8-bit data but to require an additional, board-
 | 
			
		||||
 *   specific GPIO control to distinguish command and data.  This function
 | 
			
		||||
 *   would be needed in that latter case.
 | 
			
		||||
 *
 | 
			
		||||
 * Input Parameters:
 | 
			
		||||
 *   dev - SPI device info
 | 
			
		||||
 *   devid - Identifies the (logical) device
 | 
			
		||||
 *
 | 
			
		||||
 * Returned Value:
 | 
			
		||||
 *   Zero on success; a negated errno on failure.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_SPI_CMDDATA
 | 
			
		||||
#ifdef SAMD2L2_HAVE_SPI0
 | 
			
		||||
int sam_spi0cmddata(FAR struct spi_dev_s *dev, uint32_t devid, bool cmd)
 | 
			
		||||
{
 | 
			
		||||
#ifdef CONFIG_SAMD20_XPLAINED_OLED1MODULE_EXT1
 | 
			
		||||
  if (devid == SPIDEV_DISPLAY(0))
 | 
			
		||||
    {
 | 
			
		||||
      /* This is the Data/Command control pad which determines whether the
 | 
			
		||||
       * data bits are data or a command.
 | 
			
		||||
       *
 | 
			
		||||
       * High: the inputs are treated as display data.
 | 
			
		||||
       * Low:  the inputs are transferred to the command registers.
 | 
			
		||||
       */
 | 
			
		||||
 | 
			
		||||
      sam_portwrite(PORT_OLED_DATA, !cmd);
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
  return OK;
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef SAMD2L2_HAVE_SPI1
 | 
			
		||||
int sam_spi1cmddata(FAR struct spi_dev_s *dev, uint32_t devid, bool cmd)
 | 
			
		||||
{
 | 
			
		||||
#ifdef CONFIG_SAMD20_XPLAINED_OLED1MODULE_EXT2
 | 
			
		||||
  if (devid == SPIDEV_DISPLAY(0))
 | 
			
		||||
    {
 | 
			
		||||
      /* This is the Data/Command control pad which determines whether the
 | 
			
		||||
       * data bits are data or a command.
 | 
			
		||||
       *
 | 
			
		||||
       * High: the inputs are treated as display data.
 | 
			
		||||
       * Low:  the inputs are transferred to the command registers.
 | 
			
		||||
       */
 | 
			
		||||
 | 
			
		||||
      sam_portwrite(PORT_OLED_DATA, !cmd);
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
  return OK;
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef SAMD2L2_HAVE_SPI2
 | 
			
		||||
int sam_spi2cmddata(FAR struct spi_dev_s *dev, uint32_t devid, bool cmd)
 | 
			
		||||
{
 | 
			
		||||
  return OK;
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef SAMD2L2_HAVE_SPI3
 | 
			
		||||
int sam_spi3cmddata(FAR struct spi_dev_s *dev, uint32_t devid, bool cmd)
 | 
			
		||||
{
 | 
			
		||||
  return OK;
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef SAMD2L2_HAVE_SPI4
 | 
			
		||||
int sam_spi4cmddata(FAR struct spi_dev_s *dev, uint32_t devid, bool cmd)
 | 
			
		||||
{
 | 
			
		||||
  return OK;
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef SAMD2L2_HAVE_SPI5
 | 
			
		||||
int sam_spi5cmddata(FAR struct spi_dev_s *dev, uint32_t devid, bool cmd)
 | 
			
		||||
{
 | 
			
		||||
  return OK;
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif /* CONFIG_SPI_CMDDATA */
 | 
			
		||||
#endif /* SAMD2L2_HAVE_SPI */
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,191 @@
 | 
			
		|||
/****************************************************************************
 | 
			
		||||
 * boards/arm/samd2l2/samd20-xplained/src/sam_ug2832hsweg04.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.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/* OLED1 Connector:
 | 
			
		||||
 *
 | 
			
		||||
 *  OLED1 CONNECTOR
 | 
			
		||||
 *  ----------------- ---------------------- ----------------------
 | 
			
		||||
 *  OLED1             EXT1                   EXT2
 | 
			
		||||
 *  ----------------- ---------------------- ----------------------
 | 
			
		||||
 *  1  ID             1                      1
 | 
			
		||||
 *  ----------------- ---------------------- ----------------------
 | 
			
		||||
 *  2  GND            2       GND            2  GND
 | 
			
		||||
 *  ----------------- ---------------------- ----------------------
 | 
			
		||||
 *  3  BUTTON2        3  PB00 AIN[8]         3  PA10 AIN[18]
 | 
			
		||||
 *  ----------------- ---------------------- ----------------------
 | 
			
		||||
 *  4  BUTTON3        4  PB01 AIN[9]         4  PA11 AIN[19]
 | 
			
		||||
 *  ----------------- ---------------------- ----------------------
 | 
			
		||||
 *  5  DATA_CMD_SEL   5  PB06 PORT           5  PA20 PORT
 | 
			
		||||
 *  ----------------- ---------------------- ----------------------
 | 
			
		||||
 *  6  LED3           6  PB07 PORT           6  PA21 PORT
 | 
			
		||||
 *  ----------------- ---------------------- ----------------------
 | 
			
		||||
 *  7  LED1           7  PB02 TC6/WO[0]      7  PA22 TC4/WO[0]
 | 
			
		||||
 *  ----------------- ---------------------- ----------------------
 | 
			
		||||
 *  8  LED2           8  PB03 TC6/WO[1]      8  PA23 TC4/WO[1]
 | 
			
		||||
 *  ----------------- ---------------------- ----------------------
 | 
			
		||||
 *  9  BUTTON1        9  PB04 EXTINT[4]      9  PB14 EXTINT[14]
 | 
			
		||||
 *  ----------------- ---------------------- ----------------------
 | 
			
		||||
 *  10 DISPLAY_RESET  10 PB05 PORT           10 PB15 PORT
 | 
			
		||||
 *  ----------------- ---------------------- ----------------------
 | 
			
		||||
 *  11 N/C            11 PA08 SERCOM2 PAD[0] 11 PA08 SERCOM2 PAD[0]
 | 
			
		||||
 *                            I²C SDA                I²C SDA
 | 
			
		||||
 *  ----------------- ---------------------- ----------------------
 | 
			
		||||
 *  12 N/C            12 PA09 SERCOM2 PAD[1] 12 PA09 SERCOM2 PAD[1]
 | 
			
		||||
 *                            I²C SCL                I²C SCL
 | 
			
		||||
 *  ----------------- ---------------------- ----------------------
 | 
			
		||||
 *  13 N/C            13 PB09 SERCOM4 PAD[1] 13 PB13 SERCOM4 PAD[1]
 | 
			
		||||
 *                            USART RX               USART RX
 | 
			
		||||
 *  ----------------- ---------------------- ----------------------
 | 
			
		||||
 *  14 N/C            14 PB08 SERCOM4 PAD[0] 14 PB12 SERCOM4 PAD[0]
 | 
			
		||||
 *                            USART TX               USART TX
 | 
			
		||||
 *  ----------------- ---------------------- ----------------------
 | 
			
		||||
 *  15 DISPLAY_SS     15 PA05 SERCOM0 PAD[1] 15 PA17 SERCOM1 PAD[1]
 | 
			
		||||
 *                            SPI SS                 SPI SS
 | 
			
		||||
 *  ----------------- ---------------------- ----------------------
 | 
			
		||||
 *  16 SPI_MOSI       16 PA06 SERCOM0 PAD[2] 16 PA18 SERCOM1 PAD[2]
 | 
			
		||||
 *                            SPI MOSI               SPI MOSI
 | 
			
		||||
 *  ----------------- ---------------------- ----------------------
 | 
			
		||||
 *  17 N/C            17 PA04 SERCOM0 PAD[0] 17 PA16 SERCOM1 PAD[0]
 | 
			
		||||
 *                            SPI MISO               SPI MISO
 | 
			
		||||
 *  ----------------- ---------------------- ----------------------
 | 
			
		||||
 *  18 SPI_SCK        18 PA07 SERCOM0 PAD[3] 18 PA19 SERCOM1 PAD[3]
 | 
			
		||||
 *                            SPI SCK                SPI SCK
 | 
			
		||||
 *  ----------------- ---------------------- ----------------------
 | 
			
		||||
 *  19 GND            19      GND               GND
 | 
			
		||||
 *  ----------------- ---------------------- ----------------------
 | 
			
		||||
 *  20 VCC            20      VCC               VCC
 | 
			
		||||
 *  ----------------- ---------------------- ----------------------
 | 
			
		||||
 *
 | 
			
		||||
 * OLED1 signals
 | 
			
		||||
 *
 | 
			
		||||
 * DATA_CMD_SEL - Data/command select. Used to choose whether the
 | 
			
		||||
 *   communication is data to the display memory or a command to the LCD
 | 
			
		||||
 *   controller. High = data, low = command
 | 
			
		||||
 * DISPLAY_RESET - Reset signal to the OLED display, active low. Used during
 | 
			
		||||
 *   initialization of the display.
 | 
			
		||||
 * DISPLAY_SS - SPI slave select signal, must be held low during SPI
 | 
			
		||||
 *   communication.
 | 
			
		||||
 * SPI_MOSI - SPI master out, slave in signal. Used to write data to the
 | 
			
		||||
 *   display
 | 
			
		||||
 * SPI_SCK SPI - clock signal, generated by the master.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Included Files
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#include <nuttx/config.h>
 | 
			
		||||
 | 
			
		||||
#include <debug.h>
 | 
			
		||||
 | 
			
		||||
#include <nuttx/board.h>
 | 
			
		||||
#include <nuttx/spi/spi.h>
 | 
			
		||||
#include <nuttx/lcd/lcd.h>
 | 
			
		||||
#include <nuttx/lcd/ssd1306.h>
 | 
			
		||||
 | 
			
		||||
#include "sam_port.h"
 | 
			
		||||
#include "sam_spi.h"
 | 
			
		||||
 | 
			
		||||
#include "samd20-xplained.h"
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_SAMD20_XPLAINED_OLED1MODULE
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Pre-processor Definitions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/* Configuration ************************************************************/
 | 
			
		||||
 | 
			
		||||
/* The pin configurations here require that SPI1 is selected */
 | 
			
		||||
 | 
			
		||||
#ifndef CONFIG_LCD_SSD1306
 | 
			
		||||
#  error "The OLED driver requires CONFIG_LCD_SSD1306 in the configuration"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifndef CONFIG_LCD_UG2832HSWEG04
 | 
			
		||||
#  error "The OLED driver requires CONFIG_LCD_UG2832HSWEG04 in the configuration"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifndef SAMD2L2_HAVE_SPI0
 | 
			
		||||
#  error "The OLED driver requires SAMD2L2_HAVE_SPI0 in the configuration"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifndef CONFIG_SPI_CMDDATA
 | 
			
		||||
#  error "The OLED driver requires CONFIG_SPI_CMDDATA in the configuration"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Public Functions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: board_graphics_setup
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   Called by NX initialization logic to configure the OLED.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
FAR struct lcd_dev_s *board_graphics_setup(unsigned int devno)
 | 
			
		||||
{
 | 
			
		||||
  FAR struct spi_dev_s *spi;
 | 
			
		||||
  FAR struct lcd_dev_s *dev;
 | 
			
		||||
 | 
			
		||||
  /* Configure the OLED PORTs. This initial configuration is RESET low,
 | 
			
		||||
   * putting the OLED into reset state.
 | 
			
		||||
   */
 | 
			
		||||
 | 
			
		||||
  sam_configport(PORT_OLED_RST);
 | 
			
		||||
 | 
			
		||||
  /* Wait a bit then release the OLED from the reset state */
 | 
			
		||||
 | 
			
		||||
  up_mdelay(20);
 | 
			
		||||
  sam_portwrite(PORT_OLED_RST, true);
 | 
			
		||||
 | 
			
		||||
  /* Get the SPI1 port interface */
 | 
			
		||||
 | 
			
		||||
  spi = sam_spibus_initialize(OLED_CSNO);
 | 
			
		||||
  if (!spi)
 | 
			
		||||
    {
 | 
			
		||||
      lcderr("ERROR: Failed to initialize SPI port 1\n");
 | 
			
		||||
    }
 | 
			
		||||
  else
 | 
			
		||||
    {
 | 
			
		||||
      /* Bind the SPI port to the OLED */
 | 
			
		||||
 | 
			
		||||
      dev = ssd1306_initialize(spi, NULL, devno);
 | 
			
		||||
      if (!dev)
 | 
			
		||||
        {
 | 
			
		||||
          lcderr("ERROR: Failed to bind SPI port 1 to OLED %d\n", devno);
 | 
			
		||||
        }
 | 
			
		||||
     else
 | 
			
		||||
        {
 | 
			
		||||
          lcdinfo("Bound SPI port 1 to OLED %d\n", devno);
 | 
			
		||||
 | 
			
		||||
          /* And turn the OLED on */
 | 
			
		||||
 | 
			
		||||
          dev->setpower(dev, CONFIG_LCD_MAXPOWER);
 | 
			
		||||
          return dev;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  return NULL;
 | 
			
		||||
}
 | 
			
		||||
#endif /* CONFIG_SAMD20_XPLAINED_OLED1MODULE */
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,107 @@
 | 
			
		|||
/****************************************************************************
 | 
			
		||||
 * boards/arm/samd2l2/samd20-xplained/src/sam_userleds.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.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/* There are three LEDs on board the SAMD20 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 labeled STATUS near the SAMD20 USB
 | 
			
		||||
 * connector.
 | 
			
		||||
 *
 | 
			
		||||
 * This LED is controlled by PA14 and the LED can be activated by driving
 | 
			
		||||
 * PA14 to GND.
 | 
			
		||||
 *
 | 
			
		||||
 * When CONFIG_ARCH_LEDS is defined in the NuttX configuration, NuttX will
 | 
			
		||||
 * control the LED.  Otherwise, the LED can be controlled from user
 | 
			
		||||
 * applications using the logic in this file.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Included Files
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#include <nuttx/config.h>
 | 
			
		||||
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
#include <stdbool.h>
 | 
			
		||||
#include <debug.h>
 | 
			
		||||
 | 
			
		||||
#include <arch/board/board.h>
 | 
			
		||||
 | 
			
		||||
#include "sam_port.h"
 | 
			
		||||
#include "samd20-xplained.h"
 | 
			
		||||
 | 
			
		||||
#ifndef CONFIG_ARCH_LEDS
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Public Functions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: board_userled_initialize
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   If CONFIG_ARCH_LEDS is defined, then NuttX will control the on-board
 | 
			
		||||
 *   LEDs.  If CONFIG_ARCH_LEDS is not defined, then the
 | 
			
		||||
 *   board_userled_initialize() is available to initialize the LED from user
 | 
			
		||||
 *   application logic.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
uint32_t board_userled_initialize(void)
 | 
			
		||||
{
 | 
			
		||||
  sam_configport(PORT_STATUS_LED);
 | 
			
		||||
  return BOARD_NLEDS;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: board_userled
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   If CONFIG_ARCH_LEDS is defined, then NuttX will control the on-board
 | 
			
		||||
 *  LEDs.  If CONFIG_ARCH_LEDS is not defined, then the board_userled() is
 | 
			
		||||
 *  available to control the LED from user application logic.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
void board_userled(int led, bool ledon)
 | 
			
		||||
{
 | 
			
		||||
  if (led == BOARD_STATUS_LED)
 | 
			
		||||
    {
 | 
			
		||||
      sam_portwrite(PORT_STATUS_LED, !ledon);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: board_userled_all
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   If CONFIG_ARCH_LEDS is defined, then NuttX will control the on-board
 | 
			
		||||
 *   LEDs.  If CONFIG_ARCH_LEDS is not defined, then the board_userled_all()
 | 
			
		||||
 *   is available to control the LED from user application logic.
 | 
			
		||||
 *   NOTE:  since there is only a single LED on-board,
 | 
			
		||||
 *    this is function is not very useful.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
void board_userled_all(uint32_t ledset)
 | 
			
		||||
{
 | 
			
		||||
  board_userled(BOARD_STATUS_LED, (ledset & BOARD_STATUS_LED_BIT) != 0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif /* !CONFIG_ARCH_LEDS */
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,255 @@
 | 
			
		|||
/****************************************************************************
 | 
			
		||||
 * boards/arm/samd2l2/samd20-xplained/src/samd20-xplained.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_SAMD20_XPLAINED_SRC_SAMD20_XPLAINED_H
 | 
			
		||||
#define __BOARDS_ARM_SAMD2L2_SAMD20_XPLAINED_SRC_SAMD20_XPLAINED_H
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Included Files
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#include <nuttx/config.h>
 | 
			
		||||
#include <nuttx/compiler.h>
 | 
			
		||||
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
 | 
			
		||||
#include <arch/irq.h>
 | 
			
		||||
#include <nuttx/irq.h>
 | 
			
		||||
 | 
			
		||||
#include "sam_config.h"
 | 
			
		||||
#include "sam_pinmap.h"
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Pre-processor Definitions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/* LEDs: There are three LEDs on board the SAMD20 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 SAMD20 USB connector.
 | 
			
		||||
 *
 | 
			
		||||
 * This LED is controlled by PA14 and the LED can be activated by driving
 | 
			
		||||
 * PA14 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_PIN14)
 | 
			
		||||
 | 
			
		||||
/* Mechanical buttons:
 | 
			
		||||
 *
 | 
			
		||||
 * The SAMD20 Xplained Pro contains two mechanical buttons. One button is the
 | 
			
		||||
 * RESET button connected to the SAMD20 reset line and the other is a generic
 | 
			
		||||
 * user configurable button.
 | 
			
		||||
 * When a button is pressed it will drive the I/O line to GND.
 | 
			
		||||
 *
 | 
			
		||||
 *   PA15 SW0
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define PORT_SW0      (PORT_INTERRUPT | PORT_PULL_UP | PORTA | PORT_PIN15)
 | 
			
		||||
#define IRQ_SW0       SAM_IRQ_PA15
 | 
			
		||||
 | 
			
		||||
/* I/O1
 | 
			
		||||
 *
 | 
			
		||||
 * Support for the microSD card slot on the I/O1 module.
 | 
			
		||||
 * The I/O1 requires SPI support and two PORTs.
 | 
			
		||||
 * These the PORTs will vary if the I/O1 is installed on the EXT1 or
 | 
			
		||||
 * EXT2 connector:
 | 
			
		||||
 *
 | 
			
		||||
 *   --- ------------------ ---------------------- --------------------------
 | 
			
		||||
 *   PIN EXT1               EXT2                   Description
 | 
			
		||||
 *   --- ------------------ ---------------------- --------------------------
 | 
			
		||||
 *   15 PA05 SERCOM0 PAD[1] 15 PA17 SERCOM1 PAD[1]  Active low chip select
 | 
			
		||||
 *           SPI SS                 SPI SS          OUTPUT, pulled high on
 | 
			
		||||
 *                                                  board.
 | 
			
		||||
 *   --- ------------------ ---------------------- --------------------------
 | 
			
		||||
 *   10 PB05 PORT           10 PB15 PORT            Active low card detect
 | 
			
		||||
 *                                                  INPUT, must use internal
 | 
			
		||||
 *                                                  pull-up.
 | 
			
		||||
 *   --- ------------------ ---------------------- --------------------------
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_SAMD20_XPLAINED_IOMODULE
 | 
			
		||||
 | 
			
		||||
#  ifndef SAMD2L2_HAVE_SPI0
 | 
			
		||||
#    error SAMD2L2_HAVE_SPI0 is required to use the I/O1 module
 | 
			
		||||
#  endif
 | 
			
		||||
 | 
			
		||||
#  if defined(CONFIG_SAMD20_XPLAINED_IOMODULE_EXT1)
 | 
			
		||||
 | 
			
		||||
#    if defined(CONFIG_SAMD20_XPLAINED_OLED1MODULE) && \
 | 
			
		||||
        defined(CONFIG_SAMD20_XPLAINED_OLED1MODULE_EXT1)
 | 
			
		||||
#      error I/O1 and OLED1 modules cannot both reside in EXT1
 | 
			
		||||
#    endif
 | 
			
		||||
 | 
			
		||||
#    define PORT_SD_CD (PORT_INTERRUPT | PORT_INT_CHANGE | PORT_PULL_UP | \
 | 
			
		||||
                        PORTB | PORT_PIN5)
 | 
			
		||||
 | 
			
		||||
#    define PORT_SD_CS (PORT_OUTPUT | PORT_PULL_NONE | PORT_OUTPUT_SET | \
 | 
			
		||||
                        PORTA | PORT_PIN5)
 | 
			
		||||
 | 
			
		||||
#  elif defined(CONFIG_SAMD20_XPLAINED_IOMODULE_EXT2)
 | 
			
		||||
 | 
			
		||||
#    if defined(CONFIG_SAMD20_XPLAINED_OLED1MODULE) && \
 | 
			
		||||
        defined(CONFIG_SAMD20_XPLAINED_OLED1MODULE_EXT2)
 | 
			
		||||
#      error I/O1 and OLED1 modules cannot both reside in EXT2
 | 
			
		||||
#    endif
 | 
			
		||||
 | 
			
		||||
#    define PORT_SD_CD (PORT_INTERRUPT | PORT_INT_CHANGE | PORT_PULL_UP | \
 | 
			
		||||
                        PORTB | PORT_PIN15)
 | 
			
		||||
 | 
			
		||||
#    define PORT_SD_CS (PORT_OUTPUT | PORT_PULL_NONE | PORT_OUTPUT_SET | \
 | 
			
		||||
                        PORTA | PORT_PIN17)
 | 
			
		||||
 | 
			
		||||
#  else
 | 
			
		||||
#    error Which connector is the I/O1 module installed in?
 | 
			
		||||
#  endif
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/* OLED1
 | 
			
		||||
 *
 | 
			
		||||
 * Support for the microSD card slot on the I/O1 module.
 | 
			
		||||
 * The I/O1 requires SPI support and three output PORTs.
 | 
			
		||||
 * These the PORTs will vary if the OLED1is installed on the EXT1 or
 | 
			
		||||
 * EXT2 connector:
 | 
			
		||||
 *
 | 
			
		||||
 *   PIN EXT1                EXT2                 Description
 | 
			
		||||
 *   --- ------------------- -------------------- ---------------------------
 | 
			
		||||
 *   5   PB06 PORT           PA20 PORT            DATA_CMD_SEL
 | 
			
		||||
 *   10  PB05 PORT           PB15 PORT            DISPLAY_RESET. Active low.
 | 
			
		||||
 *   15  PA05 SERCOM0 PAD[1] PA17 SERCOM1 PAD[1]  DISPLAY_SS.  Active low.
 | 
			
		||||
 *            SPI SS              SPI SS
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_SAMD20_XPLAINED_OLED1MODULE
 | 
			
		||||
 | 
			
		||||
#  ifndef SAMD2L2_HAVE_SPI0
 | 
			
		||||
#    error SAMD2L2_HAVE_SPI0 is required to use the OLED1 module
 | 
			
		||||
#  endif
 | 
			
		||||
 | 
			
		||||
#  ifndef CONFIG_SPI_CMDDATA
 | 
			
		||||
#    error CONFIG_SPI_CMDDATA is required to use the OLED1 module
 | 
			
		||||
#  endif
 | 
			
		||||
 | 
			
		||||
#  ifndef CONFIG_LCD_SSD1306
 | 
			
		||||
#    error CONFIG_LCD_SSD1306 is required to use the OLED1 module
 | 
			
		||||
#  endif
 | 
			
		||||
 | 
			
		||||
#  ifndef CONFIG_LCD_UG2832HSWEG04
 | 
			
		||||
#    error CONFIG_LCD_UG2832HSWEG04 is required to use the OLED1 module
 | 
			
		||||
#  endif
 | 
			
		||||
 | 
			
		||||
#  if defined(CONFIG_SAMD20_XPLAINED_OLED1MODULE_EXT1)
 | 
			
		||||
 | 
			
		||||
#    if defined(CONFIG_SAMD20_XPLAINED_IOMODULE) && \
 | 
			
		||||
        defined(CONFIG_SAMD20_XPLAINED_IOMODULE_EXT1)
 | 
			
		||||
#      error OLED1 and I/O1 modules cannot both reside in EXT1
 | 
			
		||||
#    endif
 | 
			
		||||
 | 
			
		||||
#    define PORT_OLED_DATA (PORT_OUTPUT | PORT_PULL_NONE | PORT_OUTPUT_CLEAR | \
 | 
			
		||||
                            PORTB | PORT_PIN6)
 | 
			
		||||
#    define PORT_OLED_RST  (PORT_OUTPUT | PORT_PULL_NONE | PORT_OUTPUT_CLEAR | \
 | 
			
		||||
                            PORTB | PORT_PIN5)
 | 
			
		||||
#    define PORT_OLED_CS   (PORT_OUTPUT | PORT_PULL_NONE | PORT_OUTPUT_SET | \
 | 
			
		||||
                            PORTA | PORT_PIN5)
 | 
			
		||||
 | 
			
		||||
#  elif defined(CONFIG_SAMD20_XPLAINED_OLED1MODULE_EXT2)
 | 
			
		||||
 | 
			
		||||
#    if defined(CONFIG_SAMD20_XPLAINED_IOMODULE) && \
 | 
			
		||||
        defined(CONFIG_SAMD20_XPLAINED_IOMODULE_EXT2)
 | 
			
		||||
#      error OLED1 and I/O1 modules cannot both reside in EXT2
 | 
			
		||||
#    endif
 | 
			
		||||
 | 
			
		||||
#    define PORT_OLED_DATA (PORT_OUTPUT | PORT_PULL_NONE | PORT_OUTPUT_CLEAR | \
 | 
			
		||||
                            PORTA | PORT_PIN20)
 | 
			
		||||
#    define PORT_OLED_RST  (PORT_OUTPUT | PORT_PULL_NONE | PORT_OUTPUT_CLEAR | \
 | 
			
		||||
                            PORTB | PORT_PIN15)
 | 
			
		||||
#    define PORT_OLED_CS   (PORT_OUTPUT | PORT_PULL_NONE | PORT_OUTPUT_SET | \
 | 
			
		||||
                            PORTA | PORT_PIN17)
 | 
			
		||||
 | 
			
		||||
#  else
 | 
			
		||||
#    error Which connector is the OLED1 module installed in?
 | 
			
		||||
#  endif
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined(CONFIG_LCD_UG2864AMBAG01) || defined(CONFIG_LCD_UG2864HSWEG01)
 | 
			
		||||
#    define PORT_SD_CS (PORT_OUTPUT | PORT_PULL_NONE | PORT_OUTPUT_SET | \
 | 
			
		||||
                        PORTB | PORT_PIN11) /* REVISIT */
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Public Types
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Public Data
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#ifndef __ASSEMBLY__
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Public Functions Definitions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: sam_spidev_initialize
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   Called to configure SPI chip select PORT pins for the SAM3U-EK board.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
void weak_function sam_spidev_initialize(void);
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: sam_sdinitialize
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   Initialize the SPI-based SD card.
 | 
			
		||||
 *   Requires CONFIG_SAMD20_XPLAINED_IOMODULE=y,
 | 
			
		||||
 *   CONFIG_DISABLE_MOUNTPOINT=n, CONFIG_MMCSD=y,
 | 
			
		||||
 *   and the appropriate SERCOM SPI
 | 
			
		||||
 *   port enabled.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_SAMD20_XPLAINED_IOMODULE
 | 
			
		||||
int sam_sdinitialize(int port, int minor);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif /* __ASSEMBLY__ */
 | 
			
		||||
#endif /* __BOARDS_ARM_SAMD2L2_SAMD20_XPLAINED_SRC_SAMD20_XPLAINED_H */
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,82 @@
 | 
			
		|||
#
 | 
			
		||||
# For a description of the syntax of this configuration file,
 | 
			
		||||
# see the file kconfig-language.txt in the NuttX tools repository.
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
if ARCH_BOARD_SAMD21_XPLAINED
 | 
			
		||||
 | 
			
		||||
menu "SAMD21 Xplained Pro Modules"
 | 
			
		||||
 | 
			
		||||
config SAMD21_XPLAINED_IOMODULE
 | 
			
		||||
	bool "I/O1 Module"
 | 
			
		||||
	default n
 | 
			
		||||
	---help---
 | 
			
		||||
		The I/O 1 module is attached.  This module provides an MMC/SD card
 | 
			
		||||
		slot.
 | 
			
		||||
 | 
			
		||||
if SAMD21_XPLAINED_IOMODULE
 | 
			
		||||
 | 
			
		||||
choice
 | 
			
		||||
	prompt "I/O1 Module Location"
 | 
			
		||||
	default SAMD21_XPLAINED_IOMODULE_EXT1
 | 
			
		||||
 | 
			
		||||
config SAMD21_XPLAINED_IOMODULE_EXT1
 | 
			
		||||
	bool "EXT1"
 | 
			
		||||
 | 
			
		||||
config SAMD21_XPLAINED_IOMODULE_EXT2
 | 
			
		||||
	bool "EXT2"
 | 
			
		||||
 | 
			
		||||
endchoice
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
config SAMD21_XPLAINED_OLED1MODULE
 | 
			
		||||
	bool "OLED1 Module"
 | 
			
		||||
	default n
 | 
			
		||||
	---help---
 | 
			
		||||
		The OLED 1 module is attached.  This module provides an OLED plus 3
 | 
			
		||||
		additional switches and 3 additional LEDs.
 | 
			
		||||
 | 
			
		||||
if SAMD21_XPLAINED_OLED1MODULE
 | 
			
		||||
 | 
			
		||||
choice
 | 
			
		||||
	prompt "OLED1 Module Location"
 | 
			
		||||
	default SAMD21_XPLAINED_OLED1MODULE_EXT1
 | 
			
		||||
 | 
			
		||||
config SAMD21_XPLAINED_OLED1MODULE_EXT1
 | 
			
		||||
	bool "EXT1"
 | 
			
		||||
 | 
			
		||||
config SAMD21_XPLAINED_OLED1MODULE_EXT2
 | 
			
		||||
	bool "EXT2"
 | 
			
		||||
 | 
			
		||||
endchoice
 | 
			
		||||
endif
 | 
			
		||||
endmenu
 | 
			
		||||
 | 
			
		||||
if USART4_SERIAL_CONSOLE
 | 
			
		||||
choice
 | 
			
		||||
	prompt "USART 4 Connection"
 | 
			
		||||
	default SAMD21_XPLAINED_USART4_EXT3
 | 
			
		||||
 | 
			
		||||
config SAMD21_XPLAINED_USART4_EXT1
 | 
			
		||||
	bool "EXT1"
 | 
			
		||||
	depends on !SAMD21_XPLAINED_OLED1MODULE_EXT1 && !SAMD21_XPLAINED_IOMODULE_EXT1
 | 
			
		||||
	---help---
 | 
			
		||||
		Select this option if the serial console is on SERCOM4 connected via
 | 
			
		||||
		EXT1.  The RX will be on PB9 and TX signal will be on PB8.
 | 
			
		||||
 | 
			
		||||
config SAMD21_XPLAINED_USART4_EXT2
 | 
			
		||||
	bool "EXT2"
 | 
			
		||||
	depends on !SAMD21_XPLAINED_OLED1MODULE_EXT2 && !SAMD21_XPLAINED_IOMODULE_EXT2
 | 
			
		||||
	---help---
 | 
			
		||||
		Select this option if the serial console is on SERCOM4 connected via
 | 
			
		||||
		EXT2.  The RX will be on PB13 and TX signal will be on PB12.
 | 
			
		||||
 | 
			
		||||
config SAMD21_XPLAINED_USART4_EXT3
 | 
			
		||||
	bool "EXT3"
 | 
			
		||||
	---help---
 | 
			
		||||
		Select this option if the serial console is on SERCOM4 connect via
 | 
			
		||||
		EXT3.  The RX will be on PB11 and TX signal will be on PB10.
 | 
			
		||||
 | 
			
		||||
endchoice
 | 
			
		||||
endif
 | 
			
		||||
endif
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,744 @@
 | 
			
		|||
README
 | 
			
		||||
======
 | 
			
		||||
 | 
			
		||||
This README discusses issues unique to NuttX configurations for the
 | 
			
		||||
Atmel SAMD21 Xplained Pro development board.  This board features the
 | 
			
		||||
ATSAMD21J18A MCU.
 | 
			
		||||
 | 
			
		||||
The SAMD21 Xplained Pro Starter Kit may be bundled with three modules:
 | 
			
		||||
 | 
			
		||||
1) I/O1   - An MMC/SD card slot, PWM LED control, ADC light sensor, USART
 | 
			
		||||
            loopback, TWI AT30TSE758 Temperature sensor.
 | 
			
		||||
2) OLED1  - An OLED plus 3 additional switches and 3 additional LEDs
 | 
			
		||||
3) PROTO1 - A prototyping board with logic on board (other than power-related
 | 
			
		||||
            logic).
 | 
			
		||||
 | 
			
		||||
Contents
 | 
			
		||||
========
 | 
			
		||||
 | 
			
		||||
  - STATUS/ISSUES
 | 
			
		||||
  - Modules
 | 
			
		||||
  - LEDs
 | 
			
		||||
  - Serial Consoles
 | 
			
		||||
  - Atmel Studio 6.1
 | 
			
		||||
  - SAMD21 Xplained Pro-specific Configuration Options
 | 
			
		||||
  - Configurations
 | 
			
		||||
 | 
			
		||||
STATUS/ISSUES
 | 
			
		||||
=============
 | 
			
		||||
 | 
			
		||||
    1. See boards/arm/samd2l2/samd20-xplained/README.txt.
 | 
			
		||||
       This port derives from the SAMD20 Xplained board board and all issues
 | 
			
		||||
       there should apply.
 | 
			
		||||
 | 
			
		||||
    2. 2015-07-06:  The basic NSH configuration is working properly, but
 | 
			
		||||
       not at 115200 baud which is the default BAUD selection in the
 | 
			
		||||
       configurations.  It is necessary to drop the BAUD in the
 | 
			
		||||
       configuration.
 | 
			
		||||
 | 
			
		||||
       I suspect that this is an issue on my board and due to running the
 | 
			
		||||
       system on uncalibrated OSC8M.  My bet is that the issue would not
 | 
			
		||||
       exist on many boards or if OSC8M were calibrated or if a more precise
 | 
			
		||||
       clock source were used (like XOSC32K).
 | 
			
		||||
 | 
			
		||||
       ... After more experimentation, I am not sure this conclusion is
 | 
			
		||||
       correct or not.  Perhaps the board just comes up with a bad clocking
 | 
			
		||||
       configuration at times????
 | 
			
		||||
 | 
			
		||||
Modules
 | 
			
		||||
=======
 | 
			
		||||
 | 
			
		||||
  There are several I/O modules available that will work with the SAMD21
 | 
			
		||||
  Xplained Pro Starter Kit:
 | 
			
		||||
 | 
			
		||||
  1) I/O1   - An MMC/SD card slot, PWM LED control, ADC light sensor, USART
 | 
			
		||||
             loopback, TWI AT30TSE758 Temperature sensor.
 | 
			
		||||
  2) OLED1  - An OLED plus 3 additional switches and 3 additional LEDs
 | 
			
		||||
  3) PROTO1 - A prototyping board with logic on board (other than power-
 | 
			
		||||
              related logic).
 | 
			
		||||
  4) And others.  See http://www.atmel.com/products/microcontrollers/avr/xplained.aspx
 | 
			
		||||
 | 
			
		||||
  Some of these are discussed further below.
 | 
			
		||||
 | 
			
		||||
  I/O1
 | 
			
		||||
  ----
 | 
			
		||||
    The primary function of this module is to provide SD card support, but
 | 
			
		||||
    the full list of modules features include:
 | 
			
		||||
 | 
			
		||||
    - microSD card connector (SPI interface)
 | 
			
		||||
    - PWM (LED control)
 | 
			
		||||
    - ADC (light sensor)
 | 
			
		||||
    - USART loopback
 | 
			
		||||
    - TWI AT30TSE758 Temperature sensor with EEPROM
 | 
			
		||||
 | 
			
		||||
    SPI is available on two of the SAMD21 Xplained connectors, EXT1 and EXT2.
 | 
			
		||||
    They mate with the I/O1 connector as indicated in this table.
 | 
			
		||||
 | 
			
		||||
    I/O1 CONNECTOR
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    I/O1              EXT1                   EXT2                   Other use of either pin
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    1  ID             1                      1                      Communication line to ID chip on
 | 
			
		||||
                                                                    extension board.
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    2  GND            2       GND            2  GND
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    3  LIGHT_SENSOR   3  PB00 AIN[8]         3  PA10 AIN[18]
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    4  LP_OUT         4  PB01 AIN[9]         4  PA11 AIN[19]
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    5  GPIO1          5  PB06 GPIO           5  PA20 GPIO
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    6  GPIO2          6  PB07 GPIO           6  PA21 GPIO
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    7  LED            7  PB02 TC6/WO[0]      7  PB12 TC4/WO[0]
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    8  LP_IN          8  PB03 TC6/WO[1]      8  PB13 TC4/WO[1]
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    9  TEMP_ALERT     9  PB04 EXTINT[4]      9  PB14 EXTINT[14]
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    10 microSD_DETECT 10 PB05 GPIO           10 PB15 GPIO
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    11 TWI SDA        11 PA08 SERCOM2 PAD[0] 11 PA08 SERCOM2 PAD[0] EXT1, EXT2, EXT3 and EDBG
 | 
			
		||||
                              I²C SDA                I²C SDA
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    12 TWI SCL        12 PA09 SERCOM2 PAD[1] 12 PA09 SERCOM2 PAD[1] EXT2, EXT3 and EDBG
 | 
			
		||||
                              I²C SCL                I²C SCL
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    13 USART RX       13 PB09 SERCOM4 PAD[1] 13 PB11 SERCOM4 PAD[1] EXT3
 | 
			
		||||
                              USART RX               USART RX
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    14 USART TX       14 PB08 SERCOM4 PAD[0] 14 PB10 SERCOM4 PAD[0] EXT3
 | 
			
		||||
                              USART TX               USART TX
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    15 microSD_SS     15 PA05 SERCOM0 PAD[1] 15 PA17 SERCOM1 PAD[1]
 | 
			
		||||
                              SPI SS                 SPI SS
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    16 SPI_MOSI       16 PA06 SERCOM0 PAD[2] 16 PA18 SERCOM1 PAD[2]
 | 
			
		||||
                              SPI MOSI               SPI MOSI
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    17 SPI_MISO       17 PA04 SERCOM0 PAD[0] 17 PA16 SERCOM1 PAD[0]
 | 
			
		||||
                              SPI MISO               SPI MISO
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    18 SPI_SCK        18 PA07 SERCOM0 PAD[3] 18 PA19 SERCOM1 PAD[3]
 | 
			
		||||
                              SPI SCK                SPI SCK
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    19 GND            19      GND               GND
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    20 VCC            20      VCC               VCC
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
 | 
			
		||||
    The mapping between the I/O1 pins and the SD connector are shown in the
 | 
			
		||||
    following table.
 | 
			
		||||
 | 
			
		||||
    SD Card Connection
 | 
			
		||||
    ------------------
 | 
			
		||||
    I/O1 SD   PIN Description
 | 
			
		||||
    ---- ---- --- -------------------------------------------------
 | 
			
		||||
         D2   1   Data line 2 (not used)
 | 
			
		||||
    15   D3   2   Data line 3. Active low chip select, pulled high
 | 
			
		||||
    16   CMD  3   Command line, connected to SPI_MOSI.
 | 
			
		||||
    20   VDD  4
 | 
			
		||||
    18   CLK  5   Clock line, connected to SPI_SCK.
 | 
			
		||||
    2/19 GND  6
 | 
			
		||||
    17   D0   7   Data line 0, connected to SPI_MISO.
 | 
			
		||||
         D1   8   Data line 1 (not used)
 | 
			
		||||
    10   SW_A 9   Card detect
 | 
			
		||||
    2/19 SW_B 10  GND
 | 
			
		||||
 | 
			
		||||
    Card Detect
 | 
			
		||||
    -----------
 | 
			
		||||
    When a microSD card is put into the connector SW_A and SW_B are short-
 | 
			
		||||
    circuited. SW_A is connected to the microSD_DETECT signal. To use this
 | 
			
		||||
    as a card indicator remember to enable internal pullup in the target
 | 
			
		||||
    device.
 | 
			
		||||
 | 
			
		||||
    GPIOs
 | 
			
		||||
    -----
 | 
			
		||||
    So all that is required to connect the SD is configure the SPI
 | 
			
		||||
 | 
			
		||||
    --- ------------------ ---------------------- -------------------------------------
 | 
			
		||||
    PIN EXT1               EXT2                   Description
 | 
			
		||||
    --- ------------------ ---------------------- -------------------------------------
 | 
			
		||||
    15 PA05 SERCOM0 PAD[1] 15 PA17 SERCOM1 PAD[1]  Active low chip select OUTPUT, pulled
 | 
			
		||||
            SPI SS                 SPI SS          high on board.
 | 
			
		||||
    --- ------------------ ---------------------- -------------------------------------
 | 
			
		||||
    10 PB05 GPIO           10 PB15 GPIO            Active low card detect INPUT, must
 | 
			
		||||
                                                   use internal pull-up.
 | 
			
		||||
    --- ------------------ ---------------------- -------------------------------------
 | 
			
		||||
 | 
			
		||||
    Configuration Options:
 | 
			
		||||
    ----------------------
 | 
			
		||||
      CONFIG_SAMD21_XPLAINED_IOMODULE=y      : Informs the system that the
 | 
			
		||||
                                              I/O1 module is installed
 | 
			
		||||
      CONFIG_SAMD21_XPLAINED_IOMODULE_EXT1=y : The module is installed in EXT1
 | 
			
		||||
      CONFIG_SAMD21_XPLAINED_IOMODULE_EXT2=y : The mdoule is installed in EXT2
 | 
			
		||||
 | 
			
		||||
    See the set-up in the discussion of the nsh configuration below for other
 | 
			
		||||
    required configuration options.
 | 
			
		||||
 | 
			
		||||
    NOTE: As of this writing, only the SD card slot is supported in the I/O1
 | 
			
		||||
    module.
 | 
			
		||||
 | 
			
		||||
  OLED1
 | 
			
		||||
  -----
 | 
			
		||||
    This module provides an OLED plus 3 additional switches and 3 additional
 | 
			
		||||
    LEDs.
 | 
			
		||||
 | 
			
		||||
    OLED1 CONNECTOR
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    OLED1             EXT1                   EXT2                   Other use of either pin
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    1  ID             1                      1                      Communication line to ID chip on
 | 
			
		||||
                                                                    extension board.
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    2  GND            2       GND            2  GND
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    3  BUTTON2        3  PB00 AIN[8]         3  PA10 AIN[18]
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    4  BUTTON3        4  PB01 AIN[9]         4  PA11 AIN[19]
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    5  DATA_CMD_SEL   5  PB06 GPIO           5  PA20 GPIO
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    6  LED3           6  PB07 GPIO           6  PA21 GPIO
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    7  LED1           7  PB02 TC6/WO[0]      7  PB12 TC4/WO[0]
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    8  LED2           8  PB03 TC6/WO[1]      8  PB13 TC4/WO[1]
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    9  BUTTON1        9  PB04 EXTINT[4]      9  PB14 EXTINT[14]
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    10 DISPLAY_RESET  10 PB05 GPIO           10 PB15 GPIO
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    11 N/C            11 PA08 SERCOM2 PAD[0] 11 PA08 SERCOM2 PAD[0] EXT1, EXT2, EXT3 and EDBG
 | 
			
		||||
                              I²C SDA                I²C SDA
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    12 N/C            12 PA09 SERCOM2 PAD[1] 12 PA09 SERCOM2 PAD[1] EXT2, EXT3 and EDBG
 | 
			
		||||
                              I²C SCL                I²C SCL
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    13 N/C            13 PB09 SERCOM4 PAD[1] 13 PB11 SERCOM4 PAD[1] EXT3
 | 
			
		||||
                              USART RX               USART RX
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    14 N/C            14 PB08 SERCOM4 PAD[0] 14 PB10 SERCOM4 PAD[0] EXT3
 | 
			
		||||
                              USART TX               USART TX
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    15 DISPLAY_SS     15 PA05 SERCOM0 PAD[1] 15 PA17 SERCOM1 PAD[1]
 | 
			
		||||
                              SPI SS                 SPI SS
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    16 SPI_MOSI       16 PA06 SERCOM0 PAD[2] 16 PA18 SERCOM1 PAD[2]
 | 
			
		||||
                              SPI MOSI               SPI MOSI
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    17 N/C            17 PA04 SERCOM0 PAD[0] 17 PA16 SERCOM1 PAD[0]
 | 
			
		||||
                              SPI MISO               SPI MISO
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    18 SPI_SCK        18 PA07 SERCOM0 PAD[3] 18 PA19 SERCOM1 PAD[3]
 | 
			
		||||
                              SPI SCK                SPI SCK
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    19 GND            19      GND               GND
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    20 VCC            20      VCC               VCC
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
 | 
			
		||||
    Configuration Options:
 | 
			
		||||
    ----------------------
 | 
			
		||||
      CONFIG_SAMD21_XPLAINED_OLED1MODULE=y      : Informs the system that the
 | 
			
		||||
                                                 I/O1 module is installed
 | 
			
		||||
      CONFIG_SAMD21_XPLAINED_OLED1MODULE_EXT1=y : The module is installed in EXT1
 | 
			
		||||
      CONFIG_SAMD21_XPLAINED_OLED1MODULE_EXT2=y : The mdoule is installed in EXT2
 | 
			
		||||
 | 
			
		||||
    See the set-up in the discussion of the nsh configuration below for other
 | 
			
		||||
    required configuration options.
 | 
			
		||||
 | 
			
		||||
  PROTO1
 | 
			
		||||
  ------
 | 
			
		||||
  A prototyping board with logic on board (other than power-related logic).
 | 
			
		||||
  There is no built-in support for the PROTO1 module.
 | 
			
		||||
 | 
			
		||||
LEDs
 | 
			
		||||
====
 | 
			
		||||
 | 
			
		||||
  There is one yellow LED available on the SAM D20 Xplained Pro board that
 | 
			
		||||
  can be turned on and off. The LED can be activated by driving the connected
 | 
			
		||||
  PB30 I/O line to GND.
 | 
			
		||||
 | 
			
		||||
  When CONFIG_ARCH_LEDS is defined in the NuttX configuration, NuttX will
 | 
			
		||||
  control the LED as follows:
 | 
			
		||||
 | 
			
		||||
    SYMBOL              Meaning                 LED0
 | 
			
		||||
    ------------------- ----------------------- ------
 | 
			
		||||
    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 is LED is statically on, NuttX has successfully  booted and is,
 | 
			
		||||
  apparently, running normally.  If LED is flashing at approximately
 | 
			
		||||
  2Hz, then a fatal error has been detected and the system has halted.
 | 
			
		||||
 | 
			
		||||
Serial Consoles
 | 
			
		||||
===============
 | 
			
		||||
 | 
			
		||||
  SERCOM4
 | 
			
		||||
  ------
 | 
			
		||||
 | 
			
		||||
  SERCOM4 is available on connectors EXT1, EXT2, and EXT3, but using
 | 
			
		||||
  different PORT pins:
 | 
			
		||||
 | 
			
		||||
    PIN   EXT1 EXT2 EXT3 GPIO Function
 | 
			
		||||
    ----  ---- ---- ---- ------------------
 | 
			
		||||
     13   PB09 PB10 PB10 SERCOM4 / USART RX
 | 
			
		||||
     14   PB08 PB11 PB11 SERCOM4 / USART TX
 | 
			
		||||
     19   GND  GND  GND  N/A
 | 
			
		||||
     20   VCC  VCC  VCC  N/A
 | 
			
		||||
 | 
			
		||||
  There are options available in the NuttX configuration to select which
 | 
			
		||||
  connector SERCOM4 is on:  SAMD21_XPLAINED_USART4_EXTn, where n=1, 2, or 3.
 | 
			
		||||
 | 
			
		||||
  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 these
 | 
			
		||||
  configurations.  An option is to use the virtual COM port.
 | 
			
		||||
 | 
			
		||||
  Virtual COM Port
 | 
			
		||||
  ----------------
 | 
			
		||||
 | 
			
		||||
  The SAMD21 Xplained Pro contains an Embedded Debugger (EDBG) that can be
 | 
			
		||||
  used to program and debug the ATSAMD21J18A using Serial Wire Debug (SWD).
 | 
			
		||||
  The Embedded debugger also include a Virtual COM port interface over
 | 
			
		||||
  SERCOM3.  Virtual COM port connections:
 | 
			
		||||
 | 
			
		||||
    PA22 SERCOM3 / USART TXD
 | 
			
		||||
    PA23 SERCOM3 / USART RXD
 | 
			
		||||
 | 
			
		||||
Atmel Studio 6.1
 | 
			
		||||
================
 | 
			
		||||
 | 
			
		||||
  Loading Code into FLASH:
 | 
			
		||||
  -----------------------
 | 
			
		||||
 | 
			
		||||
  Tools menus:  Tools -> Device Programming.
 | 
			
		||||
 | 
			
		||||
  Debugging the NuttX Object File
 | 
			
		||||
  -------------------------------
 | 
			
		||||
 | 
			
		||||
  1) Rename object file from nutt to nuttx.elf.  That is an extension that
 | 
			
		||||
     will be recognized by the file menu.
 | 
			
		||||
 | 
			
		||||
  2) File menu: File -> Open -> Open object file for debugging
 | 
			
		||||
 | 
			
		||||
     - Select nuttx.elf object file
 | 
			
		||||
     - Select AT91SAMD21J18
 | 
			
		||||
     - Select files for symbols as desired
 | 
			
		||||
     - Select debugger
 | 
			
		||||
 | 
			
		||||
  3) Debug menu: Debug -> Start debugging and break
 | 
			
		||||
 | 
			
		||||
     - This will reload the nuttx.elf file into FLASH
 | 
			
		||||
 | 
			
		||||
SAMD21 Xplained Pro-specific Configuration Options
 | 
			
		||||
==================================================
 | 
			
		||||
 | 
			
		||||
    CONFIG_ARCH - Identifies the arch/ subdirectory.  This should
 | 
			
		||||
       be set to:
 | 
			
		||||
 | 
			
		||||
       CONFIG_ARCH=arm
 | 
			
		||||
 | 
			
		||||
    CONFIG_ARCH_family - For use in C code:
 | 
			
		||||
 | 
			
		||||
       CONFIG_ARCH_ARM=y
 | 
			
		||||
 | 
			
		||||
    CONFIG_ARCH_architecture - For use in C code:
 | 
			
		||||
 | 
			
		||||
       CONFIG_ARCH_CORTEXM0=y
 | 
			
		||||
 | 
			
		||||
    CONFIG_ARCH_CHIP - Identifies the arch/*/chip subdirectory
 | 
			
		||||
 | 
			
		||||
       CONFIG_ARCH_CHIP="samd2l2"
 | 
			
		||||
 | 
			
		||||
    CONFIG_ARCH_CHIP_name - For use in C code to identify the exact
 | 
			
		||||
       chip:
 | 
			
		||||
 | 
			
		||||
       CONFIG_ARCH_CHIP_SAMD2X
 | 
			
		||||
       CONFIG_ARCH_CHIP_SAMD21
 | 
			
		||||
       CONFIG_ARCH_CHIP_ATSAMD21J18
 | 
			
		||||
 | 
			
		||||
    CONFIG_ARCH_BOARD - Identifies the boards/ subdirectory and
 | 
			
		||||
       hence, the board that supports the particular chip or SoC.
 | 
			
		||||
 | 
			
		||||
       CONFIG_ARCH_BOARD=samd21-xplained (for the SAMD21 Xplained Pro development board)
 | 
			
		||||
 | 
			
		||||
    CONFIG_ARCH_BOARD_name - For use in C code
 | 
			
		||||
 | 
			
		||||
       CONFIG_ARCH_BOARD_SAMD21_XPLAINED=y
 | 
			
		||||
 | 
			
		||||
    CONFIG_ARCH_LOOPSPERMSEC - Must be calibrated for correct operation
 | 
			
		||||
       of delay loops
 | 
			
		||||
 | 
			
		||||
    CONFIG_ENDIAN_BIG - define if big endian (default is little
 | 
			
		||||
       endian)
 | 
			
		||||
 | 
			
		||||
    CONFIG_RAM_SIZE - Describes the installed DRAM (SRAM in this case):
 | 
			
		||||
 | 
			
		||||
       CONFIG_RAM_SIZE=0x00010000 (64KB)
 | 
			
		||||
 | 
			
		||||
    CONFIG_RAM_START - The start address of installed DRAM
 | 
			
		||||
 | 
			
		||||
       CONFIG_RAM_START=0x20000000
 | 
			
		||||
 | 
			
		||||
    CONFIG_ARCH_LEDS - Use LEDs to show state. Unique to boards that
 | 
			
		||||
       have LEDs
 | 
			
		||||
 | 
			
		||||
    CONFIG_ARCH_INTERRUPTSTACK - This architecture supports an interrupt
 | 
			
		||||
       stack. If defined, this symbol is the size of the interrupt
 | 
			
		||||
        stack in bytes.  If not defined, the user task stacks will be
 | 
			
		||||
      used during interrupt handling.
 | 
			
		||||
 | 
			
		||||
    CONFIG_ARCH_STACKDUMP - Do stack dumps after assertions
 | 
			
		||||
 | 
			
		||||
    CONFIG_ARCH_LEDS -  Use LEDs to show state. Unique to board architecture.
 | 
			
		||||
 | 
			
		||||
  Individual subsystems can be enabled:
 | 
			
		||||
 | 
			
		||||
    CONFIG_SAMD2L2_AC      - Analog Comparator
 | 
			
		||||
    CONFIG_SAMD2L2_ADC     - Analog-to-Digital Converter
 | 
			
		||||
    CONFIG_SAMD2L2_DAC     - Digital-to-Analog Converter
 | 
			
		||||
    CONFIG_SAMD2L2_DMAC    - Analog Comparator
 | 
			
		||||
    CONFIG_SAMD2L2_EVSYS   - Event System
 | 
			
		||||
    CONFIG_SAMD2L2_NVMCTRL - Non-Volatile Memory Controller
 | 
			
		||||
    CONFIG_SAMD2L2_PTC     - Peripheral Touch Controller
 | 
			
		||||
    CONFIG_SAMD2L2_RTC     - Real Time Counter
 | 
			
		||||
    CONFIG_SAMD2L2_SERCOM0 - Serial Communication Interface 0
 | 
			
		||||
    CONFIG_SAMD2L2_SERCOM1 - Serial Communication Interface 1
 | 
			
		||||
    CONFIG_SAMD2L2_SERCOM2 - Serial Communication Interface 2
 | 
			
		||||
    CONFIG_SAMD2L2_SERCOM3 - Serial Communication Interface 3
 | 
			
		||||
    CONFIG_SAMD2L2_SERCOM4 - Serial Communication Interface 4
 | 
			
		||||
    CONFIG_SAMD2L2_SERCOM5 - Serial Communication Interface 5
 | 
			
		||||
    CONFIG_SAMD2L2_TCC0    - Timer/Counter 0 for Control
 | 
			
		||||
    CONFIG_SAMD2L2_TCC1    - Timer/Counter 1 for Control
 | 
			
		||||
    CONFIG_SAMD2L2_TCC2    - Timer/Counter 2 for Control
 | 
			
		||||
    CONFIG_SAMD2L2_TC3     - Timer/Counter 3
 | 
			
		||||
    CONFIG_SAMD2L2_TC4     - Timer/Counter 4
 | 
			
		||||
    CONFIG_SAMD2L2_TC5     - Timer/Counter 5
 | 
			
		||||
    CONFIG_SAMD2L2_TC6     - Timer/Counter 6
 | 
			
		||||
    CONFIG_SAMD2L2_TC7     - Timer/Counter 6
 | 
			
		||||
    CONFIG_SAMD2L2_USB     - USB device or host
 | 
			
		||||
    CONFIG_SAMD2L2_WDT     - Watchdog Timer
 | 
			
		||||
 | 
			
		||||
  Some subsystems can be configured to operate in different ways. The drivers
 | 
			
		||||
  need to know how to configure the subsystem.
 | 
			
		||||
 | 
			
		||||
    CONFIG_SAMD2L2_SERCOM0_ISI2C, CONFIG_SAMD2L2_SERCOM0_ISSPI, or CONFIG_SAMD2L2_SERCOM0_ISUSART
 | 
			
		||||
    CONFIG_SAMD2L2_SERCOM1_ISI2C, CONFIG_SAMD2L2_SERCOM1_ISSPI, or CONFIG_SAMD2L2_SERCOM1_ISUSART
 | 
			
		||||
    CONFIG_SAMD2L2_SERCOM2_ISI2C, CONFIG_SAMD2L2_SERCOM2_ISSPI, or CONFIG_SAMD2L2_SERCOM2_ISUSART
 | 
			
		||||
    CONFIG_SAMD2L2_SERCOM3_ISI2C, CONFIG_SAMD2L2_SERCOM3_ISSPI, or CONFIG_SAMD2L2_SERCOM3_ISUSART
 | 
			
		||||
    CONFIG_SAMD2L2_SERCOM4_ISI2C, CONFIG_SAMD2L2_SERCOM4_ISSPI, or CONFIG_SAMD2L2_SERCOM4_ISUSART
 | 
			
		||||
    CONFIG_SAMD2L2_SERCOM5_ISI2C, CONFIG_SAMD2L2_SERCOM5_ISSPI, or CONFIG_SAMD2L2_SERCOM5_ISUSART
 | 
			
		||||
 | 
			
		||||
  SAMD21 specific device driver settings
 | 
			
		||||
 | 
			
		||||
    CONFIG_USARTn_SERIAL_CONSOLE - selects the USARTn (n=0,1,2,..5) for the
 | 
			
		||||
      console and ttys0 (default is the USART4).
 | 
			
		||||
    CONFIG_USARTn_RXBUFSIZE - Characters are buffered as received.
 | 
			
		||||
       This specific the size of the receive buffer
 | 
			
		||||
    CONFIG_USARTn_TXBUFSIZE - Characters are buffered before
 | 
			
		||||
       being sent.  This specific the size of the transmit buffer
 | 
			
		||||
    CONFIG_USARTn_BAUD - The configure BAUD of the USART.  Must be
 | 
			
		||||
    CONFIG_USARTn_BITS - The number of bits.  Must be either 7 or 8.
 | 
			
		||||
    CONFIG_USARTn_PARTIY - 0=no parity, 1=odd parity, 2=even parity
 | 
			
		||||
    CONFIG_USARTn_2STOP - Two stop bits
 | 
			
		||||
 | 
			
		||||
Configurations
 | 
			
		||||
==============
 | 
			
		||||
 | 
			
		||||
  Each SAMD21 Xplained Pro configuration is maintained in a sub-directory and
 | 
			
		||||
  can be selected as follow:
 | 
			
		||||
 | 
			
		||||
    tools/configure.sh samd21-xplained:<subdir>
 | 
			
		||||
 | 
			
		||||
  Before building, make sure the PATH environment variable include the
 | 
			
		||||
  correct path to the directory than holds your toolchain binaries.
 | 
			
		||||
 | 
			
		||||
  And then build NuttX by simply typing the following.  At the conclusion of
 | 
			
		||||
  the make, the nuttx binary will reside in an ELF file called, simply, nuttx.
 | 
			
		||||
 | 
			
		||||
    make
 | 
			
		||||
 | 
			
		||||
  The <subdir> that is provided above as an argument to the tools/configure.sh
 | 
			
		||||
  must be is one of the following.
 | 
			
		||||
 | 
			
		||||
  NOTE:  These configurations use the mconf-based configuration tool.  To
 | 
			
		||||
  change any of these configurations using that tool, you should:
 | 
			
		||||
 | 
			
		||||
    a. Build and install the kconfig-mconf tool.  See nuttx/README.txt
 | 
			
		||||
       see additional README.txt files in the NuttX tools repository.
 | 
			
		||||
 | 
			
		||||
    b. Execute 'make menuconfig' in nuttx/ in order to start the
 | 
			
		||||
       reconfiguration process.
 | 
			
		||||
 | 
			
		||||
  NOTES:
 | 
			
		||||
 | 
			
		||||
  1. These configurations use the mconf-based configuration tool.  To
 | 
			
		||||
    change any of these configurations using that tool, you should:
 | 
			
		||||
 | 
			
		||||
    a. Build and install the kconfig-mconf tool.  See nuttx/README.txt
 | 
			
		||||
       see additional README.txt files in the NuttX tools repository.
 | 
			
		||||
 | 
			
		||||
    b. Execute 'make menuconfig' in nuttx/ in order to start the
 | 
			
		||||
       reconfiguration process.
 | 
			
		||||
 | 
			
		||||
  2. Unless stated otherwise, all configurations generate console
 | 
			
		||||
     output of on SERCOM4 which is available on EXT1, EXT2, or EXT3 (see
 | 
			
		||||
     the section "Serial Consoles" above).  The virtual COM port could
 | 
			
		||||
     be used, instead, by reconfiguring to use SERCOM3 instead of
 | 
			
		||||
     SERCOM4:
 | 
			
		||||
 | 
			
		||||
       System Type -> SAMD/L Peripheral Support
 | 
			
		||||
         CONFIG_SAMD2L2_SERCOM3=y  : Enable one or both
 | 
			
		||||
         CONFIG_SAMD2L2_SERCOM4=n
 | 
			
		||||
 | 
			
		||||
       Device Drivers -> Serial Driver Support -> Serial Console
 | 
			
		||||
         CONFIG_USART4_SERIAL_CONSOLE=y  : Select only one for the console
 | 
			
		||||
         CONFIG_USART4_SERIAL_CONSOLE=n
 | 
			
		||||
 | 
			
		||||
       Device Drivers -> Serial Driver Support -> SERCOM3 Configuration
 | 
			
		||||
         CONFIG_USART3_2STOP=0
 | 
			
		||||
         CONFIG_USART3_BAUD=115200
 | 
			
		||||
         CONFIG_USART3_BITS=8
 | 
			
		||||
         CONFIG_USART3_PARITY=0
 | 
			
		||||
         CONFIG_USART3_RXBUFSIZE=256
 | 
			
		||||
         CONFIG_USART3_TXBUFSIZE=256
 | 
			
		||||
 | 
			
		||||
       Device Drivers -> Serial Driver Support -> SERCOM4 Configuration
 | 
			
		||||
         CONFIG_USART4_2STOP=0
 | 
			
		||||
         CONFIG_USART4_BAUD=115200
 | 
			
		||||
         CONFIG_USART4_BITS=8
 | 
			
		||||
         CONFIG_USART4_PARITY=0
 | 
			
		||||
         CONFIG_USART4_RXBUFSIZE=256
 | 
			
		||||
         CONFIG_USART4_TXBUFSIZE=256
 | 
			
		||||
 | 
			
		||||
       Board Selection -> USART4 Connection
 | 
			
		||||
         CONFIG_SAMD21_XPLAINED_USART4_EXT1=n : Pick on if USART4 used
 | 
			
		||||
         CONFIG_SAMD21_XPLAINED_USART4_EXT2=n
 | 
			
		||||
         CONFIG_SAMD21_XPLAINED_USART4_EXT3=y
 | 
			
		||||
 | 
			
		||||
  3. Unless otherwise stated, the configurations are setup for
 | 
			
		||||
     Cygwin under Windows:
 | 
			
		||||
 | 
			
		||||
     Build Setup:
 | 
			
		||||
       CONFIG_HOST_WINDOWS=y   : Windows Host
 | 
			
		||||
       CONFIG_WINDOWS_CYGWIN=y : Cygwin environment on windows
 | 
			
		||||
 | 
			
		||||
  4. These configurations use the ARM EABI toolchain.  But
 | 
			
		||||
     that is easily reconfigured:
 | 
			
		||||
 | 
			
		||||
     System Type -> Toolchain:
 | 
			
		||||
       CONFIG_ARMV6M_TOOLCHAIN_GNU_EABIW=y
 | 
			
		||||
 | 
			
		||||
     Any re-configuration should be done before making NuttX or else the
 | 
			
		||||
     subsequent 'make' will fail.  If you have already attempted building
 | 
			
		||||
     NuttX then you will have to 1) 'make distclean' to remove the old
 | 
			
		||||
     configuration, 2) 'tools/configure.sh sam3u-ek/ksnh' to start
 | 
			
		||||
     with a fresh configuration, and 3) perform the configuration changes
 | 
			
		||||
     above.
 | 
			
		||||
 | 
			
		||||
     Also, make sure that your PATH variable has the new path to your
 | 
			
		||||
     Atmel tools.  Try 'which arm-none-eabi-gcc' to make sure that you
 | 
			
		||||
     are selecting the right tool.
 | 
			
		||||
 | 
			
		||||
     See also the "NOTE about Windows native toolchains" in the section
 | 
			
		||||
     called "GNU Toolchain Options" above.
 | 
			
		||||
 | 
			
		||||
Configuration sub-directories
 | 
			
		||||
-----------------------------
 | 
			
		||||
 | 
			
		||||
  nsh:
 | 
			
		||||
    This configuration directory will built the NuttShell.  See NOTES above
 | 
			
		||||
    and below:
 | 
			
		||||
 | 
			
		||||
    NOTES:
 | 
			
		||||
 | 
			
		||||
    1. This configuration is set up to build on Windows using the Cygwin
 | 
			
		||||
       environment using the ARM EABI toolchain.  This can be easily
 | 
			
		||||
       changed as described above under "Configurations."
 | 
			
		||||
 | 
			
		||||
    2. By default, this configuration provides a serial console on SERCOM4
 | 
			
		||||
       at 115200 8N1 via EXT3:
 | 
			
		||||
 | 
			
		||||
       PIN   EXT3 GPIO Function
 | 
			
		||||
       ----  ---- ------------------
 | 
			
		||||
        13   PB11 SERCOM4 / USART RX
 | 
			
		||||
        14   PB10 SERCOM4 / USART TX
 | 
			
		||||
        19   GND  N/A
 | 
			
		||||
        20   VCC  N/A
 | 
			
		||||
 | 
			
		||||
       If you would prefer to use the EDBG serial COM port or would prefer
 | 
			
		||||
       to use SERCOM4 on EXT1 or EXT2, you will need to reconfigure the
 | 
			
		||||
       SERCOM as described under "Configurations".  See also the section
 | 
			
		||||
       entitled "Serial Consoles" above.
 | 
			
		||||
 | 
			
		||||
    3. NOTE: If you get a compilation error like:
 | 
			
		||||
 | 
			
		||||
         libxx_new.cxx:74:40: error: 'operator new' takes type 'size_t'
 | 
			
		||||
                              ('unsigned int') as first parameter [-fper
 | 
			
		||||
 | 
			
		||||
       Sometimes NuttX and your toolchain will disagree on the underlying
 | 
			
		||||
       type of size_t; sometimes it is an 'unsigned int' and sometimes it is
 | 
			
		||||
       an 'unsigned long int'.  If this error occurs, then you may need to
 | 
			
		||||
       toggle the value of CONFIG_ARCH_SIZET_LONG.
 | 
			
		||||
 | 
			
		||||
    4. If the I/O1 module is connected to the SAMD21 Xplained Pro, then
 | 
			
		||||
       support for the SD card slot can be enabled by making the following
 | 
			
		||||
       changes to the configuration.  These changes assume that the I/O1
 | 
			
		||||
       modules is connected in EXT1.  Most of the modifications necessary
 | 
			
		||||
       to work with the I/O1 in a different connector are obvious.. except
 | 
			
		||||
       for the selection of SERCOM SPI support:
 | 
			
		||||
 | 
			
		||||
         EXT1: SPI is provided through SERCOM0
 | 
			
		||||
         EXT2: SPI is provided through SERCOM1
 | 
			
		||||
         EXT3: SPI is provided through SERCOM5
 | 
			
		||||
 | 
			
		||||
       File Systems:
 | 
			
		||||
         CONFIG_FS_FAT=y                   : Enable the FAT file system
 | 
			
		||||
         CONFIG_FAT_LCNAMES=y              : Enable upper/lower case 8.3 file names (Optional, see below)
 | 
			
		||||
         CONFIG_FAT_LFN=y                  : Enable long file named (Optional, see below)
 | 
			
		||||
         CONFIG_FAT_MAXFNAME=32            : Maximum supported file name length
 | 
			
		||||
 | 
			
		||||
         There are issues related to patents that Microsoft holds on FAT long
 | 
			
		||||
         file name technologies.  See the top level NOTICE file for further
 | 
			
		||||
         details.
 | 
			
		||||
 | 
			
		||||
       System Type -> Peripherals:
 | 
			
		||||
         CONFIG_SAMD2L2_SERCOM0=y          : Use SERCOM0 if the I/O is in EXT1
 | 
			
		||||
         CONFIG_SAMD2L2_SERCOM0_ISSPI=y    : Configure SERCOM0 as an SPI master
 | 
			
		||||
 | 
			
		||||
       Device Drivers
 | 
			
		||||
         CONFIG_SPI=y                      : Enable SPI support
 | 
			
		||||
         CONFIG_SPI_EXCHANGE=y             : The exchange() method is supported
 | 
			
		||||
 | 
			
		||||
         CONFIG_MMCSD=y                    : Enable MMC/SD support
 | 
			
		||||
         CONFIG_MMCSD_NSLOTS=1             : Only one MMC/SD card slot
 | 
			
		||||
         CONFIG_MMCSD_MULTIBLOCK_DISABLE=n : Should not need to disable multi-block transfers
 | 
			
		||||
         CONFIG_MMCSD_MMCSUPPORT=n         : May interfere with some SD cards
 | 
			
		||||
         CONFIG_MMCSD_HAVE_CARDDETECT=y     : I/O1 module as a card detect GPIO
 | 
			
		||||
         CONFIG_MMCSD_SPI=y                : Use the SPI interface to the MMC/SD card
 | 
			
		||||
         CONFIG_MMCSD_SPICLOCK=20000000    : This is a guess for the optimal MMC/SD frequency
 | 
			
		||||
         CONFIG_MMCSD_SPIMODE=0            : Mode 0 is required
 | 
			
		||||
 | 
			
		||||
       Board Selection -> Common Board Options
 | 
			
		||||
         CONFIG_NSH_MMCSDSLOTNO=0          : Only one MMC/SD slot, slot 0
 | 
			
		||||
         CONFIG_NSH_MMCSDSPIPORTNO=0       : Use port=0 -> SERCOM0 if the I/O1 is in EXT1
 | 
			
		||||
 | 
			
		||||
       Board Selection -> SAMD21 Xplained Pro Modules
 | 
			
		||||
         CONFIG_SAMD21_XPLAINED_IOMODULE=y      : I/O1 module is connected
 | 
			
		||||
         CONFIG_SAMD21_XPLAINED_IOMODULE_EXT1=y : I/O1 modules is in EXT1
 | 
			
		||||
 | 
			
		||||
       Application Configuration -> NSH Library
 | 
			
		||||
         CONFIG_NSH_ARCHINIT=y             : Board has architecture-specific initialization
 | 
			
		||||
 | 
			
		||||
       NOTE: If you enable the I/O1 this configuration with SERCOM4 as the
 | 
			
		||||
       console and with the I/O1 module in EXT1, you *must* remove USART
 | 
			
		||||
       jumper.  Otherwise, you have lookpack on SERCOM4 and NSH will *not*
 | 
			
		||||
       behave very well (since its outgoing prompts also appear as incoming
 | 
			
		||||
       commands).
 | 
			
		||||
 | 
			
		||||
       STATUS:  As of 2013-6-18, this configuration appears completely
 | 
			
		||||
       functional.  Testing, however, has been very light.  Example:
 | 
			
		||||
 | 
			
		||||
         NuttShell (NSH) NuttX-6.34
 | 
			
		||||
         nsh> mount -t vfat /dev/mmcsd0 /mnt/stuff
 | 
			
		||||
         nsh> ls /mnt/stuff
 | 
			
		||||
         /mnt/stuff:
 | 
			
		||||
         nsh> echo "This is a test" >/mnt/stuff/atest.txt
 | 
			
		||||
         nsh> ls /mnt/stuff
 | 
			
		||||
         /mnt/stuff:
 | 
			
		||||
          atest.txt
 | 
			
		||||
         nsh> cat /mnt/stuff/atest.txt
 | 
			
		||||
         This is a test
 | 
			
		||||
         nsh>
 | 
			
		||||
 | 
			
		||||
    5. If the OLED1 module is connected to the SAMD21 Xplained Pro, then
 | 
			
		||||
       support for the OLED display can be enabled by making the following
 | 
			
		||||
       changes to the configuration.  These changes assume that the I/O1
 | 
			
		||||
       modules is connected in EXT1.  Most of the modifications necessary
 | 
			
		||||
       to work with the I/O1 in a different connector are obvious.. except
 | 
			
		||||
       for the selection of SERCOM SPI support:
 | 
			
		||||
 | 
			
		||||
         EXT1: SPI is provided through SERCOM0
 | 
			
		||||
         EXT2: SPI is provided through SERCOM1
 | 
			
		||||
         EXT3: SPI is provided through SERCOM5
 | 
			
		||||
 | 
			
		||||
       System Type -> Peripherals:
 | 
			
		||||
         CONFIG_SAMD2L2_SERCOM1=y           : Use SERCOM1 if the I/O is in EXT2
 | 
			
		||||
         CONFIG_SAMD2L2_SERCOM1_ISSPI=y     : Configure SERCOM1 as an SPI master
 | 
			
		||||
 | 
			
		||||
       Device Drivers -> SPI
 | 
			
		||||
         CONFIG_SPI=y                       : Enable SPI support
 | 
			
		||||
         CONFIG_SPI_EXCHANGE=y              : The exchange() method is supported
 | 
			
		||||
         CONFIG_SPI_CMDDATA=y               : CMD/DATA support is required
 | 
			
		||||
 | 
			
		||||
       Device Drivers -> LCDs
 | 
			
		||||
         CONFIG_LCD=y                       : Enable LCD support
 | 
			
		||||
         CONFIG_LCD_MAXCONTRAST=255         : Maximum contrast value
 | 
			
		||||
         CONFIG_LCD_LANDSCAPE=y             : Landscape orientation (see below*)
 | 
			
		||||
         CONFIG_LCD_UG2832HSWEG04=y         : Enable support for the OLED
 | 
			
		||||
         CONFIG_LCD_SSD1306_SPIMODE=0       : SPI Mode 0
 | 
			
		||||
         CONFIG_LCD_SSD1306_SPIMODE=3500000 : Pick an SPI frequency
 | 
			
		||||
 | 
			
		||||
       Board Selection -> SAMD21 Xplained Pro Modules
 | 
			
		||||
         CONFIG_SAMD21_XPLAINED_OLED1MODULE=y      : OLED1 module is connected
 | 
			
		||||
         CONFIG_SAMD21_XPLAINED_OLED1MODULE_EXT2=y : OLED1 modules is in EXT2
 | 
			
		||||
 | 
			
		||||
       The NX graphics subsystem also needs to be configured:
 | 
			
		||||
 | 
			
		||||
         CONFIG_NX=y                        : Enable graphics support
 | 
			
		||||
         CONFIG_NX_LCDDRIVER=y              : Using an LCD driver
 | 
			
		||||
         CONFIG_NX_NPLANES=1                : With a single color plane
 | 
			
		||||
         CONFIG_NX_WRITEONLY=n              : You can read from the LCD (see below**)
 | 
			
		||||
         CONFIG_NX_DISABLE_2BPP=y           : Disable all resolutions except 1BPP
 | 
			
		||||
         CONFIG_NX_DISABLE_4BPP=y
 | 
			
		||||
         CONFIG_NX_DISABLE_8BPP=y
 | 
			
		||||
         CONFIG_NX_DISABLE_16BPP=y
 | 
			
		||||
         CONFIG_NX_DISABLE_24BPP=y
 | 
			
		||||
         CONFIG_NX_DISABLE_32BPP=y
 | 
			
		||||
         CONFIG_NX_PACKEDMSFIRST=y          : LSB packed first (shouldn't matter)
 | 
			
		||||
         CONFIG_NXSTART_EXTERNINIT=y        : We have board_graphics_setup()
 | 
			
		||||
         CONFIG_NXTK_BORDERWIDTH=2          : Use a small border
 | 
			
		||||
         CONFIG_NXTK_DEFAULT_BORDERCOLORS=y : Default border colors
 | 
			
		||||
         CONFIG_NXFONTS_CHARBITS=7          : 7-bit fonts
 | 
			
		||||
         CONFIG_NXFONT_SANS17X23B=y         : Pick a font (any that will fit)
 | 
			
		||||
 | 
			
		||||
        * This orientation will put the buttons "above" the LCD.  The
 | 
			
		||||
          reverse landscape configuration (CONFIG_LCD_RLANDSCAPE) will
 | 
			
		||||
          "flip" the display so that the buttons are "below" the LCD.
 | 
			
		||||
 | 
			
		||||
       ** The hardware is write only, but the driver maintains a frame buffer
 | 
			
		||||
          to support read and read-write-modiry operations on the LCD.
 | 
			
		||||
          Reading from the frame buffer is, however, untested.
 | 
			
		||||
 | 
			
		||||
       Then, in order to use the OLED, you will need to build some kind of
 | 
			
		||||
       graphics application or use one of the NuttX graphics examples.
 | 
			
		||||
       Here, for example, is the setup for the graphic "Hello, World!"
 | 
			
		||||
       example:
 | 
			
		||||
 | 
			
		||||
         CONFIG_EXAMPLES_NXHELLO=y                : Enables the example
 | 
			
		||||
         CONFIG_EXAMPLES_NXHELLO_DEFAULT_COLORS=y : Use default colors (see below *)
 | 
			
		||||
         CONFIG_EXAMPLES_NXHELLO_DEFAULT_FONT=y   : Use the default font
 | 
			
		||||
         CONFIG_EXAMPLES_NXHELLO_BPP=1            : One bit per pixel
 | 
			
		||||
         CONFIG_EXAMPLES_NXHELLO_EXTERNINIT=y     : Special initialization is required.
 | 
			
		||||
 | 
			
		||||
        * The OLED is monochrome so the only "colors" are blacka nd white.
 | 
			
		||||
          The default "colors" will give you while text on a black background.
 | 
			
		||||
          You can override the faults it you want black text on a while background.
 | 
			
		||||
 | 
			
		||||
       NOTE:  One issue that I have seen with the NXHello example when
 | 
			
		||||
       running as an NSH command is that it only works the first time.
 | 
			
		||||
       So, after you run the 'nxhello' command one time, you will have to
 | 
			
		||||
       reset the board before you run it again.
 | 
			
		||||
 | 
			
		||||
       This is clearly some issue with initializing, un-initializing, and
 | 
			
		||||
       then re-initializing. If you want to fix this, patches are quite
 | 
			
		||||
       welcome.
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,65 @@
 | 
			
		|||
#
 | 
			
		||||
# 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_WGET is not set
 | 
			
		||||
# CONFIG_NSH_DISABLE_XD is not set
 | 
			
		||||
CONFIG_ARCH="arm"
 | 
			
		||||
CONFIG_ARCH_BOARD="samd21-xplained"
 | 
			
		||||
CONFIG_ARCH_BOARD_SAMD21_XPLAINED=y
 | 
			
		||||
CONFIG_ARCH_BUTTONS=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_HAVE_CXX=y
 | 
			
		||||
CONFIG_HAVE_CXXINITIALIZE=y
 | 
			
		||||
CONFIG_HOST_WINDOWS=y
 | 
			
		||||
CONFIG_INTELHEX_BINARY=y
 | 
			
		||||
CONFIG_MAX_TASKS=16
 | 
			
		||||
CONFIG_NSH_BUILTIN_APPS=y
 | 
			
		||||
CONFIG_PREALLOC_TIMERS=4
 | 
			
		||||
CONFIG_PTHREAD_STACK_DEFAULT=1536
 | 
			
		||||
CONFIG_RAM_SIZE=32768
 | 
			
		||||
CONFIG_RAM_START=0x20000000
 | 
			
		||||
CONFIG_RR_INTERVAL=200
 | 
			
		||||
CONFIG_SAMD2L2_SERCOM3=y
 | 
			
		||||
CONFIG_SAMD2L2_SERCOM4=y
 | 
			
		||||
CONFIG_SCHED_WAITPID=y
 | 
			
		||||
CONFIG_SDCLONE_DISABLE=y
 | 
			
		||||
CONFIG_START_DAY=21
 | 
			
		||||
CONFIG_START_MONTH=6
 | 
			
		||||
CONFIG_START_YEAR=2015
 | 
			
		||||
CONFIG_SYSTEM_NSH=y
 | 
			
		||||
CONFIG_TASK_NAME_SIZE=0
 | 
			
		||||
CONFIG_TASK_SPAWN_DEFAULT_STACKSIZE=1536
 | 
			
		||||
CONFIG_USART3_RXBUFSIZE=64
 | 
			
		||||
CONFIG_USART3_TXBUFSIZE=64
 | 
			
		||||
CONFIG_USART4_RXBUFSIZE=64
 | 
			
		||||
CONFIG_USART4_SERIAL_CONSOLE=y
 | 
			
		||||
CONFIG_USART4_TXBUFSIZE=64
 | 
			
		||||
CONFIG_USERMAIN_STACKSIZE=1536
 | 
			
		||||
CONFIG_USER_ENTRYPOINT="nsh_main"
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,529 @@
 | 
			
		|||
/****************************************************************************
 | 
			
		||||
 * boards/arm/samd2l2/samd21-xplained/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_SAMD21_XPLAINED_INCLUDE_BOARD_H
 | 
			
		||||
#define __BOARDS_ARM_SAMD2L2_SAMD21_XPLAINED_INCLUDE_BOARD_H
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Included Files
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#include <nuttx/config.h>
 | 
			
		||||
 | 
			
		||||
#ifndef __ASSEMBLY__
 | 
			
		||||
#  include <stdint.h>
 | 
			
		||||
#  ifdef CONFIG_SAMD2L2_GPIOIRQ
 | 
			
		||||
#    include <arch/irq.h>
 | 
			
		||||
#  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_FRQUENCY  - In Hz
 | 
			
		||||
 *    BOARD_CPU_FAILDECT  - Boolean (defined / not defined)
 | 
			
		||||
 *    BOARD_APBA_DIVIDER  - See M_APBASEL_APBADIV_* definitions
 | 
			
		||||
 *    BOARD_APBA_FRQUENCY - In Hz
 | 
			
		||||
 *    BOARD_APBB_DIVIDER  - See M_APBBSEL_APBBDIV_* definitions
 | 
			
		||||
 *    BOARD_APBB_FRQUENCY - In Hz
 | 
			
		||||
 *    BOARD_APBC_DIVIDER  - See M_APBCSEL_APBCDIV_* definitions
 | 
			
		||||
 *    BOARD_APBC_FRQUENCY - 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
 | 
			
		||||
 | 
			
		||||
/* SERCOM0 SPI is available on EXT1
 | 
			
		||||
 *
 | 
			
		||||
 *  PIN PORT SERCOM        FUNCTION
 | 
			
		||||
 *  --- ------------------ -----------
 | 
			
		||||
 *  15  PA5  SERCOM0 PAD1  SPI SS
 | 
			
		||||
 *  16  PA6  SERCOM0 PAD2  SPI MOSI
 | 
			
		||||
 *  17  PA4  SERCOM0 PAD0  SPI MISO
 | 
			
		||||
 *  18  PA7  SERCOM0 PAD3  SPI SCK
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define BOARD_SERCOM0_GCLKGEN        0
 | 
			
		||||
#define BOARD_SERCOM0_SLOW_GCLKGEN   BOARD_SERCOM05_SLOW_GCLKGEN
 | 
			
		||||
#define BOARD_SERCOM0_MUXCONFIG      (SPI_CTRLA_DOPO_DOPAD231 | SPI_CTRLA_DIPAD0)
 | 
			
		||||
#define BOARD_SERCOM0_PINMAP_PAD0    PORT_SERCOM0_PAD0_2 /* SPI_MISO */
 | 
			
		||||
#define BOARD_SERCOM0_PINMAP_PAD1    0                   /* microSD_SS */
 | 
			
		||||
#define BOARD_SERCOM0_PINMAP_PAD2    PORT_SERCOM0_PAD2_2 /* SPI_MOSI */
 | 
			
		||||
#define BOARD_SERCOM0_PINMAP_PAD3    PORT_SERCOM0_PAD3_2 /* SPI_SCK */
 | 
			
		||||
 | 
			
		||||
#define BOARD_SERCOM0_FREQUENCY      BOARD_GCLK0_FREQUENCY
 | 
			
		||||
 | 
			
		||||
/* SERCOM1 SPI is available on EXT2
 | 
			
		||||
 *
 | 
			
		||||
 *  PIN PORT SERCOM        FUNCTION
 | 
			
		||||
 *  --- ------------------ -----------
 | 
			
		||||
 *  15  PA17 SERCOM1 PAD1  SPI SS
 | 
			
		||||
 *  16  PA18 SERCOM1 PAD2  SPI MOSI
 | 
			
		||||
 *  17  PA16 SERCOM1 PAD0  SPI MISO
 | 
			
		||||
 *  18  PA19 SERCOM1 PAD3  SPI SCK
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define BOARD_SERCOM1_GCLKGEN        0
 | 
			
		||||
#define BOARD_SERCOM1_SLOW_GCLKGEN   BOARD_SERCOM05_SLOW_GCLKGEN
 | 
			
		||||
#define BOARD_SERCOM1_MUXCONFIG      (SPI_CTRLA_DOPO_DOPAD231 | SPI_CTRLA_DIPAD0)
 | 
			
		||||
#define BOARD_SERCOM1_PINMAP_PAD0    PORT_SERCOM1_PAD0_1 /* SPI_MISO */
 | 
			
		||||
#define BOARD_SERCOM1_PINMAP_PAD1    0                   /* microSD_SS */
 | 
			
		||||
#define BOARD_SERCOM1_PINMAP_PAD2    PORT_SERCOM1_PAD2_1 /* SPI_MOSI */
 | 
			
		||||
#define BOARD_SERCOM1_PINMAP_PAD3    PORT_SERCOM1_PAD3_1 /* SPI_SCK */
 | 
			
		||||
 | 
			
		||||
#define BOARD_SERCOM1_FREQUENCY      BOARD_GCLK0_FREQUENCY
 | 
			
		||||
 | 
			
		||||
/* The SAMD21 Xplained Pro contains an Embedded Debugger (EDBG) that can be
 | 
			
		||||
 * used to program and debug the ATSAMD21J18A using Serial Wire Debug (SWD).
 | 
			
		||||
 * The Embedded debugger also include a Virtual COM port interface over
 | 
			
		||||
 * SERCOM3.  Virtual COM port connections:
 | 
			
		||||
 *
 | 
			
		||||
 *   PA22 SERCOM3 PAD[0] / USART TXD
 | 
			
		||||
 *   PA23 SERCOM3 PAD[1] / USART RXD
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define BOARD_SERCOM3_GCLKGEN        0
 | 
			
		||||
#define BOARD_SERCOM3_SLOW_GCLKGEN   BOARD_SERCOM05_SLOW_GCLKGEN
 | 
			
		||||
#define BOARD_SERCOM3_MUXCONFIG      (USART_CTRLA_RXPAD1 | USART_CTRLA_TXPAD0_1)
 | 
			
		||||
#define BOARD_SERCOM3_PINMAP_PAD0    PORT_SERCOM3_PAD0_1 /* USART TX */
 | 
			
		||||
#define BOARD_SERCOM3_PINMAP_PAD1    PORT_SERCOM3_PAD1_1 /* USART RX */
 | 
			
		||||
#define BOARD_SERCOM3_PINMAP_PAD2    0
 | 
			
		||||
#define BOARD_SERCOM3_PINMAP_PAD3    0
 | 
			
		||||
 | 
			
		||||
#define BOARD_SERCOM3_FREQUENCY      BOARD_GCLK0_FREQUENCY
 | 
			
		||||
 | 
			
		||||
/* The SERCOM4 USART is available on connectors EXT1, EXT2, and EXT3
 | 
			
		||||
 *
 | 
			
		||||
 *   PIN   EXT1 EXT2 EXT3 GPIO Function
 | 
			
		||||
 *   ----  ---- ---- ---- ------------------
 | 
			
		||||
 *    13   PB09 PB10 PB10 SERCOM4 / USART RX
 | 
			
		||||
 *    14   PB08 PB11 PB11 SERCOM4 / USART TX
 | 
			
		||||
 *    19   GND  GND  GND  N/A
 | 
			
		||||
 *    20   VCC  VCC  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_SAMD21_XPLAINED_USART4_EXT1)
 | 
			
		||||
#  define BOARD_SERCOM4_MUXCONFIG    (USART_CTRLA_RXPAD1 | USART_CTRLA_TXPAD0)
 | 
			
		||||
#  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
 | 
			
		||||
#elif defined(CONFIG_SAMD21_XPLAINED_USART4_EXT2)
 | 
			
		||||
#  define BOARD_SERCOM4_MUXCONFIG    (USART_CTRLA_RXPAD3 | USART_CTRLA_TXPAD2)
 | 
			
		||||
#  define BOARD_SERCOM4_PINMAP_PAD0  0
 | 
			
		||||
#  define BOARD_SERCOM4_PINMAP_PAD1  0
 | 
			
		||||
#  define BOARD_SERCOM4_PINMAP_PAD2  PORT_SERCOM4_PAD2_3 /* USART TX */
 | 
			
		||||
#  define BOARD_SERCOM4_PINMAP_PAD3  PORT_SERCOM4_PAD3_3 /* USART RX */
 | 
			
		||||
#else /* if defined(CONFIG_SAMD21_XPLAINED_USART4_EXT3) */
 | 
			
		||||
#  define BOARD_SERCOM4_MUXCONFIG    (USART_CTRLA_RXPAD3 | USART_CTRLA_TXPAD2)
 | 
			
		||||
#  define BOARD_SERCOM4_PINMAP_PAD0  0
 | 
			
		||||
#  define BOARD_SERCOM4_PINMAP_PAD1  0
 | 
			
		||||
#  define BOARD_SERCOM4_PINMAP_PAD2  PORT_SERCOM4_PAD2_3 /* USART TX */
 | 
			
		||||
#  define BOARD_SERCOM4_PINMAP_PAD3  PORT_SERCOM4_PAD3_3 /* USART RX */
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define BOARD_SERCOM4_FREQUENCY      BOARD_GCLK0_FREQUENCY
 | 
			
		||||
 | 
			
		||||
/* SERCOM5 SPI is available on EXT3
 | 
			
		||||
 *
 | 
			
		||||
 *  PIN PORT SERCOM        FUNCTION
 | 
			
		||||
 *  --- ------------------ -----------
 | 
			
		||||
 *  15  PB17 SERCOM5 PAD1  SPI SS
 | 
			
		||||
 *  16  PB22 SERCOM5 PAD2  SPI MOSI
 | 
			
		||||
 *  17  PB16 SERCOM5 PAD0  SPI MISO
 | 
			
		||||
 *  18  PB23 SERCOM5 PAD3  SPI SCK
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define BOARD_SERCOM5_GCLKGEN        0
 | 
			
		||||
#define BOARD_SERCOM5_SLOW_GCLKGEN   BOARD_SERCOM05_SLOW_GCLKGEN
 | 
			
		||||
#define BOARD_SERCOM5_MUXCONFIG      (SPI_CTRLA_DOPO_DOPAD231 | SPI_CTRLA_DIPAD0)
 | 
			
		||||
#define BOARD_SERCOM5_PINMAP_PAD0    PORT_SERCOM5_PAD0_1 /* SPI_MISO */
 | 
			
		||||
#define BOARD_SERCOM5_PINMAP_PAD1    0                   /* microSD_SS */
 | 
			
		||||
#define BOARD_SERCOM5_PINMAP_PAD2    PORT_SERCOM5_PAD2_4 /* SPI_MOSI */
 | 
			
		||||
#define BOARD_SERCOM5_PINMAP_PAD3    PORT_SERCOM5_PAD3_4 /* SPI_SCK */
 | 
			
		||||
 | 
			
		||||
#define BOARD_SERCOM5_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 **********************************************************/
 | 
			
		||||
 | 
			
		||||
/* 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 STATUS near the SAMD21
 | 
			
		||||
 * USB connector.
 | 
			
		||||
 *
 | 
			
		||||
 * This LED is controlled by PC07 and the LED can be activated by driving
 | 
			
		||||
 * the PB30 to GND.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/* 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 */
 | 
			
		||||
 | 
			
		||||
/* Button definitions *******************************************************/
 | 
			
		||||
 | 
			
		||||
/* Mechanical buttons:
 | 
			
		||||
 *
 | 
			
		||||
 * The SAMD21 Xplained Pro contains two mechanical buttons.
 | 
			
		||||
 * One button is the RESET button connected to the SAMD21 reset line and the
 | 
			
		||||
 * other is a generic user configurable button.
 | 
			
		||||
 * When a button is pressed it will drive the I/O line to GND.
 | 
			
		||||
 *
 | 
			
		||||
 *   PA15 SW0
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/* The SAMD21 Xplained Pro supports one button: */
 | 
			
		||||
 | 
			
		||||
#define BUTTON_SW0                   0
 | 
			
		||||
#define NUM_BUTTONS                  1
 | 
			
		||||
 | 
			
		||||
#define BUTTON_SW0_BIT               (1 << BUTTON_SW0)
 | 
			
		||||
 | 
			
		||||
#endif /* __BOARDS_ARM_SAMD2L2_SAMD21_XPLAINED_INCLUDE_BOARD_H */
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,63 @@
 | 
			
		|||
############################################################################
 | 
			
		||||
# boards/arm/samd2l2/samd21-xplained/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
 | 
			
		||||
 | 
			
		||||
ifeq ($(CONFIG_CYGWIN_WINTOOL),y)
 | 
			
		||||
  ARCHSCRIPT = -T "${shell cygpath -w $(BOARD_DIR)$(DELIM)scripts$(DELIM)$(LDSCRIPT)}"
 | 
			
		||||
else
 | 
			
		||||
  ARCHSCRIPT = -T$(BOARD_DIR)$(DELIM)scripts$(DELIM)$(LDSCRIPT)
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
ifeq ($(CONFIG_DEBUG_SYMBOLS),y)
 | 
			
		||||
  ARCHOPTIMIZATION = -g
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
ifneq ($(CONFIG_DEBUG_NOOPT),y)
 | 
			
		||||
  ARCHOPTIMIZATION += $(MAXOPTIMIZATION) -fno-strict-aliasing -fno-strength-reduce -fomit-frame-pointer
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
ARCHCFLAGS = -fno-builtin
 | 
			
		||||
ARCHCXXFLAGS = -fno-builtin -fno-exceptions -fcheck-new -fno-rtti
 | 
			
		||||
ARCHWARNINGS = -Wall -Wstrict-prototypes -Wshadow -Wundef
 | 
			
		||||
ARCHWARNINGSXX = -Wall -Wshadow -Wundef
 | 
			
		||||
ARCHPICFLAGS = -fpic -msingle-pic-base -mpic-register=r10
 | 
			
		||||
 | 
			
		||||
CFLAGS := $(ARCHCFLAGS) $(ARCHWARNINGS) $(ARCHOPTIMIZATION) $(ARCHCPUFLAGS) $(ARCHINCLUDES) $(ARCHDEFINES) $(EXTRAFLAGS) -pipe
 | 
			
		||||
CPICFLAGS = $(ARCHPICFLAGS) $(CFLAGS)
 | 
			
		||||
CXXFLAGS := $(ARCHCXXFLAGS) $(ARCHWARNINGSXX) $(ARCHOPTIMIZATION) $(ARCHCPUFLAGS) $(ARCHXXINCLUDES) $(ARCHDEFINES) $(EXTRAFLAGS) -pipe
 | 
			
		||||
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
 | 
			
		||||
 | 
			
		||||
ifneq ($(CROSSDEV),arm-nuttx-elf-)
 | 
			
		||||
  LDFLAGS += -nostartfiles -nodefaultlibs
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(CONFIG_DEBUG_SYMBOLS),y)
 | 
			
		||||
  LDFLAGS += -g
 | 
			
		||||
endif
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,110 @@
 | 
			
		|||
/****************************************************************************
 | 
			
		||||
 * boards/arm/samd2l2/samd21-xplained/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
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
MEMORY
 | 
			
		||||
{
 | 
			
		||||
  flash (rx)  : ORIGIN = 0x00000000, LENGTH = 256K
 | 
			
		||||
  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(.);
 | 
			
		||||
        *(.init_array .init_array.*)
 | 
			
		||||
        _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) }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,53 @@
 | 
			
		|||
############################################################################
 | 
			
		||||
# boards/arm/samd2l2/samd21-xplained/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_SAMD2L2_SERCOM0),y)
 | 
			
		||||
CSRCS += sam_spi.c
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
ifeq ($(CONFIG_ARCH_LEDS),y)
 | 
			
		||||
CSRCS += sam_autoleds.c
 | 
			
		||||
else
 | 
			
		||||
CSRCS += sam_userleds.c
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
ifeq ($(CONFIG_ARCH_BUTTONS),y)
 | 
			
		||||
CSRCS += sam_buttons.c
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
ifeq ($(CONFIG_LIB_BOARDCTL),y)
 | 
			
		||||
CSRCS += sam_appinit.c
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
ifeq ($(CONFIG_SAMD21_XPLAINED_IOMODULE),y)
 | 
			
		||||
CSRCS += sam_mmcsd.c
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
ifeq ($(CONFIG_SAMD21_XPLAINED_OLED1MODULE),y)
 | 
			
		||||
ifeq ($(CONFIG_LCD_UG2832HSWEG04),y)
 | 
			
		||||
CSRCS += sam_ug2832hsweg04.c
 | 
			
		||||
endif
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
include $(TOPDIR)/boards/Board.mk
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,123 @@
 | 
			
		|||
/****************************************************************************
 | 
			
		||||
 * boards/arm/samd2l2/samd21-xplained/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 <nuttx/config.h>
 | 
			
		||||
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <syslog.h>
 | 
			
		||||
 | 
			
		||||
#include <nuttx/board.h>
 | 
			
		||||
 | 
			
		||||
#include "sam_config.h"
 | 
			
		||||
#include "samd21-xplained.h"
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Pre-processor Definitions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/* Some configuration checks */
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_SAMD21_XPLAINED_IOMODULE_EXT1
 | 
			
		||||
#  ifndef SAMD2L2_HAVE_SPI0
 | 
			
		||||
#    error I/O1 module on EXT1 requires SERCOM SPI0
 | 
			
		||||
#    undef CONFIG_SAMD21_XPLAINED_IOMODULE
 | 
			
		||||
#  endif
 | 
			
		||||
#  define SPI_PORTNO 0
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_SAMD21_XPLAINED_IOMODULE_EXT2
 | 
			
		||||
#  ifndef SAMD2L2_HAVE_SPI1
 | 
			
		||||
#    error I/O1 module on EXT2 requires SERCOM SPI1
 | 
			
		||||
#    undef CONFIG_SAMD21_XPLAINED_IOMODULE
 | 
			
		||||
#  endif
 | 
			
		||||
#  define SPI_PORTNO 1
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_SAMD21_XPLAINED_IOMODULE
 | 
			
		||||
/* Support for the SD card slot on the I/O1 module */
 | 
			
		||||
 | 
			
		||||
/* Verify NSH PORT and SLOT settings */
 | 
			
		||||
 | 
			
		||||
#  define SAMD2L2_MMCSDSLOTNO  0 /* There is only one slot */
 | 
			
		||||
 | 
			
		||||
#  if defined(CONFIG_NSH_MMCSDSLOTNO) && CONFIG_NSH_MMCSDSLOTNO != SAMD2L2_MMCSDSLOTNO
 | 
			
		||||
#    error Only one MMC/SD slot:  Slot 0 (CONFIG_NSH_MMCSDSLOTNO)
 | 
			
		||||
#  endif
 | 
			
		||||
 | 
			
		||||
#  if defined(CONFIG_NSH_MMCSDSPIPORTNO) && CONFIG_NSH_MMCSDSPIPORTNO != SPI_PORTNO
 | 
			
		||||
#    error CONFIG_NSH_MMCSDSPIPORTNO must have the same value as SPI_PORTNO
 | 
			
		||||
#  endif
 | 
			
		||||
 | 
			
		||||
/* Default MMC/SD minor number */
 | 
			
		||||
 | 
			
		||||
#  ifndef CONFIG_NSH_MMCSDMINOR
 | 
			
		||||
#    define CONFIG_NSH_MMCSDMINOR 0
 | 
			
		||||
#  endif
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * 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)
 | 
			
		||||
{
 | 
			
		||||
#if defined(SAMD2L2_HAVE_SPI0) && defined(CONFIG_SAMD21_XPLAINED_IOMODULE)
 | 
			
		||||
  /* Initialize the SPI-based MMC/SD slot */
 | 
			
		||||
 | 
			
		||||
  int ret = sam_sdinitialize(SPI_PORTNO, CONFIG_NSH_MMCSDMINOR);
 | 
			
		||||
  if (ret < 0)
 | 
			
		||||
    {
 | 
			
		||||
      syslog(LOG_ERR, "ERROR: Failed to initialize MMC/SD slot: %d\n",
 | 
			
		||||
             ret);
 | 
			
		||||
      return ret;
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
  return OK;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,149 @@
 | 
			
		|||
/****************************************************************************
 | 
			
		||||
 * boards/arm/samd2l2/samd21-xplained/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.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/* 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 STATUS 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.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Included Files
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#include <nuttx/config.h>
 | 
			
		||||
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
#include <stdbool.h>
 | 
			
		||||
#include <debug.h>
 | 
			
		||||
 | 
			
		||||
#include <nuttx/board.h>
 | 
			
		||||
#include <arch/board/board.h>
 | 
			
		||||
 | 
			
		||||
#include "sam_port.h"
 | 
			
		||||
#include "samd21-xplained.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 */
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,77 @@
 | 
			
		|||
/****************************************************************************
 | 
			
		||||
 * boards/arm/samd2l2/samd21-xplained/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 <nuttx/config.h>
 | 
			
		||||
 | 
			
		||||
#include <debug.h>
 | 
			
		||||
 | 
			
		||||
#include <nuttx/board.h>
 | 
			
		||||
 | 
			
		||||
#include "sam_config.h"
 | 
			
		||||
#include "samd21-xplained.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 SPI chip selects if
 | 
			
		||||
   * 1) SPI is not disabled, and
 | 
			
		||||
   * 2) the weak function
 | 
			
		||||
   * sam_spidev_initialize() has been brought into the link.
 | 
			
		||||
   */
 | 
			
		||||
 | 
			
		||||
#ifdef SAMD2L2_HAVE_SPI
 | 
			
		||||
  if (sam_spidev_initialize)
 | 
			
		||||
    {
 | 
			
		||||
      sam_spidev_initialize();
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
  /* Configure on-board LEDs if LED support has been selected. */
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_ARCH_LEDS
 | 
			
		||||
  board_autoled_initialize();
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,127 @@
 | 
			
		|||
/****************************************************************************
 | 
			
		||||
 * boards/arm/samd2l2/samd21-xplained/src/sam_buttons.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 <nuttx/config.h>
 | 
			
		||||
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
#include <errno.h>
 | 
			
		||||
 | 
			
		||||
#include <nuttx/arch.h>
 | 
			
		||||
#include <nuttx/board.h>
 | 
			
		||||
#include <nuttx/irq.h>
 | 
			
		||||
 | 
			
		||||
#include <nuttx/irq.h>
 | 
			
		||||
#include <arch/board/board.h>
 | 
			
		||||
 | 
			
		||||
#include "sam_port.h"
 | 
			
		||||
#include "samd21-xplained.h"
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_ARCH_BUTTONS
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Public Functions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: board_button_initialize
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   board_button_initialize() must be called to initialize button resources.
 | 
			
		||||
 *   After that, board_buttons() may be called to collect the current state
 | 
			
		||||
 *   of all buttons or board_button_irq() may be called to register button
 | 
			
		||||
 *   interrupt handlers.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
uint32_t board_button_initialize(void)
 | 
			
		||||
{
 | 
			
		||||
  sam_configport(PORT_SW0);
 | 
			
		||||
  return NUM_BUTTONS;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: board_buttons
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   After board_button_initialize() has been called,
 | 
			
		||||
 *   board_buttons() may be called to collect the state of all buttons.
 | 
			
		||||
 *   board_buttons() returns an 32-bit bit set with each bit
 | 
			
		||||
 *   associated with a button.
 | 
			
		||||
 *   See the BUTTON* definitions above for the meaning of each bit
 | 
			
		||||
 *   in the returned value.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
uint32_t board_buttons(void)
 | 
			
		||||
{
 | 
			
		||||
  return sam_portread(PORT_SW0) ? 0 : BUTTON_SW0_BIT;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: board_button_irq
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   This function may be called to register an interrupt handler that will
 | 
			
		||||
 *   be called when a button is depressed or released.  The ID value is one
 | 
			
		||||
 *   of the BUTTON* definitions provided above.
 | 
			
		||||
 *
 | 
			
		||||
 * Configuration Notes:
 | 
			
		||||
 *   Configuration CONFIG_AVR32_PORTIRQ must be selected to enable the
 | 
			
		||||
 *   overall PORT IRQ feature and CONFIG_AVR32_PORTIRQSETA and/or
 | 
			
		||||
 *   CONFIG_AVR32_PORTIRQSETB must be enabled to select PORTs to support
 | 
			
		||||
 *   interrupts on.  For button support, bits 2 and 3 must be set in
 | 
			
		||||
 *   CONFIG_AVR32_PORTIRQSETB (PB2 and PB3).
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#if defined(CONFIG_PORTA_IRQ) && defined(CONFIG_ARCH_IRQBUTTONS)
 | 
			
		||||
int board_button_irq(int id, xcpt_t irqhandler, FAR void *arg)
 | 
			
		||||
{
 | 
			
		||||
  int ret = -EINVAL;
 | 
			
		||||
 | 
			
		||||
  if (id == BUTTON_SW0)
 | 
			
		||||
    {
 | 
			
		||||
      irqstate_t flags;
 | 
			
		||||
 | 
			
		||||
      /* Disable interrupts until we are done.  This guarantees that the
 | 
			
		||||
       * following operations are atomic.
 | 
			
		||||
       */
 | 
			
		||||
 | 
			
		||||
      flags = enter_critical_section();
 | 
			
		||||
 | 
			
		||||
      /* Configure the interrupt */
 | 
			
		||||
 | 
			
		||||
      sam_portirq(IRQ_SW0);
 | 
			
		||||
      irq_attach(IRQ_SW0, irqhandler, arg);
 | 
			
		||||
      sam_portirqenable(IRQ_SW0);
 | 
			
		||||
 | 
			
		||||
      leave_critical_section(flags);
 | 
			
		||||
      ret = OK;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  return ret;
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif /* CONFIG_ARCH_BUTTONS */
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,114 @@
 | 
			
		|||
/****************************************************************************
 | 
			
		||||
 * boards/arm/samd2l2/samd21-xplained/src/sam_mmcsd.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 <nuttx/config.h>
 | 
			
		||||
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <debug.h>
 | 
			
		||||
#include <errno.h>
 | 
			
		||||
 | 
			
		||||
#include <nuttx/spi/spi.h>
 | 
			
		||||
#include <nuttx/mmcsd.h>
 | 
			
		||||
 | 
			
		||||
#include "sam_config.h"
 | 
			
		||||
#include "sam_spi.h"
 | 
			
		||||
 | 
			
		||||
#include "samd21-xplained.h"
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_SAMD21_XPLAINED_IOMODULE
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Pre-processor Definitions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/* Configuration ************************************************************/
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_DISABLE_MOUNTPOINT
 | 
			
		||||
#  error Mountpoints are disabled (CONFIG_DISABLE_MOUNTPOINT=y)
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifndef SAMD2L2_HAVE_SPI0
 | 
			
		||||
#  error SERCOM0 SPI support is required
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifndef CONFIG_MMCSD
 | 
			
		||||
#  error MMC/SD support is required (CONFIG_MMCSD)
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define SAMD2L2_MMCSDSLOTNO  0 /* There is only one slot */
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Public Functions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: sam_sdinitialize
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   Initialize the SPI-based SD card.  Requires
 | 
			
		||||
 *   - CONFIG_SAMD21_XPLAINED_IOMODULE=y,
 | 
			
		||||
 *   - CONFIG_DISABLE_MOUNTPOINT=n,
 | 
			
		||||
 *   - CONFIG_MMCSD=y, and
 | 
			
		||||
 *   - SAMD2L2_HAVE_SPI0=y
 | 
			
		||||
 *     (CONFIG_SAMD2L2_SERCOM0 && CONFIG_SAMD2L2_SERCOM0_ISSPI)
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
int sam_sdinitialize(int port, int minor)
 | 
			
		||||
{
 | 
			
		||||
  FAR struct spi_dev_s *spi;
 | 
			
		||||
  int ret;
 | 
			
		||||
 | 
			
		||||
  /* Get the SPI driver instance for the SD chip select */
 | 
			
		||||
 | 
			
		||||
  finfo("Initializing SERCOM SPI%d\n", port);
 | 
			
		||||
 | 
			
		||||
  spi = sam_spibus_initialize(port);
 | 
			
		||||
  if (!spi)
 | 
			
		||||
    {
 | 
			
		||||
      ferr("ERROR: Failed to initialize SPI%d\n", port);
 | 
			
		||||
      return -ENODEV;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  finfo("Successfully initialized SPI%d\n", port);
 | 
			
		||||
 | 
			
		||||
  /* Bind the SPI device for the chip select to the slot */
 | 
			
		||||
 | 
			
		||||
  finfo("Binding SPI%d to MMC/SD slot %d\n", port, SAMD2L2_MMCSDSLOTNO);
 | 
			
		||||
 | 
			
		||||
  ret = mmcsd_spislotinitialize(minor, SAMD2L2_MMCSDSLOTNO, spi);
 | 
			
		||||
  if (ret < 0)
 | 
			
		||||
    {
 | 
			
		||||
      ferr("ERROR: Failed to bind SPI%d to MMC/SD slot %d: %d\n",
 | 
			
		||||
            port, SAMD2L2_MMCSDSLOTNO, ret);
 | 
			
		||||
      return ret;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  finfo("Successfully bound SPI%d to MMC/SD slot %d\n",
 | 
			
		||||
        port, SAMD2L2_MMCSDSLOTNO);
 | 
			
		||||
 | 
			
		||||
  return OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif /* CONFIG_SAMD21_XPLAINED_IOMODULE */
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,406 @@
 | 
			
		|||
/****************************************************************************
 | 
			
		||||
 * boards/arm/samd2l2/samd21-xplained/src/sam_spi.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 <nuttx/config.h>
 | 
			
		||||
 | 
			
		||||
#include <stdbool.h>
 | 
			
		||||
#include <debug.h>
 | 
			
		||||
#include <errno.h>
 | 
			
		||||
 | 
			
		||||
#include <nuttx/spi/spi.h>
 | 
			
		||||
 | 
			
		||||
#include "sam_config.h"
 | 
			
		||||
#include "sam_port.h"
 | 
			
		||||
#include "sam_spi.h"
 | 
			
		||||
 | 
			
		||||
#include "samd21-xplained.h"
 | 
			
		||||
 | 
			
		||||
#ifdef SAMD2L2_HAVE_SPI
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Public Functions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: sam_spidev_initialize
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   Called to configure SPI chip select PORT pins for the SAMD21 Xplained
 | 
			
		||||
 *   Pro board.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
void weak_function sam_spidev_initialize(void)
 | 
			
		||||
{
 | 
			
		||||
  /* The I/O module containing the SD connector may or may not be installed.
 | 
			
		||||
   * And, if it is installed, it may be in connector EXT1 or EXT2.
 | 
			
		||||
   */
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_SAMD21_XPLAINED_IOMODULE
 | 
			
		||||
  /* TODO: enable interrupt on card detect */
 | 
			
		||||
 | 
			
		||||
  sam_configport(PORT_SD_CD);     /* Card detect input */
 | 
			
		||||
  sam_configport(PORT_SD_CS);     /* Chip select output */
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_SAMD21_XPLAINED_OLED1MODULE
 | 
			
		||||
  sam_configport(PORT_OLED_DATA); /* Command/data */
 | 
			
		||||
  sam_configport(PORT_OLED_CS);   /* Card detect input */
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name:  sam_spi[n]select, sam_spi[n]status, and sam_spi[n]cmddata
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   These external functions must be provided by board-specific logic.  They
 | 
			
		||||
 *   include:
 | 
			
		||||
 *
 | 
			
		||||
 *   o sam_spi[n]select is a functions to manage the board-specific chip
 | 
			
		||||
 *     selects
 | 
			
		||||
 *   o sam_spi[n]status and sam_spi[n]cmddata:  Implementations of the status
 | 
			
		||||
 *     and cmddata methods of the SPI interface defined by struct spi_ops_
 | 
			
		||||
 *     (see include/nuttx/spi/spi.h). All other methods including
 | 
			
		||||
 *     sam_spibus_initialize()) are provided by common SAMD/L logic.
 | 
			
		||||
 *
 | 
			
		||||
 *   Where [n] is the SERCOM number for the SPI module.
 | 
			
		||||
 *
 | 
			
		||||
 *   To use this common SPI logic on your board:
 | 
			
		||||
 *
 | 
			
		||||
 *   1. Provide logic in sam_boardinitialize() to configure SPI chip select
 | 
			
		||||
 *      pins.
 | 
			
		||||
 *   2. Provide sam_spi[n]select() and sam_spi[n]status() functions in your
 | 
			
		||||
 *      board-specific logic.  These functions will perform chip selection
 | 
			
		||||
 *      and status operations using GPIOs in the way your board is
 | 
			
		||||
 *      configured.
 | 
			
		||||
 *   2. If CONFIG_SPI_CMDDATA is defined in the NuttX configuration, provide
 | 
			
		||||
 *      sam_spi[n]cmddata() functions in your board-specific logic.  This
 | 
			
		||||
 *      function will perform cmd/data selection operations using GPIOs in
 | 
			
		||||
 *      the way your board is configured.
 | 
			
		||||
 *   3. Add a call to sam_spibus_initialize() in your low level application
 | 
			
		||||
 *      initialization logic
 | 
			
		||||
 *   4. The handle returned by sam_spibus_initialize() may then be used to
 | 
			
		||||
 *      bind the  SPI driver to higher level logic (e.g., calling
 | 
			
		||||
 *      mmcsd_spislotinitialize(), for example, will bind the SPI driver to
 | 
			
		||||
 *      the SPI MMC/SD driver).
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: sam_spi[n]select
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   PIO chip select pins may be programmed by the board specific logic in
 | 
			
		||||
 *   one of two different ways.  First, the pins may be programmed as SPI
 | 
			
		||||
 *   peripherals.  In that case, the pins are completely controlled by the
 | 
			
		||||
 *   SPI driver.  This method still needs to be provided, but it may be only
 | 
			
		||||
 *   a stub.
 | 
			
		||||
 *
 | 
			
		||||
 *   An alternative way to program the PIO chip select pins is as a normal
 | 
			
		||||
 *   GPIO output.  In that case, the automatic control of the CS pins is
 | 
			
		||||
 *   bypassed and this function must provide control of the chip select.
 | 
			
		||||
 *   NOTE:  In this case, the GPIO output pin does *not* have to be the
 | 
			
		||||
 *   same as the NPCS pin normal associated with the chip select number.
 | 
			
		||||
 *
 | 
			
		||||
 * Input Parameters:
 | 
			
		||||
 *   dev - SPI device info
 | 
			
		||||
 *   devid - Identifies the (logical) device
 | 
			
		||||
 *   selected - TRUE:Select the device, FALSE:De-select the device
 | 
			
		||||
 *
 | 
			
		||||
 * Returned Value:
 | 
			
		||||
 *   None
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#ifdef SAMD2L2_HAVE_SPI0
 | 
			
		||||
void sam_spi0select(FAR struct spi_dev_s *dev, uint32_t devid,
 | 
			
		||||
                    bool selected)
 | 
			
		||||
{
 | 
			
		||||
#ifdef CONFIG_SAMD21_XPLAINED_IOMODULE_EXT1
 | 
			
		||||
  /* Select/de-select the SD card */
 | 
			
		||||
 | 
			
		||||
  if (devid == SPIDEV_MMCSD(0))
 | 
			
		||||
    {
 | 
			
		||||
      /* Active low */
 | 
			
		||||
 | 
			
		||||
      sam_portwrite(PORT_SD_CS, !selected);
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_SAMD21_XPLAINED_OLED1MODULE_EXT1
 | 
			
		||||
  /* Select/de-select the OLED */
 | 
			
		||||
 | 
			
		||||
  if (devid == SPIDEV_DISPLAY(0))
 | 
			
		||||
    {
 | 
			
		||||
      /* Active low */
 | 
			
		||||
 | 
			
		||||
      sam_portwrite(PORT_OLED_CS, !selected);
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef SAMD2L2_HAVE_SPI1
 | 
			
		||||
void sam_spi1select(FAR struct spi_dev_s *dev, uint32_t devid,
 | 
			
		||||
                    bool selected)
 | 
			
		||||
{
 | 
			
		||||
#ifdef CONFIG_SAMD21_XPLAINED_IOMODULE_EXT2
 | 
			
		||||
  /* Select/de-select the SD card */
 | 
			
		||||
 | 
			
		||||
  if (devid == SPIDEV_MMCSD(0))
 | 
			
		||||
    {
 | 
			
		||||
      /* Active low */
 | 
			
		||||
 | 
			
		||||
      sam_portwrite(PORT_SD_CS, !selected);
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_SAMD21_XPLAINED_OLED1MODULE_EXT2
 | 
			
		||||
  /* Select/de-select the OLED */
 | 
			
		||||
 | 
			
		||||
  if (devid == SPIDEV_DISPLAY(0))
 | 
			
		||||
    {
 | 
			
		||||
      /* Active low */
 | 
			
		||||
 | 
			
		||||
      sam_portwrite(PORT_OLED_CS, !selected);
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef SAMD2L2_HAVE_SPI2
 | 
			
		||||
void sam_spi2select(FAR struct spi_dev_s *dev, uint32_t devid,
 | 
			
		||||
                    bool selected)
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef SAMD2L2_HAVE_SPI3
 | 
			
		||||
void sam_spi3select(FAR struct spi_dev_s *dev, uint32_t devid,
 | 
			
		||||
                    bool selected)
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef SAMD2L2_HAVE_SPI4
 | 
			
		||||
void sam_spi4select(FAR struct spi_dev_s *dev, uint32_t devid,
 | 
			
		||||
                    bool selected)
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef SAMD2L2_HAVE_SPI5
 | 
			
		||||
void sam_spi5select(FAR struct spi_dev_s *dev, uint32_t devid,
 | 
			
		||||
                    bool selected)
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: sam_spi[n]status
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   Return status information associated with the SPI device.
 | 
			
		||||
 *
 | 
			
		||||
 * Input Parameters:
 | 
			
		||||
 *   dev - SPI device info
 | 
			
		||||
 *   devid - Identifies the (logical) device
 | 
			
		||||
 *
 | 
			
		||||
 * Returned Value:
 | 
			
		||||
 *   Bit-encoded SPI status (see include/nuttx/spi/spi.h.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#ifdef SAMD2L2_HAVE_SPI0
 | 
			
		||||
uint8_t sam_spi0status(FAR struct spi_dev_s *dev, uint32_t devid)
 | 
			
		||||
{
 | 
			
		||||
  uint8_t ret = 0;
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_SAMD21_XPLAINED_IOMODULE_EXT1
 | 
			
		||||
  /* Check if an SD card is present in the microSD slot */
 | 
			
		||||
 | 
			
		||||
  if (devid == SPIDEV_MMCSD(0))
 | 
			
		||||
    {
 | 
			
		||||
      /* Active low */
 | 
			
		||||
 | 
			
		||||
      if (!sam_portread(PORT_SD_CD))
 | 
			
		||||
        {
 | 
			
		||||
          ret |= SPI_STATUS_PRESENT;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
  return ret;
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef SAMD2L2_HAVE_SPI1
 | 
			
		||||
uint8_t sam_spi1status(FAR struct spi_dev_s *dev, uint32_t devid)
 | 
			
		||||
{
 | 
			
		||||
  uint8_t ret = 0;
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_SAMD21_XPLAINED_IOMODULE_EXT2
 | 
			
		||||
  /* Check if an SD card is present in the microSD slot */
 | 
			
		||||
 | 
			
		||||
  if (devid == SPIDEV_MMCSD(0))
 | 
			
		||||
    {
 | 
			
		||||
      /* Active low */
 | 
			
		||||
 | 
			
		||||
      if (!sam_portread(PORT_SD_CD))
 | 
			
		||||
        {
 | 
			
		||||
          ret |= SPI_STATUS_PRESENT;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
  return ret;
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef SAMD2L2_HAVE_SPI2
 | 
			
		||||
uint8_t sam_spi2status(FAR struct spi_dev_s *dev, uint32_t devid)
 | 
			
		||||
{
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef SAMD2L2_HAVE_SPI3
 | 
			
		||||
uint8_t sam_spi3status(FAR struct spi_dev_s *dev, uint32_t devid)
 | 
			
		||||
{
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef SAMD2L2_HAVE_SPI4
 | 
			
		||||
uint8_t sam_spi4status(FAR struct spi_dev_s *dev, uint32_t devid)
 | 
			
		||||
{
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef SAMD2L2_HAVE_SPI5
 | 
			
		||||
uint8_t sam_spi5status(FAR struct spi_dev_s *dev, uint32_t devid)
 | 
			
		||||
{
 | 
			
		||||
  uint8_t ret = 0;
 | 
			
		||||
  return ret;
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: sam_spi[n]cmddata
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   Some SPI devices require an additional control to determine if the SPI
 | 
			
		||||
 *   data being sent is a command or is data.  If CONFIG_SPI_CMDDATA then
 | 
			
		||||
 *   this function will be called to different be command and data transfers.
 | 
			
		||||
 *
 | 
			
		||||
 *   This is often needed, for example, by LCD drivers.  Some LCD hardware
 | 
			
		||||
 *   may be configured to use 9-bit data transfers with the 9th bit
 | 
			
		||||
 *   indicating command or data.  That same hardware may be configurable,
 | 
			
		||||
 *   instead, to use 8-bit data but to require an additional, board-
 | 
			
		||||
 *   specific GPIO control to distinguish command and data.  This function
 | 
			
		||||
 *   would be needed in that latter case.
 | 
			
		||||
 *
 | 
			
		||||
 * Input Parameters:
 | 
			
		||||
 *   dev - SPI device info
 | 
			
		||||
 *   devid - Identifies the (logical) device
 | 
			
		||||
 *
 | 
			
		||||
 * Returned Value:
 | 
			
		||||
 *   Zero on success; a negated errno on failure.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_SPI_CMDDATA
 | 
			
		||||
#ifdef SAMD2L2_HAVE_SPI0
 | 
			
		||||
int sam_spi0cmddata(FAR struct spi_dev_s *dev, uint32_t devid, bool cmd)
 | 
			
		||||
{
 | 
			
		||||
#ifdef CONFIG_SAMD21_XPLAINED_OLED1MODULE_EXT1
 | 
			
		||||
  if (devid == SPIDEV_DISPLAY(0))
 | 
			
		||||
    {
 | 
			
		||||
      /* This is the Data/Command control pad which determines whether the
 | 
			
		||||
       * data bits are data or a command.
 | 
			
		||||
       *
 | 
			
		||||
       * High: the inputs are treated as display data.
 | 
			
		||||
       * Low:  the inputs are transferred to the command registers.
 | 
			
		||||
       */
 | 
			
		||||
 | 
			
		||||
      sam_portwrite(PORT_OLED_DATA, !cmd);
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
  return OK;
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef SAMD2L2_HAVE_SPI1
 | 
			
		||||
int sam_spi1cmddata(FAR struct spi_dev_s *dev, uint32_t devid, bool cmd)
 | 
			
		||||
{
 | 
			
		||||
#ifdef CONFIG_SAMD21_XPLAINED_OLED1MODULE_EXT2
 | 
			
		||||
  if (devid == SPIDEV_DISPLAY(0))
 | 
			
		||||
    {
 | 
			
		||||
      /* This is the Data/Command control pad which determines whether the
 | 
			
		||||
       * data bits are data or a command.
 | 
			
		||||
       *
 | 
			
		||||
       * High: the inputs are treated as display data.
 | 
			
		||||
       * Low:  the inputs are transferred to the command registers.
 | 
			
		||||
       */
 | 
			
		||||
 | 
			
		||||
      sam_portwrite(PORT_OLED_DATA, !cmd);
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
  return OK;
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef SAMD2L2_HAVE_SPI2
 | 
			
		||||
int sam_spi2cmddata(FAR struct spi_dev_s *dev, uint32_t devid, bool cmd)
 | 
			
		||||
{
 | 
			
		||||
  return OK;
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef SAMD2L2_HAVE_SPI3
 | 
			
		||||
int sam_spi3cmddata(FAR struct spi_dev_s *dev, uint32_t devid, bool cmd)
 | 
			
		||||
{
 | 
			
		||||
  return OK;
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef SAMD2L2_HAVE_SPI4
 | 
			
		||||
int sam_spi4cmddata(FAR struct spi_dev_s *dev, uint32_t devid, bool cmd)
 | 
			
		||||
{
 | 
			
		||||
  return OK;
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef SAMD2L2_HAVE_SPI5
 | 
			
		||||
int sam_spi5cmddata(FAR struct spi_dev_s *dev, uint32_t devid, bool cmd)
 | 
			
		||||
{
 | 
			
		||||
  return OK;
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif /* CONFIG_SPI_CMDDATA */
 | 
			
		||||
#endif /* SAMD2L2_HAVE_SPI */
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,191 @@
 | 
			
		|||
/****************************************************************************
 | 
			
		||||
 * boards/arm/samd2l2/samd21-xplained/src/sam_ug2832hsweg04.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.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/* OLED1 Connector:
 | 
			
		||||
 *
 | 
			
		||||
 *  OLED1 CONNECTOR
 | 
			
		||||
 *  ----------------- ---------------------- ----------------------
 | 
			
		||||
 *  OLED1             EXT1                   EXT2
 | 
			
		||||
 *  ----------------- ---------------------- ----------------------
 | 
			
		||||
 *  1  ID             1                      1
 | 
			
		||||
 *  ----------------- ---------------------- ----------------------
 | 
			
		||||
 *  2  GND            2       GND            2  GND
 | 
			
		||||
 *  ----------------- ---------------------- ----------------------
 | 
			
		||||
 *  3  BUTTON2        3  PB00 AIN[8]         3  PA10 AIN[18]
 | 
			
		||||
 *  ----------------- ---------------------- ----------------------
 | 
			
		||||
 *  4  BUTTON3        4  PB01 AIN[9]         4  PA11 AIN[19]
 | 
			
		||||
 *  ----------------- ---------------------- ----------------------
 | 
			
		||||
 *  5  DATA_CMD_SEL   5  PB06 PORT           5  PA20 PORT
 | 
			
		||||
 *  ----------------- ---------------------- ----------------------
 | 
			
		||||
 *  6  LED3           6  PB07 PORT           6  PA21 PORT
 | 
			
		||||
 *  ----------------- ---------------------- ----------------------
 | 
			
		||||
 *  7  LED1           7  PB02 TC6/WO[0]      7  PB12 TC4/WO[0]
 | 
			
		||||
 *  ----------------- ---------------------- ----------------------
 | 
			
		||||
 *  8  LED2           8  PB03 TC6/WO[1]      8  PB13 TC4/WO[1]
 | 
			
		||||
 *  ----------------- ---------------------- ----------------------
 | 
			
		||||
 *  9  BUTTON1        9  PB04 EXTINT[4]      9  PB14 EXTINT[14]
 | 
			
		||||
 *  ----------------- ---------------------- ----------------------
 | 
			
		||||
 *  10 DISPLAY_RESET  10 PB05 PORT           10 PB15 PORT
 | 
			
		||||
 *  ----------------- ---------------------- ----------------------
 | 
			
		||||
 *  11 N/C            11 PA08 SERCOM2 PAD[0] 11 PA08 SERCOM2 PAD[0]
 | 
			
		||||
 *                            I²C SDA                I²C SDA
 | 
			
		||||
 *  ----------------- ---------------------- ----------------------
 | 
			
		||||
 *  12 N/C            12 PA09 SERCOM2 PAD[1] 12 PA09 SERCOM2 PAD[1]
 | 
			
		||||
 *                            I²C SCL                I²C SCL
 | 
			
		||||
 *  ----------------- ---------------------- ----------------------
 | 
			
		||||
 *  13 N/C            13 PB09 SERCOM4 PAD[1] 13 PB11 SERCOM4 PAD[1]
 | 
			
		||||
 *                            USART RX               USART RX
 | 
			
		||||
 *  ----------------- ---------------------- ----------------------
 | 
			
		||||
 *  14 N/C            14 PB08 SERCOM4 PAD[0] 14 PB10 SERCOM4 PAD[0]
 | 
			
		||||
 *                            USART TX               USART TX
 | 
			
		||||
 *  ----------------- ---------------------- ----------------------
 | 
			
		||||
 *  15 DISPLAY_SS     15 PA05 SERCOM0 PAD[1] 15 PA17 SERCOM1 PAD[1]
 | 
			
		||||
 *                            SPI SS                 SPI SS
 | 
			
		||||
 *  ----------------- ---------------------- ----------------------
 | 
			
		||||
 *  16 SPI_MOSI       16 PA06 SERCOM0 PAD[2] 16 PA18 SERCOM1 PAD[2]
 | 
			
		||||
 *                            SPI MOSI               SPI MOSI
 | 
			
		||||
 *  ----------------- ---------------------- ----------------------
 | 
			
		||||
 *  17 N/C            17 PA04 SERCOM0 PAD[0] 17 PA16 SERCOM1 PAD[0]
 | 
			
		||||
 *                            SPI MISO               SPI MISO
 | 
			
		||||
 *  ----------------- ---------------------- ----------------------
 | 
			
		||||
 *  18 SPI_SCK        18 PA07 SERCOM0 PAD[3] 18 PA19 SERCOM1 PAD[3]
 | 
			
		||||
 *                            SPI SCK                SPI SCK
 | 
			
		||||
 *  ----------------- ---------------------- ----------------------
 | 
			
		||||
 *  19 GND            19      GND               GND
 | 
			
		||||
 *  ----------------- ---------------------- ----------------------
 | 
			
		||||
 *  20 VCC            20      VCC               VCC
 | 
			
		||||
 *  ----------------- ---------------------- ----------------------
 | 
			
		||||
 *
 | 
			
		||||
 * OLED1 signals
 | 
			
		||||
 *
 | 
			
		||||
 * DATA_CMD_SEL - Data/command select. Used to choose whether the
 | 
			
		||||
 *   communication is data to the display memory or a command to the LCD
 | 
			
		||||
 *   controller. High = data, low = command
 | 
			
		||||
 * DISPLAY_RESET - Reset signal to the OLED display, active low. Used during
 | 
			
		||||
 *   initialization of the display.
 | 
			
		||||
 * DISPLAY_SS - SPI slave select signal, must be held low during SPI
 | 
			
		||||
 *   communication.
 | 
			
		||||
 * SPI_MOSI - SPI master out, slave in signal. Used to write data to the
 | 
			
		||||
 *   display
 | 
			
		||||
 * SPI_SCK SPI - clock signal, generated by the master.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Included Files
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#include <nuttx/config.h>
 | 
			
		||||
 | 
			
		||||
#include <debug.h>
 | 
			
		||||
 | 
			
		||||
#include <nuttx/board.h>
 | 
			
		||||
#include <nuttx/spi/spi.h>
 | 
			
		||||
#include <nuttx/lcd/lcd.h>
 | 
			
		||||
#include <nuttx/lcd/ssd1306.h>
 | 
			
		||||
 | 
			
		||||
#include "sam_port.h"
 | 
			
		||||
#include "sam_spi.h"
 | 
			
		||||
 | 
			
		||||
#include "samd21-xplained.h"
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_SAMD21_XPLAINED_OLED1MODULE
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Pre-processor Definitions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/* Configuration ************************************************************/
 | 
			
		||||
 | 
			
		||||
/* The pin configurations here require that SPI1 is selected */
 | 
			
		||||
 | 
			
		||||
#ifndef CONFIG_LCD_SSD1306
 | 
			
		||||
#  error "The OLED driver requires CONFIG_LCD_SSD1306 in the configuration"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifndef CONFIG_LCD_UG2832HSWEG04
 | 
			
		||||
#  error "The OLED driver requires CONFIG_LCD_UG2832HSWEG04 in the configuration"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifndef SAMD2L2_HAVE_SPI0
 | 
			
		||||
#  error "The OLED driver requires SAMD2L2_HAVE_SPI0 in the configuration"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifndef CONFIG_SPI_CMDDATA
 | 
			
		||||
#  error "The OLED driver requires CONFIG_SPI_CMDDATA in the configuration"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Public Functions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: board_graphics_setup
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   Called by NX initialization logic to configure the OLED.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
FAR struct lcd_dev_s *board_graphics_setup(unsigned int devno)
 | 
			
		||||
{
 | 
			
		||||
  FAR struct spi_dev_s *spi;
 | 
			
		||||
  FAR struct lcd_dev_s *dev;
 | 
			
		||||
 | 
			
		||||
  /* Configure the OLED PORTs. This initial configuration is RESET low,
 | 
			
		||||
   * putting the OLED into reset state.
 | 
			
		||||
   */
 | 
			
		||||
 | 
			
		||||
  sam_configport(PORT_OLED_RST);
 | 
			
		||||
 | 
			
		||||
  /* Wait a bit then release the OLED from the reset state */
 | 
			
		||||
 | 
			
		||||
  up_mdelay(20);
 | 
			
		||||
  sam_portwrite(PORT_OLED_RST, true);
 | 
			
		||||
 | 
			
		||||
  /* Get the SPI1 port interface */
 | 
			
		||||
 | 
			
		||||
  spi = sam_spibus_initialize(OLED_CSNO);
 | 
			
		||||
  if (!spi)
 | 
			
		||||
    {
 | 
			
		||||
      lcderr("ERROR: Failed to initialize SPI port 1\n");
 | 
			
		||||
    }
 | 
			
		||||
  else
 | 
			
		||||
    {
 | 
			
		||||
      /* Bind the SPI port to the OLED */
 | 
			
		||||
 | 
			
		||||
      dev = ssd1306_initialize(spi, NULL, devno);
 | 
			
		||||
      if (!dev)
 | 
			
		||||
        {
 | 
			
		||||
          lcderr("ERROR: Failed to bind SPI port 1 to OLED %d\n", devno);
 | 
			
		||||
        }
 | 
			
		||||
     else
 | 
			
		||||
        {
 | 
			
		||||
          lcdinfo("Bound SPI port 1 to OLED %d\n", devno);
 | 
			
		||||
 | 
			
		||||
          /* And turn the OLED on */
 | 
			
		||||
 | 
			
		||||
          dev->setpower(dev, CONFIG_LCD_MAXPOWER);
 | 
			
		||||
          return dev;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  return NULL;
 | 
			
		||||
}
 | 
			
		||||
#endif /* CONFIG_SAMD21_XPLAINED_OLED1MODULE */
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,107 @@
 | 
			
		|||
/****************************************************************************
 | 
			
		||||
 * boards/arm/samd2l2/samd21-xplained/src/sam_userleds.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.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/* 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 STATUS 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.  Otherwise, the LED can be controlled from user
 | 
			
		||||
 * applications using the logic in this file.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Included Files
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#include <nuttx/config.h>
 | 
			
		||||
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
#include <stdbool.h>
 | 
			
		||||
#include <debug.h>
 | 
			
		||||
 | 
			
		||||
#include <arch/board/board.h>
 | 
			
		||||
 | 
			
		||||
#include "sam_port.h"
 | 
			
		||||
#include "samd21-xplained.h"
 | 
			
		||||
 | 
			
		||||
#ifndef CONFIG_ARCH_LEDS
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Public Functions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: board_userled_initialize
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   If CONFIG_ARCH_LEDS is defined, then NuttX will control the on-board
 | 
			
		||||
 *   LEDs.  If CONFIG_ARCH_LEDS is not defined, then the
 | 
			
		||||
 *   board_userled_initialize() is available to initialize the LED from user
 | 
			
		||||
 *   application logic.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
uint32_t board_userled_initialize(void)
 | 
			
		||||
{
 | 
			
		||||
  sam_configport(PORT_STATUS_LED);
 | 
			
		||||
  return BOARD_NLEDS;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: board_userled
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   If CONFIG_ARCH_LEDS is defined, then NuttX will control the on-board
 | 
			
		||||
 *  LEDs.  If CONFIG_ARCH_LEDS is not defined, then the board_userled() is
 | 
			
		||||
 *  available to control the LED from user application logic.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
void board_userled(int led, bool ledon)
 | 
			
		||||
{
 | 
			
		||||
  if (led == BOARD_STATUS_LED)
 | 
			
		||||
    {
 | 
			
		||||
      sam_portwrite(PORT_STATUS_LED, !ledon);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: board_userled_all
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   If CONFIG_ARCH_LEDS is defined, then NuttX will control the on-board
 | 
			
		||||
 *   LEDs.
 | 
			
		||||
 *   If CONFIG_ARCH_LEDS is not defined, then the board_userled_all() is
 | 
			
		||||
 *   available to control the LED from user application logic.  NOTE:  since
 | 
			
		||||
 *   there is only a single LED on-board, this is function isn't very useful.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
void board_userled_all(uint32_t ledset)
 | 
			
		||||
{
 | 
			
		||||
  board_userled(BOARD_STATUS_LED, (ledset & BOARD_STATUS_LED_BIT) != 0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif /* !CONFIG_ARCH_LEDS */
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,255 @@
 | 
			
		|||
/****************************************************************************
 | 
			
		||||
 * boards/arm/samd2l2/samd21-xplained/src/samd21-xplained.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_SAMD21_XPLAINED_SRC_SAMD21_XPLAINED_H
 | 
			
		||||
#define __BOARDS_ARM_SAMD2L2_SAMD21_XPLAINED_SRC_SAMD21_XPLAINED_H
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Included Files
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#include <nuttx/config.h>
 | 
			
		||||
#include <nuttx/compiler.h>
 | 
			
		||||
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
 | 
			
		||||
#include <arch/irq.h>
 | 
			
		||||
#include <nuttx/irq.h>
 | 
			
		||||
 | 
			
		||||
#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 | \
 | 
			
		||||
                         PORTB | PORT_PIN30)
 | 
			
		||||
 | 
			
		||||
/* Mechanical buttons:
 | 
			
		||||
 *
 | 
			
		||||
 * The SAMD21 Xplained Pro contains two mechanical buttons. One button is the
 | 
			
		||||
 * RESET button connected to the SAMD21 reset line and the other is a generic
 | 
			
		||||
 * user configurable button.
 | 
			
		||||
 * When a button is pressed it will drive the I/O line to GND.
 | 
			
		||||
 *
 | 
			
		||||
 *   PA15 SW0
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define PORT_SW0      (PORT_INTERRUPT | PORT_PULL_UP | PORTA | PORT_PIN15)
 | 
			
		||||
#define IRQ_SW0       SAM_IRQ_PA15
 | 
			
		||||
 | 
			
		||||
/* I/O1
 | 
			
		||||
 *
 | 
			
		||||
 * Support for the microSD card slot on the I/O1 module.  The I/O1 requires
 | 
			
		||||
 * SPI support and two PORTs.    These the PORTs will vary if the I/O1
 | 
			
		||||
 * is installed on the EXT1 or EXT2 connector:
 | 
			
		||||
 *
 | 
			
		||||
 *   --- ------------------ ---------------------- --------------------------
 | 
			
		||||
 *   PIN EXT1               EXT2                   Description
 | 
			
		||||
 *   --- ------------------ ---------------------- --------------------------
 | 
			
		||||
 *   15 PA05 SERCOM0 PAD[1] 15 PA17 SERCOM1 PAD[1]  Active low chip select
 | 
			
		||||
 *           SPI SS                 SPI SS          OUTPUT, pulled high on
 | 
			
		||||
 *                                                  board.
 | 
			
		||||
 *   --- ------------------ ---------------------- --------------------------
 | 
			
		||||
 *   10 PB05 PORT           10 PB15 PORT            Active low card detect
 | 
			
		||||
 *                                                  INPUT, must use internal
 | 
			
		||||
 *                                                  pull-up.
 | 
			
		||||
 *   --- ------------------ ---------------------- --------------------------
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_SAMD21_XPLAINED_IOMODULE
 | 
			
		||||
 | 
			
		||||
#  ifndef SAMD2L2_HAVE_SPI0
 | 
			
		||||
#    error SAMD2L2_HAVE_SPI0 is required to use the I/O1 module
 | 
			
		||||
#  endif
 | 
			
		||||
 | 
			
		||||
#  if defined(CONFIG_SAMD21_XPLAINED_IOMODULE_EXT1)
 | 
			
		||||
 | 
			
		||||
#    if defined(CONFIG_SAMD21_XPLAINED_OLED1MODULE) && \
 | 
			
		||||
        defined(CONFIG_SAMD21_XPLAINED_OLED1MODULE_EXT1)
 | 
			
		||||
#      error I/O1 and OLED1 modules cannot both reside in EXT1
 | 
			
		||||
#    endif
 | 
			
		||||
 | 
			
		||||
#    define PORT_SD_CD (PORT_INTERRUPT | PORT_INT_CHANGE | PORT_PULL_UP | \
 | 
			
		||||
                        PORTB | PORT_PIN5)
 | 
			
		||||
 | 
			
		||||
#    define PORT_SD_CS (PORT_OUTPUT | PORT_PULL_NONE | PORT_OUTPUT_SET | \
 | 
			
		||||
                        PORTA | PORT_PIN5)
 | 
			
		||||
 | 
			
		||||
#  elif defined(CONFIG_SAMD21_XPLAINED_IOMODULE_EXT2)
 | 
			
		||||
 | 
			
		||||
#    if defined(CONFIG_SAMD21_XPLAINED_OLED1MODULE) && \
 | 
			
		||||
        defined(CONFIG_SAMD21_XPLAINED_OLED1MODULE_EXT2)
 | 
			
		||||
#      error I/O1 and OLED1 modules cannot both reside in EXT2
 | 
			
		||||
#    endif
 | 
			
		||||
 | 
			
		||||
#    define PORT_SD_CD (PORT_INTERRUPT | PORT_INT_CHANGE | PORT_PULL_UP | \
 | 
			
		||||
                        PORTB | PORT_PIN15)
 | 
			
		||||
 | 
			
		||||
#    define PORT_SD_CS (PORT_OUTPUT | PORT_PULL_NONE | PORT_OUTPUT_SET | \
 | 
			
		||||
                        PORTA | PORT_PIN17)
 | 
			
		||||
 | 
			
		||||
#  else
 | 
			
		||||
#    error Which connector is the I/O1 module installed in?
 | 
			
		||||
#  endif
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/* OLED1
 | 
			
		||||
 *
 | 
			
		||||
 * Support for the microSD card slot on the I/O1 module.
 | 
			
		||||
 * The I/O1 requires SPI support and three output PORTs.
 | 
			
		||||
 * These the PORTs will vary if the OLED1 is installed on the EXT1
 | 
			
		||||
 * or EXT2 connector:
 | 
			
		||||
 *
 | 
			
		||||
 *
 | 
			
		||||
 *   PIN EXT1                EXT2                 Description
 | 
			
		||||
 *   --- ------------------- -------------------- ---------------------------
 | 
			
		||||
 *   5   PB06 PORT           PA20 PORT            DATA_CMD_SEL
 | 
			
		||||
 *   10  PB05 PORT           PB15 PORT            DISPLAY_RESET. Active low.
 | 
			
		||||
 *   15  PA05 SERCOM0 PAD[1] PA17 SERCOM1 PAD[1]  DISPLAY_SS.  Active low.
 | 
			
		||||
 *            SPI SS              SPI SS
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_SAMD21_XPLAINED_OLED1MODULE
 | 
			
		||||
 | 
			
		||||
#  ifndef SAMD2L2_HAVE_SPI0
 | 
			
		||||
#    error SAMD2L2_HAVE_SPI0 is required to use the OLED1 module
 | 
			
		||||
#  endif
 | 
			
		||||
 | 
			
		||||
#  ifndef CONFIG_SPI_CMDDATA
 | 
			
		||||
#    error CONFIG_SPI_CMDDATA is required to use the OLED1 module
 | 
			
		||||
#  endif
 | 
			
		||||
 | 
			
		||||
#  ifndef CONFIG_LCD_SSD1306
 | 
			
		||||
#    error CONFIG_LCD_SSD1306 is required to use the OLED1 module
 | 
			
		||||
#  endif
 | 
			
		||||
 | 
			
		||||
#  ifndef CONFIG_LCD_UG2832HSWEG04
 | 
			
		||||
#    error CONFIG_LCD_UG2832HSWEG04 is required to use the OLED1 module
 | 
			
		||||
#  endif
 | 
			
		||||
 | 
			
		||||
#  if defined(CONFIG_SAMD21_XPLAINED_OLED1MODULE_EXT1)
 | 
			
		||||
 | 
			
		||||
#    if defined(CONFIG_SAMD21_XPLAINED_IOMODULE) && \
 | 
			
		||||
        defined(CONFIG_SAMD21_XPLAINED_IOMODULE_EXT1)
 | 
			
		||||
#      error OLED1 and I/O1 modules cannot both reside in EXT1
 | 
			
		||||
#    endif
 | 
			
		||||
 | 
			
		||||
#    define PORT_OLED_DATA (PORT_OUTPUT | PORT_PULL_NONE | PORT_OUTPUT_CLEAR | \
 | 
			
		||||
                            PORTB | PORT_PIN6)
 | 
			
		||||
#    define PORT_OLED_RST  (PORT_OUTPUT | PORT_PULL_NONE | PORT_OUTPUT_CLEAR | \
 | 
			
		||||
                            PORTB | PORT_PIN5)
 | 
			
		||||
#    define PORT_OLED_CS   (PORT_OUTPUT | PORT_PULL_NONE | PORT_OUTPUT_SET | \
 | 
			
		||||
                            PORTA | PORT_PIN5)
 | 
			
		||||
 | 
			
		||||
#  elif defined(CONFIG_SAMD21_XPLAINED_OLED1MODULE_EXT2)
 | 
			
		||||
 | 
			
		||||
#    if defined(CONFIG_SAMD21_XPLAINED_IOMODULE) && \
 | 
			
		||||
        defined(CONFIG_SAMD21_XPLAINED_IOMODULE_EXT2)
 | 
			
		||||
#      error OLED1 and I/O1 modules cannot both reside in EXT2
 | 
			
		||||
#    endif
 | 
			
		||||
 | 
			
		||||
#    define PORT_OLED_DATA (PORT_OUTPUT | PORT_PULL_NONE | PORT_OUTPUT_CLEAR | \
 | 
			
		||||
                            PORTA | PORT_PIN20)
 | 
			
		||||
#    define PORT_OLED_RST  (PORT_OUTPUT | PORT_PULL_NONE | PORT_OUTPUT_CLEAR | \
 | 
			
		||||
                            PORTB | PORT_PIN15)
 | 
			
		||||
#    define PORT_OLED_CS   (PORT_OUTPUT | PORT_PULL_NONE | PORT_OUTPUT_SET | \
 | 
			
		||||
                            PORTA | PORT_PIN17)
 | 
			
		||||
 | 
			
		||||
#  else
 | 
			
		||||
#    error Which connector is the OLED1 module installed in?
 | 
			
		||||
#  endif
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined(CONFIG_LCD_UG2864AMBAG01) || defined(CONFIG_LCD_UG2864HSWEG01)
 | 
			
		||||
#    define PORT_SD_CS (PORT_OUTPUT | PORT_PULL_NONE | PORT_OUTPUT_SET | \
 | 
			
		||||
                        PORTB | PORT_PIN11) /* REVISIT */
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Public Types
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Public Data
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#ifndef __ASSEMBLY__
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Public Functions Definitions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: sam_spidev_initialize
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   Called to configure SPI chip select PORT pins for the SAM3U-EK board.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
void weak_function sam_spidev_initialize(void);
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: sam_sdinitialize
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   Initialize the SPI-based SD card.
 | 
			
		||||
 *   Requires CONFIG_SAMD21_XPLAINED_IOMODULE=y,
 | 
			
		||||
 *   CONFIG_DISABLE_MOUNTPOINT=n,
 | 
			
		||||
 *   CONFIG_MMCSD=y, and the appropriate SERCOM SPI port enabled.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_SAMD21_XPLAINED_IOMODULE
 | 
			
		||||
int sam_sdinitialize(int port, int minor);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif /* __ASSEMBLY__ */
 | 
			
		||||
#endif /* __BOARDS_ARM_SAMD2L2_SAMD21_XPLAINED_SRC_SAMD21_XPLAINED_H */
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,115 @@
 | 
			
		|||
#
 | 
			
		||||
# For a description of the syntax of this configuration file,
 | 
			
		||||
# see the file kconfig-language.txt in the NuttX tools repository.
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
if ARCH_BOARD_SAML21_XPLAINED
 | 
			
		||||
 | 
			
		||||
menu "CPU Clock Configuration"
 | 
			
		||||
 | 
			
		||||
choice
 | 
			
		||||
	prompt "OSC16M Frequency"
 | 
			
		||||
	default SAML21_XPLAINED_OSC16M_4MHZ
 | 
			
		||||
 | 
			
		||||
config SAML21_XPLAINED_OSC16M_4MHZ
 | 
			
		||||
	bool "4 MHz"
 | 
			
		||||
 | 
			
		||||
config SAML21_XPLAINED_OSC16M_8MHZ
 | 
			
		||||
	bool "8 MHz"
 | 
			
		||||
 | 
			
		||||
config SAML21_XPLAINED_OSC16M_12MHZ
 | 
			
		||||
	bool "12 MHz"
 | 
			
		||||
 | 
			
		||||
config SAML21_XPLAINED_OSC16M_16MHZ
 | 
			
		||||
	bool "16 MHz"
 | 
			
		||||
 | 
			
		||||
endchoice # OSC16M Frequency
 | 
			
		||||
 | 
			
		||||
config SAML21_XPLAINED_XOSC32K
 | 
			
		||||
	bool "Enable XOSC32K"
 | 
			
		||||
	default n
 | 
			
		||||
 | 
			
		||||
config SAML21_XPLAINED_DFLL
 | 
			
		||||
	bool "Use DFLL"
 | 
			
		||||
	default n
 | 
			
		||||
 | 
			
		||||
choice
 | 
			
		||||
	prompt "DFLL Clock Source"
 | 
			
		||||
	default SAML21_XPLAINED_DFLL_OSC16MSRC
 | 
			
		||||
	depends on SAML21_XPLAINED_DFLL
 | 
			
		||||
 | 
			
		||||
config SAML21_XPLAINED_DFLL_OSC16MSRC
 | 
			
		||||
	bool "OSC16M"
 | 
			
		||||
 | 
			
		||||
config SAML21_XPLAINED_DFLL_XOSC32KSRC
 | 
			
		||||
	bool "XOSCK32K"
 | 
			
		||||
	select SAML21_XPLAINED_XOSC32K
 | 
			
		||||
 | 
			
		||||
endchoice # DFLL Clock Source
 | 
			
		||||
 | 
			
		||||
choice
 | 
			
		||||
	prompt "DFLL Operating Mode"
 | 
			
		||||
	default SAML21_XPLAINED_DFLL_OPENLOOP
 | 
			
		||||
	depends on SAML21_XPLAINED_DFLL
 | 
			
		||||
 | 
			
		||||
config SAML21_XPLAINED_DFLL_OPENLOOP
 | 
			
		||||
	bool "DFLL Open Loop Mode"
 | 
			
		||||
 | 
			
		||||
config SAML21_XPLAINED_DFLL_CLOSEDLOOP
 | 
			
		||||
	bool "DFLL Closed Loop Mode"
 | 
			
		||||
 | 
			
		||||
config SAML21_XPLAINED_DFLL_RECOVERY
 | 
			
		||||
	bool "DFLL USB Recovery Mode"
 | 
			
		||||
	depends on EXPERIMENTAL
 | 
			
		||||
 | 
			
		||||
endchoice # DLL Operating Mode
 | 
			
		||||
endmenu # CPU Clock Configuration
 | 
			
		||||
 | 
			
		||||
menu "SAML21 Xplained Pro Modules"
 | 
			
		||||
 | 
			
		||||
config SAML21_XPLAINED_IOMODULE
 | 
			
		||||
	bool "I/O1 Module"
 | 
			
		||||
	default n
 | 
			
		||||
	---help---
 | 
			
		||||
		The I/O 1 module is attached.  This module provides an MMC/SD card
 | 
			
		||||
		slot.
 | 
			
		||||
 | 
			
		||||
if SAML21_XPLAINED_IOMODULE
 | 
			
		||||
 | 
			
		||||
choice
 | 
			
		||||
	prompt "I/O1 Module Location"
 | 
			
		||||
	default SAML21_XPLAINED_IOMODULE_EXT1
 | 
			
		||||
 | 
			
		||||
config SAML21_XPLAINED_IOMODULE_EXT1
 | 
			
		||||
	bool "EXT1"
 | 
			
		||||
 | 
			
		||||
config SAML21_XPLAINED_IOMODULE_EXT2
 | 
			
		||||
	bool "EXT2"
 | 
			
		||||
 | 
			
		||||
endchoice
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
config SAML21_XPLAINED_OLED1MODULE
 | 
			
		||||
	bool "OLED1 Module"
 | 
			
		||||
	default n
 | 
			
		||||
	---help---
 | 
			
		||||
		The OLED 1 module is attached.  This module provides an OLED plus 3
 | 
			
		||||
		additional switches and 3 additional LEDs.
 | 
			
		||||
 | 
			
		||||
if SAML21_XPLAINED_OLED1MODULE
 | 
			
		||||
 | 
			
		||||
choice
 | 
			
		||||
	prompt "OLED1 Module Location"
 | 
			
		||||
	default SAML21_XPLAINED_OLED1MODULE_EXT1
 | 
			
		||||
 | 
			
		||||
config SAML21_XPLAINED_OLED1MODULE_EXT1
 | 
			
		||||
	bool "EXT1"
 | 
			
		||||
 | 
			
		||||
config SAML21_XPLAINED_OLED1MODULE_EXT2
 | 
			
		||||
	bool "EXT2"
 | 
			
		||||
 | 
			
		||||
endchoice
 | 
			
		||||
endif
 | 
			
		||||
endmenu
 | 
			
		||||
 | 
			
		||||
endif # ARCH_BOARD_SAML21_XPLAINED
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,895 @@
 | 
			
		|||
README
 | 
			
		||||
======
 | 
			
		||||
 | 
			
		||||
This README discusses issues unique to NuttX configurations for the
 | 
			
		||||
Atmel SAML21 Xplained Pro development board.  This board features the
 | 
			
		||||
ATSAML21J18A MCU.
 | 
			
		||||
 | 
			
		||||
Contents
 | 
			
		||||
========
 | 
			
		||||
 | 
			
		||||
  - STATUS/ISSUES
 | 
			
		||||
  - Modules
 | 
			
		||||
  - Development Environment
 | 
			
		||||
  - GNU Toolchain Options
 | 
			
		||||
  - IDEs
 | 
			
		||||
  - NuttX EABI "buildroot" Toolchain
 | 
			
		||||
  - LEDs and Buttons
 | 
			
		||||
  - Serial Consoles
 | 
			
		||||
  - Atmel Studio 6.1
 | 
			
		||||
  - JTAG
 | 
			
		||||
  - SAML21 Xplained Pro-specific Configuration Options
 | 
			
		||||
  - Configurations
 | 
			
		||||
 | 
			
		||||
STATUS/ISSUES
 | 
			
		||||
=============
 | 
			
		||||
 | 
			
		||||
  - Since this port is a leverage of the SAMD20 Xplained port, some of the
 | 
			
		||||
    STATUS/ISSUES in the SAMD20 Xplained README.txt may apply here as well.
 | 
			
		||||
 | 
			
		||||
  - 2015-5-26: The basic port is running at 48MHz (using 32.768 XTAL input
 | 
			
		||||
    and the digital frequency locked loop).  The basic NuttShell (NSH)
 | 
			
		||||
    configuration is working well with the serial console provided by
 | 
			
		||||
    SERCOM4 as 115200 8N1.
 | 
			
		||||
 | 
			
		||||
  - 2015-6-14: Added a DMAC driver.  There is no way to verify it at present
 | 
			
		||||
    and, hence, depends upon CONFIG_EXPERIMENTAL=y
 | 
			
		||||
 | 
			
		||||
Modules
 | 
			
		||||
=======
 | 
			
		||||
 | 
			
		||||
  There are several I/O modules available that will work with the SAML21
 | 
			
		||||
  Xplained Pro Starter Kit:
 | 
			
		||||
 | 
			
		||||
  1) I/O1   - An MMC/SD card slot, PWM LED control, ADC light sensor, USART
 | 
			
		||||
             loopback, TWI AT30TSE758 Temperature sensor.
 | 
			
		||||
  2) OLED1  - An OLED plus 3 additional switches and 3 additional LEDs
 | 
			
		||||
  3) PROTO1 - A prototyping board with logic on board (other than power-
 | 
			
		||||
              related logic).
 | 
			
		||||
  4) And others.  See http://www.atmel.com/products/microcontrollers/avr/xplained.aspx
 | 
			
		||||
 | 
			
		||||
  Some of these are discussed further below.
 | 
			
		||||
 | 
			
		||||
  I/O1
 | 
			
		||||
  ----
 | 
			
		||||
    The primary function of this module is to provide SD card support, but
 | 
			
		||||
    the full list of modules features include:
 | 
			
		||||
 | 
			
		||||
    - microSD card connector (SPI interface)
 | 
			
		||||
    - PWM (LED control)
 | 
			
		||||
    - ADC (light sensor)
 | 
			
		||||
    - USART loopback
 | 
			
		||||
    - TWI AT30TSE758 Temperature sensor with EEPROM
 | 
			
		||||
 | 
			
		||||
    SPI is available on two of the SAML21 Xplained connectors, EXT1 and EXT2.
 | 
			
		||||
    They mate with the I/O1 connector as indicated in this table.
 | 
			
		||||
 | 
			
		||||
    I/O1 CONNECTOR
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    I/O1              EXT1                   EXT2                   Other use of either pin
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    1  ID             1                      1                      Communication line to ID chip on
 | 
			
		||||
                                                                    extension board.
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    2  GND            2       GND            2  GND
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    3  LIGHT_SENSOR   3  PB05 AIN[13]        3  PA10 AIN[18]
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    4  LP_OUT         4  PA03 AIN[1]         4  PA11 AIN[19]
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    5  GPIO1          5  PB06 GPIO           5  PA20 GPIO
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    6  GPIO2          6  PB07 GPIO           6  PA21 GPIO
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    7  LED            7  PA12 TCC2/WO[0]     7  PB12 TC4/WO[0]
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    8  LP_IN          8  PA13 TCC2/WO[1]     8  PB13 TC4/WO[1]
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    9  TEMP_ALERT     9  PB04 EXTINT[4]      9  PB14 EXTINT[14]
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    10 microSD_DETECT 10 PA02 GPIO           10 PB15 GPIO
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    11 TWI SDA        11 PA08 SERCOM2 PAD[0] 11 PA08 SERCOM2 PAD[0] EXT1, EXT2, EXT3 and EDBG
 | 
			
		||||
                              I²C SDA                I²C SDA
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    12 TWI SCL        12 PA09 SERCOM2 PAD[1] 12 PA09 SERCOM2 PAD[1] EXT2, EXT3 and EDBG
 | 
			
		||||
                              I²C SCL                I²C SCL
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    13 USART RX       13 PB09 SERCOM4 PAD[1] 13 PA19 SERCOM1 PAD[3] The SERCOM4 module is shared between
 | 
			
		||||
                              USART RX               USART RX       EXT1, 2 and 3 USART's, but uses
 | 
			
		||||
                                                                    different pins
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    14 USART TX       14 PB08 SERCOM4 PAD[0] 14 PA18 SERCOM1 PAD[2] The SERCOM4 module is shared between
 | 
			
		||||
                              USART TX               USART TX       EXT1, 2 and 3 USART's, but uses
 | 
			
		||||
                                                                    different pins
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    15 microSD_SS     15 PA05 SERCOM0 PAD[1] 15 PA17 GPIO
 | 
			
		||||
                              SPI SS
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    16 SPI_MOSI       16 PA06 SERCOM0 PAD[2] 16 PB22 SERCOM5 PAD[2]
 | 
			
		||||
                              SPI MOSI               SPI MOSI
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    17 SPI_MISO       17 PA04 SERCOM0 PAD[0] 17 PB16 SERCOM5 PAD[0]
 | 
			
		||||
                              SPI MISO               SPI MISO
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    18 SPI_SCK        18 PA07 SERCOM0 PAD[3] 18 PB23 SERCOM5 PAD[3]
 | 
			
		||||
                              SPI SCK                SPI SCK
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    19 GND            19      GND               GND
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    20 VCC            20      VCC               VCC
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
 | 
			
		||||
    The mapping between the I/O1 pins and the SD connector are shown in the
 | 
			
		||||
    following table.
 | 
			
		||||
 | 
			
		||||
    SD Card Connection
 | 
			
		||||
    ------------------
 | 
			
		||||
    I/O1 SD   PIN Description
 | 
			
		||||
    ---- ---- --- -------------------------------------------------
 | 
			
		||||
         D2   1   Data line 2 (not used)
 | 
			
		||||
    15   D3   2   Data line 3. Active low chip select, pulled high
 | 
			
		||||
    16   CMD  3   Command line, connected to SPI_MOSI.
 | 
			
		||||
    20   VDD  4
 | 
			
		||||
    18   CLK  5   Clock line, connected to SPI_SCK.
 | 
			
		||||
    2/19 GND  6
 | 
			
		||||
    17   D0   7   Data line 0, connected to SPI_MISO.
 | 
			
		||||
         D1   8   Data line 1 (not used)
 | 
			
		||||
    10   SW_A 9   Card detect
 | 
			
		||||
    2/19 SW_B 10  GND
 | 
			
		||||
 | 
			
		||||
    Card Detect
 | 
			
		||||
    -----------
 | 
			
		||||
    When a microSD card is put into the connector SW_A and SW_B are short-
 | 
			
		||||
    circuited. SW_A is connected to the microSD_DETECT signal. To use this
 | 
			
		||||
    as a card indicator remember to enable internal pullup in the target
 | 
			
		||||
    device.
 | 
			
		||||
 | 
			
		||||
    GPIOs
 | 
			
		||||
    -----
 | 
			
		||||
    So all that is required to connect the SD is configure the SPI
 | 
			
		||||
 | 
			
		||||
    --- ------------------ ---------------------- -------------------------------------
 | 
			
		||||
    PIN EXT1               EXT2                   Description
 | 
			
		||||
    --- ------------------ ---------------------- -------------------------------------
 | 
			
		||||
    15 PA05 SERCOM0 PAD[1] 15 PA17 GPIO            Active low chip select OUTPUT, pulled
 | 
			
		||||
            SPI SS                                 high on board.
 | 
			
		||||
    --- ------------------ ---------------------- -------------------------------------
 | 
			
		||||
    10 PA02 GPIO           10 PB15 GPIO            Active low card detect INPUT, must
 | 
			
		||||
                                                   use internal pull-up.
 | 
			
		||||
    --- ------------------ ---------------------- -------------------------------------
 | 
			
		||||
 | 
			
		||||
    Configuration Options:
 | 
			
		||||
    ----------------------
 | 
			
		||||
      CONFIG_SAML21_XPLAINED_IOMODULE=y      : Informs the system that the
 | 
			
		||||
                                              I/O1 module is installed
 | 
			
		||||
      CONFIG_SAML21_XPLAINED_IOMODULE_EXT1=y : The module is installed in EXT1
 | 
			
		||||
      CONFIG_SAML21_XPLAINED_IOMODULE_EXT2=y : The mdoule is installed in EXT2
 | 
			
		||||
 | 
			
		||||
    See the set-up in the discussion of the nsh configuration below for other
 | 
			
		||||
    required configuration options.
 | 
			
		||||
 | 
			
		||||
    NOTE: As of this writing, only the SD card slot is supported in the I/O1
 | 
			
		||||
    module.
 | 
			
		||||
 | 
			
		||||
  OLED1
 | 
			
		||||
  -----
 | 
			
		||||
    This module provides an OLED plus 3 additional switches and 3 additional
 | 
			
		||||
    LEDs.
 | 
			
		||||
 | 
			
		||||
    OLED1 CONNECTOR
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    OLED1             EXT1                   EXT2                   Other use of either pin
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    1  ID             1                      1                      Communication line to ID chip on
 | 
			
		||||
                                                                    extension board.
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    2  GND            2       GND            2  GND
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    3  BUTTON2        3  PB05 AIN[13]        3  PA10 AIN[18]
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    4  BUTTON3        4  PA03 AIN[1]         4  PA11 AIN[19]
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    5  DATA_CMD_SEL   5  PB06 GPIO           5  PA20 GPIO
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    6  LED3           6  PB07 GPIO           6  PA21 GPIO
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    7  LED1           7  PA12 TCC2/WO[0]     7  PB12 TC4/WO[0]
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    8  LED2           8  PA13 TCC2/WO[1]     8  PB13 TC4/WO[1]
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    9  BUTTON1        9  PB04 EXTINT[4]      9  PB14 EXTINT[14]
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    10 DISPLAY_RESET  10 PA02 GPIO           10 PB15 GPIO
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    11 N/C            11 PA08 SERCOM2 PAD[0] 11 PA08 SERCOM2 PAD[0] EXT1, EXT2, EXT3 and EDBG
 | 
			
		||||
                              I²C SDA                I²C SDA
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    12 N/C            12 PA09 SERCOM2 PAD[1] 12 PA09 SERCOM2 PAD[1] EXT2, EXT3 and EDBG
 | 
			
		||||
                              I²C SCL                I²C SCL
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    13 N/C            13 PB09 SERCOM4 PAD[1] 13 PA19 SERCOM1 PAD[3] The SERCOM4 module is shared between
 | 
			
		||||
                              USART RX               USART RX       EXT1, 2 and 3 USART's, but uses
 | 
			
		||||
                                                                    different pins
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    14 N/C            14 PB08 SERCOM4 PAD[0] 14 PA18 SERCOM1 PAD[2] The SERCOM4 module is shared between
 | 
			
		||||
                              USART TX               USART TX       EXT1, 2 and 3 USART's, but uses
 | 
			
		||||
                                                                    different pins
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    15 DISPLAY_SS     15 PA05 SERCOM0 PAD[1] 15 PA17 GPIO
 | 
			
		||||
                              SPI SS
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    16 SPI_MOSI       16 PA06 SERCOM0 PAD[2] 16 PB22 SERCOM5 PAD[2]
 | 
			
		||||
                              SPI MOSI               SPI MOSI
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    17 N/C            17 PA04 SERCOM0 PAD[0] 17 PB16 SERCOM5 PAD[0]
 | 
			
		||||
                              SPI MISO               SPI MISO
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    18 SPI_SCK        18 PA07 SERCOM0 PAD[3] 18 PB23 SERCOM5 PAD[3]
 | 
			
		||||
                              SPI SCK                SPI SCK
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    19 GND            19      GND               GND
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
    20 VCC            20      VCC               VCC
 | 
			
		||||
    ----------------- ---------------------- ---------------------- ------------------------------------
 | 
			
		||||
 | 
			
		||||
    Configuration Options:
 | 
			
		||||
    ----------------------
 | 
			
		||||
      CONFIG_SAML21_XPLAINED_OLED1MODULE=y      : Informs the system that the
 | 
			
		||||
                                                 I/O1 module is installed
 | 
			
		||||
      CONFIG_SAML21_XPLAINED_OLED1MODULE_EXT1=y : The module is installed in EXT1
 | 
			
		||||
      CONFIG_SAML21_XPLAINED_OLED1MODULE_EXT2=y : The mdoule is installed in EXT2
 | 
			
		||||
 | 
			
		||||
    See the set-up in the discussion of the nsh configuration below for other
 | 
			
		||||
    required configuration options.
 | 
			
		||||
 | 
			
		||||
  PROTO1
 | 
			
		||||
  ------
 | 
			
		||||
  A prototyping board with logic on board (other than power-related logic).
 | 
			
		||||
  There is no built-in support for the PROTO1 module.
 | 
			
		||||
 | 
			
		||||
Development Environment
 | 
			
		||||
=======================
 | 
			
		||||
 | 
			
		||||
  Either Linux or Cygwin on Windows can be used for the development environment.
 | 
			
		||||
  The source has been built only using the GNU toolchain (see below).  Other
 | 
			
		||||
  toolchains will likely cause problems. Testing was performed using the Cygwin
 | 
			
		||||
  environment.
 | 
			
		||||
 | 
			
		||||
GNU Toolchain Options
 | 
			
		||||
=====================
 | 
			
		||||
 | 
			
		||||
  The NuttX make system can be configured to support the various different
 | 
			
		||||
  toolchain options.  All testing has been conducted using the NuttX buildroot
 | 
			
		||||
  toolchain.  To use alternative toolchain, you simply need to add change of
 | 
			
		||||
  the following configuration options to your .config (or defconfig) file:
 | 
			
		||||
 | 
			
		||||
    CONFIG_ARMV7M_TOOLCHAIN_BUILDROOT=y  : NuttX buildroot under Linux or Cygwin (default)
 | 
			
		||||
    CONFIG_ARMV7M_TOOLCHAIN_GNU_EABIL=y  : Generic GCC ARM EABI toolchain for Linux
 | 
			
		||||
    CONFIG_ARMV7M_TOOLCHAIN_GNU_EABIW=y  : Generic GCC ARM EABI toolchain for Windows
 | 
			
		||||
 | 
			
		||||
  NOTE about Windows native toolchains
 | 
			
		||||
  ------------------------------------
 | 
			
		||||
 | 
			
		||||
  There are basically three kinds of GCC toolchains that can be used:
 | 
			
		||||
 | 
			
		||||
    1. A Linux native toolchain in a Linux environment,
 | 
			
		||||
    2. The buildroot Cygwin tool chain built in the Cygwin environment,
 | 
			
		||||
    3. A Windows native toolchain.
 | 
			
		||||
 | 
			
		||||
  There are several limitations to using a Windows based toolchain (#3) in a
 | 
			
		||||
  Cygwin environment.  The three biggest are:
 | 
			
		||||
 | 
			
		||||
  1. The Windows toolchain cannot follow Cygwin paths.  Path conversions are
 | 
			
		||||
     performed automatically in the Cygwin makefiles using the 'cygpath'
 | 
			
		||||
     utility but you might easily find some new path problems.  If so, check
 | 
			
		||||
     out 'cygpath -w'
 | 
			
		||||
 | 
			
		||||
  2. Windows toolchains cannot follow Cygwin symbolic links.  Many symbolic
 | 
			
		||||
     links are used in NuttX (e.g., include/arch).  The make system works
 | 
			
		||||
     around these problems for the Windows tools by copying directories
 | 
			
		||||
     instead of linking them. But this can also cause some confusion for
 | 
			
		||||
     you:  For example, you may edit a file in a "linked" directory and find
 | 
			
		||||
     that your changes had no effect.  That is because you are building the
 | 
			
		||||
     copy of the file in the "fake" symbolic directory.  If you use a
 | 
			
		||||
     Windows toolchain, you should get in the habit of making like this:
 | 
			
		||||
 | 
			
		||||
       make clean_context all
 | 
			
		||||
 | 
			
		||||
     An alias in your .bashrc file might make that less painful.
 | 
			
		||||
 | 
			
		||||
IDEs
 | 
			
		||||
====
 | 
			
		||||
 | 
			
		||||
  NuttX is built using command-line make.  It can be used with an IDE, but some
 | 
			
		||||
  effort will be required to create the project.
 | 
			
		||||
 | 
			
		||||
  Makefile Build
 | 
			
		||||
  --------------
 | 
			
		||||
  Under Eclipse, it is pretty easy to set up an "empty makefile project" and
 | 
			
		||||
  simply use the NuttX makefile to build the system.  That is almost for free
 | 
			
		||||
  under Linux.  Under Windows, you will need to set up the "Cygwin GCC" empty
 | 
			
		||||
  makefile project in order to work with Windows (Google for "Eclipse Cygwin" -
 | 
			
		||||
  there is a lot of help on the internet).
 | 
			
		||||
 | 
			
		||||
  Native Build
 | 
			
		||||
  ------------
 | 
			
		||||
  Here are a few tips before you start that effort:
 | 
			
		||||
 | 
			
		||||
  1) Select the toolchain that you will be using in your .config file
 | 
			
		||||
  2) Start the NuttX build at least one time from the Cygwin command line
 | 
			
		||||
     before trying to create your project.  This is necessary to create
 | 
			
		||||
     certain auto-generated files and directories that will be needed.
 | 
			
		||||
  3) Set up include paths:  You will need include/, arch/arm/src/sam34,
 | 
			
		||||
     arch/arm/src/common, arch/arm/src/armv7-m, and sched/.
 | 
			
		||||
  4) All assembly files need to have the definition option -D __ASSEMBLY__
 | 
			
		||||
     on the command line.
 | 
			
		||||
 | 
			
		||||
  Startup files will probably cause you some headaches.  The NuttX startup file
 | 
			
		||||
  is arch/arm/src/sam34/sam_vectors.S.  You may need to build NuttX
 | 
			
		||||
  one time from the Cygwin command line in order to obtain the pre-built
 | 
			
		||||
  startup object needed by an IDE.
 | 
			
		||||
 | 
			
		||||
NuttX EABI "buildroot" Toolchain
 | 
			
		||||
================================
 | 
			
		||||
 | 
			
		||||
  A GNU GCC-based toolchain is assumed.  The PATH environment variable should
 | 
			
		||||
  be modified to point to the correct path to the Cortex-M0 GCC toolchain (if
 | 
			
		||||
  different from the default in your PATH variable).
 | 
			
		||||
 | 
			
		||||
  If you have no Cortex-M0 toolchain, one can be downloaded from the NuttX
 | 
			
		||||
  Bitbucket download site (https://bitbucket.org/nuttx/buildroot/downloads/).
 | 
			
		||||
  This GNU toolchain builds and executes in the Linux or Cygwin environment.
 | 
			
		||||
 | 
			
		||||
  1. You must have already configured NuttX in <some-dir>/nuttx.
 | 
			
		||||
 | 
			
		||||
     tools/configure.sh saml21-xplained:<sub-dir>
 | 
			
		||||
 | 
			
		||||
  2. Download the latest buildroot package into <some-dir>
 | 
			
		||||
 | 
			
		||||
  3. unpack the buildroot tarball.  The resulting directory may
 | 
			
		||||
     have versioning information on it like buildroot-x.y.z.  If so,
 | 
			
		||||
     rename <some-dir>/buildroot-x.y.z to <some-dir>/buildroot.
 | 
			
		||||
 | 
			
		||||
  4. cd <some-dir>/buildroot
 | 
			
		||||
 | 
			
		||||
  5. cp boards/cortexm0-eabi-defconfig-4.6.3 .config
 | 
			
		||||
 | 
			
		||||
  6. make oldconfig
 | 
			
		||||
 | 
			
		||||
  7. make
 | 
			
		||||
 | 
			
		||||
  8. Make sure that the PATH variable includes the path to the newly built
 | 
			
		||||
     binaries.
 | 
			
		||||
 | 
			
		||||
  See the file boards/README.txt in the buildroot source tree.  That has more
 | 
			
		||||
  details PLUS some special instructions that you will need to follow if you are
 | 
			
		||||
  building a Cortex-M0 toolchain for Cygwin under Windows.
 | 
			
		||||
 | 
			
		||||
LEDs and Buttons
 | 
			
		||||
================
 | 
			
		||||
 | 
			
		||||
  LED
 | 
			
		||||
  ---
 | 
			
		||||
  There is one yellow LED available on the SAML21 Xplained Pro board that
 | 
			
		||||
  can be turned on and off. The LED can be activated by driving the connected
 | 
			
		||||
  PB10 I/O line to GND.
 | 
			
		||||
 | 
			
		||||
  When CONFIG_ARCH_LEDS is defined in the NuttX configuration, NuttX will
 | 
			
		||||
  control the LED as follows:
 | 
			
		||||
 | 
			
		||||
    SYMBOL              Meaning                 LED0
 | 
			
		||||
    ------------------- ----------------------- ------
 | 
			
		||||
    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 is LED is statically on, NuttX has successfully  booted and is,
 | 
			
		||||
  apparently, running normally.  If LED is flashing at approximately
 | 
			
		||||
  2Hz, then a fatal error has been detected and the system has halted.
 | 
			
		||||
 | 
			
		||||
  Button
 | 
			
		||||
  ------
 | 
			
		||||
  SAM L21 Xplained Pro contains one mechanical button on PA02 that can be
 | 
			
		||||
  controlled by software. When a button is pressed it will drive the I/O
 | 
			
		||||
  line to GND. Note: There is no pull-up resistor connected to the generic
 | 
			
		||||
  user button. Remember to enable the internal pull-up in the SAM L21 to
 | 
			
		||||
  use the button.
 | 
			
		||||
 | 
			
		||||
  QTouch Button
 | 
			
		||||
  -------------
 | 
			
		||||
  To be provided
 | 
			
		||||
 | 
			
		||||
Serial Consoles
 | 
			
		||||
===============
 | 
			
		||||
 | 
			
		||||
  SERCOM0
 | 
			
		||||
  -------
 | 
			
		||||
  SERCOM0 is dedicated for use with SPI at the EXT1 connector
 | 
			
		||||
 | 
			
		||||
  SERCOM1
 | 
			
		||||
  -------
 | 
			
		||||
  SERCOM1 is available as a USART on EXT2 and EXT3
 | 
			
		||||
 | 
			
		||||
    PIN   EXT1 EXT2 EXT3 GPIO Function
 | 
			
		||||
    ----  ---- ---- ---- ------------------
 | 
			
		||||
     13   ---  PA19 PA19 SERCOM1 / USART RX
 | 
			
		||||
     14   ---  PA18 PA18 SERCOM1 / USART TX
 | 
			
		||||
     19   GND  GND  GND  N/A
 | 
			
		||||
     20   VCC  VCC  VCC  N/A
 | 
			
		||||
 | 
			
		||||
  SERCOM2
 | 
			
		||||
  -------
 | 
			
		||||
  SERCOM0 is dedicated for use with I2C at the EXT1, EXT2, and EXT3
 | 
			
		||||
  connectors.
 | 
			
		||||
 | 
			
		||||
  SERCOM3
 | 
			
		||||
  -------
 | 
			
		||||
  SERCOM3 is not available on any EXT connector but is dedicated for
 | 
			
		||||
  use with Virtual COM (see below).
 | 
			
		||||
 | 
			
		||||
  SERCOM4
 | 
			
		||||
  -------
 | 
			
		||||
  SERCOM1 is available as a USART on EXT1
 | 
			
		||||
 | 
			
		||||
    PIN   EXT1 EXT2 EXT3 GPIO Function
 | 
			
		||||
    ----  ---- ---- ---- ------------------
 | 
			
		||||
     13   PB09 ---  ---  SERCOM4 / USART RX
 | 
			
		||||
     14   PB08 ---  ---  SERCOM4 / USART TX
 | 
			
		||||
     19   GND  GND  GND  N/A
 | 
			
		||||
     20   VCC  VCC  VCC  N/A
 | 
			
		||||
 | 
			
		||||
  SERCOM5
 | 
			
		||||
  -------
 | 
			
		||||
 | 
			
		||||
  SERCOM5 is dedicated for use with SPI at the EXT2 and EXT3 connectors
 | 
			
		||||
 | 
			
		||||
  Configuration
 | 
			
		||||
  -------------
 | 
			
		||||
  There are options available in the NuttX configuration to select which
 | 
			
		||||
  connector SERCOM4 is on:  SAML21_XPLAINED_USART4_EXTn, where n=1, 2, or 3.
 | 
			
		||||
 | 
			
		||||
  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 these
 | 
			
		||||
  configurations.  An option is to use the virtual COM port.
 | 
			
		||||
 | 
			
		||||
  Virtual COM Port
 | 
			
		||||
  ----------------
 | 
			
		||||
 | 
			
		||||
  The SAML21 Xplained Pro contains an Embedded Debugger (EDBG) that can be
 | 
			
		||||
  used to program and debug the ATSAML21J18A using Serial Wire Debug (SWD).
 | 
			
		||||
  The Embedded debugger also include a Virtual COM port interface over
 | 
			
		||||
  SERCOM3.  Virtual COM port connections:
 | 
			
		||||
 | 
			
		||||
    PA22 SERCOM3 / USART TXD
 | 
			
		||||
    PA23 SERCOM3 / USART RXD
 | 
			
		||||
 | 
			
		||||
Atmel Studio 6.1
 | 
			
		||||
================
 | 
			
		||||
 | 
			
		||||
  NOTE: These instructions are old. The SAML21 requires Atmel Studio 6.2.
 | 
			
		||||
  They may still prove useful to you, however.
 | 
			
		||||
 | 
			
		||||
  Loading Code into FLASH:
 | 
			
		||||
  -----------------------
 | 
			
		||||
 | 
			
		||||
  Tools menus:  Tools -> Device Programming.
 | 
			
		||||
 | 
			
		||||
  Debugging the NuttX Object File
 | 
			
		||||
  -------------------------------
 | 
			
		||||
 | 
			
		||||
  1) Rename object file from nutt to nuttx.elf.  That is an extension that
 | 
			
		||||
     will be recognized by the file menu.
 | 
			
		||||
 | 
			
		||||
  2) File menu: File -> Open -> Open object file for debugging
 | 
			
		||||
 | 
			
		||||
     - Select nuttx.elf object file
 | 
			
		||||
     - Select AT91SAML21J18
 | 
			
		||||
     - Select files for symbols as desired
 | 
			
		||||
     - Select debugger
 | 
			
		||||
 | 
			
		||||
  3) Debug menu: Debug -> Start debugging and break
 | 
			
		||||
 | 
			
		||||
     - This will reload the nuttx.elf file into FLASH
 | 
			
		||||
 | 
			
		||||
JTAG
 | 
			
		||||
====
 | 
			
		||||
 | 
			
		||||
  I did all of the debug of the SAML21 Xplained using a Segger J-Link
 | 
			
		||||
  connected to the micro JTAG connector on board the SAML21 Xplained.
 | 
			
		||||
  I used an Olimex ARM-JTAG 20-10 Adapter to connect the J-Link to
 | 
			
		||||
  the SAML21 Xplained.
 | 
			
		||||
 | 
			
		||||
SAML21 Xplained Pro-specific Configuration Options
 | 
			
		||||
==================================================
 | 
			
		||||
 | 
			
		||||
    CONFIG_ARCH - Identifies the arch/ subdirectory.  This should
 | 
			
		||||
       be set to:
 | 
			
		||||
 | 
			
		||||
       CONFIG_ARCH=arm
 | 
			
		||||
 | 
			
		||||
    CONFIG_ARCH_family - For use in C code:
 | 
			
		||||
 | 
			
		||||
       CONFIG_ARCH_ARM=y
 | 
			
		||||
 | 
			
		||||
    CONFIG_ARCH_architecture - For use in C code:
 | 
			
		||||
 | 
			
		||||
       CONFIG_ARCH_CORTEXM0=y
 | 
			
		||||
 | 
			
		||||
    CONFIG_ARCH_CHIP - Identifies the arch/*/chip subdirectory
 | 
			
		||||
 | 
			
		||||
       CONFIG_ARCH_CHIP="samd2l2"
 | 
			
		||||
 | 
			
		||||
    CONFIG_ARCH_CHIP_name - For use in C code to identify the exact
 | 
			
		||||
       chip:
 | 
			
		||||
 | 
			
		||||
       CONFIG_ARCH_CHIP_SAML2X
 | 
			
		||||
       CONFIG_ARCH_CHIP_SAML21
 | 
			
		||||
       CONFIG_ARCH_CHIP_ATSAML21J18
 | 
			
		||||
 | 
			
		||||
    CONFIG_ARCH_BOARD - Identifies the boards/ subdirectory and
 | 
			
		||||
       hence, the board that supports the particular chip or SoC.
 | 
			
		||||
 | 
			
		||||
       CONFIG_ARCH_BOARD="saml21-xplained" (for the SAML21 Xplained Pro development board)
 | 
			
		||||
 | 
			
		||||
    CONFIG_ARCH_BOARD_name - For use in C code
 | 
			
		||||
 | 
			
		||||
       CONFIG_ARCH_BOARD_SAML21_XPLAINED=y
 | 
			
		||||
 | 
			
		||||
    CONFIG_ARCH_LOOPSPERMSEC - Must be calibrated for correct operation
 | 
			
		||||
       of delay loops
 | 
			
		||||
 | 
			
		||||
    CONFIG_ENDIAN_BIG - define if big endian (default is little
 | 
			
		||||
       endian)
 | 
			
		||||
 | 
			
		||||
    CONFIG_RAM_SIZE - Describes the installed DRAM (SRAM in this case):
 | 
			
		||||
 | 
			
		||||
       CONFIG_RAM_SIZE=0x00010000 (64KB)
 | 
			
		||||
 | 
			
		||||
    CONFIG_RAM_START - The start address of installed DRAM
 | 
			
		||||
 | 
			
		||||
       CONFIG_RAM_START=0x20000000
 | 
			
		||||
 | 
			
		||||
    CONFIG_ARCH_LEDS - Use LEDs to show state. Unique to boards that
 | 
			
		||||
       have LEDs
 | 
			
		||||
 | 
			
		||||
    CONFIG_ARCH_INTERRUPTSTACK - This architecture supports an interrupt
 | 
			
		||||
       stack. If defined, this symbol is the size of the interrupt
 | 
			
		||||
        stack in bytes.  If not defined, the user task stacks will be
 | 
			
		||||
      used during interrupt handling.
 | 
			
		||||
 | 
			
		||||
    CONFIG_ARCH_STACKDUMP - Do stack dumps after assertions
 | 
			
		||||
 | 
			
		||||
    CONFIG_ARCH_LEDS -  Use LEDs to show state. Unique to board architecture.
 | 
			
		||||
 | 
			
		||||
  Individual subsystems can be enabled:
 | 
			
		||||
 | 
			
		||||
    CONFIG_SAMD2L2_AC      - Analog Comparator
 | 
			
		||||
    CONFIG_SAMD2L2_ADC     - Analog-to-Digital Converter
 | 
			
		||||
    CONFIG_SAMD2L2_DAC     - Digital-to-Analog Converter
 | 
			
		||||
    CONFIG_SAMD2L2_DMAC    - Analog Comparator
 | 
			
		||||
    CONFIG_SAMD2L2_EVSYS   - Event System
 | 
			
		||||
    CONFIG_SAMD2L2_NVMCTRL - Non-Volatile Memory Controller
 | 
			
		||||
    CONFIG_SAMD2L2_PTC     - Peripheral Touch Controller
 | 
			
		||||
    CONFIG_SAMD2L2_RTC     - Real Time Counter
 | 
			
		||||
    CONFIG_SAMD2L2_SERCOM0 - Serial Communication Interface 0
 | 
			
		||||
    CONFIG_SAMD2L2_SERCOM1 - Serial Communication Interface 1
 | 
			
		||||
    CONFIG_SAMD2L2_SERCOM2 - Serial Communication Interface 2
 | 
			
		||||
    CONFIG_SAMD2L2_SERCOM3 - Serial Communication Interface 3
 | 
			
		||||
    CONFIG_SAMD2L2_SERCOM4 - Serial Communication Interface 4
 | 
			
		||||
    CONFIG_SAMD2L2_SERCOM5 - Serial Communication Interface 5
 | 
			
		||||
    CONFIG_SAMD2L2_TCC0    - Timer/Counter 0 for Control
 | 
			
		||||
    CONFIG_SAMD2L2_TCC1    - Timer/Counter 1 for Control
 | 
			
		||||
    CONFIG_SAMD2L2_TCC2    - Timer/Counter 2 for Control
 | 
			
		||||
    CONFIG_SAMD2L2_TC3     - Timer/Counter 3
 | 
			
		||||
    CONFIG_SAMD2L2_TC4     - Timer/Counter 4
 | 
			
		||||
    CONFIG_SAMD2L2_TC5     - Timer/Counter 5
 | 
			
		||||
    CONFIG_SAMD2L2_TC6     - Timer/Counter 6
 | 
			
		||||
    CONFIG_SAMD2L2_TC7     - Timer/Counter 6
 | 
			
		||||
    CONFIG_SAMD2L2_USB     - USB device or host
 | 
			
		||||
    CONFIG_SAMD2L2_WDT     - Watchdog Timer
 | 
			
		||||
 | 
			
		||||
  Some subsystems can be configured to operate in different ways. The drivers
 | 
			
		||||
  need to know how to configure the subsystem.
 | 
			
		||||
 | 
			
		||||
    CONFIG_SAMD2L2_SERCOM0_ISI2C, CONFIG_SAMD2L2_SERCOM0_ISSPI, or CONFIG_SAMD2L2_SERCOM0_ISUSART
 | 
			
		||||
    CONFIG_SAMD2L2_SERCOM1_ISI2C, CONFIG_SAMD2L2_SERCOM1_ISSPI, or CONFIG_SAMD2L2_SERCOM1_ISUSART
 | 
			
		||||
    CONFIG_SAMD2L2_SERCOM2_ISI2C, CONFIG_SAMD2L2_SERCOM2_ISSPI, or CONFIG_SAMD2L2_SERCOM2_ISUSART
 | 
			
		||||
    CONFIG_SAMD2L2_SERCOM3_ISI2C, CONFIG_SAMD2L2_SERCOM3_ISSPI, or CONFIG_SAMD2L2_SERCOM3_ISUSART
 | 
			
		||||
    CONFIG_SAMD2L2_SERCOM4_ISI2C, CONFIG_SAMD2L2_SERCOM4_ISSPI, or CONFIG_SAMD2L2_SERCOM4_ISUSART
 | 
			
		||||
    CONFIG_SAMD2L2_SERCOM5_ISI2C, CONFIG_SAMD2L2_SERCOM5_ISSPI, or CONFIG_SAMD2L2_SERCOM5_ISUSART
 | 
			
		||||
 | 
			
		||||
  SAML21 specific device driver settings
 | 
			
		||||
 | 
			
		||||
    CONFIG_USARTn_SERIAL_CONSOLE - selects the USARTn (n=0,1,2,..5) for the
 | 
			
		||||
      console and ttys0 (default is the USART4).
 | 
			
		||||
    CONFIG_USARTn_RXBUFSIZE - Characters are buffered as received.
 | 
			
		||||
       This specific the size of the receive buffer
 | 
			
		||||
    CONFIG_USARTn_TXBUFSIZE - Characters are buffered before
 | 
			
		||||
       being sent.  This specific the size of the transmit buffer
 | 
			
		||||
    CONFIG_USARTn_BAUD - The configure BAUD of the USART.  Must be
 | 
			
		||||
    CONFIG_USARTn_BITS - The number of bits.  Must be either 7 or 8.
 | 
			
		||||
    CONFIG_USARTn_PARTIY - 0=no parity, 1=odd parity, 2=even parity
 | 
			
		||||
    CONFIG_USARTn_2STOP - Two stop bits
 | 
			
		||||
 | 
			
		||||
Configurations
 | 
			
		||||
==============
 | 
			
		||||
 | 
			
		||||
  Each SAML21 Xplained Pro configuration is maintained in a sub-directory and
 | 
			
		||||
  can be selected as follow:
 | 
			
		||||
 | 
			
		||||
    tools/configure.sh saml21-xplained:<subdir>
 | 
			
		||||
 | 
			
		||||
  Before building, make sure that the PATH environmental variable includes the
 | 
			
		||||
  correct path to the directory than holds your toolchain binaries.
 | 
			
		||||
 | 
			
		||||
  And then build NuttX by simply typing the following.  At the conclusion of
 | 
			
		||||
  the make, the nuttx binary will reside in an ELF file called, simply, nuttx.
 | 
			
		||||
 | 
			
		||||
    make
 | 
			
		||||
 | 
			
		||||
  The <subdir> that is provided above as an argument to the tools/configure.sh
 | 
			
		||||
  must be is one of the following.
 | 
			
		||||
 | 
			
		||||
  NOTE:  These configurations use the mconf-based configuration tool.  To
 | 
			
		||||
  change any of these configurations using that tool, you should:
 | 
			
		||||
 | 
			
		||||
    a. Build and install the kconfig-mconf tool.  See nuttx/README.txt
 | 
			
		||||
       see additional README.txt files in the NuttX tools repository.
 | 
			
		||||
 | 
			
		||||
    b. Execute 'make menuconfig' in nuttx/ in order to start the
 | 
			
		||||
       reconfiguration process.
 | 
			
		||||
 | 
			
		||||
  NOTES:
 | 
			
		||||
 | 
			
		||||
  1. These configurations use the mconf-based configuration tool.  To
 | 
			
		||||
    change any of these configurations using that tool, you should:
 | 
			
		||||
 | 
			
		||||
    a. Build and install the kconfig-mconf tool.  See nuttx/README.txt
 | 
			
		||||
       see additional README.txt files in the NuttX tools repository.
 | 
			
		||||
 | 
			
		||||
    b. Execute 'make menuconfig' in nuttx/ in order to start the
 | 
			
		||||
       reconfiguration process.
 | 
			
		||||
 | 
			
		||||
  2. Unless stated otherwise, all configurations generate console
 | 
			
		||||
     output of on SERCOM4 which is available on EXT1 (see the section
 | 
			
		||||
     "Serial Consoles" above).  The SERCOM1 on EXT2 or EXT3 or the
 | 
			
		||||
     virtual COM port on SERCOME could be used, instead, by
 | 
			
		||||
     reconfiguring to use SERCOM1 or SERCOM3 instead of SERCOM4:
 | 
			
		||||
 | 
			
		||||
       System Type -> SAMD/L Peripheral Support
 | 
			
		||||
         CONFIG_SAMD2L2_SERCOM1=y  : Enable one or both
 | 
			
		||||
         CONFIG_SAMD2L2_SERCOM3=y
 | 
			
		||||
         CONFIG_SAMD2L2_SERCOM4=n
 | 
			
		||||
 | 
			
		||||
       Device Drivers -> Serial Driver Support -> Serial Console
 | 
			
		||||
         CONFIG_USART1_SERIAL_CONSOLE=y  : Select only one for the console
 | 
			
		||||
         CONFIG_USART3_SERIAL_CONSOLE=y  : Select only one for the console
 | 
			
		||||
         CONFIG_USART4_SERIAL_CONSOLE=n
 | 
			
		||||
 | 
			
		||||
       Device Drivers -> Serial Driver Support -> SERCOMn Configuration
 | 
			
		||||
       where n=1 or 3:
 | 
			
		||||
 | 
			
		||||
         CONFIG_USARTn_2STOP=0
 | 
			
		||||
         CONFIG_USARTn_BAUD=115200
 | 
			
		||||
         CONFIG_USARTn_BITS=8
 | 
			
		||||
         CONFIG_USARTn_PARITY=0
 | 
			
		||||
         CONFIG_USARTn_RXBUFSIZE=256
 | 
			
		||||
         CONFIG_USARTn_TXBUFSIZE=256
 | 
			
		||||
 | 
			
		||||
  3. Unless otherwise stated, the configurations are setup for
 | 
			
		||||
     Cygwin under Windows:
 | 
			
		||||
 | 
			
		||||
     Build Setup:
 | 
			
		||||
       CONFIG_HOST_WINDOWS=y   : Windows Host
 | 
			
		||||
       CONFIG_WINDOWS_CYGWIN=y : Cygwin environment on windows
 | 
			
		||||
 | 
			
		||||
  4. These configurations use the ARM EABI toolchain.  But
 | 
			
		||||
     that is easily reconfigured:
 | 
			
		||||
 | 
			
		||||
     System Type -> Toolchain:
 | 
			
		||||
       CONFIG_ARMV6M_TOOLCHAIN_GNU_EABIW=y
 | 
			
		||||
 | 
			
		||||
     Any re-configuration should be done before making NuttX or else the
 | 
			
		||||
     subsequent 'make' will fail.  If you have already attempted building
 | 
			
		||||
     NuttX then you will have to 1) 'make distclean' to remove the old
 | 
			
		||||
     configuration, 2) 'tools/configure.sh sam3u-ek/ksnh' to start
 | 
			
		||||
     with a fresh configuration, and 3) perform the configuration changes
 | 
			
		||||
     above.
 | 
			
		||||
 | 
			
		||||
     Also, make sure that your PATH variable has the new path to your
 | 
			
		||||
     Atmel tools.  Try 'which arm-none-eabi-gcc' to make sure that you
 | 
			
		||||
     are selecting the right tool.
 | 
			
		||||
 | 
			
		||||
     See also the "NOTE about Windows native toolchains" in the section
 | 
			
		||||
     called "GNU Toolchain Options" above.
 | 
			
		||||
 | 
			
		||||
Configuration sub-directories
 | 
			
		||||
-----------------------------
 | 
			
		||||
 | 
			
		||||
  nsh:
 | 
			
		||||
    This configuration directory will built the NuttShell.  See NOTES above
 | 
			
		||||
    and below:
 | 
			
		||||
 | 
			
		||||
    NOTES:
 | 
			
		||||
 | 
			
		||||
    1. This configuration is set up to build on Windows using the Cygwin
 | 
			
		||||
       environment using the ARM EABI toolchain.  This can be easily
 | 
			
		||||
       changed as described above under "Configurations."
 | 
			
		||||
 | 
			
		||||
    2. By default, this configuration provides a serial console on SERCOM4
 | 
			
		||||
       at 115200 8N1 via EXT1:
 | 
			
		||||
 | 
			
		||||
       PIN   EXT1 GPIO Function
 | 
			
		||||
       ----  ---- ------------------
 | 
			
		||||
        13   PB09 SERCOM4 / USART RX
 | 
			
		||||
        14   PB08 SERCOM4 / USART TX
 | 
			
		||||
        19   GND  N/A
 | 
			
		||||
        20   VCC  N/A
 | 
			
		||||
 | 
			
		||||
       If you would prefer to use the EDBG serial COM port or would prefer
 | 
			
		||||
       to use SERCOM4 on EXT1 or EXT2, you will need to reconfigure the
 | 
			
		||||
       SERCOM as described under "Configurations".  See also the section
 | 
			
		||||
       entitled "Serial Consoles" above.
 | 
			
		||||
 | 
			
		||||
    3. NOTE: If you get a compilation error like:
 | 
			
		||||
 | 
			
		||||
         libxx_new.cxx:74:40: error: 'operator new' takes type 'size_t'
 | 
			
		||||
                              ('unsigned int') as first parameter [-fper
 | 
			
		||||
 | 
			
		||||
       Sometimes NuttX and your toolchain will disagree on the underlying
 | 
			
		||||
       type of size_t; sometimes it is an 'unsigned int' and sometimes it is
 | 
			
		||||
       an 'unsigned long int'.  If this error occurs, then you may need to
 | 
			
		||||
       toggle the value of CONFIG_ARCH_SIZET_LONG.
 | 
			
		||||
 | 
			
		||||
    4. WARNING: This info comes from the SAMD20 Xplained README.  I have
 | 
			
		||||
       not tried the I/O1 module on the SAML21!
 | 
			
		||||
 | 
			
		||||
       If the I/O1 module is connected to the SAML21 Xplained Pro, then
 | 
			
		||||
       support for the SD card slot can be enabled by making the following
 | 
			
		||||
       changes to the configuration.  These changes assume that the I/O1
 | 
			
		||||
       modules is connected in EXT1.  Most of the modifications necessary
 | 
			
		||||
       to work with the I/O1 in a different connector are obvious.. except
 | 
			
		||||
       for the selection of SERCOM SPI support:
 | 
			
		||||
 | 
			
		||||
         EXT1: SPI is provided through SERCOM0
 | 
			
		||||
         EXT2: SPI is provided through SERCOM1
 | 
			
		||||
         EXT3: SPI is provided through SERCOM5
 | 
			
		||||
 | 
			
		||||
       File Systems:
 | 
			
		||||
         CONFIG_FS_FAT=y                   : Enable the FAT file system
 | 
			
		||||
         CONFIG_FAT_LCNAMES=y              : Enable upper/lower case 8.3 file names (Optional, see below)
 | 
			
		||||
         CONFIG_FAT_LFN=y                  : Enable long file named (Optional, see below)
 | 
			
		||||
         CONFIG_FAT_MAXFNAME=32            : Maximum supported file name length
 | 
			
		||||
 | 
			
		||||
         There are issues related to patents that Microsoft holds on FAT long
 | 
			
		||||
         file name technologies.  See the top level NOTICE file for further
 | 
			
		||||
         details.
 | 
			
		||||
 | 
			
		||||
       System Type -> Peripherals:
 | 
			
		||||
         CONFIG_SAMD2L2_SERCOM0=y          : Use SERCOM0 if the I/O is in EXT1
 | 
			
		||||
         CONFIG_SAMD2L2_SERCOM0_ISSPI=y    : Configure SERCOM0 as an SPI master
 | 
			
		||||
 | 
			
		||||
       Device Drivers
 | 
			
		||||
         CONFIG_SPI=y                      : Enable SPI support
 | 
			
		||||
         CONFIG_SPI_EXCHANGE=y             : The exchange() method is supported
 | 
			
		||||
 | 
			
		||||
         CONFIG_MMCSD=y                    : Enable MMC/SD support
 | 
			
		||||
         CONFIG_MMCSD_NSLOTS=1             : Only one MMC/SD card slot
 | 
			
		||||
         CONFIG_MMCSD_MULTIBLOCK_DISABLE=n : Should not need to disable multi-block transfers
 | 
			
		||||
         CONFIG_MMCSD_MMCSUPPORT=n         : May interfere with some SD cards
 | 
			
		||||
         CONFIG_MMCSD_HAVE_CARDDETECT=y     : I/O1 module as a card detect GPIO
 | 
			
		||||
         CONFIG_MMCSD_SPI=y                : Use the SPI interface to the MMC/SD card
 | 
			
		||||
         CONFIG_MMCSD_SPICLOCK=20000000    : This is a guess for the optimal MMC/SD frequency
 | 
			
		||||
         CONFIG_MMCSD_SPIMODE=0            : Mode 0 is required
 | 
			
		||||
 | 
			
		||||
       Board Selection -> Common Board Options
 | 
			
		||||
         CONFIG_NSH_MMCSDSLOTNO=0          : Only one MMC/SD slot, slot 0
 | 
			
		||||
         CONFIG_NSH_MMCSDSPIPORTNO=0       : Use port=0 -> SERCOM0 if the I/O1 is in EXT1
 | 
			
		||||
 | 
			
		||||
       Board Selection -> SAML21 Xplained Pro Modules
 | 
			
		||||
         CONFIG_SAML21_XPLAINED_IOMODULE=y      : I/O1 module is connected
 | 
			
		||||
         CONFIG_SAML21_XPLAINED_IOMODULE_EXT2=y : I/O1 modules is in EXT2
 | 
			
		||||
 | 
			
		||||
       Application Configuration -> NSH Library
 | 
			
		||||
         CONFIG_NSH_ARCHINIT=y             : Board has architecture-specific initialization
 | 
			
		||||
 | 
			
		||||
       NOTE: If you enable the I/O1 this configuration with SERCOM4 as the
 | 
			
		||||
       console and with the I/O1 module in EXT1, you *must* remove USART
 | 
			
		||||
       jumper.  Otherwise, you have lookback on SERCOM4 and NSH will *not*
 | 
			
		||||
       behave very well (since its outgoing prompts also appear as incoming
 | 
			
		||||
       commands).
 | 
			
		||||
 | 
			
		||||
       STATUS:  As of 2013-6-18, this configuration appears completely
 | 
			
		||||
       functional.  Testing, however, has been very light.  Example:
 | 
			
		||||
 | 
			
		||||
         NuttShell (NSH) NuttX-6.34
 | 
			
		||||
         nsh> mount -t vfat /dev/mmcsd0 /mnt/stuff
 | 
			
		||||
         nsh> ls /mnt/stuff
 | 
			
		||||
         /mnt/stuff:
 | 
			
		||||
         nsh> echo "This is a test" >/mnt/stuff/atest.txt
 | 
			
		||||
         nsh> ls /mnt/stuff
 | 
			
		||||
         /mnt/stuff:
 | 
			
		||||
          atest.txt
 | 
			
		||||
         nsh> cat /mnt/stuff/atest.txt
 | 
			
		||||
         This is a test
 | 
			
		||||
         nsh>
 | 
			
		||||
 | 
			
		||||
    5. WARNING: This info comes from the SAMD20 Xplained README.  I have
 | 
			
		||||
       not tried the OLED1 module on the SAML21!
 | 
			
		||||
 | 
			
		||||
    5. If the OLED1 module is connected to the SAML21 Xplained Pro, then
 | 
			
		||||
       support for the OLED display can be enabled by making the following
 | 
			
		||||
       changes to the configuration.  These changes assume that the I/O1
 | 
			
		||||
       modules is connected in EXT1.  Most of the modifications necessary
 | 
			
		||||
       to work with the I/O1 in a different connector are obvious.. except
 | 
			
		||||
       for the selection of SERCOM SPI support:
 | 
			
		||||
 | 
			
		||||
         EXT1: SPI is provided through SERCOM0
 | 
			
		||||
         EXT2: SPI is provided through SERCOM1
 | 
			
		||||
         EXT3: SPI is provided through SERCOM5
 | 
			
		||||
 | 
			
		||||
       System Type -> Peripherals:
 | 
			
		||||
         CONFIG_SAMD2L2_SERCOM1=y           : Use SERCOM1 if the I/O is in EXT2
 | 
			
		||||
         CONFIG_SAMD2L2_SERCOM1_ISSPI=y     : Configure SERCOM1 as an SPI master
 | 
			
		||||
 | 
			
		||||
       Device Drivers -> SPI
 | 
			
		||||
         CONFIG_SPI=y                       : Enable SPI support
 | 
			
		||||
         CONFIG_SPI_EXCHANGE=y              : The exchange() method is supported
 | 
			
		||||
         CONFIG_SPI_CMDDATA=y               : CMD/DATA support is required
 | 
			
		||||
 | 
			
		||||
       Device Drivers -> LCDs
 | 
			
		||||
         CONFIG_LCD=y                       : Enable LCD support
 | 
			
		||||
         CONFIG_LCD_MAXCONTRAST=255         : Maximum contrast value
 | 
			
		||||
         CONFIG_LCD_LANDSCAPE=y             : Landscape orientation (see below*)
 | 
			
		||||
         CONFIG_LCD_UG2832HSWEG04=y         : Enable support for the OLED
 | 
			
		||||
         CONFIG_LCD_SSD1306_SPIMODE=0       : SPI Mode 0
 | 
			
		||||
         CONFIG_LCD_SSD1306_SPIMODE=3500000 : Pick an SPI frequency
 | 
			
		||||
 | 
			
		||||
       Board Selection -> SAML21 Xplained Pro Modules
 | 
			
		||||
         CONFIG_SAML21_XPLAINED_OLED1MODULE=y      : OLED1 module is connected
 | 
			
		||||
         CONFIG_SAML21_XPLAINED_OLED1MODULE_EXT2=y : OLED1 modules is in EXT2
 | 
			
		||||
 | 
			
		||||
       The NX graphics subsystem also needs to be configured:
 | 
			
		||||
 | 
			
		||||
         CONFIG_NX=y                        : Enable graphics support
 | 
			
		||||
         CONFIG_NX_LCDDRIVER=y              : Using an LCD driver
 | 
			
		||||
         CONFIG_NX_NPLANES=1                : With a single color plane
 | 
			
		||||
         CONFIG_NX_WRITEONLY=n              : You can read from the LCD (see below*)
 | 
			
		||||
         CONFIG_NX_DISABLE_2BPP=y           : Disable all resolutions except 1BPP
 | 
			
		||||
         CONFIG_NX_DISABLE_4BPP=y
 | 
			
		||||
         CONFIG_NX_DISABLE_8BPP=y
 | 
			
		||||
         CONFIG_NX_DISABLE_16BPP=y
 | 
			
		||||
         CONFIG_NX_DISABLE_24BPP=y
 | 
			
		||||
         CONFIG_NX_DISABLE_32BPP=y
 | 
			
		||||
         CONFIG_NX_PACKEDMSFIRST=y          : LSB packed first (shouldn't matter)
 | 
			
		||||
         CONFIG_NXSTART_EXTERNINIT=y        : We have board_graphics_setup()
 | 
			
		||||
         CONFIG_NXTK_BORDERWIDTH=2          : Use a small border
 | 
			
		||||
         CONFIG_NXTK_DEFAULT_BORDERCOLORS=y : Default border colors
 | 
			
		||||
         CONFIG_NXFONTS_CHARBITS=7          : 7-bit fonts
 | 
			
		||||
         CONFIG_NXFONT_SANS17X23B=y         : Pick a font (any that will fit)
 | 
			
		||||
 | 
			
		||||
        * The hardware is write only, but the driver maintains a frame buffer
 | 
			
		||||
          to support read and read-write-modiry operations on the LCD.
 | 
			
		||||
          Reading from the frame buffer is, however, untested.
 | 
			
		||||
 | 
			
		||||
       Then, in order to use the OLED, you will need to build some kind of
 | 
			
		||||
       graphics application or use one of the NuttX graphics examples.
 | 
			
		||||
       Here, for example, is the setup for the graphic "Hello, World!"
 | 
			
		||||
       example:
 | 
			
		||||
 | 
			
		||||
         CONFIG_EXAMPLES_NXHELLO=y                : Enables the example
 | 
			
		||||
         CONFIG_EXAMPLES_NXHELLO_DEFAULT_COLORS=y : Use default colors (see below *)
 | 
			
		||||
         CONFIG_EXAMPLES_NXHELLO_DEFAULT_FONT=y   : Use the default font
 | 
			
		||||
         CONFIG_EXAMPLES_NXHELLO_BPP=1            : One bit per pixel
 | 
			
		||||
         CONFIG_EXAMPLES_NXHELLO_EXTERNINIT=y     : Special initialization is required.
 | 
			
		||||
 | 
			
		||||
        * The OLED is monochrome so the only "colors" are black and white.
 | 
			
		||||
          The default "colors" will give you while text on a black background.
 | 
			
		||||
          You can override the faults it you want black text on a while background.
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,68 @@
 | 
			
		|||
#
 | 
			
		||||
# 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_WGET is not set
 | 
			
		||||
# CONFIG_NSH_DISABLE_XD is not set
 | 
			
		||||
CONFIG_ARCH="arm"
 | 
			
		||||
CONFIG_ARCH_BOARD="saml21-xplained"
 | 
			
		||||
CONFIG_ARCH_BOARD_SAML21_XPLAINED=y
 | 
			
		||||
CONFIG_ARCH_BUTTONS=y
 | 
			
		||||
CONFIG_ARCH_CHIP="samd2l2"
 | 
			
		||||
CONFIG_ARCH_CHIP_SAML21J18=y
 | 
			
		||||
CONFIG_ARCH_CHIP_SAML2X=y
 | 
			
		||||
CONFIG_ARCH_STACKDUMP=y
 | 
			
		||||
CONFIG_BOARD_LOOPSPERMSEC=4356
 | 
			
		||||
CONFIG_BUILTIN=y
 | 
			
		||||
CONFIG_DEFAULT_SMALL=y
 | 
			
		||||
CONFIG_HAVE_CXX=y
 | 
			
		||||
CONFIG_HAVE_CXXINITIALIZE=y
 | 
			
		||||
CONFIG_HOST_WINDOWS=y
 | 
			
		||||
CONFIG_INTELHEX_BINARY=y
 | 
			
		||||
CONFIG_MAX_TASKS=16
 | 
			
		||||
CONFIG_NSH_BUILTIN_APPS=y
 | 
			
		||||
CONFIG_PREALLOC_TIMERS=4
 | 
			
		||||
CONFIG_PTHREAD_STACK_DEFAULT=1536
 | 
			
		||||
CONFIG_RAM_SIZE=32768
 | 
			
		||||
CONFIG_RAM_START=0x20000000
 | 
			
		||||
CONFIG_RR_INTERVAL=200
 | 
			
		||||
CONFIG_SAMD2L2_SERCOM3=y
 | 
			
		||||
CONFIG_SAMD2L2_SERCOM4=y
 | 
			
		||||
CONFIG_SAML21_XPLAINED_DFLL=y
 | 
			
		||||
CONFIG_SAML21_XPLAINED_DFLL_CLOSEDLOOP=y
 | 
			
		||||
CONFIG_SAML21_XPLAINED_DFLL_XOSC32KSRC=y
 | 
			
		||||
CONFIG_SCHED_WAITPID=y
 | 
			
		||||
CONFIG_SDCLONE_DISABLE=y
 | 
			
		||||
CONFIG_START_DAY=12
 | 
			
		||||
CONFIG_START_MONTH=2
 | 
			
		||||
CONFIG_START_YEAR=2014
 | 
			
		||||
CONFIG_SYSTEM_NSH=y
 | 
			
		||||
CONFIG_TASK_NAME_SIZE=0
 | 
			
		||||
CONFIG_TASK_SPAWN_DEFAULT_STACKSIZE=1536
 | 
			
		||||
CONFIG_USART3_RXBUFSIZE=64
 | 
			
		||||
CONFIG_USART3_TXBUFSIZE=64
 | 
			
		||||
CONFIG_USART4_RXBUFSIZE=64
 | 
			
		||||
CONFIG_USART4_SERIAL_CONSOLE=y
 | 
			
		||||
CONFIG_USART4_TXBUFSIZE=64
 | 
			
		||||
CONFIG_USERMAIN_STACKSIZE=1536
 | 
			
		||||
CONFIG_USER_ENTRYPOINT="nsh_main"
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,657 @@
 | 
			
		|||
/****************************************************************************
 | 
			
		||||
 * boards/arm/samd2l2/saml21-xplained/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_SAML21_XPLAINED_INCLUDE_BOARD_H
 | 
			
		||||
#define __BOARDS_ARM_SAMD2L2_SAML21_XPLAINED_INCLUDE_BOARD_H
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Included Files
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#include <nuttx/config.h>
 | 
			
		||||
 | 
			
		||||
#ifndef __ASSEMBLY__
 | 
			
		||||
#  include <stdint.h>
 | 
			
		||||
#  ifdef CONFIG_SAMD2L2_GPIOIRQ
 | 
			
		||||
#    include <arch/irq.h>
 | 
			
		||||
#  endif
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Pre-processor Definitions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/* Clocking *****************************************************************/
 | 
			
		||||
 | 
			
		||||
/* Overview
 | 
			
		||||
 *
 | 
			
		||||
 * Since there is no high speed crystal, we will run from the OSC16M clock
 | 
			
		||||
 * source.
 | 
			
		||||
 * We will use its default, POR frequency of 4MHz to avoid an additional
 | 
			
		||||
 * clock switch.
 | 
			
		||||
 *
 | 
			
		||||
 * OSC16M             Output = 4MHz
 | 
			
		||||
 * `- GCLK1           Input  = 4MHz  Prescaler    = 1  output         = 4MHz
 | 
			
		||||
 *    `- DFLL         Input  = 4MHz  Multiplier   = 12 output         = 48MHz
 | 
			
		||||
 *        `- GCLK0    Input  = 48MHz Prescaler    = 1  output         = 48MHz
 | 
			
		||||
 *            `- MCLK 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
 | 
			
		||||
 *                                   APBD divider = 1  APBD frequency = 48MHz
 | 
			
		||||
 *                                   APBE divider = 1  APBE frequency = 48MHz
 | 
			
		||||
 *
 | 
			
		||||
 * The SAML21 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)
 | 
			
		||||
 *   BOARD_XOSC32K_WRITELOCK    - Boolean (defined / not defined)
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#undef BOARD_XOSC32K_ENABLE
 | 
			
		||||
#ifdef CONFIG_SAML21_XPLAINED_XOSC32K
 | 
			
		||||
#  define BOARD_XOSC32K_ENABLE       1
 | 
			
		||||
#  define BOARD_XOSC32K_FREQUENCY    32768    /* 32.768KHz XTAL */
 | 
			
		||||
#  define BOARD_XOSC32K_STARTUPTIME  OSC32KCTRL_XOSC32K_STARTUP_100MS
 | 
			
		||||
#  define BOARD_XOSC32K_ISCRYSTAL    1
 | 
			
		||||
#  undef  BOARD_XOSC32K_EN1KHZ
 | 
			
		||||
#  define BOARD_XOSC32K_EN32KHZ      1
 | 
			
		||||
#  define BOARD_XOSC32K_ONDEMAND     1
 | 
			
		||||
#  undef  BOARD_XOSC32K_RUNINSTANDBY
 | 
			
		||||
#  undef  BOARD_XOSC32K_WRITELOCK
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/* 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)
 | 
			
		||||
 *   BOARD_OSC32K_WRITELOCK     - 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
 | 
			
		||||
#undef  BOARD_OSC32K_WRITELOCK
 | 
			
		||||
 | 
			
		||||
/* OSC16M Configuration -- always enabled
 | 
			
		||||
 *
 | 
			
		||||
 *   BOARD_OSC16M_FSEL          - See OSCCTRL_OSC16MCTRL_FSEL_* definitions
 | 
			
		||||
 *   BOARD_OSC16M_ONDEMAND      - Boolean (defined / not defined)
 | 
			
		||||
 *   BOARD_OSC16M_RUNINSTANDBY  - Boolean (defined / not defined)
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#if defined(CONFIG_SAML21_XPLAINED_OSC16M_4MHZ)
 | 
			
		||||
#  define BOARD_OSC16M_FSEL          OSCCTRL_OSC16MCTRL_FSEL_4MHZ
 | 
			
		||||
#  define BOARD_OSC16M_ONDEMAND      1
 | 
			
		||||
#  undef  BOARD_OSC16M_RUNINSTANDBY
 | 
			
		||||
#  define BOARD_OSC16M_FREQUENCY     4000000  /* 4MHz high-accuracy internal oscillator */
 | 
			
		||||
 | 
			
		||||
#elif defined(CONFIG_SAML21_XPLAINED_OSC16M_8MHZ)
 | 
			
		||||
#  define BOARD_OSC16M_FSEL          OSCCTRL_OSC16MCTRL_FSEL_8MHZ
 | 
			
		||||
#  define BOARD_OSC16M_ONDEMAND      1
 | 
			
		||||
#  undef  BOARD_OSC16M_RUNINSTANDBY
 | 
			
		||||
#  define BOARD_OSC16M_FREQUENCY     8000000  /* 8MHz high-accuracy internal oscillator */
 | 
			
		||||
 | 
			
		||||
#elif defined(CONFIG_SAML21_XPLAINED_OSC16M_12MHZ)
 | 
			
		||||
#  define BOARD_OSC16M_FSEL          OSCCTRL_OSC16MCTRL_FSEL_12MHZ
 | 
			
		||||
#  define BOARD_OSC16M_ONDEMAND      1
 | 
			
		||||
#  undef  BOARD_OSC16M_RUNINSTANDBY
 | 
			
		||||
#  define BOARD_OSC16M_FREQUENCY     12000000 /* 12MHz high-accuracy internal oscillator */
 | 
			
		||||
 | 
			
		||||
#elif defined(CONFIG_SAML21_XPLAINED_OSC16M_16MHZ)
 | 
			
		||||
#  define BOARD_OSC16M_FSEL          OSCCTRL_OSC16MCTRL_FSEL_16MHZ
 | 
			
		||||
#  define BOARD_OSC16M_ONDEMAND      1
 | 
			
		||||
#  undef  BOARD_OSC16M_RUNINSTANDBY
 | 
			
		||||
#  define BOARD_OSC16M_FREQUENCY     16000000 /* 18MHz high-accuracy internal oscillator */
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
#  error OSC16M operating frequency not defined (CONFIG_SAML21_XPLAINED_OSC16M_*MHZ)
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/* 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
 | 
			
		||||
 *        = 12 * 4000000 = 48MHz
 | 
			
		||||
 *
 | 
			
		||||
 * Where the reference clock is Generic Clock Channel 0 output of GLCK1.
 | 
			
		||||
 * GCLCK1 provides OSC16M, 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_DFLL48M_CLOSEDLOOP          - Boolean (defined / not defined)
 | 
			
		||||
 *   BOARD_DFLL48M_OPENLOOP            - Boolean (defined / not defined)
 | 
			
		||||
 *   BOARD_DFLL48M_RECOVERY            - Boolean (defined / not defined)
 | 
			
		||||
 *   BOARD_DFLL48M_TRACKAFTERFINELOCK  - Boolean (defined / not defined)
 | 
			
		||||
 *   BOARD_DFLL48M_KEEPLOCKONWAKEUP    - Boolean (defined / not defined)
 | 
			
		||||
 *   BOARD_DFLL48M_ENABLECHILLCYCLE    - Boolean (defined / not defined)
 | 
			
		||||
 *   BOARD_DFLL48M_QUICKLOCK           - Boolean (defined / not defined)
 | 
			
		||||
 *   BOARD_DFLL48M_RUNINSTDBY          - Boolean (defined / not defined)
 | 
			
		||||
 *   BOARD_DFLL48M_ONDEMAND            - Boolean (defined / not defined)
 | 
			
		||||
 *
 | 
			
		||||
 * Closed loop mode only:
 | 
			
		||||
 *   BOARD_DFLL48M_REFCLK_CLKGEN       - GCLK index in the range {0..8}
 | 
			
		||||
 *   BOARD_DFLL48M_MULTIPLIER          - Value
 | 
			
		||||
 *   BOARD_DFLL48M_MAXCOARSESTEP       - Value
 | 
			
		||||
 *   BOARD_DFLL48M_MAXFINESTEP         - Value
 | 
			
		||||
 *
 | 
			
		||||
 *   BOARD_DFLL48M_FREQUENCY           - The resulting frequency
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#undef BOARD_DFLL48M_ENABLE                1  /* Assume not using the DFLL48M */
 | 
			
		||||
#undef BOARD_DFLL48M_CLOSEDLOOP
 | 
			
		||||
#undef BOARD_DFLL48M_OPENLOOP
 | 
			
		||||
#undef BOARD_DFLL48M_RECOVERY
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_SAML21_XPLAINED_DFLL
 | 
			
		||||
#  define BOARD_DFLL48M_ENABLE             1  /* Using the DFLL48M */
 | 
			
		||||
 | 
			
		||||
/* DFLL mode of operation */
 | 
			
		||||
 | 
			
		||||
#  if defined(CONFIG_SAML21_XPLAINED_DFLL_OPENLOOP)
 | 
			
		||||
#    define BOARD_DFLL48M_OPENLOOP         1  /* In open loop mode */
 | 
			
		||||
#  elif defined(CONFIG_SAML21_XPLAINED_DFLL_CLOSEDLOOP)
 | 
			
		||||
#    define BOARD_DFLL48M_CLOSEDLOOP       1  /* In closed loop mode */
 | 
			
		||||
#  elif defined(CONFIG_SAML21_XPLAINED_DFLL_RECOVERY)
 | 
			
		||||
#    define BOARD_DFLL48M_RECOVERY         1  /* In USB recover mode */
 | 
			
		||||
#  else
 | 
			
		||||
#    error DFLL mode not provided
 | 
			
		||||
#  endif
 | 
			
		||||
 | 
			
		||||
/* DFLL source clock selection */
 | 
			
		||||
 | 
			
		||||
#  if defined(CONFIG_SAML21_XPLAINED_DFLL_OSC16MSRC)
 | 
			
		||||
#    define BOARD_DFLL_SRC_FREQUENCY       BOARD_OSC16M_FREQUENCY
 | 
			
		||||
#  elif defined(CONFIG_SAML21_XPLAINED_DFLL_XOSC32KSRC)
 | 
			
		||||
#    define BOARD_DFLL_SRC_FREQUENCY       BOARD_XOSC32K_FREQUENCY
 | 
			
		||||
#  else
 | 
			
		||||
#    error DFLL clock source not provided
 | 
			
		||||
#  endif
 | 
			
		||||
 | 
			
		||||
/* Mode-independent options */
 | 
			
		||||
 | 
			
		||||
#  undef  BOARD_DFLL48M_RUNINSTDBY
 | 
			
		||||
#  undef  BOARD_DFLL48M_ONDEMAND
 | 
			
		||||
 | 
			
		||||
/* DFLL closed loop mode configuration */
 | 
			
		||||
 | 
			
		||||
#  define BOARD_DFLL48M_REFCLK_CLKGEN      1
 | 
			
		||||
#  define BOARD_DFLL48M_MULTIPLIER         (48000000 / BOARD_DFLL_SRC_FREQUENCY)
 | 
			
		||||
#  define BOARD_DFLL48M_QUICKLOCK          1
 | 
			
		||||
#  define BOARD_DFLL48M_TRACKAFTERFINELOCK 1
 | 
			
		||||
#  define BOARD_DFLL48M_KEEPLOCKONWAKEUP   1
 | 
			
		||||
#  define BOARD_DFLL48M_ENABLECHILLCYCLE   1
 | 
			
		||||
#  define BOARD_DFLL48M_MAXCOARSESTEP      (0x1f / 4)
 | 
			
		||||
#  define BOARD_DFLL48M_MAXFINESTEP        (0xff / 4)
 | 
			
		||||
 | 
			
		||||
#  ifdef CONFIG_SAML21_XPLAINED_DFLL_OPENLOOP
 | 
			
		||||
#    define BOARD_DFLL48M_FREQUENCY        (13720000) /* REVISIT:  Needs to be measured */
 | 
			
		||||
#  else
 | 
			
		||||
#    define BOARD_DFLL48M_FREQUENCY        (BOARD_DFLL48M_MULTIPLIER * BOARD_DFLL_SRC_FREQUENCY)
 | 
			
		||||
#  endif
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/* Fractional Digital Phase Locked Loop configuration.
 | 
			
		||||
 *
 | 
			
		||||
 *   BOARD_FDPLL96M_ENABLE          - Boolean (defined / not defined)
 | 
			
		||||
 *   BOARD_FDPLL96M_RUNINSTDBY      - Boolean (defined / not defined)
 | 
			
		||||
 *   BOARD_FDPLL96M_ONDEMAND        - Boolean (defined / not defined)
 | 
			
		||||
 *   BOARD_FDPLL96M_LBYPASS         - Boolean (defined / not defined)
 | 
			
		||||
 *   BOARD_FDPLL96M_WUF             - Boolean (defined / not defined)
 | 
			
		||||
 *   BOARD_FDPLL96M_LPEN            - Boolean (defined / not defined)
 | 
			
		||||
 *   BOARD_FDPLL96M_FILTER          - See OSCCTRL_DPLLCTRLB_FILTER_*
 | 
			
		||||
 *                                    definitions
 | 
			
		||||
 *   BOARD_FDPLL96M_REFCLK          - See  OSCCTRL_DPLLCTRLB_REFLCK_*
 | 
			
		||||
 *                                    definitions
 | 
			
		||||
 *   BOARD_FDPLL96M_REFCLK_CLKGEN   - GCLK index in the range {0..8}
 | 
			
		||||
 *   BOARD_FDPLL96M_LOCKTIME_ENABLE - Boolean (defined / not defined)
 | 
			
		||||
 *   BOARD_FDPLL96M_LOCKTIME        - See OSCCTRL_DPLLCTRLB_LTIME_*
 | 
			
		||||
 *                                    definitions
 | 
			
		||||
 *   BOARD_FDPLL96M_LOCKTIME_CLKGEN - GCLK index in the range {0..8}
 | 
			
		||||
 *   BOARD_FDPLL96M_REFDIV          - Numeric value, 1 - 2047
 | 
			
		||||
 *   BOARD_FDPLL96M_PRESCALER       - See OSCCTRL_DPLLPRESC_* definitions
 | 
			
		||||
 *   BOARD_FDPLL96M_REFFREQ         - Numeric value
 | 
			
		||||
 *   BOARD_FDPLL96M_FREQUENCY       - Numeric value
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#undef  BOARD_FDPLL96M_ENABLE
 | 
			
		||||
#undef  BOARD_FDPLL96M_RUNINSTDBY
 | 
			
		||||
#define BOARD_FDPLL96M_ONDEMAND          1
 | 
			
		||||
#undef  BOARD_FDPLL96M_LBYPASS
 | 
			
		||||
#undef  BOARD_FDPLL96M_WUF
 | 
			
		||||
#undef  BOARD_FDPLL96M_LPEN
 | 
			
		||||
#define BOARD_FDPLL96M_FILTER            OSCCTRL_DPLLCTRLB_FILTER_DEFAULT
 | 
			
		||||
#define BOARD_FDPLL96M_REFCLK            OSCCTRL_DPLLCTRLB_REFLCK_XOSCK32K
 | 
			
		||||
#define BOARD_FDPLL96M_REFCLK_CLKGEN     1
 | 
			
		||||
#undef  BOARD_FDPLL96M_LOCKTIME_ENABLE
 | 
			
		||||
#define BOARD_FDPLL96M_LOCKTIME          OSCCTRL_DPLLCTRLB_LTIME_NONE
 | 
			
		||||
#define BOARD_FDPLL96M_LOCKTIME_CLKGEN   1
 | 
			
		||||
#define BOARD_FDPLL96M_REFDIV            1
 | 
			
		||||
#define BOARD_FDPLL96M_PRESCALER         OSCCTRL_DPLLPRESC_DIV1
 | 
			
		||||
 | 
			
		||||
#define BOARD_FDPLL96M_REFFREQ           32768
 | 
			
		||||
#define BOARD_FDPLL96M_FREQUENCY         48000000
 | 
			
		||||
 | 
			
		||||
/* GCLK Configuration
 | 
			
		||||
 *
 | 
			
		||||
 * Global enable/disable.
 | 
			
		||||
 *
 | 
			
		||||
 *   BOARD_GCLK_ENABLE            - *MUST* be 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 */
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_SAML21_XPLAINED_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_DFLL48M_FREQUENCY / BOARD_GCLK0_PRESCALER)
 | 
			
		||||
#else
 | 
			
		||||
#  undef  BOARD_GCLK0_RUN_IN_STANDBY
 | 
			
		||||
#  define BOARD_GCLK0_CLOCK_SOURCE    GCLK_GENCTRL_SRC_OSC16M
 | 
			
		||||
#  define BOARD_GCLK0_PRESCALER       1
 | 
			
		||||
#  undef  BOARD_GCLK0_OUTPUT_ENABLE
 | 
			
		||||
#  define BOARD_GCLK0_FREQUENCY       (BOARD_OSC16M_FREQUENCY / BOARD_GCLK0_PRESCALER)
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/* Configure GCLK generator 1 - Drives the DFLL */
 | 
			
		||||
 | 
			
		||||
#if defined(CONFIG_SAML21_XPLAINED_DFLL_OSC16MSRC)
 | 
			
		||||
#  define BOARD_GCLK1_ENABLE          1
 | 
			
		||||
#  undef  BOARD_GCLK1_RUN_IN_STANDBY
 | 
			
		||||
#  define BOARD_GCLK1_CLOCK_SOURCE    GCLK_GENCTRL_SRC_OSC16M
 | 
			
		||||
#  define BOARD_GCLK1_PRESCALER       1
 | 
			
		||||
#  undef  BOARD_GCLK1_OUTPUT_ENABLE
 | 
			
		||||
#  define BOARD_GCLK1_FREQUENCY       (BOARD_OSC16M_FREQUENCY / BOARD_GCLK1_PRESCALER)
 | 
			
		||||
#elif defined(CONFIG_SAML21_XPLAINED_DFLL_XOSC32KSRC)
 | 
			
		||||
#  define BOARD_GCLK1_ENABLE          1
 | 
			
		||||
#  undef  BOARD_GCLK1_RUN_IN_STANDBY
 | 
			
		||||
#  define BOARD_GCLK1_CLOCK_SOURCE    GCLK_GENCTRL_SRC_XOSC32K
 | 
			
		||||
#  define BOARD_GCLK1_PRESCALER       1
 | 
			
		||||
#  undef  BOARD_GCLK1_OUTPUT_ENABLE
 | 
			
		||||
#  define BOARD_GCLK1_FREQUENCY       (BOARD_XOSC32K_FREQUENCY / BOARD_GCLK1_PRESCALER)
 | 
			
		||||
#else
 | 
			
		||||
#  error DFLL clock source not provided
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/* 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_OSC32K_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_OSC16M
 | 
			
		||||
#define BOARD_GCLK3_PRESCALER         1
 | 
			
		||||
#undef  BOARD_GCLK3_OUTPUT_ENABLE
 | 
			
		||||
#define BOARD_GCLK3_FREQUENCY         (BOARD_OSC16M_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_OSC16M
 | 
			
		||||
#define BOARD_GCLK4_PRESCALER         1
 | 
			
		||||
#undef  BOARD_GCLK4_OUTPUT_ENABLE
 | 
			
		||||
#define BOARD_GCLK4_FREQUENCY         (BOARD_OSC16M_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_OSC16M
 | 
			
		||||
#define BOARD_GCLK5_PRESCALER         1
 | 
			
		||||
#undef  BOARD_GCLK5_OUTPUT_ENABLE
 | 
			
		||||
#define BOARD_GCLK5_FREQUENCY         (BOARD_OSC16M_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_OSC16M
 | 
			
		||||
#define BOARD_GCLK6_PRESCALER         1
 | 
			
		||||
#undef  BOARD_GCLK6_OUTPUT_ENABLE
 | 
			
		||||
#define BOARD_GCLK6_FREQUENCY         (BOARD_OSC16M_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_OSC16M
 | 
			
		||||
#define BOARD_GCLK7_PRESCALER         1
 | 
			
		||||
#undef  BOARD_GCLK7_OUTPUT_ENABLE
 | 
			
		||||
#define BOARD_GCLK7_FREQUENCY         (BOARD_OSC16M_FREQUENCY / BOARD_GCLK7_PRESCALER)
 | 
			
		||||
 | 
			
		||||
/* Configure GCLK generator 8 */
 | 
			
		||||
 | 
			
		||||
#undef  BOARD_GCLK8_ENABLE
 | 
			
		||||
#undef  BOARD_GCLK8_RUN_IN_STANDBY
 | 
			
		||||
#define BOARD_GCLK8_CLOCK_SOURCE      GCLK_GENCTRL_SRC_OSC16M
 | 
			
		||||
#define BOARD_GCLK8_PRESCALER         1
 | 
			
		||||
#undef  BOARD_GCLK8_OUTPUT_ENABLE
 | 
			
		||||
#define BOARD_GCLK8_FREQUENCY         (BOARD_OSC16M_FREQUENCY / BOARD_GCLK8_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 OSC16M divided by 8.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define BOARD_GCLK_MAIN_FREQUENCY     BOARD_GCLK0_FREQUENCY
 | 
			
		||||
 | 
			
		||||
/* Main clock dividers
 | 
			
		||||
 *
 | 
			
		||||
 *     BOARD_CPU_DIVIDER        - See MCLK_CPUDIV_DIV* definitions
 | 
			
		||||
 *     BOARD_CPU_FRQUENCY       - In Hz
 | 
			
		||||
 *     BOARD_CPU_FAILDECT       - Boolean (defined / not defined)
 | 
			
		||||
 *     BOARD_LOWPOWER_DIVIDER   - See MCLK_LPDIV_DIV_* definitions
 | 
			
		||||
 *     BOARD_LOWPOWER_FREQUENCY - In Hz
 | 
			
		||||
 *     BOARD_BACKUP_DIVIDER     - See MCLK_BUPDIV_DIV_* definitions
 | 
			
		||||
 *     BOARD_BACKUP_FREQUENCY   - In Hz
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#undef  BOARD_CPU_FAILDECT
 | 
			
		||||
#define BOARD_CPU_DIVIDER            MCLK_CPUDIV_DIV1
 | 
			
		||||
#define BOARD_LOWPOWER_DIVIDER       MCLK_LPDIV_DIV1
 | 
			
		||||
#define BOARD_BACKUP_DIVIDER         MCLK_BUPDIV_DIV1
 | 
			
		||||
 | 
			
		||||
/* Resulting frequencies */
 | 
			
		||||
 | 
			
		||||
#define BOARD_MCK_FREQUENCY          (BOARD_GCLK_MAIN_FREQUENCY)
 | 
			
		||||
#define BOARD_CPU_FREQUENCY          (BOARD_MCK_FREQUENCY)
 | 
			
		||||
#define BOARD_LOWPOWER_FREQUENCY     (BOARD_MCK_FREQUENCY)
 | 
			
		||||
#define BOARD_BACKUP_FREQUENCY       (BOARD_MCK_FREQUENCY)
 | 
			
		||||
#define BOARD_APBA_FREQUENCY         (BOARD_MCK_FREQUENCY)
 | 
			
		||||
#define BOARD_APBB_FREQUENCY         (BOARD_MCK_FREQUENCY)
 | 
			
		||||
#define BOARD_APBC_FREQUENCY         (BOARD_MCK_FREQUENCY)
 | 
			
		||||
#define BOARD_APBD_FREQUENCY         (BOARD_MCK_FREQUENCY)
 | 
			
		||||
#define BOARD_APBE_FREQUENCY         (BOARD_MCK_FREQUENCY)
 | 
			
		||||
 | 
			
		||||
/* FLASH wait states
 | 
			
		||||
 *
 | 
			
		||||
 * REVISIT: These values come from the SAMD20
 | 
			
		||||
 * 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
 | 
			
		||||
#  define BOARD_FLASH_WAITSTATES     3
 | 
			
		||||
#else
 | 
			
		||||
#  define BOARD_FLASH_WAITSTATES     1
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/* SERCOM definitions *******************************************************/
 | 
			
		||||
 | 
			
		||||
/* This is the source clock generator for the GCLK_SERCOM_SLOW clock that is
 | 
			
		||||
 * common to SERCOM modules 0-4.
 | 
			
		||||
 * It will generate clocking on the common SERCOM0-4 channel.
 | 
			
		||||
 *
 | 
			
		||||
 * SERCOM5 uses a different channel and will probably need to use a different
 | 
			
		||||
 * GCLK generator.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define BOARD_SERCOM04_SLOW_GCLKGEN  0
 | 
			
		||||
 | 
			
		||||
/* SERCOM0 SPI is available on EXT1
 | 
			
		||||
 *
 | 
			
		||||
 *  PIN PORT SERCOM        FUNCTION
 | 
			
		||||
 *  --- ------------------ -----------
 | 
			
		||||
 *  15  PA5  SERCOM0 PAD1  SPI SS
 | 
			
		||||
 *  16  PA6  SERCOM0 PAD2  SPI MOSI
 | 
			
		||||
 *  17  PA4  SERCOM0 PAD0  SPI MISO
 | 
			
		||||
 *  18  PA7  SERCOM0 PAD3  SPI SCK
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define BOARD_SERCOM0_GCLKGEN        0
 | 
			
		||||
#define BOARD_SERCOM0_SLOW_GCLKGEN   BOARD_SERCOM04_SLOW_GCLKGEN
 | 
			
		||||
#define BOARD_SERCOM0_MUXCONFIG      (SPI_CTRLA_DOPO_DOPAD231 | SPI_CTRLA_DIPAD0)
 | 
			
		||||
#define BOARD_SERCOM0_PINMAP_PAD0    PORT_SERCOM0_PAD0_2 /* SPI_MISO */
 | 
			
		||||
#define BOARD_SERCOM0_PINMAP_PAD1    0                   /* SPI_SS (not used) */
 | 
			
		||||
#define BOARD_SERCOM0_PINMAP_PAD2    PORT_SERCOM0_PAD2_2 /* SPI_MOSI */
 | 
			
		||||
#define BOARD_SERCOM0_PINMAP_PAD3    PORT_SERCOM0_PAD3_2 /* SPI_SCK */
 | 
			
		||||
 | 
			
		||||
#define BOARD_SERCOM0_FREQUENCY      BOARD_GCLK0_FREQUENCY
 | 
			
		||||
 | 
			
		||||
/* SERCOM1 USART is available on EXT2 and EXT3
 | 
			
		||||
 *
 | 
			
		||||
 *   PIN   EXT1 EXT2 EXT3 GPIO Function
 | 
			
		||||
 *   ----  ---- ---- ---- ------------------
 | 
			
		||||
 *    13   ---  PA19 PA19 SERCOM1 / USART RX
 | 
			
		||||
 *    14   ---  PA18 PA18 SERCOM1 / USART TX
 | 
			
		||||
 *    19   GND  GND  GND  N/A
 | 
			
		||||
 *    20   VCC  VCC  VCC  N/A
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define BOARD_SERCOM1_GCLKGEN        0
 | 
			
		||||
#define BOARD_SERCOM1_SLOW_GCLKGEN   BOARD_SERCOM04_SLOW_GCLKGEN
 | 
			
		||||
#define BOARD_SERCOM1_MUXCONFIG      (USART_CTRLA_TXPAD2 | USART_CTRLA_RXPAD3)
 | 
			
		||||
#define BOARD_SERCOM1_PINMAP_PAD0    0                   /* (not used) */
 | 
			
		||||
#define BOARD_SERCOM1_PINMAP_PAD1    0                   /* (not used) */
 | 
			
		||||
#define BOARD_SERCOM1_PINMAP_PAD2    PORT_SERCOM1_PAD2_1 /* USART_TX */
 | 
			
		||||
#define BOARD_SERCOM1_PINMAP_PAD3    PORT_SERCOM1_PAD3_1 /* USART_RX */
 | 
			
		||||
 | 
			
		||||
#define BOARD_SERCOM1_FREQUENCY      BOARD_GCLK0_FREQUENCY
 | 
			
		||||
 | 
			
		||||
/* The SAML21 Xplained Pro contains an Embedded Debugger (EDBG) that can be
 | 
			
		||||
 * used to program and debug the ATSAML21J18A using Serial Wire Debug (SWD).
 | 
			
		||||
 * The Embedded debugger also include a Virtual COM port interface over
 | 
			
		||||
 * SERCOM3.  Virtual COM port connections:
 | 
			
		||||
 *
 | 
			
		||||
 *   PA22 SERCOM3 PAD[0] / USART TXD
 | 
			
		||||
 *   PA23 SERCOM3 PAD[1] / USART RXD
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define BOARD_SERCOM3_GCLKGEN        0
 | 
			
		||||
#define BOARD_SERCOM3_SLOW_GCLKGEN   BOARD_SERCOM04_SLOW_GCLKGEN
 | 
			
		||||
#define BOARD_SERCOM3_MUXCONFIG      (USART_CTRLA_RXPAD1 | USART_CTRLA_TXPAD0_2)
 | 
			
		||||
#define BOARD_SERCOM3_PINMAP_PAD0    PORT_SERCOM3_PAD0_1 /* USART TX */
 | 
			
		||||
#define BOARD_SERCOM3_PINMAP_PAD1    PORT_SERCOM3_PAD1_1 /* USART RX */
 | 
			
		||||
#define BOARD_SERCOM3_PINMAP_PAD2    0                   /* (not used) */
 | 
			
		||||
#define BOARD_SERCOM3_PINMAP_PAD3    0                   /* (not used) */
 | 
			
		||||
 | 
			
		||||
#define BOARD_SERCOM3_FREQUENCY      BOARD_GCLK0_FREQUENCY
 | 
			
		||||
 | 
			
		||||
/* The SERCOM4 USART is available on EXT1
 | 
			
		||||
 *
 | 
			
		||||
 *   PIN   EXT1 EXT2 EXT3 GPIO Function
 | 
			
		||||
 *   ----  ---- ---- ---- ------------------
 | 
			
		||||
 *    13   PB09 ---  ---  SERCOM4 PAD[1] / USART RX
 | 
			
		||||
 *    14   PB08 ---  ---  SERCOM4 PAD[0] / USART TX
 | 
			
		||||
 *    19   GND  GND  GND  N/A
 | 
			
		||||
 *    20   VCC  VCC  VCC  N/A
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define BOARD_SERCOM4_GCLKGEN        0
 | 
			
		||||
#define BOARD_SERCOM4_SLOW_GCLKGEN   BOARD_SERCOM04_SLOW_GCLKGEN
 | 
			
		||||
#define BOARD_SERCOM4_MUXCONFIG      (USART_CTRLA_RXPAD1 | USART_CTRLA_TXPAD0_2)
 | 
			
		||||
#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
 | 
			
		||||
 | 
			
		||||
#define BOARD_SERCOM4_FREQUENCY      BOARD_GCLK0_FREQUENCY
 | 
			
		||||
 | 
			
		||||
/*  SERCOM5 is dedicated for use with SPI at the EXT2 and EXT3 connectors
 | 
			
		||||
 *
 | 
			
		||||
 *  PIN PORT SERCOM        FUNCTION
 | 
			
		||||
 *  --- ------------------ -----------
 | 
			
		||||
 *  15  PB17 SERCOM5 PAD1  SPI SS
 | 
			
		||||
 *  16  PB22 SERCOM5 PAD2  SPI MOSI
 | 
			
		||||
 *  17  PB16 SERCOM5 PAD0  SPI MISO
 | 
			
		||||
 *  18  PB23 SERCOM5 PAD3  SPI SCK
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define BOARD_SERCOM5_GCLKGEN        0
 | 
			
		||||
#define BOARD_SERCOM5_SLOW_GCLKGEN   ?
 | 
			
		||||
#define BOARD_SERCOM5_MUXCONFIG      (SPI_CTRLA_DOPO_DOPAD231 | SPI_CTRLA_DIPAD0)
 | 
			
		||||
#define BOARD_SERCOM5_PINMAP_PAD0    PORT_SERCOM5_PAD0_1 /* SPI_MISO */
 | 
			
		||||
#define BOARD_SERCOM5_PINMAP_PAD1    0                   /* SPI_SS (not used) */
 | 
			
		||||
#define BOARD_SERCOM5_PINMAP_PAD2    PORT_SERCOM5_PAD2_4 /* SPI_MOSI */
 | 
			
		||||
#define BOARD_SERCOM5_PINMAP_PAD3    PORT_SERCOM5_PAD3_4 /* SPI_SCK */
 | 
			
		||||
 | 
			
		||||
#define BOARD_SERCOM5_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 **********************************************************/
 | 
			
		||||
 | 
			
		||||
/* There are three LEDs on board the SAML21 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 STATUS near the SAML21
 | 
			
		||||
 * USB connector.
 | 
			
		||||
 *
 | 
			
		||||
 * This LED is controlled by PC07 and the LED can be activated by driving
 | 
			
		||||
 * the PB10 to GND.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/* 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 */
 | 
			
		||||
 | 
			
		||||
/* Button definitions *******************************************************/
 | 
			
		||||
 | 
			
		||||
/* Mechanical buttons:
 | 
			
		||||
 *
 | 
			
		||||
 * The SAML21 Xplained Pro contains two mechanical buttons.
 | 
			
		||||
 * One button is the RESET button connected to the SAML21 reset line and the
 | 
			
		||||
 * other is a generic user configurable button.
 | 
			
		||||
 * When a button is pressed it will drive the I/O line to GND.
 | 
			
		||||
 *
 | 
			
		||||
 *   PA02 SW0
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/* The SAML21 Xplained Pro supports one button: */
 | 
			
		||||
 | 
			
		||||
#define BUTTON_SW0                   0
 | 
			
		||||
#define NUM_BUTTONS                  1
 | 
			
		||||
 | 
			
		||||
#define BUTTON_SW0_BIT               (1 << BUTTON_SW0)
 | 
			
		||||
 | 
			
		||||
#endif /* __BOARDS_ARM_SAMD2L2_SAML21_XPLAINED_INCLUDE_BOARD_H */
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,63 @@
 | 
			
		|||
############################################################################
 | 
			
		||||
# boards/arm/samd2l2/saml21-xplained/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
 | 
			
		||||
 | 
			
		||||
ifeq ($(CONFIG_CYGWIN_WINTOOL),y)
 | 
			
		||||
  ARCHSCRIPT = -T "${shell cygpath -w $(BOARD_DIR)$(DELIM)scripts$(DELIM)$(LDSCRIPT)}"
 | 
			
		||||
else
 | 
			
		||||
  ARCHSCRIPT = -T$(BOARD_DIR)$(DELIM)scripts$(DELIM)$(LDSCRIPT)
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
ifeq ($(CONFIG_DEBUG_SYMBOLS),y)
 | 
			
		||||
  ARCHOPTIMIZATION = -g
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
ifneq ($(CONFIG_DEBUG_NOOPT),y)
 | 
			
		||||
  ARCHOPTIMIZATION += $(MAXOPTIMIZATION) -fno-strict-aliasing -fno-strength-reduce -fomit-frame-pointer
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
ARCHCFLAGS = -fno-builtin
 | 
			
		||||
ARCHCXXFLAGS = -fno-builtin -fno-exceptions -fcheck-new -fno-rtti
 | 
			
		||||
ARCHWARNINGS = -Wall -Wstrict-prototypes -Wshadow -Wundef
 | 
			
		||||
ARCHWARNINGSXX = -Wall -Wshadow -Wundef
 | 
			
		||||
ARCHPICFLAGS = -fpic -msingle-pic-base -mpic-register=r10
 | 
			
		||||
 | 
			
		||||
CFLAGS := $(ARCHCFLAGS) $(ARCHWARNINGS) $(ARCHOPTIMIZATION) $(ARCHCPUFLAGS) $(ARCHINCLUDES) $(ARCHDEFINES) $(EXTRAFLAGS) -pipe
 | 
			
		||||
CPICFLAGS = $(ARCHPICFLAGS) $(CFLAGS)
 | 
			
		||||
CXXFLAGS := $(ARCHCXXFLAGS) $(ARCHWARNINGSXX) $(ARCHOPTIMIZATION) $(ARCHCPUFLAGS) $(ARCHXXINCLUDES) $(ARCHDEFINES) $(EXTRAFLAGS) -pipe
 | 
			
		||||
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
 | 
			
		||||
 | 
			
		||||
ifneq ($(CROSSDEV),arm-nuttx-elf-)
 | 
			
		||||
  LDFLAGS += -nostartfiles -nodefaultlibs
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(CONFIG_DEBUG_SYMBOLS),y)
 | 
			
		||||
  LDFLAGS += -g
 | 
			
		||||
endif
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,118 @@
 | 
			
		|||
/****************************************************************************
 | 
			
		||||
 * boards/arm/samd2l2/saml21-xplained/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 ATSAML21J18A has 256KB of FLASH beginning at address 0x0000:0000 and
 | 
			
		||||
 * 32KB of SRAM beginning at address 0x2000:0000.  There is also 8KB low-
 | 
			
		||||
 * power SRAM at 0x30000000 that may be used by the DMAC.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
MEMORY
 | 
			
		||||
{
 | 
			
		||||
  flash (rx)  : ORIGIN = 0x00000000, LENGTH = 256K
 | 
			
		||||
  sram  (rwx) : ORIGIN = 0x20000000, LENGTH = 32K
 | 
			
		||||
    lpram (rw)  : ORIGIN = 0x30000000, LENGTH = 8K
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
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(.);
 | 
			
		||||
        *(.init_array .init_array.*)
 | 
			
		||||
        _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
 | 
			
		||||
 | 
			
		||||
    .lpram : {
 | 
			
		||||
        _slpram = ABSOLUTE(.);
 | 
			
		||||
        *(.lpram)
 | 
			
		||||
        _elpram = ABSOLUTE(.);
 | 
			
		||||
    } > lpram
 | 
			
		||||
 | 
			
		||||
    /* 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) }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,53 @@
 | 
			
		|||
############################################################################
 | 
			
		||||
# boards/arm/samd2l2/saml21-xplained/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_SAMD2L2_SERCOM0),y)
 | 
			
		||||
CSRCS += sam_spi.c
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
ifeq ($(CONFIG_ARCH_LEDS),y)
 | 
			
		||||
CSRCS += sam_autoleds.c
 | 
			
		||||
else
 | 
			
		||||
CSRCS += sam_userleds.c
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
ifeq ($(CONFIG_ARCH_BUTTONS),y)
 | 
			
		||||
CSRCS += sam_buttons.c
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
ifeq ($(CONFIG_LIB_BOARDCTL),y)
 | 
			
		||||
CSRCS += sam_appinit.c
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
ifeq ($(CONFIG_SAML21_XPLAINED_IOMODULE),y)
 | 
			
		||||
CSRCS += sam_mmcsd.c
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
ifeq ($(CONFIG_SAML21_XPLAINED_OLED1MODULE),y)
 | 
			
		||||
ifeq ($(CONFIG_LCD_UG2832HSWEG04),y)
 | 
			
		||||
CSRCS += sam_ug2832hsweg04.c
 | 
			
		||||
endif
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
include $(TOPDIR)/boards/Board.mk
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,123 @@
 | 
			
		|||
/****************************************************************************
 | 
			
		||||
 * boards/arm/samd2l2/saml21-xplained/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 <nuttx/config.h>
 | 
			
		||||
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <syslog.h>
 | 
			
		||||
 | 
			
		||||
#include <nuttx/board.h>
 | 
			
		||||
 | 
			
		||||
#include "sam_config.h"
 | 
			
		||||
#include "saml21-xplained.h"
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Pre-processor Definitions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/* Some configuration checks */
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_SAML21_XPLAINED_IOMODULE_EXT1
 | 
			
		||||
#  ifndef SAMD2L2_HAVE_SPI0
 | 
			
		||||
#    error I/O1 module on EXT1 requires SERCOM SPI0
 | 
			
		||||
#    undef CONFIG_SAML21_XPLAINED_IOMODULE
 | 
			
		||||
#  endif
 | 
			
		||||
#  define SPI_PORTNO 0
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_SAML21_XPLAINED_IOMODULE_EXT2
 | 
			
		||||
#  ifndef SAMD2L2_HAVE_SPI1
 | 
			
		||||
#    error I/O1 module on EXT2 requires SERCOM SPI1
 | 
			
		||||
#    undef CONFIG_SAML21_XPLAINED_IOMODULE
 | 
			
		||||
#  endif
 | 
			
		||||
#  define SPI_PORTNO 1
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_SAML21_XPLAINED_IOMODULE
 | 
			
		||||
/* Support for the SD card slot on the I/O1 module */
 | 
			
		||||
 | 
			
		||||
/* Verify NSH PORT and SLOT settings */
 | 
			
		||||
 | 
			
		||||
#  define SAMD2L2_MMCSDSLOTNO  0 /* There is only one slot */
 | 
			
		||||
 | 
			
		||||
#  if defined(CONFIG_NSH_MMCSDSLOTNO) && CONFIG_NSH_MMCSDSLOTNO != SAMD2L2_MMCSDSLOTNO
 | 
			
		||||
#    error Only one MMC/SD slot:  Slot 0 (CONFIG_NSH_MMCSDSLOTNO)
 | 
			
		||||
#  endif
 | 
			
		||||
 | 
			
		||||
#  if defined(CONFIG_NSH_MMCSDSPIPORTNO) && CONFIG_NSH_MMCSDSPIPORTNO != SPI_PORTNO
 | 
			
		||||
#    error CONFIG_NSH_MMCSDSPIPORTNO must have the same value as SPI_PORTNO
 | 
			
		||||
#  endif
 | 
			
		||||
 | 
			
		||||
/* Default MMC/SD minor number */
 | 
			
		||||
 | 
			
		||||
#  ifndef CONFIG_NSH_MMCSDMINOR
 | 
			
		||||
#    define CONFIG_NSH_MMCSDMINOR 0
 | 
			
		||||
#  endif
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * 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)
 | 
			
		||||
{
 | 
			
		||||
#if defined(SAMD2L2_HAVE_SPI0) && defined(CONFIG_SAML21_XPLAINED_IOMODULE)
 | 
			
		||||
  /* Initialize the SPI-based MMC/SD slot */
 | 
			
		||||
 | 
			
		||||
  int ret = sam_sdinitialize(SPI_PORTNO, CONFIG_NSH_MMCSDMINOR);
 | 
			
		||||
  if (ret < 0)
 | 
			
		||||
    {
 | 
			
		||||
      syslog(LOG_ERR, "ERROR: Failed to initialize MMC/SD slot: %d\n",
 | 
			
		||||
             ret);
 | 
			
		||||
      return ret;
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
  return OK;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,149 @@
 | 
			
		|||
/****************************************************************************
 | 
			
		||||
 * boards/arm/samd2l2/saml21-xplained/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.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/* There are three LEDs on board the SAML21 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 STATUS near the SAML21
 | 
			
		||||
 * USB connector.
 | 
			
		||||
 *
 | 
			
		||||
 * This LED is controlled by PB10 and the LED can be activated by driving
 | 
			
		||||
 * PB10 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.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Included Files
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#include <nuttx/config.h>
 | 
			
		||||
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
#include <stdbool.h>
 | 
			
		||||
#include <debug.h>
 | 
			
		||||
 | 
			
		||||
#include <nuttx/board.h>
 | 
			
		||||
#include <arch/board/board.h>
 | 
			
		||||
 | 
			
		||||
#include "sam_port.h"
 | 
			
		||||
#include "saml21-xplained.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 */
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,77 @@
 | 
			
		|||
/****************************************************************************
 | 
			
		||||
 * boards/arm/samd2l2/saml21-xplained/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 <nuttx/config.h>
 | 
			
		||||
 | 
			
		||||
#include <debug.h>
 | 
			
		||||
 | 
			
		||||
#include <nuttx/board.h>
 | 
			
		||||
 | 
			
		||||
#include "sam_config.h"
 | 
			
		||||
#include "saml21-xplained.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 SPI chip selects if
 | 
			
		||||
   * 1) SPI is not disabled, and
 | 
			
		||||
   * 2) the weak function
 | 
			
		||||
   * sam_spidev_initialize() has been brought into the link.
 | 
			
		||||
   */
 | 
			
		||||
 | 
			
		||||
#ifdef SAMD2L2_HAVE_SPI
 | 
			
		||||
  if (sam_spidev_initialize)
 | 
			
		||||
    {
 | 
			
		||||
      sam_spidev_initialize();
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
  /* Configure on-board LEDs if LED support has been selected. */
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_ARCH_LEDS
 | 
			
		||||
  board_autoled_initialize();
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,128 @@
 | 
			
		|||
/****************************************************************************
 | 
			
		||||
 * boards/arm/samd2l2/saml21-xplained/src/sam_buttons.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 <nuttx/config.h>
 | 
			
		||||
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
#include <errno.h>
 | 
			
		||||
 | 
			
		||||
#include <nuttx/arch.h>
 | 
			
		||||
#include <nuttx/board.h>
 | 
			
		||||
#include <nuttx/irq.h>
 | 
			
		||||
 | 
			
		||||
#include <nuttx/irq.h>
 | 
			
		||||
#include <arch/board/board.h>
 | 
			
		||||
 | 
			
		||||
#include "sam_port.h"
 | 
			
		||||
#include "saml21-xplained.h"
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_ARCH_BUTTONS
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Public Functions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: board_button_initialize
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   board_button_initialize() must be called to initialize button resources.
 | 
			
		||||
 *   After that, board_buttons() may be called to collect the current state
 | 
			
		||||
 *   of all buttons or board_button_irq() may be called to register button
 | 
			
		||||
 *   interrupt handlers.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
uint32_t board_button_initialize(void)
 | 
			
		||||
{
 | 
			
		||||
  sam_configport(PORT_SW0);
 | 
			
		||||
  return NUM_BUTTONS;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: board_buttons
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   After board_button_initialize() has been called,
 | 
			
		||||
 *   board_buttons() may be called to collect the state of all buttons.
 | 
			
		||||
 *   board_buttons() returns an 32-bit bit set with each bit associated
 | 
			
		||||
 *   with a button.  See the BUTTON* definitions above for the meaning of
 | 
			
		||||
 *   each bit in the returned value.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
uint32_t board_buttons(void)
 | 
			
		||||
{
 | 
			
		||||
  return sam_portread(PORT_SW0) ? 0 : BUTTON_SW0_BIT;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: board_button_irq
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   This function may be called to register an interrupt handler that will
 | 
			
		||||
 *   be called when a button is depressed or released.  The ID value is one
 | 
			
		||||
 *   of the BUTTON* definitions provided above.
 | 
			
		||||
 *
 | 
			
		||||
 * Configuration Notes:
 | 
			
		||||
 *   Configuration CONFIG_AVR32_PORTIRQ must be selected to enable the
 | 
			
		||||
 *   overall PORT IRQ feature and CONFIG_AVR32_PORTIRQSETA and/or
 | 
			
		||||
 *   CONFIG_AVR32_PORTIRQSETB must be enabled to select PORTs to support
 | 
			
		||||
 *   interrupts on.  For button support, bits 2 and 3 must be set in
 | 
			
		||||
 *   CONFIG_AVR32_PORTIRQSETB (PB2 and PB3).
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#if defined(CONFIG_PORTA_IRQ) && defined(CONFIG_ARCH_IRQBUTTONS)
 | 
			
		||||
int board_button_irq(int id, xcpt_t irqhandler, FAR void *arg)
 | 
			
		||||
{
 | 
			
		||||
  int ret = -EINVAL;
 | 
			
		||||
 | 
			
		||||
  if (id == BUTTON_SW0)
 | 
			
		||||
    {
 | 
			
		||||
      irqstate_t flags;
 | 
			
		||||
 | 
			
		||||
      /* Disable interrupts until we are done.  This guarantees that the
 | 
			
		||||
       * following operations are atomic.
 | 
			
		||||
       */
 | 
			
		||||
 | 
			
		||||
      flags = enter_critical_section();
 | 
			
		||||
 | 
			
		||||
      /* Configure the interrupt */
 | 
			
		||||
 | 
			
		||||
      sam_portirq(IRQ_SW0);
 | 
			
		||||
      irq_attach(IRQ_SW0, irqhandler, arg);
 | 
			
		||||
      sam_portirqenable(IRQ_SW0);
 | 
			
		||||
 | 
			
		||||
      leave_critical_section(flags);
 | 
			
		||||
      ret = OK;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  /* Return the old button handler (so that it can be restored) */
 | 
			
		||||
 | 
			
		||||
  return ret;
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif /* CONFIG_ARCH_BUTTONS */
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,114 @@
 | 
			
		|||
/****************************************************************************
 | 
			
		||||
 * boards/arm/samd2l2/saml21-xplained/src/sam_mmcsd.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 <nuttx/config.h>
 | 
			
		||||
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <debug.h>
 | 
			
		||||
#include <errno.h>
 | 
			
		||||
 | 
			
		||||
#include <nuttx/spi/spi.h>
 | 
			
		||||
#include <nuttx/mmcsd.h>
 | 
			
		||||
 | 
			
		||||
#include "sam_config.h"
 | 
			
		||||
#include "sam_spi.h"
 | 
			
		||||
 | 
			
		||||
#include "saml21-xplained.h"
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_SAML21_XPLAINED_IOMODULE
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Pre-processor Definitions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/* Configuration ************************************************************/
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_DISABLE_MOUNTPOINT
 | 
			
		||||
#  error Mountpoints are disabled (CONFIG_DISABLE_MOUNTPOINT=y)
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifndef SAMD2L2_HAVE_SPI0
 | 
			
		||||
#  error SERCOM0 SPI support is required
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifndef CONFIG_MMCSD
 | 
			
		||||
#  error MMC/SD support is required (CONFIG_MMCSD)
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define SAMD2L2_MMCSDSLOTNO  0 /* There is only one slot */
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Public Functions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: sam_sdinitialize
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   Initialize the SPI-based SD card.  Requires
 | 
			
		||||
 *   - CONFIG_SAML21_XPLAINED_IOMODULE=y,
 | 
			
		||||
 *   - CONFIG_DISABLE_MOUNTPOINT=n,
 | 
			
		||||
 *   - CONFIG_MMCSD=y, and
 | 
			
		||||
 *   - SAMD2L2_HAVE_SPI0=y
 | 
			
		||||
 *    (CONFIG_SAMD2L2_SERCOM0 && CONFIG_SAMD2L2_SERCOM0_ISSPI)
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
int sam_sdinitialize(int port, int minor)
 | 
			
		||||
{
 | 
			
		||||
  FAR struct spi_dev_s *spi;
 | 
			
		||||
  int ret;
 | 
			
		||||
 | 
			
		||||
  /* Get the SPI driver instance for the SD chip select */
 | 
			
		||||
 | 
			
		||||
  finfo("Initializing SERCOM SPI%d\n", port);
 | 
			
		||||
 | 
			
		||||
  spi = sam_spibus_initialize(port);
 | 
			
		||||
  if (!spi)
 | 
			
		||||
    {
 | 
			
		||||
      ferr("ERROR: Failed to initialize SPI%d\n", port);
 | 
			
		||||
      return -ENODEV;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  finfo("Successfully initialized SPI%d\n", port);
 | 
			
		||||
 | 
			
		||||
  /* Bind the SPI device for the chip select to the slot */
 | 
			
		||||
 | 
			
		||||
  finfo("Binding SPI%d to MMC/SD slot %d\n", port, SAMD2L2_MMCSDSLOTNO);
 | 
			
		||||
 | 
			
		||||
  ret = mmcsd_spislotinitialize(minor, SAMD2L2_MMCSDSLOTNO, spi);
 | 
			
		||||
  if (ret < 0)
 | 
			
		||||
    {
 | 
			
		||||
      ferr("ERROR: Failed to bind SPI%d to MMC/SD slot %d: %d\n",
 | 
			
		||||
            port, SAMD2L2_MMCSDSLOTNO, ret);
 | 
			
		||||
      return ret;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  finfo("Successfully bound SPI%d to MMC/SD slot %d\n",
 | 
			
		||||
        port, SAMD2L2_MMCSDSLOTNO);
 | 
			
		||||
 | 
			
		||||
  return OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif /* CONFIG_SAML21_XPLAINED_IOMODULE */
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,406 @@
 | 
			
		|||
/****************************************************************************
 | 
			
		||||
 * boards/arm/samd2l2/saml21-xplained/src/sam_spi.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 <nuttx/config.h>
 | 
			
		||||
 | 
			
		||||
#include <stdbool.h>
 | 
			
		||||
#include <debug.h>
 | 
			
		||||
#include <errno.h>
 | 
			
		||||
 | 
			
		||||
#include <nuttx/spi/spi.h>
 | 
			
		||||
 | 
			
		||||
#include "sam_config.h"
 | 
			
		||||
#include "sam_port.h"
 | 
			
		||||
#include "sam_spi.h"
 | 
			
		||||
 | 
			
		||||
#include "saml21-xplained.h"
 | 
			
		||||
 | 
			
		||||
#ifdef SAMD2L2_HAVE_SPI
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Public Functions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: sam_spidev_initialize
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   Called to configure SPI chip select PORT pins for the SAML21 Xplained
 | 
			
		||||
 *   Pro board.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
void weak_function sam_spidev_initialize(void)
 | 
			
		||||
{
 | 
			
		||||
  /* The I/O module containing the SD connector may or may not be installed.
 | 
			
		||||
   *  And, if it is installed, it may be in connector EXT1 or EXT2.
 | 
			
		||||
   */
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_SAML21_XPLAINED_IOMODULE
 | 
			
		||||
  /* TODO: enable interrupt on card detect */
 | 
			
		||||
 | 
			
		||||
  sam_configport(PORT_SD_CD);     /* Card detect input */
 | 
			
		||||
  sam_configport(PORT_SD_CS);     /* Chip select output */
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_SAML21_XPLAINED_OLED1MODULE
 | 
			
		||||
  sam_configport(PORT_OLED_DATA); /* Command/data */
 | 
			
		||||
  sam_configport(PORT_OLED_CS);   /* Card detect input */
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name:  sam_spi[n]select, sam_spi[n]status, and sam_spi[n]cmddata
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   These external functions must be provided by board-specific logic.  They
 | 
			
		||||
 *   include:
 | 
			
		||||
 *
 | 
			
		||||
 *   o sam_spi[n]select is a functions to manage the board-specific chip
 | 
			
		||||
 *     selects
 | 
			
		||||
 *   o sam_spi[n]status and sam_spi[n]cmddata:  Implementations of the status
 | 
			
		||||
 *     and cmddata methods of the SPI interface defined by struct spi_ops_
 | 
			
		||||
 *     (see include/nuttx/spi/spi.h). All other methods including
 | 
			
		||||
 *     sam_spibus_initialize()) are provided by common SAMD/L logic.
 | 
			
		||||
 *
 | 
			
		||||
 *   Where [n] is the SERCOM number for the SPI module.
 | 
			
		||||
 *
 | 
			
		||||
 *   To use this common SPI logic on your board:
 | 
			
		||||
 *
 | 
			
		||||
 *   1. Provide logic in sam_boardinitialize() to configure SPI chip select
 | 
			
		||||
 *      pins.
 | 
			
		||||
 *   2. Provide sam_spi[n]select() and sam_spi[n]status() functions in your
 | 
			
		||||
 *      board-specific logic.  These functions will perform chip selection
 | 
			
		||||
 *      and status operations using GPIOs in the way your board is
 | 
			
		||||
 *      configured.
 | 
			
		||||
 *   2. If CONFIG_SPI_CMDDATA is defined in the NuttX configuration, provide
 | 
			
		||||
 *      sam_spi[n]cmddata() functions in your board-specific logic.  This
 | 
			
		||||
 *      function will perform cmd/data selection operations using GPIOs in
 | 
			
		||||
 *      the way your board is configured.
 | 
			
		||||
 *   3. Add a call to sam_spibus_initialize() in your low level application
 | 
			
		||||
 *      initialization logic
 | 
			
		||||
 *   4. The handle returned by sam_spibus_initialize() may then be used to
 | 
			
		||||
 *      bind the  SPI driver to higher level logic (e.g., calling
 | 
			
		||||
 *      mmcsd_spislotinitialize(), for example, will bind the SPI driver to
 | 
			
		||||
 *      the SPI MMC/SD driver).
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: sam_spi[n]select
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   PIO chip select pins may be programmed by the board specific logic in
 | 
			
		||||
 *   one of two different ways.  First, the pins may be programmed as SPI
 | 
			
		||||
 *   peripherals.  In that case, the pins are completely controlled by the
 | 
			
		||||
 *   SPI driver.  This method still needs to be provided, but it may be only
 | 
			
		||||
 *   a stub.
 | 
			
		||||
 *
 | 
			
		||||
 *   An alternative way to program the PIO chip select pins is as a normal
 | 
			
		||||
 *   GPIO output.  In that case, the automatic control of the CS pins is
 | 
			
		||||
 *   bypassed and this function must provide control of the chip select.
 | 
			
		||||
 *   NOTE:  In this case, the GPIO output pin does *not* have to be the
 | 
			
		||||
 *   same as the NPCS pin normal associated with the chip select number.
 | 
			
		||||
 *
 | 
			
		||||
 * Input Parameters:
 | 
			
		||||
 *   dev - SPI device info
 | 
			
		||||
 *   devid - Identifies the (logical) device
 | 
			
		||||
 *   selected - TRUE:Select the device, FALSE:De-select the device
 | 
			
		||||
 *
 | 
			
		||||
 * Returned Value:
 | 
			
		||||
 *   None
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#ifdef SAMD2L2_HAVE_SPI0
 | 
			
		||||
void sam_spi0select(FAR struct spi_dev_s *dev, uint32_t devid,
 | 
			
		||||
                    bool selected)
 | 
			
		||||
{
 | 
			
		||||
#ifdef CONFIG_SAML21_XPLAINED_IOMODULE_EXT1
 | 
			
		||||
  /* Select/de-select the SD card */
 | 
			
		||||
 | 
			
		||||
  if (devid == SPIDEV_MMCSD(0))
 | 
			
		||||
    {
 | 
			
		||||
      /* Active low */
 | 
			
		||||
 | 
			
		||||
      sam_portwrite(PORT_SD_CS, !selected);
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_SAML21_XPLAINED_OLED1MODULE_EXT1
 | 
			
		||||
  /* Select/de-select the OLED */
 | 
			
		||||
 | 
			
		||||
  if (devid == SPIDEV_DISPLAY(0))
 | 
			
		||||
    {
 | 
			
		||||
      /* Active low */
 | 
			
		||||
 | 
			
		||||
      sam_portwrite(PORT_OLED_CS, !selected);
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef SAMD2L2_HAVE_SPI1
 | 
			
		||||
void sam_spi1select(FAR struct spi_dev_s *dev, uint32_t devid,
 | 
			
		||||
                    bool selected)
 | 
			
		||||
{
 | 
			
		||||
#ifdef CONFIG_SAML21_XPLAINED_IOMODULE_EXT2
 | 
			
		||||
  /* Select/de-select the SD card */
 | 
			
		||||
 | 
			
		||||
  if (devid == SPIDEV_MMCSD(0))
 | 
			
		||||
    {
 | 
			
		||||
      /* Active low */
 | 
			
		||||
 | 
			
		||||
      sam_portwrite(PORT_SD_CS, !selected);
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_SAML21_XPLAINED_OLED1MODULE_EXT2
 | 
			
		||||
  /* Select/de-select the OLED */
 | 
			
		||||
 | 
			
		||||
  if (devid == SPIDEV_DISPLAY(0))
 | 
			
		||||
    {
 | 
			
		||||
      /* Active low */
 | 
			
		||||
 | 
			
		||||
      sam_portwrite(PORT_OLED_CS, !selected);
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef SAMD2L2_HAVE_SPI2
 | 
			
		||||
void sam_spi2select(FAR struct spi_dev_s *dev, uint32_t devid,
 | 
			
		||||
                    bool selected)
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef SAMD2L2_HAVE_SPI3
 | 
			
		||||
void sam_spi3select(FAR struct spi_dev_s *dev, uint32_t devid,
 | 
			
		||||
                    bool selected)
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef SAMD2L2_HAVE_SPI4
 | 
			
		||||
void sam_spi4select(FAR struct spi_dev_s *dev, uint32_t devid,
 | 
			
		||||
                    bool selected)
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef SAMD2L2_HAVE_SPI5
 | 
			
		||||
void sam_spi5select(FAR struct spi_dev_s *dev, uint32_t devid,
 | 
			
		||||
                    bool selected)
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: sam_spi[n]status
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   Return status information associated with the SPI device.
 | 
			
		||||
 *
 | 
			
		||||
 * Input Parameters:
 | 
			
		||||
 *   dev - SPI device info
 | 
			
		||||
 *   devid - Identifies the (logical) device
 | 
			
		||||
 *
 | 
			
		||||
 * Returned Value:
 | 
			
		||||
 *   Bit-encoded SPI status (see include/nuttx/spi/spi.h.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#ifdef SAMD2L2_HAVE_SPI0
 | 
			
		||||
uint8_t sam_spi0status(FAR struct spi_dev_s *dev, uint32_t devid)
 | 
			
		||||
{
 | 
			
		||||
  uint8_t ret = 0;
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_SAML21_XPLAINED_IOMODULE_EXT1
 | 
			
		||||
  /* Check if an SD card is present in the microSD slot */
 | 
			
		||||
 | 
			
		||||
  if (devid == SPIDEV_MMCSD(0))
 | 
			
		||||
    {
 | 
			
		||||
      /* Active low */
 | 
			
		||||
 | 
			
		||||
      if (!sam_portread(PORT_SD_CD))
 | 
			
		||||
        {
 | 
			
		||||
          ret |= SPI_STATUS_PRESENT;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
  return ret;
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef SAMD2L2_HAVE_SPI1
 | 
			
		||||
uint8_t sam_spi1status(FAR struct spi_dev_s *dev, uint32_t devid)
 | 
			
		||||
{
 | 
			
		||||
  uint8_t ret = 0;
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_SAML21_XPLAINED_IOMODULE_EXT2
 | 
			
		||||
  /* Check if an SD card is present in the microSD slot */
 | 
			
		||||
 | 
			
		||||
  if (devid == SPIDEV_MMCSD(0))
 | 
			
		||||
    {
 | 
			
		||||
      /* Active low */
 | 
			
		||||
 | 
			
		||||
      if (!sam_portread(PORT_SD_CD))
 | 
			
		||||
        {
 | 
			
		||||
          ret |= SPI_STATUS_PRESENT;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
  return ret;
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef SAMD2L2_HAVE_SPI2
 | 
			
		||||
uint8_t sam_spi2status(FAR struct spi_dev_s *dev, uint32_t devid)
 | 
			
		||||
{
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef SAMD2L2_HAVE_SPI3
 | 
			
		||||
uint8_t sam_spi3status(FAR struct spi_dev_s *dev, uint32_t devid)
 | 
			
		||||
{
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef SAMD2L2_HAVE_SPI4
 | 
			
		||||
uint8_t sam_spi4status(FAR struct spi_dev_s *dev, uint32_t devid)
 | 
			
		||||
{
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef SAMD2L2_HAVE_SPI5
 | 
			
		||||
uint8_t sam_spi5status(FAR struct spi_dev_s *dev, uint32_t devid)
 | 
			
		||||
{
 | 
			
		||||
  uint8_t ret = 0;
 | 
			
		||||
  return ret;
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: sam_spi[n]cmddata
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   Some SPI devices require an additional control to determine if the SPI
 | 
			
		||||
 *   data being sent is a command or is data.  If CONFIG_SPI_CMDDATA then
 | 
			
		||||
 *   this function will be called to different be command and data transfers.
 | 
			
		||||
 *
 | 
			
		||||
 *   This is often needed, for example, by LCD drivers.  Some LCD hardware
 | 
			
		||||
 *   may be configured to use 9-bit data transfers with the 9th bit
 | 
			
		||||
 *   indicating command or data.  That same hardware may be configurable,
 | 
			
		||||
 *   instead, to use 8-bit data but to require an additional, board-
 | 
			
		||||
 *   specific GPIO control to distinguish command and data.  This function
 | 
			
		||||
 *   would be needed in that latter case.
 | 
			
		||||
 *
 | 
			
		||||
 * Input Parameters:
 | 
			
		||||
 *   dev - SPI device info
 | 
			
		||||
 *   devid - Identifies the (logical) device
 | 
			
		||||
 *
 | 
			
		||||
 * Returned Value:
 | 
			
		||||
 *   Zero on success; a negated errno on failure.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_SPI_CMDDATA
 | 
			
		||||
#ifdef SAMD2L2_HAVE_SPI0
 | 
			
		||||
int sam_spi0cmddata(FAR struct spi_dev_s *dev, uint32_t devid, bool cmd)
 | 
			
		||||
{
 | 
			
		||||
#ifdef CONFIG_SAML21_XPLAINED_OLED1MODULE_EXT1
 | 
			
		||||
  if (devid == SPIDEV_DISPLAY(0))
 | 
			
		||||
    {
 | 
			
		||||
      /* This is the Data/Command control pad which determines whether the
 | 
			
		||||
       * data bits are data or a command.
 | 
			
		||||
       *
 | 
			
		||||
       * High: the inputs are treated as display data.
 | 
			
		||||
       * Low:  the inputs are transferred to the command registers.
 | 
			
		||||
       */
 | 
			
		||||
 | 
			
		||||
      sam_portwrite(PORT_OLED_DATA, !cmd);
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
  return OK;
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef SAMD2L2_HAVE_SPI1
 | 
			
		||||
int sam_spi1cmddata(FAR struct spi_dev_s *dev, uint32_t devid, bool cmd)
 | 
			
		||||
{
 | 
			
		||||
#ifdef CONFIG_SAML21_XPLAINED_OLED1MODULE_EXT2
 | 
			
		||||
  if (devid == SPIDEV_DISPLAY(0))
 | 
			
		||||
    {
 | 
			
		||||
      /* This is the Data/Command control pad which determines whether the
 | 
			
		||||
       * data bits are data or a command.
 | 
			
		||||
       *
 | 
			
		||||
       * High: the inputs are treated as display data.
 | 
			
		||||
       * Low:  the inputs are transferred to the command registers.
 | 
			
		||||
       */
 | 
			
		||||
 | 
			
		||||
      sam_portwrite(PORT_OLED_DATA, !cmd);
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
  return OK;
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef SAMD2L2_HAVE_SPI2
 | 
			
		||||
int sam_spi2cmddata(FAR struct spi_dev_s *dev, uint32_t devid, bool cmd)
 | 
			
		||||
{
 | 
			
		||||
  return OK;
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef SAMD2L2_HAVE_SPI3
 | 
			
		||||
int sam_spi3cmddata(FAR struct spi_dev_s *dev, uint32_t devid, bool cmd)
 | 
			
		||||
{
 | 
			
		||||
  return OK;
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef SAMD2L2_HAVE_SPI4
 | 
			
		||||
int sam_spi4cmddata(FAR struct spi_dev_s *dev, uint32_t devid, bool cmd)
 | 
			
		||||
{
 | 
			
		||||
  return OK;
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef SAMD2L2_HAVE_SPI5
 | 
			
		||||
int sam_spi5cmddata(FAR struct spi_dev_s *dev, uint32_t devid, bool cmd)
 | 
			
		||||
{
 | 
			
		||||
  return OK;
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif /* CONFIG_SPI_CMDDATA */
 | 
			
		||||
#endif /* SAMD2L2_HAVE_SPI */
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,191 @@
 | 
			
		|||
/****************************************************************************
 | 
			
		||||
 * boards/arm/samd2l2/saml21-xplained/src/sam_ug2832hsweg04.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.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/* OLED1 Connector:
 | 
			
		||||
 *
 | 
			
		||||
 *  OLED1 CONNECTOR
 | 
			
		||||
 *  ----------------- ---------------------- ----------------------
 | 
			
		||||
 *  OLED1             EXT1                   EXT2
 | 
			
		||||
 *  ----------------- ---------------------- ----------------------
 | 
			
		||||
 *  1  ID             1                      1
 | 
			
		||||
 *  ----------------- ---------------------- ----------------------
 | 
			
		||||
 *  2  GND            2       GND            2  GND
 | 
			
		||||
 *  ----------------- ---------------------- ----------------------
 | 
			
		||||
 *  3  BUTTON2        3  PB00 AIN[8]         3  PA10 AIN[18]
 | 
			
		||||
 *  ----------------- ---------------------- ----------------------
 | 
			
		||||
 *  4  BUTTON3        4  PB01 AIN[9]         4  PA11 AIN[19]
 | 
			
		||||
 *  ----------------- ---------------------- ----------------------
 | 
			
		||||
 *  5  DATA_CMD_SEL   5  PB06 PORT           5  PA20 PORT
 | 
			
		||||
 *  ----------------- ---------------------- ----------------------
 | 
			
		||||
 *  6  LED3           6  PB07 PORT           6  PA21 PORT
 | 
			
		||||
 *  ----------------- ---------------------- ----------------------
 | 
			
		||||
 *  7  LED1           7  PB02 TC6/WO[0]      7  PA22 TC4/WO[0]
 | 
			
		||||
 *  ----------------- ---------------------- ----------------------
 | 
			
		||||
 *  8  LED2           8  PB03 TC6/WO[1]      8  PA23 TC4/WO[1]
 | 
			
		||||
 *  ----------------- ---------------------- ----------------------
 | 
			
		||||
 *  9  BUTTON1        9  PB04 EXTINT[4]      9  PB14 EXTINT[14]
 | 
			
		||||
 *  ----------------- ---------------------- ----------------------
 | 
			
		||||
 *  10 DISPLAY_RESET  10 PB05 PORT           10 PB15 PORT
 | 
			
		||||
 *  ----------------- ---------------------- ----------------------
 | 
			
		||||
 *  11 N/C            11 PA08 SERCOM2 PAD[0] 11 PA08 SERCOM2 PAD[0]
 | 
			
		||||
 *                            I²C SDA                I²C SDA
 | 
			
		||||
 *  ----------------- ---------------------- ----------------------
 | 
			
		||||
 *  12 N/C            12 PA09 SERCOM2 PAD[1] 12 PA09 SERCOM2 PAD[1]
 | 
			
		||||
 *                            I²C SCL                I²C SCL
 | 
			
		||||
 *  ----------------- ---------------------- ----------------------
 | 
			
		||||
 *  13 N/C            13 PB09 SERCOM4 PAD[1] 13 PB13 SERCOM4 PAD[1]
 | 
			
		||||
 *                            USART RX               USART RX
 | 
			
		||||
 *  ----------------- ---------------------- ----------------------
 | 
			
		||||
 *  14 N/C            14 PB08 SERCOM4 PAD[0] 14 PB12 SERCOM4 PAD[0]
 | 
			
		||||
 *                            USART TX               USART TX
 | 
			
		||||
 *  ----------------- ---------------------- ----------------------
 | 
			
		||||
 *  15 DISPLAY_SS     15 PA05 SERCOM0 PAD[1] 15 PA17 SERCOM1 PAD[1]
 | 
			
		||||
 *                            SPI SS                 SPI SS
 | 
			
		||||
 *  ----------------- ---------------------- ----------------------
 | 
			
		||||
 *  16 SPI_MOSI       16 PA06 SERCOM0 PAD[2] 16 PA18 SERCOM1 PAD[2]
 | 
			
		||||
 *                            SPI MOSI               SPI MOSI
 | 
			
		||||
 *  ----------------- ---------------------- ----------------------
 | 
			
		||||
 *  17 N/C            17 PA04 SERCOM0 PAD[0] 17 PA16 SERCOM1 PAD[0]
 | 
			
		||||
 *                            SPI MISO               SPI MISO
 | 
			
		||||
 *  ----------------- ---------------------- ----------------------
 | 
			
		||||
 *  18 SPI_SCK        18 PA07 SERCOM0 PAD[3] 18 PA19 SERCOM1 PAD[3]
 | 
			
		||||
 *                            SPI SCK                SPI SCK
 | 
			
		||||
 *  ----------------- ---------------------- ----------------------
 | 
			
		||||
 *  19 GND            19      GND               GND
 | 
			
		||||
 *  ----------------- ---------------------- ----------------------
 | 
			
		||||
 *  20 VCC            20      VCC               VCC
 | 
			
		||||
 *  ----------------- ---------------------- ----------------------
 | 
			
		||||
 *
 | 
			
		||||
 * OLED1 signals
 | 
			
		||||
 *
 | 
			
		||||
 * DATA_CMD_SEL - Data/command select. Used to choose whether the
 | 
			
		||||
 *   communication is data to the display memory or a command to the LCD
 | 
			
		||||
 *   controller. High = data, low = command
 | 
			
		||||
 * DISPLAY_RESET - Reset signal to the OLED display, active low. Used during
 | 
			
		||||
 *   initialization of the display.
 | 
			
		||||
 * DISPLAY_SS - SPI slave select signal, must be held low during SPI
 | 
			
		||||
 *   communication.
 | 
			
		||||
 * SPI_MOSI - SPI master out, slave in signal. Used to write data to the
 | 
			
		||||
 *   display
 | 
			
		||||
 * SPI_SCK SPI - clock signal, generated by the master.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Included Files
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#include <nuttx/config.h>
 | 
			
		||||
 | 
			
		||||
#include <debug.h>
 | 
			
		||||
 | 
			
		||||
#include <nuttx/board.h>
 | 
			
		||||
#include <nuttx/spi/spi.h>
 | 
			
		||||
#include <nuttx/lcd/lcd.h>
 | 
			
		||||
#include <nuttx/lcd/ssd1306.h>
 | 
			
		||||
 | 
			
		||||
#include "sam_port.h"
 | 
			
		||||
#include "sam_spi.h"
 | 
			
		||||
 | 
			
		||||
#include "saml21-xplained.h"
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_SAML21_XPLAINED_OLED1MODULE
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Pre-processor Definitions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/* Configuration ************************************************************/
 | 
			
		||||
 | 
			
		||||
/* The pin configurations here require that SPI1 is selected */
 | 
			
		||||
 | 
			
		||||
#ifndef CONFIG_LCD_SSD1306
 | 
			
		||||
#  error "The OLED driver requires CONFIG_LCD_SSD1306 in the configuration"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifndef CONFIG_LCD_UG2832HSWEG04
 | 
			
		||||
#  error "The OLED driver requires CONFIG_LCD_UG2832HSWEG04 in the configuration"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifndef SAMD2L2_HAVE_SPI0
 | 
			
		||||
#  error "The OLED driver requires SAMD2L2_HAVE_SPI0 in the configuration"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifndef CONFIG_SPI_CMDDATA
 | 
			
		||||
#  error "The OLED driver requires CONFIG_SPI_CMDDATA in the configuration"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Public Functions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: board_graphics_setup
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   Called by NX initialization logic to configure the OLED.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
FAR struct lcd_dev_s *board_graphics_setup(unsigned int devno)
 | 
			
		||||
{
 | 
			
		||||
  FAR struct spi_dev_s *spi;
 | 
			
		||||
  FAR struct lcd_dev_s *dev;
 | 
			
		||||
 | 
			
		||||
  /* Configure the OLED PORTs. This initial configuration is RESET low,
 | 
			
		||||
   * putting the OLED into reset state.
 | 
			
		||||
   */
 | 
			
		||||
 | 
			
		||||
  sam_configport(PORT_OLED_RST);
 | 
			
		||||
 | 
			
		||||
  /* Wait a bit then release the OLED from the reset state */
 | 
			
		||||
 | 
			
		||||
  up_mdelay(20);
 | 
			
		||||
  sam_portwrite(PORT_OLED_RST, true);
 | 
			
		||||
 | 
			
		||||
  /* Get the SPI1 port interface */
 | 
			
		||||
 | 
			
		||||
  spi = sam_spibus_initialize(OLED_CSNO);
 | 
			
		||||
  if (!spi)
 | 
			
		||||
    {
 | 
			
		||||
      lcderr("ERROR: Failed to initialize SPI port 1\n");
 | 
			
		||||
    }
 | 
			
		||||
  else
 | 
			
		||||
    {
 | 
			
		||||
      /* Bind the SPI port to the OLED */
 | 
			
		||||
 | 
			
		||||
      dev = ssd1306_initialize(spi, NULL, devno);
 | 
			
		||||
      if (!dev)
 | 
			
		||||
        {
 | 
			
		||||
          lcderr("ERROR: Failed to bind SPI port 1 to OLED %d\n", devno);
 | 
			
		||||
        }
 | 
			
		||||
     else
 | 
			
		||||
        {
 | 
			
		||||
          lcdinfo("Bound SPI port 1 to OLED %d\n", devno);
 | 
			
		||||
 | 
			
		||||
          /* And turn the OLED on */
 | 
			
		||||
 | 
			
		||||
          dev->setpower(dev, CONFIG_LCD_MAXPOWER);
 | 
			
		||||
          return dev;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  return NULL;
 | 
			
		||||
}
 | 
			
		||||
#endif /* CONFIG_SAML21_XPLAINED_OLED1MODULE */
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,108 @@
 | 
			
		|||
/****************************************************************************
 | 
			
		||||
 * boards/arm/samd2l2/saml21-xplained/src/sam_userleds.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.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/* There are three LEDs on board the SAML21 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 labeled STATUS near the SAML21 USB
 | 
			
		||||
 * connector.
 | 
			
		||||
 *
 | 
			
		||||
 * This LED is controlled by PB10 and the LED can be activated by driving
 | 
			
		||||
 * PB10 to GND.
 | 
			
		||||
 *
 | 
			
		||||
 * When CONFIG_ARCH_LEDS is defined in the NuttX configuration, NuttX will
 | 
			
		||||
 * control the LED.
 | 
			
		||||
 * Otherwise, the LED can be controlled from user applications using the
 | 
			
		||||
 * logic in this file.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Included Files
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#include <nuttx/config.h>
 | 
			
		||||
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
#include <stdbool.h>
 | 
			
		||||
#include <debug.h>
 | 
			
		||||
 | 
			
		||||
#include <arch/board/board.h>
 | 
			
		||||
 | 
			
		||||
#include "sam_port.h"
 | 
			
		||||
#include "saml21-xplained.h"
 | 
			
		||||
 | 
			
		||||
#ifndef CONFIG_ARCH_LEDS
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Public Functions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: board_userled_initialize
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   If CONFIG_ARCH_LEDS is defined, then NuttX will control the on-board
 | 
			
		||||
 *   LEDs.  If CONFIG_ARCH_LEDS is not defined, then the
 | 
			
		||||
 *   board_userled_initialize() is available to initialize the LED from user
 | 
			
		||||
 *   application logic.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
uint32_t board_userled_initialize(void)
 | 
			
		||||
{
 | 
			
		||||
  sam_configport(PORT_STATUS_LED);
 | 
			
		||||
  return BOARD_NLEDS;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: board_userled
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   If CONFIG_ARCH_LEDS is defined, then NuttX will control the on-board
 | 
			
		||||
 *  LEDs.  If CONFIG_ARCH_LEDS is not defined, then the board_userled() is
 | 
			
		||||
 *  available to control the LED from user application logic.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
void board_userled(int led, bool ledon)
 | 
			
		||||
{
 | 
			
		||||
  if (led == BOARD_STATUS_LED)
 | 
			
		||||
    {
 | 
			
		||||
      sam_portwrite(PORT_STATUS_LED, !ledon);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: board_userled_all
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   If CONFIG_ARCH_LEDS is defined, then NuttX will control the on-board
 | 
			
		||||
 *   LEDs.
 | 
			
		||||
 *   If CONFIG_ARCH_LEDS is not defined, then the board_userled_all() is
 | 
			
		||||
 *   available to control the LED from user application logic.  NOTE:  since
 | 
			
		||||
 *   there is only a single LED on-board, this is function isn't very useful.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
void board_userled_all(uint32_t ledset)
 | 
			
		||||
{
 | 
			
		||||
  board_userled(BOARD_STATUS_LED, (ledset & BOARD_STATUS_LED_BIT) != 0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif /* !CONFIG_ARCH_LEDS */
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,254 @@
 | 
			
		|||
/****************************************************************************
 | 
			
		||||
 * boards/arm/samd2l2/saml21-xplained/src/saml21-xplained.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_SAML21_XPLAINED_SRC_SAML21_XPLAINED_H
 | 
			
		||||
#define __BOARDS_ARM_SAMD2L2_SAML21_XPLAINED_SRC_SAML21_XPLAINED_H
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Included Files
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#include <nuttx/config.h>
 | 
			
		||||
#include <nuttx/compiler.h>
 | 
			
		||||
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
 | 
			
		||||
#include <arch/irq.h>
 | 
			
		||||
#include <nuttx/irq.h>
 | 
			
		||||
 | 
			
		||||
#include "sam_config.h"
 | 
			
		||||
#include "sam_pinmap.h"
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Pre-processor Definitions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/* LEDs: There are three LEDs on board the SAML21 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 SAML21 USB connector.
 | 
			
		||||
 *
 | 
			
		||||
 * This LED is controlled by PB10 and the LED can be activated by driving
 | 
			
		||||
 * PB10 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 | \
 | 
			
		||||
                         PORTB | PORT_PIN10)
 | 
			
		||||
 | 
			
		||||
/* Mechanical buttons:
 | 
			
		||||
 *
 | 
			
		||||
 * The SAML21 Xplained Pro contains two mechanical buttons. One button is the
 | 
			
		||||
 * RESET button connected to the SAML21 reset line and the other is a generic
 | 
			
		||||
 * user configurable button.
 | 
			
		||||
 * When a button is pressed it will drive the I/O line to GND.
 | 
			
		||||
 *
 | 
			
		||||
 *   PA02 SW0
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define PORT_SW0      (PORT_INTERRUPT | PORT_PULL_UP | PORTA | PORT_PIN2)
 | 
			
		||||
#define IRQ_SW0       SAM_IRQ_PA2
 | 
			
		||||
 | 
			
		||||
/* I/O1
 | 
			
		||||
 *
 | 
			
		||||
 * Support for the microSD card slot on the I/O1 module.  The I/O1 requires
 | 
			
		||||
 * SPI support and two PORTs.    These the PORTs will vary if the I/O1
 | 
			
		||||
 * is installed on the EXT1 or EXT2 connector:
 | 
			
		||||
 *
 | 
			
		||||
 *   --- ------------------ ---------------------- --------------------------
 | 
			
		||||
 *   PIN EXT1               EXT2                   Description
 | 
			
		||||
 *   --- ------------------ ---------------------- --------------------------
 | 
			
		||||
 *   15 PA05 SERCOM0 PAD[1] 15 PA17 GPIO]          Active low chip select
 | 
			
		||||
 *                             SPI SS              OUTPUT, pulled high on
 | 
			
		||||
 *                                                 board.
 | 
			
		||||
 *   10 PA02 GPIO           10 PB15 GPIO           Active low card detect
 | 
			
		||||
 *                                                 INPUT, must use internal
 | 
			
		||||
 *                                                 pull-up.
 | 
			
		||||
 *   --- ------------------ ---------------------- --------------------------
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_SAML21_XPLAINED_IOMODULE
 | 
			
		||||
 | 
			
		||||
#  ifndef SAMD2L2_HAVE_SPI0
 | 
			
		||||
#    error SAMD2L2_HAVE_SPI0 is required to use the I/O1 module
 | 
			
		||||
#  endif
 | 
			
		||||
 | 
			
		||||
#  if defined(CONFIG_SAML21_XPLAINED_IOMODULE_EXT1)
 | 
			
		||||
 | 
			
		||||
#    if defined(CONFIG_SAML21_XPLAINED_OLED1MODULE) && \
 | 
			
		||||
        defined(CONFIG_SAML21_XPLAINED_OLED1MODULE_EXT1)
 | 
			
		||||
#      error I/O1 and OLED1 modules cannot both reside in EXT1
 | 
			
		||||
#    endif
 | 
			
		||||
 | 
			
		||||
#    define PORT_SD_CD (PORT_INTERRUPT | PORT_INT_CHANGE | PORT_PULL_UP | \
 | 
			
		||||
                        PORTA | PORT_PIN2)
 | 
			
		||||
 | 
			
		||||
#    define PORT_SD_CS (PORT_OUTPUT | PORT_PULL_NONE | PORT_OUTPUT_SET | \
 | 
			
		||||
                        PORTA | PORT_PIN5)
 | 
			
		||||
 | 
			
		||||
#  elif defined(CONFIG_SAML21_XPLAINED_IOMODULE_EXT2)
 | 
			
		||||
 | 
			
		||||
#    if defined(CONFIG_SAML21_XPLAINED_OLED1MODULE) && \
 | 
			
		||||
        defined(CONFIG_SAML21_XPLAINED_OLED1MODULE_EXT2)
 | 
			
		||||
#      error I/O1 and OLED1 modules cannot both reside in EXT2
 | 
			
		||||
#    endif
 | 
			
		||||
 | 
			
		||||
#    define PORT_SD_CD (PORT_INTERRUPT | PORT_INT_CHANGE | PORT_PULL_UP | \
 | 
			
		||||
                        PORTB | PORT_PIN15)
 | 
			
		||||
 | 
			
		||||
#    define PORT_SD_CS (PORT_OUTPUT | PORT_PULL_NONE | PORT_OUTPUT_SET | \
 | 
			
		||||
                        PORTA | PORT_PIN17)
 | 
			
		||||
 | 
			
		||||
#  else
 | 
			
		||||
#    error Which connector is the I/O1 module installed in?
 | 
			
		||||
#  endif
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/* OLED1
 | 
			
		||||
 *
 | 
			
		||||
 * Support for the microSD card slot on the I/O1 module.
 | 
			
		||||
 * The I/O1 requires SPI support and three output PORTs.
 | 
			
		||||
 * These the PORTs will vary if the OLED1 is installed on the EXT1
 | 
			
		||||
 * or EXT2 connector:
 | 
			
		||||
 *
 | 
			
		||||
 *   --- ------------------- -------------------- ---------------------------
 | 
			
		||||
 *   PIN EXT1                EXT2                 Description
 | 
			
		||||
 *   --- ------------------- -------------------- ---------------------------
 | 
			
		||||
 *   5   PB06 PA02           PA20 PA02            DATA_CMD_SEL
 | 
			
		||||
 *   10  PA02 PA02           PB15 PA02            DISPLAY_RESET. Active low.
 | 
			
		||||
 *   15  PA05 SERCOM0 PAD[1] PA17 SERCOM1 PAD[1]  DISPLAY_SS.  Active low.
 | 
			
		||||
 *            SPI SS              SPI SS
 | 
			
		||||
 *   --- ------------------- -------------------- ---------------------------
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_SAML21_XPLAINED_OLED1MODULE
 | 
			
		||||
 | 
			
		||||
#  ifndef SAMD2L2_HAVE_SPI0
 | 
			
		||||
#    error SAMD2L2_HAVE_SPI0 is required to use the OLED1 module
 | 
			
		||||
#  endif
 | 
			
		||||
 | 
			
		||||
#  ifndef CONFIG_SPI_CMDDATA
 | 
			
		||||
#    error CONFIG_SPI_CMDDATA is required to use the OLED1 module
 | 
			
		||||
#  endif
 | 
			
		||||
 | 
			
		||||
#  ifndef CONFIG_LCD_SSD1306
 | 
			
		||||
#    error CONFIG_LCD_SSD1306 is required to use the OLED1 module
 | 
			
		||||
#  endif
 | 
			
		||||
 | 
			
		||||
#  ifndef CONFIG_LCD_UG2832HSWEG04
 | 
			
		||||
#    error CONFIG_LCD_UG2832HSWEG04 is required to use the OLED1 module
 | 
			
		||||
#  endif
 | 
			
		||||
 | 
			
		||||
#  if defined(CONFIG_SAML21_XPLAINED_OLED1MODULE_EXT1)
 | 
			
		||||
 | 
			
		||||
#    if defined(CONFIG_SAML21_XPLAINED_IOMODULE) && \
 | 
			
		||||
        defined(CONFIG_SAML21_XPLAINED_IOMODULE_EXT1)
 | 
			
		||||
#      error OLED1 and I/O1 modules cannot both reside in EXT1
 | 
			
		||||
#    endif
 | 
			
		||||
 | 
			
		||||
#    define PORT_OLED_DATA (PORT_OUTPUT | PORT_PULL_NONE | PORT_OUTPUT_CLEAR | \
 | 
			
		||||
                            PORTB | PORT_PIN6)
 | 
			
		||||
#    define PORT_OLED_RST  (PORT_OUTPUT | PORT_PULL_NONE | PORT_OUTPUT_CLEAR | \
 | 
			
		||||
                            PORTA | PORT_PIN2)
 | 
			
		||||
#    define PORT_OLED_CS   (PORT_OUTPUT | PORT_PULL_NONE | PORT_OUTPUT_SET | \
 | 
			
		||||
                            PORTA | PORT_PIN5)
 | 
			
		||||
 | 
			
		||||
#  elif defined(CONFIG_SAML21_XPLAINED_OLED1MODULE_EXT2)
 | 
			
		||||
 | 
			
		||||
#    if defined(CONFIG_SAML21_XPLAINED_IOMODULE) && \
 | 
			
		||||
        defined(CONFIG_SAML21_XPLAINED_IOMODULE_EXT2)
 | 
			
		||||
#      error OLED1 and I/O1 modules cannot both reside in EXT2
 | 
			
		||||
#    endif
 | 
			
		||||
 | 
			
		||||
#    define PORT_OLED_DATA (PORT_OUTPUT | PORT_PULL_NONE | PORT_OUTPUT_CLEAR | \
 | 
			
		||||
                            PORTA | PORT_PIN20)
 | 
			
		||||
#    define PORT_OLED_RST  (PORT_OUTPUT | PORT_PULL_NONE | PORT_OUTPUT_CLEAR | \
 | 
			
		||||
                            PORTB | PORT_PIN15)
 | 
			
		||||
#    define PORT_OLED_CS   (PORT_OUTPUT | PORT_PULL_NONE | PORT_OUTPUT_SET | \
 | 
			
		||||
                            PORTA | PORT_PIN17)
 | 
			
		||||
 | 
			
		||||
#  else
 | 
			
		||||
#    error Which connector is the OLED1 module installed in?
 | 
			
		||||
#  endif
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined(CONFIG_LCD_UG2864AMBAG01) || defined(CONFIG_LCD_UG2864HSWEG01)
 | 
			
		||||
#    define PORT_SD_CS (PORT_OUTPUT | PORT_PULL_NONE | PORT_OUTPUT_SET | \
 | 
			
		||||
                        PORTB | PORT_PIN11) /* REVISIT */
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Public Types
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Public Data
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#ifndef __ASSEMBLY__
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Public Functions Definitions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: sam_spidev_initialize
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   Called to configure SPI chip select PORT pins for the SAM3U-EK board.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
void weak_function sam_spidev_initialize(void);
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: sam_sdinitialize
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   Initialize the SPI-based SD card.
 | 
			
		||||
 *   Requires CONFIG_SAML21_XPLAINED_IOMODULE=y,
 | 
			
		||||
 *   CONFIG_DISABLE_MOUNTPOINT=n, CONFIG_MMCSD=y,
 | 
			
		||||
 *   and the appropriate SERCOM SPI port enabled.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_SAML21_XPLAINED_IOMODULE
 | 
			
		||||
int sam_sdinitialize(int port, int minor);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif /* __ASSEMBLY__ */
 | 
			
		||||
#endif /* __BOARDS_ARM_SAMD2L2_SAML21_XPLAINED_SRC_SAML21_XPLAINED_H */
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,108 @@
 | 
			
		|||
#
 | 
			
		||||
# For a description of the syntax of this configuration file,
 | 
			
		||||
# see the file kconfig-language.txt in the NuttX tools repository.
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
if ARCH_BOARD_METRO_M4
 | 
			
		||||
 | 
			
		||||
choice
 | 
			
		||||
	prompt "Execution memory"
 | 
			
		||||
	default METRO_M4_RUNFROMFLASH
 | 
			
		||||
 | 
			
		||||
config METRO_M4_RUNFROMFLASH
 | 
			
		||||
	bool "Run from FLASH"
 | 
			
		||||
	select BOOT_RUNFROMFLASH
 | 
			
		||||
	---help---
 | 
			
		||||
		This is the normal configuration for building METRO M4 code.
 | 
			
		||||
 | 
			
		||||
config METRO_M4_RUNFROMSRAM
 | 
			
		||||
	bool "Run from SRAM"
 | 
			
		||||
	select BOOT_RUNFROMISRAM
 | 
			
		||||
	---help---
 | 
			
		||||
		During early bring-up, it is safer to execute entirely from
 | 
			
		||||
		SRAM until you are confident in the initialization logic.
 | 
			
		||||
		Then you can safely switch to FLASH.
 | 
			
		||||
 | 
			
		||||
		REVISIT:  This auto-selects CONFIG_BOOT_RUNFROMISRAM but I have
 | 
			
		||||
		found, with some difficulty, that that choice still defaults to
 | 
			
		||||
		CONFIG_BOOT_RUNFROMFLASH, causing link-time failures when running
 | 
			
		||||
		from SRAM.
 | 
			
		||||
 | 
			
		||||
endchoice # Execution memory
 | 
			
		||||
 | 
			
		||||
config METRO_M4_32KHZXTAL
 | 
			
		||||
	bool "32.768 KHz XTAL"
 | 
			
		||||
	default n
 | 
			
		||||
	---help---
 | 
			
		||||
		According to the schematic, a 32.768 KHz crystal is installed  on
 | 
			
		||||
		board.  However, I have been unable to use this crystal and thought
 | 
			
		||||
		perhaps it is missing or defective on my board (there is a metal
 | 
			
		||||
		package that could be a crystal on board, but I am not certain).
 | 
			
		||||
		Another, more likely option is that there is a coding error on my
 | 
			
		||||
		part that prevents the 32.768 KHz crystal from usable(?)
 | 
			
		||||
 | 
			
		||||
		The configuration defaults to using the always-on OSCULP32 as the
 | 
			
		||||
		slow clock source.  This option will select instead XOSC32 as the
 | 
			
		||||
		slow clock source.
 | 
			
		||||
 | 
			
		||||
config METRO_M4_AT24_BLOCKMOUNT
 | 
			
		||||
	bool "AT24 Serial EEPROM auto-mount"
 | 
			
		||||
	default n
 | 
			
		||||
	depends on MTD_AT24XX
 | 
			
		||||
	---help---
 | 
			
		||||
		Automatically initialize the AT24 I2C EEPROM driver when NSH starts.
 | 
			
		||||
 | 
			
		||||
choice
 | 
			
		||||
	prompt "AT24 serial EPPROM configuration"
 | 
			
		||||
	default METRO_M4_AT24_FTL
 | 
			
		||||
	depends on METRO_M4_AT24_BLOCKMOUNT
 | 
			
		||||
 | 
			
		||||
config METRO_M4_AT24_FTL
 | 
			
		||||
	bool "Create AT24 block driver"
 | 
			
		||||
	---help---
 | 
			
		||||
		Create the MTD driver for the AT24 and "wrap" the AT24 as a standard
 | 
			
		||||
		block driver that could then, for example, be mounted using FAT or
 | 
			
		||||
		any other file system.  Any file system may be used, but there will
 | 
			
		||||
		be no wear-leveling.
 | 
			
		||||
 | 
			
		||||
config METRO_M4_AT24_NXFFS
 | 
			
		||||
	bool "Create AT24 NXFFS file system"
 | 
			
		||||
	depends on FS_NXFFS
 | 
			
		||||
	---help---
 | 
			
		||||
		Create the MTD driver for the AT24 and mount the AT24 device as
 | 
			
		||||
		a wear-leveling, NuttX FLASH file system (NXFFS).  The downside of
 | 
			
		||||
		NXFFS is that it can be very slow.
 | 
			
		||||
 | 
			
		||||
endchoice # AT24 serial EPPROM configuration
 | 
			
		||||
 | 
			
		||||
if FS_AUTOMOUNTER
 | 
			
		||||
config METRO_M4_USB_AUTOMOUNT
 | 
			
		||||
	bool "USB automounter"
 | 
			
		||||
	default n
 | 
			
		||||
 | 
			
		||||
if METRO_M4_USB_AUTOMOUNT
 | 
			
		||||
 | 
			
		||||
config METRO_M4_USB_AUTOMOUNT_FSTYPE
 | 
			
		||||
	string "USB file system type"
 | 
			
		||||
	default "vfat"
 | 
			
		||||
 | 
			
		||||
config METRO_M4_USB_AUTOMOUNT_BLKDEV
 | 
			
		||||
	string "USB block device"
 | 
			
		||||
	default "/dev/sda"
 | 
			
		||||
 | 
			
		||||
config METRO_M4_USB_AUTOMOUNT_MOUNTPOINT
 | 
			
		||||
	string "USB mount point"
 | 
			
		||||
	default "/mnt/usb"
 | 
			
		||||
 | 
			
		||||
config METRO_M4_USB_AUTOMOUNT_DDELAY
 | 
			
		||||
	int "USB debounce delay (milliseconds)"
 | 
			
		||||
	default 1000
 | 
			
		||||
 | 
			
		||||
config METRO_M4_USB_AUTOMOUNT_UDELAY
 | 
			
		||||
	int "USB unmount retry delay (milliseconds)"
 | 
			
		||||
	default 2000
 | 
			
		||||
 | 
			
		||||
endif # METRO_M4_USB_AUTOMOUNT
 | 
			
		||||
endif # FS_AUTOMOUNTER
 | 
			
		||||
 | 
			
		||||
endif # ARCH_BOARD_METRO_M4
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,323 @@
 | 
			
		|||
README
 | 
			
		||||
======
 | 
			
		||||
 | 
			
		||||
  This directory contains the port of NuttX to the Adafruit Metro M4.  The
 | 
			
		||||
  Metro M4 uses a Arduino form factor and and pinout.  It's powered with an
 | 
			
		||||
  ATSAMD51J19:
 | 
			
		||||
 | 
			
		||||
  o Cortex M4 core running at 120 MHz
 | 
			
		||||
  o Hardware DSP and floating point support
 | 
			
		||||
  o 512 KB flash, 192 KB RAM
 | 
			
		||||
  o 32-bit, 3.3V logic and power
 | 
			
		||||
  o Dual 1 MSPS DAC (A0 and A1)
 | 
			
		||||
  o Dual 1 MSPS ADC (8 analog pins)
 | 
			
		||||
  o 6 x hardware SERCOM (I2C, SPI or UART)
 | 
			
		||||
  o 16 x PWM outputs
 | 
			
		||||
  o Stereo I2S input/output with MCK pin
 | 
			
		||||
  o 10-bit Parallel capture controller (for camera/video in)
 | 
			
		||||
  o Built in crypto engines with AES (256 bit), true RNG, Pubkey controller
 | 
			
		||||
  o 64 QFN
 | 
			
		||||
 | 
			
		||||
Contents
 | 
			
		||||
========
 | 
			
		||||
 | 
			
		||||
  o STATUS
 | 
			
		||||
  o Unlocking FLASH
 | 
			
		||||
  o Serial Console
 | 
			
		||||
  o LEDs
 | 
			
		||||
  o Run from SRAM
 | 
			
		||||
  o Configurations
 | 
			
		||||
 | 
			
		||||
STATUS
 | 
			
		||||
======
 | 
			
		||||
 | 
			
		||||
  2018-07-26:  The basic port was merged into master.  It is still
 | 
			
		||||
    incomplete and untested.
 | 
			
		||||
 | 
			
		||||
  2018-07-29:  Code complete.  Clock configuration complete.  Unverified
 | 
			
		||||
    SERCOM USART, SPI, I2C, Port configuration, and DMA support have been
 | 
			
		||||
    added. I still have no hardware in hand to test.
 | 
			
		||||
 | 
			
		||||
  2018-07-20:  Brought in the USB driver from the SAML21.  It is the same
 | 
			
		||||
    USB IP with only small differences.  There a a few, small open issues
 | 
			
		||||
    still to be resolved.
 | 
			
		||||
 | 
			
		||||
  2018-08-01:  Hardware in hand.  Initial attempts to program the board
 | 
			
		||||
    using a Segger J-Link connected via SWD were unsuccessful because the
 | 
			
		||||
    Metro M4 comes with an application in FLASH and the FLASH locked.  See
 | 
			
		||||
    "Unlocking FLASH with J-Link Commander" below.  After unlocking the
 | 
			
		||||
    FLASH, I was able to successfully write the NuttX image.
 | 
			
		||||
 | 
			
		||||
    Unfortunately, the board seems to have become unusable after the first
 | 
			
		||||
    NuttX image was written to FLASH.  I am unable to connect the JTAG
 | 
			
		||||
    debugger.  The primary JTAG problem seems to be that it is now unable
 | 
			
		||||
    to halt the CPU.
 | 
			
		||||
 | 
			
		||||
    Future me:  This boot-up failure was do to bad clock initialization
 | 
			
		||||
    logic that caused infinite loops during clock configuration.  Unlocking
 | 
			
		||||
    and erasing the FLASH is innocuous, but the JTAG will apparently not
 | 
			
		||||
    work if the clocks are not in a good state.
 | 
			
		||||
 | 
			
		||||
    I would say that as a general practice, any changes to the clock
 | 
			
		||||
    configuration should be testing in SRAM first before risking the
 | 
			
		||||
    write to FLASH.
 | 
			
		||||
 | 
			
		||||
  2018-08-03:  Added a configuration option to run out of SRAM vs FLASH.
 | 
			
		||||
    This is a safer way to do the initial board bring-up since it does
 | 
			
		||||
    not modify the FLASH image nor does it require unlocking the FLASH
 | 
			
		||||
    pages.
 | 
			
		||||
 | 
			
		||||
  2018-08-31:  I finally have a new Metro M4 and have successfully
 | 
			
		||||
    debugged from SRAM (with FLASH unlocked and erased).  Several
 | 
			
		||||
    errors in clock configuration logic have been corrected and it now
 | 
			
		||||
    gets through clock configuration okay.  It now hangs in the low-level
 | 
			
		||||
    USART initialization.
 | 
			
		||||
 | 
			
		||||
    It hangs trying to enabled the SERCOM slow clock channel.  The clock
 | 
			
		||||
    sequence is:
 | 
			
		||||
 | 
			
		||||
      1. 32.678KHz crystal -> XOSC32K
 | 
			
		||||
         This is configured and says that XOSC32K is ready.
 | 
			
		||||
      2. XOSCK32 -> GCLK3.
 | 
			
		||||
         This is configured and it says that is is ready (GENEN=1).
 | 
			
		||||
      3. GCLK3 ->SERCOM slow clock channel.
 | 
			
		||||
         This hangs when I try to enable the peripheral clock.
 | 
			
		||||
 | 
			
		||||
  2018-09-01:  I found a workaround by substituting OSCULP32K for XOSC32
 | 
			
		||||
    as the source to GCLK3.   With that workaround, the port gets past all
 | 
			
		||||
    clock and USART  configuration.  A new configuration option was added,
 | 
			
		||||
    CONFIG_METRO_M4_32KHZXTAL.  By default this workaround is in place.
 | 
			
		||||
    But you can enable CONFIG_METRO_M4_32KHZXTAL if you want to further
 | 
			
		||||
    study the XOSC32K problem.
 | 
			
		||||
 | 
			
		||||
    With that workaround (and a bunch of other fixes), the basic NSH
 | 
			
		||||
    configuration appears fully function, indicating the the board bring-
 | 
			
		||||
    up is complete.
 | 
			
		||||
 | 
			
		||||
    There are additional drivers ported from SAML21 which has, in most cases,
 | 
			
		||||
    identical peripherals.  None of these drivers have been verified on the
 | 
			
		||||
    SAMD51, However.  These include:  DMAC, I2C, SPI, and USB.
 | 
			
		||||
 | 
			
		||||
  WARNING:  If you decide to invest the time to discover whey the XOSC32K
 | 
			
		||||
  clock source is not working, be certain to use the SRAM configuration.
 | 
			
		||||
  That configuration in FLASH is most likely lock up your board irrecoverably
 | 
			
		||||
  is there are any start-up errors!
 | 
			
		||||
 | 
			
		||||
Unlocking FLASH
 | 
			
		||||
===============
 | 
			
		||||
 | 
			
		||||
  Options
 | 
			
		||||
  -------
 | 
			
		||||
  The Adafruit Metro M4 comes with a very nice bootloader resident in FLASH.
 | 
			
		||||
  so we have two options:
 | 
			
		||||
 | 
			
		||||
  1. Learn to play well with others.  Make NuttX coexist and work in the
 | 
			
		||||
     memory partition available to it.  Or,
 | 
			
		||||
  2. Be greedy, unlock the FLASH and overwrite the bootloader.
 | 
			
		||||
 | 
			
		||||
  I chose to do the last one.  I used a Segger J-Link and here are the steps
 | 
			
		||||
  that I took.  You can probably do these things in Atmel Studio (?) but for
 | 
			
		||||
  other debug environments, you would have to come up with the solution.
 | 
			
		||||
 | 
			
		||||
  Unlocking FLASH with J-Link Commander
 | 
			
		||||
  -------------------------------------
 | 
			
		||||
 | 
			
		||||
  1. Start J-Link Commander:
 | 
			
		||||
 | 
			
		||||
      SEGGER J-Link Commander V6.32i (Compiled Jul 24 2018 15:20:49)
 | 
			
		||||
      DLL version V6.32i, compiled Jul 24 2018 15:19:55
 | 
			
		||||
 | 
			
		||||
      Connecting to J-Link via USB...O.K.
 | 
			
		||||
      Firmware: J-Link V9 compiled Apr 20 2018 16:47:26
 | 
			
		||||
      Hardware version: V9.30
 | 
			
		||||
      S/N: 269303123
 | 
			
		||||
      License(s): FlashBP, GDB
 | 
			
		||||
      OEM: SEGGER-EDU
 | 
			
		||||
      VTref=3.296V
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
      Type "connect" to establish a target connection, '?' for help
 | 
			
		||||
      J-Link>con
 | 
			
		||||
      Please specify device / core. <Default>: ATSAMD51P19
 | 
			
		||||
      Type '?' for selection dialog
 | 
			
		||||
      Device>ATSAMD51P19
 | 
			
		||||
      Please specify target interface:
 | 
			
		||||
        J) JTAG (Default)
 | 
			
		||||
        S) SWD
 | 
			
		||||
      TIF>S
 | 
			
		||||
      Specify target interface speed [kHz]. <Default>: 4000 kHz
 | 
			
		||||
      Speed>
 | 
			
		||||
      Device "ATSAMD51P19" selected.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
      Connecting to target via SWD
 | 
			
		||||
      Found SW-DP with ID 0x2BA01477
 | 
			
		||||
      Scanning AP map to find all available APs
 | 
			
		||||
      ...etc. ...
 | 
			
		||||
 | 
			
		||||
  2. Look at The NVM "user page" memory at address 0x00804000:
 | 
			
		||||
 | 
			
		||||
       J-Link>mem8 804000, 10
 | 
			
		||||
       00804000 = 39 92 9A F6 80 FF EC AE FF FF FF FF FF FF FF FF
 | 
			
		||||
 | 
			
		||||
     The field NVM BOOT (also called BOOTPROT) is the field that locks the
 | 
			
		||||
     lower part of FLASH to support the boot loader.  This is bits 26-29
 | 
			
		||||
     of the NVM user page:
 | 
			
		||||
 | 
			
		||||
       J-Link>mem32 804000, 1
 | 
			
		||||
       00804000 = F69A9239
 | 
			
		||||
 | 
			
		||||
    In binary 11|11 01|10 1001 1010  1001 0010 0011 1001, so NVM Boot 1101.
 | 
			
		||||
    To unlock the FLASH memory reserved for the bootloader, we need to
 | 
			
		||||
    change this field to 111 so that:
 | 
			
		||||
 | 
			
		||||
      11|11 11|10 10|01 1010  1001 0010 0011 1001 = F7da9239, or
 | 
			
		||||
      00804000 = 39 92 9A FE 80 FF EC AE FF FF FF FF FF FF FF FF
 | 
			
		||||
 | 
			
		||||
    is read.
 | 
			
		||||
 | 
			
		||||
  3. Modify the NVM "user page"
 | 
			
		||||
 | 
			
		||||
    I did this using the instructions for the SAMD21 found at
 | 
			
		||||
 | 
			
		||||
      https://roamingthings.de/use-j-link-to-change-the-boot-loader-protection-of-a-sam-d21/
 | 
			
		||||
 | 
			
		||||
    We will need to create a small Motorola S-REC file to write new values
 | 
			
		||||
    into NVM.  See https://en.m.wikipedia.org/wiki/SREC_(file_format) for a
 | 
			
		||||
    description of the Motorola SREC format.
 | 
			
		||||
 | 
			
		||||
    I wrote a small program at boards/arm/samd5e5/metro-m4-scripts/nvm.c that will
 | 
			
		||||
    generate this Motorola SREC file with the correct checksum.  The file at
 | 
			
		||||
    boards/arm/samd5e5/metro-m4-scripts/nvm.c is the output of that program.
 | 
			
		||||
 | 
			
		||||
      J-Link>mem8 804000,10
 | 
			
		||||
      00804000 = 39 92 9A F6 80 FF EC AE FF FF FF FF FF FF FF FF
 | 
			
		||||
      J-Link>loadfile D:\Spuda\Documents\projects\nuttx\master\nuttx\boards\metro-m4\scripts\nvm.srec
 | 
			
		||||
      Downloading file [D:\Spuda\Documents\projects\nuttx\master\nuttx\boards\metro-m4\scripts\nvm.srec]...
 | 
			
		||||
      J-Link: Flash download: Bank 1 @ 0x00804000: 1 range affected (16 bytes)
 | 
			
		||||
      J-Link: Flash download: Total time needed: 0.089s (Prepare: 0.035s, Compare: 0.011s, Erase: 0.000s, Program: 0.019s, Verify: 0.011s, Restore: 0.011s)
 | 
			
		||||
      O.K.
 | 
			
		||||
      J-Link>mem8 804000,10
 | 
			
		||||
      00804000 = 39 92 9A FE 80 FF EC AE FF FF FF FF FF FF FF FF
 | 
			
		||||
 | 
			
		||||
    You will, of course, have to change the path as appropriate for your system.
 | 
			
		||||
 | 
			
		||||
  4. Erase FLASH (optional)
 | 
			
		||||
 | 
			
		||||
      J-Link>erase
 | 
			
		||||
      Erasing device (ATSAMD51P19)...
 | 
			
		||||
      J-Link: Flash download: Total time needed: 2.596s (Prepare: 0.031s, Compare: 0.000s, Erase: 2.553s, Program: 0.000s, Verify: 0.000s, Restore: 0.012s)
 | 
			
		||||
      J-Link: Flash download: Total time needed: 0.066s (Prepare: 0.038s, Compare: 0.000s, Erase: 0.016s, Program: 0.000s, Verify: 0.000s, Restore: 0.010s)
 | 
			
		||||
      Erasing done.
 | 
			
		||||
      J-Link>
 | 
			
		||||
 | 
			
		||||
Serial Console
 | 
			
		||||
==============
 | 
			
		||||
 | 
			
		||||
  An Arduino compatible serial Shield is assumed (or equivalently, and
 | 
			
		||||
  external RS-232 or serial-to-USB adapter connected on Arduino pins D0 and
 | 
			
		||||
  D1):
 | 
			
		||||
 | 
			
		||||
    ------ ----------------- -----------
 | 
			
		||||
    SHIELD SAMD5E5           FUNCTION
 | 
			
		||||
    ------ ----------------- -----------
 | 
			
		||||
    D0     PA23 SERCOM3 PAD2 RXD
 | 
			
		||||
    D1     PA22 SERCOM3 PAD0 TXD
 | 
			
		||||
 | 
			
		||||
LEDs
 | 
			
		||||
====
 | 
			
		||||
 | 
			
		||||
  The Adafruit Metro M4 has four LEDs, but only two are controllable by software:
 | 
			
		||||
 | 
			
		||||
    1. The red LED on the Arduino D13 pin, and
 | 
			
		||||
    2. A NeoPixel RGB LED.
 | 
			
		||||
 | 
			
		||||
  Currently, only the red LED is supported.
 | 
			
		||||
 | 
			
		||||
    ------ ----------------- -----------
 | 
			
		||||
    SHIELD SAMD5E5           FUNCTION
 | 
			
		||||
    ------ ----------------- -----------
 | 
			
		||||
    D13    PA16              GPIO output
 | 
			
		||||
 | 
			
		||||
Run from SRAM
 | 
			
		||||
=============
 | 
			
		||||
 | 
			
		||||
  I bricked my first Metro M4 board because there were problems in the
 | 
			
		||||
  bring-up logic.  These problems left the chip in a bad state that was
 | 
			
		||||
  repeated on each reset because the code was written into FLASH and I was
 | 
			
		||||
  unable to ever connect to it again via SWD.
 | 
			
		||||
 | 
			
		||||
  To make the bring-up less risky, I added a configuration option to build
 | 
			
		||||
  the code to execution entirely out of SRAM.  By default, the setting
 | 
			
		||||
  CONFIG_METRO_M4_RUNFROMFLASH=y is used and the code is built to run out of
 | 
			
		||||
  FLASH.  If CONFIG_METRO_M4_RUNFROMSRAM=y is selected instead, then the
 | 
			
		||||
  code is built to run out of SRAM.
 | 
			
		||||
 | 
			
		||||
  To use the code in this configuration, the program must be started a
 | 
			
		||||
  little differently:
 | 
			
		||||
 | 
			
		||||
    gdb> mon reset
 | 
			
		||||
    gdb> mon halt
 | 
			
		||||
    gdb> load nuttx             << Load NuttX into SRAM
 | 
			
		||||
    gdb> file nuttx             << Assuming debug symbols are enabled
 | 
			
		||||
    gdb> mon memu32 0x20000000  << Get the address of initial stack
 | 
			
		||||
    gdb> mon reg sp 0x200161c4  << Set the initial stack pointer using this address
 | 
			
		||||
    gdb> mon memu32 0x20000004  << Get the address of __start entry point
 | 
			
		||||
    gdb> mon reg pc 0x20000264  << Set the PC using this address (without bit 0 set)
 | 
			
		||||
    gdb> si                     << Step in just to make sure everything is okay
 | 
			
		||||
    gdb> [ set breakpoints ]
 | 
			
		||||
    gdb> c                      << Then continue until you hit a breakpoint
 | 
			
		||||
 | 
			
		||||
  Where 0x200161c4 and 0x20000264 are the values of the initial stack and
 | 
			
		||||
  the __start entry point that I read from SRAM
 | 
			
		||||
 | 
			
		||||
Configurations
 | 
			
		||||
==============
 | 
			
		||||
 | 
			
		||||
  Each Adafruit Metro M4 configuration is maintained in a sub-directory and
 | 
			
		||||
  can be selected as follow:
 | 
			
		||||
 | 
			
		||||
    tools/configure.sh [OPTIONS] metro-m4:<subdir>
 | 
			
		||||
 | 
			
		||||
  Do 'tools/configure.sh -h' for the list of options.  If you are building
 | 
			
		||||
  under Windows with Cygwin, you would need the -c option, for example.
 | 
			
		||||
 | 
			
		||||
  Before building, make sure that the PATH environmental variable includes the
 | 
			
		||||
  correct path to the directory than holds your toolchain binaries.
 | 
			
		||||
 | 
			
		||||
  And then build NuttX by simply typing the following.  At the conclusion of
 | 
			
		||||
  the make, the nuttx binary will reside in an ELF file called, simply, nuttx.
 | 
			
		||||
 | 
			
		||||
    make
 | 
			
		||||
 | 
			
		||||
  The <subdir> that is provided above as an argument to the tools/configure.sh
 | 
			
		||||
  must be is one of configurations listed in the following paragraph.
 | 
			
		||||
 | 
			
		||||
  NOTES:
 | 
			
		||||
 | 
			
		||||
  1. These configurations use the mconf-based configuration tool.  To
 | 
			
		||||
     change any of these configurations using that tool, you should:
 | 
			
		||||
 | 
			
		||||
    a. Build and install the kconfig-mconf tool.  See nuttx/README.txt
 | 
			
		||||
       see additional README.txt files in the NuttX tools repository.
 | 
			
		||||
 | 
			
		||||
    b. Execute 'make menuconfig' in nuttx/ in order to start the
 | 
			
		||||
       reconfiguration process.
 | 
			
		||||
 | 
			
		||||
  2. Unless stated otherwise, all configurations generate console
 | 
			
		||||
     output of on SERCOM3 which is available on a Arduino Serial
 | 
			
		||||
     Shield (see the section "Serial Console" above).
 | 
			
		||||
 | 
			
		||||
  3. Unless otherwise stated, the configurations are setup build under
 | 
			
		||||
     Linux with a generic ARM EABI toolchain:
 | 
			
		||||
 | 
			
		||||
Configuration sub-directories
 | 
			
		||||
-----------------------------
 | 
			
		||||
 | 
			
		||||
  nsh:
 | 
			
		||||
    This configuration directory will built the NuttShell.  See NOTES ;for
 | 
			
		||||
    common configuration above and the following:
 | 
			
		||||
 | 
			
		||||
    NOTES:
 | 
			
		||||
 | 
			
		||||
    1. The CMCC (Cortex M Cache Controller) is enabled.
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,47 @@
 | 
			
		|||
#
 | 
			
		||||
# 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_NSH_DISABLE_IFCONFIG is not set
 | 
			
		||||
# CONFIG_NSH_DISABLE_PS is not set
 | 
			
		||||
CONFIG_ARCH="arm"
 | 
			
		||||
CONFIG_ARCH_BOARD="metro-m4"
 | 
			
		||||
CONFIG_ARCH_BOARD_METRO_M4=y
 | 
			
		||||
CONFIG_ARCH_CHIP="samd5e5"
 | 
			
		||||
CONFIG_ARCH_CHIP_SAMD51J19=y
 | 
			
		||||
CONFIG_ARCH_CHIP_SAMD5X=y
 | 
			
		||||
CONFIG_ARCH_STACKDUMP=y
 | 
			
		||||
CONFIG_BOARD_LOOPSPERMSEC=7225
 | 
			
		||||
CONFIG_BUILTIN=y
 | 
			
		||||
CONFIG_DISABLE_ENVIRON=y
 | 
			
		||||
CONFIG_HAVE_CXX=y
 | 
			
		||||
CONFIG_HAVE_CXXINITIALIZE=y
 | 
			
		||||
CONFIG_MAX_TASKS=16
 | 
			
		||||
CONFIG_NSH_BUILTIN_APPS=y
 | 
			
		||||
CONFIG_NSH_FILEIOSIZE=512
 | 
			
		||||
CONFIG_NSH_LINELEN=64
 | 
			
		||||
CONFIG_NSH_READLINE=y
 | 
			
		||||
CONFIG_PREALLOC_TIMERS=4
 | 
			
		||||
CONFIG_PTHREAD_STACK_DEFAULT=1536
 | 
			
		||||
CONFIG_RAM_SIZE=196608
 | 
			
		||||
CONFIG_RAM_START=0x20000000
 | 
			
		||||
CONFIG_RAW_BINARY=y
 | 
			
		||||
CONFIG_RR_INTERVAL=200
 | 
			
		||||
CONFIG_SAMD5E5_CMCC=y
 | 
			
		||||
CONFIG_SAMD5E5_EIC=y
 | 
			
		||||
CONFIG_SAMD5E5_SERCOM3=y
 | 
			
		||||
CONFIG_SCHED_WAITPID=y
 | 
			
		||||
CONFIG_SDCLONE_DISABLE=y
 | 
			
		||||
CONFIG_START_DAY=23
 | 
			
		||||
CONFIG_START_MONTH=7
 | 
			
		||||
CONFIG_SYSTEM_NSH=y
 | 
			
		||||
CONFIG_TASK_NAME_SIZE=0
 | 
			
		||||
CONFIG_TASK_SPAWN_DEFAULT_STACKSIZE=1536
 | 
			
		||||
CONFIG_USART3_RXBUFSIZE=64
 | 
			
		||||
CONFIG_USART3_SERIAL_CONSOLE=y
 | 
			
		||||
CONFIG_USART3_TXBUFSIZE=64
 | 
			
		||||
CONFIG_USERMAIN_STACKSIZE=1536
 | 
			
		||||
CONFIG_USER_ENTRYPOINT="nsh_main"
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,487 @@
 | 
			
		|||
/****************************************************************************
 | 
			
		||||
 * boards/arm/samd5e5/metro-m4/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_SAMD5E5_METRO_M4_INCLUDE_BOARD_H
 | 
			
		||||
#define __BOARDS_ARM_SAMD5E5_METRO_M4_INCLUDE_BOARD_H
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Included Files
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#include <nuttx/config.h>
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Pre-processor Definitions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#ifndef TRUE
 | 
			
		||||
#  define TRUE  1
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifndef FALSE
 | 
			
		||||
#  define FALSE 0
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/* Clocking *****************************************************************/
 | 
			
		||||
 | 
			
		||||
/* Overview
 | 
			
		||||
 *
 | 
			
		||||
 * Per the schematic Adafruit Metro M4 Pro has one on-board crystal:
 | 
			
		||||
 *
 | 
			
		||||
 *   X4 32.768KHz XOSC32
 | 
			
		||||
 *
 | 
			
		||||
 * However, I have been unsuccessful using it and have fallen back to using
 | 
			
		||||
 * OSCULP32K(Unless CONFIG_METRO_M4_32KHZXTAL=y)
 | 
			
		||||
 *
 | 
			
		||||
 * Since there is no high speed crystal, we will run from the OSC16M clock
 | 
			
		||||
 * source.
 | 
			
		||||
 *
 | 
			
		||||
 * OSC48M               Output     = 48Mhz
 | 
			
		||||
 *  |
 | 
			
		||||
 * FDLL                 Input      = 48MHz
 | 
			
		||||
 *  |                   Output     = 48MHz
 | 
			
		||||
 * GCLK5                Input      = 48MHz
 | 
			
		||||
 *  |                   Output     = 2MHz
 | 
			
		||||
 * DPLL0                Input      = 2MHz
 | 
			
		||||
 *  |                   Output     = 120MHz
 | 
			
		||||
 * GCLK0                Input      = 120MHz
 | 
			
		||||
 *  |                   Output     = 120MHz
 | 
			
		||||
 * MCK                  Input      = 120MHz
 | 
			
		||||
 *  |                   Output     = 120MHz
 | 
			
		||||
 * CPU                  Input      = 120MHz
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define BOARD_OSC32K_FREQUENCY  32768     /* OSCULP32K frequency 32.768 KHz (nominal) */
 | 
			
		||||
#define BOARD_XOSC32K_FREQUENCY 32768     /* XOSC32K frequency 32.768 KHz */
 | 
			
		||||
#define BOARD_DFLL_FREQUENCY    48000000  /* FDLL frequency 28MHz */
 | 
			
		||||
#define BOARD_XOSC0_FREQUENCY   12000000  /* XOSC0 frequency 12MHz (disabled) */
 | 
			
		||||
#define BOARD_XOSC1_FREQUENCY   12000000  /* XOSC0 frequency 12MHz (disabled)*/
 | 
			
		||||
#define BOARD_DPLL0_FREQUENCY   120000000 /* DPLL0 output frueuency (120MHz) */
 | 
			
		||||
#define BOARD_DPLL1_FREQUENCY   47985664  /* DPLL1 output frequency (disabled) */
 | 
			
		||||
 | 
			
		||||
#define BOARD_GCLK0_FREQUENCY   BOARD_DPLL0_FREQUENCY
 | 
			
		||||
#define BOARD_GCLK1_FREQUENCY   BOARD_DFLL_FREQUENCY
 | 
			
		||||
#define BOARD_GCLK2_FREQUENCY   (BOARD_XOSC32K_FREQUENCY / 4)  /* Disabled */
 | 
			
		||||
#ifdef CONFIG_METRO_M4_32KHZXTAL
 | 
			
		||||
#  define BOARD_GCLK3_FREQUENCY BOARD_XOSC32K_FREQUENCY        /* Enabled */
 | 
			
		||||
#else
 | 
			
		||||
#  define BOARD_GCLK3_FREQUENCY BOARD_OSC32K_FREQUENCY         /* Always-on */
 | 
			
		||||
#endif
 | 
			
		||||
#define BOARD_GCLK4_FREQUENCY   BOARD_DPLL0_FREQUENCY
 | 
			
		||||
#define BOARD_GCLK5_FREQUENCY   (BOARD_DFLL_FREQUENCY / 24)
 | 
			
		||||
#define BOARD_GCLK6_FREQUENCY   BOARD_XOSC1_FREQUENCY          /* Disabled */
 | 
			
		||||
#define BOARD_GCLK7_FREQUENCY   BOARD_XOSC1_FREQUENCY          /* Disabled */
 | 
			
		||||
#define BOARD_GCLK8_FREQUENCY   BOARD_XOSC1_FREQUENCY          /* Disabled */
 | 
			
		||||
#define BOARD_GCLK9_FREQUENCY   BOARD_XOSC1_FREQUENCY          /* Disabled */
 | 
			
		||||
#define BOARD_GCLK10_FREQUENCY  BOARD_XOSC1_FREQUENCY          /* Disabled */
 | 
			
		||||
#define BOARD_GCLK11_FREQUENCY  BOARD_XOSC1_FREQUENCY          /* Disabled */
 | 
			
		||||
 | 
			
		||||
#define BOARD_CPU_FREQUENCY     BOARD_GCLK0_FREQUENCY /* CPU frequency 120MHz */
 | 
			
		||||
 | 
			
		||||
/* XOSC32 */
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_METRO_M4_32KHZXTAL
 | 
			
		||||
#  define BOARD_HAVE_XOSC32K    1         /* 32.768 KHz XOSC32 crystal installed */
 | 
			
		||||
#  define BOARD_XOSC32K_ENABLE  TRUE      /* Enable XOSC32 */
 | 
			
		||||
#else
 | 
			
		||||
#  define BOARD_HAVE_XOSC32K    0         /* No 32.768 KHz XOSC32 crystal installed */
 | 
			
		||||
#  define BOARD_XOSC32K_ENABLE  FALSE     /* Disable XOSC32 */
 | 
			
		||||
#endif
 | 
			
		||||
#define BOARD_XOSC32K_XTALEN    TRUE      /* Crystal connected on XIN32 */
 | 
			
		||||
#define BOARD_XOSC32K_EN32K     FALSE     /* No 32KHz output */
 | 
			
		||||
#define BOARD_XOSC32K_EN1K      FALSE     /* No 1KHz output */
 | 
			
		||||
#define BOARD_XOSC32K_HIGHSPEED TRUE      /* High speed mode */
 | 
			
		||||
#define BOARD_XOSC32K_RUNSTDBY  FALSE     /* Don't run in standby */
 | 
			
		||||
#define BOARD_XOSC32K_ONDEMAND  TRUE      /* Enable on-demand control */
 | 
			
		||||
#define BOARD_XOSC32K_CFDEN     FALSE     /* Clock failure detector not enabled */
 | 
			
		||||
#define BOARD_XOSC32K_CFDEO     FALSE     /* No clock failure event */
 | 
			
		||||
#define BOARD_XOSC32K_CALIBEN   FALSE     /* No OSCULP32K calibration */
 | 
			
		||||
#define BOARD_XOSC32K_STARTUP   0         /* Startup time: 62592us */
 | 
			
		||||
#define BOARD_XOSC32K_CALIB     0         /* Dummy OSCULP32K calibration value */
 | 
			
		||||
#define BOARD_XOSC32K_RTCSEL    0         /* RTC clock = ULP1K */
 | 
			
		||||
 | 
			
		||||
/* XOSC0 */
 | 
			
		||||
 | 
			
		||||
#define BOARD_HAVE_XOSC0        0         /* No XOSC0 clock/crystal installed */
 | 
			
		||||
#define BOARD_XOSC0_ENABLE      FALSE     /* Don't enable XOSC0 */
 | 
			
		||||
#define BOARD_XOSC0_XTALEN      FALSE     /* External clock connected */
 | 
			
		||||
#define BOARD_XOSC0_RUNSTDBY    FALSE     /* Don't run in standby */
 | 
			
		||||
#define BOARD_XOSC0_ONDEMAND    TRUE      /* Disable on-demand control */
 | 
			
		||||
#define BOARD_XOSC0_LOWGAIN     FALSE     /* Disable low buffer gain */
 | 
			
		||||
#define BOARD_XOSC0_ENALC       FALSE     /* Disable automatic loop control */
 | 
			
		||||
#define BOARD_XOSC0_CFDEN       FALSE     /* Clock failure detector not enabled */
 | 
			
		||||
#define BOARD_XOSC0_SWBEN       FALSE     /* XOSC clock switch not enabled */
 | 
			
		||||
#define BOARD_XOSC0_STARTUP     0         /* XOSC0 start-up time 31µs */
 | 
			
		||||
 | 
			
		||||
/* XOSC1 */
 | 
			
		||||
 | 
			
		||||
#define BOARD_HAVE_XOSC1        0         /* No XOSC0 clock/crystal installed */
 | 
			
		||||
#define BOARD_XOSC1_ENABLE      FALSE     /* Don't enable XOSC1 */
 | 
			
		||||
#define BOARD_XOSC1_XTALEN      TRUE      /* External crystal connected */
 | 
			
		||||
#define BOARD_XOSC1_RUNSTDBY    FALSE     /* Don't run in standby */
 | 
			
		||||
#define BOARD_XOSC1_ONDEMAND    TRUE      /* Disable on-demand control */
 | 
			
		||||
#define BOARD_XOSC1_LOWGAIN     FALSE     /* Disable low buffer gain */
 | 
			
		||||
#define BOARD_XOSC1_ENALC       FALSE     /* Disable automatic loop control */
 | 
			
		||||
#define BOARD_XOSC1_CFDEN       FALSE     /* Clock failure detector not enabled */
 | 
			
		||||
#define BOARD_XOSC1_SWBEN       FALSE     /* XOSC clock switch not enabled */
 | 
			
		||||
#define BOARD_XOSC1_STARTUP     0         /* XOSC0 start-up time 31µs */
 | 
			
		||||
 | 
			
		||||
/* GCLK */
 | 
			
		||||
 | 
			
		||||
#define BOARD_GCLK_SET1         0x0020    /* Pre-configure:  GCLK5 needed by DPLL0 */
 | 
			
		||||
#define BOARD_GCLK_SET2         0x0fdf    /* Post-configure: All GCLKs except GCLK5 */
 | 
			
		||||
 | 
			
		||||
#define BOARD_GCLK0_ENABLE      TRUE      /* Enable GCLK0 */
 | 
			
		||||
#define BOARD_GCLK0_OOV         FALSE     /* Clock output will be LOW */
 | 
			
		||||
#define BOARD_GCLK0_OE          TRUE      /* Generate output on GCLK_IO */
 | 
			
		||||
#define BOARD_GCLK0_DIVSEL      0         /* GCLK frequency is source/DIV */
 | 
			
		||||
#define BOARD_GCLK0_RUNSTDBY    FALSE     /* Don't run in standby */
 | 
			
		||||
#define BOARD_GCLK0_SOURCE      7         /* Select DPLL0 output as GCLK0 source */
 | 
			
		||||
#define BOARD_GCLK0_DIV         1         /* Division factor */
 | 
			
		||||
 | 
			
		||||
#define BOARD_GCLK1_ENABLE      TRUE      /* Enable GCLK1 */
 | 
			
		||||
#define BOARD_GCLK1_OOV         FALSE     /* Clock output will be LOW */
 | 
			
		||||
#define BOARD_GCLK1_OE          TRUE      /* Generate output on GCLK_IO */
 | 
			
		||||
#define BOARD_GCLK1_RUNSTDBY    FALSE     /* Don't run in standby */
 | 
			
		||||
#define BOARD_GCLK1_SOURCE      6         /* Select DFLL output as GCLK1 source */
 | 
			
		||||
#define BOARD_GCLK1_DIV         1         /* Division factor */
 | 
			
		||||
 | 
			
		||||
#define BOARD_GCLK2_ENABLE      FALSE     /* Don't enable GCLK2 */
 | 
			
		||||
#define BOARD_GCLK2_OOV         FALSE     /* Clock output will be LOW */
 | 
			
		||||
#define BOARD_GCLK2_OE          FALSE     /* No generator output of GCLK_IO */
 | 
			
		||||
#define BOARD_GCLK2_RUNSTDBY    FALSE     /* Don't run in standby */
 | 
			
		||||
#define BOARD_GCLK2_SOURCE      1         /* Select XOSC1 as GCLK2 source */
 | 
			
		||||
#define BOARD_GCLK2_DIV         1         /* Division factor */
 | 
			
		||||
 | 
			
		||||
#define BOARD_GCLK3_ENABLE      TRUE      /* Enable GCLK3 */
 | 
			
		||||
#define BOARD_GCLK3_OOV         FALSE     /* Clock output will be LOW */
 | 
			
		||||
#define BOARD_GCLK3_OE          FALSE     /* No generator output of GCLK_IO */
 | 
			
		||||
#define BOARD_GCLK3_RUNSTDBY    FALSE     /* Don't run in standby */
 | 
			
		||||
#ifdef CONFIG_METRO_M4_32KHZXTAL
 | 
			
		||||
#  define BOARD_GCLK3_SOURCE    5         /* Select XOSC32K as GCLK3 source */
 | 
			
		||||
#else
 | 
			
		||||
#  define BOARD_GCLK3_SOURCE    4         /* Select OSCULP32K as GCLK3 source */
 | 
			
		||||
#endif
 | 
			
		||||
#define BOARD_GCLK3_DIV         1         /* Division factor */
 | 
			
		||||
 | 
			
		||||
#define BOARD_GCLK4_ENABLE      TRUE      /* Enable GCLK4 */
 | 
			
		||||
#define BOARD_GCLK4_OOV         FALSE     /* Clock output will be LOW */
 | 
			
		||||
#define BOARD_GCLK4_OE          TRUE      /* Generate output on GCLK_IO */
 | 
			
		||||
#define BOARD_GCLK4_RUNSTDBY    FALSE     /* Don't run in standby */
 | 
			
		||||
#define BOARD_GCLK4_SOURCE      7         /* Select DPLL0 output as GCLK4 source */
 | 
			
		||||
#define BOARD_GCLK4_DIV         1         /* Division factor */
 | 
			
		||||
 | 
			
		||||
#define BOARD_GCLK5_ENABLE      TRUE      /* Enable GCLK5 */
 | 
			
		||||
#define BOARD_GCLK5_OOV         FALSE     /* Clock output will be LOW */
 | 
			
		||||
#define BOARD_GCLK5_OE          TRUE      /* Generate output on GCLK_IO */
 | 
			
		||||
#define BOARD_GCLK5_RUNSTDBY    FALSE     /* Don't run in standby */
 | 
			
		||||
#define BOARD_GCLK5_SOURCE      6         /* Select DFLL output as GCLK5 source */
 | 
			
		||||
#define BOARD_GCLK5_DIV         24        /* Division factor */
 | 
			
		||||
 | 
			
		||||
#define BOARD_GCLK6_ENABLE      FALSE     /* Don't enable GCLK6 */
 | 
			
		||||
#define BOARD_GCLK6_OOV         FALSE     /* Clock output will be LOW */
 | 
			
		||||
#define BOARD_GCLK6_OE          FALSE     /* No generator output of GCLK_IO */
 | 
			
		||||
#define BOARD_GCLK6_RUNSTDBY    FALSE     /* Don't run in standby */
 | 
			
		||||
#define BOARD_GCLK6_SOURCE      1         /* Select XOSC1 as GCLK6 source */
 | 
			
		||||
#define BOARD_GCLK6_DIV         1         /* Division factor */
 | 
			
		||||
 | 
			
		||||
#define BOARD_GCLK7_ENABLE      FALSE     /* Don't enable GCLK7 */
 | 
			
		||||
#define BOARD_GCLK7_OOV         FALSE     /* Clock output will be LOW */
 | 
			
		||||
#define BOARD_GCLK7_OE          FALSE     /* No generator output of GCLK_IO */
 | 
			
		||||
#define BOARD_GCLK7_RUNSTDBY    FALSE     /* Don't run in standby */
 | 
			
		||||
#define BOARD_GCLK7_SOURCE      1         /* Select XOSC1 as GCLK7 source */
 | 
			
		||||
#define BOARD_GCLK7_DIV         1         /* Division factor */
 | 
			
		||||
 | 
			
		||||
#define BOARD_GCLK8_ENABLE      FALSE     /* Don't enable GCLK8 */
 | 
			
		||||
#define BOARD_GCLK8_OOV         FALSE     /* Clock output will be LOW */
 | 
			
		||||
#define BOARD_GCLK8_OE          FALSE     /* No generator output of GCLK_IO */
 | 
			
		||||
#define BOARD_GCLK8_RUNSTDBY    FALSE     /* Don't run in standby */
 | 
			
		||||
#define BOARD_GCLK8_SOURCE      1         /* Select XOSC1 as GCLK8 source */
 | 
			
		||||
#define BOARD_GCLK8_DIV         1         /* Division factor */
 | 
			
		||||
 | 
			
		||||
#define BOARD_GCLK9_ENABLE      FALSE     /* Don't enable GCLK9 */
 | 
			
		||||
#define BOARD_GCLK9_OOV         FALSE     /* Clock output will be LOW */
 | 
			
		||||
#define BOARD_GCLK9_OE          FALSE     /* No generator output of GCLK_IO */
 | 
			
		||||
#define BOARD_GCLK9_RUNSTDBY    FALSE     /* Don't run in standby */
 | 
			
		||||
#define BOARD_GCLK9_SOURCE      1         /* Select XOSC1 as GCLK9 source */
 | 
			
		||||
#define BOARD_GCLK9_DIV         1         /* Division factor */
 | 
			
		||||
 | 
			
		||||
#define BOARD_GCLK10_ENABLE     FALSE     /* Don't enable GCLK10 */
 | 
			
		||||
#define BOARD_GCLK10_OOV        FALSE     /* Clock output will be LOW */
 | 
			
		||||
#define BOARD_GCLK10_OE         FALSE     /* No generator output of GCLK_IO */
 | 
			
		||||
#define BOARD_GCLK10_RUNSTDBY   FALSE     /* Don't run in standby */
 | 
			
		||||
#define BOARD_GCLK10_SOURCE     1         /* Select XOSC1 as GCLK10 source */
 | 
			
		||||
#define BOARD_GCLK10_DIV        1         /* Division factor */
 | 
			
		||||
 | 
			
		||||
#define BOARD_GCLK11_ENABLE     FALSE     /* Don't enable GCLK11 */
 | 
			
		||||
#define BOARD_GCLK11_OOV        FALSE     /* Clock output will be LOW */
 | 
			
		||||
#define BOARD_GCLK11_OE         FALSE     /* No generator output of GCLK_IO */
 | 
			
		||||
#define BOARD_GCLK11_RUNSTDBY   FALSE     /* Don't run in standby */
 | 
			
		||||
#define BOARD_GCLK11_SOURCE     1         /* Select XOSC1 as GCLK11 source */
 | 
			
		||||
#define BOARD_GCLK11_DIV        1         /* Division factor */
 | 
			
		||||
#define BOARD_GCLK11_FREQUENCY  BOARD_XOSC1_FREQUENCY
 | 
			
		||||
 | 
			
		||||
/* DFLL */
 | 
			
		||||
 | 
			
		||||
#define BOARD_DFLL_ENABLE       TRUE      /* DFLL enable */
 | 
			
		||||
#define BOARD_DFLL_RUNSTDBY     FALSE     /* Don't run in standby */
 | 
			
		||||
#define BOARD_DFLL_ONDEMAND     FALSE     /* No n-demand control */
 | 
			
		||||
#define BOARD_DFLL_MODE         FALSE     /* TRUE->48MHz! Closed mode! */
 | 
			
		||||
#define BOARD_DFLL_STABLE       FALSE     /* No stable DFLL frequency */
 | 
			
		||||
#define BOARD_DFLL_LLAW         FALSE     /* Don't ose lock after wake */
 | 
			
		||||
#define BOARD_DFLL_USBCRM       FALSE     /* Use USB clock recovery mode */
 | 
			
		||||
#define BOARD_DFLL_CCDIS        FALSE     /* Chill cycle disable */
 | 
			
		||||
#define BOARD_DFLL_QLDIS        FALSE     /* No Quick Lock Disable */
 | 
			
		||||
#define BOARD_DFLL_BPLCKC       FALSE     /* No bypass coarse clock */
 | 
			
		||||
#define BOARD_DFLL_WAITLOCK     TRUE      /* Wait lock */
 | 
			
		||||
#define BOARD_DFLL_CALIBEN      FALSE     /* Don't overwrite factory calibration */
 | 
			
		||||
#define BOARD_DFLL_GCLKLOCK     FALSE     /* Don't lock the GCLK source */
 | 
			
		||||
#define BOARD_DFLL_FCALIB       128       /* Coarse calibration value (if caliben) */
 | 
			
		||||
#define BOARD_DFLL_CCALIB       (31 / 4)  /* Fine calibration value (if caliben) */
 | 
			
		||||
#define BOARD_DFLL_FSTEP        1         /* Fine maximum step */
 | 
			
		||||
#define BOARD_DFLL_CSTEP        1         /* Coarse maximum step */
 | 
			
		||||
#define BOARD_DFLL_GCLK         3         /* Generic clock generator 3 output: OSCULP32K / GCLK source (if !usbcrm || !mode) */
 | 
			
		||||
#if (BOARD_DFLL_MODE == TRUE) && (BOARD_DFLL_USBCRM == TRUE)
 | 
			
		||||
#define BOARD_DFLL_MUL          0xBB80    /* 48MHz/1KHz DFLL multiply factor */
 | 
			
		||||
#else
 | 
			
		||||
#define BOARD_DFLL_MUL          1465      /* 1464(3)=48MHz/32768 4915(2) DFLL multiply factor */
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/* DPLL0/1
 | 
			
		||||
 *
 | 
			
		||||
 * Fckr is the frequency of the selected reference clock reference:
 | 
			
		||||
 *
 | 
			
		||||
 *    BOARD_XOSC32K_FREQENCY,
 | 
			
		||||
 *    BOARD_XOSCn_FREQUENCY / DIV, or
 | 
			
		||||
 *    BOARD_GCLKn_FREQUENCY
 | 
			
		||||
 *
 | 
			
		||||
 * The DPLL output frequency is then given by:
 | 
			
		||||
 *
 | 
			
		||||
 *   Fdpll = Fckr * (LDR + 1 + LDRFRAC / 32)
 | 
			
		||||
 *
 | 
			
		||||
 * DPLL0:
 | 
			
		||||
 *   Fckr  = BOARD_GCLK5_FREQUENCY = BOARD_DFLL_FREQUENCY / 24 = 2MHz
 | 
			
		||||
 *   Fdpll = 2Mhz * (59 + 1 + 0 / 32) = 120MHz
 | 
			
		||||
 *
 | 
			
		||||
 * DPLL1: (not enabled)
 | 
			
		||||
 *   Fckr  = BOARD_XOSCK32_FREQUENCY = 32.768KHz
 | 
			
		||||
 *   Fdpll = 32768 * (1463 + 1 + 13/32) = 47.986 MHz
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define BOARD_DPLL0_ENABLE      TRUE      /* DPLL enable */
 | 
			
		||||
#define BOARD_DPLL0_DCOEN       FALSE     /* DCO filter enable */
 | 
			
		||||
#define BOARD_DPLL0_LBYPASS     FALSE     /* Lock bypass */
 | 
			
		||||
#define BOARD_DPLL0_WUF         FALSE     /* Wake up fast */
 | 
			
		||||
#define BOARD_DPLL0_RUNSTDBY    FALSE     /* Run in standby */
 | 
			
		||||
#define BOARD_DPLL0_ONDEMAND    FALSE     /* On demand clock activation */
 | 
			
		||||
#define BOARD_DPLL0_REFLOCK     FALSE     /* Do not lock reference clock section */
 | 
			
		||||
#define BOARD_DPLL0_REFCLK      0         /* Reference clock selection */
 | 
			
		||||
#define BOARD_DPLL0_LTIME       0         /* Lock time  */
 | 
			
		||||
#define BOARD_DPLL0_FILTER      0         /* Proportional integer filter selection */
 | 
			
		||||
#define BOARD_DPLL0_DCOFILTER   0         /* Sigma-delta DCO filter selection */
 | 
			
		||||
#define BOARD_DPLL0_GCLK        5         /* GCLK source (if refclock == 0) */
 | 
			
		||||
#define BOARD_DPLL0_GCLKLOCK    0         /* Don't lock GCLK source clock configuration */
 | 
			
		||||
#define BOARD_DPLL0_LDRFRAC     0         /* Loop divider fractional part */
 | 
			
		||||
#define BOARD_DPLL0_LDRINT      59        /* Loop divider ratio */
 | 
			
		||||
#define BOARD_DPLL0_DIV         0         /* Clock divider */
 | 
			
		||||
 | 
			
		||||
#define BOARD_DPLL1_ENABLE      FALSE     /* DPLL enable */
 | 
			
		||||
#define BOARD_DPLL1_DCOEN       FALSE     /* DCO filter enable */
 | 
			
		||||
#define BOARD_DPLL1_LBYPASS     FALSE     /* Lock bypass */
 | 
			
		||||
#define BOARD_DPLL1_WUF         FALSE     /* Wake up fast */
 | 
			
		||||
#define BOARD_DPLL1_RUNSTDBY    FALSE     /* Run in standby */
 | 
			
		||||
#define BOARD_DPLL1_ONDEMAND    FALSE     /* On demand clock activation */
 | 
			
		||||
#define BOARD_DPLL1_REFLOCK     FALSE     /* Do not lock reference clock section */
 | 
			
		||||
#define BOARD_DPLL1_REFCLK      1         /* Reference clock = XOSCK32 */
 | 
			
		||||
#define BOARD_DPLL1_LTIME       0         /* Lock time  */
 | 
			
		||||
#define BOARD_DPLL1_FILTER      0         /* Sigma-delta DCO filter selection */
 | 
			
		||||
#define BOARD_DPLL1_DCOFILTER   0         /* Sigma-delta DCO filter selection */
 | 
			
		||||
#define BOARD_DPLL1_GCLK        0         /* GCLK source (if refclock == 0) */
 | 
			
		||||
#define BOARD_DPLL1_GCLKLOCK    0         /* Don't lock GCLK source clock configuration */
 | 
			
		||||
#define BOARD_DPLL1_LDRFRAC     13        /* Loop divider fractional part */
 | 
			
		||||
#define BOARD_DPLL1_LDRINT      1463      /* Loop divider ratio */
 | 
			
		||||
#define BOARD_DPLL1_DIV         0         /* Clock divider */
 | 
			
		||||
 | 
			
		||||
/* Master Clock (MCLK)
 | 
			
		||||
 *
 | 
			
		||||
 * GCLK0 is always the direct source the GCLK_MAIN.
 | 
			
		||||
 * CPU frequency = 120MHz / 1 = 120MHz
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define BOARD_MCLK_CPUDIV       1         /* MCLK divider to get CPU frequency */
 | 
			
		||||
 | 
			
		||||
/* Peripheral clocking */
 | 
			
		||||
 | 
			
		||||
#define BOARD_GCLK_EIC          4         /* EIC GCLK index */
 | 
			
		||||
 | 
			
		||||
/* FLASH wait states
 | 
			
		||||
 *
 | 
			
		||||
 * Vdd Range Wait states Maximum Operating Frequency
 | 
			
		||||
 * --------- ----------- ---------------------------
 | 
			
		||||
 * > 2.7V    0            24 MHz
 | 
			
		||||
 *           1            51 MHz
 | 
			
		||||
 *           2            77 MHz
 | 
			
		||||
 *           3           101 MHz
 | 
			
		||||
 *           4           119 MHz
 | 
			
		||||
 *           5           120 MHz
 | 
			
		||||
 * >1.71V    0            22 MHz
 | 
			
		||||
 *           1            44 MHz
 | 
			
		||||
 *           2            67 MHz
 | 
			
		||||
 *           3            89 MHz
 | 
			
		||||
 *           4           111 MHz
 | 
			
		||||
 *           5           120 MHz
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define BOARD_FLASH_WAITSTATES  6
 | 
			
		||||
 | 
			
		||||
/* LED definitions **********************************************************/
 | 
			
		||||
 | 
			
		||||
/* The Adafruit Metro M4 has four LEDs, but only two are controllable by
 | 
			
		||||
 * software:
 | 
			
		||||
 *
 | 
			
		||||
 *   1. The red LED on the Arduino D13 pin, and
 | 
			
		||||
 *   2. A NeoPixel RGB LED.
 | 
			
		||||
 *
 | 
			
		||||
 * Currently, only the red LED is supported.
 | 
			
		||||
 *
 | 
			
		||||
 *   ------ ----------------- -----------
 | 
			
		||||
 *   SHIELD SAMD5E5           FUNCTION
 | 
			
		||||
 *   ------ ----------------- -----------
 | 
			
		||||
 *   D13    PA16              GPIO output
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/* LED index values for use with board_userled() */
 | 
			
		||||
 | 
			
		||||
#define BOARD_RED_LED     0
 | 
			
		||||
#define BOARD_NLEDS       1
 | 
			
		||||
 | 
			
		||||
/* LED bits for use with board_userled_all() */
 | 
			
		||||
 | 
			
		||||
#define BOARD_RED_LED_BIT (1 << BOARD_RED_LED)
 | 
			
		||||
 | 
			
		||||
/* This LED is not used by the board port unless CONFIG_ARCH_LEDS is
 | 
			
		||||
 * defined.  In that case, the usage by the board port is defined in
 | 
			
		||||
 * include/board.h and src/sam_autoleds.c. The LEDs are used to encode
 | 
			
		||||
 * OS-related events as follows:
 | 
			
		||||
 *
 | 
			
		||||
 *   ------------------- ---------------------------- ------
 | 
			
		||||
 *   SYMBOL                  Meaning                  LED
 | 
			
		||||
 *   ------------------- ---------------------------- ------
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define LED_STARTED      0 /* NuttX has been started  OFF      */
 | 
			
		||||
#define LED_HEAPALLOCATE 0 /* Heap has been allocated OFF      */
 | 
			
		||||
#define LED_IRQSENABLED  0 /* Interrupts enabled      OFF      */
 | 
			
		||||
#define LED_STACKCREATED 1 /* Idle stack created      ON       */
 | 
			
		||||
#define LED_INIRQ        2 /* In an interrupt         N/C      */
 | 
			
		||||
#define LED_SIGNAL       2 /* In a signal handler     N/C      */
 | 
			
		||||
#define LED_ASSERTION    2 /* An assertion failed     N/C      */
 | 
			
		||||
#define LED_PANIC        3 /* The system has crashed  FLASH    */
 | 
			
		||||
#undef  LED_IDLE           /* MCU is is sleep mode    Not used */
 | 
			
		||||
 | 
			
		||||
/* Thus is LED is statically on, NuttX has successfully  booted and is,
 | 
			
		||||
 * apparently, running normally.  If LED is flashing at approximately
 | 
			
		||||
 * 2Hz, then a fatal error has been detected and the system has halted.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/* Alternate function pin selections ****************************************/
 | 
			
		||||
 | 
			
		||||
/* SERCOM definitions *******************************************************/
 | 
			
		||||
 | 
			
		||||
/* The SERCOM bus clock (CLK_SERCOMx_APB) can be enabled and disabled in the
 | 
			
		||||
 * Main Clock Controller. The SERCOM uses two generic clocks:
 | 
			
		||||
 * GCLK_SERCOMN_CORE and GCLK_SERCOM_SLOW.
 | 
			
		||||
 * The core clock (GCLK_SERCOMx_CORE) is required to clock the SERCOM while
 | 
			
		||||
 * working as a master.  The slow clock (GCLK_SERCOM_SLOW) is only  required
 | 
			
		||||
 * for certain functions and is common to all SERCOM modules.
 | 
			
		||||
 *
 | 
			
		||||
 * These clocks must be configured and enabled in the Generic Clock
 | 
			
		||||
 * Controller (GCLK) before using the SERCOM.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define BOARD_SERCOM_SLOWGEN         3                   /* 32.768KHz, common to all SERCOMS */
 | 
			
		||||
#define BOARD_SERCOM_SLOWLOCK        FALSE               /* Don't lock the SLOWCLOCK */
 | 
			
		||||
#define BOARD_SLOWCLOCK_FREQUENCY    BOARD_GCLK3_FREQUENCY
 | 
			
		||||
 | 
			
		||||
/* SERCOM3
 | 
			
		||||
 *
 | 
			
		||||
 * An Arduino compatible serial Shield is assumed (or equivalently, an
 | 
			
		||||
 * external RS-232 or serial-to-USB adapter connected on Arduino pins D0
 | 
			
		||||
 * and D1):
 | 
			
		||||
 *
 | 
			
		||||
 *   ------ ----------------- ---------
 | 
			
		||||
 *   SHIELD SAMD5E5           FUNCTION
 | 
			
		||||
 *   ------ ----------------- ---------
 | 
			
		||||
 *   D0     PA23 SERCOM3 PAD1 RXD
 | 
			
		||||
 *   D1     PA22 SERCOM3 PAD0 TXD
 | 
			
		||||
 *
 | 
			
		||||
 * NOTES:
 | 
			
		||||
 *   USART_CTRLA_TXPAD0_2: TxD=PAD0 XCK=N/A RTS/TE=PAD2 CTS=PAD3
 | 
			
		||||
 *   USART_CTRLA_RXPAD1:   RxD=PAD1
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define BOARD_SERCOM3_MUXCONFIG      (USART_CTRLA_TXPAD0_2 | USART_CTRLA_RXPAD1)
 | 
			
		||||
#define BOARD_SERCOM3_PINMAP_PAD0    PORT_SERCOM3_PAD0_1 /* PAD0: USART TX */
 | 
			
		||||
#define BOARD_SERCOM3_PINMAP_PAD1    PORT_SERCOM3_PAD1_1 /* PAD1: USART RX */
 | 
			
		||||
#define BOARD_SERCOM3_PINMAP_PAD2    0                   /* PAD2: (not used) */
 | 
			
		||||
#define BOARD_SERCOM3_PINMAP_PAD3    0                   /* PAD3: (not used) */
 | 
			
		||||
 | 
			
		||||
#define BOARD_TXIRQ_SERCOM3          SAM_IRQ_SERCOM3_0   /* INTFLAG[0] DRE */
 | 
			
		||||
#define BOARD_RXIRQ_SERCOM3          SAM_IRQ_SERCOM3_2   /* INTFLAG[2] RXC */
 | 
			
		||||
 | 
			
		||||
#define BOARD_SERCOM3_COREGEN        1                   /* 48MHz Core clock */
 | 
			
		||||
#define BOARD_SERCOM3_CORELOCK       FALSE               /* Don't lock the CORECLOCK */
 | 
			
		||||
#define BOARD_SERCOM3_FREQUENCY      BOARD_GCLK1_FREQUENCY
 | 
			
		||||
 | 
			
		||||
/* I2C
 | 
			
		||||
 *  PB02 - SERCOM5 PAD0 SDA
 | 
			
		||||
 *  PB03 - SERCOM5 PAD1 SCL
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define BOARD_SERCOM5_MUXCONFIG      (0)
 | 
			
		||||
#define BOARD_SERCOM5_PINMAP_PAD0    PORT_SERCOM5_PAD0_3 /* PB02: PAD0: I2C SDA */
 | 
			
		||||
#define BOARD_SERCOM5_PINMAP_PAD1    PORT_SERCOM5_PAD1_3 /* PB03: PAD1: I2C SCL */
 | 
			
		||||
#define BOARD_SERCOM5_PINMAP_PAD2    0                   /* PAD2: (not used) */
 | 
			
		||||
#define BOARD_SERCOM5_PINMAP_PAD3    0                   /* PAD3: (not used) */
 | 
			
		||||
 | 
			
		||||
#define BOARD_SERCOM5_GCLKGEN 		 1                   /* 48MHz Core clock */
 | 
			
		||||
#define BOARD_SERCOM5_SLOW_GCLKGEN	 3
 | 
			
		||||
#define BOARD_SERCOM5_FREQUENCY      BOARD_GCLK1_FREQUENCY
 | 
			
		||||
 | 
			
		||||
/* Tickless */
 | 
			
		||||
 | 
			
		||||
#define BOARD_TC0_PINMAP_CC0         0                      /* CC0: (not used) */
 | 
			
		||||
#define BOARD_TC0_PINMAP_CC1         0                      /* CC1: (not used) */
 | 
			
		||||
#define BOARD_TC0_GCLKGEN            3
 | 
			
		||||
#define BOARD_TC0_FREQUENCY          BOARD_GCLK3_FREQUENCY
 | 
			
		||||
#define BOARD_TC2_PINMAP_CC0         0                      /* CC0: (not used) */
 | 
			
		||||
#define BOARD_TC2_PINMAP_CC1         0                      /* CC1: (not used) */
 | 
			
		||||
#define BOARD_TC2_GCLKGEN            3
 | 
			
		||||
#define BOARD_TC2_FREQUENCY          BOARD_GCLK3_FREQUENCY
 | 
			
		||||
#define BOARD_TC4_PINMAP_CC0         0                      /* CC0: (not used) */
 | 
			
		||||
#define BOARD_TC4_PINMAP_CC1         0                      /* CC1: (not used) */
 | 
			
		||||
#define BOARD_TC4_GCLKGEN            3
 | 
			
		||||
#define BOARD_TC4_FREQUENCY          BOARD_GCLK3_FREQUENCY
 | 
			
		||||
 | 
			
		||||
/* USB */
 | 
			
		||||
 | 
			
		||||
#define BOARD_USB_GCLKGEN            1                   /* GCLK1, 48MHz */
 | 
			
		||||
 | 
			
		||||
#endif /* __BOARDS_ARM_SAMD5E5_METRO_M4_INCLUDE_BOARD_H */
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,78 @@
 | 
			
		|||
############################################################################
 | 
			
		||||
# boards/arm/samd5e5/metro-m4/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/armv7-m/Toolchain.defs
 | 
			
		||||
 | 
			
		||||
ifeq ($(CONFIG_METRO_M4_RUNFROMFLASH),y)
 | 
			
		||||
  LDSCRIPT = flash.ld
 | 
			
		||||
else ifeq ($(CONFIG_METRO_M4_RUNFROMSRAM),y)
 | 
			
		||||
  LDSCRIPT = sram.ld
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
ifeq ($(CONFIG_CYGWIN_WINTOOL),y)
 | 
			
		||||
  ARCHSCRIPT = -T "${shell cygpath -w $(BOARD_DIR)$(DELIM)scripts$(DELIM)$(LDSCRIPT)}"
 | 
			
		||||
else
 | 
			
		||||
  ARCHSCRIPT = -T$(BOARD_DIR)$(DELIM)scripts$(DELIM)$(LDSCRIPT)
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
ifeq ($(CONFIG_DEBUG_SYMBOLS),y)
 | 
			
		||||
  ARCHOPTIMIZATION = -g
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
ifneq ($(CONFIG_DEBUG_NOOPT),y)
 | 
			
		||||
  ARCHOPTIMIZATION += $(MAXOPTIMIZATION) -fno-strict-aliasing -fno-strength-reduce -fomit-frame-pointer
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
ARCHCFLAGS = -fno-builtin
 | 
			
		||||
ARCHCXXFLAGS = -fno-builtin -fno-exceptions -fcheck-new -fno-rtti
 | 
			
		||||
ARCHWARNINGS = -Wall -Wstrict-prototypes -Wshadow -Wundef
 | 
			
		||||
ARCHWARNINGSXX = -Wall -Wshadow -Wundef
 | 
			
		||||
ARCHPICFLAGS = -fpic -msingle-pic-base -mpic-register=r10
 | 
			
		||||
 | 
			
		||||
CFLAGS := $(ARCHCFLAGS) $(ARCHWARNINGS) $(ARCHOPTIMIZATION) $(ARCHCPUFLAGS) $(ARCHINCLUDES) $(ARCHDEFINES) $(EXTRAFLAGS) -pipe
 | 
			
		||||
CPICFLAGS = $(ARCHPICFLAGS) $(CFLAGS)
 | 
			
		||||
CXXFLAGS := $(ARCHCXXFLAGS) $(ARCHWARNINGSXX) $(ARCHOPTIMIZATION) $(ARCHCPUFLAGS) $(ARCHXXINCLUDES) $(ARCHDEFINES) $(EXTRAFLAGS) -pipe
 | 
			
		||||
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
 | 
			
		||||
 | 
			
		||||
# Loadable module definitions
 | 
			
		||||
 | 
			
		||||
CMODULEFLAGS = $(CFLAGS) -mlong-calls # --target1-abs
 | 
			
		||||
 | 
			
		||||
LDMODULEFLAGS = -r -e module_initialize
 | 
			
		||||
ifeq ($(CONFIG_CYGWIN_WINTOOL),y)
 | 
			
		||||
  LDMODULEFLAGS += -T "${shell cygpath -w $(TOPDIR)/libs/libc/modlib/gnu-elf.ld}"
 | 
			
		||||
else
 | 
			
		||||
  LDMODULEFLAGS += -T $(TOPDIR)/libs/libc/modlib/gnu-elf.ld
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
ifneq ($(CROSSDEV),arm-nuttx-elf-)
 | 
			
		||||
  LDFLAGS += -nostartfiles -nodefaultlibs
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(CONFIG_DEBUG_SYMBOLS),y)
 | 
			
		||||
  LDFLAGS += -g
 | 
			
		||||
endif
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,108 @@
 | 
			
		|||
/****************************************************************************
 | 
			
		||||
 * boards/arm/samd5e5/metro-m4/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 ATSAMD51J19 has 512Kb of FLASH beginning at address 0x0000:0000 and
 | 
			
		||||
 * 192Kb of SRAM at address 0x2000:0000.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
MEMORY
 | 
			
		||||
{
 | 
			
		||||
  flash (rx) : ORIGIN = 0x00000000, LENGTH = 512K
 | 
			
		||||
  sram (rwx) : ORIGIN = 0x20000000, LENGTH = 192K
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
OUTPUT_ARCH(arm)
 | 
			
		||||
ENTRY(_stext)
 | 
			
		||||
EXTERN(_vectors)
 | 
			
		||||
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(.);
 | 
			
		||||
        *(.init_array .init_array.*)
 | 
			
		||||
        _einit = ABSOLUTE(.);
 | 
			
		||||
    } > flash
 | 
			
		||||
 | 
			
		||||
    .ARM.extab :
 | 
			
		||||
    {
 | 
			
		||||
        *(.ARM.extab*)
 | 
			
		||||
    } > flash
 | 
			
		||||
 | 
			
		||||
    __exidx_start = ABSOLUTE(.);
 | 
			
		||||
    .ARM.exidx :
 | 
			
		||||
    {
 | 
			
		||||
        *(.ARM.exidx*)
 | 
			
		||||
    } > flash
 | 
			
		||||
    __exidx_end = ABSOLUTE(.);
 | 
			
		||||
 | 
			
		||||
    _eronly = ABSOLUTE(.);
 | 
			
		||||
 | 
			
		||||
    .data :
 | 
			
		||||
    {
 | 
			
		||||
        _sdata = ABSOLUTE(.);
 | 
			
		||||
        *(.data .data.*)
 | 
			
		||||
        *(.gnu.linkonce.d.*)
 | 
			
		||||
        CONSTRUCTORS
 | 
			
		||||
        . = ALIGN(4);
 | 
			
		||||
        _edata = ABSOLUTE(.);
 | 
			
		||||
    } > sram AT > flash
 | 
			
		||||
 | 
			
		||||
    .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) }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,56 @@
 | 
			
		|||
/****************************************************************************
 | 
			
		||||
 * boards/arm/samd5e5/metro-m4/scripts/nvm.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 <stdio.h>
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
 | 
			
		||||
const uint8_t nvm[20] =
 | 
			
		||||
{
 | 
			
		||||
  0x14,                                           /* Count 20 bytes */
 | 
			
		||||
  0x80, 0x40, 0x00,                               /* 24-address : 804000 */
 | 
			
		||||
  0x39, 0x92, 0x9a, 0xfe, 0x80, 0xff, 0xec, 0xae, /* 16-bytes of NVM data */
 | 
			
		||||
  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Public Functions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
int main(int argc, char **argv)
 | 
			
		||||
{
 | 
			
		||||
  unsigned int csum;
 | 
			
		||||
  int i;
 | 
			
		||||
 | 
			
		||||
  printf("S2");
 | 
			
		||||
 | 
			
		||||
  for (i = 0, csum = 0; i < 20; i++)
 | 
			
		||||
    {
 | 
			
		||||
      csum += nvm[i];
 | 
			
		||||
      printf("%02X", (unsigned int)nvm[i]);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  printf("%02X\r\n", ~csum & 0xff);
 | 
			
		||||
  printf("S9030000FC\r\n");
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,2 @@
 | 
			
		|||
S21480400039929AFE80FFECAEFFFFFFFFFFFFFFFFB7
 | 
			
		||||
S9030000FC
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,107 @@
 | 
			
		|||
/****************************************************************************
 | 
			
		||||
 * boards/arm/samd5e5/metro-m4/scripts/sram.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 ATSAMD51J19 has 512Kb of FLASH beginning at address 0x0000:0000 and
 | 
			
		||||
 * 192Kb of SRAM at address 0x2000:0000.  Only sram is used by this linker
 | 
			
		||||
 * script.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
MEMORY
 | 
			
		||||
{
 | 
			
		||||
  flash (rx) : ORIGIN = 0x00000000, LENGTH = 512K
 | 
			
		||||
  sram (rwx) : ORIGIN = 0x20000000, LENGTH = 192K
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
OUTPUT_ARCH(arm)
 | 
			
		||||
ENTRY(_stext)
 | 
			
		||||
EXTERN(_vectors)
 | 
			
		||||
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(.);
 | 
			
		||||
    } > sram
 | 
			
		||||
 | 
			
		||||
    .init_section :
 | 
			
		||||
    {
 | 
			
		||||
        _sinit = ABSOLUTE(.);
 | 
			
		||||
        *(.init_array .init_array.*)
 | 
			
		||||
        _einit = ABSOLUTE(.);
 | 
			
		||||
    } > sram
 | 
			
		||||
 | 
			
		||||
    .ARM.extab :
 | 
			
		||||
    {
 | 
			
		||||
        *(.ARM.extab*)
 | 
			
		||||
    } > sram
 | 
			
		||||
 | 
			
		||||
    __exidx_start = ABSOLUTE(.);
 | 
			
		||||
    .ARM.exidx :
 | 
			
		||||
    {
 | 
			
		||||
        *(.ARM.exidx*)
 | 
			
		||||
    } > sram
 | 
			
		||||
    __exidx_end = ABSOLUTE(.);
 | 
			
		||||
 | 
			
		||||
    .data :
 | 
			
		||||
    {
 | 
			
		||||
        _sdata = ABSOLUTE(.);
 | 
			
		||||
        *(.data .data.*)
 | 
			
		||||
        *(.gnu.linkonce.d.*)
 | 
			
		||||
        CONSTRUCTORS
 | 
			
		||||
        . = ALIGN(4);
 | 
			
		||||
        _edata = ABSOLUTE(.);
 | 
			
		||||
    } > sram
 | 
			
		||||
 | 
			
		||||
    .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) }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,74 @@
 | 
			
		|||
############################################################################
 | 
			
		||||
# boards/arm/samd5e5/metro-m4/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 sam_bringup.c
 | 
			
		||||
 | 
			
		||||
ifeq ($(CONFIG_LIB_BOARDCTL),y)
 | 
			
		||||
CSRCS += sam_appinit.c
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
ifeq ($(CONFIG_ARCH_LEDS),y)
 | 
			
		||||
CSRCS += sam_autoleds.c
 | 
			
		||||
else
 | 
			
		||||
CSRCS += sam_userleds.c
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
ifeq ($(CONFIG_USBDEV),y)
 | 
			
		||||
CSRCS += sam_usbdev.c
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
ifeq ($(CONFIG_USBMSC),y)
 | 
			
		||||
CSRCS += sam_usbmsc.c
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
ifeq ($(CONFIG_USBDEV_COMPOSITE),y)
 | 
			
		||||
CSRCS += sam_composite.c
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
ifeq ($(CONFIG_USBHOST),y)
 | 
			
		||||
CSRCS += sam_usbhost.c
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
ifeq ($(CONFIG_FS_AUTOMOUNTER),y)
 | 
			
		||||
CSRCS += sam_automount.c
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
ifeq ($(CONFIG_SAMD5E5_SERCOM5_ISI2C),y)
 | 
			
		||||
CSRCS += sam_i2c.c
 | 
			
		||||
ifeq ($(CONFIG_MTD_AT24XX),y)
 | 
			
		||||
CSRCS += sam_at24.c
 | 
			
		||||
endif
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
ifeq ($(CONFIG_FS_SMARTFS),y)
 | 
			
		||||
CSRCS += sam_smartfs.c
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
ifeq ($(CONFIG_BQ27426),y)
 | 
			
		||||
CSRCS += sam_bq27426.c
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
ifeq ($(CONFIG_DEV_GPIO),y)
 | 
			
		||||
CSRCS += sam_gpio.c
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
include $(TOPDIR)/boards/Board.mk
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,163 @@
 | 
			
		|||
/****************************************************************************
 | 
			
		||||
 * boards/arm/samd5e5/metro-m4/src/metro-m4.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_SAMD5E5_METRO_M4_SRC_METRO_M4_H
 | 
			
		||||
#define __BOARDS_ARM_SAMD5E5_METRO_M4_SRC_METRO_M4_H
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Included Files
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#include <nuttx/config.h>
 | 
			
		||||
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Pre-processor Definitions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/* Configuration ************************************************************/
 | 
			
		||||
 | 
			
		||||
/* Metro-M4 GPIOs ***********************************************************/
 | 
			
		||||
 | 
			
		||||
/* LEDs
 | 
			
		||||
 *
 | 
			
		||||
 * The Adafruit Metro M4 has four LEDs, but only two are controllable by
 | 
			
		||||
 * software:
 | 
			
		||||
 *
 | 
			
		||||
 *   1. The red LED on the Arduino D13 pin, and
 | 
			
		||||
 *   2. A NeoPixel RGB LED.
 | 
			
		||||
 *
 | 
			
		||||
 * Currently, only the red LED is supported.
 | 
			
		||||
 *
 | 
			
		||||
 *   ------ ----------------- -----------
 | 
			
		||||
 *   SHIELD SAMD5E5           FUNCTION
 | 
			
		||||
 *   ------ ----------------- -----------
 | 
			
		||||
 *   D13    PA16              GPIO output
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define PORT_RED_LED (PORT_OUTPUT  | PORT_PULL_NONE | PORT_OUTPUT_SET | PORTA | PORT_PIN16)
 | 
			
		||||
 | 
			
		||||
#define PORT_D8	  (PORT_OUTPUT     | PORT_PULL_NONE | PORT_OUTPUT_SET | PORTA | PORT_PIN21)
 | 
			
		||||
#define PORT_D9   (PORT_INTERRUPT  | PORT_PULL_NONE | PORT_INT_RISING | PORTA | PORT_PIN20)
 | 
			
		||||
#define PORT_D10  (PORT_INPUT      | PORT_PULL_NONE | PORT_INT_CHANGE | PORTA | PORT_PIN18)
 | 
			
		||||
 | 
			
		||||
/* GPIO pins used by the GPIO Subsystem */
 | 
			
		||||
 | 
			
		||||
#define BOARD_NGPIOIN     1 /* Amount of GPIO Input pins */
 | 
			
		||||
#define BOARD_NGPIOOUT    1 /* Amount of GPIO Output pins */
 | 
			
		||||
#define BOARD_NGPIOINT    1 /* Amount of GPIO Input w/ Interruption pins */
 | 
			
		||||
 | 
			
		||||
#define HAVE_AT24 1
 | 
			
		||||
 | 
			
		||||
/* AT24 Serial EEPROM */
 | 
			
		||||
 | 
			
		||||
#define AT24_I2C_BUS   5 /* AT24C256 connected to I2C5 */
 | 
			
		||||
#define AT24_MINOR     0
 | 
			
		||||
 | 
			
		||||
#if !defined(CONFIG_MTD_AT24XX) || !defined(CONFIG_SAMD5E5_SERCOM5_ISI2C)
 | 
			
		||||
#  undef HAVE_AT24
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/* Can't support AT24 features if mountpoints are disabled or if we were not
 | 
			
		||||
 * asked to mount the AT25 part
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#if defined(CONFIG_DISABLE_MOUNTPOINT) || \
 | 
			
		||||
   !defined(CONFIG_METRO_M4_AT24_BLOCKMOUNT)
 | 
			
		||||
#  undef HAVE_AT24
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/* On-chip Programming Memory */
 | 
			
		||||
 | 
			
		||||
#if defined(CONFIG_SAMD5E5_PROGMEM) || defined(CONFIG_MTD_PROGMEM)
 | 
			
		||||
#define HAVE_PROGMEM_CHARDEV
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/* This is the on-chip progmem memroy driver minor number */
 | 
			
		||||
 | 
			
		||||
#define PROGMEM_MTD_MINOR 0
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Public Types
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Public Data
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#ifndef __ASSEMBLY__
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Public Functions Prototypes
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: sam_bringup
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   Perform architecture-specific initialization
 | 
			
		||||
 *
 | 
			
		||||
 *   CONFIG_BOARD_LATE_INITIALIZE=y :
 | 
			
		||||
 *     Called from board_late_initialize().
 | 
			
		||||
 *
 | 
			
		||||
 *   CONFIG_BOARD_LATE_INITIALIZE=y && CONFIG_LIB_BOARDCTL=y :
 | 
			
		||||
 *     Called from the NSH library
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
int sam_bringup(void);
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: sam_led_pminitialize
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   Register LED power management features.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_PM
 | 
			
		||||
void sam_led_pminitialize(void);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_METRO_M4_USB_AUTOMOUNT
 | 
			
		||||
void sam_automount_initialize(void);
 | 
			
		||||
void sam_automount_event(bool inserted);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_SAMD5E5_SERCOM5_ISI2C
 | 
			
		||||
FAR struct i2c_master_s *g_i2c5_dev;
 | 
			
		||||
int metro_m4_i2cdev_initialize(void);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_FS_SMARTFS
 | 
			
		||||
int sam_smartfs_initialize(void);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_BQ27426
 | 
			
		||||
int sam_bq27426_initialize(FAR const char *devname);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_DEV_GPIO
 | 
			
		||||
int sam_gpio_initialize(void);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif /* __ASSEMBLY__ */
 | 
			
		||||
#endif /* __BOARDS_ARM_SAMD5E5_METRO_M4_SRC_METRO_M4_H */
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,79 @@
 | 
			
		|||
/****************************************************************************
 | 
			
		||||
 * boards/arm/samd5e5/metro-m4/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 <nuttx/config.h>
 | 
			
		||||
 | 
			
		||||
#include <nuttx/board.h>
 | 
			
		||||
 | 
			
		||||
#include "metro-m4.h"
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Pre-processor Definitions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#ifndef OK
 | 
			
		||||
#  define OK 0
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * 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)
 | 
			
		||||
{
 | 
			
		||||
#ifdef CONFIG_BOARD_LATE_INITIALIZE
 | 
			
		||||
  /* Board initialization already performed by board_late_initialize() */
 | 
			
		||||
 | 
			
		||||
  return OK;
 | 
			
		||||
#else
 | 
			
		||||
  /* Perform board-specific initialization */
 | 
			
		||||
 | 
			
		||||
  return sam_bringup();
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,125 @@
 | 
			
		|||
/****************************************************************************
 | 
			
		||||
 * boards/arm/samd5e5/metro-m4/src/sam_at24.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 <nuttx/config.h>
 | 
			
		||||
 | 
			
		||||
#include <stdbool.h>
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <errno.h>
 | 
			
		||||
#include <debug.h>
 | 
			
		||||
 | 
			
		||||
#include <nuttx/i2c/i2c_master.h>
 | 
			
		||||
#include <nuttx/mtd/mtd.h>
 | 
			
		||||
#include <nuttx/fs/fs.h>
 | 
			
		||||
#include <nuttx/fs/nxffs.h>
 | 
			
		||||
 | 
			
		||||
#include "metro-m4.h"
 | 
			
		||||
 | 
			
		||||
#ifdef HAVE_AT24
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Pre-processor Definitions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Public Functions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: sam_at24_automount
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   Initialize and configure the AT24 serial EEPROM
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
extern FAR struct i2c_master_s *g_i2c5_dev;
 | 
			
		||||
 | 
			
		||||
int sam_at24_automount(int minor)
 | 
			
		||||
{
 | 
			
		||||
  FAR struct mtd_dev_s *mtd;
 | 
			
		||||
  static bool initialized = false;
 | 
			
		||||
  int ret;
 | 
			
		||||
 | 
			
		||||
  /* Have we already initialized? */
 | 
			
		||||
 | 
			
		||||
  if (!initialized)
 | 
			
		||||
    {
 | 
			
		||||
      /* Now bind the I2C interface to the AT24 I2C EEPROM driver */
 | 
			
		||||
 | 
			
		||||
      finfo("Bind the AT24 EEPROM driver to I2C%d\n", AT24_I2C_BUS);
 | 
			
		||||
      mtd = at24c_initialize(g_i2c5_dev);
 | 
			
		||||
      if (!mtd)
 | 
			
		||||
        {
 | 
			
		||||
          ferr("ERROR: Failed to bind TWI%d to the AT24 EEPROM driver\n",
 | 
			
		||||
               AT24_I2C_BUS);
 | 
			
		||||
          return -ENODEV;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
#if defined(CONFIG_METRO_M4_AT24_FTL)
 | 
			
		||||
      /* And finally, use the FTL layer
 | 
			
		||||
       * to wrap the MTD driver as a block driver
 | 
			
		||||
       */
 | 
			
		||||
 | 
			
		||||
      finfo("Initialize the FTL layer to create /dev/mtdblock%d\n",
 | 
			
		||||
            AT24_MINOR);
 | 
			
		||||
      ret = ftl_initialize(AT24_MINOR, mtd);
 | 
			
		||||
      if (ret < 0)
 | 
			
		||||
        {
 | 
			
		||||
          ferr("ERROR: Failed to initialize the FTL layer: %d\n", ret);
 | 
			
		||||
          return ret;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
#elif defined(CONFIG_METRO_M4_AT24_NXFFS)
 | 
			
		||||
      /* Initialize to provide NXFFS on the MTD interface */
 | 
			
		||||
 | 
			
		||||
      finfo("Initialize the NXFFS file system\n");
 | 
			
		||||
      ret = nxffs_initialize(mtd);
 | 
			
		||||
      if (ret < 0)
 | 
			
		||||
        {
 | 
			
		||||
          ferr("ERROR: NXFFS initialization failed: %d\n", ret);
 | 
			
		||||
          return ret;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
      /* Mount the file system at /mnt/at24 */
 | 
			
		||||
 | 
			
		||||
      finfo("Mount the NXFFS file system at /dev/at24\n");
 | 
			
		||||
      ret = nx_mount(NULL, "/mnt/at24", "nxffs", 0, NULL);
 | 
			
		||||
      if (ret < 0)
 | 
			
		||||
        {
 | 
			
		||||
          ferr("ERROR: Failed to mount the NXFFS volume: %d\n",
 | 
			
		||||
                ret);
 | 
			
		||||
          return ret;
 | 
			
		||||
        }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
      /* Now we are initialized */
 | 
			
		||||
 | 
			
		||||
      initialized = true;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  return OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif /* HAVE_AT24 */
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,285 @@
 | 
			
		|||
/****************************************************************************
 | 
			
		||||
 * boards/arm/samd5e5/metro-m4/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.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/* The Adafruit Metro M4 has four LEDs, but only two are controllable by
 | 
			
		||||
 * software:
 | 
			
		||||
 *
 | 
			
		||||
 *   1. The red LED on the Arduino D13 pin, and
 | 
			
		||||
 *   2. A NeoPixel RGB LED.
 | 
			
		||||
 *
 | 
			
		||||
 * Currently, only the red LED is supported.
 | 
			
		||||
 *
 | 
			
		||||
 *   ------ ----------------- -----------
 | 
			
		||||
 *   SHIELD SAMD5E5           FUNCTION
 | 
			
		||||
 *   ------ ----------------- -----------
 | 
			
		||||
 *   D13    PA16              GPIO output
 | 
			
		||||
 *
 | 
			
		||||
 * This LED is not used by the board port unless CONFIG_ARCH_LEDS is
 | 
			
		||||
 * defined.  In that case, the usage by the board port is defined in
 | 
			
		||||
 * include/board.h and src/sam_autoleds.c. The LEDs are used to encode
 | 
			
		||||
 * OS-related events 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
 | 
			
		||||
 *   LED_IDLE            MCU is is sleep mode         Not used
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Included Files
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#include <nuttx/config.h>
 | 
			
		||||
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
#include <stdbool.h>
 | 
			
		||||
#include <debug.h>
 | 
			
		||||
 | 
			
		||||
#include <nuttx/board.h>
 | 
			
		||||
#include <nuttx/power/pm.h>
 | 
			
		||||
 | 
			
		||||
#include "arm_arch.h"
 | 
			
		||||
#include "arm_internal.h"
 | 
			
		||||
#include "sam_port.h"
 | 
			
		||||
#include "metro-m4.h"
 | 
			
		||||
 | 
			
		||||
#include <arch/board/board.h>
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_ARCH_LEDS
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Pre-processor Definitions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Private Function Prototypes
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/* LED Power Management */
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_PM
 | 
			
		||||
static void led_pm_notify(struct pm_callback_s *cb, int domain,
 | 
			
		||||
                          enum pm_state_e pmstate);
 | 
			
		||||
static int led_pm_prepare(struct pm_callback_s *cb, int domain,
 | 
			
		||||
                          enum pm_state_e pmstate);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Private Data
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_PM
 | 
			
		||||
static struct pm_callback_s g_ledscb =
 | 
			
		||||
{
 | 
			
		||||
  .notify  = led_pm_notify,
 | 
			
		||||
  .prepare = led_pm_prepare,
 | 
			
		||||
};
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Private Functions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: led_pm_notify
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   Notify the driver of new power state. This callback is called after
 | 
			
		||||
 *   all drivers have had the opportunity to prepare for the new power state.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_PM
 | 
			
		||||
static void led_pm_notify(struct pm_callback_s *cb, int domain,
 | 
			
		||||
                          enum pm_state_e pmstate)
 | 
			
		||||
{
 | 
			
		||||
  switch (pmstate)
 | 
			
		||||
    {
 | 
			
		||||
      case(PM_NORMAL):
 | 
			
		||||
        {
 | 
			
		||||
          /* Restore normal LEDs operation */
 | 
			
		||||
        }
 | 
			
		||||
        break;
 | 
			
		||||
 | 
			
		||||
      case(PM_IDLE):
 | 
			
		||||
        {
 | 
			
		||||
          /* Entering IDLE mode - Turn leds off */
 | 
			
		||||
        }
 | 
			
		||||
        break;
 | 
			
		||||
 | 
			
		||||
      case(PM_STANDBY):
 | 
			
		||||
        {
 | 
			
		||||
          /* Entering STANDBY mode - Logic for PM_STANDBY goes here */
 | 
			
		||||
        }
 | 
			
		||||
        break;
 | 
			
		||||
 | 
			
		||||
      case(PM_SLEEP):
 | 
			
		||||
        {
 | 
			
		||||
          /* Entering SLEEP mode - Logic for PM_SLEEP goes here */
 | 
			
		||||
        }
 | 
			
		||||
        break;
 | 
			
		||||
 | 
			
		||||
      default:
 | 
			
		||||
        {
 | 
			
		||||
          /* Should not get here */
 | 
			
		||||
        }
 | 
			
		||||
        break;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: led_pm_prepare
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   Request the driver to prepare for a new power state. This is a warning
 | 
			
		||||
 *   that the system is about to enter into a new power state. The driver
 | 
			
		||||
 *   should begin whatever operations that may be required to enter power
 | 
			
		||||
 *   state. The driver may abort the state change mode by returning a
 | 
			
		||||
 *   non-zero value from the callback function.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_PM
 | 
			
		||||
static int led_pm_prepare(struct pm_callback_s *cb, int domain,
 | 
			
		||||
                          enum pm_state_e pmstate)
 | 
			
		||||
{
 | 
			
		||||
  /* No preparation to change power modes is required by the LEDs driver.
 | 
			
		||||
   * We always accept the state change by returning OK.
 | 
			
		||||
   */
 | 
			
		||||
 | 
			
		||||
  return OK;
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Public Functions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: board_autoled_initialize
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
void board_autoled_initialize(void)
 | 
			
		||||
{
 | 
			
		||||
  sam_portconfig(PORT_RED_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_RED_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_RED_LED, true);
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: sam_led_pminitialize
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   Register LED power management features.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_PM
 | 
			
		||||
void sam_led_pminitialize(void)
 | 
			
		||||
{
 | 
			
		||||
  /* Register to receive power management callbacks */
 | 
			
		||||
 | 
			
		||||
  int ret = pm_register(&g_ledscb);
 | 
			
		||||
  if (ret != OK)
 | 
			
		||||
    {
 | 
			
		||||
      board_autoled_on(LED_ASSERTION);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
#endif /* CONFIG_PM */
 | 
			
		||||
 | 
			
		||||
#endif /* CONFIG_ARCH_LEDS */
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,331 @@
 | 
			
		|||
/****************************************************************************
 | 
			
		||||
 * boards/arm/samd5e5/metro-m4/src/sam_automount.c
 | 
			
		||||
 *
 | 
			
		||||
 *   Copyright 2020 Falker Automacao Agricola LTDA.
 | 
			
		||||
 *   Author: Leomar Mateus Radke <leomar@falker.com.br>
 | 
			
		||||
 *   Author: Ricardo Wartchow <wartchow@gmail.com>
 | 
			
		||||
 *
 | 
			
		||||
 * 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>
 | 
			
		||||
 | 
			
		||||
#if defined(CONFIG_FS_AUTOMOUNTER_DEBUG) && !defined(CONFIG_DEBUG_FS)
 | 
			
		||||
#  define CONFIG_DEBUG_FS 1
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#include <debug.h>
 | 
			
		||||
 | 
			
		||||
#include <nuttx/irq.h>
 | 
			
		||||
#include <nuttx/clock.h>
 | 
			
		||||
#include <nuttx/fs/automount.h>
 | 
			
		||||
 | 
			
		||||
#include "metro-m4.h"
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_FS_AUTOMOUNTER
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Pre-processor Definitions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#ifndef NULL
 | 
			
		||||
#  define NULL (FAR void *)0
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifndef OK
 | 
			
		||||
#  define OK 0
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Private Types
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/* This structure represents the changeable state of the automounter */
 | 
			
		||||
 | 
			
		||||
struct sam_automount_state_s
 | 
			
		||||
{
 | 
			
		||||
  volatile automount_handler_t handler;    /* Upper half handler */
 | 
			
		||||
  FAR void *arg;                           /* Handler argument */
 | 
			
		||||
  bool enable;                             /* Fake interrupt enable */
 | 
			
		||||
  bool pending;                            /* Set if there an event while disabled */
 | 
			
		||||
  bool inserted;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* This structure represents the static configuration of an automounter */
 | 
			
		||||
 | 
			
		||||
struct sam_automount_config_s
 | 
			
		||||
{
 | 
			
		||||
  /* This must be first thing in structure so that we can simply cast from
 | 
			
		||||
   * struct automount_lower_s to struct sam_automount_config_s
 | 
			
		||||
   */
 | 
			
		||||
 | 
			
		||||
  struct automount_lower_s lower;          /* Publicly visible part */
 | 
			
		||||
  FAR struct sam_automount_state_s *state; /* Changeable state */
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Private Function Prototypes
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
static int  sam_attach(FAR const struct automount_lower_s *lower,
 | 
			
		||||
                       automount_handler_t isr, FAR void *arg);
 | 
			
		||||
static void sam_enable(FAR const struct automount_lower_s *lower,
 | 
			
		||||
                       bool enable);
 | 
			
		||||
static bool sam_inserted(FAR const struct automount_lower_s *lower);
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Private Data
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_METRO_M4_USB_AUTOMOUNT
 | 
			
		||||
static struct sam_automount_state_s g_port0state;
 | 
			
		||||
static const struct sam_automount_config_s g_port0config =
 | 
			
		||||
{
 | 
			
		||||
  .lower        =
 | 
			
		||||
  {
 | 
			
		||||
    .fstype     = CONFIG_METRO_M4_USB_AUTOMOUNT_FSTYPE,
 | 
			
		||||
    .blockdev   = CONFIG_METRO_M4_USB_AUTOMOUNT_BLKDEV,
 | 
			
		||||
    .mountpoint = CONFIG_METRO_M4_USB_AUTOMOUNT_MOUNTPOINT,
 | 
			
		||||
    .ddelay     = MSEC2TICK(CONFIG_METRO_M4_USB_AUTOMOUNT_DDELAY),
 | 
			
		||||
    .udelay     = MSEC2TICK(CONFIG_METRO_M4_USB_AUTOMOUNT_UDELAY),
 | 
			
		||||
    .attach     = sam_attach,
 | 
			
		||||
    .enable     = sam_enable,
 | 
			
		||||
    .inserted   = sam_inserted
 | 
			
		||||
  },
 | 
			
		||||
  .state        = &g_port0state
 | 
			
		||||
};
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Private Functions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name:  sam_attach
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   Attach a new port event handler
 | 
			
		||||
 *
 | 
			
		||||
 * Input Parameters:
 | 
			
		||||
 *   lower - An instance of the auto-mounter lower half state structure
 | 
			
		||||
 *   isr   - The new event handler to be attach
 | 
			
		||||
 *   arg   - Client data to be provided when the event handler is invoked.
 | 
			
		||||
 *
 | 
			
		||||
 *  Returned Value:
 | 
			
		||||
 *    Always returns OK
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
static int sam_attach(FAR const struct automount_lower_s *lower,
 | 
			
		||||
                      automount_handler_t isr, FAR void *arg)
 | 
			
		||||
{
 | 
			
		||||
  FAR const struct sam_automount_config_s *config;
 | 
			
		||||
  FAR struct sam_automount_state_s *state;
 | 
			
		||||
 | 
			
		||||
  finfo("Entry\n");
 | 
			
		||||
 | 
			
		||||
  /* Recover references to our structure */
 | 
			
		||||
 | 
			
		||||
  config = (FAR struct sam_automount_config_s *)lower;
 | 
			
		||||
  DEBUGASSERT(config && config->state);
 | 
			
		||||
 | 
			
		||||
  state = config->state;
 | 
			
		||||
 | 
			
		||||
  /* Save the new handler info (clearing the handler first to eliminate
 | 
			
		||||
   * race conditions).
 | 
			
		||||
   */
 | 
			
		||||
 | 
			
		||||
  state->handler = NULL;
 | 
			
		||||
  state->pending = false;
 | 
			
		||||
  state->arg     = arg;
 | 
			
		||||
  state->handler = isr;
 | 
			
		||||
  return OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name:  sam_enable
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   Enable port insertion/removal event detection
 | 
			
		||||
 *
 | 
			
		||||
 * Input Parameters:
 | 
			
		||||
 *   lower - An instance of the auto-mounter lower half state structure
 | 
			
		||||
 *   enable - True: enable event detection; False: disable
 | 
			
		||||
 *
 | 
			
		||||
 *  Returned Value:
 | 
			
		||||
 *    None
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
static void sam_enable(FAR const struct automount_lower_s *lower,
 | 
			
		||||
                       bool enable)
 | 
			
		||||
{
 | 
			
		||||
  FAR const struct sam_automount_config_s *config;
 | 
			
		||||
  FAR struct sam_automount_state_s *state;
 | 
			
		||||
  irqstate_t flags;
 | 
			
		||||
 | 
			
		||||
  finfo("Entry\n");
 | 
			
		||||
 | 
			
		||||
  /* Recover references to our structure */
 | 
			
		||||
 | 
			
		||||
  config = (FAR struct sam_automount_config_s *)lower;
 | 
			
		||||
  DEBUGASSERT(config && config->state);
 | 
			
		||||
 | 
			
		||||
  state = config->state;
 | 
			
		||||
 | 
			
		||||
  /* Save the fake enable setting */
 | 
			
		||||
 | 
			
		||||
  flags = enter_critical_section();
 | 
			
		||||
  state->enable = enable;
 | 
			
		||||
 | 
			
		||||
  /* Did an interrupt occur while interrupts were disabled? */
 | 
			
		||||
 | 
			
		||||
  if (enable && state->pending)
 | 
			
		||||
    {
 | 
			
		||||
      /* Yes.. perform the fake interrupt if the interrutp is attached */
 | 
			
		||||
 | 
			
		||||
      if (state->handler)
 | 
			
		||||
        {
 | 
			
		||||
          (void)state->handler(&config->lower, state->arg, true);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
      state->pending = false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  leave_critical_section(flags);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: sam_inserted
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   Check if a card is inserted into the slot.
 | 
			
		||||
 *
 | 
			
		||||
 * Input Parameters:
 | 
			
		||||
 *   lower - An instance of the auto-mounter lower half state structure
 | 
			
		||||
 *
 | 
			
		||||
 *  Returned Value:
 | 
			
		||||
 *    True if the card is inserted; False otherwise
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
static bool sam_inserted(FAR const struct automount_lower_s *lower)
 | 
			
		||||
{
 | 
			
		||||
  FAR const struct sam_automount_config_s *config;
 | 
			
		||||
 | 
			
		||||
  config = (FAR struct sam_automount_config_s *)lower;
 | 
			
		||||
  DEBUGASSERT(config && config->state);
 | 
			
		||||
  finfo("inserted:%d\n", config->state->inserted);
 | 
			
		||||
  return config->state->inserted;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Public Functions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name:  sam_automount_initialize
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   Configure auto-mounters for each enable and so configured HSMCI
 | 
			
		||||
 *
 | 
			
		||||
 * Input Parameters:
 | 
			
		||||
 *   None
 | 
			
		||||
 *
 | 
			
		||||
 *  Returned Value:
 | 
			
		||||
 *    None
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
void sam_automount_initialize(void)
 | 
			
		||||
{
 | 
			
		||||
  FAR void *handle;
 | 
			
		||||
 | 
			
		||||
  finfo("Initializing automounter(s)\n");
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_METRO_M4_USB_AUTOMOUNT
 | 
			
		||||
  /* Initialize the USB auto-mounter */
 | 
			
		||||
 | 
			
		||||
  handle = automount_initialize(&g_port0config.lower);
 | 
			
		||||
  if (!handle)
 | 
			
		||||
    {
 | 
			
		||||
      ferr("ERROR: Failed to initialize auto-mounter for USB\n");
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name:  sam_automount_event
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   It has already scheduled the MMC/SD block driver operations.
 | 
			
		||||
 *   Now we need to schedule the auto-mount event which will occur with
 | 
			
		||||
 *   a substantial delay to make sure that everything has settle down.
 | 
			
		||||
 *
 | 
			
		||||
 * Input Parameters:
 | 
			
		||||
 *   inserted - True if the card is inserted in the slot.  False otherwise.
 | 
			
		||||
 *
 | 
			
		||||
 *  Returned Value:
 | 
			
		||||
 *    None
 | 
			
		||||
 *
 | 
			
		||||
 *  Assumptions:
 | 
			
		||||
 *    Interrupts are disabled.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
void sam_automount_event(bool inserted)
 | 
			
		||||
{
 | 
			
		||||
  FAR const struct sam_automount_config_s *config;
 | 
			
		||||
  FAR struct sam_automount_state_s *state;
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_METRO_M4_USB_AUTOMOUNT
 | 
			
		||||
  config = &g_port0config;
 | 
			
		||||
  state  = &g_port0state;
 | 
			
		||||
  state->inserted = inserted;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
  finfo("event:%d\n", inserted);
 | 
			
		||||
 | 
			
		||||
  /* Is the auto-mounter interrupt attached? */
 | 
			
		||||
 | 
			
		||||
  if (state->handler)
 | 
			
		||||
    {
 | 
			
		||||
      /* Yes.. Have we been asked to hold off interrupts? */
 | 
			
		||||
 | 
			
		||||
      if (!state->enable)
 | 
			
		||||
        {
 | 
			
		||||
          /* Yes.. just remember that there is a pending interrupt.
 | 
			
		||||
           * We will deliver the interrupt when interrupts are
 | 
			
		||||
           * "re-enabled."
 | 
			
		||||
           */
 | 
			
		||||
 | 
			
		||||
          state->pending = true;
 | 
			
		||||
        }
 | 
			
		||||
      else
 | 
			
		||||
        {
 | 
			
		||||
          /* No.. forward the event to the handler */
 | 
			
		||||
 | 
			
		||||
          (void)state->handler(&config->lower, state->arg, state->inserted);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif /* CONFIG_FS_AUTOMOUNTER */
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,79 @@
 | 
			
		|||
/****************************************************************************
 | 
			
		||||
 * boards/arm/samd5e5/metro-m4/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 <nuttx/config.h>
 | 
			
		||||
 | 
			
		||||
#include <debug.h>
 | 
			
		||||
 | 
			
		||||
#include <nuttx/board.h>
 | 
			
		||||
 | 
			
		||||
#include "metro-m4.h"
 | 
			
		||||
 | 
			
		||||
#include <arch/board/board.h>
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Public Functions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: sam_board_initialize
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   All SAMD5/E5 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_board_initialize(void)
 | 
			
		||||
{
 | 
			
		||||
#ifdef CONFIG_ARCH_LEDS
 | 
			
		||||
  /* Configure on-board LEDs if LED support has been selected. */
 | 
			
		||||
 | 
			
		||||
  board_autoled_initialize();
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: board_late_initialize
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   If CONFIG_BOARD_LATE_INITIALIZE is selected, then an additional
 | 
			
		||||
 *   initialization call will be performed in the boot-up sequence to a
 | 
			
		||||
 *   function called board_late_initialize(). board_late_initialize() will be
 | 
			
		||||
 *   called immediately after up_initialize() is called and just before the
 | 
			
		||||
 *   initial application is started.  This additional initialization phase
 | 
			
		||||
 *   may be used, for example, to initialize board-specific device drivers.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_BOARD_LATE_INITIALIZE
 | 
			
		||||
void board_late_initialize(void)
 | 
			
		||||
{
 | 
			
		||||
  /* Perform board-specific initialization */
 | 
			
		||||
 | 
			
		||||
  sam_bringup();
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,75 @@
 | 
			
		|||
/****************************************************************************
 | 
			
		||||
 * boards/arm/samd5e5/metro-m4/src/sam_bq27426.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 <nuttx/config.h>
 | 
			
		||||
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
#include <stdbool.h>
 | 
			
		||||
#include <debug.h>
 | 
			
		||||
#include <errno.h>
 | 
			
		||||
 | 
			
		||||
#include <nuttx/i2c/i2c_master.h>
 | 
			
		||||
#include <nuttx/power/battery_gauge.h>
 | 
			
		||||
 | 
			
		||||
#include <nuttx/power/bq27426.h>
 | 
			
		||||
#include <nuttx/power/battery_ioctl.h>
 | 
			
		||||
 | 
			
		||||
#include "arm_arch.h"
 | 
			
		||||
#include "chip.h"
 | 
			
		||||
#include "hardware/sam_i2c_master.h"
 | 
			
		||||
#include "metro-m4.h"
 | 
			
		||||
 | 
			
		||||
#include <arch/board/board.h>
 | 
			
		||||
#include "sam_config.h"
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Public Data
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_BQ27426
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Public Functions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: sam_bq24298_initialize
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   Called to configure bq24298
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
int sam_bq27426_initialize(FAR const char *devname)
 | 
			
		||||
{
 | 
			
		||||
    FAR struct battery_gauge_dev_s *bq27426_m4;
 | 
			
		||||
 | 
			
		||||
    bq27426_m4 = (FAR struct battery_gauge_dev_s *)bq27426_initialize(
 | 
			
		||||
                                                   g_i2c5_dev,
 | 
			
		||||
                                                   BQ27426_I2C_ADDRESS,
 | 
			
		||||
                                                   100000);
 | 
			
		||||
  return battery_gauge_register(devname, bq27426_m4);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif /* CONFIG_BQ27426 */
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,174 @@
 | 
			
		|||
/****************************************************************************
 | 
			
		||||
 * boards/arm/samd5e5/metro-m4/src/sam_bringup.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 <nuttx/config.h>
 | 
			
		||||
 | 
			
		||||
#include <stdbool.h>
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <debug.h>
 | 
			
		||||
#include <errno.h>
 | 
			
		||||
 | 
			
		||||
#include "metro-m4.h"
 | 
			
		||||
 | 
			
		||||
#if defined(CONFIG_SAMD5E5_WDT) && defined(CONFIG_WATCHDOG)
 | 
			
		||||
  #include "sam_wdt.h"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#include <nuttx/fs/fs.h>
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_SAMD5E5_SERCOM5_ISI2C
 | 
			
		||||
  #include <nuttx/i2c/i2c_master.h>
 | 
			
		||||
  #include "hardware/sam_i2c_master.h"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_USBHOST
 | 
			
		||||
#  include "sam_usbhost.h"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_USBMONITOR
 | 
			
		||||
#  include <nuttx/usb/usbmonitor.h>
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_BQ27426
 | 
			
		||||
  #include <nuttx/power/battery_gauge.h>
 | 
			
		||||
  #include <nuttx/power/battery_ioctl.h>
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Pre-processor Definitions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#define PROCFS_MOUNTPOINT "/proc"
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Public Functions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: sam_bringup
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   Perform architecture-specific initialization
 | 
			
		||||
 *
 | 
			
		||||
 *   CONFIG_BOARD_LATE_INITIALIZE=y :
 | 
			
		||||
 *     Called from board_late_initialize().
 | 
			
		||||
 *
 | 
			
		||||
 *   CONFIG_BOARD_LATE_INITIALIZE=n && CONFIG_LIB_BOARDCTL=y :
 | 
			
		||||
 *     Called from the NSH library
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
int sam_bringup(void)
 | 
			
		||||
{
 | 
			
		||||
  int ret = OK;
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_FS_PROCFS
 | 
			
		||||
  /* Mount the procfs file system */
 | 
			
		||||
 | 
			
		||||
  ret = nx_mount(NULL, PROCFS_MOUNTPOINT, "procfs", 0, NULL);
 | 
			
		||||
  if (ret < 0)
 | 
			
		||||
    {
 | 
			
		||||
      syslog(LOG_ERR, "ERROR: Failed to mount procfs at %s: %d\n",
 | 
			
		||||
             PROCFS_MOUNTPOINT, ret);
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined(CONFIG_SAMD5E5_WDT) && defined(CONFIG_WATCHDOG)
 | 
			
		||||
  (void)sam_wdt_initialize(CONFIG_WATCHDOG_DEVPATH);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_SAMD5E5_SERCOM5_ISI2C
 | 
			
		||||
  /* Initialize I2C bus */
 | 
			
		||||
 | 
			
		||||
  ret = metro_m4_i2cdev_initialize();
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_USBHOST
 | 
			
		||||
  /* Initialize USB host operation. samd_usbhost_initialize() starts a
 | 
			
		||||
   * thread will monitor for USB connection and disconnection events.
 | 
			
		||||
   */
 | 
			
		||||
 | 
			
		||||
  ret = samd_usbhost_initialize();
 | 
			
		||||
  if (ret != OK)
 | 
			
		||||
    {
 | 
			
		||||
      syslog(LOG_ERR, "samd_usbhost_initialize failed %d\n", ret);
 | 
			
		||||
      return ret;
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_USBMONITOR
 | 
			
		||||
  /* Start the USB Monitor */
 | 
			
		||||
 | 
			
		||||
  ret = usbmonitor_start();
 | 
			
		||||
  if (ret != OK)
 | 
			
		||||
    {
 | 
			
		||||
      syslog(LOG_ERR, "usbmonitor_start failed %d\n", ret);
 | 
			
		||||
      return ret;
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_FS_SMARTFS
 | 
			
		||||
  /* Initialize Smart File System (SMARTFS) */
 | 
			
		||||
 | 
			
		||||
  ret = sam_smartfs_initialize();
 | 
			
		||||
  if (ret < 0)
 | 
			
		||||
    {
 | 
			
		||||
      syslog(LOG_ERR, "ERROR: Failed to mount smartfs  %d\n", ret);
 | 
			
		||||
      return ret;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  /* Mount the file system at /mnt/nvm */
 | 
			
		||||
 | 
			
		||||
  ret = nx_mount("/dev/smart0", "/mnt/nvm", "smartfs", 0, NULL);
 | 
			
		||||
  if (ret < 0)
 | 
			
		||||
    {
 | 
			
		||||
      syslog(LOG_ERR, "ERROR: Failed to mount the SmartFS volume: %d\n",
 | 
			
		||||
             ret);
 | 
			
		||||
      return ret;
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_FS_AUTOMOUNTER
 | 
			
		||||
  /* Initialize the auto-mounter */
 | 
			
		||||
 | 
			
		||||
  sam_automount_initialize();
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_BQ27426
 | 
			
		||||
  /* Configure and initialize the BQ2426 distance sensor */
 | 
			
		||||
 | 
			
		||||
  ret = sam_bq27426_initialize("/dev/batt1");
 | 
			
		||||
  if (ret < 0)
 | 
			
		||||
    {
 | 
			
		||||
      syslog(LOG_ERR, "ERROR: sam_bq27426_initialize() failed: %d\n", ret);
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_DEV_GPIO
 | 
			
		||||
  ret = sam_gpio_initialize();
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
  UNUSED(ret);
 | 
			
		||||
  return OK;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,348 @@
 | 
			
		|||
/****************************************************************************
 | 
			
		||||
 * boards/arm/samd5e5/metro-m4/src/sam_composite.c
 | 
			
		||||
 *
 | 
			
		||||
 *   Copyright 2020 Falker Automacao Agricola LTDA.
 | 
			
		||||
 *   Author: Leomar Mateus Radke <leomar@falker.com.br>
 | 
			
		||||
 *   Author: Ricardo Wartchow <wartchow@gmail.com>
 | 
			
		||||
 *
 | 
			
		||||
 * 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 <sys/types.h>
 | 
			
		||||
#include <assert.h>
 | 
			
		||||
#include <debug.h>
 | 
			
		||||
 | 
			
		||||
#include <nuttx/usb/usbdev.h>
 | 
			
		||||
#include <nuttx/usb/usbdev_trace.h>
 | 
			
		||||
#include <nuttx/usb/cdcacm.h>
 | 
			
		||||
#include <nuttx/usb/usbmsc.h>
 | 
			
		||||
#include <nuttx/usb/composite.h>
 | 
			
		||||
 | 
			
		||||
#include "metro-m4.h"
 | 
			
		||||
 | 
			
		||||
#if defined(CONFIG_BOARDCTL_USBDEVCTRL) && defined(CONFIG_USBDEV_COMPOSITE)
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Private Data
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_USBMSC_COMPOSITE
 | 
			
		||||
static FAR void *g_mschandle;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Private Functions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: board_mscclassobject
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   If the mass storage class driver is part of composite device, then
 | 
			
		||||
 *   its instantiation and configuration is a multi-step, board-specific,
 | 
			
		||||
 *   process (See comments for usbmsc_configure below).  In this case,
 | 
			
		||||
 *   board-specific logic must provide board_mscclassobject().
 | 
			
		||||
 *
 | 
			
		||||
 *   board_mscclassobject() is called from the composite driver.  It must
 | 
			
		||||
 *   encapsulate the instantiation and configuration of the mass storage
 | 
			
		||||
 *   class and the return the mass storage device's class driver instance
 | 
			
		||||
 *   to the composite driver.
 | 
			
		||||
 *
 | 
			
		||||
 * Input Parameters:
 | 
			
		||||
 *   classdev - The location to return the mass storage class' device
 | 
			
		||||
 *     instance.
 | 
			
		||||
 *
 | 
			
		||||
 * Returned Value:
 | 
			
		||||
 *   0 on success; a negated errno on failure
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_USBMSC_COMPOSITE
 | 
			
		||||
static int board_mscclassobject(int minor,
 | 
			
		||||
                                FAR struct usbdev_devinfo_s *devinfo,
 | 
			
		||||
                                FAR struct usbdevclass_driver_s **classdev)
 | 
			
		||||
{
 | 
			
		||||
  int ret;
 | 
			
		||||
 | 
			
		||||
  DEBUGASSERT(g_mschandle == NULL);
 | 
			
		||||
 | 
			
		||||
  /* Configure the mass storage device */
 | 
			
		||||
 | 
			
		||||
  uinfo("Configuring with NLUNS=1\n");
 | 
			
		||||
  ret = usbmsc_configure(1, &g_mschandle);
 | 
			
		||||
  if (ret < 0)
 | 
			
		||||
    {
 | 
			
		||||
      uerr("ERROR: usbmsc_configure failed: %d\n", -ret);
 | 
			
		||||
      return ret;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  uinfo("MSC handle=%p\n", g_mschandle);
 | 
			
		||||
 | 
			
		||||
  /* Bind the LUN(s) */
 | 
			
		||||
 | 
			
		||||
  uinfo("Bind LUN=0 to /dev/mmcsd0\n");
 | 
			
		||||
  ret = usbmsc_bindlun(g_mschandle, "/dev/mmcsd0", 0, 0, 0, false);
 | 
			
		||||
  if (ret < 0)
 | 
			
		||||
    {
 | 
			
		||||
      uerr("ERROR: usbmsc_bindlun failed for LUN 1 at /dev/mmcsd0: %d\n",
 | 
			
		||||
           ret);
 | 
			
		||||
      usbmsc_uninitialize(g_mschandle);
 | 
			
		||||
      g_mschandle = NULL;
 | 
			
		||||
      return ret;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  /* Get the mass storage device's class object */
 | 
			
		||||
 | 
			
		||||
  ret = usbmsc_classobject(g_mschandle, devinfo, classdev);
 | 
			
		||||
  if (ret < 0)
 | 
			
		||||
    {
 | 
			
		||||
      uerr("ERROR: usbmsc_classobject failed: %d\n", -ret);
 | 
			
		||||
      usbmsc_uninitialize(g_mschandle);
 | 
			
		||||
      g_mschandle = NULL;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  return ret;
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: board_mscuninitialize
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   Un-initialize the USB storage class driver. This is just an application
 | 
			
		||||
 *   specific wrapper aboutn usbmsc_unitialize() that is called form the
 | 
			
		||||
 *   composite device logic.
 | 
			
		||||
 *
 | 
			
		||||
 * Input Parameters:
 | 
			
		||||
 *   classdev - The class driver instrance previously give to the composite
 | 
			
		||||
 *     driver by board_mscclassobject().
 | 
			
		||||
 *
 | 
			
		||||
 * Returned Value:
 | 
			
		||||
 *   None
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_USBMSC_COMPOSITE
 | 
			
		||||
static void board_mscuninitialize(FAR struct usbdevclass_driver_s *classdev)
 | 
			
		||||
{
 | 
			
		||||
  DEBUGASSERT(g_mschandle != NULL);
 | 
			
		||||
  usbmsc_uninitialize(g_mschandle);
 | 
			
		||||
  g_mschandle = NULL;
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Public Functions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: board_composite_initialize
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   Perform architecture specific initialization of a composite USB device.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
int board_composite_initialize(int port)
 | 
			
		||||
{
 | 
			
		||||
  return OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name:  board_composite_connect
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   Connect the USB composite device on the specified USB device port using
 | 
			
		||||
 *   the specified configuration.  The interpretation of the configid is
 | 
			
		||||
 *   board specific.
 | 
			
		||||
 *
 | 
			
		||||
 * Input Parameters:
 | 
			
		||||
 *   port     - The USB device port.
 | 
			
		||||
 *   configid - The USB composite configuration
 | 
			
		||||
 *
 | 
			
		||||
 * Returned Value:
 | 
			
		||||
 *   A non-NULL handle value is returned on success.  NULL is returned on
 | 
			
		||||
 *   any failure.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
FAR void *board_composite_connect(int port, int configid)
 | 
			
		||||
{
 | 
			
		||||
  /* Here we are composing the configuration of the usb composite device.
 | 
			
		||||
   *
 | 
			
		||||
   * The standard is to use one CDC/ACM and one USB mass storage device.
 | 
			
		||||
   */
 | 
			
		||||
 | 
			
		||||
  if (configid == 0)
 | 
			
		||||
    {
 | 
			
		||||
#ifdef CONFIG_USBMSC_COMPOSITE
 | 
			
		||||
      struct composite_devdesc_s dev[2];
 | 
			
		||||
      int ifnobase = 0;
 | 
			
		||||
      int strbase  = COMPOSITE_NSTRIDS;
 | 
			
		||||
 | 
			
		||||
      /* Configure the CDC/ACM device */
 | 
			
		||||
 | 
			
		||||
      /* Ask the cdcacm driver to fill in the constants we didn't
 | 
			
		||||
       * know here.
 | 
			
		||||
       */
 | 
			
		||||
 | 
			
		||||
      cdcacm_get_composite_devdesc(&dev[0]);
 | 
			
		||||
 | 
			
		||||
      /* Overwrite and correct some values... */
 | 
			
		||||
 | 
			
		||||
      /* The callback functions for the CDC/ACM class */
 | 
			
		||||
 | 
			
		||||
      dev[0].classobject  = cdcacm_classobject;
 | 
			
		||||
      dev[0].uninitialize = cdcacm_uninitialize;
 | 
			
		||||
 | 
			
		||||
      /* Interfaces */
 | 
			
		||||
 | 
			
		||||
      dev[0].devinfo.ifnobase = ifnobase;             /* Offset to Interface-IDs */
 | 
			
		||||
      dev[0].minor = 0;                               /* The minor interface number */
 | 
			
		||||
 | 
			
		||||
      /* Strings */
 | 
			
		||||
 | 
			
		||||
      dev[0].devinfo.strbase = strbase;               /* Offset to String Numbers */
 | 
			
		||||
 | 
			
		||||
      /* Endpoints */
 | 
			
		||||
 | 
			
		||||
      dev[0].devinfo.epno[CDCACM_EP_INTIN_IDX]   = 3;
 | 
			
		||||
      dev[0].devinfo.epno[CDCACM_EP_BULKIN_IDX]  = 4;
 | 
			
		||||
      dev[0].devinfo.epno[CDCACM_EP_BULKOUT_IDX] = 5;
 | 
			
		||||
 | 
			
		||||
      /* Count up the base numbers */
 | 
			
		||||
 | 
			
		||||
      ifnobase += dev[0].devinfo.ninterfaces;
 | 
			
		||||
      strbase  += dev[0].devinfo.nstrings;
 | 
			
		||||
 | 
			
		||||
      /* Configure the mass storage device device */
 | 
			
		||||
 | 
			
		||||
      /* Ask the usbmsc driver to fill in the constants we didn't
 | 
			
		||||
       * know here.
 | 
			
		||||
       */
 | 
			
		||||
 | 
			
		||||
      usbmsc_get_composite_devdesc(&dev[1]);
 | 
			
		||||
 | 
			
		||||
      /* Overwrite and correct some values... */
 | 
			
		||||
 | 
			
		||||
      /* The callback functions for the USBMSC class */
 | 
			
		||||
 | 
			
		||||
      dev[1].classobject  = board_mscclassobject;
 | 
			
		||||
      dev[1].uninitialize = board_mscuninitialize;
 | 
			
		||||
 | 
			
		||||
      /* Interfaces */
 | 
			
		||||
 | 
			
		||||
      dev[1].devinfo.ifnobase = ifnobase;               /* Offset to Interface-IDs */
 | 
			
		||||
      dev[1].minor = 0;                                 /* The minor interface number */
 | 
			
		||||
 | 
			
		||||
      /* Strings */
 | 
			
		||||
 | 
			
		||||
      dev[1].devinfo.strbase = strbase;                 /* Offset to String Numbers */
 | 
			
		||||
 | 
			
		||||
      /* Endpoints */
 | 
			
		||||
 | 
			
		||||
      dev[1].devinfo.epno[USBMSC_EP_BULKIN_IDX]  = 1;
 | 
			
		||||
      dev[1].devinfo.epno[USBMSC_EP_BULKOUT_IDX] = 2;
 | 
			
		||||
 | 
			
		||||
      /* Count up the base numbers */
 | 
			
		||||
 | 
			
		||||
      ifnobase += dev[1].devinfo.ninterfaces;
 | 
			
		||||
      strbase  += dev[1].devinfo.nstrings;
 | 
			
		||||
 | 
			
		||||
      return composite_initialize(2, dev);
 | 
			
		||||
#else
 | 
			
		||||
      return NULL;
 | 
			
		||||
#endif
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  /* Configuration with three CDC/ACMs
 | 
			
		||||
   *
 | 
			
		||||
   * This configuration can be used e.g. on a samv71-xult. The samv71 has
 | 
			
		||||
   * 10 Endpoints (EPs). The EPs 0 up to 7 are DMA aware. The EPs 8 and 9
 | 
			
		||||
   * are not.
 | 
			
		||||
   *
 | 
			
		||||
   * In a composite device we need the EP0 as an control Endpoint.  Each
 | 
			
		||||
   * CDC/ACM needs one Interrupt driven and two bulk Endpoints.  This is
 | 
			
		||||
   * why we configure the EPs 7, 8 and 9 to be the IRQ-EPs and the
 | 
			
		||||
   * EP-Pairs 1/2, 3/4, 5/6 to be the bulk EPs for each device.
 | 
			
		||||
   *
 | 
			
		||||
   * This means, that
 | 
			
		||||
   *
 | 
			
		||||
   *   - the Composite device uses EP0 as the control-Endpoint,
 | 
			
		||||
   *   - the CDC/ACM 0 uses EP7, EP1 and EP2,
 | 
			
		||||
   *   - the CDC/ACM 1 uses EP8, EP3 and EP4,
 | 
			
		||||
   *   - the CDC/ACM 2 uses EP9, EP5 and EP6
 | 
			
		||||
   *
 | 
			
		||||
   * as its EP-Configuration.
 | 
			
		||||
   */
 | 
			
		||||
 | 
			
		||||
  else if (configid == 1)
 | 
			
		||||
    {
 | 
			
		||||
      struct composite_devdesc_s dev[3];
 | 
			
		||||
      int strbase = COMPOSITE_NSTRIDS;
 | 
			
		||||
      int ifnobase = 0;
 | 
			
		||||
      int ia;
 | 
			
		||||
 | 
			
		||||
      for (ia = 0; ia < 3; ia++)
 | 
			
		||||
        {
 | 
			
		||||
          /* Ask the cdcacm driver to fill in the
 | 
			
		||||
           * constants we didn't know here
 | 
			
		||||
           */
 | 
			
		||||
 | 
			
		||||
          cdcacm_get_composite_devdesc(&dev[ia]);
 | 
			
		||||
 | 
			
		||||
          /* Overwrite and correct some values... */
 | 
			
		||||
 | 
			
		||||
          /* The callback functions for the CDC/ACM class */
 | 
			
		||||
 | 
			
		||||
          dev[ia].classobject = cdcacm_classobject;
 | 
			
		||||
          dev[ia].uninitialize = cdcacm_uninitialize;
 | 
			
		||||
 | 
			
		||||
          dev[ia].minor = ia;                         /* The minor interface number */
 | 
			
		||||
 | 
			
		||||
          /* Interfaces */
 | 
			
		||||
 | 
			
		||||
          dev[ia].devinfo.ifnobase = ifnobase;        /* Offset to Interface-IDs */
 | 
			
		||||
 | 
			
		||||
          /* Strings */
 | 
			
		||||
 | 
			
		||||
          dev[ia].devinfo.strbase = strbase;          /* Offset to String Numbers */
 | 
			
		||||
 | 
			
		||||
          /* Endpoints */
 | 
			
		||||
 | 
			
		||||
          dev[ia].devinfo.epno[CDCACM_EP_INTIN_IDX]   = 7 + ia;
 | 
			
		||||
          dev[ia].devinfo.epno[CDCACM_EP_BULKIN_IDX]  = 1 + ia * 2;
 | 
			
		||||
          dev[ia].devinfo.epno[CDCACM_EP_BULKOUT_IDX] = 2 + ia * 2;
 | 
			
		||||
 | 
			
		||||
          ifnobase += dev[ia].devinfo.ninterfaces;
 | 
			
		||||
          strbase  += dev[ia].devinfo.nstrings;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
      return composite_initialize(3, dev);
 | 
			
		||||
    }
 | 
			
		||||
  else
 | 
			
		||||
    {
 | 
			
		||||
      return NULL;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif /* CONFIG_BOARDCTL_USBDEVCTRL && CONFIG_USBDEV_COMPOSITE */
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,341 @@
 | 
			
		|||
/****************************************************************************
 | 
			
		||||
 * boards/arm/samd5e5/metro-m4/src/sam_gpio.c
 | 
			
		||||
 *
 | 
			
		||||
 *   Copyright 2020 Falker Automacao Agricola LTDA.
 | 
			
		||||
 *   Author: Leomar Mateus Radke <leomar@falker.com.br>
 | 
			
		||||
 *   Author: Ricardo Wartchow <wartchow@gmail.com>
 | 
			
		||||
 *
 | 
			
		||||
 * 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 <stdbool.h>
 | 
			
		||||
#include <assert.h>
 | 
			
		||||
#include <debug.h>
 | 
			
		||||
 | 
			
		||||
#include <nuttx/clock.h>
 | 
			
		||||
#include <nuttx/wdog.h>
 | 
			
		||||
#include <nuttx/ioexpander/gpio.h>
 | 
			
		||||
 | 
			
		||||
#include <nuttx/irq.h>
 | 
			
		||||
 | 
			
		||||
#include "irq/irq.h"
 | 
			
		||||
#include "chip.h"
 | 
			
		||||
#include <arch/board/board.h>
 | 
			
		||||
 | 
			
		||||
#include "sam_config.h"
 | 
			
		||||
#include "metro-m4.h"
 | 
			
		||||
#include "sam_port.h"
 | 
			
		||||
#include "sam_eic.h"
 | 
			
		||||
 | 
			
		||||
#if defined(CONFIG_DEV_GPIO) && !defined(CONFIG_GPIO_LOWER_HALF)
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Private Types
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
struct samgpio_dev_s
 | 
			
		||||
{
 | 
			
		||||
  struct gpio_dev_s gpio;
 | 
			
		||||
  uint8_t id;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct samgpint_dev_s
 | 
			
		||||
{
 | 
			
		||||
  struct samgpio_dev_s samgpio;
 | 
			
		||||
  pin_interrupt_t callback;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
irqstate_t flags;
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Private Function Prototypes
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#if BOARD_NGPIOIN > 0
 | 
			
		||||
static int gpin_read(FAR struct gpio_dev_s *dev, FAR bool *value);
 | 
			
		||||
#endif
 | 
			
		||||
static int gpout_read(FAR struct gpio_dev_s *dev, FAR bool *value);
 | 
			
		||||
static int gpout_write(FAR struct gpio_dev_s *dev, bool value);
 | 
			
		||||
 | 
			
		||||
static int gpint_read(FAR struct gpio_dev_s *dev, FAR bool *value);
 | 
			
		||||
static int gpint_attach(FAR struct gpio_dev_s *dev,
 | 
			
		||||
                        pin_interrupt_t callback);
 | 
			
		||||
static int gpint_enable(FAR struct gpio_dev_s *dev, bool enable);
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Private Data
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#if BOARD_NGPIOIN > 0
 | 
			
		||||
 | 
			
		||||
static const struct gpio_operations_s gpin_ops =
 | 
			
		||||
{
 | 
			
		||||
  .go_read   = gpin_read,
 | 
			
		||||
  .go_write  = NULL,
 | 
			
		||||
  .go_attach = NULL,
 | 
			
		||||
  .go_enable = NULL,
 | 
			
		||||
};
 | 
			
		||||
#endif
 | 
			
		||||
static const struct gpio_operations_s gpout_ops =
 | 
			
		||||
{
 | 
			
		||||
  .go_read   = gpout_read,
 | 
			
		||||
  .go_write  = gpout_write,
 | 
			
		||||
  .go_attach = NULL,
 | 
			
		||||
  .go_enable = NULL,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static const struct gpio_operations_s gpint_ops =
 | 
			
		||||
{
 | 
			
		||||
  .go_read   = gpint_read,
 | 
			
		||||
  .go_write  = NULL,
 | 
			
		||||
  .go_attach = gpint_attach,
 | 
			
		||||
  .go_enable = gpint_enable,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static const int g_extint[1] = /* SAM_IRQ_EXTINT0 offset! */
 | 
			
		||||
{
 | 
			
		||||
  4, /* PORT_D9 - PA20 - EXTINT 4 */
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#if BOARD_NGPIOIN > 0
 | 
			
		||||
/* This array maps the GPIO pins used as INPUT */
 | 
			
		||||
 | 
			
		||||
static const uint32_t g_gpioinputs[BOARD_NGPIOIN] =
 | 
			
		||||
{
 | 
			
		||||
  PORT_D10,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static struct samgpio_dev_s g_gpin[BOARD_NGPIOIN];
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if BOARD_NGPIOOUT
 | 
			
		||||
/* This array maps the GPIO pins used as OUTPUT */
 | 
			
		||||
 | 
			
		||||
static const uint32_t g_gpiooutputs[BOARD_NGPIOOUT] =
 | 
			
		||||
{
 | 
			
		||||
  PORT_D8,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static struct samgpio_dev_s g_gpout[BOARD_NGPIOOUT];
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if BOARD_NGPIOINT > 0
 | 
			
		||||
/* This array maps the GPIO pins used as INTERRUPT INPUTS */
 | 
			
		||||
 | 
			
		||||
static const uint32_t g_gpiointinputs[BOARD_NGPIOINT] =
 | 
			
		||||
{
 | 
			
		||||
  PORT_D9
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static struct samgpint_dev_s g_gpint[BOARD_NGPIOINT];
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Private Functions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
static int samgpio_interrupt(int irq, void *context, void *arg)
 | 
			
		||||
{
 | 
			
		||||
  FAR struct samgpint_dev_s *samgpint = (FAR struct samgpint_dev_s *)arg;
 | 
			
		||||
 | 
			
		||||
  DEBUGASSERT(samgpint != NULL && samgpint->callback != NULL);
 | 
			
		||||
  gpioinfo("Interrupt! callback=%p\n", samgpint->callback);
 | 
			
		||||
 | 
			
		||||
  samgpint->callback(&samgpint->samgpio.gpio, samgpint->samgpio.id);
 | 
			
		||||
  return OK;
 | 
			
		||||
}
 | 
			
		||||
#if BOARD_NGPIOIN > 0
 | 
			
		||||
 | 
			
		||||
static int gpin_read(FAR struct gpio_dev_s *dev, FAR bool *value)
 | 
			
		||||
{
 | 
			
		||||
  FAR struct samgpio_dev_s *samgpio = (FAR struct samgpio_dev_s *)dev;
 | 
			
		||||
 | 
			
		||||
  DEBUGASSERT(samgpio != NULL && value != NULL);
 | 
			
		||||
  DEBUGASSERT(samgpio->id < BOARD_NGPIOIN);
 | 
			
		||||
  gpioinfo("Reading...\n");
 | 
			
		||||
 | 
			
		||||
  *value = sam_portread(g_gpioinputs[samgpio->id]);
 | 
			
		||||
  return OK;
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
static int gpout_read(FAR struct gpio_dev_s *dev, FAR bool *value)
 | 
			
		||||
{
 | 
			
		||||
  FAR struct samgpio_dev_s *samgpio = (FAR struct samgpio_dev_s *)dev;
 | 
			
		||||
 | 
			
		||||
  DEBUGASSERT(samgpio != NULL && value != NULL);
 | 
			
		||||
  DEBUGASSERT(samgpio->id < BOARD_NGPIOOUT);
 | 
			
		||||
  gpioinfo("Reading...\n");
 | 
			
		||||
 | 
			
		||||
  *value = sam_portread(g_gpiooutputs[samgpio->id]);
 | 
			
		||||
  return OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int gpout_write(FAR struct gpio_dev_s *dev, bool value)
 | 
			
		||||
{
 | 
			
		||||
  FAR struct samgpio_dev_s *samgpio = (FAR struct samgpio_dev_s *)dev;
 | 
			
		||||
 | 
			
		||||
  DEBUGASSERT(samgpio != NULL);
 | 
			
		||||
  DEBUGASSERT(samgpio->id < BOARD_NGPIOOUT);
 | 
			
		||||
  gpioinfo("Writing %d\n", (int)value);
 | 
			
		||||
 | 
			
		||||
  sam_portwrite(g_gpiooutputs[samgpio->id], value);
 | 
			
		||||
  return OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int gpint_read(FAR struct gpio_dev_s *dev, FAR bool *value)
 | 
			
		||||
{
 | 
			
		||||
  FAR struct samgpint_dev_s *samgpint = (FAR struct samgpint_dev_s *)dev;
 | 
			
		||||
 | 
			
		||||
  DEBUGASSERT(samgpint != NULL && value != NULL);
 | 
			
		||||
  DEBUGASSERT(samgpint->samgpio.id < BOARD_NGPIOINT);
 | 
			
		||||
  gpioinfo("Reading int pin...\n");
 | 
			
		||||
 | 
			
		||||
  *value = sam_portread(g_gpiointinputs[samgpint->samgpio.id]);
 | 
			
		||||
  return OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int gpint_attach(FAR struct gpio_dev_s *dev,
 | 
			
		||||
                        pin_interrupt_t callback)
 | 
			
		||||
{
 | 
			
		||||
  FAR struct samgpint_dev_s *samgpint = (FAR struct samgpint_dev_s *)dev;
 | 
			
		||||
 | 
			
		||||
  gpioinfo("Attaching the callback\n");
 | 
			
		||||
 | 
			
		||||
  flags = enter_critical_section();
 | 
			
		||||
 | 
			
		||||
  /* Make sure the interrupt is disabled */
 | 
			
		||||
 | 
			
		||||
  int ret = irq_attach(SAM_IRQ_EXTINT0 + g_extint[samgpint->samgpio.id],
 | 
			
		||||
                      samgpio_interrupt, &g_gpint[samgpint->samgpio.id]);
 | 
			
		||||
  if (ret == OK)
 | 
			
		||||
    {
 | 
			
		||||
      /* Configure the interrupt edge sensitivity
 | 
			
		||||
       * in CONFIGn register of the EIC
 | 
			
		||||
       */
 | 
			
		||||
 | 
			
		||||
      sam_eic_configure(g_extint[samgpint->samgpio.id],
 | 
			
		||||
                        g_gpiointinputs[samgpint->samgpio.id]);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  leave_critical_section(flags);
 | 
			
		||||
  gpioinfo("Attach %p\n", callback);
 | 
			
		||||
  samgpint->callback = callback;
 | 
			
		||||
  return OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int gpint_enable(FAR struct gpio_dev_s *dev, bool enable)
 | 
			
		||||
{
 | 
			
		||||
  FAR struct samgpint_dev_s *samgpint = (FAR struct samgpint_dev_s *)dev;
 | 
			
		||||
  flags = enter_critical_section();
 | 
			
		||||
  if (enable)
 | 
			
		||||
    {
 | 
			
		||||
      if (samgpint->callback != NULL)
 | 
			
		||||
        {
 | 
			
		||||
          gpioinfo("Enabling the interrupt\n");
 | 
			
		||||
          up_enable_irq(SAM_IRQ_EXTINT0 + g_extint[samgpint->samgpio.id]);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
  else
 | 
			
		||||
    {
 | 
			
		||||
      up_disable_irq(SAM_IRQ_EXTINT0 + g_extint[samgpint->samgpio.id]);
 | 
			
		||||
      gpioinfo("Disable the interrupt\n");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  leave_critical_section(flags);
 | 
			
		||||
  return OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Public Functions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: sam_gpio_initialize
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   Initialize GPIO drivers for use with /apps/examples/gpio
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
int sam_gpio_initialize(void)
 | 
			
		||||
{
 | 
			
		||||
  int i;
 | 
			
		||||
  int pincount = 0;
 | 
			
		||||
 | 
			
		||||
#if BOARD_NGPIOIN > 0
 | 
			
		||||
  for (i = 0; i < BOARD_NGPIOIN; i++)
 | 
			
		||||
    {
 | 
			
		||||
      /* Setup and register the GPIO pin */
 | 
			
		||||
 | 
			
		||||
      g_gpin[i].gpio.gp_pintype = GPIO_INPUT_PIN;
 | 
			
		||||
      g_gpin[i].gpio.gp_ops     = &gpin_ops;
 | 
			
		||||
      g_gpin[i].id              = i;
 | 
			
		||||
      (void)gpio_pin_register(&g_gpin[i].gpio, pincount);
 | 
			
		||||
 | 
			
		||||
      /* Configure the pin that will be used as input */
 | 
			
		||||
 | 
			
		||||
      sam_portconfig(g_gpioinputs[i]);
 | 
			
		||||
 | 
			
		||||
      pincount++;
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if BOARD_NGPIOOUT > 0
 | 
			
		||||
  for (i = 0; i < BOARD_NGPIOOUT; i++)
 | 
			
		||||
    {
 | 
			
		||||
      /* Setup and register the GPIO pin */
 | 
			
		||||
 | 
			
		||||
      g_gpout[i].gpio.gp_pintype = GPIO_OUTPUT_PIN;
 | 
			
		||||
      g_gpout[i].gpio.gp_ops     = &gpout_ops;
 | 
			
		||||
      g_gpout[i].id              = i;
 | 
			
		||||
      (void)gpio_pin_register(&g_gpout[i].gpio, pincount);
 | 
			
		||||
 | 
			
		||||
      /* Configure the pin that will be used as output */
 | 
			
		||||
 | 
			
		||||
      sam_portconfig(g_gpiooutputs[i]);
 | 
			
		||||
      pincount++;
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if BOARD_NGPIOINT > 0
 | 
			
		||||
  for (i = 0; i < BOARD_NGPIOINT; i++)
 | 
			
		||||
    {
 | 
			
		||||
      /* Setup and register the GPIO pin */
 | 
			
		||||
 | 
			
		||||
      g_gpint[i].samgpio.gpio.gp_pintype = GPIO_INTERRUPT_PIN;
 | 
			
		||||
      g_gpint[i].samgpio.gpio.gp_ops     = &gpint_ops;
 | 
			
		||||
      g_gpint[i].samgpio.id              = i;
 | 
			
		||||
      (void)gpio_pin_register(&g_gpint[i].samgpio.gpio, pincount);
 | 
			
		||||
 | 
			
		||||
      /* Configure the pin that will be used as interrupt input */
 | 
			
		||||
 | 
			
		||||
      sam_portconfig(g_gpiointinputs[i]);
 | 
			
		||||
 | 
			
		||||
      pincount++;
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
#endif /* CONFIG_DEV_GPIO && !CONFIG_GPIO_LOWER_HALF */
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,87 @@
 | 
			
		|||
/****************************************************************************
 | 
			
		||||
 * boards/arm/samd5e5/metro-m4/src/sam_i2c.c
 | 
			
		||||
 *
 | 
			
		||||
 *   Copyright 2020 Falker Automacao Agricola LTDA.
 | 
			
		||||
 *   Author: Leomar Mateus Radke <leomar@falker.com.br>
 | 
			
		||||
 *   Author: Ricardo Wartchow <wartchow@gmail.com>
 | 
			
		||||
 *
 | 
			
		||||
 * 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 <stdint.h>
 | 
			
		||||
#include <stdbool.h>
 | 
			
		||||
#include <debug.h>
 | 
			
		||||
#include <errno.h>
 | 
			
		||||
 | 
			
		||||
#include <nuttx/i2c/i2c_master.h>
 | 
			
		||||
 | 
			
		||||
#include "arm_arch.h"
 | 
			
		||||
#include "chip.h"
 | 
			
		||||
#include "metro-m4.h"
 | 
			
		||||
#include "sam_config.h"
 | 
			
		||||
#include "sam_i2c_master.h"
 | 
			
		||||
#include <arch/board/board.h>
 | 
			
		||||
 | 
			
		||||
#if defined(SAMD5E5_HAVE_I2C5_MASTER)
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Public Data
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Public Functions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: metro_m4_i2cdev_initialize
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   Called to configure I2C
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
int metro_m4_i2cdev_initialize(void)
 | 
			
		||||
{
 | 
			
		||||
    int ret = OK;
 | 
			
		||||
 | 
			
		||||
  #ifdef SAMD5E5_HAVE_I2C5_MASTER
 | 
			
		||||
      g_i2c5_dev = sam_i2c_master_initialize(5);
 | 
			
		||||
 | 
			
		||||
      if (!g_i2c5_dev)
 | 
			
		||||
        {
 | 
			
		||||
          syslog(LOG_ERR, "ERROR: metro_m4_i2cdev_initialize() failed: %d\n",
 | 
			
		||||
                ret);
 | 
			
		||||
          ret = -ENODEV;
 | 
			
		||||
        }
 | 
			
		||||
      else
 | 
			
		||||
        {
 | 
			
		||||
          #ifdef CONFIG_I2C_DRIVER
 | 
			
		||||
                ret = i2c_register(g_i2c5_dev, 5);
 | 
			
		||||
          #endif
 | 
			
		||||
        }
 | 
			
		||||
  #endif
 | 
			
		||||
 | 
			
		||||
  return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif /* SAMD5E5_HAVE_I2C5_MASTER */
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,235 @@
 | 
			
		|||
/****************************************************************************
 | 
			
		||||
 * boards/arm/samd5e5/metro-m4/src/sam_smartfs.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 <nuttx/config.h>
 | 
			
		||||
 | 
			
		||||
#include <stdbool.h>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <errno.h>
 | 
			
		||||
#include <debug.h>
 | 
			
		||||
 | 
			
		||||
#include "arm_arch.h"
 | 
			
		||||
#include "chip.h"
 | 
			
		||||
#include <arch/board/board.h>
 | 
			
		||||
 | 
			
		||||
#include "metro-m4.h"
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_MTD
 | 
			
		||||
#  include <nuttx/mtd/mtd.h>
 | 
			
		||||
#  include <nuttx/mtd/configdata.h>
 | 
			
		||||
#  include <nuttx/drivers/drivers.h>
 | 
			
		||||
#  include "sam_progmem.h"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_FS_SMARTFS
 | 
			
		||||
#  include <nuttx/fs/smart.h>
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Pre-processor Definitions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_FS_SMARTFS
 | 
			
		||||
  int ret;
 | 
			
		||||
  FAR struct mtd_dev_s *mtd;
 | 
			
		||||
  FAR struct mtd_geometry_s geo;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined(CONFIG_MTD_PARTITION_NAMES)
 | 
			
		||||
  const char *partname = "mnta";
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Private Functions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Public Functions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_FS_SMARTFS
 | 
			
		||||
int sam_smartfs_initialize(void)
 | 
			
		||||
{
 | 
			
		||||
  /* Initialize the SAMD5E5 FLASH programming memory library */
 | 
			
		||||
 | 
			
		||||
  sam_progmem_initialize();
 | 
			
		||||
 | 
			
		||||
  /* Create an instance of the SAMD5E5 FLASH program memory device driver */
 | 
			
		||||
 | 
			
		||||
  mtd = progmem_initialize();
 | 
			
		||||
  if (!mtd)
 | 
			
		||||
    {
 | 
			
		||||
      syslog(LOG_ERR, "ERROR: progmem_initialize failed\n");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  ret = mtd->ioctl(mtd, MTDIOC_GEOMETRY, (unsigned long)((uintptr_t)&geo));
 | 
			
		||||
  if (ret < 0)
 | 
			
		||||
    {
 | 
			
		||||
      syslog(LOG_ERR, "ERROR: mtd->ioctl failed: %d\n", ret);
 | 
			
		||||
      return ret;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  #ifdef CONFIG_MTD_PARTITION
 | 
			
		||||
    {
 | 
			
		||||
      int partno;
 | 
			
		||||
      int partsize;
 | 
			
		||||
      int partoffset;
 | 
			
		||||
      int partszbytes;
 | 
			
		||||
      int erasesize;
 | 
			
		||||
      const char *partstring = "256";
 | 
			
		||||
      const char *ptr;
 | 
			
		||||
      FAR struct mtd_dev_s *mtd_part;
 | 
			
		||||
      char  partref[4];
 | 
			
		||||
 | 
			
		||||
      /* Now create a partition on the FLASH device */
 | 
			
		||||
 | 
			
		||||
      partno = 0;
 | 
			
		||||
      ptr = partstring;
 | 
			
		||||
      partoffset = 0;
 | 
			
		||||
 | 
			
		||||
          /* Get the Flash erase size */
 | 
			
		||||
 | 
			
		||||
          erasesize = geo.erasesize;
 | 
			
		||||
 | 
			
		||||
          while (*ptr != '\0')
 | 
			
		||||
            {
 | 
			
		||||
              /* Get the partition size */
 | 
			
		||||
 | 
			
		||||
              partsize = atoi(ptr);
 | 
			
		||||
              partszbytes = (partsize << 10); /* partsize is defined in KB */
 | 
			
		||||
              printf("partsize %d partszbytes %d\n", partsize, partszbytes);
 | 
			
		||||
 | 
			
		||||
              /* Check if partition size is bigger then erase block */
 | 
			
		||||
 | 
			
		||||
              if (partszbytes < erasesize)
 | 
			
		||||
                {
 | 
			
		||||
                  syslog(LOG_ERR,
 | 
			
		||||
                    "ERROR: Partition size is lesser than erasesize!\n");
 | 
			
		||||
                  return -1;
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
              /* Check if partition size is multiple of erase block */
 | 
			
		||||
 | 
			
		||||
              if ((partszbytes % erasesize) != 0)
 | 
			
		||||
                {
 | 
			
		||||
                  syslog(LOG_ERR,
 | 
			
		||||
                    "ERROR: Partition size is not multiple of erasesize!\n");
 | 
			
		||||
                  return -1;
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
              mtd_part = mtd_partition(mtd, partoffset,
 | 
			
		||||
                                       partszbytes / erasesize);
 | 
			
		||||
              partoffset += partszbytes / erasesize;
 | 
			
		||||
 | 
			
		||||
              /* Test if this is the config partition */
 | 
			
		||||
 | 
			
		||||
            #if defined  CONFIG_MTD_CONFIG
 | 
			
		||||
              if (partno == 0)
 | 
			
		||||
                {
 | 
			
		||||
                  /* Register the partition as the config device */
 | 
			
		||||
 | 
			
		||||
                  mtdconfig_register(mtd_part);
 | 
			
		||||
                }
 | 
			
		||||
                else
 | 
			
		||||
            #endif
 | 
			
		||||
                {
 | 
			
		||||
                  /* Now initialize a SMART Flash block device
 | 
			
		||||
                   * and bind it to the MTD device.
 | 
			
		||||
                   */
 | 
			
		||||
 | 
			
		||||
            #if defined(CONFIG_MTD_SMART) && defined(CONFIG_FS_SMARTFS)
 | 
			
		||||
                      sprintf(partref, "p%d", partno);
 | 
			
		||||
                      smart_initialize(0, mtd_part, partref);
 | 
			
		||||
            #endif
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                  /* Set the partition name */
 | 
			
		||||
 | 
			
		||||
            #ifdef CONFIG_MTD_PARTITION_NAMES
 | 
			
		||||
                  if (!mtd_part)
 | 
			
		||||
                    {
 | 
			
		||||
                      syslog(LOG_ERR,
 | 
			
		||||
                            "Error: failed to create partition %s\n",
 | 
			
		||||
                            partname);
 | 
			
		||||
                      return -1;
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                  mtd_setpartitionname(mtd_part, partname);
 | 
			
		||||
 | 
			
		||||
                  /* Now skip to next name.
 | 
			
		||||
                   * We don't need to split the string here
 | 
			
		||||
                   * because the MTD partition logic will only
 | 
			
		||||
                   * display names up to the comma,
 | 
			
		||||
                   * thus allowing us to use a single static name
 | 
			
		||||
                   * in the code.
 | 
			
		||||
                   */
 | 
			
		||||
 | 
			
		||||
                  while (*partname != ',' && *partname != '\0')
 | 
			
		||||
                    {
 | 
			
		||||
                      /* Skip to next ',' */
 | 
			
		||||
 | 
			
		||||
                      partname++;
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                  if (*partname == ',')
 | 
			
		||||
                    {
 | 
			
		||||
                      partname++;
 | 
			
		||||
                    }
 | 
			
		||||
            #endif
 | 
			
		||||
 | 
			
		||||
          /* Update the pointer to point to the next size in the list */
 | 
			
		||||
 | 
			
		||||
          while ((*ptr >= '0') && (*ptr <= '9'))
 | 
			
		||||
            {
 | 
			
		||||
              ptr++;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
          if (*ptr == ',')
 | 
			
		||||
            {
 | 
			
		||||
              ptr++;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
          /* Increment the part number */
 | 
			
		||||
 | 
			
		||||
          partno++;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
  #else /* CONFIG_MTD_PARTITION */
 | 
			
		||||
 | 
			
		||||
  /* Configure the device with no partition support */
 | 
			
		||||
 | 
			
		||||
  smart_initialize(0, mtd, NULL);
 | 
			
		||||
  if (ret < 0)
 | 
			
		||||
    {
 | 
			
		||||
      syslog(LOG_ERR, "ERROR: SmartFS initialization failed: %d\n", ret);
 | 
			
		||||
      return ret;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    #endif
 | 
			
		||||
 | 
			
		||||
  return OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif /* CONFIG_FS_SMARTFS */
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,92 @@
 | 
			
		|||
/****************************************************************************
 | 
			
		||||
 * boards/arm/samd5e5/metro-m4/src/sam_usbdev.c
 | 
			
		||||
 *
 | 
			
		||||
 *   Copyright 2020 Falker Automacao Agricola LTDA.
 | 
			
		||||
 *   Author: Leomar Mateus Radke <leomar@falker.com.br>
 | 
			
		||||
 *   Author: Ricardo Wartchow <wartchow@gmail.com>
 | 
			
		||||
 *
 | 
			
		||||
 * 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 <sys/types.h>
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
#include <stdbool.h>
 | 
			
		||||
#include <debug.h>
 | 
			
		||||
 | 
			
		||||
#include <nuttx/usb/usbdev.h>
 | 
			
		||||
#include <nuttx/usb/usbdev_trace.h>
 | 
			
		||||
 | 
			
		||||
#include "arm_arch.h"
 | 
			
		||||
#include "metro-m4.h"
 | 
			
		||||
#include <arch/board/board.h>
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Public Functions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: sam_usbinitialize
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   Called to setup USB-related GPIO pins
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
void sam_usbinitialize(void)
 | 
			
		||||
{
 | 
			
		||||
  /* USB Soft Connect Pullup */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name:  sam_usbpullup
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   If USB is supported and the board supports a pullup via GPIO (for USB
 | 
			
		||||
 *   software connect and disconnect), then the board software must provide
 | 
			
		||||
 *   sam_pullup. See include/nuttx/usb/usbdev.h for additional description
 | 
			
		||||
 *   of this method. Alternatively, if no pull-up GPIO the following EXTERN
 | 
			
		||||
 *   can be redefined to be NULL.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
int sam_usbpullup(FAR struct usbdev_s *dev, bool enable)
 | 
			
		||||
{
 | 
			
		||||
  usbtrace(TRACE_DEVPULLUP, (uint16_t)enable);
 | 
			
		||||
  return OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name:  sam_usbsuspend
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   Board logic must provide the sam_usbsuspend logic if the USBDEV driver
 | 
			
		||||
 *   is used. This function is called whenever the USB enters or leaves
 | 
			
		||||
 *   suspend mode. This is an opportunity for the board logic to shutdown
 | 
			
		||||
 *   clocks, power, etc. while the USB is suspended.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
void sam_usbsuspend(FAR struct usbdev_s *dev, bool resume)
 | 
			
		||||
{
 | 
			
		||||
  uinfo("resume: %d\n", resume);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,235 @@
 | 
			
		|||
/****************************************************************************
 | 
			
		||||
 * boards/arm/samd5e5/metro-m4/src/sam_usbhost.c
 | 
			
		||||
 *
 | 
			
		||||
 *   Copyright 2020 Falker Automacao Agricola LTDA.
 | 
			
		||||
 *   Author: Leomar Mateus Radke <leomar@falker.com.br>
 | 
			
		||||
 *   Author: Ricardo Wartchow <wartchow@gmail.com>
 | 
			
		||||
 *
 | 
			
		||||
 * 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 <sys/types.h>
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
#include <stdbool.h>
 | 
			
		||||
#include <sched.h>
 | 
			
		||||
#include <errno.h>
 | 
			
		||||
#include <assert.h>
 | 
			
		||||
#include <debug.h>
 | 
			
		||||
 | 
			
		||||
#include <nuttx/kthread.h>
 | 
			
		||||
#include <nuttx/usb/usbhost.h>
 | 
			
		||||
#include <nuttx/usb/usbdev_trace.h>
 | 
			
		||||
 | 
			
		||||
#include "chip.h"
 | 
			
		||||
#include "arm_arch.h"
 | 
			
		||||
#include "metro-m4.h"
 | 
			
		||||
#include "sam_port.h"
 | 
			
		||||
#include "sam_usbhost.h"
 | 
			
		||||
#include <arch/board/board.h>
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Pre-processor Definitions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#if defined(CONFIG_USBDEV) || defined(CONFIG_USBHOST)
 | 
			
		||||
#define HAVE_USB 1
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifndef CONFIG_METRO_M4_USBHOST_PRIO
 | 
			
		||||
#define CONFIG_METRO_M4_USBHOST_PRIO 100
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifndef CONFIG_METRO_M4_USBHOST_STACKSIZE
 | 
			
		||||
#define CONFIG_METRO_M4_USBHOST_STACKSIZE 1024
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Private Data
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_USBHOST
 | 
			
		||||
static struct usbhost_connection_s *g_usbconn;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Private Functions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: usbhost_waiter
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   Wait for USB devices to be connected.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_USBHOST
 | 
			
		||||
static int usbhost_waiter(int argc, char *argv[])
 | 
			
		||||
{
 | 
			
		||||
  struct usbhost_hubport_s *hport;
 | 
			
		||||
  uinfo("Running\n");
 | 
			
		||||
 | 
			
		||||
  for (; ; )
 | 
			
		||||
    {
 | 
			
		||||
      /* Wait for the device to change state */
 | 
			
		||||
 | 
			
		||||
      DEBUGVERIFY(CONN_WAIT(g_usbconn, &hport));
 | 
			
		||||
      uinfo("%s\n", hport->connected ? "connected" : "disconnected");
 | 
			
		||||
 | 
			
		||||
      /* Did we just become connected? */
 | 
			
		||||
 | 
			
		||||
      if (hport->connected)
 | 
			
		||||
        {
 | 
			
		||||
          /* Yes.. enumerate the newly connected device */
 | 
			
		||||
 | 
			
		||||
         (void)CONN_ENUMERATE(g_usbconn, hport);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_METRO_M4_USB_AUTOMOUNT
 | 
			
		||||
      /* Let the automounter know about the insertion event */
 | 
			
		||||
 | 
			
		||||
      sam_automount_event(hport->connected);
 | 
			
		||||
#endif
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  /* Keep the compiler from complaining */
 | 
			
		||||
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Public Functions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: sam_usbinitialize
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
void sam_usbinitialize(void)
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: sam_usbhost_vbusdrive
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   Enable/disable driving of VBUS 5V output. This function must be provided
 | 
			
		||||
 *   be each platform that implements the HS host interface
 | 
			
		||||
 *
 | 
			
		||||
 * Input Parameters:
 | 
			
		||||
 *   iface  - For future growth to handle multiple USB host interface. Should
 | 
			
		||||
 *            be zero.
 | 
			
		||||
 *   enable - true: enable VBUS power; false: disable VBUS power
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_USBHOST
 | 
			
		||||
void sam_usbhost_vbusdrive(int iface, bool enable)
 | 
			
		||||
{
 | 
			
		||||
  DEBUGASSERT(iface == 0);
 | 
			
		||||
  if (enable)
 | 
			
		||||
    {
 | 
			
		||||
      /* Set your function here! */
 | 
			
		||||
    }
 | 
			
		||||
  else
 | 
			
		||||
    {
 | 
			
		||||
      /* Set your function here! */
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: samd_usbhost_initialize
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   Called at application startup time to initialize the USB host
 | 
			
		||||
 *   functionality. This function will start a thread that will monitor for
 | 
			
		||||
 *   device connection/disconnection events.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_USBHOST
 | 
			
		||||
int samd_usbhost_initialize(void)
 | 
			
		||||
{
 | 
			
		||||
  int pid;
 | 
			
		||||
  int ret;
 | 
			
		||||
 | 
			
		||||
  /* First, register all of the class drivers needed to support the drivers
 | 
			
		||||
   * that we care about:
 | 
			
		||||
   */
 | 
			
		||||
 | 
			
		||||
  uinfo("Register class drivers\n");
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_USBHOST_MSC
 | 
			
		||||
  /* Register the USB mass storage class class */
 | 
			
		||||
 | 
			
		||||
  ret = usbhost_msc_initialize();
 | 
			
		||||
  if (ret != OK)
 | 
			
		||||
    {
 | 
			
		||||
      uerr("ERROR: Failed to register the mass storage class: %d\n", ret);
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_USBHOST_HIDKBD
 | 
			
		||||
  /* Initialize the HID keyboard class */
 | 
			
		||||
 | 
			
		||||
  ret = usbhost_kbdinit();
 | 
			
		||||
  if (ret != OK)
 | 
			
		||||
    {
 | 
			
		||||
      uerr("ERROR: Failed to register the HID keyboard class\n");
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_USBHOST_HIDMOUSE
 | 
			
		||||
  /* Initialize the HID mouse class */
 | 
			
		||||
 | 
			
		||||
  ret = usbhost_mouse_init();
 | 
			
		||||
  if (ret != OK)
 | 
			
		||||
    {
 | 
			
		||||
      uerr("ERROR: Failed to register the HID mouse class\n");
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
  /* Then get an instance of the USB host interface */
 | 
			
		||||
 | 
			
		||||
  uinfo("Initialize USB host\n");
 | 
			
		||||
  g_usbconn = sam_usbhost_initialize(0);
 | 
			
		||||
  if (g_usbconn)
 | 
			
		||||
    {
 | 
			
		||||
      /* Start a thread to handle device connection. */
 | 
			
		||||
 | 
			
		||||
      uinfo("Start usbhost_waiter\n");
 | 
			
		||||
      pid =
 | 
			
		||||
        kthread_create("usbhost", CONFIG_METRO_M4_USBHOST_PRIO,
 | 
			
		||||
                       CONFIG_METRO_M4_USBHOST_STACKSIZE,
 | 
			
		||||
                       (main_t) usbhost_waiter, (FAR char *const *)NULL);
 | 
			
		||||
      return pid < 0 ? -ENOEXEC : OK;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  return -ENODEV;
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,71 @@
 | 
			
		|||
/****************************************************************************
 | 
			
		||||
 * boards/arm/samd5e5/metro-m4/src/sam_usbmsc.c
 | 
			
		||||
 *
 | 
			
		||||
 *   Copyright 2020 Falker Automacao Agricola LTDA.
 | 
			
		||||
 *   Author: Leomar Mateus Radke <leomar@falker.com.br>
 | 
			
		||||
 *   Author: Ricardo Wartchow <wartchow@gmail.com>
 | 
			
		||||
 *
 | 
			
		||||
 * 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 <stdio.h>
 | 
			
		||||
#include <syslog.h>
 | 
			
		||||
#include <errno.h>
 | 
			
		||||
 | 
			
		||||
#include <nuttx/board.h>
 | 
			
		||||
 | 
			
		||||
#include "metro-m4.h"
 | 
			
		||||
#include <arch/board/board.h>
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Pre-processor Definitions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/* Configuration ************************************************************/
 | 
			
		||||
 | 
			
		||||
#ifndef CONFIG_SYSTEM_USBMSC_DEVMINOR1
 | 
			
		||||
#  define CONFIG_SYSTEM_USBMSC_DEVMINOR1 0
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Public Functions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: board_usbmsc_initialize
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   Perform architecture specific initialization of the USB MSC device.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
int board_usbmsc_initialize(int port)
 | 
			
		||||
{
 | 
			
		||||
  /* If system/usbmsc is built as an NSH command
 | 
			
		||||
   */
 | 
			
		||||
 | 
			
		||||
#ifndef CONFIG_NSH_BUILTIN_APPS
 | 
			
		||||
#else
 | 
			
		||||
  return OK;
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,218 @@
 | 
			
		|||
/****************************************************************************
 | 
			
		||||
 * boards/arm/samd5e5/metro-m4/src/sam_userleds.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.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/* The Adafruit Metro M4 has four LEDs, but only two are controllable by
 | 
			
		||||
 * software:
 | 
			
		||||
 *
 | 
			
		||||
 *   1. The red LED on the Arduino D13 pin, and
 | 
			
		||||
 *   2. A NeoPixel RGB LED.
 | 
			
		||||
 *
 | 
			
		||||
 * Currently, only the red LED is supported.
 | 
			
		||||
 *
 | 
			
		||||
 *   ------ ----------------- -----------
 | 
			
		||||
 *   SHIELD SAMD5E5           FUNCTION
 | 
			
		||||
 *   ------ ----------------- -----------
 | 
			
		||||
 *   D13    PA16              GPIO output
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Included Files
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#include <nuttx/config.h>
 | 
			
		||||
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
#include <stdbool.h>
 | 
			
		||||
#include <debug.h>
 | 
			
		||||
 | 
			
		||||
#include <nuttx/board.h>
 | 
			
		||||
#include <nuttx/power/pm.h>
 | 
			
		||||
 | 
			
		||||
#include "arm_arch.h"
 | 
			
		||||
#include "sam_port.h"
 | 
			
		||||
 | 
			
		||||
#include "metro-m4.h"
 | 
			
		||||
 | 
			
		||||
#include <arch/board/board.h>
 | 
			
		||||
 | 
			
		||||
#ifndef CONFIG_ARCH_LEDS
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Private Data
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Private Function Prototypes
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/* LED Power Management */
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_PM
 | 
			
		||||
static void led_pm_notify(struct pm_callback_s *cb, int domain,
 | 
			
		||||
                          enum pm_state_e pmstate);
 | 
			
		||||
static int led_pm_prepare(struct pm_callback_s *cb, int domain,
 | 
			
		||||
                          enum pm_state_e pmstate);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Private Data
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_PM
 | 
			
		||||
static struct pm_callback_s g_ledscb =
 | 
			
		||||
{
 | 
			
		||||
  .notify  = led_pm_notify,
 | 
			
		||||
  .prepare = led_pm_prepare,
 | 
			
		||||
};
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Private Functions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: led_pm_notify
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   Notify the driver of new power state. This callback is called after
 | 
			
		||||
 *   all drivers have had the opportunity to prepare for the new power state.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_PM
 | 
			
		||||
static void led_pm_notify(struct pm_callback_s *cb, int domain,
 | 
			
		||||
                          enum pm_state_e pmstate)
 | 
			
		||||
{
 | 
			
		||||
  switch (pmstate)
 | 
			
		||||
    {
 | 
			
		||||
      case(PM_NORMAL):
 | 
			
		||||
        {
 | 
			
		||||
          /* Restore normal LEDs operation */
 | 
			
		||||
        }
 | 
			
		||||
        break;
 | 
			
		||||
 | 
			
		||||
      case(PM_IDLE):
 | 
			
		||||
        {
 | 
			
		||||
          /* Entering IDLE mode - Turn leds off */
 | 
			
		||||
        }
 | 
			
		||||
        break;
 | 
			
		||||
 | 
			
		||||
      case(PM_STANDBY):
 | 
			
		||||
        {
 | 
			
		||||
          /* Entering STANDBY mode - Logic for PM_STANDBY goes here */
 | 
			
		||||
        }
 | 
			
		||||
        break;
 | 
			
		||||
 | 
			
		||||
      case(PM_SLEEP):
 | 
			
		||||
        {
 | 
			
		||||
          /* Entering SLEEP mode - Logic for PM_SLEEP goes here */
 | 
			
		||||
        }
 | 
			
		||||
        break;
 | 
			
		||||
 | 
			
		||||
      default:
 | 
			
		||||
        {
 | 
			
		||||
          /* Should not get here */
 | 
			
		||||
        }
 | 
			
		||||
        break;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: led_pm_prepare
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   Request the driver to prepare for a new power state. This is a warning
 | 
			
		||||
 *   that the system is about to enter into a new power state. The driver
 | 
			
		||||
 *   should begin whatever operations that may be required to enter power
 | 
			
		||||
 *   state. The driver may abort the state change mode by returning a
 | 
			
		||||
 *   non-zero value from the callback function.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_PM
 | 
			
		||||
static int led_pm_prepare(struct pm_callback_s *cb, int domain,
 | 
			
		||||
                          enum pm_state_e pmstate)
 | 
			
		||||
{
 | 
			
		||||
  /* No preparation to change power modes is required by the LEDs driver.
 | 
			
		||||
   * We always accept the state change by returning OK.
 | 
			
		||||
   */
 | 
			
		||||
 | 
			
		||||
  return OK;
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Public Functions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: board_userled_initialize
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
uint32_t board_userled_initialize(void)
 | 
			
		||||
{
 | 
			
		||||
  sam_portconfig(PORT_STATUS_LED);
 | 
			
		||||
  return BOARD_NLEDS;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: board_userled
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
void board_userled(int led, bool ledon)
 | 
			
		||||
{
 | 
			
		||||
  if (led == BOARD_STATUS_LED)
 | 
			
		||||
    {
 | 
			
		||||
      sam_portwrite(PORT_STATUS_LED, !ledon);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: board_userled_all
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
void board_userled_all(uint32_t ledset)
 | 
			
		||||
{
 | 
			
		||||
  board_userled(BOARD_STATUS_LED, (ledset & BOARD_STATUS_LED_BIT) != 0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: sam_led_pminitialize
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   Register LED power management features.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_PM
 | 
			
		||||
void sam_led_pminitialize(void)
 | 
			
		||||
{
 | 
			
		||||
  /* Register to receive power management callbacks */
 | 
			
		||||
 | 
			
		||||
  int ret = pm_register(&g_ledscb);
 | 
			
		||||
  if (ret != OK)
 | 
			
		||||
    {
 | 
			
		||||
      board_autoled_on(LED_ASSERTION);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
#endif /* CONFIG_PM */
 | 
			
		||||
 | 
			
		||||
#endif /* !CONFIG_ARCH_LEDS */
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,50 @@
 | 
			
		|||
#
 | 
			
		||||
# For a description of the syntax of this configuration file,
 | 
			
		||||
# see the file kconfig-language.txt in the NuttX tools repository.
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
if ARCH_BOARD_SAME54_XPLAINED_PRO
 | 
			
		||||
 | 
			
		||||
choice
 | 
			
		||||
	prompt "Execution memory"
 | 
			
		||||
	default SAME54_XPLAINED_PRO_RUNFROMFLASH
 | 
			
		||||
 | 
			
		||||
config SAME54_XPLAINED_PRO_RUNFROMFLASH
 | 
			
		||||
	bool "Run from FLASH"
 | 
			
		||||
	select BOOT_RUNFROMFLASH
 | 
			
		||||
	---help---
 | 
			
		||||
		This is the normal configuration for building SAM E54 Xplained
 | 
			
		||||
		Pro code.
 | 
			
		||||
 | 
			
		||||
config SAME54_XPLAINED_PRO_RUNFROMSRAM
 | 
			
		||||
	bool "Run from SRAM"
 | 
			
		||||
	select BOOT_RUNFROMISRAM
 | 
			
		||||
	---help---
 | 
			
		||||
		During early bring-up, it is safer to execute entirely from
 | 
			
		||||
		SRAM until you are confident in the initialization logic.
 | 
			
		||||
		Then you can safely switch to FLASH.
 | 
			
		||||
 | 
			
		||||
		REVISIT:  This auto-selects CONFIG_BOOT_RUNFROMISRAM but I have
 | 
			
		||||
		found, with some difficulty, that that choice still defaults to
 | 
			
		||||
		CONFIG_BOOT_RUNFROMFLASH, causing link-time failures when running
 | 
			
		||||
		from SRAM.
 | 
			
		||||
 | 
			
		||||
endchoice # Execution memory
 | 
			
		||||
 | 
			
		||||
config SAME54_XPLAINED_PRO_32KHZXTAL
 | 
			
		||||
	bool "32.768 KHz XTAL"
 | 
			
		||||
	default n
 | 
			
		||||
	---help---
 | 
			
		||||
		According to the schematic, a 32.768 KHz crystal is installed  on
 | 
			
		||||
		board.  However, I have been unable to use this crystal and thought
 | 
			
		||||
		perhaps it is missing or defective on my board (there is a metal
 | 
			
		||||
		package that could be a crystal on board, but I am not certain).
 | 
			
		||||
		Another, more likely option is that there is a coding error on my
 | 
			
		||||
		part that prevents the 32.768 KHz crystal from usable(?)
 | 
			
		||||
 | 
			
		||||
		The configuration defaults to using the always-on OSCULP32 as the
 | 
			
		||||
		slow clock source.  This option will select instead XOSC32 as the
 | 
			
		||||
		slow clock source.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
endif # ARCH_BOARD_SAME54_XPLAINED_PRO
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,159 @@
 | 
			
		|||
README
 | 
			
		||||
======
 | 
			
		||||
 | 
			
		||||
  This directory contains the port of NuttX to the Microchip SAME54 Xplained
 | 
			
		||||
  Pro board.  This board is powered by an ATSAME54P20A:
 | 
			
		||||
 | 
			
		||||
  o Cortex M4 core running at 120 MHz
 | 
			
		||||
  o Hardware DSP and floating point support
 | 
			
		||||
  o 1 MB flash, 256 KB RAM
 | 
			
		||||
  o 32-bit, 3.3V logic and power
 | 
			
		||||
  o Dual 1 MSPS DAC (A0 and A1)
 | 
			
		||||
  o Dual 1 MSPS ADC (8 analog pins)
 | 
			
		||||
  o 8 x hardware SERCOM (I2C, SPI or UART)
 | 
			
		||||
  o 16 x PWM outputs
 | 
			
		||||
  o Stereo I2S input/output with MCK pin
 | 
			
		||||
  o 14-bit Parallel capture controller (for camera/video in)
 | 
			
		||||
  o Built in crypto engines with AES (256 bit), true RNG, Pubkey controller
 | 
			
		||||
  o 10/100 Ethernet MAC
 | 
			
		||||
  o Dual SD/MMC controller
 | 
			
		||||
  o Dual CAN bus interfaces
 | 
			
		||||
  o 100-TQFP
 | 
			
		||||
 | 
			
		||||
Contents
 | 
			
		||||
========
 | 
			
		||||
 | 
			
		||||
  o STATUS
 | 
			
		||||
  o Serial Console
 | 
			
		||||
  o LEDs
 | 
			
		||||
  o Run from SRAM
 | 
			
		||||
  o Configurations
 | 
			
		||||
 | 
			
		||||
STATUS
 | 
			
		||||
======
 | 
			
		||||
 | 
			
		||||
  2019-09-17:  Board port started based on Metro M4 board.
 | 
			
		||||
 | 
			
		||||
  WARNING:  If you decide to invest the time to discover whey the XOSC32K
 | 
			
		||||
  clock source is not working, be certain to use the SRAM configuration.
 | 
			
		||||
  That configuration in FLASH is most likely lock up your board irrecoverably
 | 
			
		||||
  is there are any start-up errors!
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Serial Console
 | 
			
		||||
==============
 | 
			
		||||
 | 
			
		||||
  The onboard debugger on the SAME54 Xplained Pro provides a virtual serial
 | 
			
		||||
  interface over the DEBUG USB port.  The pins on the SAME54 are as follows:
 | 
			
		||||
 | 
			
		||||
    ----------------- -----------
 | 
			
		||||
    SAMD5E5           FUNCTION
 | 
			
		||||
    ----------------- -----------
 | 
			
		||||
    PB24 SERCOM2 PAD1 RXD
 | 
			
		||||
    PB25 SERCOM2 PAD0 TXD
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  An external RS-232 or serial-to-USB adapter can be connected on pins PA22
 | 
			
		||||
  and PA23:
 | 
			
		||||
 | 
			
		||||
    ----------------- ---------
 | 
			
		||||
    SAMD5E5           FUNCTION
 | 
			
		||||
    ----------------- ---------
 | 
			
		||||
    PA23 SERCOM3 PAD1 RXD
 | 
			
		||||
    PA22 SERCOM3 PAD0 TXD
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
LEDs
 | 
			
		||||
====
 | 
			
		||||
 | 
			
		||||
  The SAME54 Xplained Pro has three LEDs, but only one is controllable by software:
 | 
			
		||||
 | 
			
		||||
    1. LED0 near the edge of the board
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    ----------------- -----------
 | 
			
		||||
    SAMD5E5           FUNCTION
 | 
			
		||||
    ----------------- -----------
 | 
			
		||||
    PC18              GPIO output
 | 
			
		||||
 | 
			
		||||
Run from SRAM
 | 
			
		||||
=============
 | 
			
		||||
 | 
			
		||||
  I bricked my first Metro M4 board because there were problems in the
 | 
			
		||||
  bring-up logic.  These problems left the chip in a bad state that was
 | 
			
		||||
  repeated on each reset because the code was written into FLASH and I was
 | 
			
		||||
  unable to ever connect to it again via SWD.
 | 
			
		||||
 | 
			
		||||
  To make the bring-up less risky, I added a configuration option to build
 | 
			
		||||
  the code to execution entirely out of SRAM.  By default, the setting
 | 
			
		||||
  CONFIG_SAME54_XPLAINED_PRO_RUNFROMFLASH=y is used and the code is built to run out of
 | 
			
		||||
  FLASH.  If CONFIG_SAME54_XPLAINED_PRO_RUNFROMSRAM=y is selected instead, then the
 | 
			
		||||
  code is built to run out of SRAM.
 | 
			
		||||
 | 
			
		||||
  To use the code in this configuration, the program must be started a
 | 
			
		||||
  little differently:
 | 
			
		||||
 | 
			
		||||
    gdb> mon reset
 | 
			
		||||
    gdb> mon halt
 | 
			
		||||
    gdb> load nuttx             << Load NuttX into SRAM
 | 
			
		||||
    gdb> file nuttx             << Assuming debug symbols are enabled
 | 
			
		||||
    gdb> mon memu32 0x20000000  << Get the address of initial stack
 | 
			
		||||
    gdb> mon reg sp 0x200161c4  << Set the initial stack pointer using this address
 | 
			
		||||
    gdb> mon memu32 0x20000004  << Get the address of __start entry point
 | 
			
		||||
    gdb> mon reg pc 0x20000264  << Set the PC using this address (without bit 0 set)
 | 
			
		||||
    gdb> si                     << Step in just to make sure everything is okay
 | 
			
		||||
    gdb> [ set breakpoints ]
 | 
			
		||||
    gdb> c                      << Then continue until you hit a breakpoint
 | 
			
		||||
 | 
			
		||||
  Where 0x200161c4 and 0x20000264 are the values of the initial stack and
 | 
			
		||||
  the __start entry point that I read from SRAM
 | 
			
		||||
 | 
			
		||||
Configurations
 | 
			
		||||
==============
 | 
			
		||||
 | 
			
		||||
  Each SAME54 Xplained Pro configuration is maintained in a sub-directory and
 | 
			
		||||
  can be selected as follow:
 | 
			
		||||
 | 
			
		||||
    tools/configure.sh [OPTIONS] same54-xplained-pro:<subdir>
 | 
			
		||||
 | 
			
		||||
  Do 'tools/configure.sh -h' for the list of options.  If you are building
 | 
			
		||||
  under Windows with Cygwin, you would need the -c option, for example.
 | 
			
		||||
 | 
			
		||||
  Before building, make sure that the PATH environmental variable includes the
 | 
			
		||||
  correct path to the directory than holds your toolchain binaries.
 | 
			
		||||
 | 
			
		||||
  And then build NuttX by simply typing the following.  At the conclusion of
 | 
			
		||||
  the make, the nuttx binary will reside in an ELF file called, simply, nuttx.
 | 
			
		||||
 | 
			
		||||
    make
 | 
			
		||||
 | 
			
		||||
  The <subdir> that is provided above as an argument to the tools/configure.sh
 | 
			
		||||
  must be is one of configurations listed in the following paragraph.
 | 
			
		||||
 | 
			
		||||
  NOTES:
 | 
			
		||||
 | 
			
		||||
  1. These configurations use the mconf-based configuration tool.  To
 | 
			
		||||
     change any of these configurations using that tool, you should:
 | 
			
		||||
 | 
			
		||||
    a. Build and install the kconfig-mconf tool.  See nuttx/README.txt
 | 
			
		||||
       see additional README.txt files in the NuttX tools repository.
 | 
			
		||||
 | 
			
		||||
    b. Execute 'make menuconfig' in nuttx/ in order to start the
 | 
			
		||||
       reconfiguration process.
 | 
			
		||||
 | 
			
		||||
  2. Unless stated otherwise, all configurations generate console
 | 
			
		||||
     output on SERCOM2 which is available via USB debug.
 | 
			
		||||
 | 
			
		||||
  3. Unless otherwise stated, the configurations are setup build under
 | 
			
		||||
     Linux with a generic ARM EABI toolchain:
 | 
			
		||||
 | 
			
		||||
Configuration sub-directories
 | 
			
		||||
-----------------------------
 | 
			
		||||
 | 
			
		||||
  nsh:
 | 
			
		||||
    This configuration directory will built the NuttShell.  See NOTES for
 | 
			
		||||
    common configuration above and the following:
 | 
			
		||||
 | 
			
		||||
    NOTES:
 | 
			
		||||
 | 
			
		||||
    1. The CMCC (Cortex M Cache Controller) is enabled.
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,48 @@
 | 
			
		|||
#
 | 
			
		||||
# 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_NSH_DISABLE_IFCONFIG is not set
 | 
			
		||||
# CONFIG_NSH_DISABLE_PS is not set
 | 
			
		||||
CONFIG_ARCH="arm"
 | 
			
		||||
CONFIG_ARCH_BOARD="same54-xplained-pro"
 | 
			
		||||
CONFIG_ARCH_BOARD_SAME54_XPLAINED_PRO=y
 | 
			
		||||
CONFIG_ARCH_CHIP="samd5e5"
 | 
			
		||||
CONFIG_ARCH_CHIP_SAME54P20=y
 | 
			
		||||
CONFIG_ARCH_CHIP_SAME5X=y
 | 
			
		||||
CONFIG_ARCH_STACKDUMP=y
 | 
			
		||||
CONFIG_BOARD_LOOPSPERMSEC=7225
 | 
			
		||||
CONFIG_BUILTIN=y
 | 
			
		||||
CONFIG_DISABLE_ENVIRON=y
 | 
			
		||||
CONFIG_HAVE_CXX=y
 | 
			
		||||
CONFIG_HAVE_CXXINITIALIZE=y
 | 
			
		||||
CONFIG_MAX_TASKS=16
 | 
			
		||||
CONFIG_NSH_BUILTIN_APPS=y
 | 
			
		||||
CONFIG_NSH_FILEIOSIZE=512
 | 
			
		||||
CONFIG_NSH_LINELEN=64
 | 
			
		||||
CONFIG_NSH_READLINE=y
 | 
			
		||||
CONFIG_PREALLOC_TIMERS=4
 | 
			
		||||
CONFIG_PTHREAD_STACK_DEFAULT=1536
 | 
			
		||||
CONFIG_RAM_SIZE=196608
 | 
			
		||||
CONFIG_RAM_START=0x20000000
 | 
			
		||||
CONFIG_RAW_BINARY=y
 | 
			
		||||
CONFIG_RR_INTERVAL=200
 | 
			
		||||
CONFIG_SAMD5E5_CMCC=y
 | 
			
		||||
CONFIG_SAMD5E5_EIC=y
 | 
			
		||||
CONFIG_SAMD5E5_SERCOM2=y
 | 
			
		||||
CONFIG_SAMD5E5_SERCOM3=y
 | 
			
		||||
CONFIG_SCHED_WAITPID=y
 | 
			
		||||
CONFIG_SDCLONE_DISABLE=y
 | 
			
		||||
CONFIG_START_DAY=23
 | 
			
		||||
CONFIG_START_MONTH=7
 | 
			
		||||
CONFIG_SYSTEM_NSH=y
 | 
			
		||||
CONFIG_TASK_NAME_SIZE=0
 | 
			
		||||
CONFIG_TASK_SPAWN_DEFAULT_STACKSIZE=1536
 | 
			
		||||
CONFIG_USART2_SERIAL_CONSOLE=y
 | 
			
		||||
CONFIG_USART3_RXBUFSIZE=64
 | 
			
		||||
CONFIG_USART3_TXBUFSIZE=64
 | 
			
		||||
CONFIG_USERMAIN_STACKSIZE=1536
 | 
			
		||||
CONFIG_USER_ENTRYPOINT="nsh_main"
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,491 @@
 | 
			
		|||
/****************************************************************************
 | 
			
		||||
 * boards/arm/samd5e5/same54-xplained-pro/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_SAMD5E5_SAME54_XPLAINED_PRO_INCLUDE_BOARD_H
 | 
			
		||||
#define __BOARDS_ARM_SAMD5E5_SAME54_XPLAINED_PRO_INCLUDE_BOARD_H
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Included Files
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#include <nuttx/config.h>
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Pre-processor Definitions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#ifndef TRUE
 | 
			
		||||
#  define TRUE  1
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifndef FALSE
 | 
			
		||||
#  define FALSE 0
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/* Clocking *****************************************************************/
 | 
			
		||||
 | 
			
		||||
/* Overview
 | 
			
		||||
 *
 | 
			
		||||
 * Per the schematic Adafruit Metro M4 Pro has one on-board crystal:
 | 
			
		||||
 *
 | 
			
		||||
 *   X4 32.768KHz XOSC32
 | 
			
		||||
 *
 | 
			
		||||
 * However, I have been unsuccessful using it and have fallen back to using
 | 
			
		||||
 * OSCULP32K(Unless CONFIG_SAME54_XPLAINED_PRO_32KHZXTAL=y)
 | 
			
		||||
 *
 | 
			
		||||
 * Since there is no high speed crystal, we will run from the OSC16M clock
 | 
			
		||||
 * source.
 | 
			
		||||
 *
 | 
			
		||||
 * OSC48M               Output     = 48Mhz
 | 
			
		||||
 *  |
 | 
			
		||||
 * FDLL                 Input      = 48MHz
 | 
			
		||||
 *  |                   Output     = 48MHz
 | 
			
		||||
 * GCLK5                Input      = 48MHz
 | 
			
		||||
 *  |                   Output     = 2MHz
 | 
			
		||||
 * DPLL0                Input      = 2MHz
 | 
			
		||||
 *  |                   Output     = 120MHz
 | 
			
		||||
 * GCLK0                Input      = 120MHz
 | 
			
		||||
 *  |                   Output     = 120MHz
 | 
			
		||||
 * MCK                  Input      = 120MHz
 | 
			
		||||
 *  |                   Output     = 120MHz
 | 
			
		||||
 * CPU                  Input      = 120MHz
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define BOARD_OSC32K_FREQUENCY  32768     /* OSCULP32K frequency 32.768 KHz (nominal) */
 | 
			
		||||
#define BOARD_XOSC32K_FREQUENCY 32768     /* XOSC32K frequency 32.768 KHz */
 | 
			
		||||
#define BOARD_DFLL_FREQUENCY    48000000  /* FDLL frequency 28MHz */
 | 
			
		||||
#define BOARD_XOSC0_FREQUENCY   12000000  /* XOSC0 frequency 12MHz (disabled) */
 | 
			
		||||
#define BOARD_XOSC1_FREQUENCY   12000000  /* XOSC0 frequency 12MHz (disabled)*/
 | 
			
		||||
#define BOARD_DPLL0_FREQUENCY   120000000 /* DPLL0 output frueuency (120MHz) */
 | 
			
		||||
#define BOARD_DPLL1_FREQUENCY   47985664  /* DPLL1 output frequency (disabled) */
 | 
			
		||||
 | 
			
		||||
#define BOARD_GCLK0_FREQUENCY   BOARD_DPLL0_FREQUENCY
 | 
			
		||||
#define BOARD_GCLK1_FREQUENCY   BOARD_DFLL_FREQUENCY
 | 
			
		||||
#define BOARD_GCLK2_FREQUENCY   (BOARD_XOSC32K_FREQUENCY / 4)  /* Disabled */
 | 
			
		||||
#ifdef CONFIG_SAME54_XPLAINED_PRO_32KHZXTAL
 | 
			
		||||
#  define BOARD_GCLK3_FREQUENCY BOARD_XOSC32K_FREQUENCY        /* Enabled */
 | 
			
		||||
#else
 | 
			
		||||
#  define BOARD_GCLK3_FREQUENCY BOARD_OSC32K_FREQUENCY         /* Always-on */
 | 
			
		||||
#endif
 | 
			
		||||
#define BOARD_GCLK4_FREQUENCY   BOARD_DPLL0_FREQUENCY
 | 
			
		||||
#define BOARD_GCLK5_FREQUENCY   (BOARD_DFLL_FREQUENCY / 24)
 | 
			
		||||
#define BOARD_GCLK6_FREQUENCY   BOARD_XOSC1_FREQUENCY          /* Disabled */
 | 
			
		||||
#define BOARD_GCLK7_FREQUENCY   BOARD_XOSC1_FREQUENCY          /* Disabled */
 | 
			
		||||
#define BOARD_GCLK8_FREQUENCY   BOARD_XOSC1_FREQUENCY          /* Disabled */
 | 
			
		||||
#define BOARD_GCLK9_FREQUENCY   BOARD_XOSC1_FREQUENCY          /* Disabled */
 | 
			
		||||
#define BOARD_GCLK10_FREQUENCY  BOARD_XOSC1_FREQUENCY          /* Disabled */
 | 
			
		||||
#define BOARD_GCLK11_FREQUENCY  BOARD_XOSC1_FREQUENCY          /* Disabled */
 | 
			
		||||
 | 
			
		||||
#define BOARD_CPU_FREQUENCY     BOARD_GCLK0_FREQUENCY /* CPU frequency 120MHz */
 | 
			
		||||
 | 
			
		||||
/* XOSC32 */
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_SAME54_XPLAINED_PRO_32KHZXTAL
 | 
			
		||||
#  define BOARD_HAVE_XOSC32K    1         /* 32.768 KHz XOSC32 crystal installed */
 | 
			
		||||
#  define BOARD_XOSC32K_ENABLE  TRUE      /* Enable XOSC32 */
 | 
			
		||||
#else
 | 
			
		||||
#  define BOARD_HAVE_XOSC32K    0         /* No 32.768 KHz XOSC32 crystal installed */
 | 
			
		||||
#  define BOARD_XOSC32K_ENABLE  FALSE     /* Disable XOSC32 */
 | 
			
		||||
#endif
 | 
			
		||||
#define BOARD_XOSC32K_XTALEN    TRUE      /* Crystal connected on XIN32 */
 | 
			
		||||
#define BOARD_XOSC32K_EN32K     FALSE     /* No 32KHz output */
 | 
			
		||||
#define BOARD_XOSC32K_EN1K      FALSE     /* No 1KHz output */
 | 
			
		||||
#define BOARD_XOSC32K_HIGHSPEED TRUE      /* High speed mode */
 | 
			
		||||
#define BOARD_XOSC32K_RUNSTDBY  FALSE     /* Don't run in standby */
 | 
			
		||||
#define BOARD_XOSC32K_ONDEMAND  TRUE      /* Enable on-demand control */
 | 
			
		||||
#define BOARD_XOSC32K_CFDEN     FALSE     /* Clock failure detector not enabled */
 | 
			
		||||
#define BOARD_XOSC32K_CFDEO     FALSE     /* No clock failure event */
 | 
			
		||||
#define BOARD_XOSC32K_CALIBEN   FALSE     /* No OSCULP32K calibration */
 | 
			
		||||
#define BOARD_XOSC32K_STARTUP   0         /* Startup time: 62592us */
 | 
			
		||||
#define BOARD_XOSC32K_CALIB     0         /* Dummy OSCULP32K calibration value */
 | 
			
		||||
#define BOARD_XOSC32K_RTCSEL    0         /* RTC clock = ULP1K */
 | 
			
		||||
 | 
			
		||||
/* XOSC0 */
 | 
			
		||||
 | 
			
		||||
#define BOARD_HAVE_XOSC0        0         /* No XOSC0 clock/crystal installed */
 | 
			
		||||
#define BOARD_XOSC0_ENABLE      FALSE     /* Don't enable XOSC0 */
 | 
			
		||||
#define BOARD_XOSC0_XTALEN      FALSE     /* External clock connected */
 | 
			
		||||
#define BOARD_XOSC0_RUNSTDBY    FALSE     /* Don't run in standby */
 | 
			
		||||
#define BOARD_XOSC0_ONDEMAND    TRUE      /* Disable on-demand control */
 | 
			
		||||
#define BOARD_XOSC0_LOWGAIN     FALSE     /* Disable low buffer gain */
 | 
			
		||||
#define BOARD_XOSC0_ENALC       FALSE     /* Disable automatic loop control */
 | 
			
		||||
#define BOARD_XOSC0_CFDEN       FALSE     /* Clock failure detector not enabled */
 | 
			
		||||
#define BOARD_XOSC0_SWBEN       FALSE     /* XOSC clock switch not enabled */
 | 
			
		||||
#define BOARD_XOSC0_STARTUP     0         /* XOSC0 start-up time 31µs */
 | 
			
		||||
 | 
			
		||||
/* XOSC1 */
 | 
			
		||||
 | 
			
		||||
#define BOARD_HAVE_XOSC1        0         /* No XOSC0 clock/crystal installed */
 | 
			
		||||
#define BOARD_XOSC1_ENABLE      FALSE     /* Don't enable XOSC1 */
 | 
			
		||||
#define BOARD_XOSC1_XTALEN      TRUE      /* External crystal connected */
 | 
			
		||||
#define BOARD_XOSC1_RUNSTDBY    FALSE     /* Don't run in standby */
 | 
			
		||||
#define BOARD_XOSC1_ONDEMAND    TRUE      /* Disable on-demand control */
 | 
			
		||||
#define BOARD_XOSC1_LOWGAIN     FALSE     /* Disable low buffer gain */
 | 
			
		||||
#define BOARD_XOSC1_ENALC       FALSE     /* Disable automatic loop control */
 | 
			
		||||
#define BOARD_XOSC1_CFDEN       FALSE     /* Clock failure detector not enabled */
 | 
			
		||||
#define BOARD_XOSC1_SWBEN       FALSE     /* XOSC clock switch not enabled */
 | 
			
		||||
#define BOARD_XOSC1_STARTUP     0         /* XOSC0 start-up time 31µs */
 | 
			
		||||
 | 
			
		||||
/* GCLK */
 | 
			
		||||
 | 
			
		||||
#define BOARD_GCLK_SET1         0x0020    /* Pre-configure:  GCLK5 needed by DPLL0 */
 | 
			
		||||
#define BOARD_GCLK_SET2         0x0fdf    /* Post-configure: All GCLKs except GCLK5 */
 | 
			
		||||
 | 
			
		||||
#define BOARD_GCLK0_ENABLE      TRUE      /* Enable GCLK0 */
 | 
			
		||||
#define BOARD_GCLK0_OOV         FALSE     /* Clock output will be LOW */
 | 
			
		||||
#define BOARD_GCLK0_OE          TRUE      /* Generate output on GCLK_IO */
 | 
			
		||||
#define BOARD_GCLK0_DIVSEL      0         /* GCLK frequency is source/DIV */
 | 
			
		||||
#define BOARD_GCLK0_RUNSTDBY    FALSE     /* Don't run in standby */
 | 
			
		||||
#define BOARD_GCLK0_SOURCE      7         /* Select DPLL0 output as GCLK0 source */
 | 
			
		||||
#define BOARD_GCLK0_DIV         1         /* Division factor */
 | 
			
		||||
 | 
			
		||||
#define BOARD_GCLK1_ENABLE      TRUE      /* Enable GCLK1 */
 | 
			
		||||
#define BOARD_GCLK1_OOV         FALSE     /* Clock output will be LOW */
 | 
			
		||||
#define BOARD_GCLK1_OE          TRUE      /* Generate output on GCLK_IO */
 | 
			
		||||
#define BOARD_GCLK1_RUNSTDBY    FALSE     /* Don't run in standby */
 | 
			
		||||
#define BOARD_GCLK1_SOURCE      6         /* Select DFLL output as GCLK1 source */
 | 
			
		||||
#define BOARD_GCLK1_DIV         1         /* Division factor */
 | 
			
		||||
 | 
			
		||||
#define BOARD_GCLK2_ENABLE      FALSE     /* Don't enable GCLK2 */
 | 
			
		||||
#define BOARD_GCLK2_OOV         FALSE     /* Clock output will be LOW */
 | 
			
		||||
#define BOARD_GCLK2_OE          FALSE     /* No generator output of GCLK_IO */
 | 
			
		||||
#define BOARD_GCLK2_RUNSTDBY    FALSE     /* Don't run in standby */
 | 
			
		||||
#define BOARD_GCLK2_SOURCE      1         /* Select XOSC1 as GCLK2 source */
 | 
			
		||||
#define BOARD_GCLK2_DIV         1         /* Division factor */
 | 
			
		||||
 | 
			
		||||
#define BOARD_GCLK3_ENABLE      TRUE      /* Enable GCLK3 */
 | 
			
		||||
#define BOARD_GCLK3_OOV         FALSE     /* Clock output will be LOW */
 | 
			
		||||
#define BOARD_GCLK3_OE          FALSE     /* No generator output of GCLK_IO */
 | 
			
		||||
#define BOARD_GCLK3_RUNSTDBY    FALSE     /* Don't run in standby */
 | 
			
		||||
#ifdef CONFIG_SAME54_XPLAINED_PRO_32KHZXTAL
 | 
			
		||||
#  define BOARD_GCLK3_SOURCE    5         /* Select XOSC32K as GCLK3 source */
 | 
			
		||||
#else
 | 
			
		||||
#  define BOARD_GCLK3_SOURCE    4         /* Select OSCULP32K as GCLK3 source */
 | 
			
		||||
#endif
 | 
			
		||||
#define BOARD_GCLK3_DIV         1         /* Division factor */
 | 
			
		||||
 | 
			
		||||
#define BOARD_GCLK4_ENABLE      TRUE      /* Enable GCLK4 */
 | 
			
		||||
#define BOARD_GCLK4_OOV         FALSE     /* Clock output will be LOW */
 | 
			
		||||
#define BOARD_GCLK4_OE          TRUE      /* Generate output on GCLK_IO */
 | 
			
		||||
#define BOARD_GCLK4_RUNSTDBY    FALSE     /* Don't run in standby */
 | 
			
		||||
#define BOARD_GCLK4_SOURCE      7         /* Select DPLL0 output as GCLK4 source */
 | 
			
		||||
#define BOARD_GCLK4_DIV         1         /* Division factor */
 | 
			
		||||
 | 
			
		||||
#define BOARD_GCLK5_ENABLE      TRUE      /* Enable GCLK5 */
 | 
			
		||||
#define BOARD_GCLK5_OOV         FALSE     /* Clock output will be LOW */
 | 
			
		||||
#define BOARD_GCLK5_OE          TRUE      /* Generate output on GCLK_IO */
 | 
			
		||||
#define BOARD_GCLK5_RUNSTDBY    FALSE     /* Don't run in standby */
 | 
			
		||||
#define BOARD_GCLK5_SOURCE      6         /* Select DFLL output as GCLK5 source */
 | 
			
		||||
#define BOARD_GCLK5_DIV         24        /* Division factor */
 | 
			
		||||
 | 
			
		||||
#define BOARD_GCLK6_ENABLE      FALSE     /* Don't enable GCLK6 */
 | 
			
		||||
#define BOARD_GCLK6_OOV         FALSE     /* Clock output will be LOW */
 | 
			
		||||
#define BOARD_GCLK6_OE          FALSE     /* No generator output of GCLK_IO */
 | 
			
		||||
#define BOARD_GCLK6_RUNSTDBY    FALSE     /* Don't run in standby */
 | 
			
		||||
#define BOARD_GCLK6_SOURCE      1         /* Select XOSC1 as GCLK6 source */
 | 
			
		||||
#define BOARD_GCLK6_DIV         1         /* Division factor */
 | 
			
		||||
 | 
			
		||||
#define BOARD_GCLK7_ENABLE      FALSE     /* Don't enable GCLK7 */
 | 
			
		||||
#define BOARD_GCLK7_OOV         FALSE     /* Clock output will be LOW */
 | 
			
		||||
#define BOARD_GCLK7_OE          FALSE     /* No generator output of GCLK_IO */
 | 
			
		||||
#define BOARD_GCLK7_RUNSTDBY    FALSE     /* Don't run in standby */
 | 
			
		||||
#define BOARD_GCLK7_SOURCE      1         /* Select XOSC1 as GCLK7 source */
 | 
			
		||||
#define BOARD_GCLK7_DIV         1         /* Division factor */
 | 
			
		||||
 | 
			
		||||
#define BOARD_GCLK8_ENABLE      FALSE     /* Don't enable GCLK8 */
 | 
			
		||||
#define BOARD_GCLK8_OOV         FALSE     /* Clock output will be LOW */
 | 
			
		||||
#define BOARD_GCLK8_OE          FALSE     /* No generator output of GCLK_IO */
 | 
			
		||||
#define BOARD_GCLK8_RUNSTDBY    FALSE     /* Don't run in standby */
 | 
			
		||||
#define BOARD_GCLK8_SOURCE      1         /* Select XOSC1 as GCLK8 source */
 | 
			
		||||
#define BOARD_GCLK8_DIV         1         /* Division factor */
 | 
			
		||||
 | 
			
		||||
#define BOARD_GCLK9_ENABLE      FALSE     /* Don't enable GCLK9 */
 | 
			
		||||
#define BOARD_GCLK9_OOV         FALSE     /* Clock output will be LOW */
 | 
			
		||||
#define BOARD_GCLK9_OE          FALSE     /* No generator output of GCLK_IO */
 | 
			
		||||
#define BOARD_GCLK9_RUNSTDBY    FALSE     /* Don't run in standby */
 | 
			
		||||
#define BOARD_GCLK9_SOURCE      1         /* Select XOSC1 as GCLK9 source */
 | 
			
		||||
#define BOARD_GCLK9_DIV         1         /* Division factor */
 | 
			
		||||
 | 
			
		||||
#define BOARD_GCLK10_ENABLE     FALSE     /* Don't enable GCLK10 */
 | 
			
		||||
#define BOARD_GCLK10_OOV        FALSE     /* Clock output will be LOW */
 | 
			
		||||
#define BOARD_GCLK10_OE         FALSE     /* No generator output of GCLK_IO */
 | 
			
		||||
#define BOARD_GCLK10_RUNSTDBY   FALSE     /* Don't run in standby */
 | 
			
		||||
#define BOARD_GCLK10_SOURCE     1         /* Select XOSC1 as GCLK10 source */
 | 
			
		||||
#define BOARD_GCLK10_DIV        1         /* Division factor */
 | 
			
		||||
 | 
			
		||||
#define BOARD_GCLK11_ENABLE     FALSE     /* Don't enable GCLK11 */
 | 
			
		||||
#define BOARD_GCLK11_OOV        FALSE     /* Clock output will be LOW */
 | 
			
		||||
#define BOARD_GCLK11_OE         FALSE     /* No generator output of GCLK_IO */
 | 
			
		||||
#define BOARD_GCLK11_RUNSTDBY   FALSE     /* Don't run in standby */
 | 
			
		||||
#define BOARD_GCLK11_SOURCE     1         /* Select XOSC1 as GCLK11 source */
 | 
			
		||||
#define BOARD_GCLK11_DIV        1         /* Division factor */
 | 
			
		||||
#define BOARD_GCLK11_FREQUENCY  BOARD_XOSC1_FREQUENCY
 | 
			
		||||
 | 
			
		||||
/* FDLL */
 | 
			
		||||
 | 
			
		||||
#define BOARD_DFLL_ENABLE       TRUE      /* DFLL enable */
 | 
			
		||||
#define BOARD_DFLL_RUNSTDBY     FALSE     /* Don't run in standby */
 | 
			
		||||
#define BOARD_DFLL_ONDEMAND     FALSE     /* No n-demand control */
 | 
			
		||||
#define BOARD_DFLL_MODE         FALSE     /* Open loop mode */
 | 
			
		||||
#define BOARD_DFLL_STABLE       FALSE     /* No stable DFLL frequency */
 | 
			
		||||
#define BOARD_DFLL_LLAW         FALSE     /* Don't ose lock after wake */
 | 
			
		||||
#define BOARD_DFLL_USBCRM       TRUE      /* Use USB clock recovery mode */
 | 
			
		||||
#define BOARD_DFLL_CCDIS        TRUE      /* Chill cycle disable */
 | 
			
		||||
#define BOARD_DFLL_QLDIS        FALSE     /* No Quick Lock Disable */
 | 
			
		||||
#define BOARD_DFLL_BPLCKC       FALSE     /* No ypass coarse clock */
 | 
			
		||||
#define BOARD_DFLL_WAITLOCK     TRUE      /* Wait lock */
 | 
			
		||||
#define BOARD_DFLL_CALIBEN      FALSE     /* Don't verwrite factory calibration */
 | 
			
		||||
#define BOARD_DFLL_GCLKLOCK     FALSE     /* Don't lock the GCLK source */
 | 
			
		||||
#define BOARD_DFLL_FCALIB       128       /* Coarse calibration value (if caliben) */
 | 
			
		||||
#define BOARD_DFLL_CCALIB       (31 / 4)  /* Fine calibration value (if caliben) */
 | 
			
		||||
#define BOARD_DFLL_FSTEP        1         /* Fine maximum step */
 | 
			
		||||
#define BOARD_DFLL_CSTEP        1         /* Coarse maximum step */
 | 
			
		||||
#define BOARD_DFLL_GCLK         3         /* GCLK source (if !usbcrm && !mode) */
 | 
			
		||||
#define BOARD_DFLL_MUL          0         /* DFLL multiply factor */
 | 
			
		||||
 | 
			
		||||
/* DPLL0/1
 | 
			
		||||
 *
 | 
			
		||||
 * Fckr is the frequency of the selected reference clock reference:
 | 
			
		||||
 *
 | 
			
		||||
 *    BOARD_XOSC32K_FREQENCY,
 | 
			
		||||
 *    BOARD_XOSCn_FREQUENCY / DIV, or
 | 
			
		||||
 *    BOARD_GCLKn_FREQUENCY
 | 
			
		||||
 *
 | 
			
		||||
 * The DPLL output frequency is then given by:
 | 
			
		||||
 *
 | 
			
		||||
 *   Fdpll = Fckr * (LDR + 1 + LDRFRAC / 32)
 | 
			
		||||
 *
 | 
			
		||||
 * DPLL0:
 | 
			
		||||
 *   Fckr  = BOARD_GCLK5_FREQUENCY = BOARD_DFLL_FREQUENCY / 24 = 2MHz
 | 
			
		||||
 *   Fdpll = 2Mhz * (59 + 1 + 0 / 32) = 120MHz
 | 
			
		||||
 *
 | 
			
		||||
 * DPLL1: (not enabled)
 | 
			
		||||
 *   Fckr  = BOARD_XOSCK32_FREQUENCY = 32.768KHz
 | 
			
		||||
 *   Fdpll = 32768 * (1463 + 1 + 13/32) = 47.986 MHz
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define BOARD_DPLL0_ENABLE      TRUE      /* DPLL enable */
 | 
			
		||||
#define BOARD_DPLL0_DCOEN       FALSE     /* DCO filter enable */
 | 
			
		||||
#define BOARD_DPLL0_LBYPASS     FALSE     /* Lock bypass */
 | 
			
		||||
#define BOARD_DPLL0_WUF         FALSE     /* Wake up fast */
 | 
			
		||||
#define BOARD_DPLL0_RUNSTDBY    FALSE     /* Run in standby */
 | 
			
		||||
#define BOARD_DPLL0_ONDEMAND    FALSE     /* On demand clock activation */
 | 
			
		||||
#define BOARD_DPLL0_REFLOCK     FALSE     /* Do not lock reference clock section */
 | 
			
		||||
#define BOARD_DPLL0_REFCLK      0         /* Reference clock selection */
 | 
			
		||||
#define BOARD_DPLL0_LTIME       0         /* Lock time  */
 | 
			
		||||
#define BOARD_DPLL0_FILTER      0         /* Proportional integer filter selection */
 | 
			
		||||
#define BOARD_DPLL0_DCOFILTER   0         /* Sigma-delta DCO filter selection */
 | 
			
		||||
#define BOARD_DPLL0_GCLK        5         /* GCLK source (if refclock == 0) */
 | 
			
		||||
#define BOARD_DPLL0_GCLKLOCK    0         /* Don't lock GCLK source clock configuration */
 | 
			
		||||
#define BOARD_DPLL0_LDRFRAC     0         /* Loop divider fractional part */
 | 
			
		||||
#define BOARD_DPLL0_LDRINT      59        /* Loop divider ratio */
 | 
			
		||||
#define BOARD_DPLL0_DIV         0         /* Clock divider */
 | 
			
		||||
 | 
			
		||||
#define BOARD_DPLL1_ENABLE      FALSE     /* DPLL enable */
 | 
			
		||||
#define BOARD_DPLL1_DCOEN       FALSE     /* DCO filter enable */
 | 
			
		||||
#define BOARD_DPLL1_LBYPASS     FALSE     /* Lock bypass */
 | 
			
		||||
#define BOARD_DPLL1_WUF         FALSE     /* Wake up fast */
 | 
			
		||||
#define BOARD_DPLL1_RUNSTDBY    FALSE     /* Run in standby */
 | 
			
		||||
#define BOARD_DPLL1_ONDEMAND    FALSE     /* On demand clock activation */
 | 
			
		||||
#define BOARD_DPLL1_REFLOCK     FALSE     /* Do not lock reference clock section */
 | 
			
		||||
#define BOARD_DPLL1_REFCLK      1         /* Reference clock = XOSCK32 */
 | 
			
		||||
#define BOARD_DPLL1_LTIME       0         /* Lock time  */
 | 
			
		||||
#define BOARD_DPLL1_FILTER      0         /* Sigma-delta DCO filter selection */
 | 
			
		||||
#define BOARD_DPLL1_DCOFILTER   0         /* Sigma-delta DCO filter selection */
 | 
			
		||||
#define BOARD_DPLL1_GCLK        0         /* GCLK source (if refclock == 0) */
 | 
			
		||||
#define BOARD_DPLL1_GCLKLOCK    0         /* Don't lock GCLK source clock configuration */
 | 
			
		||||
#define BOARD_DPLL1_LDRFRAC     13        /* Loop divider fractional part */
 | 
			
		||||
#define BOARD_DPLL1_LDRINT      1463      /* Loop divider ratio */
 | 
			
		||||
#define BOARD_DPLL1_DIV         0         /* Clock divider */
 | 
			
		||||
 | 
			
		||||
/* Master Clock (MCLK)
 | 
			
		||||
 *
 | 
			
		||||
 * GCLK0 is always the direct source the GCLK_MAIN.
 | 
			
		||||
 * CPU frequency = 120MHz / 1 = 120MHz
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define BOARD_MCLK_CPUDIV       1         /* MCLK divider to get CPU frequency */
 | 
			
		||||
 | 
			
		||||
#define BOARD_MCK_FREQUENCY     BOARD_GCLK0_FREQUENCY
 | 
			
		||||
 | 
			
		||||
/* Peripheral clocking */
 | 
			
		||||
 | 
			
		||||
#define BOARD_GCLK_EIC          4         /* EIC GCLK index */
 | 
			
		||||
 | 
			
		||||
/* FLASH wait states
 | 
			
		||||
 *
 | 
			
		||||
 * Vdd Range Wait states Maximum Operating Frequency
 | 
			
		||||
 * --------- ----------- ---------------------------
 | 
			
		||||
 * > 2.7V    0            24 MHz
 | 
			
		||||
 *           1            51 MHz
 | 
			
		||||
 *           2            77 MHz
 | 
			
		||||
 *           3           101 MHz
 | 
			
		||||
 *           4           119 MHz
 | 
			
		||||
 *           5           120 MHz
 | 
			
		||||
 * >1.71V    0            22 MHz
 | 
			
		||||
 *           1            44 MHz
 | 
			
		||||
 *           2            67 MHz
 | 
			
		||||
 *           3            89 MHz
 | 
			
		||||
 *           4           111 MHz
 | 
			
		||||
 *           5           120 MHz
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define BOARD_FLASH_WAITSTATES  6
 | 
			
		||||
 | 
			
		||||
/* LED definitions **********************************************************/
 | 
			
		||||
 | 
			
		||||
/* LEDs
 | 
			
		||||
 *
 | 
			
		||||
 *   The SAME54 Xplained Pro has three LEDs,
 | 
			
		||||
 *   but only one is controllable by software:
 | 
			
		||||
 *
 | 
			
		||||
 *   1. LED0 near the edge of the board
 | 
			
		||||
 *
 | 
			
		||||
 *
 | 
			
		||||
 *   ----------------- -----------
 | 
			
		||||
 *   SAMD5E5           FUNCTION
 | 
			
		||||
 *   ----------------- -----------
 | 
			
		||||
 *   PC18              GPIO output
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/* LED index values for use with board_userled() */
 | 
			
		||||
 | 
			
		||||
#define BOARD_LED0        0
 | 
			
		||||
#define BOARD_NLEDS       1
 | 
			
		||||
 | 
			
		||||
/* LED bits for use with board_userled_all() */
 | 
			
		||||
 | 
			
		||||
#define BOARD_LED0_BIT     (1 << BOARD_LED0)
 | 
			
		||||
 | 
			
		||||
/* This LED is not used by the board port unless CONFIG_ARCH_LEDS is
 | 
			
		||||
 * defined.  In that case, the usage by the board port is defined in
 | 
			
		||||
 * include/board.h and src/sam_autoleds.c. The LEDs are used to encode
 | 
			
		||||
 * OS-related events as follows:
 | 
			
		||||
 *
 | 
			
		||||
 *   ------------------- ---------------------------- ------
 | 
			
		||||
 *   SYMBOL                  Meaning                  LED
 | 
			
		||||
 *   ------------------- ---------------------------- ------
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define LED_STARTED      0 /* NuttX has been started  OFF      */
 | 
			
		||||
#define LED_HEAPALLOCATE 0 /* Heap has been allocated OFF      */
 | 
			
		||||
#define LED_IRQSENABLED  0 /* Interrupts enabled      OFF      */
 | 
			
		||||
#define LED_STACKCREATED 1 /* Idle stack created      ON       */
 | 
			
		||||
#define LED_INIRQ        2 /* In an interrupt         N/C      */
 | 
			
		||||
#define LED_SIGNAL       2 /* In a signal handler     N/C      */
 | 
			
		||||
#define LED_ASSERTION    2 /* An assertion failed     N/C      */
 | 
			
		||||
#define LED_PANIC        3 /* The system has crashed  FLASH    */
 | 
			
		||||
#undef  LED_IDLE           /* MCU is is sleep mode    Not used */
 | 
			
		||||
 | 
			
		||||
/* Thus is LED is statically on, NuttX has successfully  booted and is,
 | 
			
		||||
 * apparently, running normally.  If LED is flashing at approximately
 | 
			
		||||
 * 2Hz, then a fatal error has been detected and the system has halted.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/* Alternate function pin selections ****************************************/
 | 
			
		||||
 | 
			
		||||
/* SERCOM definitions *******************************************************/
 | 
			
		||||
 | 
			
		||||
/* The SERCOM bus clock (CLK_SERCOMx_APB) can be enabled and disabled in the
 | 
			
		||||
 * Main Clock Controller.
 | 
			
		||||
 * The SERCOM uses two generic clocks:
 | 
			
		||||
 * GCLK_SERCOMN_CORE and GCLK_SERCOM_SLOW.
 | 
			
		||||
 * The core clock (GCLK_SERCOMx_CORE) is required to clock the SERCOM while
 | 
			
		||||
 * working as a master.  The slow clock (GCLK_SERCOM_SLOW) is only  required
 | 
			
		||||
 * for certain functions and is common to all SERCOM modules.
 | 
			
		||||
 *
 | 
			
		||||
 * These clocks must be configured and enabled in the Generic Clock
 | 
			
		||||
 * Controller (GCLK) before using the SERCOM.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define BOARD_SERCOM_SLOWGEN         3                   /* 32.768KHz, common to all SERCOMS */
 | 
			
		||||
#define BOARD_SERCOM_SLOWLOCK        FALSE               /* Don't lock the SLOWCLOCK */
 | 
			
		||||
#define BOARD_SLOWCLOCK_FREQUENCY    BOARD_GCLK3_FREQUENCY
 | 
			
		||||
 | 
			
		||||
/* SERCOM2
 | 
			
		||||
 *
 | 
			
		||||
 * Built-in virtual COM port using the EDBG chip on the board.
 | 
			
		||||
 * DTR must be asserted by your console software in order to enable this
 | 
			
		||||
 * port.
 | 
			
		||||
 *
 | 
			
		||||
 *   ----------------- ---------
 | 
			
		||||
 *   SAMD5E5           FUNCTION
 | 
			
		||||
 *   ----------------- ---------
 | 
			
		||||
 *   PB24 SERCOM2 PAD1 RXD
 | 
			
		||||
 *   PB25 SERCOM2 PAD0 TXD
 | 
			
		||||
 *
 | 
			
		||||
 * NOTES:
 | 
			
		||||
 *   USART_CTRLA_TXPAD0_2: TxD=PAD0 XCK=N/A RTS/TE=PAD2 CTS=PAD3
 | 
			
		||||
 *   USART_CTRLA_RXPAD1:   RxD=PAD1
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define BOARD_SERCOM2_MUXCONFIG      (USART_CTRLA_TXPAD0_2 | USART_CTRLA_RXPAD1)
 | 
			
		||||
#define BOARD_SERCOM2_PINMAP_PAD0    PORT_SERCOM2_PAD0_4 /* PAD0: USART TX */
 | 
			
		||||
#define BOARD_SERCOM2_PINMAP_PAD1    PORT_SERCOM2_PAD1_4 /* PAD1: USART RX */
 | 
			
		||||
#define BOARD_SERCOM2_PINMAP_PAD2    0                   /* PAD2: (not used) */
 | 
			
		||||
#define BOARD_SERCOM2_PINMAP_PAD3    0                   /* PAD3: (not used) */
 | 
			
		||||
 | 
			
		||||
#define BOARD_TXIRQ_SERCOM2          SAM_IRQ_SERCOM2_0   /* INTFLAG[0] DRE */
 | 
			
		||||
#define BOARD_RXIRQ_SERCOM2          SAM_IRQ_SERCOM2_2   /* INTFLAG[2] RXC */
 | 
			
		||||
 | 
			
		||||
#define BOARD_SERCOM2_COREGEN        1                   /* 48MHz Core clock */
 | 
			
		||||
#define BOARD_SERCOM2_CORELOCK       FALSE               /* Don't lock the CORECLOCK */
 | 
			
		||||
#define BOARD_SERCOM2_FREQUENCY      BOARD_GCLK1_FREQUENCY
 | 
			
		||||
 | 
			
		||||
/* SERCOM3
 | 
			
		||||
 *
 | 
			
		||||
 * An external RS-232 or serial-to-USB adapter can be connected on pins PA22
 | 
			
		||||
 * and PA23:
 | 
			
		||||
 *
 | 
			
		||||
 *   ----------------- ---------
 | 
			
		||||
 *   SAMD5E5           FUNCTION
 | 
			
		||||
 *   ----------------- ---------
 | 
			
		||||
 *   PA23 SERCOM3 PAD1 RXD
 | 
			
		||||
 *   PA22 SERCOM3 PAD0 TXD
 | 
			
		||||
 *
 | 
			
		||||
 * NOTES:
 | 
			
		||||
 *   USART_CTRLA_TXPAD0_2: TxD=PAD0 XCK=N/A RTS/TE=PAD2 CTS=PAD3
 | 
			
		||||
 *   USART_CTRLA_RXPAD1:   RxD=PAD1
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define BOARD_SERCOM3_MUXCONFIG      (USART_CTRLA_TXPAD0_2 | USART_CTRLA_RXPAD1)
 | 
			
		||||
#define BOARD_SERCOM3_PINMAP_PAD0    PORT_SERCOM3_PAD0_1 /* PAD0: USART TX */
 | 
			
		||||
#define BOARD_SERCOM3_PINMAP_PAD1    PORT_SERCOM3_PAD1_1 /* PAD1: USART RX */
 | 
			
		||||
#define BOARD_SERCOM3_PINMAP_PAD2    0                   /* PAD2: (not used) */
 | 
			
		||||
#define BOARD_SERCOM3_PINMAP_PAD3    0                   /* PAD3: (not used) */
 | 
			
		||||
 | 
			
		||||
#define BOARD_TXIRQ_SERCOM3          SAM_IRQ_SERCOM3_0   /* INTFLAG[0] DRE */
 | 
			
		||||
#define BOARD_RXIRQ_SERCOM3          SAM_IRQ_SERCOM3_2   /* INTFLAG[2] RXC */
 | 
			
		||||
 | 
			
		||||
#define BOARD_SERCOM3_COREGEN        1                   /* 48MHz Core clock */
 | 
			
		||||
#define BOARD_SERCOM3_CORELOCK       FALSE               /* Don't lock the CORECLOCK */
 | 
			
		||||
#define BOARD_SERCOM3_FREQUENCY      BOARD_GCLK1_FREQUENCY
 | 
			
		||||
 | 
			
		||||
/* USB */
 | 
			
		||||
 | 
			
		||||
#define BOARD_USB_GCLKGEN            1                   /* GCLK1, 48MHz */
 | 
			
		||||
 | 
			
		||||
/* Ethernet */
 | 
			
		||||
 | 
			
		||||
#define BOARD_GMAC_GMDC    PORT_GMAC_GMDC_3
 | 
			
		||||
#define BOARD_GMAC_GMDIO   PORT_GMAC_GMDIO_3
 | 
			
		||||
 | 
			
		||||
#endif /* __BOARDS_ARM_SAMD5E5_SAME54_XPLAINED_PRO_INCLUDE_BOARD_H */
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,78 @@
 | 
			
		|||
############################################################################
 | 
			
		||||
# boards/arm/samd5e5/same54-xplained-pro/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/armv7-m/Toolchain.defs
 | 
			
		||||
 | 
			
		||||
ifeq ($(CONFIG_SAME54_XPLAINED_PRO_RUNFROMFLASH),y)
 | 
			
		||||
  LDSCRIPT = flash.ld
 | 
			
		||||
else ifeq ($(CONFIG_SAME54_XPLAINED_PRO_RUNFROMSRAM),y)
 | 
			
		||||
  LDSCRIPT = sram.ld
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
ifeq ($(CONFIG_CYGWIN_WINTOOL),y)
 | 
			
		||||
  ARCHSCRIPT = -T "${shell cygpath -w $(BOARD_DIR)$(DELIM)scripts$(DELIM)$(LDSCRIPT)}"
 | 
			
		||||
else
 | 
			
		||||
  ARCHSCRIPT = -T$(BOARD_DIR)$(DELIM)scripts$(DELIM)$(LDSCRIPT)
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
ifeq ($(CONFIG_DEBUG_SYMBOLS),y)
 | 
			
		||||
  ARCHOPTIMIZATION = -g
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
ifneq ($(CONFIG_DEBUG_NOOPT),y)
 | 
			
		||||
  ARCHOPTIMIZATION += $(MAXOPTIMIZATION) -fno-strict-aliasing -fno-strength-reduce -fomit-frame-pointer
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
ARCHCFLAGS = -fno-builtin
 | 
			
		||||
ARCHCXXFLAGS = -fno-builtin -fno-exceptions -fcheck-new -fno-rtti
 | 
			
		||||
ARCHWARNINGS = -Wall -Wstrict-prototypes -Wshadow -Wundef
 | 
			
		||||
ARCHWARNINGSXX = -Wall -Wshadow -Wundef
 | 
			
		||||
ARCHPICFLAGS = -fpic -msingle-pic-base -mpic-register=r10
 | 
			
		||||
 | 
			
		||||
CFLAGS := $(ARCHCFLAGS) $(ARCHWARNINGS) $(ARCHOPTIMIZATION) $(ARCHCPUFLAGS) $(ARCHINCLUDES) $(ARCHDEFINES) $(EXTRAFLAGS) -pipe
 | 
			
		||||
CPICFLAGS = $(ARCHPICFLAGS) $(CFLAGS)
 | 
			
		||||
CXXFLAGS := $(ARCHCXXFLAGS) $(ARCHWARNINGSXX) $(ARCHOPTIMIZATION) $(ARCHCPUFLAGS) $(ARCHXXINCLUDES) $(ARCHDEFINES) $(EXTRAFLAGS) -pipe
 | 
			
		||||
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
 | 
			
		||||
 | 
			
		||||
# Loadable module definitions
 | 
			
		||||
 | 
			
		||||
CMODULEFLAGS = $(CFLAGS) -mlong-calls # --target1-abs
 | 
			
		||||
 | 
			
		||||
LDMODULEFLAGS = -r -e module_initialize
 | 
			
		||||
ifeq ($(CONFIG_CYGWIN_WINTOOL),y)
 | 
			
		||||
  LDMODULEFLAGS += -T "${shell cygpath -w $(TOPDIR)/libs/libc/modlib/gnu-elf.ld}"
 | 
			
		||||
else
 | 
			
		||||
  LDMODULEFLAGS += -T $(TOPDIR)/libs/libc/modlib/gnu-elf.ld
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
ifneq ($(CROSSDEV),arm-nuttx-elf-)
 | 
			
		||||
  LDFLAGS += -nostartfiles -nodefaultlibs
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(CONFIG_DEBUG_SYMBOLS),y)
 | 
			
		||||
  LDFLAGS += -g
 | 
			
		||||
endif
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,108 @@
 | 
			
		|||
/****************************************************************************
 | 
			
		||||
 * boards/arm/samd5e5/same54-xplained-pro/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 ATSAME54P20A has 1024Kb of FLASH beginning at address 0x0000:0000 and
 | 
			
		||||
 * 256Kb of SRAM at address 0x2000:0000.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
MEMORY
 | 
			
		||||
{
 | 
			
		||||
  flash (rx) : ORIGIN = 0x00000000, LENGTH = 1024K
 | 
			
		||||
  sram (rwx) : ORIGIN = 0x20000000, LENGTH = 256K
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
OUTPUT_ARCH(arm)
 | 
			
		||||
ENTRY(_stext)
 | 
			
		||||
EXTERN(_vectors)
 | 
			
		||||
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(.);
 | 
			
		||||
        *(.init_array .init_array.*)
 | 
			
		||||
        _einit = ABSOLUTE(.);
 | 
			
		||||
    } > flash
 | 
			
		||||
 | 
			
		||||
    .ARM.extab :
 | 
			
		||||
    {
 | 
			
		||||
        *(.ARM.extab*)
 | 
			
		||||
    } > flash
 | 
			
		||||
 | 
			
		||||
    __exidx_start = ABSOLUTE(.);
 | 
			
		||||
    .ARM.exidx :
 | 
			
		||||
    {
 | 
			
		||||
        *(.ARM.exidx*)
 | 
			
		||||
    } > flash
 | 
			
		||||
    __exidx_end = ABSOLUTE(.);
 | 
			
		||||
 | 
			
		||||
    _eronly = ABSOLUTE(.);
 | 
			
		||||
 | 
			
		||||
    .data :
 | 
			
		||||
    {
 | 
			
		||||
        _sdata = ABSOLUTE(.);
 | 
			
		||||
        *(.data .data.*)
 | 
			
		||||
        *(.gnu.linkonce.d.*)
 | 
			
		||||
        CONSTRUCTORS
 | 
			
		||||
        . = ALIGN(4);
 | 
			
		||||
        _edata = ABSOLUTE(.);
 | 
			
		||||
    } > sram AT > flash
 | 
			
		||||
 | 
			
		||||
    .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) }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,60 @@
 | 
			
		|||
/****************************************************************************
 | 
			
		||||
 * boards/arm/samd5e5/same54-xplained-pro/scripts/nvm.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 <stdio.h>
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Private Data
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
static const uint8_t nvm[20] =
 | 
			
		||||
{
 | 
			
		||||
  0x14,                                           /* Count 20 bytes */
 | 
			
		||||
  0x80, 0x40, 0x00,                               /* 24-address : 804000 */
 | 
			
		||||
  0x39, 0x92, 0x9a, 0xfe, 0x80, 0xff, 0xec, 0xae, /* 16-bytes of NVM data */
 | 
			
		||||
  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Public Functions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
int main(int argc, char **argv)
 | 
			
		||||
{
 | 
			
		||||
  unsigned int csum;
 | 
			
		||||
  int i;
 | 
			
		||||
 | 
			
		||||
  printf("S2");
 | 
			
		||||
 | 
			
		||||
  for (i = 0, csum = 0; i < 20; i++)
 | 
			
		||||
    {
 | 
			
		||||
      csum += nvm[i];
 | 
			
		||||
      printf("%02X", (unsigned int)nvm[i]);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  printf("%02X\r\n", ~csum & 0xff);
 | 
			
		||||
  printf("S9030000FC\r\n");
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,2 @@
 | 
			
		|||
S21480400039929AFE80FFECAEFFFFFFFFFFFFFFFFB7
 | 
			
		||||
S9030000FC
 | 
			
		||||
Some files were not shown because too many files have changed in this diff Show More
		Loading…
	
		Reference in New Issue