From 023d20abc1b5b31d17cdb24dca67c1ab995f35a1 Mon Sep 17 00:00:00 2001 From: Thomas Clark Date: Sun, 19 Oct 2014 16:27:47 -0400 Subject: [PATCH] Fix segfault in DIO PWM generators [artf3653] The HAL PWM generator functions tried to interpret ID numbers as int pointers instead of ints, leading to segfaults whenever PWM generators were used. Change-Id: I51d50162a8fc04a04795e7ca20a23de26b9e848d --- hal/lib/Athena/Digital.cpp | 29 +++++------------------------ 1 file changed, 5 insertions(+), 24 deletions(-) diff --git a/hal/lib/Athena/Digital.cpp b/hal/lib/Athena/Digital.cpp index 8581ed864e..2528d52d55 100644 --- a/hal/lib/Athena/Digital.cpp +++ b/hal/lib/Athena/Digital.cpp @@ -256,7 +256,7 @@ void* allocatePWM(int32_t *status) { * @param pwmGenerator The pwmGen to free that was allocated with AllocateDO_PWM() */ void freePWM(void* pwmGenerator, int32_t *status) { - uint32_t id = *((uint32_t*) pwmGenerator); + uint32_t id = (uint32_t) pwmGenerator; if (id == ~0ul) return; DO_PWMGenerators->Free(id); } @@ -283,7 +283,7 @@ void setPWMRate(double rate, int32_t *status) { * @param dutyCycle The percent duty cycle to output [0..1]. */ void setPWMDutyCycle(void* pwmGenerator, double dutyCycle, int32_t *status) { - uint32_t id = *((uint32_t*) pwmGenerator); + uint32_t id = (uint32_t) pwmGenerator; if (id == ~0ul) return; if (dutyCycle > 1.0) dutyCycle = 1.0; if (dutyCycle < 0.0) dutyCycle = 0.0; @@ -308,28 +308,9 @@ void setPWMDutyCycle(void* pwmGenerator, double dutyCycle, int32_t *status) { * @param channel The Digital Output channel to output on */ void setPWMOutputChannel(void* pwmGenerator, uint32_t pin, int32_t *status) { - uint32_t id = *((uint32_t*) pwmGenerator); - if (id == ~0ul) return; - switch(id) { - case 0: - digitalSystem->writePWMOutputSelect(0, pin, status); - break; - case 1: - digitalSystem->writePWMOutputSelect(1, pin, status); - break; - case 2: - digitalSystem->writePWMOutputSelect(2, pin, status); - break; - case 3: - digitalSystem->writePWMOutputSelect(3, pin, status); - break; - case 4: - digitalSystem->writePWMOutputSelect(4, pin, status); - break; - case 5: - digitalSystem->writePWMOutputSelect(5, pin, status); - break; - } + uint32_t id = (uint32_t) pwmGenerator; + if (id > 5) return; + digitalSystem->writePWMOutputSelect(id, pin, status); } /**