From badc0f9a98de8f063f9599ee78932cd802d93499 Mon Sep 17 00:00:00 2001 From: lady ada Date: Sat, 10 Apr 2021 21:26:28 -0400 Subject: [PATCH 1/7] add rotary trinkey rev B --- boards.txt | 47 ++++ .../bootloader-rotarytrinkey_m0.bin | Bin 0 -> 8192 bytes .../debug_scripts/variant.gdb | 31 +++ .../gcc/flash_with_bootloader.ld | 216 ++++++++++++++++++ .../gcc/flash_without_bootloader.ld | 214 +++++++++++++++++ .../openocd_scripts/rotarytrinkey_m0.cfg | 28 +++ variants/rotarytrinkey_m0/pins_arduino.h | 21 ++ variants/rotarytrinkey_m0/variant.cpp | 68 ++++++ variants/rotarytrinkey_m0/variant.h | 182 +++++++++++++++ 9 files changed, 807 insertions(+) create mode 100644 bootloaders/rotarytrinkey_m0/bootloader-rotarytrinkey_m0.bin create mode 100644 variants/rotarytrinkey_m0/debug_scripts/variant.gdb create mode 100644 variants/rotarytrinkey_m0/linker_scripts/gcc/flash_with_bootloader.ld create mode 100644 variants/rotarytrinkey_m0/linker_scripts/gcc/flash_without_bootloader.ld create mode 100644 variants/rotarytrinkey_m0/openocd_scripts/rotarytrinkey_m0.cfg create mode 100644 variants/rotarytrinkey_m0/pins_arduino.h create mode 100644 variants/rotarytrinkey_m0/variant.cpp create mode 100644 variants/rotarytrinkey_m0/variant.h diff --git a/boards.txt b/boards.txt index 64b317d94..ca652fa9f 100644 --- a/boards.txt +++ b/boards.txt @@ -426,6 +426,53 @@ adafruit_neotrinkey_m0.menu.debug.off=Off adafruit_neotrinkey_m0.menu.debug.on=On adafruit_neotrinkey_m0.menu.debug.on.build.flags.debug=-g +# Adafruit Rotary Trinkey (SAMD21) +# ------------------------------ +adafruit_rotarytrinkey_m0.name=Adafruit Rotary Trinkey (SAMD21) +adafruit_rotarytrinkey_m0.vid.0=0x239A +adafruit_rotarytrinkey_m0.pid.0=0x80FB +adafruit_rotarytrinkey_m0.vid.1=0x239A +adafruit_rotarytrinkey_m0.pid.1=0x00FB +adafruit_rotarytrinkey_m0.vid.1=0x239A +adafruit_rotarytrinkey_m0.pid.1=0x00FC +adafruit_rotarytrinkey_m0.upload.tool=bossac +adafruit_rotarytrinkey_m0.upload.protocol=sam-ba +adafruit_rotarytrinkey_m0.upload.maximum_size=262144 +adafruit_rotarytrinkey_m0.upload.offset=0x2000 +adafruit_rotarytrinkey_m0.upload.use_1200bps_touch=true +adafruit_rotarytrinkey_m0.upload.wait_for_upload_port=true +adafruit_rotarytrinkey_m0.upload.native_usb=true +adafruit_rotarytrinkey_m0.build.mcu=cortex-m0plus +adafruit_rotarytrinkey_m0.build.f_cpu=48000000L +adafruit_rotarytrinkey_m0.build.usb_product="Rotary Trinkey M0" +adafruit_rotarytrinkey_m0.build.usb_manufacturer="Adafruit" +adafruit_rotarytrinkey_m0.build.board=ROTARYTRINKEY_M0 +adafruit_rotarytrinkey_m0.build.core=arduino +adafruit_rotarytrinkey_m0.build.extra_flags=-DCRYSTALLESS -DADAFRUIT_ROTARYTRINKEY_M0 -D__SAMD21E18A__ -DARM_MATH_CM0PLUS {build.usb_flags} +adafruit_rotarytrinkey_m0.build.ldscript=linker_scripts/gcc/flash_with_bootloader.ld +adafruit_rotarytrinkey_m0.build.openocdscript=openocd_scripts/rotarytrinkey_m0.cfg +adafruit_rotarytrinkey_m0.build.variant=rotarytrinkey_m0 +adafruit_rotarytrinkey_m0.build.variant_system_lib= +adafruit_rotarytrinkey_m0.build.vid=0x239A +adafruit_rotarytrinkey_m0.build.pid=0x80FB +adafruit_rotarytrinkey_m0.bootloader.tool=openocd +adafruit_rotarytrinkey_m0.bootloader.file=rotarytrinkey_m0/bootloader-rotarytrinkey_m0.bin +adafruit_rotarytrinkey_m0.menu.opt.small=Small (-Os) (standard) +adafruit_rotarytrinkey_m0.menu.opt.small.build.flags.optimize=-Os +adafruit_rotarytrinkey_m0.menu.opt.fast=Fast (-O2) +adafruit_rotarytrinkey_m0.menu.opt.fast.build.flags.optimize=-O2 +adafruit_rotarytrinkey_m0.menu.opt.faster=Faster (-O3) +adafruit_rotarytrinkey_m0.menu.opt.faster.build.flags.optimize=-O3 +adafruit_rotarytrinkey_m0.menu.opt.fastest=Fastest (-Ofast) +adafruit_rotarytrinkey_m0.menu.opt.fastest.build.flags.optimize=-Ofast +adafruit_rotarytrinkey_m0.menu.opt.dragons=Here be dragons (-Ofast -funroll-loops) +adafruit_rotarytrinkey_m0.menu.opt.dragons.build.flags.optimize=-Ofast -funroll-loops +adafruit_rotarytrinkey_m0.menu.usbstack.arduino=Arduino +adafruit_rotarytrinkey_m0.menu.usbstack.tinyusb=TinyUSB +adafruit_rotarytrinkey_m0.menu.usbstack.tinyusb.build.flags.usbstack=-DUSE_TINYUSB +adafruit_rotarytrinkey_m0.menu.debug.off=Off +adafruit_rotarytrinkey_m0.menu.debug.on=On +adafruit_rotarytrinkey_m0.menu.debug.on.build.flags.debug=-g # Adafruit ItsyBitsy M0 (SAMD21) # ------------------------------ diff --git a/bootloaders/rotarytrinkey_m0/bootloader-rotarytrinkey_m0.bin b/bootloaders/rotarytrinkey_m0/bootloader-rotarytrinkey_m0.bin new file mode 100644 index 0000000000000000000000000000000000000000..b879d7ef8c4b90f3e7c7cd752332534be03fd332 GIT binary patch literal 8192 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 FLASH + + .ARM.extab : + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } > FLASH + + __exidx_start = .; + .ARM.exidx : + { + *(.ARM.exidx* .gnu.linkonce.armexidx.*) + } > FLASH + __exidx_end = .; + + /* To copy multiple ROM to RAM sections, + * uncomment .copy.table section and, + * define __STARTUP_COPY_MULTIPLE in startup_ARMCMx.S */ + /* + .copy.table : + { + . = ALIGN(4); + __copy_table_start__ = .; + LONG (__etext) + LONG (__data_start__) + LONG (__data_end__ - __data_start__) + LONG (__etext2) + LONG (__data2_start__) + LONG (__data2_end__ - __data2_start__) + __copy_table_end__ = .; + } > FLASH + */ + + /* To clear multiple BSS sections, + * uncomment .zero.table section and, + * define __STARTUP_CLEAR_BSS_MULTIPLE in startup_ARMCMx.S */ + /* + .zero.table : + { + . = ALIGN(4); + __zero_table_start__ = .; + LONG (__bss_start__) + LONG (__bss_end__ - __bss_start__) + LONG (__bss2_start__) + LONG (__bss2_end__ - __bss2_start__) + __zero_table_end__ = .; + } > FLASH + */ + + __etext = .; + + .data : AT (__etext) + { + __data_start__ = .; + *(vtable) + *(.data*) + + . = ALIGN(4); + /* preinit data */ + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP(*(.preinit_array)) + PROVIDE_HIDDEN (__preinit_array_end = .); + + . = ALIGN(4); + /* init data */ + PROVIDE_HIDDEN (__init_array_start = .); + KEEP(*(SORT(.init_array.*))) + KEEP(*(.init_array)) + PROVIDE_HIDDEN (__init_array_end = .); + + + . = ALIGN(4); + /* finit data */ + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP(*(SORT(.fini_array.*))) + KEEP(*(.fini_array)) + PROVIDE_HIDDEN (__fini_array_end = .); + + KEEP(*(.jcr*)) + . = ALIGN(16); + /* All data end */ + __data_end__ = .; + + } > RAM + + .bss : + { + . = ALIGN(4); + __bss_start__ = .; + *(.bss*) + *(COMMON) + . = ALIGN(4); + __bss_end__ = .; + } > RAM + + .heap (COPY): + { + __end__ = .; + PROVIDE(end = .); + *(.heap*) + __HeapLimit = .; + } > RAM + + /* .stack_dummy section doesn't contains any symbols. It is only + * used for linker to calculate size of stack sections, and assign + * values to stack symbols later */ + .stack_dummy (COPY): + { + *(.stack*) + } > RAM + + /* Set stack top to end of RAM, and stack limit move down by + * size of stack_dummy section */ + __StackTop = ORIGIN(RAM) + LENGTH(RAM); + __StackLimit = __StackTop - SIZEOF(.stack_dummy); + PROVIDE(__stack = __StackTop); + + __ram_end__ = ORIGIN(RAM) + LENGTH(RAM) -1 ; + + /* Check if data + heap + stack exceeds RAM limit */ + ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack") +} diff --git a/variants/rotarytrinkey_m0/linker_scripts/gcc/flash_without_bootloader.ld b/variants/rotarytrinkey_m0/linker_scripts/gcc/flash_without_bootloader.ld new file mode 100644 index 000000000..ebeeee37f --- /dev/null +++ b/variants/rotarytrinkey_m0/linker_scripts/gcc/flash_without_bootloader.ld @@ -0,0 +1,214 @@ +/* + Copyright (c) 2014-2015 Arduino LLC. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +/* Linker script to configure memory regions. + * Need modifying for a specific board. + * FLASH.ORIGIN: starting address of flash + * FLASH.LENGTH: length of flash + * RAM.ORIGIN: starting address of RAM bank 0 + * RAM.LENGTH: length of RAM bank 0 + */ +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00040000 + RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00008000 +} + +/* Linker script to place sections and symbol values. Should be used together + * with other linker script that defines memory regions FLASH and RAM. + * It references following symbols, which must be defined in code: + * Reset_Handler : Entry of reset handler + * + * It defines following symbols, which code can use without definition: + * __exidx_start + * __exidx_end + * __copy_table_start__ + * __copy_table_end__ + * __zero_table_start__ + * __zero_table_end__ + * __etext + * __data_start__ + * __preinit_array_start + * __preinit_array_end + * __init_array_start + * __init_array_end + * __fini_array_start + * __fini_array_end + * __data_end__ + * __bss_start__ + * __bss_end__ + * __end__ + * end + * __HeapLimit + * __StackLimit + * __StackTop + * __stack + * __ram_end__ + */ +ENTRY(Reset_Handler) + +SECTIONS +{ + .text : + { + __text_start__ = .; + + KEEP(*(.isr_vector)) + *(.text*) + + KEEP(*(.init)) + KEEP(*(.fini)) + + /* .ctors */ + *crtbegin.o(.ctors) + *crtbegin?.o(.ctors) + *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors) + *(SORT(.ctors.*)) + *(.ctors) + + /* .dtors */ + *crtbegin.o(.dtors) + *crtbegin?.o(.dtors) + *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors) + *(SORT(.dtors.*)) + *(.dtors) + + *(.rodata*) + + KEEP(*(.eh_frame*)) + } > FLASH + + .ARM.extab : + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } > FLASH + + __exidx_start = .; + .ARM.exidx : + { + *(.ARM.exidx* .gnu.linkonce.armexidx.*) + } > FLASH + __exidx_end = .; + + /* To copy multiple ROM to RAM sections, + * uncomment .copy.table section and, + * define __STARTUP_COPY_MULTIPLE in startup_ARMCMx.S */ + /* + .copy.table : + { + . = ALIGN(4); + __copy_table_start__ = .; + LONG (__etext) + LONG (__data_start__) + LONG (__data_end__ - __data_start__) + LONG (__etext2) + LONG (__data2_start__) + LONG (__data2_end__ - __data2_start__) + __copy_table_end__ = .; + } > FLASH + */ + + /* To clear multiple BSS sections, + * uncomment .zero.table section and, + * define __STARTUP_CLEAR_BSS_MULTIPLE in startup_ARMCMx.S */ + /* + .zero.table : + { + . = ALIGN(4); + __zero_table_start__ = .; + LONG (__bss_start__) + LONG (__bss_end__ - __bss_start__) + LONG (__bss2_start__) + LONG (__bss2_end__ - __bss2_start__) + __zero_table_end__ = .; + } > FLASH + */ + + __etext = .; + + .data : AT (__etext) + { + __data_start__ = .; + *(vtable) + *(.data*) + + . = ALIGN(4); + /* preinit data */ + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP(*(.preinit_array)) + PROVIDE_HIDDEN (__preinit_array_end = .); + + . = ALIGN(4); + /* init data */ + PROVIDE_HIDDEN (__init_array_start = .); + KEEP(*(SORT(.init_array.*))) + KEEP(*(.init_array)) + PROVIDE_HIDDEN (__init_array_end = .); + + + . = ALIGN(4); + /* finit data */ + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP(*(SORT(.fini_array.*))) + KEEP(*(.fini_array)) + PROVIDE_HIDDEN (__fini_array_end = .); + + KEEP(*(.jcr*)) + . = ALIGN(16); + /* All data end */ + __data_end__ = .; + + } > RAM + + .bss : + { + . = ALIGN(4); + __bss_start__ = .; + *(.bss*) + *(COMMON) + . = ALIGN(4); + __bss_end__ = .; + } > RAM + + .heap (COPY): + { + __end__ = .; + PROVIDE(end = .); + *(.heap*) + __HeapLimit = .; + } > RAM + + /* .stack_dummy section doesn't contains any symbols. It is only + * used for linker to calculate size of stack sections, and assign + * values to stack symbols later */ + .stack_dummy (COPY): + { + *(.stack*) + } > RAM + + /* Set stack top to end of RAM, and stack limit move down by + * size of stack_dummy section */ + __StackTop = ORIGIN(RAM) + LENGTH(RAM) ; + __StackLimit = __StackTop - SIZEOF(.stack_dummy); + PROVIDE(__stack = __StackTop); + + __ram_end__ = ORIGIN(RAM) + LENGTH(RAM) -1 ; + + /* Check if data + heap + stack exceeds RAM limit */ + ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack") +} diff --git a/variants/rotarytrinkey_m0/openocd_scripts/rotarytrinkey_m0.cfg b/variants/rotarytrinkey_m0/openocd_scripts/rotarytrinkey_m0.cfg new file mode 100644 index 000000000..e4c3f81dc --- /dev/null +++ b/variants/rotarytrinkey_m0/openocd_scripts/rotarytrinkey_m0.cfg @@ -0,0 +1,28 @@ +# +# Adafruit ItsyBitsy M0 OpenOCD script. +# +# Copyright (c) 2014-2015 Arduino LLC. All right reserved. +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# + +# chip name +set CHIPNAME at91samd21e18 +set ENDIAN little + +# choose a port here +set telnet_port 0 + +source [find target/at91samdXX.cfg] diff --git a/variants/rotarytrinkey_m0/pins_arduino.h b/variants/rotarytrinkey_m0/pins_arduino.h new file mode 100644 index 000000000..db0e40c3d --- /dev/null +++ b/variants/rotarytrinkey_m0/pins_arduino.h @@ -0,0 +1,21 @@ +/* + Copyright (c) 2014-2015 Arduino LLC. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +// API compatibility +#include "variant.h" + diff --git a/variants/rotarytrinkey_m0/variant.cpp b/variants/rotarytrinkey_m0/variant.cpp new file mode 100644 index 000000000..bb855aa97 --- /dev/null +++ b/variants/rotarytrinkey_m0/variant.cpp @@ -0,0 +1,68 @@ +/* + Copyright (c) 2014-2015 Arduino LLC. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#include "variant.h" +#include "Arduino.h" +/* + * Pins descriptions + */ +const PinDescription g_APinDescription[]= +{ + // NeoPixel + { PORTA, 1, PIO_DIGITAL, (PIN_ATTR_DIGITAL), No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_1 }, + + // Encoder pin 1 + { PORTA, 0, PIO_DIGITAL, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM|PIN_ATTR_TIMER), No_ADC_Channel, PWM2_CH0, TCC2_CH0, EXTERNAL_INT_0 }, + + // Encoder pin 2 + { PORTA, 6, PIO_DIGITAL, (PIN_ATTR_DIGITAL|PIN_ATTR_ANALOG|PIN_ATTR_PWM|PIN_ATTR_TIMER), ADC_Channel6, PWM1_CH0, TCC1_CH0, EXTERNAL_INT_6 }, + + // Encoder switch + { PORTA, 27, PIO_DIGITAL, (PIN_ATTR_DIGITAL), No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_15 }, + + // Touch pad + { PORTA, 6, PIO_DIGITAL, (PIN_ATTR_DIGITAL|PIN_ATTR_ANALOG|PIN_ATTR_PWM|PIN_ATTR_TIMER), ADC_Channel6, PWM1_CH0, TCC1_CH0, EXTERNAL_INT_6 }, + + + // USB pins + { PORTA, 28, PIO_COM, PIN_ATTR_NONE, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_NONE }, // USB Host enable + { PORTA, 24, PIO_COM, PIN_ATTR_NONE, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_NONE }, // USB/DM + { PORTA, 25, PIO_COM, PIN_ATTR_NONE, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_NONE }, // USB/DP + + // Fake DAC pin just so we can compile stuff + { PORTA, 2, PIO_ANALOG, (PIN_ATTR_DIGITAL|PIN_ATTR_ANALOG|PIN_ATTR_PWM|PIN_ATTR_TIMER), ADC_Channel0, PWM2_CH0, TCC2_CH0, EXTERNAL_INT_2 }, // A0 / D0 / DAC +} ; + +const void* g_apTCInstances[TCC_INST_NUM+TC_INST_NUM]={ TCC0, TCC1, TCC2, TC3, TC4, TC5 } ; + +// Multi-serial objects instantiation +SERCOM sercom0( SERCOM0 ) ; +SERCOM sercom1( SERCOM1 ) ; +SERCOM sercom2( SERCOM2 ) ; +SERCOM sercom3( SERCOM3 ) ; + +/* + * Serial interfaces + + +// Serial1 +#define PIN_SERIAL1_TX (6ul) +#define PIN_SERIAL1_RX (7ul) +#define PAD_SERIAL1_TX (UART_TX_PAD_2) +#define PAD_SERIAL1_RX (SERCOM_RX_PAD_3) + */ diff --git a/variants/rotarytrinkey_m0/variant.h b/variants/rotarytrinkey_m0/variant.h new file mode 100644 index 000000000..5ba6558f7 --- /dev/null +++ b/variants/rotarytrinkey_m0/variant.h @@ -0,0 +1,182 @@ +/* + Copyright (c) 2014-2015 Arduino LLC. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#ifndef _VARIANT_ROTARYTRINKEY_ZERO_ +#define _VARIANT_ROTARYTRINKEY_ZERO_ + +// The definitions here needs a SAMD core >=1.6.10 +#define ARDUINO_SAMD_VARIANT_COMPLIANCE 10610 + +/*---------------------------------------------------------------------------- + * Definitions + *----------------------------------------------------------------------------*/ + +/** Frequency of the board main oscillator */ +#define VARIANT_MAINOSC (32768ul) + +/** Master clock frequency */ +#define VARIANT_MCK (F_CPU) + +/*---------------------------------------------------------------------------- + * Headers + *----------------------------------------------------------------------------*/ + +#include "WVariant.h" + +#ifdef __cplusplus +#include "SERCOM.h" +#include "Uart.h" +#endif // __cplusplus + +#ifdef __cplusplus +extern "C" +{ +#endif // __cplusplus + +/*---------------------------------------------------------------------------- + * Pins + *----------------------------------------------------------------------------*/ + +// Number of pins defined in PinDescription array +#define PINS_COUNT (9u) +#define NUM_DIGITAL_PINS (5u) +#define NUM_ANALOG_INPUTS (2u) +#define NUM_ANALOG_OUTPUTS (1u) +#define analogInputToDigitalPin(p) (p) + +#define digitalPinToPort(P) ( &(PORT->Group[g_APinDescription[P].ulPort]) ) +#define digitalPinToBitMask(P) ( 1 << g_APinDescription[P].ulPin ) +//#define analogInPinToBit(P) ( ) +#define portOutputRegister(port) ( &(port->OUT.reg) ) +#define portInputRegister(port) ( &(port->IN.reg) ) +#define portModeRegister(port) ( &(port->DIR.reg) ) +#define digitalPinHasPWM(P) ( g_APinDescription[P].ulPWMChannel != NOT_ON_PWM || g_APinDescription[P].ulTCChannel != NOT_ON_TIMER ) + +/* + * digitalPinToTimer(..) is AVR-specific and is not defined for SAMD + * architecture. If you need to check if a pin supports PWM you must + * use digitalPinHasPWM(..). + * + * https://github.com/arduino/Arduino/issues/1833 + */ +// #define digitalPinToTimer(P) + +// LEDs +#define PIN_NEOPIXEL (0u) +#define NUM_NEOPIXEL (1u) + +// ENCODER +#define PIN_ENCODER_A 1 +#define PIN_ENCODER_B 2 +#define PIN_ENCODER_SWITCH 3 + +/* + * Analog pins + */ +#define PIN_A0 (8ul) +#define PIN_A1 (2) +#define PIN_A2 (4) +#define PIN_DAC0 PIN_A0 + +static const uint8_t A0 = PIN_A0; +static const uint8_t A1 = PIN_A1; +static const uint8_t A2 = PIN_A2; + +#define ADC_RESOLUTION 12 + + +/* + * SPI Interfaces + */ +#define SPI_INTERFACES_COUNT 0 + +/* + * Wire Interfaces + */ +#define WIRE_INTERFACES_COUNT 0 + +/* + * USB + */ +#define PIN_USB_HOST_ENABLE (5ul) +#define PIN_USB_DM (6ul) +#define PIN_USB_DP (7ul) +/* + * I2S Interfaces + */ +#define I2S_INTERFACES_COUNT 0 + + +/* + * Serial interfaces + */ + +// Serial1 +#define PIN_SERIAL1_TX (2ul) // D2 / PA04 / SERCOM 0.0 +#define PIN_SERIAL1_RX (4ul) // D2 / PA06 / SERCOM 0.2 +#define PAD_SERIAL1_TX (UART_TX_PAD_0) +#define PAD_SERIAL1_RX (SERCOM_RX_PAD_2) + + +#ifdef __cplusplus +} +#endif + +/*---------------------------------------------------------------------------- + * Arduino objects - C++ only + *----------------------------------------------------------------------------*/ + +#ifdef __cplusplus + +/* ========================= + * ===== SERCOM DEFINITION + * ========================= +*/ +extern SERCOM sercom0; +extern SERCOM sercom1; +extern SERCOM sercom2; +extern SERCOM sercom3; +extern SERCOM sercom4; +extern SERCOM sercom5; + + +#endif + +// These serial port names are intended to allow libraries and architecture-neutral +// sketches to automatically default to the correct port name for a particular type +// of use. For example, a GPS module would normally connect to SERIAL_PORT_HARDWARE_OPEN, +// the first hardware serial port whose RX/TX pins are not dedicated to another use. +// +// SERIAL_PORT_MONITOR Port which normally prints to the Arduino Serial Monitor +// +// SERIAL_PORT_USBVIRTUAL Port which is USB virtual serial +// +// SERIAL_PORT_LINUXBRIDGE Port which connects to a Linux system via Bridge library +// +// SERIAL_PORT_HARDWARE Hardware serial port, physical RX & TX pins. +// +// SERIAL_PORT_HARDWARE_OPEN Hardware serial ports which are open for use. Their RX & TX +// pins are NOT connected to anything by default. +#define SERIAL_PORT_USBVIRTUAL Serial +#define SERIAL_PORT_MONITOR Serial +// Serial has no physical pins broken out, so it's not listed as HARDWARE port +#define SERIAL_PORT_HARDWARE Serial1 +#define SERIAL_PORT_HARDWARE_OPEN Serial1 + +#endif /* _VARIANT_ARDUINO_ZERO_ */ + From c8a9ac65af6b61c693f4362149c09bbb9cc1155d Mon Sep 17 00:00:00 2001 From: lady ada Date: Sun, 11 Apr 2021 14:40:49 -0400 Subject: [PATCH 2/7] add slide trinkey --- boards.txt | 52 ++++- .../bootloader-proxsensetrinkey_m0.bin | Bin 0 -> 8192 bytes .../bootloader-slidetrinkey_m0.bin | Bin 0 -> 8192 bytes .../slidetrinkey_m0/debug_scripts/variant.gdb | 31 +++ .../gcc/flash_with_bootloader.ld | 216 ++++++++++++++++++ .../gcc/flash_without_bootloader.ld | 214 +++++++++++++++++ .../openocd_scripts/slidetrinkey_m0.cfg | 28 +++ variants/slidetrinkey_m0/pins_arduino.h | 21 ++ variants/slidetrinkey_m0/variant.cpp | 48 ++++ variants/slidetrinkey_m0/variant.h | 172 ++++++++++++++ 10 files changed, 780 insertions(+), 2 deletions(-) create mode 100644 bootloaders/proxsensetrinkey_m0/bootloader-proxsensetrinkey_m0.bin create mode 100644 bootloaders/slidetrinkey_m0/bootloader-slidetrinkey_m0.bin create mode 100644 variants/slidetrinkey_m0/debug_scripts/variant.gdb create mode 100644 variants/slidetrinkey_m0/linker_scripts/gcc/flash_with_bootloader.ld create mode 100644 variants/slidetrinkey_m0/linker_scripts/gcc/flash_without_bootloader.ld create mode 100644 variants/slidetrinkey_m0/openocd_scripts/slidetrinkey_m0.cfg create mode 100644 variants/slidetrinkey_m0/pins_arduino.h create mode 100644 variants/slidetrinkey_m0/variant.cpp create mode 100644 variants/slidetrinkey_m0/variant.h diff --git a/boards.txt b/boards.txt index ca652fa9f..509f477c7 100644 --- a/boards.txt +++ b/boards.txt @@ -386,7 +386,7 @@ adafruit_neotrinkey_m0.pid.0=0x80EF adafruit_neotrinkey_m0.vid.1=0x239A adafruit_neotrinkey_m0.pid.1=0x00EF adafruit_neotrinkey_m0.vid.1=0x239A -adafruit_neotrinkey_m0.pid.1=0x00F0 +adafruit_neotrinkey_m0.pid.1=0x80F0 adafruit_neotrinkey_m0.upload.tool=bossac adafruit_neotrinkey_m0.upload.protocol=sam-ba adafruit_neotrinkey_m0.upload.maximum_size=262144 @@ -434,7 +434,7 @@ adafruit_rotarytrinkey_m0.pid.0=0x80FB adafruit_rotarytrinkey_m0.vid.1=0x239A adafruit_rotarytrinkey_m0.pid.1=0x00FB adafruit_rotarytrinkey_m0.vid.1=0x239A -adafruit_rotarytrinkey_m0.pid.1=0x00FC +adafruit_rotarytrinkey_m0.pid.1=0x80FC adafruit_rotarytrinkey_m0.upload.tool=bossac adafruit_rotarytrinkey_m0.upload.protocol=sam-ba adafruit_rotarytrinkey_m0.upload.maximum_size=262144 @@ -474,6 +474,54 @@ adafruit_rotarytrinkey_m0.menu.debug.off=Off adafruit_rotarytrinkey_m0.menu.debug.on=On adafruit_rotarytrinkey_m0.menu.debug.on.build.flags.debug=-g +# Adafruit Slide Trinkey (SAMD21) +# ------------------------------ +adafruit_slidetrinkey_m0.name=Adafruit Slide Trinkey (SAMD21) +adafruit_slidetrinkey_m0.vid.0=0x239A +adafruit_slidetrinkey_m0.pid.0=0x8101 +adafruit_slidetrinkey_m0.vid.1=0x239A +adafruit_slidetrinkey_m0.pid.1=0x0101 +adafruit_slidetrinkey_m0.vid.1=0x239A +adafruit_slidetrinkey_m0.pid.1=0x8102 +adafruit_slidetrinkey_m0.upload.tool=bossac +adafruit_slidetrinkey_m0.upload.protocol=sam-ba +adafruit_slidetrinkey_m0.upload.maximum_size=262144 +adafruit_slidetrinkey_m0.upload.offset=0x2000 +adafruit_slidetrinkey_m0.upload.use_1200bps_touch=true +adafruit_slidetrinkey_m0.upload.wait_for_upload_port=true +adafruit_slidetrinkey_m0.upload.native_usb=true +adafruit_slidetrinkey_m0.build.mcu=cortex-m0plus +adafruit_slidetrinkey_m0.build.f_cpu=48000000L +adafruit_slidetrinkey_m0.build.usb_product="Rotary Trinkey M0" +adafruit_slidetrinkey_m0.build.usb_manufacturer="Adafruit" +adafruit_slidetrinkey_m0.build.board=SLIDETRINKEY_M0 +adafruit_slidetrinkey_m0.build.core=arduino +adafruit_slidetrinkey_m0.build.extra_flags=-DCRYSTALLESS -DADAFRUIT_SLIDETRINKEY_M0 -D__SAMD21E18A__ -DARM_MATH_CM0PLUS {build.usb_flags} +adafruit_slidetrinkey_m0.build.ldscript=linker_scripts/gcc/flash_with_bootloader.ld +adafruit_slidetrinkey_m0.build.openocdscript=openocd_scripts/slidetrinkey_m0.cfg +adafruit_slidetrinkey_m0.build.variant=slidetrinkey_m0 +adafruit_slidetrinkey_m0.build.variant_system_lib= +adafruit_slidetrinkey_m0.build.vid=0x239A +adafruit_slidetrinkey_m0.build.pid=0x8101 +adafruit_slidetrinkey_m0.bootloader.tool=openocd +adafruit_slidetrinkey_m0.bootloader.file=slidetrinkey_m0/bootloader-slidetrinkey_m0.bin +adafruit_slidetrinkey_m0.menu.opt.small=Small (-Os) (standard) +adafruit_slidetrinkey_m0.menu.opt.small.build.flags.optimize=-Os +adafruit_slidetrinkey_m0.menu.opt.fast=Fast (-O2) +adafruit_slidetrinkey_m0.menu.opt.fast.build.flags.optimize=-O2 +adafruit_slidetrinkey_m0.menu.opt.faster=Faster (-O3) +adafruit_slidetrinkey_m0.menu.opt.faster.build.flags.optimize=-O3 +adafruit_slidetrinkey_m0.menu.opt.fastest=Fastest (-Ofast) +adafruit_slidetrinkey_m0.menu.opt.fastest.build.flags.optimize=-Ofast +adafruit_slidetrinkey_m0.menu.opt.dragons=Here be dragons (-Ofast -funroll-loops) +adafruit_slidetrinkey_m0.menu.opt.dragons.build.flags.optimize=-Ofast -funroll-loops +adafruit_slidetrinkey_m0.menu.usbstack.arduino=Arduino +adafruit_slidetrinkey_m0.menu.usbstack.tinyusb=TinyUSB +adafruit_slidetrinkey_m0.menu.usbstack.tinyusb.build.flags.usbstack=-DUSE_TINYUSB +adafruit_slidetrinkey_m0.menu.debug.off=Off +adafruit_slidetrinkey_m0.menu.debug.on=On +adafruit_slidetrinkey_m0.menu.debug.on.build.flags.debug=-g + # Adafruit ItsyBitsy M0 (SAMD21) # ------------------------------ adafruit_itsybitsy_m0.name=Adafruit ItsyBitsy M0 diff --git a/bootloaders/proxsensetrinkey_m0/bootloader-proxsensetrinkey_m0.bin b/bootloaders/proxsensetrinkey_m0/bootloader-proxsensetrinkey_m0.bin new file mode 100644 index 0000000000000000000000000000000000000000..7b1a0b938ede4b976bc51d46388b7c9c21ccb35f GIT binary patch literal 8192 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 literal 0 HcmV?d00001 diff --git a/bootloaders/slidetrinkey_m0/bootloader-slidetrinkey_m0.bin b/bootloaders/slidetrinkey_m0/bootloader-slidetrinkey_m0.bin new file mode 100644 index 0000000000000000000000000000000000000000..e894a13e396a5e18e6234b9d80787f6e7bf47d6b GIT binary patch literal 8192 zcmc&Zdt6lKmFK(jV3}2AHcTj>e%`fxV|1C%F8_<=wTexz;EjZ>vxDc zMeptqhZVXbEq+Mz@P$CJKJ9DV0~4r?tnCKpy#aX%q=CmOF#b;@hd3I;x(Pf}xZxfq ze`;WARjo9&dau{*tquJoq{XjkdBHH2pKEWwsKu{qd@xJu8o$^H3R?#G%+#Df7nAAD z3HEIo*kk&mK*$V3h>87-Fcnc;W%JA z0A#3YG{?sV{~qawL|y+wI&fsjH>&ZDppNVCIs$2V9U+D{<+}21L7Q*Qx-*fz-c0Wq z`Ap=bSHN;&@Zj^Oy+&YJm-pc2gU=uL>b-}t-0fw&otvY=xWEd@g1m*H&O`!b`h&^1 zOWbFSjKSq`C^Y)v{zqjfhvf)91k}BFPi8gQw|+M`ZHj5?TyQW4x+iwOS@~pT9USe3 z>CC0HK%M7kH<=slhJyc8>Y=D6$`f}Dbcm`#IxXf}PdyZ@No9PVXm_HQuE|*exU=jPL(mYol*A~{MqdE-%jQRhD3A0oVj#RV=#Z^} zOo_NNLlXk&5)|rVdqtvvkQtJf3{bsS%sz8K7qNqR-r4SJjMrSyH-$`fzT9I}2-Vbhf_AhyC#8KxWVS%H~Q>E@M8|?T~e81KmN{ z(lQ~~*S%ZzwR|EI_HgL&1})yKeR;>a3!EmU^?j4?=}HcaZY?fq>)y}oH43z@^J($< zTAbeV3Mik5K($wk|Fibz`H=s6K3ID!$OCYWSIqwOklAmRNU1rL>NiPHV2te)_2(^k z>n>=dEHh-q`*fY27Y{p#Wj_Kd$UUmY$@E&}(x5%E!)up~Ty})R za)v)G!h6lKBf@wba)`G_%wC7=3^;?e(b~vB>Zn5aLL5V>oe{LC7joEq+)a&z@$5v+ zGVs~o7pfW00W!_QdmS&Cr2}bijg8Uq_U|*EZ}>8F z#AEipz&T!WL?-&oxV}EQej4YH>(@Emk+ zl(%R{j2_fbykFFgEFRW0?G;Vif>$@*lMN+7BdmRT0!#wZ0n-dh#mqWyaqzlLi&tsk z2p{PXt>-><^onqCA;5G~jGKJcRs=3wtzaY^S!)l=1(4_^U2jC5Cg*KXn67Y>?V;7u zWZxdk9^Gohh-Y;u%fHg*;R@P_x3Gn9Z^#q!jmq|?PvwznEZkIr2IRoOL#t)9$0NL48aO0 z*RYN@QPASw)2zM2cr(-B5y%0U2Fh?R2L(_DrJ%*PYq^eM+Z}bdXB_1CA0t&y&$NRx zD;92E3u{f`2DTyGd_v!4Igr++Lwk<3Zv?*K%k+dBN^Oh~>Z*umkW~d$DbMpE$PH#5ut1(H-asSj6eEsNiAW*mbP6FE_Phg}kq&w&is2o$A%nn}$LU z=S68X7kbjXZ}}f@(3jXlr~GeK*&9|%X`U#zhe@_eV^Uq-0{ma0E&55&7V%CwSl-v2 zb$Y1R%4W9f#IItnRa;v(?m6r`g%&&7_Ifq5?~w0c@T1**ZPTNkJhHEA_p81`OJUE- zmUr=%oW3&q@{Zg_IEMHKS0-KFi9UDV731Y-8F51YcdoEPN6RN_l=H)0aX7|sTFGAV zD@BXHsC}TG=Jp^Jl#N%$UncXkd3!}QcC>7lUn{eSSJ5h(I8#Szhw1o-gMG=K{ju%- z&(-a|UE;sR;IkhNZu9RIGjJr%F>q?I4Qtn9p%S{n8C;=OiwbMSGVeh5vDQ86ZtiJc zDxs^rIvB+s-AanA#mluLf{tGcSL^!tCxYMf*KasrFnO%r`o>CDbLG`F`CLqh6kSb4Z2RB4pPdmix` zLqEyaX8(BQ6sYwbne7Vo7VJdcqnzYTBMdHsU>O&En_@JiKgSaDB%o)$Vd2*s8=#LCtCkQiK{oFLKjjPgTWX{O8^ioxm181Mu0aE{{^;35Oy1Ytw4B#!**O!OK2KrMx4if zIPSeHKsSYc^6gTn3kv@z{1WnJK$eslIteQRcj{wyyF~Cdl2I~iu}xom2emF3IKMI& ztO|6sb-`=(1$d5QngGP*!4RP+!nnySC^{T-$isN<2~I|t$BDkph;xXiavtAC#Ca#g zcHH2&g}x`%lmdu7f8zvK<_oF1F4J*_(?!>+CgibvV}h`p*Lh6twZtkKV>1I?HeA&> zFu`>Ers_)828?laLaq+*>Z6=i-5{QMUWnD+C=Ae1T{gzZU?#ApW#tVkfA5caiVu1& zy0Mlp#>`Kr__G6@wzW2v>u6FfY%$cyG*Qqc0+eh!#d*r zTAcdsiGE+uJQfEx^p&A>L80szX95uW^DL z%7!61ab2Ai{8HUnT+;tS@dagu--7EoOSJfLEjqP8n6dO)>-L3U>_j0j$bJ}N6CG+)cxhoFGr*viI{!V@8cYueq4XdN z;ZOoCz}4kZVE~RbM1?5dMUI6m!5V04xDw(Ut~Ic(&(u+rIn8r)dMq`7H?sj&R+gGw zo8B?6TJgl|yPdZsx#tm>3}$IYFbz7z8fAJgAa#mMl>}b{(}Lfv?-YH?Ua3>B`?M%< zwt2r;t_-APT!;!h`twe4oH8h#!6-RZ8RmuH0p^UY1G&rri#+>e7>b>-W6j_!h!slN zfxUR2Iz-YBg(ODM4>&{N<_^)`pTZN);o0vQFx|8{+CT12N4wT6F;ucTq#FvXn~z-YP`rjIHntQWgA)S13YdMOe#51m0gE3jX@85?1RkO%d(m>-W+QL~>w6Pq)=gFJ$pj->rb)Q683?Dv z^F}~8h??mH9&$Jrav*zz2sX4*G)C0(<2VLA?A4Kn>te1{W$`t%32jH)QW?AVT3d!b z-J4~!cpYY4i`YV~z|NL4En0jq8BhKI_fPkW_L8UevUg-s)l1@pm=^zzMg%=CY|aRF z%D`We9W85GI$Io@*KF3}zt(6x7H;R-vlxr_jrObUsrn3~-J9<9XIac#Yq-^tmOB1e z>y=h5{=OzZ;0fiG++(Yn$dB1g7)lwP6oBHK7zZXHw%t^+IKO6FsVBRL#JWX;G9i%W zHb)KoK=&uIJ$n~M!X*1_Hxyf9Oj%cV7KY>0f*r;A^+IeLH~DjwlnL@zY6RDz=gLOE zK7@V%@`{2lonF07cS4a5ZQCzj+_pltZ%>yGZD)`&u)RaB-Ay`3*GbXPuf=V6w#PLC z#-fuHu)IqFW_6xjC&PJfj1;I;8p?({ISjLrR_b)e~0%@d$B&tILW)9YO>d94!1hf zjW87Mdj->O-o*bmZ!W%Ba`WcAn+qvEZB4;v3SsSocedHHGcbb7;BtItyS4adi5Ge& zS55J=VB<|LE&jwP?U9Q;ayb^xcHdSpZi^=pH&rd(l+fZoP24~alIiPWyrGPsiPMEH zs|0)GX_v6)h? z7QGOh4AA;MwOIO~KG3&m{3XR?;QA&cF_SF zs#&Qh1Vf{DpYjz-I;kn}k2X@K3t6S$lr#7ur3sDIg|gk#fL?U3sJqBYs~uXLzt>mU z&acA#0lx-UU-jU1?6C*s&(s>HUMZAVw5h)v`K`Llsl&B-DO0|t`X1uZ&(u{;vr--8 z(RVWnu!;D~2|+579HE%H3C9zTj{ldDv#NxCjNt?+Yqv900AH!kVXGkNxh%;U`klH2 zBZ~s;S*exbIl=i(jBxXPSJXP^sn}BIiP&Qp;TLhUef?@Z&Ql;I;?<)%&h3k-tDWPN zBHU$35Q=n)Eu`aIzF(3}H_uN{r6Yn*$P84~2>OL6%xj8JLhXgV(6 z_qJLHu1F#tx=&^s;FjtD*Lr4Gn+s3hC;zN4wwk66K4RuV8+8^X1Rgp&sfXbD-liIj}hIl&HI$2QUK^ z&zv$~PB<|`U{03cJ4-!A%>O*RzS6@v+L+@+NW=}=R(oUCbtMyRJHDvn{u~i~2?##4 zRTt13#?e<$e*y(!OaPy|bN7)Ajwt%|xoe`Pf+nBl{bW>NH+GSO_D%W47D4Y8=Kg=*5+r{ zH?^_VC=!6QBT?`mR3P{eGKiJ=k|CZ>fe<1RMn?dQf2pOCH^?N&*Wg*xtDaP{gQ36s znO8|Fd57tv6XCZFeG2s}G-tiJU>}C@ECpZ)0mcL0UNpQI(3;Y&$uA0pB8X5|<6jzl zbhWr_SzTp$UCC^gWfyRbo5EY#Hia9u zG;exldTW!sp&{H(wYsvId z_w04E^Y@E4zQ)APH`Rt!cV4PXp)X>^k?61JK z^6HAxl1EGCmKP_xJ&;rJR@XR;&63&wq9_9l2EFy>aj+U;4G8#)dnjSombW%O+x*O? z`Sq*UJi(UBt!#;lEyd%rrKR&{x#pM5!Jhb0?vsxJ3=`&I2xc|F-1kj0f0}w^$=>@% zw(g$veiNXuvXTCI=(GMkkA75j_*~O#uQz`8M`)&uCvbKAQkg?wAP^lfVeZW^1XA@l zDMbvqU?uuo#%RdJKh7C)iH@WgcIix@rRq@!=s8jhI~Wfw7+R$2@kA!$a;(2NMmCI* zbwFRIAeEyUgD(y#hVSS+fU_BCk*e1NqZJV(zdS}xp#>eF9~(&r!!Iet1WEQKw{OA& z=-~)VM4P+HzjS4-NV|=FFJemy+NKIPANpNN FLASH + + .ARM.extab : + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } > FLASH + + __exidx_start = .; + .ARM.exidx : + { + *(.ARM.exidx* .gnu.linkonce.armexidx.*) + } > FLASH + __exidx_end = .; + + /* To copy multiple ROM to RAM sections, + * uncomment .copy.table section and, + * define __STARTUP_COPY_MULTIPLE in startup_ARMCMx.S */ + /* + .copy.table : + { + . = ALIGN(4); + __copy_table_start__ = .; + LONG (__etext) + LONG (__data_start__) + LONG (__data_end__ - __data_start__) + LONG (__etext2) + LONG (__data2_start__) + LONG (__data2_end__ - __data2_start__) + __copy_table_end__ = .; + } > FLASH + */ + + /* To clear multiple BSS sections, + * uncomment .zero.table section and, + * define __STARTUP_CLEAR_BSS_MULTIPLE in startup_ARMCMx.S */ + /* + .zero.table : + { + . = ALIGN(4); + __zero_table_start__ = .; + LONG (__bss_start__) + LONG (__bss_end__ - __bss_start__) + LONG (__bss2_start__) + LONG (__bss2_end__ - __bss2_start__) + __zero_table_end__ = .; + } > FLASH + */ + + __etext = .; + + .data : AT (__etext) + { + __data_start__ = .; + *(vtable) + *(.data*) + + . = ALIGN(4); + /* preinit data */ + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP(*(.preinit_array)) + PROVIDE_HIDDEN (__preinit_array_end = .); + + . = ALIGN(4); + /* init data */ + PROVIDE_HIDDEN (__init_array_start = .); + KEEP(*(SORT(.init_array.*))) + KEEP(*(.init_array)) + PROVIDE_HIDDEN (__init_array_end = .); + + + . = ALIGN(4); + /* finit data */ + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP(*(SORT(.fini_array.*))) + KEEP(*(.fini_array)) + PROVIDE_HIDDEN (__fini_array_end = .); + + KEEP(*(.jcr*)) + . = ALIGN(16); + /* All data end */ + __data_end__ = .; + + } > RAM + + .bss : + { + . = ALIGN(4); + __bss_start__ = .; + *(.bss*) + *(COMMON) + . = ALIGN(4); + __bss_end__ = .; + } > RAM + + .heap (COPY): + { + __end__ = .; + PROVIDE(end = .); + *(.heap*) + __HeapLimit = .; + } > RAM + + /* .stack_dummy section doesn't contains any symbols. It is only + * used for linker to calculate size of stack sections, and assign + * values to stack symbols later */ + .stack_dummy (COPY): + { + *(.stack*) + } > RAM + + /* Set stack top to end of RAM, and stack limit move down by + * size of stack_dummy section */ + __StackTop = ORIGIN(RAM) + LENGTH(RAM); + __StackLimit = __StackTop - SIZEOF(.stack_dummy); + PROVIDE(__stack = __StackTop); + + __ram_end__ = ORIGIN(RAM) + LENGTH(RAM) -1 ; + + /* Check if data + heap + stack exceeds RAM limit */ + ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack") +} diff --git a/variants/slidetrinkey_m0/linker_scripts/gcc/flash_without_bootloader.ld b/variants/slidetrinkey_m0/linker_scripts/gcc/flash_without_bootloader.ld new file mode 100644 index 000000000..ebeeee37f --- /dev/null +++ b/variants/slidetrinkey_m0/linker_scripts/gcc/flash_without_bootloader.ld @@ -0,0 +1,214 @@ +/* + Copyright (c) 2014-2015 Arduino LLC. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +/* Linker script to configure memory regions. + * Need modifying for a specific board. + * FLASH.ORIGIN: starting address of flash + * FLASH.LENGTH: length of flash + * RAM.ORIGIN: starting address of RAM bank 0 + * RAM.LENGTH: length of RAM bank 0 + */ +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00040000 + RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00008000 +} + +/* Linker script to place sections and symbol values. Should be used together + * with other linker script that defines memory regions FLASH and RAM. + * It references following symbols, which must be defined in code: + * Reset_Handler : Entry of reset handler + * + * It defines following symbols, which code can use without definition: + * __exidx_start + * __exidx_end + * __copy_table_start__ + * __copy_table_end__ + * __zero_table_start__ + * __zero_table_end__ + * __etext + * __data_start__ + * __preinit_array_start + * __preinit_array_end + * __init_array_start + * __init_array_end + * __fini_array_start + * __fini_array_end + * __data_end__ + * __bss_start__ + * __bss_end__ + * __end__ + * end + * __HeapLimit + * __StackLimit + * __StackTop + * __stack + * __ram_end__ + */ +ENTRY(Reset_Handler) + +SECTIONS +{ + .text : + { + __text_start__ = .; + + KEEP(*(.isr_vector)) + *(.text*) + + KEEP(*(.init)) + KEEP(*(.fini)) + + /* .ctors */ + *crtbegin.o(.ctors) + *crtbegin?.o(.ctors) + *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors) + *(SORT(.ctors.*)) + *(.ctors) + + /* .dtors */ + *crtbegin.o(.dtors) + *crtbegin?.o(.dtors) + *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors) + *(SORT(.dtors.*)) + *(.dtors) + + *(.rodata*) + + KEEP(*(.eh_frame*)) + } > FLASH + + .ARM.extab : + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } > FLASH + + __exidx_start = .; + .ARM.exidx : + { + *(.ARM.exidx* .gnu.linkonce.armexidx.*) + } > FLASH + __exidx_end = .; + + /* To copy multiple ROM to RAM sections, + * uncomment .copy.table section and, + * define __STARTUP_COPY_MULTIPLE in startup_ARMCMx.S */ + /* + .copy.table : + { + . = ALIGN(4); + __copy_table_start__ = .; + LONG (__etext) + LONG (__data_start__) + LONG (__data_end__ - __data_start__) + LONG (__etext2) + LONG (__data2_start__) + LONG (__data2_end__ - __data2_start__) + __copy_table_end__ = .; + } > FLASH + */ + + /* To clear multiple BSS sections, + * uncomment .zero.table section and, + * define __STARTUP_CLEAR_BSS_MULTIPLE in startup_ARMCMx.S */ + /* + .zero.table : + { + . = ALIGN(4); + __zero_table_start__ = .; + LONG (__bss_start__) + LONG (__bss_end__ - __bss_start__) + LONG (__bss2_start__) + LONG (__bss2_end__ - __bss2_start__) + __zero_table_end__ = .; + } > FLASH + */ + + __etext = .; + + .data : AT (__etext) + { + __data_start__ = .; + *(vtable) + *(.data*) + + . = ALIGN(4); + /* preinit data */ + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP(*(.preinit_array)) + PROVIDE_HIDDEN (__preinit_array_end = .); + + . = ALIGN(4); + /* init data */ + PROVIDE_HIDDEN (__init_array_start = .); + KEEP(*(SORT(.init_array.*))) + KEEP(*(.init_array)) + PROVIDE_HIDDEN (__init_array_end = .); + + + . = ALIGN(4); + /* finit data */ + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP(*(SORT(.fini_array.*))) + KEEP(*(.fini_array)) + PROVIDE_HIDDEN (__fini_array_end = .); + + KEEP(*(.jcr*)) + . = ALIGN(16); + /* All data end */ + __data_end__ = .; + + } > RAM + + .bss : + { + . = ALIGN(4); + __bss_start__ = .; + *(.bss*) + *(COMMON) + . = ALIGN(4); + __bss_end__ = .; + } > RAM + + .heap (COPY): + { + __end__ = .; + PROVIDE(end = .); + *(.heap*) + __HeapLimit = .; + } > RAM + + /* .stack_dummy section doesn't contains any symbols. It is only + * used for linker to calculate size of stack sections, and assign + * values to stack symbols later */ + .stack_dummy (COPY): + { + *(.stack*) + } > RAM + + /* Set stack top to end of RAM, and stack limit move down by + * size of stack_dummy section */ + __StackTop = ORIGIN(RAM) + LENGTH(RAM) ; + __StackLimit = __StackTop - SIZEOF(.stack_dummy); + PROVIDE(__stack = __StackTop); + + __ram_end__ = ORIGIN(RAM) + LENGTH(RAM) -1 ; + + /* Check if data + heap + stack exceeds RAM limit */ + ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack") +} diff --git a/variants/slidetrinkey_m0/openocd_scripts/slidetrinkey_m0.cfg b/variants/slidetrinkey_m0/openocd_scripts/slidetrinkey_m0.cfg new file mode 100644 index 000000000..e4c3f81dc --- /dev/null +++ b/variants/slidetrinkey_m0/openocd_scripts/slidetrinkey_m0.cfg @@ -0,0 +1,28 @@ +# +# Adafruit ItsyBitsy M0 OpenOCD script. +# +# Copyright (c) 2014-2015 Arduino LLC. All right reserved. +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# + +# chip name +set CHIPNAME at91samd21e18 +set ENDIAN little + +# choose a port here +set telnet_port 0 + +source [find target/at91samdXX.cfg] diff --git a/variants/slidetrinkey_m0/pins_arduino.h b/variants/slidetrinkey_m0/pins_arduino.h new file mode 100644 index 000000000..db0e40c3d --- /dev/null +++ b/variants/slidetrinkey_m0/pins_arduino.h @@ -0,0 +1,21 @@ +/* + Copyright (c) 2014-2015 Arduino LLC. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +// API compatibility +#include "variant.h" + diff --git a/variants/slidetrinkey_m0/variant.cpp b/variants/slidetrinkey_m0/variant.cpp new file mode 100644 index 000000000..c26c2ea8f --- /dev/null +++ b/variants/slidetrinkey_m0/variant.cpp @@ -0,0 +1,48 @@ +/* + Copyright (c) 2014-2015 Arduino LLC. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#include "variant.h" +#include "Arduino.h" +/* + * Pins descriptions + */ +const PinDescription g_APinDescription[]= +{ + // Fake DAC pin just so we can compile stuff + { PORTA, 2, PIO_ANALOG, (PIN_ATTR_DIGITAL|PIN_ATTR_ANALOG|PIN_ATTR_PWM|PIN_ATTR_TIMER), ADC_Channel0, PWM2_CH0, TCC2_CH0, EXTERNAL_INT_2 }, // A0 / D0 / DAC + + // Slidepot + { PORTA, 7, PIO_SERCOM_ALT, (PIN_ATTR_DIGITAL|PIN_ATTR_ANALOG|PIN_ATTR_PWM|PIN_ATTR_TIMER), ADC_Channel7, PWM1_CH1, TCC1_CH1, EXTERNAL_INT_7 }, + + // NeoPixel + { PORTA, 6, PIO_DIGITAL, (PIN_ATTR_DIGITAL|PIN_ATTR_ANALOG|PIN_ATTR_PWM|PIN_ATTR_TIMER), ADC_Channel6, PWM1_CH0, TCC1_CH0, EXTERNAL_INT_6 }, + + // USB pins + { PORTA, 28, PIO_COM, PIN_ATTR_NONE, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_NONE }, // USB Host enable + { PORTA, 24, PIO_COM, PIN_ATTR_NONE, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_NONE }, // USB/DM + { PORTA, 25, PIO_COM, PIN_ATTR_NONE, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_NONE }, // USB/DP + +} ; + +const void* g_apTCInstances[TCC_INST_NUM+TC_INST_NUM]={ TCC0, TCC1, TCC2, TC3, TC4, TC5 } ; + +// Multi-serial objects instantiation +SERCOM sercom0( SERCOM0 ) ; +SERCOM sercom1( SERCOM1 ) ; +SERCOM sercom2( SERCOM2 ) ; +SERCOM sercom3( SERCOM3 ) ; diff --git a/variants/slidetrinkey_m0/variant.h b/variants/slidetrinkey_m0/variant.h new file mode 100644 index 000000000..9312ae230 --- /dev/null +++ b/variants/slidetrinkey_m0/variant.h @@ -0,0 +1,172 @@ +/* + Copyright (c) 2014-2015 Arduino LLC. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#ifndef _VARIANT_SLIDETRINKEY_ZERO_ +#define _VARIANT_SLIDETRINKEY_ZERO_ + +// The definitions here needs a SAMD core >=1.6.10 +#define ARDUINO_SAMD_VARIANT_COMPLIANCE 10610 + +/*---------------------------------------------------------------------------- + * Definitions + *----------------------------------------------------------------------------*/ + +/** Frequency of the board main oscillator */ +#define VARIANT_MAINOSC (32768ul) + +/** Master clock frequency */ +#define VARIANT_MCK (F_CPU) + +/*---------------------------------------------------------------------------- + * Headers + *----------------------------------------------------------------------------*/ + +#include "WVariant.h" + +#ifdef __cplusplus +#include "SERCOM.h" +#include "Uart.h" +#endif // __cplusplus + +#ifdef __cplusplus +extern "C" +{ +#endif // __cplusplus + +/*---------------------------------------------------------------------------- + * Pins + *----------------------------------------------------------------------------*/ + +// Number of pins defined in PinDescription array +#define PINS_COUNT (6u) +#define NUM_DIGITAL_PINS (2u) +#define NUM_ANALOG_INPUTS (2u) +#define NUM_ANALOG_OUTPUTS (1u) +#define analogInputToDigitalPin(p) (p) + +#define digitalPinToPort(P) ( &(PORT->Group[g_APinDescription[P].ulPort]) ) +#define digitalPinToBitMask(P) ( 1 << g_APinDescription[P].ulPin ) +//#define analogInPinToBit(P) ( ) +#define portOutputRegister(port) ( &(port->OUT.reg) ) +#define portInputRegister(port) ( &(port->IN.reg) ) +#define portModeRegister(port) ( &(port->DIR.reg) ) +#define digitalPinHasPWM(P) ( g_APinDescription[P].ulPWMChannel != NOT_ON_PWM || g_APinDescription[P].ulTCChannel != NOT_ON_TIMER ) + +/* + * digitalPinToTimer(..) is AVR-specific and is not defined for SAMD + * architecture. If you need to check if a pin supports PWM you must + * use digitalPinHasPWM(..). + * + * https://github.com/arduino/Arduino/issues/1833 + */ +// #define digitalPinToTimer(P) + +// LEDs +#define PIN_NEOPIXEL (2u) +#define NUM_NEOPIXEL (2u) + +// POT +#define PIN_POTENTIOMETER (1u) + +/* + * Analog pins + */ +#define PIN_A0 (0ul) +#define PIN_A1 (1ul) +#define PIN_DAC0 PIN_A0 + +static const uint8_t A0 = PIN_A0; +static const uint8_t A1 = PIN_A1; + +#define ADC_RESOLUTION 12 + + +/* + * SPI Interfaces + */ +#define SPI_INTERFACES_COUNT 0 + +/* + * Wire Interfaces + */ +#define WIRE_INTERFACES_COUNT 0 + +/* + * USB + */ +#define PIN_USB_HOST_ENABLE (3ul) +#define PIN_USB_DM (4ul) +#define PIN_USB_DP (5ul) +/* + * I2S Interfaces + */ +#define I2S_INTERFACES_COUNT 0 + + +/* + * Serial interfaces + */ + + +#ifdef __cplusplus +} +#endif + +/*---------------------------------------------------------------------------- + * Arduino objects - C++ only + *----------------------------------------------------------------------------*/ + +#ifdef __cplusplus + +/* ========================= + * ===== SERCOM DEFINITION + * ========================= +*/ +extern SERCOM sercom0; +extern SERCOM sercom1; +extern SERCOM sercom2; +extern SERCOM sercom3; +extern SERCOM sercom4; +extern SERCOM sercom5; + + +#endif + +// These serial port names are intended to allow libraries and architecture-neutral +// sketches to automatically default to the correct port name for a particular type +// of use. For example, a GPS module would normally connect to SERIAL_PORT_HARDWARE_OPEN, +// the first hardware serial port whose RX/TX pins are not dedicated to another use. +// +// SERIAL_PORT_MONITOR Port which normally prints to the Arduino Serial Monitor +// +// SERIAL_PORT_USBVIRTUAL Port which is USB virtual serial +// +// SERIAL_PORT_LINUXBRIDGE Port which connects to a Linux system via Bridge library +// +// SERIAL_PORT_HARDWARE Hardware serial port, physical RX & TX pins. +// +// SERIAL_PORT_HARDWARE_OPEN Hardware serial ports which are open for use. Their RX & TX +// pins are NOT connected to anything by default. +#define SERIAL_PORT_USBVIRTUAL Serial +#define SERIAL_PORT_MONITOR Serial +// Serial has no physical pins broken out, so it's not listed as HARDWARE port +#define SERIAL_PORT_HARDWARE Serial1 +#define SERIAL_PORT_HARDWARE_OPEN Serial1 + +#endif /* _VARIANT_ARDUINO_ZERO_ */ + From c69a4fe4f7853f04f652bd5e19a3b6d974e52981 Mon Sep 17 00:00:00 2001 From: lady ada Date: Sun, 11 Apr 2021 18:26:02 -0400 Subject: [PATCH 3/7] proximity sensing trinkey --- boards.txt | 49 ++++ .../bootloader-proxlighttrinkey_m0.bin} | Bin .../debug_scripts/variant.gdb | 31 +++ .../gcc/flash_with_bootloader.ld | 216 ++++++++++++++++++ .../gcc/flash_without_bootloader.ld | 214 +++++++++++++++++ .../openocd_scripts/proxlighttrinkey_m0.cfg | 28 +++ variants/proxlighttrinkey_m0/pins_arduino.h | 21 ++ variants/proxlighttrinkey_m0/variant.cpp | 57 +++++ variants/proxlighttrinkey_m0/variant.h | 180 +++++++++++++++ 9 files changed, 796 insertions(+) rename bootloaders/{proxsensetrinkey_m0/bootloader-proxsensetrinkey_m0.bin => proxlighttrinkey_m0/bootloader-proxlighttrinkey_m0.bin} (100%) create mode 100644 variants/proxlighttrinkey_m0/debug_scripts/variant.gdb create mode 100644 variants/proxlighttrinkey_m0/linker_scripts/gcc/flash_with_bootloader.ld create mode 100644 variants/proxlighttrinkey_m0/linker_scripts/gcc/flash_without_bootloader.ld create mode 100644 variants/proxlighttrinkey_m0/openocd_scripts/proxlighttrinkey_m0.cfg create mode 100644 variants/proxlighttrinkey_m0/pins_arduino.h create mode 100644 variants/proxlighttrinkey_m0/variant.cpp create mode 100644 variants/proxlighttrinkey_m0/variant.h diff --git a/boards.txt b/boards.txt index 509f477c7..364ca2332 100644 --- a/boards.txt +++ b/boards.txt @@ -522,6 +522,55 @@ adafruit_slidetrinkey_m0.menu.debug.off=Off adafruit_slidetrinkey_m0.menu.debug.on=On adafruit_slidetrinkey_m0.menu.debug.on.build.flags.debug=-g +# Adafruit ProxLight Trinkey (SAMD21) +# ------------------------------ +adafruit_proxlighttrinkey_m0.name=Adafruit ProxLight Trinkey (SAMD21) +adafruit_proxlighttrinkey_m0.vid.0=0x239A +adafruit_proxlighttrinkey_m0.pid.0=0x8103 +adafruit_proxlighttrinkey_m0.vid.1=0x239A +adafruit_proxlighttrinkey_m0.pid.1=0x0103 +adafruit_proxlighttrinkey_m0.vid.1=0x239A +adafruit_proxlighttrinkey_m0.pid.1=0x8104 +adafruit_proxlighttrinkey_m0.upload.tool=bossac +adafruit_proxlighttrinkey_m0.upload.protocol=sam-ba +adafruit_proxlighttrinkey_m0.upload.maximum_size=262144 +adafruit_proxlighttrinkey_m0.upload.offset=0x2000 +adafruit_proxlighttrinkey_m0.upload.use_1200bps_touch=true +adafruit_proxlighttrinkey_m0.upload.wait_for_upload_port=true +adafruit_proxlighttrinkey_m0.upload.native_usb=true +adafruit_proxlighttrinkey_m0.build.mcu=cortex-m0plus +adafruit_proxlighttrinkey_m0.build.f_cpu=48000000L +adafruit_proxlighttrinkey_m0.build.usb_product="ProxLight Trinkey M0" +adafruit_proxlighttrinkey_m0.build.usb_manufacturer="Adafruit" +adafruit_proxlighttrinkey_m0.build.board=PROXLIGHTTRINKEY_M0 +adafruit_proxlighttrinkey_m0.build.core=arduino +adafruit_proxlighttrinkey_m0.build.extra_flags=-DCRYSTALLESS -DADAFRUIT_PROXLIGHTTRINKEY_M0 -D__SAMD21E18A__ -DARM_MATH_CM0PLUS {build.usb_flags} +adafruit_proxlighttrinkey_m0.build.ldscript=linker_scripts/gcc/flash_with_bootloader.ld +adafruit_proxlighttrinkey_m0.build.openocdscript=openocd_scripts/proxlighttrinkey_m0.cfg +adafruit_proxlighttrinkey_m0.build.variant=proxlighttrinkey_m0 +adafruit_proxlighttrinkey_m0.build.variant_system_lib= +adafruit_proxlighttrinkey_m0.build.vid=0x239A +adafruit_proxlighttrinkey_m0.build.pid=0x8103 +adafruit_proxlighttrinkey_m0.bootloader.tool=openocd +adafruit_proxlighttrinkey_m0.bootloader.file=proxlighttrinkey_m0/bootloader-proxlighttrinkey_m0.bin +adafruit_proxlighttrinkey_m0.menu.opt.small=Small (-Os) (standard) +adafruit_proxlighttrinkey_m0.menu.opt.small.build.flags.optimize=-Os +adafruit_proxlighttrinkey_m0.menu.opt.fast=Fast (-O2) +adafruit_proxlighttrinkey_m0.menu.opt.fast.build.flags.optimize=-O2 +adafruit_proxlighttrinkey_m0.menu.opt.faster=Faster (-O3) +adafruit_proxlighttrinkey_m0.menu.opt.faster.build.flags.optimize=-O3 +adafruit_proxlighttrinkey_m0.menu.opt.fastest=Fastest (-Ofast) +adafruit_proxlighttrinkey_m0.menu.opt.fastest.build.flags.optimize=-Ofast +adafruit_proxlighttrinkey_m0.menu.opt.dragons=Here be dragons (-Ofast -funroll-loops) +adafruit_proxlighttrinkey_m0.menu.opt.dragons.build.flags.optimize=-Ofast -funroll-loops +adafruit_proxlighttrinkey_m0.menu.usbstack.arduino=Arduino +adafruit_proxlighttrinkey_m0.menu.usbstack.tinyusb=TinyUSB +adafruit_proxlighttrinkey_m0.menu.usbstack.tinyusb.build.flags.usbstack=-DUSE_TINYUSB +adafruit_proxlighttrinkey_m0.menu.debug.off=Off +adafruit_proxlighttrinkey_m0.menu.debug.on=On +adafruit_proxlighttrinkey_m0.menu.debug.on.build.flags.debug=-g + + # Adafruit ItsyBitsy M0 (SAMD21) # ------------------------------ adafruit_itsybitsy_m0.name=Adafruit ItsyBitsy M0 diff --git a/bootloaders/proxsensetrinkey_m0/bootloader-proxsensetrinkey_m0.bin b/bootloaders/proxlighttrinkey_m0/bootloader-proxlighttrinkey_m0.bin similarity index 100% rename from bootloaders/proxsensetrinkey_m0/bootloader-proxsensetrinkey_m0.bin rename to bootloaders/proxlighttrinkey_m0/bootloader-proxlighttrinkey_m0.bin diff --git a/variants/proxlighttrinkey_m0/debug_scripts/variant.gdb b/variants/proxlighttrinkey_m0/debug_scripts/variant.gdb new file mode 100644 index 000000000..13ee2a173 --- /dev/null +++ b/variants/proxlighttrinkey_m0/debug_scripts/variant.gdb @@ -0,0 +1,31 @@ +# +# Arduino Zero OpenOCD script. +# +# Copyright (c) 2014-2015 Arduino LLC. All right reserved. +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# + +# Define 'reset' command +define reset + +info reg + +break main + +# End of 'reset' command +end + +target remote | openocd -c "interface cmsis-dap" -c "set CHIPNAME at91samd21e18" -f target/at91samdXX.cfg -c "gdb_port pipe; log_output openocd.log" diff --git a/variants/proxlighttrinkey_m0/linker_scripts/gcc/flash_with_bootloader.ld b/variants/proxlighttrinkey_m0/linker_scripts/gcc/flash_with_bootloader.ld new file mode 100644 index 000000000..357946455 --- /dev/null +++ b/variants/proxlighttrinkey_m0/linker_scripts/gcc/flash_with_bootloader.ld @@ -0,0 +1,216 @@ +/* + Copyright (c) 2014-2015 Arduino LLC. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +/* Linker script to configure memory regions. + * Need modifying for a specific board. + * FLASH.ORIGIN: starting address of flash + * FLASH.LENGTH: length of flash + * RAM.ORIGIN: starting address of RAM bank 0 + * RAM.LENGTH: length of RAM bank 0 + */ +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000+0x2000, LENGTH = 0x00040000-0x2000 /* First 8KB used by bootloader */ + RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00008000 +} + +/* Linker script to place sections and symbol values. Should be used together + * with other linker script that defines memory regions FLASH and RAM. + * It references following symbols, which must be defined in code: + * Reset_Handler : Entry of reset handler + * + * It defines following symbols, which code can use without definition: + * __exidx_start + * __exidx_end + * __copy_table_start__ + * __copy_table_end__ + * __zero_table_start__ + * __zero_table_end__ + * __etext + * __data_start__ + * __preinit_array_start + * __preinit_array_end + * __init_array_start + * __init_array_end + * __fini_array_start + * __fini_array_end + * __data_end__ + * __bss_start__ + * __bss_end__ + * __end__ + * end + * __HeapLimit + * __StackLimit + * __StackTop + * __stack + */ +ENTRY(Reset_Handler) + +SECTIONS +{ + .text : + { + __text_start__ = .; + + KEEP(*(.sketch_boot)) + + . = ALIGN(0x2000); + KEEP(*(.isr_vector)) + *(.text*) + + KEEP(*(.init)) + KEEP(*(.fini)) + + /* .ctors */ + *crtbegin.o(.ctors) + *crtbegin?.o(.ctors) + *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors) + *(SORT(.ctors.*)) + *(.ctors) + + /* .dtors */ + *crtbegin.o(.dtors) + *crtbegin?.o(.dtors) + *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors) + *(SORT(.dtors.*)) + *(.dtors) + + *(.rodata*) + + KEEP(*(.eh_frame*)) + } > FLASH + + .ARM.extab : + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } > FLASH + + __exidx_start = .; + .ARM.exidx : + { + *(.ARM.exidx* .gnu.linkonce.armexidx.*) + } > FLASH + __exidx_end = .; + + /* To copy multiple ROM to RAM sections, + * uncomment .copy.table section and, + * define __STARTUP_COPY_MULTIPLE in startup_ARMCMx.S */ + /* + .copy.table : + { + . = ALIGN(4); + __copy_table_start__ = .; + LONG (__etext) + LONG (__data_start__) + LONG (__data_end__ - __data_start__) + LONG (__etext2) + LONG (__data2_start__) + LONG (__data2_end__ - __data2_start__) + __copy_table_end__ = .; + } > FLASH + */ + + /* To clear multiple BSS sections, + * uncomment .zero.table section and, + * define __STARTUP_CLEAR_BSS_MULTIPLE in startup_ARMCMx.S */ + /* + .zero.table : + { + . = ALIGN(4); + __zero_table_start__ = .; + LONG (__bss_start__) + LONG (__bss_end__ - __bss_start__) + LONG (__bss2_start__) + LONG (__bss2_end__ - __bss2_start__) + __zero_table_end__ = .; + } > FLASH + */ + + __etext = .; + + .data : AT (__etext) + { + __data_start__ = .; + *(vtable) + *(.data*) + + . = ALIGN(4); + /* preinit data */ + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP(*(.preinit_array)) + PROVIDE_HIDDEN (__preinit_array_end = .); + + . = ALIGN(4); + /* init data */ + PROVIDE_HIDDEN (__init_array_start = .); + KEEP(*(SORT(.init_array.*))) + KEEP(*(.init_array)) + PROVIDE_HIDDEN (__init_array_end = .); + + + . = ALIGN(4); + /* finit data */ + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP(*(SORT(.fini_array.*))) + KEEP(*(.fini_array)) + PROVIDE_HIDDEN (__fini_array_end = .); + + KEEP(*(.jcr*)) + . = ALIGN(16); + /* All data end */ + __data_end__ = .; + + } > RAM + + .bss : + { + . = ALIGN(4); + __bss_start__ = .; + *(.bss*) + *(COMMON) + . = ALIGN(4); + __bss_end__ = .; + } > RAM + + .heap (COPY): + { + __end__ = .; + PROVIDE(end = .); + *(.heap*) + __HeapLimit = .; + } > RAM + + /* .stack_dummy section doesn't contains any symbols. It is only + * used for linker to calculate size of stack sections, and assign + * values to stack symbols later */ + .stack_dummy (COPY): + { + *(.stack*) + } > RAM + + /* Set stack top to end of RAM, and stack limit move down by + * size of stack_dummy section */ + __StackTop = ORIGIN(RAM) + LENGTH(RAM); + __StackLimit = __StackTop - SIZEOF(.stack_dummy); + PROVIDE(__stack = __StackTop); + + __ram_end__ = ORIGIN(RAM) + LENGTH(RAM) -1 ; + + /* Check if data + heap + stack exceeds RAM limit */ + ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack") +} diff --git a/variants/proxlighttrinkey_m0/linker_scripts/gcc/flash_without_bootloader.ld b/variants/proxlighttrinkey_m0/linker_scripts/gcc/flash_without_bootloader.ld new file mode 100644 index 000000000..ebeeee37f --- /dev/null +++ b/variants/proxlighttrinkey_m0/linker_scripts/gcc/flash_without_bootloader.ld @@ -0,0 +1,214 @@ +/* + Copyright (c) 2014-2015 Arduino LLC. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +/* Linker script to configure memory regions. + * Need modifying for a specific board. + * FLASH.ORIGIN: starting address of flash + * FLASH.LENGTH: length of flash + * RAM.ORIGIN: starting address of RAM bank 0 + * RAM.LENGTH: length of RAM bank 0 + */ +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00040000 + RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00008000 +} + +/* Linker script to place sections and symbol values. Should be used together + * with other linker script that defines memory regions FLASH and RAM. + * It references following symbols, which must be defined in code: + * Reset_Handler : Entry of reset handler + * + * It defines following symbols, which code can use without definition: + * __exidx_start + * __exidx_end + * __copy_table_start__ + * __copy_table_end__ + * __zero_table_start__ + * __zero_table_end__ + * __etext + * __data_start__ + * __preinit_array_start + * __preinit_array_end + * __init_array_start + * __init_array_end + * __fini_array_start + * __fini_array_end + * __data_end__ + * __bss_start__ + * __bss_end__ + * __end__ + * end + * __HeapLimit + * __StackLimit + * __StackTop + * __stack + * __ram_end__ + */ +ENTRY(Reset_Handler) + +SECTIONS +{ + .text : + { + __text_start__ = .; + + KEEP(*(.isr_vector)) + *(.text*) + + KEEP(*(.init)) + KEEP(*(.fini)) + + /* .ctors */ + *crtbegin.o(.ctors) + *crtbegin?.o(.ctors) + *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors) + *(SORT(.ctors.*)) + *(.ctors) + + /* .dtors */ + *crtbegin.o(.dtors) + *crtbegin?.o(.dtors) + *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors) + *(SORT(.dtors.*)) + *(.dtors) + + *(.rodata*) + + KEEP(*(.eh_frame*)) + } > FLASH + + .ARM.extab : + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } > FLASH + + __exidx_start = .; + .ARM.exidx : + { + *(.ARM.exidx* .gnu.linkonce.armexidx.*) + } > FLASH + __exidx_end = .; + + /* To copy multiple ROM to RAM sections, + * uncomment .copy.table section and, + * define __STARTUP_COPY_MULTIPLE in startup_ARMCMx.S */ + /* + .copy.table : + { + . = ALIGN(4); + __copy_table_start__ = .; + LONG (__etext) + LONG (__data_start__) + LONG (__data_end__ - __data_start__) + LONG (__etext2) + LONG (__data2_start__) + LONG (__data2_end__ - __data2_start__) + __copy_table_end__ = .; + } > FLASH + */ + + /* To clear multiple BSS sections, + * uncomment .zero.table section and, + * define __STARTUP_CLEAR_BSS_MULTIPLE in startup_ARMCMx.S */ + /* + .zero.table : + { + . = ALIGN(4); + __zero_table_start__ = .; + LONG (__bss_start__) + LONG (__bss_end__ - __bss_start__) + LONG (__bss2_start__) + LONG (__bss2_end__ - __bss2_start__) + __zero_table_end__ = .; + } > FLASH + */ + + __etext = .; + + .data : AT (__etext) + { + __data_start__ = .; + *(vtable) + *(.data*) + + . = ALIGN(4); + /* preinit data */ + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP(*(.preinit_array)) + PROVIDE_HIDDEN (__preinit_array_end = .); + + . = ALIGN(4); + /* init data */ + PROVIDE_HIDDEN (__init_array_start = .); + KEEP(*(SORT(.init_array.*))) + KEEP(*(.init_array)) + PROVIDE_HIDDEN (__init_array_end = .); + + + . = ALIGN(4); + /* finit data */ + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP(*(SORT(.fini_array.*))) + KEEP(*(.fini_array)) + PROVIDE_HIDDEN (__fini_array_end = .); + + KEEP(*(.jcr*)) + . = ALIGN(16); + /* All data end */ + __data_end__ = .; + + } > RAM + + .bss : + { + . = ALIGN(4); + __bss_start__ = .; + *(.bss*) + *(COMMON) + . = ALIGN(4); + __bss_end__ = .; + } > RAM + + .heap (COPY): + { + __end__ = .; + PROVIDE(end = .); + *(.heap*) + __HeapLimit = .; + } > RAM + + /* .stack_dummy section doesn't contains any symbols. It is only + * used for linker to calculate size of stack sections, and assign + * values to stack symbols later */ + .stack_dummy (COPY): + { + *(.stack*) + } > RAM + + /* Set stack top to end of RAM, and stack limit move down by + * size of stack_dummy section */ + __StackTop = ORIGIN(RAM) + LENGTH(RAM) ; + __StackLimit = __StackTop - SIZEOF(.stack_dummy); + PROVIDE(__stack = __StackTop); + + __ram_end__ = ORIGIN(RAM) + LENGTH(RAM) -1 ; + + /* Check if data + heap + stack exceeds RAM limit */ + ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack") +} diff --git a/variants/proxlighttrinkey_m0/openocd_scripts/proxlighttrinkey_m0.cfg b/variants/proxlighttrinkey_m0/openocd_scripts/proxlighttrinkey_m0.cfg new file mode 100644 index 000000000..e4c3f81dc --- /dev/null +++ b/variants/proxlighttrinkey_m0/openocd_scripts/proxlighttrinkey_m0.cfg @@ -0,0 +1,28 @@ +# +# Adafruit ItsyBitsy M0 OpenOCD script. +# +# Copyright (c) 2014-2015 Arduino LLC. All right reserved. +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# + +# chip name +set CHIPNAME at91samd21e18 +set ENDIAN little + +# choose a port here +set telnet_port 0 + +source [find target/at91samdXX.cfg] diff --git a/variants/proxlighttrinkey_m0/pins_arduino.h b/variants/proxlighttrinkey_m0/pins_arduino.h new file mode 100644 index 000000000..db0e40c3d --- /dev/null +++ b/variants/proxlighttrinkey_m0/pins_arduino.h @@ -0,0 +1,21 @@ +/* + Copyright (c) 2014-2015 Arduino LLC. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +// API compatibility +#include "variant.h" + diff --git a/variants/proxlighttrinkey_m0/variant.cpp b/variants/proxlighttrinkey_m0/variant.cpp new file mode 100644 index 000000000..da5bd8d4d --- /dev/null +++ b/variants/proxlighttrinkey_m0/variant.cpp @@ -0,0 +1,57 @@ +/* + Copyright (c) 2014-2015 Arduino LLC. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#include "variant.h" +#include "Arduino.h" +/* + * Pins descriptions + */ +const PinDescription g_APinDescription[]= +{ + // Fake DAC A0 pin just so we can compile stuff + { PORTA, 2, PIO_ANALOG, (PIN_ATTR_DIGITAL|PIN_ATTR_ANALOG|PIN_ATTR_PWM|PIN_ATTR_TIMER), ADC_Channel0, PWM2_CH0, TCC2_CH0, EXTERNAL_INT_2 }, // A0 / D0 / DAC + + // touch 1 / A1 + { PORTA, 7, PIO_ANALOG, (PIN_ATTR_ANALOG|PIN_ATTR_PWM|PIN_ATTR_TIMER), ADC_Channel7, PWM1_CH1, TCC1_CH1, EXTERNAL_INT_7 }, // TCC1/WO[1] + // touch 2 / A2 + { PORTA, 3, PIO_ANALOG, (PIN_ATTR_ANALOG), ADC_Channel3, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_3 }, // ADC/AIN[3] + + // NeoPixel / D3 + { PORTA, 15, PIO_TIMER, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM|PIN_ATTR_TIMER), No_ADC_Channel, PWM3_CH1, TC3_CH1, EXTERNAL_INT_15 }, // TC3/WO[1] + + // I2C SDA D4 & SCL D5 + { PORTA, 16, PIO_SERCOM, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM|PIN_ATTR_TIMER_ALT), No_ADC_Channel, PWM0_CH6, TCC0_CH6, EXTERNAL_INT_0 }, // D4 / SDA / PWM + { PORTA, 17, PIO_SERCOM, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM|PIN_ATTR_TIMER_ALT), No_ADC_Channel, PWM0_CH7, TCC0_CH7, EXTERNAL_INT_1 }, // D5 / SCL / PWM + + // Interrupt D6 + { PORTA, 0, PIO_DIGITAL, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM|PIN_ATTR_TIMER), No_ADC_Channel, PWM2_CH0, TCC2_CH0, EXTERNAL_INT_0 }, + + // USB pins + { PORTA, 28, PIO_COM, PIN_ATTR_NONE, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_NONE }, // USB Host enable + { PORTA, 24, PIO_COM, PIN_ATTR_NONE, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_NONE }, // USB/DM + { PORTA, 25, PIO_COM, PIN_ATTR_NONE, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_NONE }, // USB/DP + +} ; + +const void* g_apTCInstances[TCC_INST_NUM+TC_INST_NUM]={ TCC0, TCC1, TCC2, TC3, TC4, TC5 } ; + +// Multi-serial objects instantiation +SERCOM sercom0( SERCOM0 ) ; +SERCOM sercom1( SERCOM1 ) ; +SERCOM sercom2( SERCOM2 ) ; +SERCOM sercom3( SERCOM3 ) ; diff --git a/variants/proxlighttrinkey_m0/variant.h b/variants/proxlighttrinkey_m0/variant.h new file mode 100644 index 000000000..bb9232265 --- /dev/null +++ b/variants/proxlighttrinkey_m0/variant.h @@ -0,0 +1,180 @@ +/* + Copyright (c) 2014-2015 Arduino LLC. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#ifndef _VARIANT_PROXLIGHTTRINKEY_ZERO_ +#define _VARIANT_PROXLIGHTTRINKEY_ZERO_ + +// The definitions here needs a SAMD core >=1.6.10 +#define ARDUINO_SAMD_VARIANT_COMPLIANCE 10610 + +/*---------------------------------------------------------------------------- + * Definitions + *----------------------------------------------------------------------------*/ + +/** Frequency of the board main oscillator */ +#define VARIANT_MAINOSC (32768ul) + +/** Master clock frequency */ +#define VARIANT_MCK (F_CPU) + +/*---------------------------------------------------------------------------- + * Headers + *----------------------------------------------------------------------------*/ + +#include "WVariant.h" + +#ifdef __cplusplus +#include "SERCOM.h" +#include "Uart.h" +#endif // __cplusplus + +#ifdef __cplusplus +extern "C" +{ +#endif // __cplusplus + +/*---------------------------------------------------------------------------- + * Pins + *----------------------------------------------------------------------------*/ + +// Number of pins defined in PinDescription array +#define PINS_COUNT (10u) +#define NUM_DIGITAL_PINS (6u) +#define NUM_ANALOG_INPUTS (3u) +#define NUM_ANALOG_OUTPUTS (1u) +#define analogInputToDigitalPin(p) (p) + +#define digitalPinToPort(P) ( &(PORT->Group[g_APinDescription[P].ulPort]) ) +#define digitalPinToBitMask(P) ( 1 << g_APinDescription[P].ulPin ) +//#define analogInPinToBit(P) ( ) +#define portOutputRegister(port) ( &(port->OUT.reg) ) +#define portInputRegister(port) ( &(port->IN.reg) ) +#define portModeRegister(port) ( &(port->DIR.reg) ) +#define digitalPinHasPWM(P) ( g_APinDescription[P].ulPWMChannel != NOT_ON_PWM || g_APinDescription[P].ulTCChannel != NOT_ON_TIMER ) + +/* + * digitalPinToTimer(..) is AVR-specific and is not defined for SAMD + * architecture. If you need to check if a pin supports PWM you must + * use digitalPinHasPWM(..). + * + * https://github.com/arduino/Arduino/issues/1833 + */ +// #define digitalPinToTimer(P) + +// LEDs +#define PIN_NEOPIXEL (3u) +#define NUM_NEOPIXEL (2u) + +// TOUCH PINS +#define PIN_TOUCH1 1 +#define PIN_TOUCH2 2 + +#define PIN_INTERRUPT 6 + +/* + * Analog pins + */ +#define PIN_A0 (0ul) +#define PIN_A1 (1) +#define PIN_A2 (2) +#define PIN_DAC0 PIN_A0 + +static const uint8_t A0 = PIN_A0; +static const uint8_t A1 = PIN_A1; +static const uint8_t A2 = PIN_A2; + +#define ADC_RESOLUTION 12 + + +/* + * SPI Interfaces + */ +#define SPI_INTERFACES_COUNT 0 + +/* + * Wire Interfaces + */ +#define WIRE_INTERFACES_COUNT 1 + +#define PIN_WIRE_SDA (4u) +#define PIN_WIRE_SCL (5u) +#define PERIPH_WIRE sercom1 +#define WIRE_IT_HANDLER SERCOM1_Handler + +static const uint8_t SDA = PIN_WIRE_SDA; +static const uint8_t SCL = PIN_WIRE_SCL; + +/* + * USB + */ +#define PIN_USB_HOST_ENABLE (5ul) +#define PIN_USB_DM (6ul) +#define PIN_USB_DP (7ul) +/* + * I2S Interfaces + */ +#define I2S_INTERFACES_COUNT 0 + + +#ifdef __cplusplus +} +#endif + +/*---------------------------------------------------------------------------- + * Arduino objects - C++ only + *----------------------------------------------------------------------------*/ + +#ifdef __cplusplus + +/* ========================= + * ===== SERCOM DEFINITION + * ========================= +*/ +extern SERCOM sercom0; +extern SERCOM sercom1; +extern SERCOM sercom2; +extern SERCOM sercom3; +extern SERCOM sercom4; +extern SERCOM sercom5; + + +#endif + +// These serial port names are intended to allow libraries and architecture-neutral +// sketches to automatically default to the correct port name for a particular type +// of use. For example, a GPS module would normally connect to SERIAL_PORT_HARDWARE_OPEN, +// the first hardware serial port whose RX/TX pins are not dedicated to another use. +// +// SERIAL_PORT_MONITOR Port which normally prints to the Arduino Serial Monitor +// +// SERIAL_PORT_USBVIRTUAL Port which is USB virtual serial +// +// SERIAL_PORT_LINUXBRIDGE Port which connects to a Linux system via Bridge library +// +// SERIAL_PORT_HARDWARE Hardware serial port, physical RX & TX pins. +// +// SERIAL_PORT_HARDWARE_OPEN Hardware serial ports which are open for use. Their RX & TX +// pins are NOT connected to anything by default. +#define SERIAL_PORT_USBVIRTUAL Serial +#define SERIAL_PORT_MONITOR Serial +// Serial has no physical pins broken out, so it's not listed as HARDWARE port +#define SERIAL_PORT_HARDWARE Serial1 +#define SERIAL_PORT_HARDWARE_OPEN Serial1 + +#endif /* _VARIANT_ARDUINO_ZERO_ */ + From 6faed3eea8ac08a9241a837a13cd26fcea8beb32 Mon Sep 17 00:00:00 2001 From: lady ada Date: Wed, 5 May 2021 10:34:58 -0400 Subject: [PATCH 4/7] update variant to shipping --- variants/rotarytrinkey_m0/variant.cpp | 2 +- variants/rotarytrinkey_m0/variant.h | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/variants/rotarytrinkey_m0/variant.cpp b/variants/rotarytrinkey_m0/variant.cpp index bb855aa97..e3c824ff5 100644 --- a/variants/rotarytrinkey_m0/variant.cpp +++ b/variants/rotarytrinkey_m0/variant.cpp @@ -30,7 +30,7 @@ const PinDescription g_APinDescription[]= { PORTA, 0, PIO_DIGITAL, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM|PIN_ATTR_TIMER), No_ADC_Channel, PWM2_CH0, TCC2_CH0, EXTERNAL_INT_0 }, // Encoder pin 2 - { PORTA, 6, PIO_DIGITAL, (PIN_ATTR_DIGITAL|PIN_ATTR_ANALOG|PIN_ATTR_PWM|PIN_ATTR_TIMER), ADC_Channel6, PWM1_CH0, TCC1_CH0, EXTERNAL_INT_6 }, + { PORTA, 4, PIO_DIGITAL, (PIN_ATTR_DIGITAL|PIN_ATTR_ANALOG|PIN_ATTR_PWM|PIN_ATTR_TIMER), ADC_Channel4, PWM0_CH0, TCC0_CH0, EXTERNAL_INT_4 }, // Encoder switch { PORTA, 27, PIO_DIGITAL, (PIN_ATTR_DIGITAL), No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_15 }, diff --git a/variants/rotarytrinkey_m0/variant.h b/variants/rotarytrinkey_m0/variant.h index 5ba6558f7..8490ee360 100644 --- a/variants/rotarytrinkey_m0/variant.h +++ b/variants/rotarytrinkey_m0/variant.h @@ -85,6 +85,8 @@ extern "C" #define PIN_ENCODER_B 2 #define PIN_ENCODER_SWITCH 3 +#define PIN_TOUCH 4 + /* * Analog pins */ From a9fe013912d2aa171ad1a04390452b09272ae587 Mon Sep 17 00:00:00 2001 From: lady ada Date: Wed, 5 May 2021 10:48:56 -0400 Subject: [PATCH 5/7] forgot one! --- boards.txt | 50 ++++ .../bootloader-neokeytrinkey_m0.bin | Bin 0 -> 8192 bytes .../debug_scripts/variant.gdb | 31 +++ .../gcc/flash_with_bootloader.ld | 216 ++++++++++++++++++ .../gcc/flash_without_bootloader.ld | 214 +++++++++++++++++ .../openocd_scripts/neokeytrinkey_m0.cfg | 28 +++ variants/neokeytrinkey_m0/pins_arduino.h | 21 ++ variants/neokeytrinkey_m0/variant.cpp | 54 +++++ variants/neokeytrinkey_m0/variant.h | 171 ++++++++++++++ 9 files changed, 785 insertions(+) create mode 100644 bootloaders/neokeytrinkey_m0/bootloader-neokeytrinkey_m0.bin create mode 100644 variants/neokeytrinkey_m0/debug_scripts/variant.gdb create mode 100644 variants/neokeytrinkey_m0/linker_scripts/gcc/flash_with_bootloader.ld create mode 100644 variants/neokeytrinkey_m0/linker_scripts/gcc/flash_without_bootloader.ld create mode 100644 variants/neokeytrinkey_m0/openocd_scripts/neokeytrinkey_m0.cfg create mode 100644 variants/neokeytrinkey_m0/pins_arduino.h create mode 100644 variants/neokeytrinkey_m0/variant.cpp create mode 100644 variants/neokeytrinkey_m0/variant.h diff --git a/boards.txt b/boards.txt index 364ca2332..26095333a 100644 --- a/boards.txt +++ b/boards.txt @@ -474,6 +474,56 @@ adafruit_rotarytrinkey_m0.menu.debug.off=Off adafruit_rotarytrinkey_m0.menu.debug.on=On adafruit_rotarytrinkey_m0.menu.debug.on.build.flags.debug=-g +# Adafruit NeoKey Trinkey (SAMD21) +# ------------------------------ +adafruit_neokeytrinkey_m0.name=Adafruit Rotary Trinkey (SAMD21) +adafruit_neokeytrinkey_m0.vid.0=0x239A +adafruit_neokeytrinkey_m0.pid.0=0x80FF +adafruit_neokeytrinkey_m0.vid.1=0x239A +adafruit_neokeytrinkey_m0.pid.1=0x00FF +adafruit_neokeytrinkey_m0.vid.1=0x239A +adafruit_neokeytrinkey_m0.pid.1=0x8100 +adafruit_neokeytrinkey_m0.upload.tool=bossac +adafruit_neokeytrinkey_m0.upload.protocol=sam-ba +adafruit_neokeytrinkey_m0.upload.maximum_size=262144 +adafruit_neokeytrinkey_m0.upload.offset=0x2000 +adafruit_neokeytrinkey_m0.upload.use_1200bps_touch=true +adafruit_neokeytrinkey_m0.upload.wait_for_upload_port=true +adafruit_neokeytrinkey_m0.upload.native_usb=true +adafruit_neokeytrinkey_m0.build.mcu=cortex-m0plus +adafruit_neokeytrinkey_m0.build.f_cpu=48000000L +adafruit_neokeytrinkey_m0.build.usb_product="NeoKey Trinkey M0" +adafruit_neokeytrinkey_m0.build.usb_manufacturer="Adafruit" +adafruit_neokeytrinkey_m0.build.board=NEOKEYTRINKEY_M0 +adafruit_neokeytrinkey_m0.build.core=arduino +adafruit_neokeytrinkey_m0.build.extra_flags=-DCRYSTALLESS -DADAFRUIT_NEOKEYTRINKEY_M0 -D__SAMD21E18A__ -DARM_MATH_CM0PLUS {build.usb_flags} +adafruit_neokeytrinkey_m0.build.ldscript=linker_scripts/gcc/flash_with_bootloader.ld +adafruit_neokeytrinkey_m0.build.openocdscript=openocd_scripts/neokeytrinkey_m0.cfg +adafruit_neokeytrinkey_m0.build.variant=neokeytrinkey_m0 +adafruit_neokeytrinkey_m0.build.variant_system_lib= +adafruit_neokeytrinkey_m0.build.vid=0x239A +adafruit_neokeytrinkey_m0.build.pid=0x80FF +adafruit_neokeytrinkey_m0.bootloader.tool=openocd +adafruit_neokeytrinkey_m0.bootloader.file=neokeytrinkey_m0/bootloader-neokeytrinkey_m0.bin +adafruit_neokeytrinkey_m0.menu.opt.small=Small (-Os) (standard) +adafruit_neokeytrinkey_m0.menu.opt.small.build.flags.optimize=-Os +adafruit_neokeytrinkey_m0.menu.opt.fast=Fast (-O2) +adafruit_neokeytrinkey_m0.menu.opt.fast.build.flags.optimize=-O2 +adafruit_neokeytrinkey_m0.menu.opt.faster=Faster (-O3) +adafruit_neokeytrinkey_m0.menu.opt.faster.build.flags.optimize=-O3 +adafruit_neokeytrinkey_m0.menu.opt.fastest=Fastest (-Ofast) +adafruit_neokeytrinkey_m0.menu.opt.fastest.build.flags.optimize=-Ofast +adafruit_neokeytrinkey_m0.menu.opt.dragons=Here be dragons (-Ofast -funroll-loops) + +adafruit_neokeytrinkey_m0.menu.opt.dragons.build.flags.optimize=-Ofast -funroll-loops +adafruit_neokeytrinkey_m0.menu.usbstack.arduino=Arduino +adafruit_neokeytrinkey_m0.menu.usbstack.tinyusb=TinyUSB +adafruit_neokeytrinkey_m0.menu.usbstack.tinyusb.build.flags.usbstack=-DUSE_TINYUSB +adafruit_neokeytrinkey_m0.menu.debug.off=Off +adafruit_neokeytrinkey_m0.menu.debug.on=On +adafruit_neokeytrinkey_m0.menu.debug.on.build.flags.debug=-g + + # Adafruit Slide Trinkey (SAMD21) # ------------------------------ adafruit_slidetrinkey_m0.name=Adafruit Slide Trinkey (SAMD21) diff --git a/bootloaders/neokeytrinkey_m0/bootloader-neokeytrinkey_m0.bin b/bootloaders/neokeytrinkey_m0/bootloader-neokeytrinkey_m0.bin new file mode 100644 index 0000000000000000000000000000000000000000..ea8af4d4e7fd18ecb1ca3f5067a34ec3b1bac5f2 GIT binary patch literal 8192 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 TYQq2DeqY-FeuLLDYFGaUl%JS< literal 0 HcmV?d00001 diff --git a/variants/neokeytrinkey_m0/debug_scripts/variant.gdb b/variants/neokeytrinkey_m0/debug_scripts/variant.gdb new file mode 100644 index 000000000..13ee2a173 --- /dev/null +++ b/variants/neokeytrinkey_m0/debug_scripts/variant.gdb @@ -0,0 +1,31 @@ +# +# Arduino Zero OpenOCD script. +# +# Copyright (c) 2014-2015 Arduino LLC. All right reserved. +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# + +# Define 'reset' command +define reset + +info reg + +break main + +# End of 'reset' command +end + +target remote | openocd -c "interface cmsis-dap" -c "set CHIPNAME at91samd21e18" -f target/at91samdXX.cfg -c "gdb_port pipe; log_output openocd.log" diff --git a/variants/neokeytrinkey_m0/linker_scripts/gcc/flash_with_bootloader.ld b/variants/neokeytrinkey_m0/linker_scripts/gcc/flash_with_bootloader.ld new file mode 100644 index 000000000..357946455 --- /dev/null +++ b/variants/neokeytrinkey_m0/linker_scripts/gcc/flash_with_bootloader.ld @@ -0,0 +1,216 @@ +/* + Copyright (c) 2014-2015 Arduino LLC. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +/* Linker script to configure memory regions. + * Need modifying for a specific board. + * FLASH.ORIGIN: starting address of flash + * FLASH.LENGTH: length of flash + * RAM.ORIGIN: starting address of RAM bank 0 + * RAM.LENGTH: length of RAM bank 0 + */ +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000+0x2000, LENGTH = 0x00040000-0x2000 /* First 8KB used by bootloader */ + RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00008000 +} + +/* Linker script to place sections and symbol values. Should be used together + * with other linker script that defines memory regions FLASH and RAM. + * It references following symbols, which must be defined in code: + * Reset_Handler : Entry of reset handler + * + * It defines following symbols, which code can use without definition: + * __exidx_start + * __exidx_end + * __copy_table_start__ + * __copy_table_end__ + * __zero_table_start__ + * __zero_table_end__ + * __etext + * __data_start__ + * __preinit_array_start + * __preinit_array_end + * __init_array_start + * __init_array_end + * __fini_array_start + * __fini_array_end + * __data_end__ + * __bss_start__ + * __bss_end__ + * __end__ + * end + * __HeapLimit + * __StackLimit + * __StackTop + * __stack + */ +ENTRY(Reset_Handler) + +SECTIONS +{ + .text : + { + __text_start__ = .; + + KEEP(*(.sketch_boot)) + + . = ALIGN(0x2000); + KEEP(*(.isr_vector)) + *(.text*) + + KEEP(*(.init)) + KEEP(*(.fini)) + + /* .ctors */ + *crtbegin.o(.ctors) + *crtbegin?.o(.ctors) + *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors) + *(SORT(.ctors.*)) + *(.ctors) + + /* .dtors */ + *crtbegin.o(.dtors) + *crtbegin?.o(.dtors) + *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors) + *(SORT(.dtors.*)) + *(.dtors) + + *(.rodata*) + + KEEP(*(.eh_frame*)) + } > FLASH + + .ARM.extab : + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } > FLASH + + __exidx_start = .; + .ARM.exidx : + { + *(.ARM.exidx* .gnu.linkonce.armexidx.*) + } > FLASH + __exidx_end = .; + + /* To copy multiple ROM to RAM sections, + * uncomment .copy.table section and, + * define __STARTUP_COPY_MULTIPLE in startup_ARMCMx.S */ + /* + .copy.table : + { + . = ALIGN(4); + __copy_table_start__ = .; + LONG (__etext) + LONG (__data_start__) + LONG (__data_end__ - __data_start__) + LONG (__etext2) + LONG (__data2_start__) + LONG (__data2_end__ - __data2_start__) + __copy_table_end__ = .; + } > FLASH + */ + + /* To clear multiple BSS sections, + * uncomment .zero.table section and, + * define __STARTUP_CLEAR_BSS_MULTIPLE in startup_ARMCMx.S */ + /* + .zero.table : + { + . = ALIGN(4); + __zero_table_start__ = .; + LONG (__bss_start__) + LONG (__bss_end__ - __bss_start__) + LONG (__bss2_start__) + LONG (__bss2_end__ - __bss2_start__) + __zero_table_end__ = .; + } > FLASH + */ + + __etext = .; + + .data : AT (__etext) + { + __data_start__ = .; + *(vtable) + *(.data*) + + . = ALIGN(4); + /* preinit data */ + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP(*(.preinit_array)) + PROVIDE_HIDDEN (__preinit_array_end = .); + + . = ALIGN(4); + /* init data */ + PROVIDE_HIDDEN (__init_array_start = .); + KEEP(*(SORT(.init_array.*))) + KEEP(*(.init_array)) + PROVIDE_HIDDEN (__init_array_end = .); + + + . = ALIGN(4); + /* finit data */ + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP(*(SORT(.fini_array.*))) + KEEP(*(.fini_array)) + PROVIDE_HIDDEN (__fini_array_end = .); + + KEEP(*(.jcr*)) + . = ALIGN(16); + /* All data end */ + __data_end__ = .; + + } > RAM + + .bss : + { + . = ALIGN(4); + __bss_start__ = .; + *(.bss*) + *(COMMON) + . = ALIGN(4); + __bss_end__ = .; + } > RAM + + .heap (COPY): + { + __end__ = .; + PROVIDE(end = .); + *(.heap*) + __HeapLimit = .; + } > RAM + + /* .stack_dummy section doesn't contains any symbols. It is only + * used for linker to calculate size of stack sections, and assign + * values to stack symbols later */ + .stack_dummy (COPY): + { + *(.stack*) + } > RAM + + /* Set stack top to end of RAM, and stack limit move down by + * size of stack_dummy section */ + __StackTop = ORIGIN(RAM) + LENGTH(RAM); + __StackLimit = __StackTop - SIZEOF(.stack_dummy); + PROVIDE(__stack = __StackTop); + + __ram_end__ = ORIGIN(RAM) + LENGTH(RAM) -1 ; + + /* Check if data + heap + stack exceeds RAM limit */ + ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack") +} diff --git a/variants/neokeytrinkey_m0/linker_scripts/gcc/flash_without_bootloader.ld b/variants/neokeytrinkey_m0/linker_scripts/gcc/flash_without_bootloader.ld new file mode 100644 index 000000000..ebeeee37f --- /dev/null +++ b/variants/neokeytrinkey_m0/linker_scripts/gcc/flash_without_bootloader.ld @@ -0,0 +1,214 @@ +/* + Copyright (c) 2014-2015 Arduino LLC. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +/* Linker script to configure memory regions. + * Need modifying for a specific board. + * FLASH.ORIGIN: starting address of flash + * FLASH.LENGTH: length of flash + * RAM.ORIGIN: starting address of RAM bank 0 + * RAM.LENGTH: length of RAM bank 0 + */ +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00040000 + RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00008000 +} + +/* Linker script to place sections and symbol values. Should be used together + * with other linker script that defines memory regions FLASH and RAM. + * It references following symbols, which must be defined in code: + * Reset_Handler : Entry of reset handler + * + * It defines following symbols, which code can use without definition: + * __exidx_start + * __exidx_end + * __copy_table_start__ + * __copy_table_end__ + * __zero_table_start__ + * __zero_table_end__ + * __etext + * __data_start__ + * __preinit_array_start + * __preinit_array_end + * __init_array_start + * __init_array_end + * __fini_array_start + * __fini_array_end + * __data_end__ + * __bss_start__ + * __bss_end__ + * __end__ + * end + * __HeapLimit + * __StackLimit + * __StackTop + * __stack + * __ram_end__ + */ +ENTRY(Reset_Handler) + +SECTIONS +{ + .text : + { + __text_start__ = .; + + KEEP(*(.isr_vector)) + *(.text*) + + KEEP(*(.init)) + KEEP(*(.fini)) + + /* .ctors */ + *crtbegin.o(.ctors) + *crtbegin?.o(.ctors) + *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors) + *(SORT(.ctors.*)) + *(.ctors) + + /* .dtors */ + *crtbegin.o(.dtors) + *crtbegin?.o(.dtors) + *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors) + *(SORT(.dtors.*)) + *(.dtors) + + *(.rodata*) + + KEEP(*(.eh_frame*)) + } > FLASH + + .ARM.extab : + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } > FLASH + + __exidx_start = .; + .ARM.exidx : + { + *(.ARM.exidx* .gnu.linkonce.armexidx.*) + } > FLASH + __exidx_end = .; + + /* To copy multiple ROM to RAM sections, + * uncomment .copy.table section and, + * define __STARTUP_COPY_MULTIPLE in startup_ARMCMx.S */ + /* + .copy.table : + { + . = ALIGN(4); + __copy_table_start__ = .; + LONG (__etext) + LONG (__data_start__) + LONG (__data_end__ - __data_start__) + LONG (__etext2) + LONG (__data2_start__) + LONG (__data2_end__ - __data2_start__) + __copy_table_end__ = .; + } > FLASH + */ + + /* To clear multiple BSS sections, + * uncomment .zero.table section and, + * define __STARTUP_CLEAR_BSS_MULTIPLE in startup_ARMCMx.S */ + /* + .zero.table : + { + . = ALIGN(4); + __zero_table_start__ = .; + LONG (__bss_start__) + LONG (__bss_end__ - __bss_start__) + LONG (__bss2_start__) + LONG (__bss2_end__ - __bss2_start__) + __zero_table_end__ = .; + } > FLASH + */ + + __etext = .; + + .data : AT (__etext) + { + __data_start__ = .; + *(vtable) + *(.data*) + + . = ALIGN(4); + /* preinit data */ + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP(*(.preinit_array)) + PROVIDE_HIDDEN (__preinit_array_end = .); + + . = ALIGN(4); + /* init data */ + PROVIDE_HIDDEN (__init_array_start = .); + KEEP(*(SORT(.init_array.*))) + KEEP(*(.init_array)) + PROVIDE_HIDDEN (__init_array_end = .); + + + . = ALIGN(4); + /* finit data */ + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP(*(SORT(.fini_array.*))) + KEEP(*(.fini_array)) + PROVIDE_HIDDEN (__fini_array_end = .); + + KEEP(*(.jcr*)) + . = ALIGN(16); + /* All data end */ + __data_end__ = .; + + } > RAM + + .bss : + { + . = ALIGN(4); + __bss_start__ = .; + *(.bss*) + *(COMMON) + . = ALIGN(4); + __bss_end__ = .; + } > RAM + + .heap (COPY): + { + __end__ = .; + PROVIDE(end = .); + *(.heap*) + __HeapLimit = .; + } > RAM + + /* .stack_dummy section doesn't contains any symbols. It is only + * used for linker to calculate size of stack sections, and assign + * values to stack symbols later */ + .stack_dummy (COPY): + { + *(.stack*) + } > RAM + + /* Set stack top to end of RAM, and stack limit move down by + * size of stack_dummy section */ + __StackTop = ORIGIN(RAM) + LENGTH(RAM) ; + __StackLimit = __StackTop - SIZEOF(.stack_dummy); + PROVIDE(__stack = __StackTop); + + __ram_end__ = ORIGIN(RAM) + LENGTH(RAM) -1 ; + + /* Check if data + heap + stack exceeds RAM limit */ + ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack") +} diff --git a/variants/neokeytrinkey_m0/openocd_scripts/neokeytrinkey_m0.cfg b/variants/neokeytrinkey_m0/openocd_scripts/neokeytrinkey_m0.cfg new file mode 100644 index 000000000..e4c3f81dc --- /dev/null +++ b/variants/neokeytrinkey_m0/openocd_scripts/neokeytrinkey_m0.cfg @@ -0,0 +1,28 @@ +# +# Adafruit ItsyBitsy M0 OpenOCD script. +# +# Copyright (c) 2014-2015 Arduino LLC. All right reserved. +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# + +# chip name +set CHIPNAME at91samd21e18 +set ENDIAN little + +# choose a port here +set telnet_port 0 + +source [find target/at91samdXX.cfg] diff --git a/variants/neokeytrinkey_m0/pins_arduino.h b/variants/neokeytrinkey_m0/pins_arduino.h new file mode 100644 index 000000000..db0e40c3d --- /dev/null +++ b/variants/neokeytrinkey_m0/pins_arduino.h @@ -0,0 +1,21 @@ +/* + Copyright (c) 2014-2015 Arduino LLC. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +// API compatibility +#include "variant.h" + diff --git a/variants/neokeytrinkey_m0/variant.cpp b/variants/neokeytrinkey_m0/variant.cpp new file mode 100644 index 000000000..5703d3177 --- /dev/null +++ b/variants/neokeytrinkey_m0/variant.cpp @@ -0,0 +1,54 @@ +/* + Copyright (c) 2014-2015 Arduino LLC. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#include "variant.h" +#include "Arduino.h" +/* + * Pins descriptions + */ +const PinDescription g_APinDescription[]= +{ + // NeoPixel + { PORTA, 15, PIO_DIGITAL, (PIN_ATTR_DIGITAL), No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_15 }, + + // Mechanical switch + { PORTA, 28, PIO_DIGITAL, (PIN_ATTR_DIGITAL), No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_8 }, + + // Touch pad + { PORTA, 7, PIO_DIGITAL, (PIN_ATTR_DIGITAL|PIN_ATTR_ANALOG|PIN_ATTR_PWM|PIN_ATTR_TIMER), ADC_Channel7, PWM1_CH1, TCC1_CH1, EXTERNAL_INT_7 }, + + + // USB pins + { PORTA, 28, PIO_COM, PIN_ATTR_NONE, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_NONE }, // USB Host enable + { PORTA, 24, PIO_COM, PIN_ATTR_NONE, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_NONE }, // USB/DM + { PORTA, 25, PIO_COM, PIN_ATTR_NONE, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_NONE }, // USB/DP + + // Fake DAC pin just so we can compile stuff + { PORTA, 2, PIO_ANALOG, (PIN_ATTR_DIGITAL|PIN_ATTR_ANALOG|PIN_ATTR_PWM|PIN_ATTR_TIMER), ADC_Channel0, PWM2_CH0, TCC2_CH0, EXTERNAL_INT_2 }, // A0 / D0 / DAC +} ; + +const void* g_apTCInstances[TCC_INST_NUM+TC_INST_NUM]={ TCC0, TCC1, TCC2, TC3, TC4, TC5 } ; + +// Multi-serial objects instantiation +SERCOM sercom0( SERCOM0 ) ; +SERCOM sercom1( SERCOM1 ) ; +SERCOM sercom2( SERCOM2 ) ; +SERCOM sercom3( SERCOM3 ) ; + +/* + * Serial interfaces diff --git a/variants/neokeytrinkey_m0/variant.h b/variants/neokeytrinkey_m0/variant.h new file mode 100644 index 000000000..e866d8afe --- /dev/null +++ b/variants/neokeytrinkey_m0/variant.h @@ -0,0 +1,171 @@ +/* + Copyright (c) 2014-2015 Arduino LLC. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#ifndef _VARIANT_NEOKEYTRINKEY_ZERO_ +#define _VARIANT_NEOKEYTRINKEY_ZERO_ + +// The definitions here needs a SAMD core >=1.6.10 +#define ARDUINO_SAMD_VARIANT_COMPLIANCE 10610 + +/*---------------------------------------------------------------------------- + * Definitions + *----------------------------------------------------------------------------*/ + +/** Frequency of the board main oscillator */ +#define VARIANT_MAINOSC (32768ul) + +/** Master clock frequency */ +#define VARIANT_MCK (F_CPU) + +/*---------------------------------------------------------------------------- + * Headers + *----------------------------------------------------------------------------*/ + +#include "WVariant.h" + +#ifdef __cplusplus +#include "SERCOM.h" +#include "Uart.h" +#endif // __cplusplus + +#ifdef __cplusplus +extern "C" +{ +#endif // __cplusplus + +/*---------------------------------------------------------------------------- + * Pins + *----------------------------------------------------------------------------*/ + +// Number of pins defined in PinDescription array +#define PINS_COUNT (6u) +#define NUM_DIGITAL_PINS (6u) +#define NUM_ANALOG_INPUTS (1u) +#define NUM_ANALOG_OUTPUTS (1u) +#define analogInputToDigitalPin(p) (p) + +#define digitalPinToPort(P) ( &(PORT->Group[g_APinDescription[P].ulPort]) ) +#define digitalPinToBitMask(P) ( 1 << g_APinDescription[P].ulPin ) +//#define analogInPinToBit(P) ( ) +#define portOutputRegister(port) ( &(port->OUT.reg) ) +#define portInputRegister(port) ( &(port->IN.reg) ) +#define portModeRegister(port) ( &(port->DIR.reg) ) +#define digitalPinHasPWM(P) ( g_APinDescription[P].ulPWMChannel != NOT_ON_PWM || g_APinDescription[P].ulTCChannel != NOT_ON_TIMER ) + +/* + * digitalPinToTimer(..) is AVR-specific and is not defined for SAMD + * architecture. If you need to check if a pin supports PWM you must + * use digitalPinHasPWM(..). + * + * https://github.com/arduino/Arduino/issues/1833 + */ +// #define digitalPinToTimer(P) + +// LEDs +#define PIN_NEOPIXEL (0u) +#define NUM_NEOPIXEL (1u) + +#define PIN_SWITCH 1 +#define PIN_TOUCH 2 + +/* + * Analog pins + */ +#define PIN_A0 (6ul) +#define PIN_A1 (2) +#define PIN_DAC0 PIN_A0 + +static const uint8_t A0 = PIN_A0; +static const uint8_t A1 = PIN_A1; + +#define ADC_RESOLUTION 12 + + +/* + * SPI Interfaces + */ +#define SPI_INTERFACES_COUNT 0 + +/* + * Wire Interfaces + */ +#define WIRE_INTERFACES_COUNT 0 + +/* + * USB + */ +#define PIN_USB_HOST_ENABLE (3ul) +#define PIN_USB_DM (4ul) +#define PIN_USB_DP (5ul) +/* + * I2S Interfaces + */ +#define I2S_INTERFACES_COUNT 0 + + +/* + * Serial interfaces + */ + +#ifdef __cplusplus +} +#endif + +/*---------------------------------------------------------------------------- + * Arduino objects - C++ only + *----------------------------------------------------------------------------*/ + +#ifdef __cplusplus + +/* ========================= + * ===== SERCOM DEFINITION + * ========================= +*/ +extern SERCOM sercom0; +extern SERCOM sercom1; +extern SERCOM sercom2; +extern SERCOM sercom3; +extern SERCOM sercom4; +extern SERCOM sercom5; + + +#endif + +// These serial port names are intended to allow libraries and architecture-neutral +// sketches to automatically default to the correct port name for a particular type +// of use. For example, a GPS module would normally connect to SERIAL_PORT_HARDWARE_OPEN, +// the first hardware serial port whose RX/TX pins are not dedicated to another use. +// +// SERIAL_PORT_MONITOR Port which normally prints to the Arduino Serial Monitor +// +// SERIAL_PORT_USBVIRTUAL Port which is USB virtual serial +// +// SERIAL_PORT_LINUXBRIDGE Port which connects to a Linux system via Bridge library +// +// SERIAL_PORT_HARDWARE Hardware serial port, physical RX & TX pins. +// +// SERIAL_PORT_HARDWARE_OPEN Hardware serial ports which are open for use. Their RX & TX +// pins are NOT connected to anything by default. +#define SERIAL_PORT_USBVIRTUAL Serial +#define SERIAL_PORT_MONITOR Serial +// Serial has no physical pins broken out, so it's not listed as HARDWARE port +#define SERIAL_PORT_HARDWARE Serial1 +#define SERIAL_PORT_HARDWARE_OPEN Serial1 + +#endif /* _VARIANT_ARDUINO_ZERO_ */ + From f2dbc9009e2120e76298417bbb6ade1417315343 Mon Sep 17 00:00:00 2001 From: lady ada Date: Sat, 8 May 2021 16:11:26 -0400 Subject: [PATCH 6/7] fix two typos --- boards.txt | 4 ++-- variants/neokeytrinkey_m0/variant.cpp | 3 --- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/boards.txt b/boards.txt index 26095333a..0bb4885cd 100644 --- a/boards.txt +++ b/boards.txt @@ -476,7 +476,7 @@ adafruit_rotarytrinkey_m0.menu.debug.on.build.flags.debug=-g # Adafruit NeoKey Trinkey (SAMD21) # ------------------------------ -adafruit_neokeytrinkey_m0.name=Adafruit Rotary Trinkey (SAMD21) +adafruit_neokeytrinkey_m0.name=Adafruit NeoKey Trinkey (SAMD21) adafruit_neokeytrinkey_m0.vid.0=0x239A adafruit_neokeytrinkey_m0.pid.0=0x80FF adafruit_neokeytrinkey_m0.vid.1=0x239A @@ -542,7 +542,7 @@ adafruit_slidetrinkey_m0.upload.wait_for_upload_port=true adafruit_slidetrinkey_m0.upload.native_usb=true adafruit_slidetrinkey_m0.build.mcu=cortex-m0plus adafruit_slidetrinkey_m0.build.f_cpu=48000000L -adafruit_slidetrinkey_m0.build.usb_product="Rotary Trinkey M0" +adafruit_slidetrinkey_m0.build.usb_product="Slide Trinkey M0" adafruit_slidetrinkey_m0.build.usb_manufacturer="Adafruit" adafruit_slidetrinkey_m0.build.board=SLIDETRINKEY_M0 adafruit_slidetrinkey_m0.build.core=arduino diff --git a/variants/neokeytrinkey_m0/variant.cpp b/variants/neokeytrinkey_m0/variant.cpp index 5703d3177..e64ad7b21 100644 --- a/variants/neokeytrinkey_m0/variant.cpp +++ b/variants/neokeytrinkey_m0/variant.cpp @@ -49,6 +49,3 @@ SERCOM sercom0( SERCOM0 ) ; SERCOM sercom1( SERCOM1 ) ; SERCOM sercom2( SERCOM2 ) ; SERCOM sercom3( SERCOM3 ) ; - -/* - * Serial interfaces From 7f1317acd0fd718ebee5197d212756267767d958 Mon Sep 17 00:00:00 2001 From: lady ada Date: Sat, 8 May 2021 16:16:24 -0400 Subject: [PATCH 7/7] fix up slide trinkey for rev B --- variants/slidetrinkey_m0/variant.cpp | 10 +++++----- variants/slidetrinkey_m0/variant.h | 8 +++++--- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/variants/slidetrinkey_m0/variant.cpp b/variants/slidetrinkey_m0/variant.cpp index c26c2ea8f..88a348db7 100644 --- a/variants/slidetrinkey_m0/variant.cpp +++ b/variants/slidetrinkey_m0/variant.cpp @@ -23,14 +23,14 @@ */ const PinDescription g_APinDescription[]= { - // Fake DAC pin just so we can compile stuff - { PORTA, 2, PIO_ANALOG, (PIN_ATTR_DIGITAL|PIN_ATTR_ANALOG|PIN_ATTR_PWM|PIN_ATTR_TIMER), ADC_Channel0, PWM2_CH0, TCC2_CH0, EXTERNAL_INT_2 }, // A0 / D0 / DAC + // Potentiometer + { PORTA, 2, PIO_ANALOG, (PIN_ATTR_DIGITAL|PIN_ATTR_ANALOG|PIN_ATTR_PWM|PIN_ATTR_TIMER), ADC_Channel0, PWM2_CH0, TCC2_CH0, EXTERNAL_INT_2 }, - // Slidepot - { PORTA, 7, PIO_SERCOM_ALT, (PIN_ATTR_DIGITAL|PIN_ATTR_ANALOG|PIN_ATTR_PWM|PIN_ATTR_TIMER), ADC_Channel7, PWM1_CH1, TCC1_CH1, EXTERNAL_INT_7 }, + // Touch pad + { PORTA, 7, PIO_ANALOG, (PIN_ATTR_DIGITAL|PIN_ATTR_ANALOG|PIN_ATTR_PWM|PIN_ATTR_TIMER), ADC_Channel7, PWM1_CH1, TCC1_CH1, EXTERNAL_INT_7 }, // NeoPixel - { PORTA, 6, PIO_DIGITAL, (PIN_ATTR_DIGITAL|PIN_ATTR_ANALOG|PIN_ATTR_PWM|PIN_ATTR_TIMER), ADC_Channel6, PWM1_CH0, TCC1_CH0, EXTERNAL_INT_6 }, + { PORTA, 4, PIO_DIGITAL, (PIN_ATTR_DIGITAL|PIN_ATTR_ANALOG|PIN_ATTR_PWM|PIN_ATTR_TIMER), ADC_Channel4, PWM0_CH0, TCC0_CH0, EXTERNAL_INT_4 }, // USB pins { PORTA, 28, PIO_COM, PIN_ATTR_NONE, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_NONE }, // USB Host enable diff --git a/variants/slidetrinkey_m0/variant.h b/variants/slidetrinkey_m0/variant.h index 9312ae230..0348b6f3a 100644 --- a/variants/slidetrinkey_m0/variant.h +++ b/variants/slidetrinkey_m0/variant.h @@ -54,8 +54,8 @@ extern "C" // Number of pins defined in PinDescription array #define PINS_COUNT (6u) -#define NUM_DIGITAL_PINS (2u) -#define NUM_ANALOG_INPUTS (2u) +#define NUM_DIGITAL_PINS (3u) +#define NUM_ANALOG_INPUTS (3u) #define NUM_ANALOG_OUTPUTS (1u) #define analogInputToDigitalPin(p) (p) @@ -81,17 +81,19 @@ extern "C" #define NUM_NEOPIXEL (2u) // POT -#define PIN_POTENTIOMETER (1u) +#define PIN_POTENTIOMETER (0u) /* * Analog pins */ #define PIN_A0 (0ul) #define PIN_A1 (1ul) +#define PIN_A2 (2ul) #define PIN_DAC0 PIN_A0 static const uint8_t A0 = PIN_A0; static const uint8_t A1 = PIN_A1; +static const uint8_t A2 = PIN_A2; #define ADC_RESOLUTION 12