Merge branch 'master' into atsamr
Conflicts: boards.txt
This commit is contained in:
commit
25cd637acb
23 changed files with 1037 additions and 87 deletions
17
CHANGELOG
17
CHANGELOG
|
|
@ -1,7 +1,22 @@
|
|||
SAMD CORE 1.6.5
|
||||
SAMD CORE 1.6.6
|
||||
|
||||
* Fixed digitalPinToInterrupt() macro, now it works as documented.
|
||||
* Added analogInputToDigitalPin macro
|
||||
* Fixed NUM_DIGITAL_PINS for Zero Board.
|
||||
* On-board RX-TX LEDs now blinks when there is activity on the native USB port
|
||||
* Fixed platform.txt, the core now compiles again with Arduino IDE <=1.6.5. Thanks @per1234
|
||||
* Fixed Wire.write(0x00) "ambiguos method" error
|
||||
* String class now supports iterators. Thanks @Chris--A
|
||||
* Remove enabling bootloader protection when burning bootloader. This enables WDT, so sketches do not work.
|
||||
|
||||
SAMD CORE 1.6.5 2016.04.02
|
||||
|
||||
* Added Arduino/Genuino MKR1000 board
|
||||
* Set NVMCTRL.MANW bit to 1 (default is 0). This prevents accidental writes on program memory.
|
||||
* Bootloader: Fixed wrong UART speed (regression)
|
||||
* Fixed incorrect return value from Wire.available() when the receive buffer is not fully read.
|
||||
* Added DAC0 definition in Arduino/Genuino Zero variant file.
|
||||
* Enabled bootloader protection after "Burn bootloader".
|
||||
|
||||
SAMD CORE 1.6.4 2016.02.19
|
||||
|
||||
|
|
|
|||
40
README.md
40
README.md
|
|
@ -3,51 +3,27 @@
|
|||
This repository containts the source code and configuration files of the Arduino Core
|
||||
for Atmel's SAMD21 processor (used on the Arduino Zero board).
|
||||
|
||||
In particular, this adds support for the Adafruit SAMD Boards such as the Feather M0
|
||||
|
||||
## Installation on Arduino IDE
|
||||
|
||||
This core is available as a package in the Arduino IDE cores manager.
|
||||
Just open the "Boards Manager" and install the package called:
|
||||
Install the Adafruit Board Support package json and then install the Adafruit SAMD board package
|
||||
|
||||
"Arduino SAMD Boards (32-bit ARM Cortex-M0+)"
|
||||
|
||||
## Support
|
||||
|
||||
There is a dedicated section of the Arduino Forum for general discussion and project assistance:
|
||||
|
||||
http://forum.arduino.cc/index.php?board=98.0
|
||||
https://learn.adafruit.com/adafruit-feather-m0-basic-proto/using-with-arduino-ide
|
||||
|
||||
## Bugs or Issues
|
||||
|
||||
If you find a bug you can submit an issue here on github:
|
||||
|
||||
https://github.com/adafruit/ArduinoCore-samd
|
||||
|
||||
or if it is an issue with the upstream:
|
||||
|
||||
https://github.com/arduino/ArduinoCore-samd/issues
|
||||
|
||||
Before posting a new issue, please check if the same problem has been already reported by someone else
|
||||
to avoid duplicates.
|
||||
|
||||
## Contributions
|
||||
|
||||
Contributions are always welcome. The preferred way to receive code cotribution is by submitting a
|
||||
Pull Request on github.
|
||||
|
||||
## Hourly builds
|
||||
|
||||
This repository is under a Continuos Integration system that every hour checks if there are updates and
|
||||
builds a release for testing (the so called "Hourly builds").
|
||||
|
||||
The hourly builds are available through Boards Manager. If you want to install them:
|
||||
1. Open the **Preferences** of the Arduino IDE.
|
||||
2. Add this URL `http://downloads.arduino.cc/Hourly/samd/package_samd-hourly-build_index.json` in the **Additional Boards Manager URLs** field, and click OK.
|
||||
3. Open the **Boards Manager** (menu Tools->Board->Board Manager...)
|
||||
4. Install **Arduino SAMD core - Hourly build**
|
||||
5. Select one of the boards under **SAMD Hourly build XX** in Tools->Board menu
|
||||
6. Compile/Upload as usual
|
||||
|
||||
If you already installed an hourly build and you want to update it with the latest:
|
||||
1. Open the **Boards Manager** (menu Tools->Board->Board Manager...)
|
||||
2. Remove **Arduino SAMD core - Hourly build**
|
||||
3. Install again **Arduino SAMD core - Hourly build**, the Board Manager will download the latest build replacing the old one.
|
||||
|
||||
## License and credits
|
||||
|
||||
This core has been developed by Arduino LLC in collaboration with Atmel.
|
||||
|
|
|
|||
8
VARIANT_COMPLIANCE_CHANGELOG
Normal file
8
VARIANT_COMPLIANCE_CHANGELOG
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
SAMD CORE 1.6.6
|
||||
|
||||
* digitalPinToInterrupt #define moved to Arduino.h, variant.h must no longer define it
|
||||
|
||||
SAMD CORE 1.6.3
|
||||
|
||||
* Timer for pin PWM selected based on value of PIN_ATTR_TIMER_ALT or PIN_ATTR_TIMER,
|
||||
prior to this "pin type" (ulPinType) was used
|
||||
56
boards.txt
56
boards.txt
|
|
@ -42,35 +42,6 @@ adafruit_feather_m0.build.pid=0x800B
|
|||
adafruit_feather_m0.bootloader.tool=openocd
|
||||
adafruit_feather_m0.bootloader.file=feather/samd21_sam_ba.bin
|
||||
|
||||
|
||||
adafruit_metro_m0.name=Adafruit Metro M0 (Native USB Port)
|
||||
adafruit_metro_m0.vid.0=0x239A
|
||||
adafruit_metro_m0.pid.0=0x8013
|
||||
adafruit_metro_m0.vid.1=0x239A
|
||||
adafruit_metro_m0.pid.1=0x0013
|
||||
adafruit_metro_m0.upload.tool=bossac
|
||||
adafruit_metro_m0.upload.protocol=sam-ba
|
||||
adafruit_metro_m0.upload.maximum_size=262144
|
||||
adafruit_metro_m0.upload.use_1200bps_touch=true
|
||||
adafruit_metro_m0.upload.wait_for_upload_port=true
|
||||
adafruit_metro_m0.upload.native_usb=true
|
||||
adafruit_metro_m0.build.mcu=cortex-m0plus
|
||||
adafruit_metro_m0.build.f_cpu=48000000L
|
||||
adafruit_metro_m0.build.usb_product="Metro M0"
|
||||
adafruit_metro_m0.build.usb_manufacturer="Adafruit"
|
||||
adafruit_metro_m0.build.board=SAMD_ZERO
|
||||
adafruit_metro_m0.build.core=arduino
|
||||
adafruit_metro_m0.build.extra_flags=-D__SAMD21G18A__ {build.usb_flags}
|
||||
adafruit_metro_m0.build.ldscript=linker_scripts/gcc/flash_with_bootloader.ld
|
||||
adafruit_metro_m0.build.openocdscript=openocd_scripts/arduino_zero.cfg
|
||||
adafruit_metro_m0.build.variant=arduino_zero
|
||||
adafruit_metro_m0.build.variant_system_lib=
|
||||
adafruit_metro_m0.build.vid=0x239A
|
||||
adafruit_metro_m0.build.pid=0x8013
|
||||
adafruit_metro_m0.bootloader.tool=openocd
|
||||
adafruit_metro_m0.bootloader.file=feather/samd21_sam_ba.bin
|
||||
|
||||
|
||||
adafruit_radio_m0.name=Adafruit M0 Radio (Native USB Port)
|
||||
adafruit_radio_m0.vid.0=0x239A
|
||||
adafruit_radio_m0.pid.0=0x8014
|
||||
|
|
@ -97,3 +68,30 @@ adafruit_radio_m0.build.vid=0x239A
|
|||
adafruit_radio_m0.build.pid=0x8014
|
||||
adafruit_radio_m0.bootloader.tool=openocd
|
||||
adafruit_radio_m0.bootloader.file=feather/samr21_sam_ba.bin
|
||||
|
||||
#adafruit_metro_m0.name=Adafruit Metro M0 (Native USB Port)
|
||||
#adafruit_metro_m0.vid.0=0x239A
|
||||
#adafruit_metro_m0.pid.0=0x8013
|
||||
#adafruit_metro_m0.vid.1=0x239A
|
||||
#adafruit_metro_m0.pid.1=0x0013
|
||||
#adafruit_metro_m0.upload.tool=bossac
|
||||
#adafruit_metro_m0.upload.protocol=sam-ba
|
||||
#adafruit_metro_m0.upload.maximum_size=262144
|
||||
#adafruit_metro_m0.upload.use_1200bps_touch=true
|
||||
#adafruit_metro_m0.upload.wait_for_upload_port=true
|
||||
#adafruit_metro_m0.upload.native_usb=true
|
||||
#adafruit_metro_m0.build.mcu=cortex-m0plus
|
||||
#adafruit_metro_m0.build.f_cpu=48000000L
|
||||
#adafruit_metro_m0.build.usb_product="Metro M0"
|
||||
#adafruit_metro_m0.build.usb_manufacturer="Adafruit"
|
||||
#adafruit_metro_m0.build.board=SAMD_ZERO
|
||||
#adafruit_metro_m0.build.core=arduino
|
||||
#adafruit_metro_m0.build.extra_flags=-D__SAMD21G18A__ {build.usb_flags}
|
||||
#adafruit_metro_m0.build.ldscript=linker_scripts/gcc/flash_with_bootloader.ld
|
||||
#adafruit_metro_m0.build.openocdscript=openocd_scripts/arduino_zero.cfg
|
||||
#adafruit_metro_m0.build.variant=arduino_zero
|
||||
#adafruit_metro_m0.build.variant_system_lib=
|
||||
#adafruit_metro_m0.build.vid=0x239A
|
||||
#adafruit_metro_m0.build.pid=0x8013
|
||||
#adafruit_metro_m0.bootloader.tool=openocd
|
||||
#adafruit_metro_m0.bootloader.file=metro/samd21_sam_ba.bin
|
||||
|
|
|
|||
|
|
@ -9,6 +9,10 @@ Multi-plaform GCC is provided by ARM here: https://launchpad.net/gcc-arm-embedde
|
|||
|
||||
Atmel Studio contains both make and ARM GCC toolchain. You don't need to install them in this specific use case.
|
||||
|
||||
For all builds and platforms you will need to have the Arduino IDE installed and the board support
|
||||
package for "Arduino SAMD Boards (32-bits ARM Cortex-M0+)". You can install the latter
|
||||
from the former's "Boards Manager" UI.
|
||||
|
||||
### Windows
|
||||
|
||||
* Native command line
|
||||
|
|
|
|||
BIN
bootloaders/zero/samd21_sam_ba.bin
Normal file → Executable file
BIN
bootloaders/zero/samd21_sam_ba.bin
Normal file → Executable file
Binary file not shown.
|
|
@ -114,6 +114,11 @@ void loop( void ) ;
|
|||
|
||||
#define bit(b) (1UL << (b))
|
||||
|
||||
#if (ARDUINO_SAMD_VARIANT_COMPLIANCE >= 10606)
|
||||
// Interrupts
|
||||
#define digitalPinToInterrupt(P) ( P )
|
||||
#endif
|
||||
|
||||
// USB Device
|
||||
#include "USB/USBDesc.h"
|
||||
#include "USB/USBCore.h"
|
||||
|
|
|
|||
|
|
@ -37,6 +37,14 @@ USBDevice_SAMR21G18x usbd;
|
|||
USBDevice_SAMD21G18x usbd;
|
||||
#endif
|
||||
|
||||
/** Pulse generation counters to keep track of the number of milliseconds remaining for each pulse type */
|
||||
#define TX_RX_LED_PULSE_MS 100
|
||||
#ifdef PIN_LED_TXL
|
||||
static volatile uint8_t txLEDPulse; /**< Milliseconds remaining for data Tx LED pulse */
|
||||
#endif
|
||||
#ifdef PIN_LED_RXL
|
||||
static volatile uint8_t rxLEDPulse; /**< Milliseconds remaining for data Rx LED pulse */
|
||||
#endif
|
||||
static char isRemoteWakeUpEnabled = 0;
|
||||
static char isEndpointHalt = 0;
|
||||
|
||||
|
|
@ -99,18 +107,18 @@ bool USBDeviceClass::sendStringDescriptor(const uint8_t *string, uint8_t maxlen)
|
|||
if (maxlen < 2)
|
||||
return false;
|
||||
|
||||
uint16_t buff[maxlen/2];
|
||||
int l = 1;
|
||||
uint8_t buffer[maxlen];
|
||||
buffer[0] = strlen((const char*)string) * 2 + 2;
|
||||
buffer[1] = 0x03;
|
||||
|
||||
maxlen -= 2;
|
||||
while (*string && maxlen>0)
|
||||
{
|
||||
buff[l++] = (uint8_t)(*string++);
|
||||
maxlen -= 2;
|
||||
uint8_t i;
|
||||
for (i = 2; i < maxlen && *string; i++) {
|
||||
buffer[i++] = *string++;
|
||||
if (i == maxlen) break;
|
||||
buffer[i] = 0;
|
||||
}
|
||||
buff[0] = (3<<8) | (l*2);
|
||||
|
||||
return USBDevice.sendControl((uint8_t*)buff, l*2);
|
||||
return USBDevice.sendControl(buffer, i);
|
||||
}
|
||||
|
||||
bool _dry_run = false;
|
||||
|
|
@ -282,6 +290,18 @@ void USBDeviceClass::handleEndpoint(uint8_t ep)
|
|||
|
||||
void USBDeviceClass::init()
|
||||
{
|
||||
#ifdef PIN_LED_TXL
|
||||
txLEDPulse = 0;
|
||||
pinMode(PIN_LED_TXL, OUTPUT);
|
||||
digitalWrite(PIN_LED_TXL, HIGH);
|
||||
#endif
|
||||
|
||||
#ifdef PIN_LED_RXL
|
||||
rxLEDPulse = 0;
|
||||
pinMode(PIN_LED_RXL, OUTPUT);
|
||||
digitalWrite(PIN_LED_RXL, HIGH);
|
||||
#endif
|
||||
|
||||
// Enable USB clock
|
||||
PM->APBBMASK.reg |= PM_APBBMASK_USB;
|
||||
|
||||
|
|
@ -531,6 +551,11 @@ uint32_t USBDeviceClass::recv(uint32_t ep, void *_data, uint32_t len)
|
|||
if (available(ep) < len)
|
||||
len = available(ep);
|
||||
|
||||
#ifdef PIN_LED_RXL
|
||||
digitalWrite(PIN_LED_RXL, LOW);
|
||||
rxLEDPulse = TX_RX_LED_PULSE_MS;
|
||||
#endif
|
||||
|
||||
armRecv(ep);
|
||||
|
||||
usbd.epBank0DisableTransferComplete(ep);
|
||||
|
|
@ -629,6 +654,11 @@ uint32_t USBDeviceClass::send(uint32_t ep, const void *data, uint32_t len)
|
|||
}
|
||||
#endif
|
||||
|
||||
#ifdef PIN_LED_TXL
|
||||
digitalWrite(PIN_LED_TXL, LOW);
|
||||
txLEDPulse = TX_RX_LED_PULSE_MS;
|
||||
#endif
|
||||
|
||||
// Flash area
|
||||
while (len != 0)
|
||||
{
|
||||
|
|
@ -835,6 +865,17 @@ void USBDeviceClass::ISRHandler()
|
|||
if (usbd.isStartOfFrameInterrupt())
|
||||
{
|
||||
usbd.ackStartOfFrameInterrupt();
|
||||
|
||||
// check whether the one-shot period has elapsed. if so, turn off the LED
|
||||
#ifdef PIN_LED_TXL
|
||||
if (txLEDPulse && !(--txLEDPulse))
|
||||
digitalWrite(PIN_LED_TXL, HIGH);
|
||||
#endif
|
||||
|
||||
#ifdef PIN_LED_RXL
|
||||
if (rxLEDPulse && !(--rxLEDPulse))
|
||||
digitalWrite(PIN_LED_RXL, HIGH);
|
||||
#endif
|
||||
}
|
||||
|
||||
// Endpoint 0 Received Setup interrupt
|
||||
|
|
|
|||
|
|
@ -57,7 +57,11 @@ void attachInterrupt(uint32_t pin, voidFuncPtr callback, uint32_t mode)
|
|||
uint32_t config;
|
||||
uint32_t pos;
|
||||
|
||||
#if ARDUINO_SAMD_VARIANT_COMPLIANCE >= 10606
|
||||
EExt_Interrupts in = g_APinDescription[pin].ulExtInt;
|
||||
#else
|
||||
EExt_Interrupts in = digitalPinToInterrupt(pin);
|
||||
#endif
|
||||
if (in == NOT_AN_INTERRUPT || in == EXTERNAL_INT_NMI)
|
||||
return;
|
||||
|
||||
|
|
@ -116,7 +120,11 @@ void attachInterrupt(uint32_t pin, voidFuncPtr callback, uint32_t mode)
|
|||
*/
|
||||
void detachInterrupt(uint32_t pin)
|
||||
{
|
||||
#if (ARDUINO_SAMD_VARIANT_COMPLIANCE >= 10606)
|
||||
EExt_Interrupts in = g_APinDescription[pin].ulExtInt;
|
||||
#else
|
||||
EExt_Interrupts in = digitalPinToInterrupt(pin);
|
||||
#endif
|
||||
if (in == NOT_AN_INTERRUPT || in == EXTERNAL_INT_NMI)
|
||||
return;
|
||||
|
||||
|
|
|
|||
|
|
@ -81,7 +81,7 @@ public:
|
|||
inline unsigned int length(void) const {return len;}
|
||||
|
||||
// creates a copy of the assigned value. if the value is null or
|
||||
// invalid, or if the memory allocation fails, the string will be
|
||||
// invalid, or if the memory allocation fails, the string will be
|
||||
// marked as invalid ("if (s)" will be false).
|
||||
String & operator = (const String &rhs);
|
||||
String & operator = (const char *cstr);
|
||||
|
|
@ -92,10 +92,10 @@ public:
|
|||
#endif
|
||||
|
||||
// concatenate (works w/ built-in types)
|
||||
|
||||
|
||||
// returns true on success, false on failure (in which case, the string
|
||||
// is left unchanged). if the argument is null or invalid, the
|
||||
// concatenation is considered unsucessful.
|
||||
// is left unchanged). if the argument is null or invalid, the
|
||||
// concatenation is considered unsucessful.
|
||||
unsigned char concat(const String &str);
|
||||
unsigned char concat(const char *cstr);
|
||||
unsigned char concat(char c);
|
||||
|
|
@ -107,7 +107,7 @@ public:
|
|||
unsigned char concat(float num);
|
||||
unsigned char concat(double num);
|
||||
unsigned char concat(const __FlashStringHelper * str);
|
||||
|
||||
|
||||
// if there's not enough memory for the concatenated value, the string
|
||||
// will be left unchanged (but this isn't signalled in any way)
|
||||
String & operator += (const String &rhs) {concat(rhs); return (*this);}
|
||||
|
|
@ -161,6 +161,8 @@ public:
|
|||
void toCharArray(char *buf, unsigned int bufsize, unsigned int index=0) const
|
||||
{getBytes((unsigned char *)buf, bufsize, index);}
|
||||
const char * c_str() const { return buffer; }
|
||||
const char* begin() { return c_str(); }
|
||||
const char* end() { return c_str() + length(); }
|
||||
|
||||
// search
|
||||
int indexOf( char ch ) const;
|
||||
|
|
|
|||
|
|
@ -44,8 +44,8 @@ typedef int16_t prog_int16_t;
|
|||
typedef uint16_t prog_uint16_t;
|
||||
typedef int32_t prog_int32_t;
|
||||
typedef uint32_t prog_uint32_t;
|
||||
typedef int32_t prog_int64_t;
|
||||
typedef uint32_t prog_uint64_t;
|
||||
typedef int64_t prog_int64_t;
|
||||
typedef uint64_t prog_uint64_t;
|
||||
|
||||
typedef const void* int_farptr_t;
|
||||
typedef const void* uint_farptr_t;
|
||||
|
|
|
|||
|
|
@ -20,6 +20,8 @@ e-mail : support@circuitsathome.com
|
|||
#else
|
||||
#define __PRINTHEX_H__
|
||||
|
||||
#include <Arduino.h>
|
||||
|
||||
void E_Notifyc(char c, int lvl);
|
||||
|
||||
template <class T>
|
||||
|
|
|
|||
|
|
@ -71,6 +71,8 @@ uint8_t TwoWire::requestFrom(uint8_t address, size_t quantity, bool stopBit)
|
|||
|
||||
size_t byteRead = 0;
|
||||
|
||||
rxBuffer.clear();
|
||||
|
||||
if(sercom->startTransmissionWIRE(address, WIRE_READ_FLAG))
|
||||
{
|
||||
// Read first data
|
||||
|
|
|
|||
|
|
@ -57,6 +57,10 @@ class TwoWire : public Stream
|
|||
void onReceive(void(*)(int));
|
||||
void onRequest(void(*)(void));
|
||||
|
||||
inline size_t write(unsigned long n) { return write((uint8_t)n); }
|
||||
inline size_t write(long n) { return write((uint8_t)n); }
|
||||
inline size_t write(unsigned int n) { return write((uint8_t)n); }
|
||||
inline size_t write(int n) { return write((uint8_t)n); }
|
||||
using Print::write;
|
||||
|
||||
void onService(void);
|
||||
|
|
|
|||
12
platform.txt
12
platform.txt
|
|
@ -19,8 +19,8 @@
|
|||
# For more info:
|
||||
# https://github.com/arduino/Arduino/wiki/Arduino-IDE-1.5---3rd-party-Hardware-specification
|
||||
|
||||
name=Arduino SAMD (32-bits ARM Cortex-M0+) Boards
|
||||
version=1.6.4
|
||||
name=Adafruit SAMD (32-bits ARM Cortex-M0+) Boards
|
||||
version=1.0.9
|
||||
|
||||
# Compile variables
|
||||
# -----------------
|
||||
|
|
@ -86,6 +86,8 @@ recipe.cpp.o.pattern="{compiler.path}{compiler.cpp.cmd}" {compiler.cpp.flags} -D
|
|||
recipe.S.o.pattern="{compiler.path}{compiler.S.cmd}" {compiler.S.flags} -DF_CPU={build.f_cpu} -DARDUINO={runtime.ide.version} -DARDUINO_{build.board} -DARDUINO_ARCH_{build.arch} {compiler.S.extra_flags} {build.extra_flags} {compiler.arm.cmsis.path} {includes} "{source_file}" -o "{object_file}"
|
||||
|
||||
## Create archives
|
||||
# archive_file_path is needed for backwards compatibility with IDE 1.6.5 or older, IDE 1.6.6 or newer overrides this value
|
||||
archive_file_path={build.path}/{archive_file}
|
||||
recipe.ar.pattern="{compiler.path}{compiler.ar.cmd}" {compiler.ar.flags} {compiler.ar.extra_flags} "{archive_file_path}" "{object_file}"
|
||||
|
||||
## Combine gc-sections, archives, and objects
|
||||
|
|
@ -118,6 +120,8 @@ tools.bossac.upload.params.verbose=-i -d
|
|||
tools.bossac.upload.params.quiet=
|
||||
tools.bossac.upload.pattern="{path}/{cmd}" {upload.verbose} --port={serial.port.file} -U {upload.native_usb} -i -e -w -v "{build.path}/{build.project_name}.bin" -R
|
||||
|
||||
tools.bossac_remote.upload.pattern=/usr/bin/run-bossac {upload.verbose} --port=ttyATH0 -U {upload.native_usb} -e -w -v /tmp/sketch.bin -R
|
||||
|
||||
#
|
||||
# OpenOCD sketch upload
|
||||
#
|
||||
|
|
@ -140,4 +144,6 @@ tools.openocd.erase.pattern=
|
|||
|
||||
tools.openocd.bootloader.params.verbose=-d2
|
||||
tools.openocd.bootloader.params.quiet=-d0
|
||||
tools.openocd.bootloader.pattern="{path}/{cmd}" {bootloader.verbose} -s "{path}/share/openocd/scripts/" -f "{runtime.platform.path}/variants/{build.variant}/{build.openocdscript}" -c "telnet_port disabled; init; halt; at91samd bootloader 0; program {{{runtime.platform.path}/bootloaders/{bootloader.file}}} verify reset; shutdown"
|
||||
|
||||
tools.openocd.bootloader.pattern="{path}/{cmd}" {bootloader.verbose} -s "{path}/share/openocd/scripts/" -f "{runtime.platform.path}/variants/{build.variant}/{build.openocdscript}" -c "telnet_port disabled; init; halt; at91samd bootloader 0; program {{{runtime.platform.path}/bootloaders/{bootloader.file}}} verify reset; shutdown"
|
||||
|
||||
|
|
|
|||
|
|
@ -19,8 +19,8 @@
|
|||
#ifndef _VARIANT_ARDUINO_ZERO_
|
||||
#define _VARIANT_ARDUINO_ZERO_
|
||||
|
||||
// The definitions here needs a SAMD core >=1.6.3
|
||||
#define ARDUINO_SAMD_VARIANT_COMPLIANCE 10603
|
||||
// The definitions here needs a SAMD core >=1.6.6
|
||||
#define ARDUINO_SAMD_VARIANT_COMPLIANCE 10606
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
* Definitions
|
||||
|
|
@ -54,9 +54,10 @@ extern "C"
|
|||
|
||||
// Number of pins defined in PinDescription array
|
||||
#define PINS_COUNT (26u)
|
||||
#define NUM_DIGITAL_PINS (14u)
|
||||
#define NUM_DIGITAL_PINS (20u)
|
||||
#define NUM_ANALOG_INPUTS (8u)
|
||||
#define NUM_ANALOG_OUTPUTS (1u)
|
||||
#define analogInputToDigitalPin(p) ((p < 6u) ? (p) + 14u : -1)
|
||||
|
||||
#define digitalPinToPort(P) ( &(PORT->Group[g_APinDescription[P].ulPort]) )
|
||||
#define digitalPinToBitMask(P) ( 1 << g_APinDescription[P].ulPin )
|
||||
|
|
@ -75,9 +76,6 @@ extern "C"
|
|||
*/
|
||||
// #define digitalPinToTimer(P)
|
||||
|
||||
// Interrupts
|
||||
#define digitalPinToInterrupt(P) ( g_APinDescription[P].ulExtInt )
|
||||
|
||||
// LEDs
|
||||
#define PIN_LED_13 (13u)
|
||||
#define PIN_LED_RXL (25u)
|
||||
|
|
@ -107,6 +105,8 @@ static const uint8_t A4 = PIN_A4 ;
|
|||
static const uint8_t A5 = PIN_A5 ;
|
||||
static const uint8_t A6 = PIN_A6 ;
|
||||
static const uint8_t A7 = PIN_A7 ;
|
||||
static const uint8_t DAC0 = PIN_DAC0;
|
||||
|
||||
#define ADC_RESOLUTION 12
|
||||
|
||||
// Other pins
|
||||
|
|
@ -155,6 +155,9 @@ static const uint8_t SCK = PIN_SPI_SCK ;
|
|||
#define PERIPH_WIRE sercom3
|
||||
#define WIRE_IT_HANDLER SERCOM3_Handler
|
||||
|
||||
static const uint8_t SDA = PIN_WIRE_SDA;
|
||||
static const uint8_t SCL = PIN_WIRE_SCL;
|
||||
|
||||
/*
|
||||
* USB
|
||||
*/
|
||||
|
|
|
|||
31
variants/mkr1000/debug_scripts/variant.gdb
Normal file
31
variants/mkr1000/debug_scripts/variant.gdb
Normal file
|
|
@ -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 at91samd21g18" -f target/at91samdXX.cfg -c "gdb_port pipe; log_output openocd.log"
|
||||
211
variants/mkr1000/linker_scripts/gcc/flash_with_bootloader.ld
Normal file
211
variants/mkr1000/linker_scripts/gcc/flash_with_bootloader.ld
Normal file
|
|
@ -0,0 +1,211 @@
|
|||
/*
|
||||
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 :
|
||||
{
|
||||
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(4);
|
||||
/* 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")
|
||||
}
|
||||
212
variants/mkr1000/linker_scripts/gcc/flash_without_bootloader.ld
Normal file
212
variants/mkr1000/linker_scripts/gcc/flash_without_bootloader.ld
Normal file
|
|
@ -0,0 +1,212 @@
|
|||
/*
|
||||
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 :
|
||||
{
|
||||
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(4);
|
||||
/* 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")
|
||||
}
|
||||
30
variants/mkr1000/openocd_scripts/arduino_zero.cfg
Normal file
30
variants/mkr1000/openocd_scripts/arduino_zero.cfg
Normal file
|
|
@ -0,0 +1,30 @@
|
|||
#
|
||||
# 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
|
||||
#
|
||||
|
||||
source [find interface/cmsis-dap.cfg]
|
||||
|
||||
# chip name
|
||||
set CHIPNAME at91samd21g18
|
||||
set ENDIAN little
|
||||
|
||||
# choose a port here
|
||||
set telnet_port 0
|
||||
|
||||
source [find target/at91samdXX.cfg]
|
||||
21
variants/mkr1000/pins_arduino.h
Normal file
21
variants/mkr1000/pins_arduino.h
Normal file
|
|
@ -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"
|
||||
|
||||
180
variants/mkr1000/variant.cpp
Normal file
180
variants/mkr1000/variant.cpp
Normal file
|
|
@ -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
|
||||
*/
|
||||
|
||||
#include "variant.h"
|
||||
|
||||
const PinDescription g_APinDescription[] = {
|
||||
|
||||
/*
|
||||
+------------+------------------+--------+-----------------+--------+-----------------------+---------+---------+--------+--------+----------+----------+
|
||||
| Pin number | MKR Board pin | PIN | Notes | Peri.A | Peripheral B | Perip.C | Perip.D | Peri.E | Peri.F | Periph.G | Periph.H |
|
||||
| | | | | EIC | ADC | AC | PTC | DAC | SERCOMx | SERCOMx | TCCx | TCCx | COM | AC/GLCK |
|
||||
| | | | |(EXTINT)|(AIN)|(AIN)| | | (x/PAD) | (x/PAD) | (x/WO) | (x/WO) | | |
|
||||
+------------+------------------+--------+-----------------+--------+-----+-----+-----+-----+---------+---------+--------+--------+----------+----------+
|
||||
| 00 | D0 | PA22 | | *06 | | | X10 | | 3/00 | 5/00 |* TC4/0 | TCC0/4 | | GCLK_IO6 |
|
||||
| 01 | D1 | PA23 | | *07 | | | X11 | | 3/01 | 5/01 |* TC4/1 | TCC0/5 | USB/SOF | GCLK_IO7 |
|
||||
| 02 | D2 | PA10 | | 10 | *18 | | X02 | | 0/02 | 2/02 |*TCC1/0 | TCC0/2 | I2S/SCK0 | GCLK_IO4 |
|
||||
| 03 | D3 | PA11 | | 11 | *19 | | X03 | | 0/03 | 2/03 |*TCC1/1 | TCC0/3 | I2S/FS0 | GCLK_IO5 |
|
||||
| 04 | D4 | PB10 | | *10 | | | | | | 4/02 |* TC5/0 | TCC0/4 | I2S/MCK1 | GCLK_IO4 |
|
||||
| 05 | D5 | PB11 | | *11 | | | | | | 4/03 |* TC5/1 | TCC0/5 | I2S/SCK1 | GCLK_IO5 |
|
||||
| 06 | D6 | PA20 | | *04 | | | X08 | | 5/02 | 3/02 | |*TCC0/6 | I2S/SCK0 | GCLK_IO4 |
|
||||
| 07 | D7 | PA21 | | *05 | | | X09 | | 5/03 | 3/03 | |*TCC0/7 | I2S/FS0 | GCLK_IO5 |
|
||||
+------------+------------------+--------+-----------------+--------+-----+-----+-----+-----+---------+---------+--------+--------+----------+----------+
|
||||
*/
|
||||
{ PORTA, 22, PIO_DIGITAL, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM|PIN_ATTR_TIMER ), No_ADC_Channel, PWM4_CH0, TC4_CH0, EXTERNAL_INT_6 },
|
||||
{ PORTA, 23, PIO_DIGITAL, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM|PIN_ATTR_TIMER ), No_ADC_Channel, PWM4_CH1, TC4_CH1, EXTERNAL_INT_7 },
|
||||
{ PORTA, 10, PIO_DIGITAL, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM|PIN_ATTR_TIMER ), ADC_Channel18, PWM1_CH0, TCC1_CH0, EXTERNAL_INT_NONE },
|
||||
{ PORTA, 11, PIO_DIGITAL, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM|PIN_ATTR_TIMER ), ADC_Channel19, PWM1_CH1, TCC1_CH1, EXTERNAL_INT_NONE },
|
||||
{ PORTB, 10, PIO_DIGITAL, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM|PIN_ATTR_TIMER ), No_ADC_Channel, PWM5_CH0, TC5_CH0, EXTERNAL_INT_10 },
|
||||
{ PORTB, 11, PIO_DIGITAL, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM|PIN_ATTR_TIMER ), No_ADC_Channel, PWM5_CH1, TC5_CH1, EXTERNAL_INT_11 },
|
||||
{ PORTA, 20, PIO_DIGITAL, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM|PIN_ATTR_TIMER_ALT), No_ADC_Channel, PWM0_CH6, TCC0_CH6, EXTERNAL_INT_4 },
|
||||
{ PORTA, 21, PIO_DIGITAL, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM|PIN_ATTR_TIMER_ALT), No_ADC_Channel, PWM0_CH7, TCC0_CH7, EXTERNAL_INT_5 },
|
||||
|
||||
/*
|
||||
+------------+------------------+--------+-----------------+--------+-----------------------+---------+---------+--------+--------+----------+----------+
|
||||
| Pin number | MKR Board pin | PIN | Notes | Peri.A | Peripheral B | Perip.C | Perip.D | Peri.E | Peri.F | Periph.G | Periph.H |
|
||||
| | | | | EIC | ADC | AC | PTC | DAC | SERCOMx | SERCOMx | TCCx | TCCx | COM | AC/GLCK |
|
||||
| | | | |(EXTINT)|(AIN)|(AIN)| | | (x/PAD) | (x/PAD) | (x/WO) | (x/WO) | | |
|
||||
+------------+------------------+--------+-----------------+--------+-----+-----+-----+-----+---------+---------+--------+--------+----------+----------+
|
||||
| | SPI | | | | | | | | | | | | | |
|
||||
| 08 | MOSI | PA16 | | *00 | | | X04 | | *1/00 | 3/00 |*TCC2/0 | TCC0/6 | | GCLK_IO2 |
|
||||
| 09 | SCK | PA17 | | *01 | | | X05 | | *1/01 | 3/01 | TCC2/1 | TCC0/7 | | GCLK_IO3 |
|
||||
| 10 | MISO | PA19 | | 03 | | | X07 | | *1/03 | 3/03 |* TC3/1 | TCC0/3 | I2S/SD0 | AC/CMP1 |
|
||||
+------------+------------------+--------+-----------------+--------------------+-----+-----+---------+---------+--------+--------+----------+----------+
|
||||
| | Wire | | | | | | | | | | | | | |
|
||||
| 11 | SDA | PA08 | | NMI | *16 | | X00 | | *0/00 | 2/00 | TCC0/0 | TCC1/2 | I2S/SD1 | |
|
||||
| 12 | SCL | PA09 | | 09 | *17 | | X01 | | *0/01 | 2/01 | TCC0/1 | TCC1/3 | I2S/MCK0 | |
|
||||
+------------+------------------+--------+-----------------+--------+-----+-----+-----+-----+---------+---------+--------+--------+----------+----------+
|
||||
| | Serial1 | | | | | | | | | | | | | |
|
||||
| 13 | RX | PB23 | | 07 | | | | | | *5/03 | | | | GCLK_IO1 |
|
||||
| 14 | TX | PB22 | | 06 | | | | | | *5/02 | | | | GCLK_IO0 |
|
||||
+------------+------------------+--------+-----------------+--------+-----+-----+-----+-----+---------+---------+--------+--------+----------+----------+
|
||||
*/
|
||||
// DIPO=3 DOPO=0
|
||||
{ PORTA, 16, PIO_SERCOM, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM|PIN_ATTR_TIMER ), No_ADC_Channel, PWM2_CH0, TCC2_CH0, EXTERNAL_INT_0 }, // MOSI: SERCOM1/PAD[0]
|
||||
{ PORTA, 17, PIO_SERCOM, (PIN_ATTR_DIGITAL ), No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_1 }, // SCK: SERCOM1/PAD[1]
|
||||
{ PORTA, 19, PIO_SERCOM, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM|PIN_ATTR_TIMER ), No_ADC_Channel, PWM3_CH1, TC3_CH1, EXTERNAL_INT_NONE }, // MISO: SERCOM1/PAD[3]
|
||||
|
||||
// PINOUT=0
|
||||
{ PORTA, 8, PIO_SERCOM, (PIN_ATTR_DIGITAL ), ADC_Channel16, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_NMI }, // SDA: SERCOM0/PAD[0]
|
||||
{ PORTA, 9, PIO_SERCOM, (PIN_ATTR_DIGITAL ), ADC_Channel17, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_NONE }, // SCL: SERCOM0/PAD[1]
|
||||
|
||||
// RXPO=3 TXPO=1
|
||||
{ PORTB, 23, PIO_SERCOM_ALT, (PIN_ATTR_DIGITAL ), No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_NONE }, // RX: SERCOM5/PAD[3]
|
||||
{ PORTB, 22, PIO_SERCOM_ALT, (PIN_ATTR_DIGITAL ), No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_NONE }, // TX: SERCOM5/PAD[2]
|
||||
|
||||
|
||||
/*
|
||||
+------------+------------------+--------+-----------------+--------+-----------------------+---------+---------+--------+--------+----------+----------+
|
||||
| Pin number | MKR Board pin | PIN | Notes | Peri.A | Peripheral B | Perip.C | Perip.D | Peri.E | Peri.F | Periph.G | Periph.H |
|
||||
| | | | | EIC | ADC | AC | PTC | DAC | SERCOMx | SERCOMx | TCCx | TCCx | COM | AC/GLCK |
|
||||
| | | | |(EXTINT)|(AIN)|(AIN)| | | (x/PAD) | (x/PAD) | (x/WO) | (x/WO) | | |
|
||||
+------------+------------------+--------+-----------------+--------+-----+-----+-----+-----+---------+---------+--------+--------+----------+----------+
|
||||
| 15 | A0 / DAC0 | PA02 | | 02 | *00 | | Y00 | OUT | | | | | | |
|
||||
| 16 | A1 | PB02 | | *02 | *10 | | Y08 | | | 5/00 | | | | |
|
||||
| 17 | A2 | PB03 | | *03 | *11 | | Y09 | | | 5/01 | | | | |
|
||||
| 18 | A3 | PA04 | | 04 | *04 | 00 | Y02 | | | 0/00 |*TCC0/0 | | | |
|
||||
| 19 | A4 | PA05 | | 05 | *05 | 01 | Y03 | | | 0/01 |*TCC0/1 | | | |
|
||||
| 20 | A5 | PA06 | | 06 | *06 | 02 | Y04 | | | 0/02 | TCC1/0 | | | |
|
||||
| 21 | A6 | PA07 | | 07 | *07 | 03 | Y05 | | | 0/03 | TCC1/1 | | I2S/SD0 | |
|
||||
+------------+------------------+--------+-----------------+--------+-----+-----+-----+-----+---------+---------+--------+--------+----------+----------+
|
||||
*/
|
||||
{ PORTA, 2, PIO_ANALOG, (PIN_ATTR_DIGITAL|PIN_ATTR_ANALOG /*DAC*/ ), ADC_Channel0, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_NONE },
|
||||
{ PORTB, 2, PIO_ANALOG, (PIN_ATTR_DIGITAL ), ADC_Channel10, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_2 },
|
||||
{ PORTB, 3, PIO_ANALOG, (PIN_ATTR_DIGITAL ), ADC_Channel11, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_3 },
|
||||
{ PORTA, 4, PIO_ANALOG, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM|PIN_ATTR_TIMER ), ADC_Channel4, PWM0_CH0, TCC0_CH0, EXTERNAL_INT_NONE },
|
||||
{ PORTA, 5, PIO_ANALOG, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM|PIN_ATTR_TIMER ), ADC_Channel5, PWM0_CH1, TCC0_CH1, EXTERNAL_INT_NONE },
|
||||
{ PORTA, 6, PIO_ANALOG, (PIN_ATTR_DIGITAL ), ADC_Channel6, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_NONE },
|
||||
{ PORTA, 7, PIO_ANALOG, (PIN_ATTR_DIGITAL ), ADC_Channel7, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_NONE },
|
||||
|
||||
/*
|
||||
+------------+------------------+--------+-----------------+--------+-----------------------+---------+---------+--------+--------+----------+----------+
|
||||
| Pin number | MKR Board pin | PIN | Notes | Peri.A | Peripheral B | Perip.C | Perip.D | Peri.E | Peri.F | Periph.G | Periph.H |
|
||||
| | | | | EIC | ADC | AC | PTC | DAC | SERCOMx | SERCOMx | TCCx | TCCx | COM | AC/GLCK |
|
||||
| | | | |(EXTINT)|(AIN)|(AIN)| | | (x/PAD) | (x/PAD) | (x/WO) | (x/WO) | | |
|
||||
+------------+------------------+--------+-----------------+--------+-----+-----+-----+-----+---------+---------+--------+--------+----------+----------+
|
||||
| | USB | | | | | | | | | | | | | |
|
||||
| 22 | | PA24 | USB N | 12 | | | | | 3/02 | 5/02 | TC5/0 | TCC1/2 | USB/DM | |
|
||||
| 23 | | PA25 | USB P | 13 | | | | | 3/03 | 5/03 | TC5/1 | TCC1/3 | USB/DP | |
|
||||
| 24 | | PA18 | USB ID | 02 | | | X06 | | 1/02 | 3/02 | TC3/0 | TCC0/2 | | AC/CMP0 |
|
||||
+------------+------------------+--------+-----------------+--------+-----+-----+-----+-----+---------+---------+--------+--------+----------+----------+
|
||||
| 25 | AREF | PA03 | | 03 | 01 | | Y01 | | | | | | | |
|
||||
+------------+------------------+--------+-----------------+--------+-----+-----+-----+-----+---------+---------+--------+--------+----------+----------+
|
||||
*/
|
||||
{ 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
|
||||
{ PORTA, 18, PIO_DIGITAL, (PIN_ATTR_DIGITAL ), No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_NONE },
|
||||
|
||||
{ PORTA, 3, PIO_DIGITAL, (PIN_ATTR_DIGITAL ), No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_NONE }, // DAC/VREFP
|
||||
|
||||
/*
|
||||
+------------+------------------+--------+-----------------+--------+-----------------------+---------+---------+--------+--------+----------+----------+
|
||||
| Pin number | MKR Board pin | PIN | Notes | Peri.A | Peripheral B | Perip.C | Perip.D | Peri.E | Peri.F | Periph.G | Periph.H |
|
||||
| | | | | EIC | ADC | AC | PTC | DAC | SERCOMx | SERCOMx | TCCx | TCCx | COM | AC/GLCK |
|
||||
| | | | |(EXTINT)|(AIN)|(AIN)| | | (x/PAD) | (x/PAD) | (x/WO) | (x/WO) | | |
|
||||
+------------+------------------+--------+-----------------+--------+-----+-----+-----+-----+---------+---------+--------+--------+----------+----------+
|
||||
| | ATWINC1501B SPI | | | | | | | | | | | | | |
|
||||
| 26 | | PA12 | WINC MOSI | 12 | | | | | *2/00 | 4/00 | TCC2/0 | TCC0/6 | | AC/CMP0 |
|
||||
| 27 | | PA13 | WINC SCK | 13 | | | | | *2/01 | 4/01 | TCC2/1 | TCC0/7 | | AC/CMP1 |
|
||||
| 28 | | PA14 | WINC SSN | 14 | | | | | 2/02 | 4/02 | TC3/0 | TCC0/4 | | GCLK_IO0 |
|
||||
| 29 | | PA15 | WINC MISO | 15 | | | | | *2/03 | 4/03 | TC3/1 | TCC0/5 | | GCLK_IO1 |
|
||||
+------------+------------------+--------+-----------------+--------+-----+-----+-----+-----+---------+---------+--------+--------+----------+----------+
|
||||
| | ATWINC1501B PINS | | | | | | | | | | | | | |
|
||||
| 30 | | PA27 | WINC RESETN_WIFI| 15 | | | | | | | | | | GCLK_IO0 |
|
||||
| 31 | | PA28 | WINC CHIP_EN | 08 | | | | | | | | | | GCLK_IO0 |
|
||||
| 32 | | PB08 | WINC WAKE | 08 | 02 | | Y14 | | | 4/00 | TC4/0 | | | |
|
||||
| 33 | | PB09 | WINC IRQN | *09 | 03 | | Y15 | | | 4/01 | TC4/1 | | | |
|
||||
+------------+------------------+--------+-----------------+--------+-----+-----+-----+-----+---------+---------+--------+--------+----------+----------+
|
||||
| | 32768Hz Crystal | | | | | | | | | | | | | |
|
||||
| 34 | | PA00 | XIN32 | 00 | | | | | | 1/00 | TCC2/0 | | | |
|
||||
| 35 | | PA01 | XOUT32 | 01 | | | | | | 1/01 | TCC2/1 | | | |
|
||||
+------------+------------------+--------+-----------------+--------+-----+-----+-----+-----+---------+---------+--------+--------+----------+----------+
|
||||
*/
|
||||
// DIPO=3 DOPO=0
|
||||
{ PORTA, 12, PIO_SERCOM, (PIN_ATTR_NONE ), No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_NONE }, // MOSI: SERCOM2/PAD[0]
|
||||
{ PORTA, 13, PIO_SERCOM, (PIN_ATTR_NONE ), No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_NONE }, // SCK: SERCOM2/PAD[1]
|
||||
{ PORTA, 14, PIO_DIGITAL, (PIN_ATTR_NONE ), No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_NONE }, // SS: as GPIO
|
||||
{ PORTA, 15, PIO_SERCOM, (PIN_ATTR_NONE ), No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_NONE }, // MISO: SERCOM2/PAD[3]
|
||||
|
||||
{ PORTA, 27, PIO_DIGITAL, (PIN_ATTR_NONE ), No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_NONE },
|
||||
{ PORTA, 28, PIO_DIGITAL, (PIN_ATTR_NONE ), No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_NONE },
|
||||
{ PORTB, 8, PIO_DIGITAL, (PIN_ATTR_NONE ), No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_NONE },
|
||||
{ PORTB, 9, PIO_DIGITAL, (PIN_ATTR_NONE ), No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_9 },
|
||||
|
||||
{ PORTA, 0, PIO_DIGITAL, (PIN_ATTR_NONE ), No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_NONE },
|
||||
{ PORTA, 1, PIO_DIGITAL, (PIN_ATTR_NONE ), No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_NONE },
|
||||
};
|
||||
|
||||
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);
|
||||
SERCOM sercom4(SERCOM4);
|
||||
SERCOM sercom5(SERCOM5);
|
||||
|
||||
// Serial1
|
||||
Uart Serial1(&sercom5, PIN_SERIAL1_RX, PIN_SERIAL1_TX, PAD_SERIAL1_RX, PAD_SERIAL1_TX);
|
||||
|
||||
void SERCOM5_Handler()
|
||||
{
|
||||
Serial1.IrqHandler();
|
||||
}
|
||||
|
||||
191
variants/mkr1000/variant.h
Normal file
191
variants/mkr1000/variant.h
Normal file
|
|
@ -0,0 +1,191 @@
|
|||
/*
|
||||
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
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
// The definitions here needs a SAMD core >=1.6.6
|
||||
#define ARDUINO_SAMD_VARIANT_COMPLIANCE 10606
|
||||
|
||||
#include <WVariant.h>
|
||||
|
||||
// General definitions
|
||||
// -------------------
|
||||
|
||||
// Frequency of the board main oscillator
|
||||
#define VARIANT_MAINOSC (32768ul)
|
||||
|
||||
// Master clock frequency
|
||||
#define VARIANT_MCK (48000000ul)
|
||||
|
||||
// Pins
|
||||
// ----
|
||||
|
||||
// Number of pins defined in PinDescription array
|
||||
#define PINS_COUNT (26u)
|
||||
#define NUM_DIGITAL_PINS (22u)
|
||||
#define NUM_ANALOG_INPUTS (7u)
|
||||
#define NUM_ANALOG_OUTPUTS (1u)
|
||||
#define analogInputToDigitalPin(p) ((p < 7u) ? (p) + 15u : -1)
|
||||
|
||||
// Low-level pin register query macros
|
||||
// -----------------------------------
|
||||
#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_LED (6u)
|
||||
#define LED_BUILTIN PIN_LED
|
||||
|
||||
// Analog pins
|
||||
// -----------
|
||||
#define PIN_A0 (15u)
|
||||
#define PIN_A1 (16u)
|
||||
#define PIN_A2 (17u)
|
||||
#define PIN_A3 (18u)
|
||||
#define PIN_A4 (19u)
|
||||
#define PIN_A5 (20u)
|
||||
#define PIN_A6 (21u)
|
||||
#define PIN_DAC0 (15u)
|
||||
|
||||
static const uint8_t A0 = PIN_A0;
|
||||
static const uint8_t A1 = PIN_A1;
|
||||
static const uint8_t A2 = PIN_A2;
|
||||
static const uint8_t A3 = PIN_A3;
|
||||
static const uint8_t A4 = PIN_A4;
|
||||
static const uint8_t A5 = PIN_A5;
|
||||
static const uint8_t A6 = PIN_A6;
|
||||
static const uint8_t DAC0 = PIN_DAC0;
|
||||
#define ADC_RESOLUTION 12
|
||||
|
||||
// SPI Interfaces
|
||||
// --------------
|
||||
#define SPI_INTERFACES_COUNT 2
|
||||
|
||||
// SPI
|
||||
#define PIN_SPI_MISO (10u)
|
||||
#define PIN_SPI_MOSI (8u)
|
||||
#define PIN_SPI_SCK (9u)
|
||||
#define PIN_SPI_SS (24u)
|
||||
#define PERIPH_SPI sercom1
|
||||
#define PAD_SPI_TX SPI_PAD_0_SCK_1
|
||||
#define PAD_SPI_RX SERCOM_RX_PAD_3
|
||||
static const uint8_t SS = PIN_SPI_SS; // SPI Slave SS not used. Set here only for reference.
|
||||
static const uint8_t MOSI = PIN_SPI_MOSI;
|
||||
static const uint8_t MISO = PIN_SPI_MISO;
|
||||
static const uint8_t SCK = PIN_SPI_SCK;
|
||||
|
||||
// SPI1: Connected to WINC1501B
|
||||
#define PIN_SPI1_MISO (29u)
|
||||
#define PIN_SPI1_MOSI (26u)
|
||||
#define PIN_SPI1_SCK (27u)
|
||||
#define PIN_SPI1_SS (28u)
|
||||
#define PERIPH_SPI1 sercom2
|
||||
#define PAD_SPI1_TX SPI_PAD_0_SCK_1
|
||||
#define PAD_SPI1_RX SERCOM_RX_PAD_3
|
||||
static const uint8_t SS1 = PIN_SPI1_SS;
|
||||
static const uint8_t MOSI1 = PIN_SPI1_MOSI;
|
||||
static const uint8_t MISO1 = PIN_SPI1_MISO;
|
||||
static const uint8_t SCK1 = PIN_SPI1_SCK;
|
||||
|
||||
// Wire Interfaces
|
||||
// ---------------
|
||||
#define WIRE_INTERFACES_COUNT 1
|
||||
|
||||
// Wire
|
||||
#define PIN_WIRE_SDA (11u)
|
||||
#define PIN_WIRE_SCL (12u)
|
||||
#define PERIPH_WIRE sercom0
|
||||
#define WIRE_IT_HANDLER SERCOM0_Handler
|
||||
static const uint8_t SDA = PIN_WIRE_SDA;
|
||||
static const uint8_t SCL = PIN_WIRE_SCL;
|
||||
|
||||
// USB
|
||||
// ---
|
||||
#define PIN_USB_DM (22ul)
|
||||
#define PIN_USB_DP (23ul)
|
||||
#define PIN_USB_HOST_ENABLE (24ul)
|
||||
|
||||
// Needed for WINC1501B (WiFi101) library
|
||||
// --------------------------------------
|
||||
#define WINC1501_RESET_PIN (30u)
|
||||
#define WINC1501_CHIP_EN_PIN (31u)
|
||||
#define WINC1501_INTN_PIN (33u)
|
||||
#define WINC1501_SPI SPI1
|
||||
#define WINC1501_SPI_CS_PIN PIN_SPI1_SS
|
||||
|
||||
|
||||
// Serial ports
|
||||
// ------------
|
||||
#ifdef __cplusplus
|
||||
#include "SERCOM.h"
|
||||
#include "Uart.h"
|
||||
|
||||
// Instances of SERCOM
|
||||
extern SERCOM sercom0;
|
||||
extern SERCOM sercom1;
|
||||
extern SERCOM sercom2;
|
||||
extern SERCOM sercom3;
|
||||
extern SERCOM sercom4;
|
||||
extern SERCOM sercom5;
|
||||
|
||||
// Serial1
|
||||
extern Uart Serial1;
|
||||
#define PIN_SERIAL1_RX (13ul)
|
||||
#define PIN_SERIAL1_TX (14ul)
|
||||
#define PAD_SERIAL1_TX (UART_TX_PAD_2)
|
||||
#define PAD_SERIAL1_RX (SERCOM_RX_PAD_3)
|
||||
#endif // __cplusplus
|
||||
|
||||
// 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 SerialUSB
|
||||
#define SERIAL_PORT_MONITOR SerialUSB
|
||||
#define SERIAL_PORT_HARDWARE Serial1
|
||||
#define SERIAL_PORT_HARDWARE_OPEN Serial1
|
||||
|
||||
// Alias Serial to SerialUSB
|
||||
#define Serial SerialUSB
|
||||
|
||||
Loading…
Reference in a new issue