20 if (pwm == NULL || config.
clock_divisor > PWM_CFG_CLK_DIV_MASK ||
26 if (!mmio_region_read32(pwm->
base_addr, PWM_REGWEN_REG_OFFSET)) {
33 uint32_t config_reg = mmio_region_read32(pwm->
base_addr, PWM_CFG_REG_OFFSET);
34 config_reg = bitfield_field32_write(config_reg, PWM_CFG_CLK_DIV_FIELD,
44 uint32_t dc_resn_val = 30u - (uint32_t)bitfield_count_leading_zeroes32(
47 bitfield_field32_write(config_reg, PWM_CFG_DC_RESN_FIELD, dc_resn_val);
50 mmio_region_write32(pwm->
base_addr, PWM_CFG_REG_OFFSET, 0);
51 mmio_region_write32(pwm->
base_addr, PWM_CFG_REG_OFFSET, config_reg);
64 if (!mmio_region_read32(pwm->
base_addr, PWM_REGWEN_REG_OFFSET)) {
72 uint8_t duty_cycle_resolution = (uint8_t)bitfield_field32_read(
73 mmio_region_read32(pwm->
base_addr, PWM_CFG_REG_OFFSET),
74 PWM_CFG_DC_RESN_FIELD);
75 uint32_t beats_per_pulse_cycle = 1U << (duty_cycle_resolution + 1);
86 uint16_t phase_cntr_ticks_per_beat =
87 (uint16_t)(1 << (16 - duty_cycle_resolution - 1));
88 uint32_t duty_cycle_reg =
89 bitfield_field32_write(0, PWM_DUTY_CYCLE_0_A_0_FIELD,
92 bitfield_field32_write(duty_cycle_reg, PWM_DUTY_CYCLE_0_B_0_FIELD,
97 bitfield_field32_write(0, PWM_PWM_PARAM_0_PHASE_DELAY_0_FIELD,
101 bitfield_bit32_write(param_reg, PWM_PWM_PARAM_0_HTBT_EN_0_BIT,
true);
107 bitfield_bit32_write(param_reg, PWM_PWM_PARAM_0_BLINK_EN_0_BIT,
true);
111 uint32_t invert_reg =
112 mmio_region_read32(pwm->
base_addr, PWM_INVERT_REG_OFFSET);
115 uint32_t blink_param_reg = 0;
117 blink_param_reg = bitfield_field32_write(
125 blink_param_reg = bitfield_field32_write(
126 blink_param_reg, PWM_BLINK_PARAM_0_Y_0_FIELD,
130 bitfield_field32_write(blink_param_reg, PWM_BLINK_PARAM_0_Y_0_FIELD,
137#define DIF_PWM_CHANNEL_CONFIG_CASE_(channel_) \
138 case kDifPwmChannel##channel_: \
139 invert_reg = bitfield_bit32_write( \
140 invert_reg, PWM_INVERT_INVERT_##channel_##_BIT, config.polarity); \
141 mmio_region_write32(pwm->base_addr, \
142 PWM_DUTY_CYCLE_##channel_##_REG_OFFSET, \
144 mmio_region_write32(pwm->base_addr, PWM_PWM_PARAM_##channel_##_REG_OFFSET, \
146 if (config.mode == kDifPwmModeHeartbeat || \
147 config.mode == kDifPwmModeBlink) { \
148 mmio_region_write32(pwm->base_addr, \
149 PWM_BLINK_PARAM_##channel_##_REG_OFFSET, \
159#undef DIF_PWM_CHANNEL_CONFIG_CASE_
161 mmio_region_write32(pwm->
base_addr, PWM_INVERT_REG_OFFSET, invert_reg);
168 if (pwm == NULL || !dif_is_valid_toggle(enabled)) {
172 if (!mmio_region_read32(pwm->
base_addr, PWM_REGWEN_REG_OFFSET)) {
176 uint32_t config_reg = mmio_region_read32(pwm->
base_addr, PWM_CFG_REG_OFFSET);
177 config_reg = bitfield_bit32_write(config_reg, PWM_CFG_CNTR_EN_BIT,
178 dif_toggle_to_bool(enabled));
179 mmio_region_write32(pwm->
base_addr, PWM_CFG_REG_OFFSET, config_reg);
200 if (pwm == NULL || channels >= (1U << PWM_PARAM_N_OUTPUTS) ||
201 !dif_is_valid_toggle(enabled)) {
205 if (!mmio_region_read32(pwm->
base_addr, PWM_REGWEN_REG_OFFSET)) {
209 uint32_t enable_reg =
210 mmio_region_read32(pwm->
base_addr, PWM_PWM_EN_REG_OFFSET);
212 if (dif_toggle_to_bool(enabled)) {
213 enable_reg |= channels;
215 enable_reg &= ~channels;
218 mmio_region_write32(pwm->
base_addr, PWM_PWM_EN_REG_OFFSET, enable_reg);
226 if (pwm == NULL || is_enabled == NULL) {
230 uint32_t channel_bit = (uint32_t)bitfield_count_trailing_zeroes32(channel);
232 if (channel_bit >= PWM_PARAM_N_OUTPUTS) {
236 uint32_t enable_reg =
237 mmio_region_read32(pwm->
base_addr, PWM_PWM_EN_REG_OFFSET);
239 dif_bool_to_toggle(bitfield_bit32_read(enable_reg, channel_bit));