Initial commit

This commit is contained in:
2026-03-29 14:47:13 +02:00
commit b49984b9c0
32 changed files with 2394 additions and 0 deletions
+100
View File
@@ -0,0 +1,100 @@
// VersaPad v2 SAMD21G18A Custom Variant
// Pin descriptions and peripheral object definitions
#include "variant.h"
#include "Arduino.h"
// ─── g_APinDescription ────────────────────────────────────────────────────────
// Maps Arduino pin D0D25 to SAMD21 port/pin pairs.
//
// Format:
// { PORT, PIN, PinType, PinAttr, ADC_Channel, PWM_Channel, TC_Channel, ExtInt }
//
// ─────────────────────────────────────────────────────────────────────────────
const PinDescription g_APinDescription[] = {
// ── Button Matrix: Columns (D0D4) ────────────────────────────────────────
// 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 (D5D9) ───────────────────────────────────────────
// 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 (D10D17) ─────────────────────────────────────────────
// 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 (D18D20) ───────────────────────────────────────
// 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 (D23D25 = 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.
}