101 lines
6.5 KiB
C++
101 lines
6.5 KiB
C++
// VersaPad v2 – SAMD21G18A Custom Variant
|
||
// Pin descriptions and peripheral object definitions
|
||
|
||
#include "variant.h"
|
||
#include "Arduino.h"
|
||
|
||
// ─── g_APinDescription ────────────────────────────────────────────────────────
|
||
// Maps Arduino pin D0–D25 to SAMD21 port/pin pairs.
|
||
//
|
||
// Format:
|
||
// { PORT, PIN, PinType, PinAttr, ADC_Channel, PWM_Channel, TC_Channel, ExtInt }
|
||
//
|
||
// ─────────────────────────────────────────────────────────────────────────────
|
||
|
||
const PinDescription g_APinDescription[] = {
|
||
|
||
// ── Button Matrix: Columns (D0–D4) ────────────────────────────────────────
|
||
// Driven LOW one at a time during scanning; idle = INPUT_PULLUP or OUTPUT HIGH
|
||
|
||
// D0 – PA08 – COL_4
|
||
{ PORTA, 8, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_NMI },
|
||
// D1 – PA09 – COL_3
|
||
{ PORTA, 9, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_9 },
|
||
// D2 – PA10 – COL_2
|
||
{ PORTA, 10, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_10 },
|
||
// D3 – PA11 – COL_1
|
||
{ PORTA, 11, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_11 },
|
||
// D4 – PB10 – COL_0 (also: encoder SW column)
|
||
{ PORTB, 10, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_10 },
|
||
|
||
// ── Button Matrix: Rows (D5–D9) ───────────────────────────────────────────
|
||
// Read as INPUT_PULLUP; go LOW when a button in the active column is pressed
|
||
|
||
// D5 – PB11 – ROW_0
|
||
{ PORTB, 11, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_11 },
|
||
// D6 – PA12 – ROW_1
|
||
{ PORTA, 12, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_12 },
|
||
// D7 – PA13 – ROW_2
|
||
{ PORTA, 13, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_13 },
|
||
// D8 – PA14 – ROW_3
|
||
{ PORTA, 14, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_14 },
|
||
// D9 – PA15 – ROW_4
|
||
{ PORTA, 15, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_15 },
|
||
|
||
// ── Rotary Encoders (D10–D17) ─────────────────────────────────────────────
|
||
// All wired to EIC (External Interrupt Controller) via PMUX A.
|
||
// Quadrature decoding done in ISRs.
|
||
|
||
// D10 – PA16 – ENC3_A EIC EXTINT[0]
|
||
{ PORTA, 16, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_0 },
|
||
// D11 – PA17 – ENC3_B EIC EXTINT[1]
|
||
{ PORTA, 17, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_1 },
|
||
// D12 – PA18 – ENC2_A EIC EXTINT[2]
|
||
{ PORTA, 18, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_2 },
|
||
// D13 – PA19 – ENC2_B EIC EXTINT[3]
|
||
{ PORTA, 19, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_3 },
|
||
// D14 – PA20 – ENC1_A EIC EXTINT[4]
|
||
{ PORTA, 20, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_4 },
|
||
// D15 – PA21 – ENC1_B EIC EXTINT[5]
|
||
{ PORTA, 21, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_5 },
|
||
// D16 – PA22 – ENC0_A EIC EXTINT[6]
|
||
{ PORTA, 22, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_6 },
|
||
// D17 – PA23 – ENC0_B EIC EXTINT[7]
|
||
{ PORTA, 23, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_7 },
|
||
|
||
// ── WS2812 SPI – SERCOM5 (D18–D20) ───────────────────────────────────────
|
||
// PB22/PB23 use peripheral function D → PIO_SERCOM_ALT
|
||
// PB03 uses peripheral function D → PIO_SERCOM_ALT
|
||
|
||
// D18 – PB22 – SPI MOSI / WS2812 data (SERCOM5 PAD[2])
|
||
{ PORTB, 22, PIO_SERCOM_ALT, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_NONE },
|
||
// D19 – PB23 – SPI SCK (SERCOM5 PAD[3])
|
||
{ PORTB, 23, PIO_SERCOM_ALT, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_NONE },
|
||
// D20 – PB03 – SPI MISO (unused) (SERCOM5 PAD[1])
|
||
{ PORTB, 3, PIO_SERCOM_ALT, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_NONE },
|
||
|
||
// ── USB D– / D+ (D21–D22) ────────────────────────────────────────────────
|
||
// D21 – PA24 – USB D–
|
||
{ PORTA, 24, PIO_COM, PIN_ATTR_NONE, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_NONE },
|
||
// D22 – PA25 – USB D+
|
||
{ PORTA, 25, PIO_COM, PIN_ATTR_NONE, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_NONE },
|
||
|
||
// ── Faders / ADC (D23–D25 = A0–A2) ──────────────────────────────────────
|
||
// D23/A0 – PA02 – FADER_0 ADC AIN[0]
|
||
{ PORTA, 2, PIO_ANALOG, PIN_ATTR_ANALOG, ADC_Channel0, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_NONE },
|
||
// D24/A1 – PA03 – FADER_1 ADC AIN[1] (also VREFA – do not use as digital)
|
||
{ PORTA, 3, PIO_ANALOG, PIN_ATTR_ANALOG, ADC_Channel1, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_NONE },
|
||
// D25/A2 – PB08 – FADER_2 ADC AIN[2]
|
||
{ PORTB, 8, PIO_ANALOG, PIN_ATTR_ANALOG, ADC_Channel2, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_NMI },
|
||
};
|
||
|
||
extern "C" {
|
||
unsigned int PINCOUNT_fn() { return PINS_COUNT; }
|
||
}
|
||
|
||
// ─── USB ──────────────────────────────────────────────────────────────────────
|
||
void initVariant() {
|
||
// Nothing board-specific needed at startup.
|
||
// USB is handled by the Arduino SAMD core.
|
||
}
|