diff --git a/atmel-samd/common-hal/microcontroller/types.h b/atmel-samd/common-hal/microcontroller/types.h index 48ef7346b1..b76700c930 100644 --- a/atmel-samd/common-hal/microcontroller/types.h +++ b/atmel-samd/common-hal/microcontroller/types.h @@ -40,30 +40,30 @@ #include "py/obj.h" typedef struct { - Sercom *const sercom; - uint8_t pad; - uint32_t pinmux; + Sercom *const sercom; + uint8_t pad; } pin_sercom_t; typedef struct { - Tc *const tc; - Tcc *const tcc; - uint8_t channel; - uint8_t wave_output; - uint32_t pin; - uint32_t mux; + union { + Tc *const tc; + Tcc *const tcc; + }; + bool is_tc:1; + uint8_t channel:3; + uint8_t wave_output:4; } pin_timer_t; #define NUM_SERCOMS_PER_PIN 2 typedef struct { mp_obj_base_t base; qstr name; - uint32_t pin; - bool has_adc; - enum adc_positive_input adc_input; - pin_timer_t primary_timer; - pin_timer_t secondary_timer; - pin_sercom_t sercom[NUM_SERCOMS_PER_PIN]; + uint8_t pin; + bool has_adc:1; + enum adc_positive_input adc_input:7; + pin_timer_t primary_timer; // Mux E + pin_timer_t secondary_timer; // Mux F + pin_sercom_t sercom[NUM_SERCOMS_PER_PIN]; // Mux C and D } mcu_pin_obj_t; #endif // __MICROPY_INCLUDED_ATMEL_SAMD_COMMON_HAL_MICROCONTROLLER_TYPES_H__ diff --git a/atmel-samd/common-hal/nativeio/I2C.c b/atmel-samd/common-hal/nativeio/I2C.c index 9eb2361fb8..d8cca6a683 100644 --- a/atmel-samd/common-hal/nativeio/I2C.c +++ b/atmel-samd/common-hal/nativeio/I2C.c @@ -31,6 +31,7 @@ #include "py/nlr.h" #include "asf/sam0/drivers/sercom/i2c/i2c_master.h" +#include "samd21_pins.h" // We use ENABLE registers below we don't want to treat as a macro. #undef ENABLE @@ -54,11 +55,11 @@ void common_hal_nativeio_i2c_construct(nativeio_i2c_obj_t *self, sda->sercom[i].pad != 0) { continue; } - sda_pinmux = sda->sercom[i].pinmux; + sda_pinmux = PINMUX(sda->pin, (i == 0) ? MUX_C : MUX_D); for (int j = 0; j < NUM_SERCOMS_PER_PIN; j++) { if (potential_sercom == scl->sercom[j].sercom && scl->sercom[j].pad == 1) { - scl_pinmux = scl->sercom[j].pinmux; + scl_pinmux = PINMUX(scl->pin, (j == 0) ? MUX_C : MUX_D); sercom = potential_sercom; break; } diff --git a/atmel-samd/common-hal/nativeio/PWMOut.c b/atmel-samd/common-hal/nativeio/PWMOut.c index a444ba864e..4a21201f9d 100644 --- a/atmel-samd/common-hal/nativeio/PWMOut.c +++ b/atmel-samd/common-hal/nativeio/PWMOut.c @@ -29,35 +29,20 @@ #include "py/runtime.h" #include "shared-bindings/nativeio/PWMOut.h" +#include "samd21_pins.h" + void common_hal_nativeio_pwmout_construct(nativeio_pwmout_obj_t* self, const mcu_pin_obj_t* pin, uint16_t duty) { self->pin = pin; self->using_primary_timer = true; - if (pin->primary_timer.tc == 0 && pin->primary_timer.tcc == 0 && - pin->secondary_timer.tc == 0 && pin->secondary_timer.tcc == 0) { + if (pin->primary_timer.tc == 0 && pin->secondary_timer.tc == 0) { nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_ValueError, "PWM not supported on pin %q", self->pin->name)); } // TODO(tannewt): Support output on multiple timer channels at once. const pin_timer_t* t = &pin->primary_timer; - if (t->tcc != 0) { - struct tcc_config config_tcc; - tcc_get_config_defaults(&config_tcc, t->tcc); - - config_tcc.counter.clock_prescaler = TCC_CLOCK_PRESCALER_DIV256; - config_tcc.counter.period = 0xFF; - config_tcc.compare.wave_generation = TCC_WAVE_GENERATION_SINGLE_SLOPE_PWM; - config_tcc.compare.match[t->channel] = duty; - - config_tcc.pins.enable_wave_out_pin[t->wave_output] = true; - config_tcc.pins.wave_out_pin[t->wave_output] = t->pin; - config_tcc.pins.wave_out_pin_mux[t->wave_output] = t->mux; - - tcc_init(&self->tcc_instance, t->tcc, &config_tcc); - - tcc_enable(&self->tcc_instance); - } else { + if (t->is_tc) { struct tc_config config_tc; tc_get_config_defaults(&config_tc); @@ -68,12 +53,28 @@ void common_hal_nativeio_pwmout_construct(nativeio_pwmout_obj_t* self, const mcu config_tc.counter_8_bit.compare_capture_channel[t->channel] = duty; config_tc.pwm_channel[t->wave_output].enabled = true; - config_tc.pwm_channel[t->wave_output].pin_out = t->pin; - config_tc.pwm_channel[t->wave_output].pin_mux = t->mux; + config_tc.pwm_channel[t->wave_output].pin_out = pin->pin; + config_tc.pwm_channel[t->wave_output].pin_mux = MUX_E; tc_init(&self->tc_instance, t->tc, &config_tc); tc_enable(&self->tc_instance); + } else { + struct tcc_config config_tcc; + tcc_get_config_defaults(&config_tcc, t->tcc); + + config_tcc.counter.clock_prescaler = TCC_CLOCK_PRESCALER_DIV256; + config_tcc.counter.period = 0xFF; + config_tcc.compare.wave_generation = TCC_WAVE_GENERATION_SINGLE_SLOPE_PWM; + config_tcc.compare.match[t->channel] = duty; + + config_tcc.pins.enable_wave_out_pin[t->wave_output] = true; + config_tcc.pins.wave_out_pin[t->wave_output] = pin->pin; + config_tcc.pins.wave_out_pin_mux[t->wave_output] = MUX_E; + + tcc_init(&self->tcc_instance, t->tcc, &config_tcc); + + tcc_enable(&self->tcc_instance); } } @@ -82,10 +83,10 @@ extern void common_hal_nativeio_pwmout_deinit(nativeio_pwmout_obj_t* self) { if (!self->using_primary_timer) { t = &self->pin->secondary_timer; } - if (t->tcc != 0) { - tcc_disable(&self->tcc_instance); - } else { + if (t->is_tc) { tc_disable(&self->tc_instance); + } else { + tcc_disable(&self->tcc_instance); } } diff --git a/atmel-samd/common-hal/nativeio/SPI.c b/atmel-samd/common-hal/nativeio/SPI.c index 8216524751..1c782b36d8 100644 --- a/atmel-samd/common-hal/nativeio/SPI.c +++ b/atmel-samd/common-hal/nativeio/SPI.c @@ -29,6 +29,7 @@ #include "shared-bindings/nativeio/SPI.h" #include "py/nlr.h" +#include "samd21_pins.h" // We use ENABLE registers below we don't want to treat as a macro. #undef ENABLE @@ -57,12 +58,12 @@ void common_hal_nativeio_spi_construct(nativeio_spi_obj_t *self, potential_sercom->SPI.CTRLA.bit.ENABLE != 0) { continue; } - clock_pinmux = clock->sercom[i].pinmux; + clock_pinmux = PINMUX(clock->pin, (i == 0) ? MUX_C : MUX_D); clock_pad = clock->sercom[i].pad; for (int j = 0; j < NUM_SERCOMS_PER_PIN; j++) { if (!mosi_none) { if(potential_sercom == mosi->sercom[j].sercom) { - mosi_pinmux = mosi->sercom[j].pinmux; + mosi_pinmux = PINMUX(mosi->pin, (j == 0) ? MUX_C : MUX_D); mosi_pad = mosi->sercom[j].pad; if (miso_none) { sercom = potential_sercom; @@ -74,7 +75,7 @@ void common_hal_nativeio_spi_construct(nativeio_spi_obj_t *self, if (!miso_none) { for (int k = 0; k < NUM_SERCOMS_PER_PIN; k++) { if (potential_sercom == miso->sercom[k].sercom) { - miso_pinmux = miso->sercom[k].pinmux; + miso_pinmux = PINMUX(miso->pin, (k == 0) ? MUX_C : MUX_D); miso_pad = miso->sercom[k].pad; sercom = potential_sercom; break; diff --git a/atmel-samd/samd21_pins.c b/atmel-samd/samd21_pins.c index bf393b4875..83989780e1 100644 --- a/atmel-samd/samd21_pins.c +++ b/atmel-samd/samd21_pins.c @@ -2,26 +2,31 @@ #include "samd21_pins.h" -#define SERCOM(p_sercom, p_pad, p_pinmux) \ +#define SERCOM(p_sercom, p_pad) \ { \ .sercom = p_sercom, \ - .pad = p_pad, \ - .pinmux = p_pinmux \ + .pad = p_pad \ } -#define NO_SERCOM SERCOM(0, 0, 0) +#define NO_SERCOM SERCOM(0, 0) -#define TIMER(p_tc, p_tcc, p_channel, p_wave_output, p_pin, p_mux) \ +#define TCC(p_tcc, p_channel, p_wave_output) \ +{ \ + .tcc = p_tcc, \ + .is_tc = false, \ + .channel = p_channel, \ + .wave_output = p_wave_output \ +} + +#define TC(p_tc, p_channel, p_wave_output) \ { \ .tc = p_tc, \ - .tcc = p_tcc, \ + .is_tc = true, \ .channel = p_channel, \ - .wave_output = p_wave_output, \ - .pin = p_pin, \ - .mux = p_mux \ + .wave_output = p_wave_output \ } -#define NO_TIMER TIMER(0, 0, 0, 0, 0, 0) +#define NO_TIMER TCC(0, 0, 0) // This macro is used to simplify pin definition in boards//pins.c #define PIN(p_name, p_has_adc, p_adc_input, p_primary_timer, \ @@ -42,16 +47,16 @@ const mcu_pin_obj_t pin_## p_name = { \ // Pins in datasheet order. #ifdef PIN_PA00 PIN(PA00, false, NO_ADC_INPUT, \ - TIMER(0, TCC2, 0, 0, PIN_PA00E_TCC2_WO0, MUX_PA00E_TCC2_WO0), + TCC(TCC2, 0, 0), NO_TIMER, - SERCOM(SERCOM1, 0, PINMUX_PA00D_SERCOM1_PAD0), + SERCOM(SERCOM1, 0), NO_SERCOM); #endif #ifdef PIN_PA01 PIN(PA01, false, NO_ADC_INPUT, - TIMER(0, TCC2, 1, 1, PIN_PA01E_TCC2_WO1, MUX_PA01E_TCC2_WO1), + TCC(TCC2, 1, 1), NO_TIMER, - SERCOM(SERCOM1, 1, PINMUX_PA01D_SERCOM1_PAD1), + SERCOM(SERCOM1, 1), NO_SERCOM); #endif #ifdef PIN_PA02 @@ -98,139 +103,139 @@ PIN(PB07, true, ADC_POSITIVE_INPUT_PIN15, #endif #ifdef PIN_PB08 PIN(PB08, true, ADC_POSITIVE_INPUT_PIN2, - TIMER(TC4, 0, 0, 0, PIN_PB08E_TC4_WO0, MUX_PB08E_TC4_WO0), + TC(TC4, 0, 0), NO_TIMER, NO_SERCOM, - SERCOM(SERCOM4, 0, PINMUX_PB08D_SERCOM4_PAD0)); + SERCOM(SERCOM4, 0)); #endif #ifdef PIN_PB09 PIN(PB09, true, ADC_POSITIVE_INPUT_PIN3, - TIMER(TC4, 0, 1, 1, PIN_PB09E_TC4_WO1, MUX_PB09E_TC4_WO1), + TC(TC4, 1, 1), NO_TIMER, NO_SERCOM, - SERCOM(SERCOM4, 1, PINMUX_PB09D_SERCOM4_PAD1)); + SERCOM(SERCOM4, 1)); #endif #ifdef PIN_PA04 PIN(PA04, true, ADC_POSITIVE_INPUT_PIN4, - TIMER(0, TCC0, 0, 0, PIN_PA04E_TCC0_WO0, MUX_PA04E_TCC0_WO0), + TCC(TCC0, 0, 0), NO_TIMER, NO_SERCOM, - SERCOM(SERCOM0, 0, PINMUX_PA04D_SERCOM0_PAD0)); + SERCOM(SERCOM0, 0)); #endif #ifdef PIN_PA05 PIN(PA05, true, ADC_POSITIVE_INPUT_PIN5, - TIMER(0, TCC0, 1, 1, PIN_PA05E_TCC0_WO1, MUX_PA05E_TCC0_WO1), + TCC(TCC0, 1, 1), NO_TIMER, NO_SERCOM, - SERCOM(SERCOM0, 1, PINMUX_PA05D_SERCOM0_PAD1)); + SERCOM(SERCOM0, 1)); #endif #ifdef PIN_PA06 PIN(PA06, true, ADC_POSITIVE_INPUT_PIN6, - TIMER(0, TCC1, 0, 0, PIN_PA06E_TCC1_WO0, MUX_PA06E_TCC1_WO0), + TCC(TCC1, 0, 0), NO_TIMER, - SERCOM(SERCOM0, 2, PINMUX_PA06D_SERCOM0_PAD2), + SERCOM(SERCOM0, 2), NO_SERCOM); #endif #ifdef PIN_PA07 PIN(PA07, true, ADC_POSITIVE_INPUT_PIN7, - TIMER(0, TCC1, 1, 1, PIN_PA07E_TCC1_WO1, MUX_PA07E_TCC1_WO1), + TCC(TCC1, 1, 1), NO_TIMER, - SERCOM(SERCOM0, 3, PINMUX_PA07D_SERCOM0_PAD3), + SERCOM(SERCOM0, 3), NO_SERCOM); #endif #ifdef PIN_PA08 PIN(PA08, true, ADC_POSITIVE_INPUT_PIN17, - TIMER(0, TCC0, 0, 0, PIN_PA08E_TCC0_WO0, MUX_PA08E_TCC0_WO0), - TIMER(0, TCC1, 2, 2, PIN_PA08F_TCC1_WO2, MUX_PA08F_TCC1_WO2), - SERCOM(SERCOM0, 0, PINMUX_PA08C_SERCOM0_PAD0), - SERCOM(SERCOM2, 0, PINMUX_PA08D_SERCOM2_PAD0)); + TCC(TCC0, 0, 0), + TCC(TCC1, 2, 2), + SERCOM(SERCOM0, 0), + SERCOM(SERCOM2, 0)); #endif #ifdef PIN_PA09 PIN(PA09, true, ADC_POSITIVE_INPUT_PIN17, - TIMER(0, TCC0, 1, 1, PIN_PA09E_TCC0_WO1, MUX_PA09E_TCC0_WO1), - TIMER(0, TCC1, 3, 3, PIN_PA09F_TCC1_WO3, MUX_PA09F_TCC1_WO3), - SERCOM(SERCOM0, 1, PINMUX_PA09C_SERCOM0_PAD1), - SERCOM(SERCOM2, 1, PINMUX_PA09D_SERCOM2_PAD1)); + TCC(TCC0, 1, 1), + TCC(TCC1, 3, 3), + SERCOM(SERCOM0, 1), + SERCOM(SERCOM2, 1)); #endif #ifdef PIN_PA10 PIN(PA10, true, ADC_POSITIVE_INPUT_PIN18, - TIMER(0, TCC1, 0, 0, PIN_PA10E_TCC1_WO0, MUX_PA10E_TCC1_WO0), - TIMER(0, TCC0, 2, 2, PIN_PA10F_TCC0_WO2, MUX_PA10F_TCC0_WO2), - SERCOM(SERCOM0, 2, PINMUX_PA10C_SERCOM0_PAD2), - SERCOM(SERCOM2, 2, PINMUX_PA10D_SERCOM2_PAD2)); + TCC(TCC1, 0, 0), + TCC(TCC0, 2, 2), + SERCOM(SERCOM0, 2), + SERCOM(SERCOM2, 2)); #endif #ifdef PIN_PA11 PIN(PA11, true, ADC_POSITIVE_INPUT_PIN19, - TIMER(0, TCC1, 1, 1, PIN_PA11E_TCC1_WO1, MUX_PA11E_TCC1_WO1), - TIMER(0, TCC0, 3, 3, PIN_PA11F_TCC0_WO3, MUX_PA11F_TCC0_WO3), - SERCOM(SERCOM0, 3, PINMUX_PA11C_SERCOM0_PAD3), - SERCOM(SERCOM2, 3, PINMUX_PA11D_SERCOM2_PAD3)); + TCC(TCC1, 1, 1), + TCC(TCC0, 3, 3), + SERCOM(SERCOM0, 3), + SERCOM(SERCOM2, 3)); #endif #ifdef PIN_PB10 PIN(PB10, false, NO_ADC_INPUT, - TIMER(TC5, 0, 0, 0, PIN_PB10E_TC5_WO0, MUX_PB10E_TC5_WO0), - TIMER(0, TCC0, 0, 4, PIN_PB10F_TCC0_WO4, MUX_PB10F_TCC0_WO4), + TC(TC5, 0, 0), + TCC(TCC0, 0, 4), NO_SERCOM, - SERCOM(SERCOM4, 2, PINMUX_PB10D_SERCOM4_PAD2)); + SERCOM(SERCOM4, 2)); #endif #ifdef PIN_PB11 PIN(PB11, false, NO_ADC_INPUT, - TIMER(TC5, 0, 1, 1, PIN_PB11E_TC5_WO1, MUX_PB11E_TC5_WO1), - TIMER(0, TCC0, 1, 5, PIN_PB11F_TCC0_WO5, MUX_PB11F_TCC0_WO5), + TC(TC5, 1, 1), + TCC(TCC0, 1, 5), NO_SERCOM, - SERCOM(SERCOM4, 3, PINMUX_PB11D_SERCOM4_PAD3)); + SERCOM(SERCOM4, 3)); #endif #ifdef PIN_PB12 PIN(PB12, false, NO_ADC_INPUT, - TIMER(TC4, 0, 0, 0, PIN_PB12E_TC4_WO0, MUX_PB12E_TC4_WO0), - TIMER(0, TCC0, 2, 6, PIN_PB12F_TCC0_WO6, MUX_PB12F_TCC0_WO6), - SERCOM(SERCOM4, 0, PINMUX_PB12C_SERCOM4_PAD0), + TC(TC4, 0, 0), + TCC(TCC0, 2, 6), + SERCOM(SERCOM4, 0), NO_SERCOM); #endif #ifdef PIN_PB13 PIN(PB13, false, NO_ADC_INPUT, - TIMER(TC4, 0, 1, 1, PIN_PB13E_TC4_WO1, MUX_PB13E_TC4_WO1), - TIMER(0, TCC0, 3, 7, PIN_PB13F_TCC0_WO7, MUX_PB13F_TCC0_WO7), - SERCOM(SERCOM4, 1, PINMUX_PB13C_SERCOM4_PAD1), + TC(TC4, 1, 1), + TCC(TCC0, 3, 7), + SERCOM(SERCOM4, 1), NO_SERCOM); #endif #ifdef PIN_PB14 PIN(PB14, false, NO_ADC_INPUT, - TIMER(TC5, 0, 0, 0, PIN_PB14E_TC5_WO0, MUX_PB14E_TC5_WO0), + TC(TC5, 0, 0), NO_TIMER, - SERCOM(SERCOM4, 2, PINMUX_PB14C_SERCOM4_PAD2), + SERCOM(SERCOM4, 2), NO_SERCOM); #endif // Second page. #ifdef PIN_PB15 PIN(PB15, false, NO_ADC_INPUT, - TIMER(TC5, 0, 1, 1, PIN_PB15E_TC5_WO1, MUX_PB15E_TC5_WO1), + TC(TC5, 1, 1), NO_TIMER, - SERCOM(SERCOM4, 3, PINMUX_PB15C_SERCOM4_PAD3), + SERCOM(SERCOM4, 3), NO_SERCOM); #endif #ifdef PIN_PA12 PIN(PA12, false, NO_ADC_INPUT, - TIMER(0, TCC2, 0, 0, PIN_PA12E_TCC2_WO0, MUX_PA12E_TCC2_WO0), - TIMER(0, TCC0, 2, 6, PIN_PA12F_TCC0_WO6, MUX_PA12F_TCC0_WO6), - SERCOM(SERCOM2, 0, PINMUX_PA12C_SERCOM2_PAD0), - SERCOM(SERCOM4, 0, PINMUX_PA12D_SERCOM4_PAD0)); + TCC(TCC2, 0, 0), + TCC(TCC0, 2, 6), + SERCOM(SERCOM2, 0), + SERCOM(SERCOM4, 0)); #endif #ifdef PIN_PA13 PIN(PA13, false, NO_ADC_INPUT, - TIMER(0, TCC2, 1, 1, PIN_PA13E_TCC2_WO1, MUX_PA13E_TCC2_WO1), - TIMER(0, TCC0, 3, 7, PIN_PA13F_TCC0_WO7, MUX_PA13F_TCC0_WO7), - SERCOM(SERCOM2, 1, PINMUX_PA13C_SERCOM2_PAD1), - SERCOM(SERCOM4, 1, PINMUX_PA13D_SERCOM4_PAD1)); + TCC(TCC2, 1, 1), + TCC(TCC0, 3, 7), + SERCOM(SERCOM2, 1), + SERCOM(SERCOM4, 1)); #endif #ifdef PIN_PA14 PIN(PA14, false, NO_ADC_INPUT, - TIMER(TC3, 0, 0, 0, PIN_PA14E_TC3_WO0, MUX_PA14E_TC3_WO0), - TIMER(0, TCC0, 0, 4, PIN_PA14F_TCC0_WO4, MUX_PA14F_TCC0_WO4), - SERCOM(SERCOM2, 2, PINMUX_PA14C_SERCOM2_PAD2), + TC(TC3, 0, 0), + TCC(TCC0, 0, 4), + SERCOM(SERCOM2, 2), #ifdef SERCOM4 - SERCOM(SERCOM4, 2, PINMUX_PA14D_SERCOM4_PAD2) + SERCOM(SERCOM4, 2) #else NO_SERCOM #endif @@ -238,11 +243,11 @@ PIN(PA14, false, NO_ADC_INPUT, #endif #ifdef PIN_PA15 PIN(PA15, false, NO_ADC_INPUT, - TIMER(TC3, 0, 1, 1, PIN_PA15E_TC3_WO1, MUX_PA15E_TC3_WO1), - TIMER(0, TCC0, 1, 5, PIN_PA15F_TCC0_WO5, MUX_PA15F_TCC0_WO5), - SERCOM(SERCOM2, 3, PINMUX_PA15C_SERCOM2_PAD3), + TC(TC3, 1, 1), + TCC(TCC0, 1, 5), + SERCOM(SERCOM2, 3), #ifdef SERCOM4 - SERCOM(SERCOM4, 3, PINMUX_PA15D_SERCOM4_PAD3) + SERCOM(SERCOM4, 3) #else NO_SERCOM #endif @@ -250,83 +255,83 @@ PIN(PA15, false, NO_ADC_INPUT, #endif #ifdef PIN_PA16 PIN(PA16, false, NO_ADC_INPUT, - TIMER(0, TCC2, 0, 0, PIN_PA16E_TCC2_WO0, MUX_PA16E_TCC2_WO0), - TIMER(0, TCC0, 2, 6, PIN_PA16F_TCC0_WO6, MUX_PA16F_TCC0_WO6), - SERCOM(SERCOM1, 0, PINMUX_PA16C_SERCOM1_PAD0), - SERCOM(SERCOM3, 0, PINMUX_PA16D_SERCOM3_PAD0)); + TCC(TCC2, 0, 0), + TCC(TCC0, 2, 6), + SERCOM(SERCOM1, 0), + SERCOM(SERCOM3, 0)); #endif #ifdef PIN_PA17 PIN(PA17, false, NO_ADC_INPUT, - TIMER(0, TCC2, 1, 1, PIN_PA17E_TCC2_WO1, MUX_PA17E_TCC2_WO1), - TIMER(0, TCC0, 3, 7, PIN_PA17F_TCC0_WO7, MUX_PA17F_TCC0_WO7), - SERCOM(SERCOM1, 1, PINMUX_PA17C_SERCOM1_PAD1), - SERCOM(SERCOM3, 1, PINMUX_PA17D_SERCOM3_PAD1)); + TCC(TCC2, 1, 1), + TCC(TCC0, 3, 7), + SERCOM(SERCOM1, 1), + SERCOM(SERCOM3, 1)); #endif #ifdef PIN_PA18 PIN(PA18, false, NO_ADC_INPUT, - TIMER(TC3, 0, 0, 0, PIN_PA18E_TC3_WO0, MUX_PA18E_TC3_WO0), - TIMER(0, TCC0, 2, 2, PIN_PA18F_TCC0_WO2, MUX_PA18F_TCC0_WO2), - SERCOM(SERCOM1, 2, PINMUX_PA18C_SERCOM1_PAD2), - SERCOM(SERCOM3, 2, PINMUX_PA18D_SERCOM3_PAD2)); + TC(TC3, 0, 0), + TCC(TCC0, 2, 2), + SERCOM(SERCOM1, 2), + SERCOM(SERCOM3, 2)); #endif #ifdef PIN_PA19 PIN(PA19, false, NO_ADC_INPUT, - TIMER(TC3, 0, 1, 1, PIN_PA19E_TC3_WO1, MUX_PA19E_TC3_WO1), - TIMER(0, TCC0, 3, 3, PIN_PA19F_TCC0_WO3, MUX_PA19F_TCC0_WO3), - SERCOM(SERCOM1, 3, PINMUX_PA19C_SERCOM1_PAD3), - SERCOM(SERCOM3, 3, PINMUX_PA19C_SERCOM1_PAD3)); + TC(TC3, 1, 1), + TCC(TCC0, 3, 3), + SERCOM(SERCOM1, 3), + SERCOM(SERCOM3, 3)); #endif #ifdef PIN_PB16 PIN(PB16, false, NO_ADC_INPUT, #ifdef _SAMD21_TC6_INSTANCE_ - TIMER(TC6, 0, 0, 0, PIN_PB16E_TC6_WO0, MUX_PB16E_TC6_WO0), + TC(TC6, 0, 0), #else NO_TIMER, #endif - TIMER(0, TCC0, 0, 4, PIN_PB16F_TCC0_WO4, MUX_PB16F_TCC0_WO4), - SERCOM(SERCOM5, 0, PINMUX_PB16C_SERCOM5_PAD0), + TCC(TCC0, 0, 4), + SERCOM(SERCOM5, 0), NO_SERCOM); #endif #ifdef PIN_PB17 PIN(PB17, false, NO_ADC_INPUT, #ifdef _SAMD21_TC6_INSTANCE_ - TIMER(TC6, 0, 0, 0, PIN_PB17E_TC6_WO1, MUX_PB17E_TC6_WO1), + TC(TC6, 0, 0), #else NO_TIMER, #endif - TIMER(0, TCC0, 1, 5, PIN_PB17F_TCC0_WO5, MUX_PB17F_TCC0_WO5), - SERCOM(SERCOM5, 1, PINMUX_PB17C_SERCOM5_PAD1), + TCC(TCC0, 1, 5), + SERCOM(SERCOM5, 1), NO_SERCOM); #endif #ifdef PIN_PA20 PIN(PA20, false, NO_ADC_INPUT, #ifdef _SAMD21_TC7_INSTANCE_ - TIMER(TC7, 0, 0, 0, PIN_PA20E_TC7_WO0, MUX_PA20E_TC7_WO0), + TC(TC7, 0, 0), #else NO_TIMER, #endif - TIMER(0, TCC0, 2, 6, PIN_PA20F_TCC0_WO6, MUX_PA20F_TCC0_WO6), - SERCOM(SERCOM5, 2, PINMUX_PA20C_SERCOM5_PAD2), - SERCOM(SERCOM3, 2, PINMUX_PA20D_SERCOM3_PAD2)); + TCC(TCC0, 2, 6), + SERCOM(SERCOM5, 2), + SERCOM(SERCOM3, 2)); #endif #ifdef PIN_PA21 PIN(PA21, false, NO_ADC_INPUT, #ifdef _SAMD21_TC7_INSTANCE_ - TIMER(TC7, 0, 1, 1, PIN_PA21E_TC7_WO1, MUX_PA21E_TC7_WO1), + TC(TC7, 1, 1), #else NO_TIMER, #endif - TIMER(0, TCC0, 3, 7, PIN_PA21F_TCC0_WO7, MUX_PA21F_TCC0_WO7), - SERCOM(SERCOM5, 3, PINMUX_PA21C_SERCOM5_PAD3), - SERCOM(SERCOM3, 3, PINMUX_PA21D_SERCOM3_PAD3)); + TCC(TCC0, 3, 7), + SERCOM(SERCOM5, 3), + SERCOM(SERCOM3, 3)); #endif #ifdef PIN_PA22 PIN(PA22, false, NO_ADC_INPUT, - TIMER(TC4, 0, 0, 0, PIN_PA22E_TC4_WO0, MUX_PA22E_TC4_WO0), - TIMER(0, TCC0, 0, 4, PIN_PA22F_TCC0_WO4, MUX_PA22F_TCC0_WO4), - SERCOM(SERCOM3, 0, PINMUX_PA22C_SERCOM3_PAD0), + TC(TC4, 0, 0), + TCC(TCC0, 0, 4), + SERCOM(SERCOM3, 0), #ifdef SERCOM5 - SERCOM(SERCOM5, 0, PINMUX_PA22D_SERCOM5_PAD0) + SERCOM(SERCOM5, 0) #else NO_SERCOM #endif @@ -334,11 +339,11 @@ PIN(PA22, false, NO_ADC_INPUT, #endif #ifdef PIN_PA23 PIN(PA23, false, NO_ADC_INPUT, - TIMER(TC4, 0, 1, 1, PIN_PA23E_TC4_WO1, MUX_PA23E_TC4_WO1), - TIMER(0, TCC0, 1, 5, PIN_PA23F_TCC0_WO5, MUX_PA23F_TCC0_WO5), - SERCOM(SERCOM3, 1, PINMUX_PA23C_SERCOM3_PAD1), + TC(TC4, 1, 1), + TCC(TCC0, 1, 5), + SERCOM(SERCOM3, 1), #ifdef SERCOM5 - SERCOM(SERCOM5, 1, PINMUX_PA23D_SERCOM5_PAD1) + SERCOM(SERCOM5, 1) #else NO_SERCOM #endif @@ -346,11 +351,11 @@ PIN(PA23, false, NO_ADC_INPUT, #endif #ifdef PIN_PA24 PIN(PA24, false, NO_ADC_INPUT, - TIMER(TC5, 0, 0, 0, PIN_PA24E_TC5_WO0, MUX_PA24E_TC5_WO0), - TIMER(0, TCC0, 2, 2, PIN_PA24F_TCC1_WO2, MUX_PA24F_TCC1_WO2), - SERCOM(SERCOM3, 2, PINMUX_PA24C_SERCOM3_PAD2), + TC(TC5, 0, 0), + TCC(TCC0, 2, 2), + SERCOM(SERCOM3, 2), #ifdef SERCOM5 - SERCOM(SERCOM5, 2, PINMUX_PA24D_SERCOM5_PAD2) + SERCOM(SERCOM5, 2) #else NO_SERCOM #endif @@ -358,11 +363,11 @@ PIN(PA24, false, NO_ADC_INPUT, #endif #ifdef PIN_PA25 PIN(PA25, false, NO_ADC_INPUT, - TIMER(TC5, 0, 1, 1, PIN_PA25E_TC5_WO1, MUX_PA25E_TC5_WO1), - TIMER(0, TCC1, 3, 3, PIN_PA25F_TCC1_WO3, MUX_PA25F_TCC1_WO3), - SERCOM(SERCOM3, 3, PINMUX_PA25C_SERCOM3_PAD3), + TC(TC5, 1, 1), + TCC(TCC1, 3, 3), + SERCOM(SERCOM3, 3), #ifdef SERCOM5 - SERCOM(SERCOM5, 3, PINMUX_PA25C_SERCOM3_PAD3) + SERCOM(SERCOM5, 3) #else NO_SERCOM #endif @@ -371,24 +376,24 @@ PIN(PA25, false, NO_ADC_INPUT, #ifdef PIN_PB22 PIN(PB22, false, NO_ADC_INPUT, #ifdef _SAMD21_TC7_INSTANCE_ - TIMER(TC7, 0, 1, 1, PIN_PB22E_TC7_WO0, MUX_PB22E_TC7_WO0), + TC(TC7, 1, 1), #else NO_TIMER, #endif NO_TIMER, NO_SERCOM, - SERCOM(SERCOM5, 2, PINMUX_PB22D_SERCOM5_PAD2)); + SERCOM(SERCOM5, 2)); #endif #ifdef PIN_PB23 PIN(PB23, false, NO_ADC_INPUT, #ifdef _SAMD21_TC7_INSTANCE_ - TIMER(TC7, 0, 1, 1, PIN_PB23E_TC7_WO1, MUX_PB23E_TC7_WO1), + TC(TC7, 1, 1), #else NO_TIMER, #endif NO_TIMER, NO_SERCOM, - SERCOM(SERCOM5, 3, PINMUX_PB23D_SERCOM5_PAD3)); + SERCOM(SERCOM5, 3)); #endif #ifdef PIN_PA27 PIN(PA27, false, NO_ADC_INPUT, @@ -406,73 +411,73 @@ PIN(PA28, false, NO_ADC_INPUT, #endif #ifdef PIN_PA30 PIN(PA30, false, NO_ADC_INPUT, - TIMER(0, TCC1, 0, 0, PIN_PA30E_TCC1_WO0, MUX_PA30E_TCC1_WO0), + TCC(TCC1, 0, 0), NO_TIMER, NO_SERCOM, - SERCOM(SERCOM1, 2, PINMUX_PA30D_SERCOM1_PAD2)); + SERCOM(SERCOM1, 2)); #endif #ifdef PIN_PA31 PIN(PA31, false, NO_ADC_INPUT, - TIMER(0, TCC1, 1, 1, PIN_PA31E_TCC1_WO1, MUX_PA31E_TCC1_WO1), + TCC(TCC1, 1, 1), NO_TIMER, NO_SERCOM, - SERCOM(SERCOM1, 3, PINMUX_PA31D_SERCOM1_PAD3)); + SERCOM(SERCOM1, 3)); #endif #ifdef PIN_PB30 PIN(PB30, false, NO_ADC_INPUT, - TIMER(TCC0, 0, 0, 0, PIN_PB30E_TCC0_WO0, MUX_PB30E_TCC0_WO0), - TIMER(TCC1, 0, 2, 2, PIN_PB30F_TCC1_WO2, MUX_PB30F_TCC1_WO2), + TCC(TCC0, 0, 0), + TCC(TCC1, 2, 2), NO_SERCOM, - SERCOM(SERCOM5, 0, PINMUX_PB30D_SERCOM5_PAD0)); + SERCOM(SERCOM5, 0)); #endif #ifdef PIN_PB31 PIN(PB31, false, NO_ADC_INPUT, - TIMER(TCC0, 0, 1, 1, PIN_PB31E_TCC0_WO1, MUX_PB31E_TCC0_WO1), - TIMER(TCC1, 0, 3, 3, PIN_PB31F_TCC1_WO3, MUX_PB31F_TCC1_WO3), + TCC(TCC0, 1, 1), + TCC(TCC1, 3, 3), NO_SERCOM, - SERCOM(SERCOM5, 1, PINMUX_PB31D_SERCOM5_PAD1)); + SERCOM(SERCOM5, 1)); #endif #ifdef PIN_PB00 PIN(PB00, true, ADC_POSITIVE_INPUT_PIN8, #ifdef _SAMD21_TC7_INSTANCE_ - TIMER(TC7, 0, 0, 0, PIN_PB00E_TC7_WO0, MUX_PB00E_TC7_WO0), + TC(TC7, 0, 0), #else NO_TIMER, #endif NO_TIMER, NO_SERCOM, - SERCOM(SERCOM5, 2, PINMUX_PB00D_SERCOM5_PAD2)); + SERCOM(SERCOM5, 2)); #endif #ifdef PIN_PB01 PIN(PB01, true, ADC_POSITIVE_INPUT_PIN9, #ifdef _SAMD21_TC7_INSTANCE_ - TIMER(TC7, 0, 1, 1, PIN_PB01E_TC7_WO1, MUX_PB01E_TC7_WO1), + TC(TC7, 1, 1), #else NO_TIMER, #endif NO_TIMER, NO_SERCOM, - SERCOM(SERCOM5, 3, PINMUX_PB01D_SERCOM5_PAD3)); + SERCOM(SERCOM5, 3)); #endif #ifdef PIN_PB02 PIN(PB02, true, ADC_POSITIVE_INPUT_PIN10, #ifdef _SAMD21_TC6_INSTANCE_ - TIMER(TC6, 0, 0, 0, PIN_PB02E_TC6_WO0, MUX_PB02E_TC6_WO0), + TC(TC6, 0, 0), #else NO_TIMER, #endif NO_TIMER, NO_SERCOM, - SERCOM(SERCOM5, 0, PINMUX_PB02D_SERCOM5_PAD0)); + SERCOM(SERCOM5, 0)); #endif #ifdef PIN_PB03 PIN(PB03, true, ADC_POSITIVE_INPUT_PIN11, #ifdef _SAMD21_TC6_INSTANCE_ - TIMER(TC6, 0, 1, 1, PIN_PB03E_TC6_WO1, MUX_PB03E_TC6_WO1), + TC(TC6, 1, 1), #else NO_TIMER, #endif NO_TIMER, NO_SERCOM, - SERCOM(SERCOM5, 1, PINMUX_PB03D_SERCOM5_PAD1)); + SERCOM(SERCOM5, 1)); #endif diff --git a/atmel-samd/samd21_pins.h b/atmel-samd/samd21_pins.h index e2fd57a73a..614a2183e1 100644 --- a/atmel-samd/samd21_pins.h +++ b/atmel-samd/samd21_pins.h @@ -3,6 +3,12 @@ #include "common-hal/microcontroller/types.h" +#define MUX_C 2 +#define MUX_D 3 +#define MUX_E 4 +#define MUX_F 5 +#define PINMUX(pin, mux) ((((uint32_t) pin) << 16) | (mux)) + // Pins in datasheet order. #ifdef PIN_PA00 extern const mcu_pin_obj_t pin_PA00;