// 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. }