forked from xuos/xiuos
add nuttx for develop
This commit is contained in:
commit
36f3e40c55
|
@ -1,7 +1,7 @@
|
|||
SRC_DIR := switch_api posix_support
|
||||
SRC_DIR := posix_support
|
||||
|
||||
# # ifeq ($(CONFIG_SEPARATE_COMPILE),y)
|
||||
# SRC_DIR += switch_api
|
||||
# # endif
|
||||
ifeq ($(CONFIG_SEPARATE_COMPILE),y)
|
||||
SRC_DIR += switch_api
|
||||
endif
|
||||
|
||||
include $(KERNEL_ROOT)/compiler.mk
|
|
@ -1,4 +0,0 @@
|
|||
config POSIX_API
|
||||
bool "support posix api"
|
||||
default n
|
||||
|
|
@ -1,21 +1,3 @@
|
|||
# ifeq ($(CONFIG_POSIX_API),y)
|
||||
# SRC_FILES += pthread.c
|
||||
|
||||
# ifeq ($(CONFIG_KERNEL_SEMAPHORE),y)
|
||||
# SRC_FILES += semaphore.c
|
||||
# endif
|
||||
|
||||
# ifeq ($(CONFIG_KERNEL_MUTEX),y)
|
||||
# SRC_FILES += pthread_mutex.c
|
||||
# endif
|
||||
|
||||
# ifeq ($(CONFIG_KERNEL_MESSAGEQUEUE),y)
|
||||
# SRC_FILES += mqueue.c
|
||||
# endif
|
||||
# else
|
||||
# SRC_FILES :=
|
||||
# endif
|
||||
|
||||
SRC_FILES := pthread.c semaphore.c pthread_mutex.c mqueue.c
|
||||
|
||||
|
||||
|
|
|
@ -1,3 +1,3 @@
|
|||
SRC_FILES := stdio.c fs_syscalls.c mem_syscalls.c
|
||||
SRC_FILES := fs_syscalls.c mem_syscalls.c
|
||||
|
||||
include $(KERNEL_ROOT)/compiler.mk
|
||||
|
|
|
@ -1,155 +0,0 @@
|
|||
/*
|
||||
* Copyright (c) 2006-2018, RT-Thread Development Team
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
* 2017/10/15 bernard the first version
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file stdio.c
|
||||
* @brief support newlib stdio
|
||||
* @version 1.0
|
||||
* @author AIIT XUOS Lab
|
||||
* @date 2021-04-25
|
||||
*/
|
||||
|
||||
/*************************************************
|
||||
File name: stdio.c
|
||||
Description: support newlib stdio
|
||||
Others: take RT-Thread v4.0.2/components/libc/compilers/newlib/stdio.c for references
|
||||
https://github.com/RT-Thread/rt-thread/tree/v4.0.2
|
||||
History:
|
||||
1. Date: 2021-04-25
|
||||
Author: AIIT XUOS Lab
|
||||
Modification: Use set and get console functions
|
||||
*************************************************/
|
||||
|
||||
#include <libc.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#define STDIO_DEVICE_NAME_MAX 32
|
||||
|
||||
static FILE* std_console = NULL;
|
||||
|
||||
/**
|
||||
* This function will set system console device.
|
||||
*
|
||||
* @param device_name the name of device
|
||||
* @param mode the mode
|
||||
*
|
||||
* @return file number on success; or -1 on failure
|
||||
*/
|
||||
int LibcStdioSetConsole(const char* device_name, int mode)
|
||||
{
|
||||
FILE *fp;
|
||||
char name[STDIO_DEVICE_NAME_MAX];
|
||||
char *file_mode;
|
||||
|
||||
snprintf(name, sizeof(name) - 1, "/dev/%s", device_name);
|
||||
name[STDIO_DEVICE_NAME_MAX - 1] = '\0';
|
||||
|
||||
switch (mode)
|
||||
{
|
||||
case O_RDWR:
|
||||
file_mode = "r+";
|
||||
break;
|
||||
|
||||
case O_WRONLY:
|
||||
file_mode = "wb";
|
||||
break;
|
||||
|
||||
default:
|
||||
file_mode = "rb";
|
||||
break;
|
||||
}
|
||||
|
||||
/* try to open file */
|
||||
fp = fopen(name, file_mode);
|
||||
if (fp)
|
||||
{
|
||||
/* set the fp buffer */
|
||||
setvbuf(fp, NULL, _IONBF, 0);
|
||||
|
||||
if (std_console)
|
||||
/* try to close console device */
|
||||
fclose(std_console);
|
||||
std_console = fp;
|
||||
|
||||
if (mode == O_RDWR)
|
||||
{
|
||||
/* set _stdin as std_console */
|
||||
_GLOBAL_REENT->_stdin = std_console;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* set NULL */
|
||||
_GLOBAL_REENT->_stdin = NULL;
|
||||
}
|
||||
|
||||
if (mode == O_RDONLY)
|
||||
{
|
||||
/* set the _stdout as NULL */
|
||||
_GLOBAL_REENT->_stdout = NULL;
|
||||
/* set the _stderr as NULL */
|
||||
_GLOBAL_REENT->_stderr = NULL;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* set the _stdout as std_console */
|
||||
_GLOBAL_REENT->_stdout = std_console;
|
||||
/* set the _stderr as std_console */
|
||||
_GLOBAL_REENT->_stderr = std_console;
|
||||
}
|
||||
/* set the __sdidinit as 1 */
|
||||
_GLOBAL_REENT->__sdidinit = 1;
|
||||
}
|
||||
|
||||
if (std_console)
|
||||
/* return the file number */
|
||||
return fileno(std_console);
|
||||
/* failure and return -1 */
|
||||
return -1;
|
||||
}
|
||||
|
||||
/**
|
||||
* This function will get system console device.
|
||||
*
|
||||
* @return file number on success; or -1 on failure
|
||||
*/
|
||||
int LibcStdioGetConsole(void) {
|
||||
if (std_console)
|
||||
/* return the file number */
|
||||
return fileno(std_console);
|
||||
else
|
||||
/* failure and return -1 */
|
||||
return -1;
|
||||
}
|
||||
|
||||
/**
|
||||
* This function will initialize the c library system.
|
||||
*
|
||||
* @return 0
|
||||
*/
|
||||
int LibcSystemInit(void)
|
||||
{
|
||||
#if defined(KERNEL_CONSOLE)
|
||||
HardwareDevType console;
|
||||
/* try to get console device */
|
||||
console = ObtainConsole();
|
||||
if (console)
|
||||
{
|
||||
#if defined(LIB_POSIX)
|
||||
/* set console device mode */
|
||||
LibcStdioSetConsole(console->dev_name, O_RDWR);
|
||||
#else
|
||||
/* set console device mode */
|
||||
LibcStdioSetConsole(console->dev_name, O_WRONLY);
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
return 0;
|
||||
}
|
|
@ -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"
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue