summaryrefslogtreecommitdiff
path: root/atmel-samd/modmachine_pin.h
diff options
context:
space:
mode:
authorScott Shawcroft <scott@chickadee.tech>2016-08-30 13:10:52 -0700
committerScott Shawcroft <scott@chickadee.tech>2016-08-30 13:10:52 -0700
commitccb309bd5c0b283ea847b18621038bf5ef817f38 (patch)
tree209accaade97ae559558b154b9a080ce3632bc58 /atmel-samd/modmachine_pin.h
parentb883a15d82c156a0abf8aabf61bc9445ddf97f39 (diff)
atmel/samd: Add basic PWM support which only allows for changing the duty.
Diffstat (limited to 'atmel-samd/modmachine_pin.h')
-rw-r--r--atmel-samd/modmachine_pin.h43
1 files changed, 42 insertions, 1 deletions
diff --git a/atmel-samd/modmachine_pin.h b/atmel-samd/modmachine_pin.h
index 4a02f41db..8ecafe798 100644
--- a/atmel-samd/modmachine_pin.h
+++ b/atmel-samd/modmachine_pin.h
@@ -35,15 +35,45 @@
#include "asf/sam0/drivers/adc/adc_sam_d_r/adc_feature.h"
// This macro is used to simplify pin definition in boards/<board>/pins.c
-#define PIN(p_name, p_has_adc, p_adc_input) \
+#define PIN_TWO_TIMERS(p_name, p_has_adc, p_adc_input, p_primary_tc, p_primary_tcc, \
+ p_primary_channel, p_primary_wave_output, p_primary_pin, p_primary_mux, \
+ p_secondary_tc, p_secondary_tcc, p_secondary_channel, p_secondary_wave_output, \
+ p_secondary_pin, p_secondary_mux) \
const pin_obj_t pin_## p_name = { \
{ &pin_type }, \
.name = MP_QSTR_ ## p_name, \
.pin = (PIN_## p_name), \
.has_adc = p_has_adc, \
.adc_input = p_adc_input, \
+ .primary_timer = { \
+ .tc = p_primary_tc, \
+ .tcc = p_primary_tcc, \
+ .channel = p_primary_channel, \
+ .wave_output = p_primary_wave_output, \
+ .pin = p_primary_pin, \
+ .mux = p_primary_mux \
+ }, \
+ .secondary_timer = { \
+ .tc = p_secondary_tc, \
+ .tcc = p_secondary_tcc, \
+ .channel = p_secondary_channel, \
+ .wave_output = p_secondary_wave_output, \
+ .pin = p_secondary_pin, \
+ .mux = p_secondary_mux \
+ } \
}
+#define PIN_NO_TIMERS_(p_name, p_has_adc, p_adc_input) \
+ PIN_TWO_TIMERS(p_name, p_has_adc, p_adc_input, \
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
+
+#define PIN_ONE_TIMER_(p_name, p_has_adc, p_adc_input, p_primary_tcc, \
+ p_primary_tc, p_primary_channel, p_primary_wave_output, \
+ p_primary_pin, p_primary_mux) \
+ PIN_TWO_TIMERS(p_name, p_has_adc, p_adc_input, p_primary_tcc, p_primary_tc, \
+ p_primary_channel, p_primary_wave_output, p_primary_pin, p_primary_mux, \
+ 0, 0, 0, 0, 0, 0)
+
#define NO_ADC_INPUT (0)
#include "mpconfigport.h"
@@ -51,11 +81,22 @@ const pin_obj_t pin_## p_name = { \
#include "py/obj.h"
typedef struct {
+ Tc *const tc;
+ Tcc *const tcc;
+ uint8_t channel;
+ uint8_t wave_output;
+ uint32_t pin;
+ uint32_t mux;
+} pin_timer_t;
+
+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_obj_t;
extern const mp_obj_type_t pin_type;