arch/arm/src/samv7/sam_pwm.c: adjust arch driver to DCPOL options

Signed-off-by: Stepan Pressl <pressste@fel.cvut.cz>
This commit is contained in:
Pressl, Štěpán 2024-04-05 16:56:05 +02:00 committed by Xiang Xiao
parent 21de46a4d1
commit bf3a5bb4cb

View File

@ -332,7 +332,7 @@ static void pwm_set_deadtime(struct pwm_lowerhalf_s *dev, uint8_t channel,
ub16_t duty); ub16_t duty);
#endif #endif
static void pwm_set_polarity(struct pwm_lowerhalf_s *dev, uint8_t channel, static void pwm_set_polarity(struct pwm_lowerhalf_s *dev, uint8_t channel,
uint8_t cpol); uint8_t cpol, uint8_t dcpol);
/**************************************************************************** /****************************************************************************
* Private Functions * Private Functions
@ -631,6 +631,7 @@ static void pwm_set_deadtime(struct pwm_lowerhalf_s *dev, uint8_t channel,
* dev - A reference to the lower half PWM driver state structure * dev - A reference to the lower half PWM driver state structure
* channel - Channel to by updated * channel - Channel to by updated
* cpol - Desired polarity * cpol - Desired polarity
* dcpol - Desired default polarity of a disabled channel
* *
* Returned Value: * Returned Value:
* None * None
@ -638,18 +639,26 @@ static void pwm_set_deadtime(struct pwm_lowerhalf_s *dev, uint8_t channel,
****************************************************************************/ ****************************************************************************/
static void pwm_set_polarity(struct pwm_lowerhalf_s *dev, uint8_t channel, static void pwm_set_polarity(struct pwm_lowerhalf_s *dev, uint8_t channel,
uint8_t cpol) uint8_t cpol, uint8_t dcpol)
{ {
struct sam_pwm_s *priv = (struct sam_pwm_s *)dev; struct sam_pwm_s *priv = (struct sam_pwm_s *)dev;
uint16_t regval; uint16_t regval;
regval = pwm_getreg(priv, SAMV7_PWM_CMRX + (channel * CHANNEL_OFFSET)); regval = pwm_getreg(priv, SAMV7_PWM_CMRX + (channel * CHANNEL_OFFSET));
regval &= ~CMR_CPOL; regval &= ~CMR_CPOL;
regval &= ~CMR_DPOLI;
if (cpol == PWM_CPOL_HIGH) if (cpol == PWM_CPOL_HIGH)
{ {
regval |= CMR_CPOL; regval |= CMR_CPOL;
} }
if ((dcpol == PWM_DCPOL_LOW && cpol == PWM_CPOL_HIGH) ||
(dcpol == PWM_DCPOL_HIGH && cpol == PWM_CPOL_LOW))
{
regval |= CMR_DPOLI;
}
pwm_putreg(priv, SAMV7_PWM_CMRX + (channel * CHANNEL_OFFSET), regval); pwm_putreg(priv, SAMV7_PWM_CMRX + (channel * CHANNEL_OFFSET), regval);
} }
@ -846,7 +855,8 @@ static int pwm_start(struct pwm_lowerhalf_s *dev,
info->channels[i].duty); info->channels[i].duty);
#endif #endif
pwm_set_polarity(dev, priv->channels[index - 1].channel, pwm_set_polarity(dev, priv->channels[index - 1].channel,
info->channels[i].cpol); info->channels[i].cpol,
info->channels[i].dcpol);
pwm_set_output(dev, priv->channels[index - 1].channel, pwm_set_output(dev, priv->channels[index - 1].channel,
info->channels[i].duty); info->channels[i].duty);
#ifdef CONFIG_PWM_OVERWRITE #ifdef CONFIG_PWM_OVERWRITE
@ -879,7 +889,7 @@ static int pwm_start(struct pwm_lowerhalf_s *dev,
info->dead_time_a, info->dead_time_b); info->dead_time_a, info->dead_time_b);
#endif #endif
pwm_set_polarity(dev, priv->channels[0].channel, pwm_set_polarity(dev, priv->channels[0].channel,
info->cpol); info->cpol, info->dcpol);
pwm_set_output(dev, priv->channels[0].channel, info->duty); pwm_set_output(dev, priv->channels[0].channel, info->duty);
#endif #endif