From 3078214a814efb27478cca1280eab5e9e3697bc7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20M=C3=B8rch?= Date: Thu, 28 Apr 2016 21:07:09 +0200 Subject: [PATCH] Cleaned up variant definition files for GW and removed mysensors specific SPI driver --- hardware/MySensors/samd/libraries/SPI/SPI.cpp | 202 ------------ hardware/MySensors/samd/libraries/SPI/SPI.h | 155 --------- .../BarometricPressureSensor.ino | 143 --------- .../DigitalPotControl/DigitalPotControl.ino | 71 ---- .../MySensors/samd/libraries/SPI/keywords.txt | 31 -- .../samd/variants/mysensors_gw/variant.cpp | 303 +++++++----------- .../samd/variants/mysensors_gw/variant.h | 139 +++++--- 7 files changed, 212 insertions(+), 832 deletions(-) delete mode 100644 hardware/MySensors/samd/libraries/SPI/SPI.cpp delete mode 100644 hardware/MySensors/samd/libraries/SPI/SPI.h delete mode 100644 hardware/MySensors/samd/libraries/SPI/examples/BarometricPressureSensor/BarometricPressureSensor.ino delete mode 100644 hardware/MySensors/samd/libraries/SPI/examples/DigitalPotControl/DigitalPotControl.ino delete mode 100644 hardware/MySensors/samd/libraries/SPI/keywords.txt diff --git a/hardware/MySensors/samd/libraries/SPI/SPI.cpp b/hardware/MySensors/samd/libraries/SPI/SPI.cpp deleted file mode 100644 index 5b92b7b..0000000 --- a/hardware/MySensors/samd/libraries/SPI/SPI.cpp +++ /dev/null @@ -1,202 +0,0 @@ -/* - * SPI Master library for Arduino Zero. - * Copyright (c) 2015 Arduino LLC - * - * 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 "SPI.h" -#include -#include -#include - -#define SPI_IMODE_NONE 0 -#define SPI_IMODE_EXTINT 1 -#define SPI_IMODE_GLOBAL 2 - -const SPISettings DEFAULT_SPI_SETTINGS = SPISettings(); - -SPIClass::SPIClass(SERCOM *p_sercom, uint8_t uc_pinMISO, uint8_t uc_pinSCK, uint8_t uc_pinMOSI) -{ - initialized = false; - assert(p_sercom != NULL); - _p_sercom = p_sercom; - - _uc_pinMiso = uc_pinMISO; - _uc_pinSCK = uc_pinSCK; - _uc_pinMosi = uc_pinMOSI; -} - -void SPIClass::begin() -{ - init(); - - // PIO init - pinPeripheral(_uc_pinMiso, g_APinDescription[_uc_pinMiso].ulPinType); - pinPeripheral(_uc_pinSCK, g_APinDescription[_uc_pinSCK].ulPinType); - pinPeripheral(_uc_pinMosi, g_APinDescription[_uc_pinMosi].ulPinType); - - config(DEFAULT_SPI_SETTINGS); -} - -void SPIClass::init() -{ - if (initialized) - return; - interruptMode = SPI_IMODE_NONE; - interruptSave = 0; - interruptMask = 0; - initialized = true; -} - -void SPIClass::config(SPISettings settings) -{ - _p_sercom->disableSPI(); - - _p_sercom->initSPI(SPI_PAD_0_SCK_1, SERCOM_RX_PAD_2, SPI_CHAR_SIZE_8_BITS, settings.bitOrder); - _p_sercom->initSPIClock(settings.dataMode, settings.clockFreq); - - _p_sercom->enableSPI(); -} - -void SPIClass::end() -{ - _p_sercom->resetSPI(); - initialized = false; -} - -#ifndef interruptsStatus -#define interruptsStatus() __interruptsStatus() -static inline unsigned char __interruptsStatus(void) __attribute__((always_inline, unused)); -static inline unsigned char __interruptsStatus(void) -{ - // See http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0497a/CHDBIBGJ.html - return (__get_PRIMASK() ? 0 : 1); -} -#endif - -void SPIClass::usingInterrupt(int interruptNumber) -{ - if ((interruptNumber == NOT_AN_INTERRUPT) || (interruptNumber == EXTERNAL_INT_NMI)) - return; - - uint8_t irestore = interruptsStatus(); - noInterrupts(); - - if (interruptNumber >= EXTERNAL_NUM_INTERRUPTS) - interruptMode = SPI_IMODE_GLOBAL; - else - { - interruptMode |= SPI_IMODE_EXTINT; - interruptMask |= (1 << interruptNumber); - } - - if (irestore) - interrupts(); -} - -void SPIClass::beginTransaction(SPISettings settings) -{ - if (interruptMode != SPI_IMODE_NONE) - { - if (interruptMode & SPI_IMODE_GLOBAL) - { - interruptSave = interruptsStatus(); - noInterrupts(); - } - else if (interruptMode & SPI_IMODE_EXTINT) - EIC->INTENCLR.reg = EIC_INTENCLR_EXTINT(interruptMask); - } - - config(settings); -} - -void SPIClass::endTransaction(void) -{ - if (interruptMode != SPI_IMODE_NONE) - { - if (interruptMode & SPI_IMODE_GLOBAL) - { - if (interruptSave) - interrupts(); - } - else if (interruptMode & SPI_IMODE_EXTINT) - EIC->INTENSET.reg = EIC_INTENSET_EXTINT(interruptMask); - } -} - -void SPIClass::setBitOrder(BitOrder order) -{ - if (order == LSBFIRST) { - _p_sercom->setDataOrderSPI(LSB_FIRST); - } else { - _p_sercom->setDataOrderSPI(MSB_FIRST); - } -} - -void SPIClass::setDataMode(uint8_t mode) -{ - switch (mode) - { - case SPI_MODE0: - _p_sercom->setClockModeSPI(SERCOM_SPI_MODE_0); - break; - - case SPI_MODE1: - _p_sercom->setClockModeSPI(SERCOM_SPI_MODE_1); - break; - - case SPI_MODE2: - _p_sercom->setClockModeSPI(SERCOM_SPI_MODE_2); - break; - - case SPI_MODE3: - _p_sercom->setClockModeSPI(SERCOM_SPI_MODE_3); - break; - - default: - break; - } -} - -void SPIClass::setClockDivider(uint8_t div) -{ - if (div < SPI_MIN_CLOCK_DIVIDER) { - _p_sercom->setBaudrateSPI(SPI_MIN_CLOCK_DIVIDER); - } else { - _p_sercom->setBaudrateSPI(div); - } -} - -byte SPIClass::transfer(uint8_t data) -{ - // Writing the data - _p_sercom->writeDataSPI(data); - - // Read data - return _p_sercom->readDataSPI() & 0xFF; -} - -void SPIClass::attachInterrupt() { - // Should be enableInterrupt() -} - -void SPIClass::detachInterrupt() { - // Should be disableInterrupt() -} - -SPIClass SPI( &sercom1, RADIO_SPI_MISO, RADIO_SPI_SCK, RADIO_SPI_MOSI ); -SPIClass SPI_ETH (&sercom4, NET_SPI_MISO, NET_SPI_SCK, NET_SPI_MOSI); -SPIClass SPI_USER(&sercom5, USR_SPI_MISO, USR_SPI_SCK, USR_SPI_MOSI); diff --git a/hardware/MySensors/samd/libraries/SPI/SPI.h b/hardware/MySensors/samd/libraries/SPI/SPI.h deleted file mode 100644 index 9fbb5b4..0000000 --- a/hardware/MySensors/samd/libraries/SPI/SPI.h +++ /dev/null @@ -1,155 +0,0 @@ -/* - * SPI Master library for Arduino Zero. - * Copyright (c) 2015 Arduino LLC - * - * 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 _SPI_H_INCLUDED -#define _SPI_H_INCLUDED - -#include - -// SPI_HAS_TRANSACTION means SPI has -// - beginTransaction() -// - endTransaction() -// - usingInterrupt() -// - SPISetting(clock, bitOrder, dataMode) -#define SPI_HAS_TRANSACTION 1 - -#define SPI_MODE0 0x02 -#define SPI_MODE1 0x00 -#define SPI_MODE2 0x03 -#define SPI_MODE3 0x01 - -#if defined(__SAMD21G18A__) - // Even if not specified on the datasheet, the SAMD21G18A MCU - // doesn't operate correctly with clock dividers lower than 4. - // This allows a theoretical maximum SPI clock speed of 12Mhz - #define SPI_MIN_CLOCK_DIVIDER 4 - // Other SAMD21xxxxx MCU may be affected as well -#else - #define SPI_MIN_CLOCK_DIVIDER 2 -#endif - -class SPISettings { - public: - SPISettings(uint32_t clock, BitOrder bitOrder, uint8_t dataMode) { - if (__builtin_constant_p(clock)) { - init_AlwaysInline(clock, bitOrder, dataMode); - } else { - init_MightInline(clock, bitOrder, dataMode); - } - } - - // Default speed set to 4MHz, SPI mode set to MODE 0 and Bit order set to MSB first. - SPISettings() { init_AlwaysInline(4000000, MSBFIRST, SPI_MODE0); } - - private: - void init_MightInline(uint32_t clock, BitOrder bitOrder, uint8_t dataMode) { - init_AlwaysInline(clock, bitOrder, dataMode); - } - - void init_AlwaysInline(uint32_t clock, BitOrder bitOrder, uint8_t dataMode) __attribute__((__always_inline__)) { - this->clockFreq = (clock >= (F_CPU / SPI_MIN_CLOCK_DIVIDER) ? F_CPU / SPI_MIN_CLOCK_DIVIDER : clock); - - this->bitOrder = (bitOrder == MSBFIRST ? MSB_FIRST : LSB_FIRST); - - switch (dataMode) - { - case SPI_MODE0: - this->dataMode = SERCOM_SPI_MODE_0; break; - case SPI_MODE1: - this->dataMode = SERCOM_SPI_MODE_1; break; - case SPI_MODE2: - this->dataMode = SERCOM_SPI_MODE_2; break; - case SPI_MODE3: - this->dataMode = SERCOM_SPI_MODE_3; break; - default: - this->dataMode = SERCOM_SPI_MODE_0; break; - } - } - - uint32_t clockFreq; - SercomSpiClockMode dataMode; - SercomDataOrder bitOrder; - - friend class SPIClass; -}; - -class SPIClass { - public: - SPIClass(SERCOM *p_sercom, uint8_t uc_pinMISO, uint8_t uc_pinSCK, uint8_t uc_pinMOSI); - - byte transfer(uint8_t data); - inline void transfer(void *buf, size_t count); - - // Transaction Functions - void usingInterrupt(int interruptNumber); - void beginTransaction(SPISettings settings); - void endTransaction(void); - - // SPI Configuration methods - void attachInterrupt(); - void detachInterrupt(); - - void begin(); - void end(); - - void setBitOrder(BitOrder order); - void setDataMode(uint8_t uc_mode); - void setClockDivider(uint8_t uc_div); - - private: - void init(); - void config(SPISettings settings); - - SERCOM *_p_sercom; - uint8_t _uc_pinMiso; - uint8_t _uc_pinMosi; - uint8_t _uc_pinSCK; - bool initialized; - uint8_t interruptMode; - char interruptSave; - uint32_t interruptMask; -}; - -void SPIClass::transfer(void *buf, size_t count) -{ - // TODO: Optimize for faster block-transfer - uint8_t *buffer = reinterpret_cast(buf); - for (size_t i=0; i 0 - extern SPIClass SPI; - extern SPIClass SPI_ETH; - extern SPIClass SPI_USER; -#endif - -// For compatibility with sketches designed for AVR @ 16 MHz -// New programs should use SPI.beginTransaction to set the SPI clock -#if F_CPU == 48000000 - #define SPI_CLOCK_DIV2 6 - #define SPI_CLOCK_DIV4 12 - #define SPI_CLOCK_DIV8 24 - #define SPI_CLOCK_DIV16 48 - #define SPI_CLOCK_DIV32 96 - #define SPI_CLOCK_DIV64 192 - #define SPI_CLOCK_DIV128 255 -#endif - -#endif diff --git a/hardware/MySensors/samd/libraries/SPI/examples/BarometricPressureSensor/BarometricPressureSensor.ino b/hardware/MySensors/samd/libraries/SPI/examples/BarometricPressureSensor/BarometricPressureSensor.ino deleted file mode 100644 index 8104fcb..0000000 --- a/hardware/MySensors/samd/libraries/SPI/examples/BarometricPressureSensor/BarometricPressureSensor.ino +++ /dev/null @@ -1,143 +0,0 @@ -/* - SCP1000 Barometric Pressure Sensor Display - - Shows the output of a Barometric Pressure Sensor on a - Uses the SPI library. For details on the sensor, see: - http://www.sparkfun.com/commerce/product_info.php?products_id=8161 - http://www.vti.fi/en/support/obsolete_products/pressure_sensors/ - - This sketch adapted from Nathan Seidle's SCP1000 example for PIC: - http://www.sparkfun.com/datasheets/Sensors/SCP1000-Testing.zip - - Circuit: - SCP1000 sensor attached to pins 6, 7, 10 - 13: - DRDY: pin 6 - CSB: pin 7 - MOSI: pin 11 - MISO: pin 12 - SCK: pin 13 - - created 31 July 2010 - modified 14 August 2010 - by Tom Igoe - */ - -// the sensor communicates using SPI, so include the library: -#include - -//Sensor's memory register addresses: -const int PRESSURE = 0x1F; //3 most significant bits of pressure -const int PRESSURE_LSB = 0x20; //16 least significant bits of pressure -const int TEMPERATURE = 0x21; //16 bit temperature reading -const byte READ = 0b11111100; // SCP1000's read command -const byte WRITE = 0b00000010; // SCP1000's write command - -// pins used for the connection with the sensor -// the other you need are controlled by the SPI library): -const int dataReadyPin = 6; -const int chipSelectPin = 7; - -void setup() { - Serial.begin(9600); - - // start the SPI library: - SPI.begin(); - - // initalize the data ready and chip select pins: - pinMode(dataReadyPin, INPUT); - pinMode(chipSelectPin, OUTPUT); - - //Configure SCP1000 for low noise configuration: - writeRegister(0x02, 0x2D); - writeRegister(0x01, 0x03); - writeRegister(0x03, 0x02); - // give the sensor time to set up: - delay(100); -} - -void loop() { - //Select High Resolution Mode - writeRegister(0x03, 0x0A); - - // don't do anything until the data ready pin is high: - if (digitalRead(dataReadyPin) == HIGH) { - //Read the temperature data - int tempData = readRegister(0x21, 2); - - // convert the temperature to celsius and display it: - float realTemp = (float)tempData / 20.0; - Serial.print("Temp[C]="); - Serial.print(realTemp); - - - //Read the pressure data highest 3 bits: - byte pressure_data_high = readRegister(0x1F, 1); - pressure_data_high &= 0b00000111; //you only needs bits 2 to 0 - - //Read the pressure data lower 16 bits: - unsigned int pressure_data_low = readRegister(0x20, 2); - //combine the two parts into one 19-bit number: - long pressure = ((pressure_data_high << 16) | pressure_data_low) / 4; - - // display the temperature: - Serial.println("\tPressure [Pa]=" + String(pressure)); - } -} - -//Read from or write to register from the SCP1000: -unsigned int readRegister(byte thisRegister, int bytesToRead ) { - byte inByte = 0; // incoming byte from the SPI - unsigned int result = 0; // result to return - Serial.print(thisRegister, BIN); - Serial.print("\t"); - // SCP1000 expects the register name in the upper 6 bits - // of the byte. So shift the bits left by two bits: - thisRegister = thisRegister << 2; - // now combine the address and the command into one byte - byte dataToSend = thisRegister & READ; - Serial.println(thisRegister, BIN); - // take the chip select low to select the device: - digitalWrite(chipSelectPin, LOW); - // send the device the register you want to read: - SPI.transfer(dataToSend); - // send a value of 0 to read the first byte returned: - result = SPI.transfer(0x00); - // decrement the number of bytes left to read: - bytesToRead--; - // if you still have another byte to read: - if (bytesToRead > 0) { - // shift the first byte left, then get the second byte: - result = result << 8; - inByte = SPI.transfer(0x00); - // combine the byte you just got with the previous one: - result = result | inByte; - // decrement the number of bytes left to read: - bytesToRead--; - } - // take the chip select high to de-select: - digitalWrite(chipSelectPin, HIGH); - // return the result: - return(result); -} - - -//Sends a write command to SCP1000 - -void writeRegister(byte thisRegister, byte thisValue) { - - // SCP1000 expects the register address in the upper 6 bits - // of the byte. So shift the bits left by two bits: - thisRegister = thisRegister << 2; - // now combine the register address and the command into one byte: - byte dataToSend = thisRegister | WRITE; - - // take the chip select low to select the device: - digitalWrite(chipSelectPin, LOW); - - SPI.transfer(dataToSend); //Send register location - SPI.transfer(thisValue); //Send value to record into register - - // take the chip select high to de-select: - digitalWrite(chipSelectPin, HIGH); -} - diff --git a/hardware/MySensors/samd/libraries/SPI/examples/DigitalPotControl/DigitalPotControl.ino b/hardware/MySensors/samd/libraries/SPI/examples/DigitalPotControl/DigitalPotControl.ino deleted file mode 100644 index b135a74..0000000 --- a/hardware/MySensors/samd/libraries/SPI/examples/DigitalPotControl/DigitalPotControl.ino +++ /dev/null @@ -1,71 +0,0 @@ -/* - Digital Pot Control - - This example controls an Analog Devices AD5206 digital potentiometer. - The AD5206 has 6 potentiometer channels. Each channel's pins are labeled - A - connect this to voltage - W - this is the pot's wiper, which changes when you set it - B - connect this to ground. - - The AD5206 is SPI-compatible,and to command it, you send two bytes, - one with the channel number (0 - 5) and one with the resistance value for the - channel (0 - 255). - - The circuit: - * All A pins of AD5206 connected to +5V - * All B pins of AD5206 connected to ground - * An LED and a 220-ohm resisor in series connected from each W pin to ground - * CS - to digital pin 10 (SS pin) - * SDI - to digital pin 11 (MOSI pin) - * CLK - to digital pin 13 (SCK pin) - - created 10 Aug 2010 - by Tom Igoe - - Thanks to Heather Dewey-Hagborg for the original tutorial, 2005 - -*/ - - -// inslude the SPI library: -#include - - -// set pin 10 as the slave select for the digital pot: -const int slaveSelectPin = 10; - -void setup() { - // set the slaveSelectPin as an output: - pinMode (slaveSelectPin, OUTPUT); - // initialize SPI: - SPI.begin(); -} - -void loop() { - // go through the six channels of the digital pot: - for (int channel = 0; channel < 6; channel++) { - // change the resistance on this channel from min to max: - for (int level = 0; level < 255; level++) { - digitalPotWrite(channel, level); - delay(10); - } - // wait a second at the top: - delay(100); - // change the resistance on this channel from max to min: - for (int level = 0; level < 255; level++) { - digitalPotWrite(channel, 255 - level); - delay(10); - } - } - -} - -void digitalPotWrite(int address, int value) { - // take the SS pin low to select the chip: - digitalWrite(slaveSelectPin, LOW); - // send in the address and value via SPI: - SPI.transfer(address); - SPI.transfer(value); - // take the SS pin high to de-select the chip: - digitalWrite(slaveSelectPin, HIGH); -} diff --git a/hardware/MySensors/samd/libraries/SPI/keywords.txt b/hardware/MySensors/samd/libraries/SPI/keywords.txt deleted file mode 100644 index 47738f9..0000000 --- a/hardware/MySensors/samd/libraries/SPI/keywords.txt +++ /dev/null @@ -1,31 +0,0 @@ -####################################### -# Syntax Coloring Map SPI -####################################### - -####################################### -# Datatypes (KEYWORD1) -####################################### - -SPI KEYWORD1 - -####################################### -# Methods and Functions (KEYWORD2) -####################################### -begin KEYWORD2 -end KEYWORD2 -transfer KEYWORD2 -#setBitOrder KEYWORD2 -setDataMode KEYWORD2 -setClockDivider KEYWORD2 - - -####################################### -# Constants (LITERAL1) -####################################### -SPI_MODE0 LITERAL1 -SPI_MODE1 LITERAL1 -SPI_MODE2 LITERAL1 -SPI_MODE3 LITERAL1 - -SPI_CONTINUE LITERAL1 -SPI_LAST LITERAL1 diff --git a/hardware/MySensors/samd/variants/mysensors_gw/variant.cpp b/hardware/MySensors/samd/variants/mysensors_gw/variant.cpp index 515d6c8..f344cec 100644 --- a/hardware/MySensors/samd/variants/mysensors_gw/variant.cpp +++ b/hardware/MySensors/samd/variants/mysensors_gw/variant.cpp @@ -15,94 +15,6 @@ License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ -/* - * +------------+------------------+--------+-----------------+-------------------------------------------------------------------------------------------------------- - * + Pin number + ZERO Board pin | PIN | Label/Name | Comments (* is for default peripheral in use) - * +------------+------------------+--------+-----------------+-------------------------------------------------------------------------------------------------------- - * | | Digital Low | | | - * +------------+------------------+--------+-----------------+-------------------------------------------------------------------------------------------------------- - * | 0 | 0 -> RX | PA11 | | EIC/EXTINT[11] ADC/AIN[19] PTC/X[3] *SERCOM0/PAD[3] SERCOM2/PAD[3] TCC0/WO[3] TCC1/WO[1] - * | 1 | 1 <- TX | PA10 | | EIC/EXTINT[10] ADC/AIN[18] PTC/X[2] *SERCOM0/PAD[2] TCC0/WO[2] TCC1/WO[0] - * | 2 | 2 | PA14 | | EIC/EXTINT[14] SERCOM2/PAD[2] SERCOM4/PAD[2] TC3/WO[0] TCC0/WO[4] - * | 3 | ~3 | PA09 | | EIC/EXTINT[9] ADC/AIN[17] PTC/X[1] SERCOM0/PAD[1] SERCOM2/PAD[1] *TCC0/WO[1] TCC1/WO[3] - * | 4 | ~4 | PA08 | | EIC/NMI ADC/AIN[16] PTC/X[0] SERCOM0/PAD[0] SERCOM2/PAD[0] *TCC0/WO[0] TCC1/WO[2] - * | 5 | ~5 | PA15 | | EIC/EXTINT[15] SERCOM2/PAD[3] SERCOM4/PAD[3] *TC3/WO[1] TCC0/WO[5] - * | 6 | ~6 | PA20 | | EIC/EXTINT[4] PTC/X[8] SERCOM5/PAD[2] SERCOM3/PAD[2] *TCC0/WO[6] - * | 7 | 7 | PA21 | | EIC/EXTINT[5] PTC/X[9] SERCOM5/PAD[3] SERCOM3/PAD[3] TCC0/WO[7] - * +------------+------------------+--------+-----------------+-------------------------------------------------------------------------------------------------------- - * | | Digital High | | | - * +------------+------------------+--------+-----------------+-------------------------------------------------------------------------------------------------------- - * | 8 | ~8 | PA06 | | EIC/EXTINT[6] ADC/AIN[6] AC/AIN[2] PTC/Y[4] SERCOM0/PAD[2] *TCC1/WO[0] - * | 9 | ~9 | PA07 | | EIC/EXTINT[7] ADC/AIN[7] AC/AIN[3] PTC/Y[5] SERCOM0/PAD[3] *TCC1/WO[1] - * | 10 | ~10 | PA18 | | EIC/EXTINT[2] PTC/X[6] +SERCOM1/PAD[2] SERCOM3/PAD[2] *TC3/WO[0] TCC0/WO[2] - * | 11 | ~11 | PA16 | | EIC/EXTINT[0] PTC/X[4] +SERCOM1/PAD[0] SERCOM3/PAD[0] *TCC2/WO[0] TCC0/WO[6] - * | 12 | ~12 | PA19 | | EIC/EXTINT[3] PTC/X[7] +SERCOM1/PAD[3] SERCOM3/PAD[3] TC3/WO[1] *TCC0/WO[3] - * | 13 | ~13 | PA17 | LED | EIC/EXTINT[1] PTC/X[5] +SERCOM1/PAD[1] SERCOM3/PAD[1] *TCC2/WO[1] TCC0/WO[7] - * +------------+------------------+--------+-----------------+-------------------------------------------------------------------------------------------------------- - * | | Analog Connector | | | - * +------------+------------------+--------+-----------------+-------------------------------------------------------------------------------------------------------- - * | 14 | A0 | PA02 | A0 | EIC/EXTINT[2] *ADC/AIN[0] DAC/VOUT PTC/Y[0] - * | 15 | A1 | PB08 | A1 | EIC/EXTINT[8] *ADC/AIN[2] PTC/Y[14] SERCOM4/PAD[0] TC4/WO[0] - * | 16 | A2 | PB09 | A2 | EIC/EXTINT[9] *ADC/AIN[3] PTC/Y[15] SERCOM4/PAD[1] TC4/WO[1] - * | 17 | A3 | PA04 | A3 | EIC/EXTINT[4] *ADC/AIN[4] AC/AIN[0] PTC/Y[2] SERCOM0/PAD[0] TCC0/WO[0] - * | 18 | A4 | PA05 | A4 | EIC/EXTINT[5] *ADC/AIN[5] AC/AIN[1] PTC/Y[5] SERCOM0/PAD[1] TCC0/WO[1] - * | 19 | A5 | PB02 | A5 | EIC/EXTINT[2] *ADC/AIN[10] PTC/Y[8] SERCOM5/PAD[0] - * +------------+------------------+--------+-----------------+-------------------------------------------------------------------------------------------------------- - * | | Wire | | | - * +------------+------------------+--------+-----------------+-------------------------------------------------------------------------------------------------------- - * | 20 | SDA | PA22 | SDA | EIC/EXTINT[6] PTC/X[10] *SERCOM3/PAD[0] SERCOM5/PAD[0] TC4/WO[0] TCC0/WO[4] - * | 21 | SCL | PA23 | SCL | EIC/EXTINT[7] PTC/X[11] *SERCOM3/PAD[1] SERCOM5/PAD[1] TC4/WO[1] TCC0/WO[5] - * +------------+------------------+--------+-----------------+-------------------------------------------------------------------------------------------------------- - * | |SPI (Legacy ICSP) | | | - * +------------+------------------+--------+-----------------+-------------------------------------------------------------------------------------------------------- - * | 22 | 1 | PA12 | MISO | EIC/EXTINT[12] SERCOM2/PAD[0] *SERCOM4/PAD[0] TCC2/WO[0] TCC0/WO[6] - * | | 2 | | 5V0 | - * | 23 | 4 | PB10 | MOSI | EIC/EXTINT[10] *SERCOM4/PAD[2] TC5/WO[0] TCC0/WO[4] - * | 24 | 3 | PB11 | SCK | EIC/EXTINT[11] *SERCOM4/PAD[3] TC5/WO[1] TCC0/WO[5] - * | | 5 | | RESET | - * | | 6 | | GND | - * +------------+------------------+--------+-----------------+-------------------------------------------------------------------------------------------------------- - * | | LEDs | | | - * +------------+------------------+--------+-----------------+-------------------------------------------------------------------------------------------------------- - * | 25 | | PB03 | RX | - * | 26 | | PA27 | TX | - * +------------+------------------+--------+-----------------+-------------------------------------------------------------------------------------------------------- - * | | USB | | | - * +------------+------------------+--------+-----------------+-------------------------------------------------------------------------------------------------------- - * | 27 | | PA28 | USB_HOST_ENABLE | EIC/EXTINT[8] - * | 28 | | PA24 | USB_NEGATIVE | *USB/DM - * | 29 | | PA25 | USB_POSITIVE | *USB/DP - * +------------+------------------+--------+-----------------+-------------------------------------------------------------------------------------------------------- - * | | EDBG | | | - * +------------+------------------+--------+-----------------+-------------------------------------------------------------------------------------------------------- - * | 30 | | PB22 | EDBG_UART TX | *SERCOM5/PAD[2] - * | 31 | | PB23 | EDBG_UART RX | *SERCOM5/PAD[3] - * +------------+------------------+--------+-----------------+-------------------------------------------------------------------------------------------------------- - * | 32 | | PA22 | EDBG_SDA | Pin 20 (SDA) - * | 33 | | PA23 | EDBG_SCL | Pin 21 (SCL) - * +------------+------------------+--------+-----------------+-------------------------------------------------------------------------------------------------------- - * | 34 | | PA19 | EDBG_MISO | EIC/EXTINT[3] *SERCOM1/PAD[3] SERCOM3/PAD[3] TC3/WO[1] TCC0/WO[3] - * | 35 | | PA16 | EDBG_MOSI | EIC/EXTINT[0] *SERCOM1/PAD[0] SERCOM3/PAD[0] TCC2/WO[0] TCC0/WO[6] - * | 36 | | PA18 | EDBG_SS | EIC/EXTINT[2] *SERCOM1/PAD[2] SERCOM3/PAD[2] TC3/WO[0] TCC0/WO[2] - * | 37 | | PA17 | EDBG_SCK | EIC/EXTINT[1] *SERCOM1/PAD[1] SERCOM3/PAD[1] TCC2/WO[1] TCC0/WO[7] - * +------------+------------------+--------+-----------------+-------------------------------------------------------------------------------------------------------- - * | 38 | ATN | PA13 | EDBG_GPIO0 | EIC/EXTINT[13] SERCOM2/PAD[1] SERCOM4/PAD[1] *TCC2/WO[1] TCC0/WO[7] - * | 39 | | PA21 | EDBG_GPIO1 | Pin 7 - * | 40 | | PA06 | EDBG_GPIO2 | Pin 8 - * | 41 | | PA07 | EDBG_GPIO3 | Pin 9 - * +------------+------------------+--------+-----------------+-------------------------------------------------------------------------------------------------------- - * | | | | | - * +------------+------------------+--------+-----------------+-------------------------------------------------------------------------------------------------------- - * | | GND | | | - * | 42 | AREF | PA03 | | EIC/EXTINT[3] *[ADC|DAC]/VREFA ADC/AIN[1] PTC/Y[1] - * +------------+------------------+--------+-----------------+-------------------------------------------------------------------------------------------------------- - * | |32.768KHz Crystal | | | - * +------------+------------------+--------+-----------------+-------------------------------------------------------------------------------------------------------- - * | | | PA00 | XIN32 | EIC/EXTINT[0] SERCOM1/PAD[0] TCC2/WO[0] - * | | | PA01 | XOUT32 | EIC/EXTINT[1] SERCOM1/PAD[1] TCC2/WO[1] - * +------------+------------------+--------+-----------------+-------------------------------------------------------------------------------------------------------- - */ - #include "variant.h" @@ -111,101 +23,133 @@ */ const PinDescription g_APinDescription[]= { - // 0..13 - Digital pins - // ---------------------- - // 0/1 - SERCOM/UART (Serial1) - { PORTA, 11, PIO_SERCOM, (PIN_ATTR_DIGITAL), No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_11 }, // RX: SERCOM0/PAD[3] - { PORTA, 10, PIO_SERCOM, (PIN_ATTR_DIGITAL), No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_10 }, // TX: SERCOM0/PAD[2] - // 2..12 - // Digital Low - { PORTA, 14, PIO_DIGITAL, (PIN_ATTR_DIGITAL), No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_14 }, - { PORTA, 9, PIO_TIMER, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM|PIN_ATTR_TIMER), No_ADC_Channel, PWM0_CH1, TCC0_CH1, EXTERNAL_INT_9 }, // TCC0/WO[1] - { PORTA, 8, PIO_TIMER, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM|PIN_ATTR_TIMER), No_ADC_Channel, PWM0_CH0, TCC0_CH0, EXTERNAL_INT_NMI }, // TCC0/WO[0] - { 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] - { PORTA, 20, PIO_TIMER_ALT, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM|PIN_ATTR_TIMER), No_ADC_Channel, PWM0_CH6, TCC0_CH6, EXTERNAL_INT_4 }, // TCC0/WO[6] - { PORTA, 21, PIO_DIGITAL, (PIN_ATTR_DIGITAL), No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_5 }, + /* + +------------+------------------+--------+-----------------+--------+-----------------------+---------+---------+--------+--------+----------+----------+ + | Pin number | MysX 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 | D1_DFM | PA10 | | 10 | 10 | | X02 | | 0/02 | 2/02 |*TCC1/0 | TCC0/2 | I2S/SCK0 | GCLK_IO4 | + | 01 | D2_DTM | PA08 | | NMI | 16 | | X00 | | 0/00 | 2/00 |*TCC0/0 | TCC1/2 | I2S/SD1 | | + | 02 | D3_INT | PA05 | | 5 | 05 | 01 | Y03 | | | 0/01 |*TCC0/1 | | | | + | 03 | D4_INT | PA07 | | 7 | 07 | 03 | Y05 | | | 0/03 |*TCC1/1 | | I2S/SD0 | | + | 04 | D5_PWM | PA04 | | 4 | 04 | 00 | Y02 | | | 0/00 |*TCC0/0 | TCC0/4 | | | + | 05 | D6_PWM | PA06 | | 6 | 06 | 02 | Y04 | | | 0/02 |*TCC1/0 | | | | + | 06 | D7_SCL | PA23 | | 7 | | | X11 | | 3/01 | 5/01 | TC4/1 |*TCC0/5 | USB/SOF | GCLK_IO7 | + | 07 | D8_SDA | PA22 | | 6 | | | X10 | | 3/00 | 5/00 | TC4/0 |*TCC0/4 | | GCLK_IO6 | + | 08 | D9_A3 | PB02 | | 2 | 10 | | Y08 | | | 5/00 | TC6/0 | | | | + | 09 | D10_A4 | PB03 | | 3 | 11 | | X09 | | | 5/01 | TC6/1 | | | | + | 10 | D11_MOSI | PB30 | | 14 | | | | | | 5/00 | TCC0/0 | TCC1/2 | | | + | 11 | D12_MISO | PB22 | | 6 | | | | | | 5/02 | TC7/0 | | | GCLK_IO0 | + | 12 | D13_SCK | PB31 | | 15 | | | | | | 5/01 | TCC0/1 | TCC1/3 | | | + | 13 | D14_CS | PB23 | | 7 | | | | | | 5/03 | TC7/1 | | | GCLK_IO1 | + | 14 | A1 | PA02 | | 2 | 00 | | Y00 | VOUT| | | | | | | + | 15 | A2 | PA03 | | 3 | 01 | | Y01 | | | | | | | | + +------------+------------------+--------+-----------------+--------+-----+-----+-----+-----+---------+---------+--------+--------+----------+----------+ + */ - // Digital High - { PORTA, 6, PIO_TIMER, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM|PIN_ATTR_TIMER), No_ADC_Channel, PWM1_CH0, TCC1_CH0, EXTERNAL_INT_4 }, // TCC1/WO[0] - { PORTA, 7, PIO_TIMER, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM|PIN_ATTR_TIMER), No_ADC_Channel, PWM1_CH1, TCC1_CH1, EXTERNAL_INT_5 }, // TCC1/WO[1] - { PORTA, 18, PIO_TIMER, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM|PIN_ATTR_TIMER), No_ADC_Channel, PWM3_CH0, TC3_CH0, EXTERNAL_INT_2 }, // TC3/WO[0] - { PORTA, 16, PIO_TIMER, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM|PIN_ATTR_TIMER), No_ADC_Channel, PWM2_CH0, TCC2_CH0, EXTERNAL_INT_0 }, // TCC2/WO[0] - { PORTA, 19, PIO_TIMER_ALT, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM|PIN_ATTR_TIMER), No_ADC_Channel, PWM0_CH3, TCC0_CH3, EXTERNAL_INT_3 }, // TCC0/WO[3] + { PORTA, 10, PIO_SERCOM, (PIN_ATTR_DIGITAL), No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_11 }, + { PORTA, 8, PIO_SERCOM, (PIN_ATTR_DIGITAL), No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_NMI }, + { PORTA, 5, PIO_DIGITAL, (PIN_ATTR_DIGITAL), No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_14 }, + { PORTA, 7, PIO_DIGITAL, (PIN_ATTR_DIGITAL), No_ADC_Channel, PWM0_CH1, TCC0_CH1, EXTERNAL_INT_9 }, + { PORTA, 4, PIO_TIMER, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM|PIN_ATTR_TIMER), No_ADC_Channel, PWM0_CH0, TCC0_CH0, EXTERNAL_INT_NMI}, + { PORTA, 6, PIO_TIMER, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM|PIN_ATTR_TIMER), No_ADC_Channel, PWM3_CH1, TC3_CH1, EXTERNAL_INT_1}, + { PORTA, 23, PIO_SERCOM, (PIN_ATTR_DIGITAL), No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_6 }, + { PORTA, 22, PIO_SERCOM, (PIN_ATTR_DIGITAL), No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_7 }, + { PORTB, 2, PIO_DIGITAL, (PIN_ATTR_ANALOG|PIN_ATTR_DIGITAL), ADC_Channel10, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_2}, + { PORTB, 3, PIO_DIGITAL, (PIN_ATTR_ANALOG|PIN_ATTR_DIGITAL), ADC_Channel11, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_3}, + { PORTB, 30, PIO_SERCOM_ALT, (PIN_ATTR_DIGITAL), No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, NOT_AN_INTERRUPT }, + { PORTB, 22, PIO_SERCOM_ALT, (PIN_ATTR_DIGITAL), No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, NOT_AN_INTERRUPT }, + { PORTB, 31, PIO_SERCOM_ALT, (PIN_ATTR_DIGITAL), No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, NOT_AN_INTERRUPT }, + { PORTB, 23, PIO_DIGITAL, (PIN_ATTR_DIGITAL), No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, NOT_AN_INTERRUPT }, + { PORTA, 2, PIO_ANALOG, (PIN_ATTR_ANALOG), ADC_Channel0, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_1}, + { PORTA, 3, PIO_ANALOG, (PIN_ATTR_ANALOG), ADC_Channel1, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_3}, - // 13 (LED) - { PORTA, 17, PIO_PWM, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM), No_ADC_Channel, PWM2_CH1, NOT_ON_TIMER, EXTERNAL_INT_1 }, // TCC2/WO[1] + /* + +-------- ----+------------------+--------+-----------------+--------+-----------------------+---------+---------+--------+--------+----------+----------+ + | Pin number | Internal pins | 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 | + | | LED INDICATORS | | |(EXTINT)|(AIN)|(AIN)| | | (x/PAD) | (x/PAD) | (x/WO) | (x/WO) | | | + +------------+------------------+--------+-----------------+--------+-----+-----+-----+-----+---------+---------+--------+--------+----------+----------+ + | 16 | LED_1 | PA19 | | 10 | | | X02 | | 0/02 | 2/02 |*TCC1/0 | TCC0/2 | I2S/SCK0 | GCLK_IO4 | + | 17 | LED_2 | PA20 | | NMI | | | X00 | | 0/00 | 2/00 |*TCC0/0 | TCC1/2 | I2S/SD1 | | + | 18 | LED_3 | PA21 | | 05 | 05 | 01 | Y03 | | | 0/01 |*TCC0/1 | | | | + | 19 | LED_4 | PB16 | | 06 | 07 | 03 | Y05 | | | 0/03 |*TCC1/1 | | I2S/SD0 | | + | 20 | LED_5 | PB17 | | *10 | | | | | | 4/02 |* TC5/0 | TCC0/4 | I2S/MCK1 | GCLK_IO4 | + +------------+------------------+--------+-----------------+--------+-----+-----+-----+-----+---------+---------+--------+--------+----------+----------+ + */ - // 14..19 - Analog pins - // -------------------- - { PORTA, 2, PIO_ANALOG, PIN_ATTR_ANALOG, ADC_Channel0, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_2 }, // ADC/AIN[0] - { PORTB, 8, PIO_ANALOG, PIN_ATTR_ANALOG, ADC_Channel2, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_8 }, // ADC/AIN[2] - { PORTB, 9, PIO_ANALOG, PIN_ATTR_ANALOG, ADC_Channel3, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_9 }, // ADC/AIN[3] - { PORTA, 4, PIO_ANALOG, PIN_ATTR_ANALOG, ADC_Channel4, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_4 }, // ADC/AIN[4] - { PORTA, 5, PIO_ANALOG, PIN_ATTR_ANALOG, ADC_Channel5, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_5 }, // ADC/AIN[5] - { PORTB, 2, PIO_ANALOG, PIN_ATTR_ANALOG, ADC_Channel10, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_2 }, // ADC/AIN[10] + { PORTA, 19, PIO_OUTPUT, (PIN_ATTR_DIGITAL), No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, NOT_AN_INTERRUPT }, + { PORTA, 20, PIO_OUTPUT, (PIN_ATTR_DIGITAL), No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, NOT_AN_INTERRUPT }, + { PORTA, 21, PIO_OUTPUT, (PIN_ATTR_DIGITAL), No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, NOT_AN_INTERRUPT }, + { PORTB, 16, PIO_OUTPUT, (PIN_ATTR_DIGITAL), No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, NOT_AN_INTERRUPT }, + { PORTB, 17, PIO_OUTPUT, (PIN_ATTR_DIGITAL), No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, NOT_AN_INTERRUPT }, - // 20..21 I2C pins (SDA/SCL and also EDBG:SDA/SCL) - // ---------------------- - { PORTA, 22, PIO_SERCOM, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_6 }, // SDA: SERCOM3/PAD[0] - { PORTA, 23, PIO_SERCOM, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_7 }, // SCL: SERCOM3/PAD[1] + /* + +------------+------------------+--------+-----------------+--------+-----------------------+---------+---------+--------+--------+----------+----------+ + | Pin number | Internal pins | 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 | + | | Peripherals | | |(EXTINT)|(AIN)|(AIN)| | | (x/PAD) | (x/PAD) | (x/WO) | (x/WO) | | | + +------------+------------------+--------+-----------------+--------+-----+-----+-----+-----+---------+---------+--------+--------+----------+----------+ + | 21 | NET_MOSI | PB12 | | 12 | | | X12 | | 4/00 | | TC4/0 | TCC0/6 | I2S/FS1 | GCLK_IO6 | + | 22 | NET_MISO | PB14 | | 14 | | | X14 | | 4/02 | | TC5/0 | | | GCLK_IO0 | + | 23 | NET_SCK | PB13 | | 13 | | | X13 | | 4/01 | | TC4/1 | TCC0/7 | | GCLK_IO7 | + | 24 | NET_SS | PB15 | | 15 | | | X15 | | 4/03 | | TC5/1 | | | GCLK_IO1 | + | 25 | NET_RST | PB11 | | 11 | | | | | | 4/3 | TC5/0 | TCC0/5 | I2S/SCK1 | GCLK_IO5 | + | 26 | MOSI | PA16 | | 12 | | | X12 | | 1/00 | | TC4/0 | TCC0/6 | I2S/FS1 | GCLK_IO6 | + | 27 | MISO | PA18 | | 14 | | | X14 | | 1/02 | | TC5/0 | | | GCLK_IO0 | + | 28 | SCK | PA17 | | 13 | | | X13 | | 1/01 | | TC4/1 | TCC0/7 | | GCLK_IO7 | + | 29 | CS_NRF | PA09 | | 9 | 17 | | X01 | | 0/01 | 2/1 | TCC0/1 | TCC1/3 | I2S/MCK | | + | 30 | CS_RFM | PA12 | | 12 | | | | | 2/00 | 4/0 | TCC2/0 | TCC0/6 | | AC/CMP0 | + | 31 | IRQ_NRF | PA14 | | 14 | | | | | 2/02 | 4/2 | TC3/0 | TCC0/4 | | GCLK_IO0 | + | 32 | IRQ_RFM | PA13 | | 13 | | | | | 2/01 | 4/1 | TCC2/1 | TCC0/7 | | AC/CMP1 | + | 33 | CS_SDCARD | PA27 | | 15 | | | | | | | | | | GCLK_IO0 | + | 34 | CE_NRF | PA28 | | 8 | | | | | | | | | | GCLK_IO0 | + | 35 | SDCARD_DETECT | PB07 | | 7 | | | | | | | | | | | + +------------+------------------+--------+-----------------+--------+-----+-----+-----+-----+---------+---------+--------+--------+----------+----------+ + */ - // 22..24 - SPI pins (ICSP:MISO,SCK,MOSI) - // ---------------------- - { PORTA, 12, PIO_SERCOM_ALT, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_12 }, // MISO: SERCOM4/PAD[0] - { PORTB, 10, PIO_SERCOM_ALT, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_10 }, // MOSI: SERCOM4/PAD[2] - { PORTB, 11, PIO_SERCOM_ALT, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_11 }, // SCK: SERCOM4/PAD[3] + { PORTB, 12, PIO_SERCOM_ALT, (PIN_ATTR_NONE), No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_NONE }, // MOSI: SERCOM4/PAD[0] + { PORTB, 14, PIO_SERCOM_ALT, (PIN_ATTR_NONE), No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_NONE }, // MISO: SERCOM4/PAD[2] + { PORTB, 13, PIO_SERCOM_ALT, (PIN_ATTR_NONE), No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_NONE }, // SS: SERCOM4/PAD[3] + { PORTB, 15, PIO_SERCOM_ALT, (PIN_ATTR_NONE), No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_NONE }, // SCK: SERCOM1/PAD[1] + { PORTB, 11, PIO_OUTPUT, (PIN_ATTR_DIGITAL), No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_NONE }, // Reset line + { PORTA, 16, PIO_SERCOM, (PIN_ATTR_NONE), No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_NONE }, // MOSI: SERCOM4/PAD[0] + { PORTA, 18, PIO_SERCOM, (PIN_ATTR_NONE), No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_NONE }, // MISO: SERCOM4/PAD[2] + { PORTA, 17, PIO_SERCOM, (PIN_ATTR_NONE), No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_NONE }, // SS: SERCOM4/PAD[3] + { PORTA, 9, PIO_OUTPUT, (PIN_ATTR_DIGITAL), No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_9 }, // Reset line + { PORTA, 12, PIO_OUTPUT, (PIN_ATTR_DIGITAL), No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_12 }, // Reset line + { PORTA, 14, PIO_DIGITAL, (PIN_ATTR_DIGITAL), No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_14 }, // Reset line + { PORTA, 13, PIO_DIGITAL, (PIN_ATTR_DIGITAL), No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_13 }, // Reset line + { PORTA, 27, PIO_OUTPUT, (PIN_ATTR_DIGITAL), No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_NONE }, // Reset line + { PORTA, 28, PIO_OUTPUT, (PIN_ATTR_DIGITAL), No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_NONE }, // Reset line + { PORTB, 7, PIO_DIGITAL, (PIN_ATTR_DIGITAL), No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_7 }, // Reset line - // 25..26 - RX/TX LEDS (PB03/PA27) - // -------------------- - { PORTB, 3, PIO_OUTPUT, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_NONE }, // used as output only - { PORTA, 27, PIO_OUTPUT, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_NONE }, // used as output only + /* + +------------+------------------+--------+-----------------+--------+-----------------------+---------+---------+--------+--------+----------+----------+ + | Pin number | Internal pins | 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 | + | | Peripherals | | |(EXTINT)|(AIN)|(AIN)| | | (x/PAD) | (x/PAD) | (x/WO) | (x/WO) | | | + +------------+------------------+--------+-----------------+--------+-----+-----+-----+-----+---------+---------+--------+--------+----------+----------+ + | 36 | BAT_DET | PB08 | | 8 | 2 | | Y14 | | | 4/0 | TC4/0 | | | | + | 37 | SUPPLY_DET | PB09 | | 9 | 3 | | Y15 | | | 4/1 | TC4/1 | | | | + | 38 | TESTMODE | PB04 | | 4 | 12 | | Y10 | | | | | | | GCLK_IO7 | + | 39 | BOOTMODE | PA15 | | 15 | | | | | 2/03 | 4/3 | TC3/1 | TCC0/5 | | GCLK_IO1 | + | 39 | INCL_SW | PB01 | | 1 | 9 | | Y07 | | | 5/3 | TC7/1 | | | GCLK_IO1 | + | 39 | SWC1 | PB05 | | 5 | 13 | | Y11 | | | | | | | | + | 39 | SWC2 | PB06 | | 6 | 14 | | Y12 | | | | | | | | + +------------+------------------+--------+-----------------+--------+-----+-----+-----+-----+---------+---------+--------+--------+----------+----------+ + */ - // 27..29 - USB - // -------------------- - { 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 - - // 30..41 - EDBG - // ---------------------- - // 30/31 - EDBG/UART - { PORTB, 22, PIO_SERCOM_ALT, PIN_ATTR_NONE, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_NONE }, // TX: SERCOM5/PAD[2] - { PORTB, 23, PIO_SERCOM_ALT, PIN_ATTR_NONE, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_NONE }, // RX: SERCOM5/PAD[3] - - // 32/33 I2C (SDA/SCL and also EDBG:SDA/SCL) - { PORTA, 22, PIO_SERCOM, PIN_ATTR_NONE, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_NONE }, // SDA: SERCOM3/PAD[0] - { PORTA, 23, PIO_SERCOM, PIN_ATTR_NONE, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_NONE }, // SCL: SERCOM3/PAD[1] - - // 34..37 - EDBG/SPI - { PORTA, 19, PIO_SERCOM, PIN_ATTR_NONE, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_NONE }, // MISO: SERCOM1/PAD[3] - { PORTA, 16, PIO_SERCOM, PIN_ATTR_NONE, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_NONE }, // MOSI: SERCOM1/PAD[0] - { PORTA, 18, PIO_SERCOM, PIN_ATTR_NONE, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_NONE }, // SS: SERCOM1/PAD[2] - { PORTA, 17, PIO_SERCOM, PIN_ATTR_NONE, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_NONE }, // SCK: SERCOM1/PAD[1] - - // 38..41 - EDBG/Digital - { PORTA, 13, PIO_PWM, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM), No_ADC_Channel, PWM0_CH5, NOT_ON_TIMER, EXTERNAL_INT_13 }, // EIC/EXTINT[13] *TCC2/WO[1] TCC0/WO[7] - { PORTA, 21, PIO_PWM_ALT, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM), No_ADC_Channel, PWM0_CH7, NOT_ON_TIMER, EXTERNAL_INT_NONE }, // Pin 7 - { PORTA, 6, PIO_PWM, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM), No_ADC_Channel, PWM1_CH0, NOT_ON_TIMER, EXTERNAL_INT_NONE }, // Pin 8 - { PORTA, 7, PIO_PWM, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM), No_ADC_Channel, PWM1_CH1, NOT_ON_TIMER, EXTERNAL_INT_NONE }, // Pin 9 - - // 42 (AREF) - { PORTA, 3, PIO_ANALOG, PIN_ATTR_ANALOG, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_NONE }, // DAC/VREFP - - // ---------------------- - // 43 - Alternate use of A0 (DAC output) - { PORTA, 2, PIO_ANALOG, PIN_ATTR_ANALOG, DAC_Channel0, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_2 }, // DAC/VOUT - // 44 - LED_4 (yellow led) - { PORTB, 16, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_NONE }, - - // 45 - CE_NRF - { PORTA, 28, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_NONE }, - // 46 - 49 NET_SPI (SERCOM4) - { PORTB, 15, PIO_SERCOM, PIN_ATTR_NONE, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_NONE }, // MISO: SERCOM1/PAD[3] - { PORTB, 12, PIO_SERCOM, PIN_ATTR_NONE, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_NONE }, // MOSI: SERCOM1/PAD[0] - { PORTB, 14, PIO_SERCOM, PIN_ATTR_NONE, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_NONE }, // SS: SERCOM1/PAD[2] - { PORTB, 13, PIO_SERCOM, PIN_ATTR_NONE, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_NONE } // SCK: SERCOM1/PAD[1] -}; + { PORTB, 8, PIO_ANALOG, PIN_ATTR_ANALOG, ADC_Channel2, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_NONE }, + { PORTB, 9, PIO_ANALOG, PIN_ATTR_ANALOG, ADC_Channel3, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_NONE }, + { PORTB, 4, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_4 }, + { PORTA, 15, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_15 }, + { PORTB, 1, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_1 }, + { PORTB, 5, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_5 }, + { PORTA, 6, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_6 } +}; const void* g_apTCInstances[TCC_INST_NUM+TC_INST_NUM]={ TCC0, TCC1, TCC2, TC3, TC4, TC5 } ; @@ -218,15 +162,8 @@ SERCOM sercom4( SERCOM4 ) ; SERCOM sercom5( SERCOM5 ) ; Uart Serial1( &sercom0, PIN_SERIAL1_RX, PIN_SERIAL1_TX, PAD_SERIAL1_RX, PAD_SERIAL1_TX ) ; -//Uart Serial( &sercom5, PIN_SERIAL_RX, PIN_SERIAL_TX, PAD_SERIAL_RX, PAD_SERIAL_TX ) ; + void SERCOM0_Handler() { Serial1.IrqHandler(); } -/* -void SERCOM5_Handler() -{ - Serial.IrqHandler(); -} - -*/ \ No newline at end of file diff --git a/hardware/MySensors/samd/variants/mysensors_gw/variant.h b/hardware/MySensors/samd/variants/mysensors_gw/variant.h index 4bdf9c7..4136c0b 100644 --- a/hardware/MySensors/samd/variants/mysensors_gw/variant.h +++ b/hardware/MySensors/samd/variants/mysensors_gw/variant.h @@ -16,8 +16,8 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef _VARIANT_ARDUINO_ZERO_ -#define _VARIANT_ARDUINO_ZERO_ +#ifndef _VARIANT_MYSENSORS_GW_ +#define _VARIANT_MYSENSORS_GW_ /*---------------------------------------------------------------------------- * Definitions @@ -50,10 +50,10 @@ extern "C" *----------------------------------------------------------------------------*/ // Number of pins defined in PinDescription array -#define PINS_COUNT (26u) -#define NUM_DIGITAL_PINS (14u) -#define NUM_ANALOG_INPUTS (6u) -#define NUM_ANALOG_OUTPUTS (1u) +#define PINS_COUNT (39u) +#define NUM_DIGITAL_PINS (16u) +//#define NUM_ANALOG_INPUTS (6u) +//#define NUM_ANALOG_OUTPUTS (1u) #define digitalPinToPort(P) ( &(PORT->Group[g_APinDescription[P].ulPort]) ) #define digitalPinToBitMask(P) ( 1 << g_APinDescription[P].ulPin ) @@ -84,20 +84,27 @@ extern "C" #define PIN_LED4 LED_GREEN #define LED_BUILTIN LED_YELLOW -#define LED_BLUE (12u) -#define LED_RED (6u) -#define LED_GREEN (7u) -#define LED_YELLOW (44u) +#define LED_1 (16u) +#define LED_2 (17u) +#define LED_3 (18u) +#define LED_4 (19u) +#define LED_5 (20u) + +#define LED_BLUE (16u) +#define LED_RED (17u) +#define LED_GREEN (18u) +#define LED_YELLOW (19u) +#define LED_ORANGE (20u) /* * Analog pins */ #define PIN_A0 (14ul) #define PIN_A1 (15ul) -#define PIN_A2 (16ul) -#define PIN_A3 (17ul) -#define PIN_A4 (18ul) -#define PIN_A5 (19ul) +#define PIN_A2 ( 8ul) +#define PIN_A3 ( 9ul) +#define PIN_A4 (36ul) +#define PIN_A5 (37ul) static const uint8_t A0 = PIN_A0 ; static const uint8_t A1 = PIN_A1 ; @@ -108,17 +115,17 @@ static const uint8_t A5 = PIN_A5 ; #define ADC_RESOLUTION 12 // Other pins -#define PIN_ATN (38ul) -static const uint8_t ATN = PIN_ATN; +//#define PIN_ATN (38ul) +//static const uint8_t ATN = PIN_ATN; /* * Serial interfaces */ // Serial (EDBG) -#define PIN_SERIAL_RX (31ul) -#define PIN_SERIAL_TX (30ul) -#define PAD_SERIAL_TX (UART_TX_PAD_2) -#define PAD_SERIAL_RX (SERCOM_RX_PAD_3) +//#define PIN_SERIAL_RX (31ul) +//#define PIN_SERIAL_TX (30ul) +//#define PAD_SERIAL_TX (UART_TX_PAD_2) +//#define PAD_SERIAL_RX (SERCOM_RX_PAD_3) // Serial1 #define PIN_SERIAL1_RX (0ul) @@ -129,8 +136,47 @@ static const uint8_t ATN = PIN_ATN; /* * SPI Interfaces */ -#define SPI_INTERFACES_COUNT 1 +#define SPI_INTERFACES_COUNT 3 +// SPI +#define PIN_SPI_MISO (27u) +#define PIN_SPI_MOSI (26u) +#define PIN_SPI_SCK (28u) +#define PIN_SPI_SS (PIN_A2) +#define PERIPH_SPI sercom1 +#define PAD_SPI_TX SPI_PAD_0_SCK_1 +#define PAD_SPI_RX SERCOM_RX_PAD_2 +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 W5100 +#define PIN_SPI1_MISO (22u) +#define PIN_SPI1_MOSI (21u) +#define PIN_SPI1_SCK (23u) +#define PERIPH_SPI1 sercom4 +#define PAD_SPI1_TX SPI_PAD_0_SCK_1 +#define PAD_SPI1_RX SERCOM_RX_PAD_2 +static const uint8_t MOSI1 = PIN_SPI1_MOSI; +static const uint8_t MISO1 = PIN_SPI1_MISO; +static const uint8_t SCK1 = PIN_SPI1_SCK; + +// SPI2: Connected to MysX +#define PIN_SPI2_MISO (11u) +#define PIN_SPI2_MOSI (10u) +#define PIN_SPI2_SCK (12u) +#define PERIPH_SPI2 sercom2 +#define PAD_SPI2_TX SPI_PAD_0_SCK_1 +#define PAD_SPI2_RX SERCOM_RX_PAD_2 +static const uint8_t MOSI2 = PIN_SPI2_MOSI; +static const uint8_t MISO2 = PIN_SPI2_MISO; +static const uint8_t SCK2 = PIN_SPI2_SCK; + +#define SPI_ETH SPI1 +#define SPI_USER SPI2 + +/* #define RADIO_SPI_MISO (36u) #define RADIO_SPI_MOSI (35u) #define RADIO_SPI_SCK (37u) @@ -142,9 +188,9 @@ static const uint8_t ATN = PIN_ATN; #define USR_SPI_MISO (48u) #define USR_SPI_MOSI (47u) #define USR_SPI_SCK (49u) +*/ - -static const uint8_t SS = PIN_A2 ; // SERCOM4 last PAD is present on A2 but HW SS isn't used. Set here only for reference. +//static const uint8_t SS = PIN_A2 ; // SERCOM4 last PAD is present on A2 but HW SS isn't 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 ; @@ -154,8 +200,8 @@ static const uint8_t SCK = PIN_SPI_SCK ; */ #define WIRE_INTERFACES_COUNT 1 -#define PIN_WIRE_SDA (20u) -#define PIN_WIRE_SCL (21u) +#define PIN_WIRE_SDA (07u) +#define PIN_WIRE_SCL (06u) /* * USB @@ -173,31 +219,31 @@ static const uint8_t SCK = PIN_SPI_SCK ; * MYSX pins */ -#define MYSX_D1_DFM -#define MYSX_D2_DTM -#define MYSX_D3_INT -#define MYSX_D4_INT -#define MYSX_D5_PWM -#define MYSX_D6_PWM -#define MYSX_D7_SCL -#define MYSX_D8_SDA -#define MYSX_D9_A3 -#define MYSX_D10_A4 -#define MYSX_D11_MOSI -#define MYSX_D12_MISO -#define MYSX_D13_SCK -#define MYSX_D14_CS -#define MYSX_A1 -#define MYSX_A2 - +#define MYSX_D1_DFM (00ul) +#define MYSX_D2_DTM (01ul) +#define MYSX_D3_INT (02ul) +#define MYSX_D4_INT (03ul) +#define MYSX_D5_PWM (04ul) +#define MYSX_D6_PWM (05ul) +#define MYSX_D7_SCL (06ul) +#define MYSX_D8_SDA (07ul) +#define MYSX_D9_A3 (08ul) +#define MYSX_D10_A4 (09ul) +#define MYSX_D11_MOSI (10ul) +#define MYSX_D12_MISO (11ul) +#define MYSX_D13_SCK (12ul) +#define MYSX_D14_CS (13ul) +#define MYSX_A1 (14ul) +#define MYSX_A2 (15ul) +#define MYSX_SPI SPI2 #define MY_SIGNING_ATSHA204_PIN 17 #define MY_HW_ERR_LED_PIN LED_RED #define MY_HW_RX_LED_PIN LED_YELLOW #define MY_HW_TX_LED_PIN LED_GREEN -#define MY_RF69_SPI_CS 22 -#define MY_RF69_IRQ_PIN 38 -#define MY_RF69_IRQ_NUM 38 +#define MY_RF69_SPI_CS 30 +#define MY_RF69_IRQ_PIN 32 +#define MY_RF69_IRQ_NUM 32 /*---------------------------------------------------------------------------- * Arduino objects - C++ only @@ -243,5 +289,4 @@ extern Uart Serial1; //#define SERIAL_PORT_HARDWARE_OPEN Serial1 #define Serial SerialUSB -#endif /* _VARIANT_ARDUINO_ZERO_ */ - +#endif /* _VARIANT_MYSENSORS_GW_ */