DM: bunch of updates for mega

This commit is contained in:
dean 2018-08-30 18:23:57 -04:00
parent affe732e4f
commit 9f2846bf7f
4 changed files with 236 additions and 97 deletions

View file

@ -110,6 +110,31 @@ typedef enum _ETCChannel
TCC3_CH5 = (3<<8)|(1),
TCC3_CH6 = (3<<8)|(2),
TCC3_CH7 = (3<<8)|(3),
TCC4_CH0 = (4<<8)|(0),
TCC4_CH1 = (4<<8)|(1),
TCC4_CH2 = (4<<8)|(2),
TCC4_CH3 = (4<<8)|(3),
TCC4_CH4 = (4<<8)|(0),
TCC4_CH5 = (4<<8)|(1),
TCC4_CH6 = (4<<8)|(2),
TCC4_CH7 = (4<<8)|(3),
TC0_CH0 = (5<<8)|(0),
TC0_CH1 = (5<<8)|(1),
TC1_CH0 = (6<<8)|(0),
TC1_CH1 = (6<<8)|(1),
TC2_CH0 = (7<<8)|(0),
TC2_CH1 = (7<<8)|(1),
TC3_CH0 = (8<<8)|(0),
TC3_CH1 = (8<<8)|(1),
TC4_CH0 = (9<<8)|(0),
TC4_CH1 = (9<<8)|(1),
TC5_CH0 = (10<<8)|(0),
TC5_CH1 = (10<<8)|(1),
TC6_CH0 = (11<<8)|(0),
TC6_CH1 = (11<<8)|(1),
TC7_CH0 = (12<<8)|(0),
TC7_CH1 = (12<<8)|(1),
} ETCChannel ;
#else
@ -170,6 +195,47 @@ extern const void* g_apTCInstances[TCC_INST_NUM+TC_INST_NUM] ;
PWM1_CH5=TCC1_CH5,
PWM1_CH6=TCC1_CH6,
PWM1_CH7=TCC1_CH7,
PWM2_CH0=TCC2_CH0,
PWM2_CH1=TCC2_CH1,
PWM2_CH2=TCC2_CH2,
PWM2_CH3=TCC2_CH3,
PWM2_CH4=TCC2_CH4,
PWM2_CH5=TCC2_CH5,
PWM2_CH6=TCC2_CH6,
PWM2_CH7=TCC2_CH7,
PWM3_CH0=TCC3_CH0,
PWM3_CH1=TCC3_CH1,
PWM3_CH2=TCC3_CH2,
PWM3_CH3=TCC3_CH3,
PWM3_CH4=TCC3_CH4,
PWM3_CH5=TCC3_CH5,
PWM3_CH6=TCC3_CH6,
PWM3_CH7=TCC3_CH7,
PWM4_CH0=TCC4_CH0,
PWM4_CH1=TCC4_CH1,
PWM4_CH2=TCC4_CH2,
PWM4_CH3=TCC4_CH3,
PWM4_CH4=TCC4_CH4,
PWM4_CH5=TCC4_CH5,
PWM4_CH6=TCC4_CH6,
PWM4_CH7=TCC4_CH7,
PWM5_CH0=TC0_CH0,
PWM5_CH1=TC0_CH1,
PWM6_CH0=TC1_CH0,
PWM6_CH1=TC1_CH1,
PWM7_CH0=TC2_CH0,
PWM7_CH1=TC2_CH1,
PWM8_CH0=TC3_CH0,
PWM8_CH1=TC3_CH1,
PWM9_CH0=TC4_CH0,
PWM9_CH1=TC4_CH1,
PWM10_CH0=TC5_CH0,
PWM10_CH1=TC5_CH1,
PWM11_CH0=TC6_CH0,
PWM11_CH1=TC6_CH1,
PWM12_CH0=TC7_CH0,
PWM12_CH1=TC7_CH1,
} EPWMChannel ;
#else //end __SAMD51J19A__
@ -216,6 +282,7 @@ typedef enum _EPortType
PORTA=0,
PORTB=1,
PORTC=2,
PORTD=3,
} EPortType ;
#define PIN_NOT_A_PIN (UINT_MAX)
@ -244,6 +311,34 @@ typedef enum
EXTERNAL_INT_NONE = NOT_AN_INTERRUPT,
} EExt_Interrupts ;
#if defined(__SAMD51__)
typedef enum _EPioType
{
PIO_NOT_A_PIN=-1, /* Not under control of a peripheral. */
PIO_EXTINT=0, /* The pin is controlled by the associated signal of peripheral A. */
PIO_ANALOG, /* The pin is controlled by the associated signal of peripheral B. */
PIO_SERCOM, /* The pin is controlled by the associated signal of peripheral C. */
PIO_SERCOM_ALT, /* The pin is controlled by the associated signal of peripheral D. */
PIO_TC, /* The pin is controlled by the associated signal of peripheral E. */
PIO_TCC, /* The pin is controlled by the associated signal of peripheral F. */
PIO_TCC_PDEC, /* The pin is controlled by the associated signal of peripheral G. */
PIO_COM, /* The pin is controlled by the associated signal of peripheral H. */
PIO_SDHC, /* The pin is controlled by the associated signal of peripheral I. */
PIO_I2S, /* The pin is controlled by the associated signal of peripheral J. */
PIO_PCC, /* The pin is controlled by the associated signal of peripheral K. */
PIO_GMAC, /* The pin is controlled by the associated signal of peripheral L. */
PIO_AC_CLK, /* The pin is controlled by the associated signal of peripheral M. */
PIO_CCL, /* The pin is controlled by the associated signal of peripheral N. */
PIO_DIGITAL, /* The pin is controlled by PORT. */
PIO_INPUT, /* The pin is controlled by PORT and is an input. */
PIO_INPUT_PULLUP, /* The pin is controlled by PORT and is an input with internal pull-up resistor enabled. */
PIO_OUTPUT, /* The pin is controlled by PORT and is an output. */
} EPioType ;
#else
//A B C D E F G H
//EIC REF ADC AC PTC DAC SERCOM SERCOM_ALT TC/TCC TCC COM AC/GCLK
@ -256,19 +351,9 @@ typedef enum _EPioType
PIO_SERCOM_ALT, /* The pin is controlled by the associated signal of peripheral D. */
PIO_TIMER, /* The pin is controlled by the associated signal of peripheral E. */
PIO_TIMER_ALT, /* The pin is controlled by the associated signal of peripheral F. */
#if defined(__SAMD51__)
PIO_TCC_PDEC, /* The pin is controlled by the associated signal of peripheral G. */
PIO_COM, /* The pin is controlled by the associated signal of peripheral H. */
PIO_SDHC, /* The pin is controlled by the associated signal of peripheral I. */
PIO_I2S, /* The pin is controlled by the associated signal of peripheral J. */
PIO_PCC, /* The pin is controlled by the associated signal of peripheral K. */
PIO_GMAC, /* The pin is controlled by the associated signal of peripheral L. */
PIO_AC_CLK, /* The pin is controlled by the associated signal of peripheral M. */
PIO_CCL, /* The pin is controlled by the associated signal of peripheral N. */
#else
PIO_COM, /* The pin is controlled by the associated signal of peripheral G. */
PIO_AC_CLK, /* The pin is controlled by the associated signal of peripheral H. */
#endif
PIO_DIGITAL, /* The pin is controlled by PORT. */
PIO_INPUT, /* The pin is controlled by PORT and is an input. */
PIO_INPUT_PULLUP, /* The pin is controlled by PORT and is an input with internal pull-up resistor enabled. */
@ -277,6 +362,7 @@ typedef enum _EPioType
PIO_PWM=PIO_TIMER,
PIO_PWM_ALT=PIO_TIMER_ALT,
} EPioType ;
#endif
/**
* Pin Attributes to be OR-ed
@ -290,6 +376,12 @@ typedef enum _EPioType
#define PIN_ATTR_TIMER_ALT (1UL<<5)
#define PIN_ATTR_EXTINT (1UL<<6)
#if defined(__SAMD51__)
#define PIN_ATTR_PWM_TC (1UL<<7)
#define PIN_ATTR_PWM_TCC (1UL<<8)
#define PIN_ATTR_PWM_TCC_PDEC (1UL<<9)
#endif
/* Types used for the table below */
typedef struct _PinDescription
{

View file

@ -253,6 +253,8 @@ uint32_t analogRead(uint32_t pin)
#endif
#if defined(__SAMD51__)
//TODO: This should use ADC1 depending on the channel
while( ADC0->SYNCBUSY.reg & ADC_SYNCBUSY_INPUTCTRL ); //wait for sync
ADC0->INPUTCTRL.bit.MUXPOS = g_APinDescription[pin].ulADCChannelNumber; // Selection for the positive ADC input
@ -424,32 +426,24 @@ void analogWrite(uint32_t pin, uint32_t value)
}
#endif
if ((attr & PIN_ATTR_PWM) == PIN_ATTR_PWM)
#if defined(__SAMD51__)
if ((attr & PIN_ATTR_PWM_TC) == PIN_ATTR_PWM_TC ||
(attr & PIN_ATTR_PWM_TC) == PIN_ATTR_PWM_TCC ||
(attr & PIN_ATTR_PWM_TC) == PIN_ATTR_PWM_TCC_PDEC )
{
uint32_t tcNum = GetTCNumber(pinDesc.ulPWMChannel);
uint8_t tcChannel = GetTCChannelNumber(pinDesc.ulPWMChannel);
static bool tcEnabled[TCC_INST_NUM+TC_INST_NUM];
if (attr & PIN_ATTR_TIMER) {
#if !(ARDUINO_SAMD_VARIANT_COMPLIANCE >= 10603)
// Compatibility for cores based on SAMD core <=1.6.2
if (pinDesc.ulPinType == PIO_TIMER_ALT) {
pinPeripheral(pin, PIO_TIMER_ALT);
} else
#endif
{
#if defined(__SAMD51__)
//on SAMD51 we are only using TCC for timers
pinPeripheral(pin, PIO_TCC_PDEC);
#else
pinPeripheral(pin, PIO_TIMER);
#endif
}
} else if ((attr & PIN_ATTR_TIMER_ALT) == PIN_ATTR_TIMER_ALT){
//this is on an alt timer
pinPeripheral(pin, PIO_TIMER_ALT);
if ((attr & PIN_ATTR_PWM_TC) == PIN_ATTR_PWM_TC) {
pinPeripheral(pin, PIO_TC);
} else if ((attr & PIN_ATTR_PWM_TCC) == PIN_ATTR_PWM_TCC){
//this is on a TCC
pinPeripheral(pin, PIO_TCC);
} else if ((attr & PIN_ATTR_PWM_TCC_PDEC) == PIN_ATTR_PWM_TCC_PDEC){
//this is on a TCC_PDEC
pinPeripheral(pin, PIO_TCC_PDEC);
}
else{
return;
@ -458,7 +452,6 @@ void analogWrite(uint32_t pin, uint32_t value)
if (!tcEnabled[tcNum]) {
tcEnabled[tcNum] = true;
#if defined(__SAMD51__)
uint32_t GCLK_CLKCTRL_IDs[] = {
TCC0_GCLK_ID,
TCC1_GCLK_ID,
@ -466,8 +459,31 @@ void analogWrite(uint32_t pin, uint32_t value)
#if defined(TCC3)
TCC3_GCLK_ID,
TCC4_GCLK_ID,
#endif
#if defined(TC0)
TC0_GCLK_ID,
#endif
#if defined(TC1)
TC1_GCLK_ID,
#endif
#if defined(TC2)
TC2_GCLK_ID,
#endif
#if defined(TC3)
TC3_GCLK_ID,
#endif
#if defined(TC4)
TC4_GCLK_ID,
#endif
#if defined(TC5)
TC5_GCLK_ID,
#endif
#if defined(TC6)
TC6_GCLK_ID,
#endif
#if defined(TC7)
TC7_GCLK_ID,
#endif
};
GCLK->PCHCTRL[GCLK_CLKCTRL_IDs[tcNum]].reg = GCLK_PCHCTRL_GEN_GCLK0_Val | (1 << GCLK_PCHCTRL_CHEN_Pos); //use clock generator 0
@ -543,6 +559,35 @@ void analogWrite(uint32_t pin, uint32_t value)
}
#else
if ((attr & PIN_ATTR_PWM) == PIN_ATTR_PWM)
{
uint32_t tcNum = GetTCNumber(pinDesc.ulPWMChannel);
uint8_t tcChannel = GetTCChannelNumber(pinDesc.ulPWMChannel);
static bool tcEnabled[TCC_INST_NUM+TC_INST_NUM];
if (attr & PIN_ATTR_TIMER) {
#if !(ARDUINO_SAMD_VARIANT_COMPLIANCE >= 10603)
// Compatibility for cores based on SAMD core <=1.6.2
if (pinDesc.ulPinType == PIO_TIMER_ALT) {
pinPeripheral(pin, PIO_TIMER_ALT);
} else
#endif
{
pinPeripheral(pin, PIO_TIMER);
}
} else if ((attr & PIN_ATTR_TIMER_ALT) == PIN_ATTR_TIMER_ALT){
//this is on an alt timer
pinPeripheral(pin, PIO_TIMER_ALT);
}
else{
return;
}
if (!tcEnabled[tcNum]) {
tcEnabled[tcNum] = true;
uint16_t GCLK_CLKCTRL_IDs[] = {
GCLK_CLKCTRL_ID(GCM_TCC0_TCC1), // TCC0
GCLK_CLKCTRL_ID(GCM_TCC0_TCC1), // TCC1

View file

@ -65,10 +65,10 @@ int pinPeripheral( uint32_t ulPin, EPioType ulPeripheral )
case PIO_ANALOG:
case PIO_SERCOM:
case PIO_SERCOM_ALT:
case PIO_TIMER:
case PIO_TIMER_ALT:
case PIO_EXTINT:
#if defined(__SAMD51__)
case PIO_TC:
case PIO_TCC:
case PIO_TCC_PDEC:
case PIO_COM:
case PIO_SDHC:
@ -78,6 +78,8 @@ int pinPeripheral( uint32_t ulPin, EPioType ulPeripheral )
case PIO_AC_CLK:
case PIO_CCL:
#else
case PIO_TIMER:
case PIO_TIMER_ALT:
case PIO_COM:
case PIO_AC_CLK:
#endif

View file

@ -32,22 +32,22 @@ const PinDescription g_APinDescription[]=
// 2..12
// Digital Low
{ PORTC, 18, PIO_TIMER_ALT, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM|PIN_ATTR_TIMER_ALT), No_ADC_Channel, PWM0_CH2, TCC0_CH2, EXTERNAL_INT_2 },
{ PORTC, 19, PIO_TIMER_ALT, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM|PIN_ATTR_TIMER_ALT), No_ADC_Channel, PWM0_CH3, TCC0_CH3, EXTERNAL_INT_3 },
{ PORTC, 20, PIO_TIMER_ALT, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM|PIN_ATTR_TIMER_ALT), No_ADC_Channel, PWM0_CH4, TCC0_CH4, EXTERNAL_INT_4 },
{ PORTC, 21, PIO_TIMER_ALT, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM|PIN_ATTR_TIMER_ALT), No_ADC_Channel, PWM0_CH5, TCC0_CH5, EXTERNAL_INT_5 },
{ PORTD, 20, PIO_TIMER_ALT, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM|PIN_ATTR_TIMER_ALT), No_ADC_Channel, PWM1_CH0, TCC1_CH0, EXTERNAL_INT_10 },
{ PORTD, 21, PIO_TIMER_ALT, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM|PIN_ATTR_TIMER_ALT), No_ADC_Channel, PWM1_CH1, TCC1_CH1, EXTERNAL_INT_11 },
{ PORTC, 18, PIO_TCC, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM_TCC), No_ADC_Channel, PWM0_CH2, TCC0_CH2, EXTERNAL_INT_2 },
{ PORTC, 19, PIO_TCC, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM_TCC), No_ADC_Channel, PWM0_CH3, TCC0_CH3, EXTERNAL_INT_3 },
{ PORTC, 20, PIO_TCC, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM_TCC), No_ADC_Channel, PWM0_CH4, TCC0_CH4, EXTERNAL_INT_4 },
{ PORTC, 21, PIO_TCC, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM_TCC), No_ADC_Channel, PWM0_CH5, TCC0_CH5, EXTERNAL_INT_5 },
{ PORTD, 20, PIO_TCC, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM_TCC), No_ADC_Channel, PWM1_CH0, TCC1_CH0, EXTERNAL_INT_10 },
{ PORTD, 21, PIO_TCC, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM_TCC), No_ADC_Channel, PWM1_CH1, TCC1_CH1, EXTERNAL_INT_11 },
// Digital High
{ PORTB, 18, PIO_TIMER_ALT, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM|PIN_ATTR_TIMER_ALT), No_ADC_Channel, PWM1_CH0, TCC1_CH0, EXTERNAL_INT_2 },
{ PORTB, 19, PIO_TIMER_ALT, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM|PIN_ATTR_TIMER_ALT), No_ADC_Channel, PWM1_CH1, TCC1_CH1, EXTERNAL_INT_3 },
{ PORTB, 22, PIO_TIMER, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM|PIN_ATTR_TIMER), No_ADC_Channel, PWM13_CH0, TC7_CH0, EXTERNAL_INT_6 },
{ PORTB, 23, PIO_TIMER, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM|PIN_ATTR_TIMER), No_ADC_Channel, PWM13_CH1, TC7_CH1, EXTERNAL_INT_7 },
{ PORTB, 0, PIO_TIMER, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM|PIN_ATTR_TIMER), No_ADC_Channel, PWM13_CH0, TC7_CH0, EXTERNAL_INT_0 },
{ PORTB, 18, PIO_TCC, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM_TCC), No_ADC_Channel, PWM1_CH0, TCC1_CH0, EXTERNAL_INT_2 },
{ PORTB, 19, PIO_TCC, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM_TCC), No_ADC_Channel, PWM1_CH1, TCC1_CH1, EXTERNAL_INT_3 },
{ PORTB, 22, PIO_TC, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM_TC), No_ADC_Channel, PWM12_CH0, TC7_CH0, EXTERNAL_INT_6 },
{ PORTB, 23, PIO_TC, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM_TC), No_ADC_Channel, PWM12_CH1, TC7_CH1, EXTERNAL_INT_7 },
{ PORTB, 0, PIO_TC, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM_TC), No_ADC_Channel, PWM12_CH0, TC7_CH0, EXTERNAL_INT_0 },
// 13 (LED)
{ PORTB, 1, PIO_TIMER, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM|PIN_ATTR_TIMER), No_ADC_Channel, PWM13_CH1, TC7_CH1, EXTERNAL_INT_1 },
{ PORTB, 1, PIO_TC, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM_TC), No_ADC_Channel, PWM12_CH1, TC7_CH1, EXTERNAL_INT_1 },
// 14..21 - Analog pins
// --------------------
@ -65,42 +65,42 @@ const PinDescription g_APinDescription[]=
// 22..29
{ NOT_A_PORT, 0, PIO_DIGITAL, (PIN_ATTR_DIGITAL), No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_NONE },
{ NOT_A_PORT, 0, PIO_DIGITAL, (PIN_ATTR_DIGITAL), No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_NONE },
{ PORTC, 17, PIO_TIMER_ALT, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM|PIN_ATTR_TIMER_ALT), No_ADC_Channel, PWM0_CH1, TCC0_CH1, EXTERNAL_INT_1 },
{ PORTC, 16, PIO_TIMER_ALT, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM|PIN_ATTR_TIMER_ALT), No_ADC_Channel, PWM0_CH0, TCC0_CH0, EXTERNAL_INT_0 },
{ PORTA, 12, PIO_TCC_PDEC, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM|PIN_ATTR_TIMER), No_ADC_Channel, PWM1_CH2, TCC1_CH2, EXTERNAL_INT_12 },
{ PORTA, 13, PIO_TCC_PDEC, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM|PIN_ATTR_TIMER), No_ADC_Channel, PWM1_CH3, TCC1_CH3, EXTERNAL_INT_14 },
{ PORTA, 14, PIO_TIMER_ALT, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM|PIN_ATTR_TIMER_ALT), No_ADC_Channel, PWM2_CH0, TCC2_CH0, EXTERNAL_INT_14 },,
{ PORTC, 17, PIO_TCC, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM_TCC), No_ADC_Channel, PWM0_CH1, TCC0_CH1, EXTERNAL_INT_1 },
{ PORTC, 16, PIO_TCC, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM_TCC), No_ADC_Channel, PWM0_CH0, TCC0_CH0, EXTERNAL_INT_0 },
{ PORTA, 12, PIO_TCC_PDEC, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM_TCC_PDEC), No_ADC_Channel, PWM1_CH2, TCC1_CH2, EXTERNAL_INT_12 },
{ PORTA, 13, PIO_TCC_PDEC, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM_TCC_PDEC), No_ADC_Channel, PWM1_CH3, TCC1_CH3, EXTERNAL_INT_14 },
{ PORTA, 14, PIO_TCC, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM_TCC), No_ADC_Channel, PWM2_CH0, TCC2_CH0, EXTERNAL_INT_14 },
{ NOT_A_PORT, 0, PIO_DIGITAL, (PIN_ATTR_DIGITAL), No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_NONE },
// 30..37
{ PORTA, 23, PIO_TIMER_ALT, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM|PIN_ATTR_TIMER_ALT), No_ADC_Channel, PWM1_CH7, TCC1_CH7, EXTERNAL_INT_7 },
{ PORTA, 22, PIO_TIMER_ALT, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM|PIN_ATTR_TIMER_ALT), No_ADC_Channel, PWM1_CH6, TCC1_CH6, EXTERNAL_INT_6 },
{ PORTA, 21, PIO_TIMER_ALT, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM|PIN_ATTR_TIMER_ALT), No_ADC_Channel, PWM1_CH5, TCC1_CH5, EXTERNAL_INT_5 },
{ PORTA, 20, PIO_TIMER_ALT, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM|PIN_ATTR_TIMER_ALT), No_ADC_Channel, PWM1_CH4, TCC1_CH4, EXTERNAL_INT_4 },
{ PORTA, 19, PIO_TIMER_ALT, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM|PIN_ATTR_TIMER_ALT), No_ADC_Channel, PWM1_CH3, TCC1_CH3, EXTERNAL_INT_3 },
{ PORTA, 18, PIO_TIMER_ALT, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM|PIN_ATTR_TIMER_ALT), No_ADC_Channel, PWM1_CH2, TCC1_CH2, EXTERNAL_INT_2 },
{ PORTA, 17, PIO_TIMER_ALT, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM|PIN_ATTR_TIMER_ALT), No_ADC_Channel, PWM1_CH1, TCC1_CH1, EXTERNAL_INT_1 },
{ PORTA, 16, PIO_TIMER_ALT, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM|PIN_ATTR_TIMER_ALT), No_ADC_Channel, PWM1_CH0, TCC1_CH0, EXTERNAL_INT_0 },
{ PORTA, 23, PIO_TCC, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM_TCC), No_ADC_Channel, PWM1_CH7, TCC1_CH7, EXTERNAL_INT_7 },
{ PORTA, 22, PIO_TCC, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM_TCC), No_ADC_Channel, PWM1_CH6, TCC1_CH6, EXTERNAL_INT_6 },
{ PORTA, 21, PIO_TCC, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM_TCC), No_ADC_Channel, PWM1_CH5, TCC1_CH5, EXTERNAL_INT_5 },
{ PORTA, 20, PIO_TCC, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM_TCC), No_ADC_Channel, PWM1_CH4, TCC1_CH4, EXTERNAL_INT_4 },
{ PORTA, 19, PIO_TCC, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM_TCC), No_ADC_Channel, PWM1_CH3, TCC1_CH3, EXTERNAL_INT_3 },
{ PORTA, 18, PIO_TCC, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM_TCC), No_ADC_Channel, PWM1_CH2, TCC1_CH2, EXTERNAL_INT_2 },
{ PORTA, 17, PIO_TCC, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM_TCC), No_ADC_Channel, PWM1_CH1, TCC1_CH1, EXTERNAL_INT_1 },
{ PORTA, 16, PIO_TCC, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM_TCC), No_ADC_Channel, PWM1_CH0, TCC1_CH0, EXTERNAL_INT_0 },
// 38..45
{ PORTB, 15, PIO_TIMER_ALT, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM|PIN_ATTR_TIMER_ALT), No_ADC_Channel, PWM4_CH1, TCC4_CH1, EXTERNAL_INT_15 },
{ PORTB, 14, PIO_TIMER_ALT, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM|PIN_ATTR_TIMER_ALT), No_ADC_Channel, PWM4_CH0, TCC4_CH0, EXTERNAL_INT_14 },
{ PORTC, 13, PIO_TIMER_ALT, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM|PIN_ATTR_TIMER_ALT), No_ADC_Channel, PWM0_CH3, TCC0_CH3, EXTERNAL_INT_13 },
{ PORTC, 12, PIO_TIMER_ALT, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM|PIN_ATTR_TIMER_ALT), No_ADC_Channel, PWM0_CH2, TCC0_CH2, EXTERNAL_INT_12 },
{ PORTC, 15, PIO_TIMER_ALT, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM|PIN_ATTR_TIMER_ALT), No_ADC_Channel, PWM0_CH5, TCC0_CH5, EXTERNAL_INT_15 },
{ PORTC, 14, PIO_TIMER_ALT, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM|PIN_ATTR_TIMER_ALT), No_ADC_Channel, PWM0_CH4, TCC0_CH6, EXTERNAL_INT_14 },
{ PORTC, 11, PIO_TIMER_ALT, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM|PIN_ATTR_TIMER_ALT), No_ADC_Channel, PWM0_CH1, TCC0_CH1, EXTERNAL_INT_11 },
{ PORTC, 10, PIO_TIMER_ALT, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM|PIN_ATTR_TIMER_ALT), No_ADC_Channel, PWM0_CH0, TCC0_CH0, EXTERNAL_INT_10 },
{ PORTB, 15, PIO_TCC, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM_TCC), No_ADC_Channel, PWM4_CH1, TCC4_CH1, EXTERNAL_INT_15 },
{ PORTB, 14, PIO_TCC, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM_TCC), No_ADC_Channel, PWM4_CH0, TCC4_CH0, EXTERNAL_INT_14 },
{ PORTC, 13, PIO_TCC, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM_TCC), No_ADC_Channel, PWM0_CH3, TCC0_CH3, EXTERNAL_INT_13 },
{ PORTC, 12, PIO_TCC, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM_TCC), No_ADC_Channel, PWM0_CH2, TCC0_CH2, EXTERNAL_INT_12 },
{ PORTC, 15, PIO_TCC, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM_TCC), No_ADC_Channel, PWM0_CH5, TCC0_CH5, EXTERNAL_INT_15 },
{ PORTC, 14, PIO_TCC, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM_TCC), No_ADC_Channel, PWM0_CH4, TCC0_CH6, EXTERNAL_INT_14 },
{ PORTC, 11, PIO_TCC, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM_TCC), No_ADC_Channel, PWM0_CH1, TCC0_CH1, EXTERNAL_INT_11 },
{ PORTC, 10, PIO_TCC, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM_TCC), No_ADC_Channel, PWM0_CH0, TCC0_CH0, EXTERNAL_INT_10 },
// 46..53
{ PORTC, 6, PIO_DIGITAL, (PIN_ATTR_DIGITAL), No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_6 },
{ PORTC, 7, PIO_DIGITAL, (PIN_ATTR_DIGITAL), No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_5 },
{ PORTC, 4, PIO_TIMER_ALT, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM|PIN_ATTR_TIMER_ALT), No_ADC_Channel, PWM0_CH0, TCC0_CH0, EXTERNAL_INT_4 },
{ PORTC, 4, PIO_TCC, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM_TCC), No_ADC_Channel, PWM0_CH0, TCC0_CH0, EXTERNAL_INT_4 },
{ PORTC, 5, PIO_DIGITAL, (PIN_ATTR_DIGITAL), No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_5 },
{ PORTD, 11, PIO_TIMER_ALT, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM|PIN_ATTR_TIMER_ALT), No_ADC_Channel, PWM0_CH4, TCC0_CH4, EXTERNAL_INT_11 }, //same as MISO
{ PORTD, 8, PIO_TIMER_ALT, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM|PIN_ATTR_TIMER_ALT), No_ADC_Channel, PWM0_CH1, TCC0_CH1, EXTERNAL_INT_8 }, //same as MOSI
{ PORTD, 9, PIO_TIMER_ALT, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM|PIN_ATTR_TIMER_ALT), No_ADC_Channel, PWM0_CH2, TCC0_CH2, EXTERNAL_INT_9 }, //same as SCK
{ PORTD, 10, PIO_TIMER_ALT, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM|PIN_ATTR_TIMER_ALT), No_ADC_Channel, PWM0_CH3, TCC0_CH3, EXTERNAL_INT_10 }, //same as SS
{ PORTD, 11, PIO_TCC, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM_TCC), No_ADC_Channel, PWM0_CH4, TCC0_CH4, EXTERNAL_INT_11 }, //same as MISO
{ PORTD, 8, PIO_TCC, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM_TCC), No_ADC_Channel, PWM0_CH1, TCC0_CH1, EXTERNAL_INT_8 }, //same as MOSI
{ PORTD, 9, PIO_TCC, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM_TCC), No_ADC_Channel, PWM0_CH2, TCC0_CH2, EXTERNAL_INT_9 }, //same as SCK
{ PORTD, 10, PIO_TCC, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM_TCC), No_ADC_Channel, PWM0_CH3, TCC0_CH3, EXTERNAL_INT_10 }, //same as SS
// 54..61 - Additional ADC
{ PORTB, 5, PIO_ANALOG, PIN_ATTR_ANALOG, ADC_Channel23, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_5 },
@ -108,48 +108,48 @@ const PinDescription g_APinDescription[]=
{ PORTB, 7, PIO_ANALOG, PIN_ATTR_ANALOG, ADC_Channel25, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_7 },
{ PORTB, 8, PIO_ANALOG, PIN_ATTR_ANALOG, ADC_Channel16, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_8 },
{ PORTB, 9, PIO_ANALOG, PIN_ATTR_ANALOG, ADC_Channel17, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_9 },
{ PORTA, 4, PIO_ANALOG, (PIN_ATTR_ANALOG|PIN_ATTR_PWM|PIN_ATTR_TIMER), ADC_Channel4, PWM5_CH0, TC0_CH0, EXTERNAL_INT_4 },
{ PORTA, 6, PIO_ANALOG, (PIN_ATTR_ANALOG|PIN_ATTR_PWM|PIN_ATTR_TIMER), ADC_Channel6, PWM6_CH0, TC1_CH0, EXTERNAL_INT_6 },
{ PORTA, 7, PIO_ANALOG, (PIN_ATTR_ANALOG|PIN_ATTR_PWM|PIN_ATTR_TIMER_ALT), ADC_Channel7, PWM6_CH1, TC1_CH1, EXTERNAL_INT_7 },
{ PORTA, 4, PIO_ANALOG, (PIN_ATTR_ANALOG|PIN_ATTR_PWM_TC), ADC_Channel4, PWM5_CH0, TC0_CH0, EXTERNAL_INT_4 },
{ PORTA, 6, PIO_ANALOG, (PIN_ATTR_ANALOG|PIN_ATTR_PWM_TC), ADC_Channel6, PWM6_CH0, TC1_CH0, EXTERNAL_INT_6 },
{ PORTA, 7, PIO_ANALOG, (PIN_ATTR_ANALOG|PIN_ATTR_PWM_TC), ADC_Channel7, PWM6_CH1, TC1_CH1, EXTERNAL_INT_7 },
// 62..63 - I2C pins (SDA/SCL)
// ----------------------
{ PORTB, 20, PIO_SERCOM_FAKE, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_FAKE }, //sda
{ PORTB, 21, PIO_SERCOM_FAKE, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_FAKE }, //scl
{ PORTB, 20, PIO_SERCOM, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM_TCC), No_ADC_Channel, PWM1_CH2, TCC1_CH2, EXTERNAL_INT_4 }, //sda
{ PORTB, 21, PIO_SERCOM, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM_TCC), No_ADC_Channel, PWM1_CH3, TCC1_CH3, EXTERNAL_INT_5 }, //scl
// 64..66 - SPI pins (ICSP:MISO,SCK,MOSI)
// ----------------------
{ PORTD, 11, PIO_DIGITAL, (PIN_ATTR_DIGITAL), No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_FAKE },
{ PORTD, 8, PIO_DIGITAL, (PIN_ATTR_DIGITAL), No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_FAKE },
{ PORTD, 9, PIO_DIGITAL, (PIN_ATTR_DIGITAL), No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_FAKE },
{ PORTD, 11, PIO_SERCOM, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM_TCC), No_ADC_Channel, PWM0_CH4, TCC0_CH4, EXTERNAL_INT_6 },
{ PORTD, 8, PIO_SERCOM, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM_TCC), No_ADC_Channel, PWM0_CH1, TCC0_CH1, EXTERNAL_INT_3 },
{ PORTD, 9, PIO_SERCOM, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM_TCC), No_ADC_Channel, PWM0_CH2, TCC0_CH2, EXTERNAL_INT_4 },
//67..74 - UARTS
{ PORTB, 16, PIO_SERCOM_FAKE, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_FAKE },
{ PORTB, 17, PIO_SERCOM_FAKE, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_FAKE },
{ PORTC, 22, PIO_SERCOM_FAKE, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_FAKE },
{ PORTC, 23, PIO_SERCOM_FAKE, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_FAKE },
{ PORTB, 12, PIO_SERCOM_FAKE, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_FAKE },
{ PORTB, 13, PIO_SERCOM_FAKE, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_FAKE },
{ PORTB, 20, PIO_SERCOM_FAKE, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_FAKE }, //same as sda
{ PORTB, 21, PIO_SERCOM_FAKE, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_FAKE }, //same as scl
{ PORTB, 16, PIO_SERCOM, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM_TCC), No_ADC_Channel, PWM3_CH0, TCC3_CH0, EXTERNAL_INT_0 },
{ PORTB, 17, PIO_SERCOM, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM_TCC), No_ADC_Channel, PWM3_CH1, TCC3_CH1, EXTERNAL_INT_1 },
{ PORTC, 22, PIO_SERCOM, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM_TCC), No_ADC_Channel, PWM0_CH6, TCC0_CH6, EXTERNAL_INT_6 },
{ PORTC, 23, PIO_SERCOM, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM_TCC), No_ADC_Channel, PWM0_CH7, TCC0_CH7, EXTERNAL_INT_6 },
{ PORTB, 12, PIO_SERCOM, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM_TC), No_ADC_Channel, PWM9_CH0, TC4_CH0, EXTERNAL_INT_12 },
{ PORTB, 13, PIO_SERCOM, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM_TC), No_ADC_Channel, PWM9_CH1, TC4_CH1, EXTERNAL_INT_13 },
{ PORTB, 20, PIO_SERCOM, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM_TCC), No_ADC_Channel, PWM1_CH2, TCC1_CH2, EXTERNAL_INT_4 }, //same as sda
{ PORTB, 21, PIO_SERCOM, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM_TCC), No_ADC_Channel, PWM1_CH3, TCC1_CH3, EXTERNAL_INT_5 }, //same as scl
// 75..76 - RX/TX LEDS
// --------------------
{ PORTC, 31, PIO_OUTPUT, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_FAKE }, // used as output only
{ PORTC, 30, PIO_OUTPUT, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_FAKE }, // used as output only
{ PORTC, 31, PIO_OUTPUT, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_NONE }, // used as output only
{ PORTC, 30, PIO_OUTPUT, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_NONE }, // used as output only
// 77..79 - USB
// --------------------
{ PORTA, 27, PIO_COM, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_FAKE }, // USB Host enable
{ PORTA, 27, PIO_COM, PIN_ATTR_DIGITAL, 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_8 }, // USB/DM
{ PORTA, 25, PIO_COM, PIN_ATTR_NONE, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_9 }, // USB/DP
// 80..83 - SD SPI pins (SD:MISO,SCK,MOSI,CS)
// ----------------------
{ PORTB, 29, PIO_SERCOM_FAKE, PIO_SERCOM, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_FAKE },
{ PORTB, 27, PIO_SERCOM_FAKE, PIO_SERCOM, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_FAKE },
{ PORTB, 26, PIO_SERCOM_FAKE, PIO_SERCOM, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_FAKE },
{ PORTB, 28, PIO_SERCOM_FAKE, PIO_SERCOM, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_FAKE },
{ PORTB, 29, PIO_SERCOM, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_NONE },
{ PORTB, 27, PIO_SERCOM, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_NONE },
{ PORTB, 26, PIO_SERCOM, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_NONE },
{ PORTB, 28, PIO_SERCOM, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_NONE },
// 84 (AREF)
{ PORTA, 3, PIO_ANALOG, PIN_ATTR_ANALOG, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_3 }, // DAC/VREFP
@ -160,10 +160,10 @@ const PinDescription g_APinDescription[]=
{ PORTA, 5, PIO_ANALOG, PIN_ATTR_ANALOG, DAC_Channel1, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_5 }, // DAC/VOUT[1]
// 87 - LED #13 duplicate placeholder
{ PORTB, 1, PIO_TCC_PDEC, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM|PIN_ATTR_TIMER), No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_FAKE },
{ PORTB, 1, PIO_TC, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM_TC), No_ADC_Channel, PWM12_CH1, TC7_CH1, EXTERNAL_INT_1 },
// 88 - Internal NeoPixel
{ PORTC, 24, PIO_DIGITAL, (PIN_ATTR_DIGITAL), No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_FAKE }, // used as output only
{ PORTC, 24, PIO_DIGITAL, (PIN_ATTR_DIGITAL), No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_NONE }, // used as output only
// ----------------------
// 89 - 94 QSPI (SCK, CS, IO0, IO1, IO2, IO3)