drivers: pwm_nrf5_sw: Perform static initialization only once
Move static register initialization from _pin_set() to _init(). Signed-off-by: Henrik Brix Andersen <henrik@brixandersen.dk>
This commit is contained in:
parent
96784dff9d
commit
2d269bb194
1 changed files with 19 additions and 9 deletions
|
@ -142,16 +142,9 @@ static int pwm_nrf5_sw_pin_set(struct device *dev, u32_t pwm,
|
||||||
/* calc div, to scale down to fit in 16 bits */
|
/* calc div, to scale down to fit in 16 bits */
|
||||||
div = period_cycles >> 16;
|
div = period_cycles >> 16;
|
||||||
|
|
||||||
/* setup HF timer in 16MHz frequency */
|
|
||||||
timer->MODE = TIMER_MODE_MODE_Timer;
|
|
||||||
timer->PRESCALER = config->prescaler;
|
|
||||||
timer->BITMODE = TIMER_BITMODE_BITMODE_16Bit;
|
|
||||||
timer->EVENTS_COMPARE[channel] = 0;
|
timer->EVENTS_COMPARE[channel] = 0;
|
||||||
timer->EVENTS_COMPARE[config->map_size] = 0;
|
timer->EVENTS_COMPARE[config->map_size] = 0;
|
||||||
/* TODO: set shorts according to map_size if not 3, i.e. if NRF_TIMER
|
|
||||||
* supports more than 4 compares, then more channels can be supported.
|
|
||||||
*/
|
|
||||||
timer->SHORTS = TIMER_SHORTS_COMPARE3_CLEAR_Msk;
|
|
||||||
timer->CC[channel] = pulse_cycles >> div;
|
timer->CC[channel] = pulse_cycles >> div;
|
||||||
timer->CC[config->map_size] = period_cycles >> div;
|
timer->CC[config->map_size] = period_cycles >> div;
|
||||||
timer->TASKS_CLEAR = 1;
|
timer->TASKS_CLEAR = 1;
|
||||||
|
@ -166,7 +159,8 @@ static int pwm_nrf5_sw_pin_set(struct device *dev, u32_t pwm,
|
||||||
NRF_PPI->CH[ppi_index].TEP = (u32_t)
|
NRF_PPI->CH[ppi_index].TEP = (u32_t)
|
||||||
&(NRF_GPIOTE->TASKS_OUT[channel]);
|
&(NRF_GPIOTE->TASKS_OUT[channel]);
|
||||||
NRF_PPI->CH[ppi_index + 1].EEP = (u32_t)
|
NRF_PPI->CH[ppi_index + 1].EEP = (u32_t)
|
||||||
&(timer->EVENTS_COMPARE[3]);
|
&(timer->EVENTS_COMPARE[
|
||||||
|
config->map_size]);
|
||||||
NRF_PPI->CH[ppi_index + 1].TEP = (u32_t)
|
NRF_PPI->CH[ppi_index + 1].TEP = (u32_t)
|
||||||
&(NRF_GPIOTE->TASKS_OUT[channel]);
|
&(NRF_GPIOTE->TASKS_OUT[channel]);
|
||||||
NRF_PPI->CHENSET = BIT(ppi_index) | BIT(ppi_index + 1);
|
NRF_PPI->CHENSET = BIT(ppi_index) | BIT(ppi_index + 1);
|
||||||
|
@ -221,6 +215,22 @@ static const struct pwm_driver_api pwm_nrf5_sw_drv_api_funcs = {
|
||||||
|
|
||||||
static int pwm_nrf5_sw_init(struct device *dev)
|
static int pwm_nrf5_sw_init(struct device *dev)
|
||||||
{
|
{
|
||||||
|
struct pwm_config *config;
|
||||||
|
NRF_TIMER_Type *timer;
|
||||||
|
|
||||||
|
config = (struct pwm_config *)dev->config->config_info;
|
||||||
|
timer = config->timer;
|
||||||
|
|
||||||
|
/* setup HF timer */
|
||||||
|
timer->MODE = TIMER_MODE_MODE_Timer;
|
||||||
|
timer->PRESCALER = config->prescaler;
|
||||||
|
timer->BITMODE = TIMER_BITMODE_BITMODE_16Bit;
|
||||||
|
|
||||||
|
/* TODO: set shorts according to map_size if not 3, i.e. if NRF_TIMER
|
||||||
|
* supports more than 4 compares, then more channels can be supported.
|
||||||
|
*/
|
||||||
|
timer->SHORTS = TIMER_SHORTS_COMPARE3_CLEAR_Msk;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue