Skip to content

Commit

Permalink
Merge pull request #6564 from haukepetersen/opt_periph_pwmpower
Browse files Browse the repository at this point in the history
periph/pwm: remove pwm_(start|stop) + doc
  • Loading branch information
haukepetersen committed Feb 23, 2017
2 parents bacdb8d + 2bb3425 commit fc6b7f0
Show file tree
Hide file tree
Showing 7 changed files with 105 additions and 139 deletions.
60 changes: 29 additions & 31 deletions cpu/kinetis_common/periph/pwm.c
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,22 @@ static inline FTM_Type *ftm(pwm_t pwm)
return pwm_config[pwm].ftm;
}

static void poweron(pwm_t pwm)
{
int ftm = pwm_config[pwm].ftm_num;

#ifdef SIM_SCGC6_FTM2_SHIFT
BITBAND_REG32(SIM->SCGC6, SIM_SCGC6_FTM0_SHIFT + ftm) = 1;
#else
if (ftm < 2) {
BITBAND_REG32(SIM->SCGC6, SIM_SCGC6_FTM0_SHIFT + ftm) = 1;
}
else if (ftm == 2) {
BITBAND_REG32(SIM->SCGC3, SIM_SCGC3_FTM2_SHIFT) = 1;
}
#endif
}

uint32_t pwm_init(pwm_t pwm, pwm_mode_t mode, uint32_t freq, uint16_t res)
{
uint8_t pre = 0;
Expand All @@ -60,7 +76,7 @@ uint32_t pwm_init(pwm_t pwm, pwm_mode_t mode, uint32_t freq, uint16_t res)
}

/* configure the used timer */
pwm_poweron(pwm);
poweron(pwm);
/* disable write protect for changing settings */
ftm(pwm)->MODE = FTM_MODE_WPDIS_MASK;
/* clear any existing configuration */
Expand Down Expand Up @@ -88,7 +104,7 @@ uint32_t pwm_init(pwm_t pwm, pwm_mode_t mode, uint32_t freq, uint16_t res)
}

/* and now we start the actual waveform generation */
pwm_start(pwm);
ftm(pwm)->SC |= FTM_SC_CLKS(1);

/* finally we need to return the actual applied PWM frequency */
return (CLOCK_BUSCLOCK >> pre) / res;
Expand All @@ -106,47 +122,29 @@ void pwm_set(pwm_t pwm, uint8_t channel, uint16_t value)
ftm(pwm)->CONTROLS[pwm_config[pwm].chan[channel].ftm_chan].CnV = value;
}

void pwm_start(pwm_t pwm)
{
assert(pwm < PWM_NUMOF);
ftm(pwm)->SC |= FTM_SC_CLKS(1);
}

void pwm_stop(pwm_t pwm)
{
assert(pwm < PWM_NUMOF);
ftm(pwm)->SC &= ~(FTM_SC_CLKS_MASK);
}

void pwm_poweron(pwm_t pwm)
{
assert(pwm < PWM_NUMOF);
int ftm = pwm_config[pwm].ftm_num;

#ifdef SIM_SCGC6_FTM2_SHIFT
BITBAND_REG32(SIM->SCGC6, SIM_SCGC6_FTM0_SHIFT + ftm) = 1;
#else
if (ftm < 2) {
BITBAND_REG32(SIM->SCGC6, SIM_SCGC6_FTM0_SHIFT + ftm) = 1;
}
else if (ftm == 2) {
BITBAND_REG32(SIM->SCGC3, SIM_SCGC3_FTM2_SHIFT) = 1;
}
#endif
poweron(pwm);
ftm(pwm)->SC |= FTM_SC_CLKS(1);
}

void pwm_poweroff(pwm_t pwm)
{
assert(pwm < PWM_NUMOF);
int ftm = pwm_config[pwm].ftm_num;
int ftm_num = pwm_config[pwm].ftm_num;

/* disable PWM generation */
ftm(pwm)->SC &= ~(FTM_SC_CLKS_MASK);

/* and power of the peripheral */
#ifdef SIM_SCGC6_FTM2_SHIFT
BITBAND_REG32(SIM->SCGC6, SIM_SCGC6_FTM0_SHIFT + ftm) = 0;
BITBAND_REG32(SIM->SCGC6, SIM_SCGC6_FTM0_SHIFT + ftm_num) = 0;
#else
if (ftm < 2) {
BITBAND_REG32(SIM->SCGC6, SIM_SCGC6_FTM0_SHIFT + ftm) = 0;
if (ftm_num < 2) {
BITBAND_REG32(SIM->SCGC6, SIM_SCGC6_FTM0_SHIFT + ftm_num) = 0;
}
else if (ftm == 2) {
else if (ftm_num == 2) {
BITBAND_REG32(SIM->SCGC3, SIM_SCGC3_FTM2_SHIFT) = 0;
}
#endif
Expand Down
16 changes: 3 additions & 13 deletions cpu/lpc11u34/periph/pwm.c
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ uint32_t pwm_init(pwm_t pwm, pwm_mode_t mode, uint32_t freq, uint16_t res)
}

/* power on and configure the timer */
pwm_poweron(pwm);
LPC_SYSCON->SYSAHBCLKCTRL |= pwm_config[pwm].clk_bit;
/* enable the timer and keep it in reset state */
dev(pwm)->TCR = BIT0 | BIT1;
/* set prescaler */
Expand Down Expand Up @@ -85,27 +85,17 @@ void pwm_set(pwm_t pwm, uint8_t channel, uint16_t value)
dev(pwm)->MR[channel] = dev(pwm)->MR3 - value;
}

void pwm_start(pwm_t pwm)
{
assert(pwm < PWM_NUMOF);
dev(pwm)->TCR &= ~(BIT1);
}

void pwm_stop(pwm_t pwm)
{
assert(pwm < PWM_NUMOF);
dev(pwm)->TCR |= (BIT1);
}

void pwm_poweron(pwm_t pwm)
{
assert(pwm < PWM_NUMOF);
LPC_SYSCON->SYSAHBCLKCTRL |= pwm_config[pwm].clk_bit;
dev(pwm)->TCR &= ~(BIT1);
}

void pwm_poweroff(pwm_t pwm)
{
assert(pwm < PWM_NUMOF);
dev(pwm)->TCR |= (BIT1);
LPC_SYSCON->SYSAHBCLKCTRL &= ~(pwm_config[pwm].clk_bit);
}

Expand Down
16 changes: 3 additions & 13 deletions cpu/lpc2387/periph/pwm.c
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ uint32_t pwm_init(pwm_t dev, pwm_mode_t mode, uint32_t freq, uint16_t res)
(PWM_FUNC << PWM_CH2_PIN * 2);

/* power on PWM1 */
pwm_poweron(dev);
PCONP |= PCPWM1;

/* select PWM1 clock */
PCLKSEL0 &= ~(BIT13);
Expand Down Expand Up @@ -108,27 +108,17 @@ void pwm_set(pwm_t dev, uint8_t channel, uint16_t value)
}
}

void pwm_start(pwm_t dev)
{
assert(dev == PWM_DEV(0));
PWM1TCR |= BIT0;
}

void pwm_stop(pwm_t dev)
{
assert(dev == PWM_DEV(0));
PWM1TCR &= ~(BIT0);
}

void pwm_poweron(pwm_t dev)
{
assert(dev == PWM_DEV(0));
PCONP |= PCPWM1;
PWM1TCR |= BIT0;
}

void pwm_poweroff(pwm_t dev)
{
assert(dev == PWM_DEV(0));
PWM1TCR &= ~(BIT0);
PCONP &= ~(PCPWM1);
}

Expand Down
21 changes: 2 additions & 19 deletions cpu/sam3/periph/pwm.c
Original file line number Diff line number Diff line change
Expand Up @@ -114,34 +114,17 @@ void pwm_set(pwm_t pwm, uint8_t channel, uint16_t value)
PWM->PWM_CH_NUM[pwm_chan[channel].hwchan].PWM_CDTYUPD = value;
}

void pwm_start(pwm_t pwm)
{
assert(pwm == PWM_DEV(0));
PWM->PWM_ENA = pwm_chan_mask;
}

void pwm_stop(pwm_t pwm)
{
assert(pwm == PWM_DEV(0));
PWM->PWM_ENA = 0;
}

/*
* The device is reactivated by by clocking the device block.
* Operation continues where it has been stopped by poweroff.
*/
void pwm_poweron(pwm_t pwm)
{
assert(pwm == PWM_DEV(0));
PMC->PMC_PCER1 = PMC_PCDR1_PID36;
PWM->PWM_ENA = pwm_chan_mask;
}

/*
* The device is set to power saving mode by disabling the clock.
*/
void pwm_poweroff(pwm_t pwm)
{
assert(pwm == PWM_DEV(0));
PWM->PWM_ENA = 0;
PMC->PMC_PCDR1 = PMC_PCDR1_PID36;
}

Expand Down
40 changes: 15 additions & 25 deletions cpu/samd21/periph/pwm.c
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,15 @@ static uint8_t get_prescaler(unsigned int target, int *scale)
return target - 1;
}

static void poweron(pwm_t dev)
{
PM->APBCMASK.reg |= (PM_APBCMASK_TCC0 << _num(dev));
GCLK->CLKCTRL.reg = (GCLK_CLKCTRL_CLKEN |
GCLK_CLKCTRL_GEN_GCLK0 |
GCLK_CLKCTRL_ID(_clk_id(dev)));
while (GCLK->STATUS.bit.SYNCBUSY) {}
}

uint32_t pwm_init(pwm_t dev, pwm_mode_t mode, uint32_t freq, uint16_t res)
{
uint8_t prescaler;
Expand All @@ -113,7 +122,7 @@ uint32_t pwm_init(pwm_t dev, pwm_mode_t mode, uint32_t freq, uint16_t res)
}

/* power on the device */
pwm_poweron(dev);
poweron(dev);

/* reset TCC module */
_tcc(dev)->CTRLA.reg = TCC_CTRLA_SWRST;
Expand Down Expand Up @@ -142,7 +151,7 @@ uint32_t pwm_init(pwm_t dev, pwm_mode_t mode, uint32_t freq, uint16_t res)
_tcc(dev)->PER.reg = (res - 1);
while (_tcc(dev)->SYNCBUSY.reg & TCC_SYNCBUSY_PER) {}
/* start PWM operation */
pwm_start(dev);
_tcc(dev)->CTRLA.reg |= (TCC_CTRLA_ENABLE);
/* return the actual frequency the PWM is running at */
return f_real;
}
Expand All @@ -162,36 +171,17 @@ void pwm_set(pwm_t dev, uint8_t channel, uint16_t value)
while (_tcc(dev)->SYNCBUSY.reg & (TCC_SYNCBUSY_CC0 << _chan(dev, channel))) {}
}

void pwm_start(pwm_t dev)
void pwm_poweron(pwm_t dev)
{
poweron(dev);
_tcc(dev)->CTRLA.reg |= (TCC_CTRLA_ENABLE);
}

void pwm_stop(pwm_t dev)
void pwm_poweroff(pwm_t dev)
{
_tcc(dev)->CTRLA.reg &= ~(TCC_CTRLA_ENABLE);
}

void pwm_poweron(pwm_t dev)
{
int num = _num(dev);
if (num < 0) {
return;
}
PM->APBCMASK.reg |= (PM_APBCMASK_TCC0 << num);
GCLK->CLKCTRL.reg = (GCLK_CLKCTRL_CLKEN |
GCLK_CLKCTRL_GEN_GCLK0 |
GCLK_CLKCTRL_ID(_clk_id(dev)));
while (GCLK->STATUS.bit.SYNCBUSY) {}
}

void pwm_poweroff(pwm_t dev)
{
int num = _num(dev);
if (num < 0) {
return;
}
PM->APBCMASK.reg &= ~(PM_APBCMASK_TCC0 << num);
PM->APBCMASK.reg &= ~(PM_APBCMASK_TCC0 << _num(dev));
GCLK->CLKCTRL.reg = (GCLK_CLKCTRL_GEN_GCLK7 |
GCLK_CLKCTRL_ID(_clk_id(dev)));
while (GCLK->STATUS.bit.SYNCBUSY) {}
Expand Down
16 changes: 3 additions & 13 deletions cpu/stm32_common/periph/pwm.c
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ uint32_t pwm_init(pwm_t pwm, pwm_mode_t mode, uint32_t freq, uint16_t res)
assert((pwm < PWM_NUMOF) && ((freq * res) < bus_clk));

/* power on the used timer */
pwm_poweron(pwm);
periph_clk_en(pwm_config[pwm].bus, pwm_config[pwm].rcc_mask);
/* reset configuration and CC channels */
dev(pwm)->CR1 = 0;
dev(pwm)->CR2 = 0;
Expand Down Expand Up @@ -124,27 +124,17 @@ void pwm_set(pwm_t pwm, uint8_t channel, uint16_t value)
dev(pwm)->CCR[pwm_config[pwm].chan[channel].cc_chan] = value;
}

void pwm_start(pwm_t pwm)
{
assert(pwm < PWM_NUMOF);
dev(pwm)->CR1 |= TIM_CR1_CEN;
}

void pwm_stop(pwm_t pwm)
{
assert(pwm < PWM_NUMOF);
dev(pwm)->CR1 &= ~TIM_CR1_CEN;
}

void pwm_poweron(pwm_t pwm)
{
assert(pwm < PWM_NUMOF);
periph_clk_en(pwm_config[pwm].bus, pwm_config[pwm].rcc_mask);
dev(pwm)->CR1 |= TIM_CR1_CEN;
}

void pwm_poweroff(pwm_t pwm)
{
assert(pwm < PWM_NUMOF);
dev(pwm)->CR1 &= ~TIM_CR1_CEN;
periph_clk_dis(pwm_config[pwm].bus, pwm_config[pwm].rcc_mask);
}

Expand Down
Loading

0 comments on commit fc6b7f0

Please sign in to comment.