aboutsummaryrefslogtreecommitdiffstats
path: root/src/wiring/pwm.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/wiring/pwm.c')
-rw-r--r--src/wiring/pwm.c40
1 files changed, 40 insertions, 0 deletions
diff --git a/src/wiring/pwm.c b/src/wiring/pwm.c
new file mode 100644
index 0000000..0c33c3a
--- /dev/null
+++ b/src/wiring/pwm.c
@@ -0,0 +1,40 @@
+#include "wiring.h"
+#include "timers.h"
+#include "gpio.h"
+#include "pwm.h"
+
+#define NOT_A_TIMER 0
+
+static const TimerCCR PIN_TO_TIMER[NR_MAPLE_PINS] = {
+ TIMER2_CH4_CCR, // D0/A6
+ TIMER2_CH3_CCR, // D1/A7
+ TIMER2_CH1_CCR, // D2/A8
+ TIMER2_CH2_CCR, // D3/A9
+ NOT_A_TIMER, // D4
+ TIMER4_CH1_CCR, // D5
+ TIMER1_CH1_CCR, // D6
+ TIMER1_CH2_CCR, // D7
+ TIMER1_CH3_CCR, // D8
+ TIMER4_CH2_CCR, // D9
+ NOT_A_TIMER, // D10/A10
+ TIMER3_CH2_CCR, // D11/A11
+ TIMER3_CH1_CCR, // D12/A12
+ NOT_A_TIMER, // D13/A13
+};
+
+void pwmWrite(uint8_t pin, uint16_t duty_cycle) {
+ TimerCCR ccr;
+
+ if (pin >= NR_MAPLE_PINS) {
+ return;
+ }
+
+ ccr = PIN_TO_TIMER[pin];
+
+ if (ccr == NOT_A_TIMER)
+ return;
+
+ timer_pwm_write_ccr(ccr, duty_cycle);
+}
+
+