19 if (pwm == NULL || config.
clock_divisor > PWM_CFG_CLK_DIV_MASK ||
25 if (!mmio_region_read32(pwm->
base_addr, PWM_REGWEN_REG_OFFSET)) {
32 uint32_t config_reg = mmio_region_read32(pwm->
base_addr, PWM_CFG_REG_OFFSET);
33 config_reg = bitfield_field32_write(config_reg, PWM_CFG_CLK_DIV_FIELD,
43 uint32_t dc_resn_val = 30u - (uint32_t)bitfield_count_leading_zeroes32(
46 bitfield_field32_write(config_reg, PWM_CFG_DC_RESN_FIELD, dc_resn_val);
49 mmio_region_write32(pwm->
base_addr, PWM_CFG_REG_OFFSET, 0);
50 mmio_region_write32(pwm->
base_addr, PWM_CFG_REG_OFFSET, config_reg);
61 channel >= PWM_PARAM_N_OUTPUTS) {
65 if (!mmio_region_read32(pwm->
base_addr, PWM_REGWEN_REG_OFFSET)) {
73 uint8_t duty_cycle_resolution = (uint8_t)bitfield_field32_read(
74 mmio_region_read32(pwm->
base_addr, PWM_CFG_REG_OFFSET),
75 PWM_CFG_DC_RESN_FIELD);
76 uint32_t beats_per_pulse_cycle = 1U << (duty_cycle_resolution + 1);
87 uint16_t phase_cntr_ticks_per_beat =
88 (uint16_t)(1 << (16 - duty_cycle_resolution - 1));
89 uint32_t duty_cycle_reg =
90 bitfield_field32_write(0, PWM_DUTY_CYCLE_0_A_0_FIELD,
93 bitfield_field32_write(duty_cycle_reg, PWM_DUTY_CYCLE_0_B_0_FIELD,
98 bitfield_field32_write(0, PWM_PWM_PARAM_0_PHASE_DELAY_0_FIELD,
102 bitfield_bit32_write(param_reg, PWM_PWM_PARAM_0_HTBT_EN_0_BIT,
true);
108 bitfield_bit32_write(param_reg, PWM_PWM_PARAM_0_BLINK_EN_0_BIT,
true);
112 uint32_t invert_reg =
113 mmio_region_read32(pwm->
base_addr, PWM_INVERT_REG_OFFSET);
116 uint32_t blink_param_reg = 0;
118 blink_param_reg = bitfield_field32_write(
126 blink_param_reg = bitfield_field32_write(
127 blink_param_reg, PWM_BLINK_PARAM_0_Y_0_FIELD,
131 bitfield_field32_write(blink_param_reg, PWM_BLINK_PARAM_0_Y_0_FIELD,
139 invert_reg = bitfield_bit32_write(
140 invert_reg, PWM_INVERT_INVERT_0_BIT + channel, config.
polarity);
143 ptrdiff_t reg_offset = (ptrdiff_t)(
sizeof(uint32_t) * channel);
144 mmio_region_write32(pwm->
base_addr, PWM_DUTY_CYCLE_0_REG_OFFSET + reg_offset,
146 mmio_region_write32(pwm->
base_addr, PWM_PWM_PARAM_0_REG_OFFSET + reg_offset,
150 PWM_BLINK_PARAM_0_REG_OFFSET + reg_offset,
154 mmio_region_write32(pwm->
base_addr, PWM_INVERT_REG_OFFSET, invert_reg);
161 if (pwm == NULL || !dif_is_valid_toggle(enabled)) {
165 if (!mmio_region_read32(pwm->
base_addr, PWM_REGWEN_REG_OFFSET)) {
169 uint32_t config_reg = mmio_region_read32(pwm->
base_addr, PWM_CFG_REG_OFFSET);
170 config_reg = bitfield_bit32_write(config_reg, PWM_CFG_CNTR_EN_BIT,
171 dif_toggle_to_bool(enabled));
172 mmio_region_write32(pwm->
base_addr, PWM_CFG_REG_OFFSET, config_reg);
193 if (pwm == NULL || channels >= (1U << PWM_PARAM_N_OUTPUTS) ||
194 !dif_is_valid_toggle(enabled)) {
198 if (!mmio_region_read32(pwm->
base_addr, PWM_REGWEN_REG_OFFSET)) {
202 uint32_t enable_reg =
203 mmio_region_read32(pwm->
base_addr, PWM_PWM_EN_REG_OFFSET);
205 if (dif_toggle_to_bool(enabled)) {
206 enable_reg |= channels;
208 enable_reg &= ~channels;
211 mmio_region_write32(pwm->
base_addr, PWM_PWM_EN_REG_OFFSET, enable_reg);