11 #include "gtest/gtest.h"
13 #include "sw/device/lib/base/mock_mmio.h"
19 namespace dif_pwm_unittest {
21 using ::mock_mmio::LeInt;
22 using ::mock_mmio::MmioTest;
23 using ::mock_mmio::MockDevice;
25 class PwmTest :
public testing::Test,
public MmioTest {
27 dif_pwm_t pwm_ = {.base_addr = dev().region()};
30 .beats_per_pulse_cycle = 64,
38 .blink_parameter_x = 10,
39 .blink_parameter_y = 8,
41 uint32_t duty_cycle_resolution_ =
43 uint32_t phase_cntr_ticks_per_beat_ =
44 (1U << (16 - duty_cycle_resolution_ - 1));
53 TEST_F(ConfigTest, BadArgs) {
55 config_.clock_divisor = PWM_CFG_CLK_DIV_MASK + 1;
56 config_.beats_per_pulse_cycle = 2;
60 config_.clock_divisor = 2;
61 config_.beats_per_pulse_cycle = (1U << (PWM_CFG_DC_RESN_MASK + 1)) + 1;
65 config_.clock_divisor = 2;
66 config_.beats_per_pulse_cycle = 1;
70 TEST_F(ConfigTest, Locked) {
71 EXPECT_READ32(PWM_REGWEN_REG_OFFSET, 0);
75 TEST_F(ConfigTest, Success) {
76 EXPECT_READ32(PWM_REGWEN_REG_OFFSET, 1);
77 EXPECT_READ32(PWM_CFG_REG_OFFSET, 1U << 31);
78 EXPECT_WRITE32(PWM_CFG_REG_OFFSET, 0);
79 EXPECT_WRITE32(PWM_CFG_REG_OFFSET, {{PWM_CFG_CLK_DIV_OFFSET, 2},
80 {PWM_CFG_DC_RESN_OFFSET, 5},
81 {PWM_CFG_CNTR_EN_BIT, 1}})
92 TEST_F(ConfigChannelTest, Locked) {
93 EXPECT_READ32(PWM_REGWEN_REG_OFFSET, 0);
98 TEST_F(ConfigChannelTest, BadChannel) {
99 EXPECT_READ32(PWM_REGWEN_REG_OFFSET, 1);
100 EXPECT_READ32(PWM_CFG_REG_OFFSET,
101 {{PWM_CFG_DC_RESN_OFFSET, duty_cycle_resolution_}});
102 EXPECT_READ32(PWM_INVERT_REG_OFFSET, 0);
108 EXPECT_READ32(PWM_REGWEN_REG_OFFSET, 1);
109 EXPECT_READ32(PWM_CFG_REG_OFFSET,
110 {{PWM_CFG_DC_RESN_OFFSET, duty_cycle_resolution_}});
111 EXPECT_READ32(PWM_INVERT_REG_OFFSET, 0);
116 TEST_F(ConfigChannelTest, BadDutyCycle) {
117 EXPECT_READ32(PWM_REGWEN_REG_OFFSET, 1);
118 EXPECT_READ32(PWM_CFG_REG_OFFSET,
119 {{PWM_CFG_DC_RESN_OFFSET, duty_cycle_resolution_}});
121 channel_config_.duty_cycle_a = config_.beats_per_pulse_cycle;
125 EXPECT_READ32(PWM_REGWEN_REG_OFFSET, 1);
126 EXPECT_READ32(PWM_CFG_REG_OFFSET,
127 {{PWM_CFG_DC_RESN_OFFSET, duty_cycle_resolution_}});
128 channel_config_.duty_cycle_a = 24;
129 channel_config_.duty_cycle_b = config_.beats_per_pulse_cycle;
134 TEST_F(ConfigChannelTest, BadPhaseDelay) {
135 EXPECT_READ32(PWM_REGWEN_REG_OFFSET, 1);
136 EXPECT_READ32(PWM_CFG_REG_OFFSET,
137 {{PWM_CFG_DC_RESN_OFFSET, duty_cycle_resolution_}});
139 channel_config_.phase_delay = config_.beats_per_pulse_cycle;
144 TEST_F(ConfigChannelTest, BadMode) {
145 EXPECT_READ32(PWM_REGWEN_REG_OFFSET, 1);
146 EXPECT_READ32(PWM_CFG_REG_OFFSET,
147 {{PWM_CFG_DC_RESN_OFFSET, duty_cycle_resolution_}});
148 EXPECT_READ32(PWM_INVERT_REG_OFFSET, 0);
155 TEST_F(ConfigChannelTest, BadPolarity) {
161 TEST_F(ConfigChannelTest, BadBlinkParameterX) {
162 EXPECT_READ32(PWM_REGWEN_REG_OFFSET, 1);
163 EXPECT_READ32(PWM_CFG_REG_OFFSET,
164 {{PWM_CFG_DC_RESN_OFFSET, duty_cycle_resolution_}});
165 EXPECT_READ32(PWM_INVERT_REG_OFFSET, 0);
168 channel_config_.blink_parameter_y = config_.beats_per_pulse_cycle;
173 TEST_F(ConfigChannelTest, FirmwareModeSuccess) {
174 EXPECT_READ32(PWM_REGWEN_REG_OFFSET, 1);
175 EXPECT_READ32(PWM_CFG_REG_OFFSET,
176 {{PWM_CFG_DC_RESN_OFFSET, duty_cycle_resolution_}});
177 EXPECT_READ32(PWM_INVERT_REG_OFFSET, 0);
178 EXPECT_WRITE32(PWM_DUTY_CYCLE_0_REG_OFFSET,
179 {{PWM_DUTY_CYCLE_0_A_0_OFFSET,
180 channel_config_.duty_cycle_a * phase_cntr_ticks_per_beat_},
181 {PWM_DUTY_CYCLE_0_B_0_OFFSET,
182 channel_config_.duty_cycle_b * phase_cntr_ticks_per_beat_}});
183 EXPECT_WRITE32(PWM_PWM_PARAM_0_REG_OFFSET,
184 {{PWM_PWM_PARAM_0_PHASE_DELAY_0_OFFSET,
185 channel_config_.phase_delay * phase_cntr_ticks_per_beat_},
186 {PWM_PWM_PARAM_0_HTBT_EN_0_BIT, 0},
187 {PWM_PWM_PARAM_0_BLINK_EN_0_BIT, 0}});
188 EXPECT_WRITE32(PWM_INVERT_REG_OFFSET, 0);
194 TEST_F(ConfigChannelTest, BlinkModeSuccess) {
195 EXPECT_READ32(PWM_REGWEN_REG_OFFSET, 1);
196 EXPECT_READ32(PWM_CFG_REG_OFFSET,
197 {{PWM_CFG_DC_RESN_OFFSET, duty_cycle_resolution_}});
198 EXPECT_READ32(PWM_INVERT_REG_OFFSET, 0);
199 EXPECT_WRITE32(PWM_DUTY_CYCLE_0_REG_OFFSET,
200 {{PWM_DUTY_CYCLE_0_A_0_OFFSET,
201 channel_config_.duty_cycle_a * phase_cntr_ticks_per_beat_},
202 {PWM_DUTY_CYCLE_0_B_0_OFFSET,
203 channel_config_.duty_cycle_b * phase_cntr_ticks_per_beat_}});
204 EXPECT_WRITE32(PWM_PWM_PARAM_0_REG_OFFSET,
205 {{PWM_PWM_PARAM_0_PHASE_DELAY_0_OFFSET,
206 channel_config_.phase_delay * phase_cntr_ticks_per_beat_},
207 {PWM_PWM_PARAM_0_HTBT_EN_0_BIT, 0},
208 {PWM_PWM_PARAM_0_BLINK_EN_0_BIT, 1}});
210 PWM_BLINK_PARAM_0_REG_OFFSET,
211 {{PWM_BLINK_PARAM_0_Y_0_OFFSET, channel_config_.blink_parameter_y},
212 {PWM_BLINK_PARAM_0_X_0_OFFSET, channel_config_.blink_parameter_x}});
213 EXPECT_WRITE32(PWM_INVERT_REG_OFFSET, 0);
220 TEST_F(ConfigChannelTest, HeartbeatModeSuccess) {
221 EXPECT_READ32(PWM_REGWEN_REG_OFFSET, 1);
222 EXPECT_READ32(PWM_CFG_REG_OFFSET,
223 {{PWM_CFG_DC_RESN_OFFSET, duty_cycle_resolution_}});
224 EXPECT_READ32(PWM_INVERT_REG_OFFSET, 0);
225 EXPECT_WRITE32(PWM_DUTY_CYCLE_0_REG_OFFSET,
226 {{PWM_DUTY_CYCLE_0_A_0_OFFSET,
227 channel_config_.duty_cycle_a * phase_cntr_ticks_per_beat_},
228 {PWM_DUTY_CYCLE_0_B_0_OFFSET,
229 channel_config_.duty_cycle_b * phase_cntr_ticks_per_beat_}});
230 EXPECT_WRITE32(PWM_PWM_PARAM_0_REG_OFFSET,
231 {{PWM_PWM_PARAM_0_PHASE_DELAY_0_OFFSET,
232 channel_config_.phase_delay * phase_cntr_ticks_per_beat_},
233 {PWM_PWM_PARAM_0_HTBT_EN_0_BIT, 1},
234 {PWM_PWM_PARAM_0_BLINK_EN_0_BIT, 1}});
236 PWM_BLINK_PARAM_0_REG_OFFSET,
237 {{PWM_BLINK_PARAM_0_Y_0_OFFSET,
238 channel_config_.blink_parameter_y * phase_cntr_ticks_per_beat_},
239 {PWM_BLINK_PARAM_0_X_0_OFFSET, channel_config_.blink_parameter_x}});
240 EXPECT_WRITE32(PWM_INVERT_REG_OFFSET, 0);
253 TEST_F(PhaseCntrSetEnabledTest, BadArgs) {
258 TEST_F(PhaseCntrSetEnabledTest, Locked) {
259 EXPECT_READ32(PWM_REGWEN_REG_OFFSET, 0);
264 TEST_F(PhaseCntrSetEnabledTest, Success) {
265 EXPECT_READ32(PWM_REGWEN_REG_OFFSET, 1);
266 EXPECT_READ32(PWM_CFG_REG_OFFSET, 0);
267 EXPECT_WRITE32(PWM_CFG_REG_OFFSET, {{PWM_CFG_CNTR_EN_BIT, 1}});
279 TEST_F(PhaseCntrGetEnabledTest, Success) {
282 EXPECT_READ32(PWM_CFG_REG_OFFSET, {{PWM_CFG_CNTR_EN_BIT, 1}});
286 EXPECT_READ32(PWM_CFG_REG_OFFSET, {{PWM_CFG_CNTR_EN_BIT, 0}});
297 TEST_F(PwmChannelSetEnabledTest, BadArgs) {
304 TEST_F(PwmChannelSetEnabledTest, Locked) {
305 EXPECT_READ32(PWM_REGWEN_REG_OFFSET, 0);
311 TEST_F(PwmChannelSetEnabledTest, Success) {
313 EXPECT_READ32(PWM_REGWEN_REG_OFFSET, 1);
314 EXPECT_READ32(PWM_PWM_EN_REG_OFFSET, 0xA);
315 EXPECT_WRITE32(PWM_PWM_EN_REG_OFFSET, 0x1E);
320 EXPECT_READ32(PWM_REGWEN_REG_OFFSET, 1);
321 EXPECT_READ32(PWM_PWM_EN_REG_OFFSET, 0x1A);
322 EXPECT_WRITE32(PWM_PWM_EN_REG_OFFSET, 0x2);
337 TEST_F(PwmChannelGetEnabledTest, BadArgs) {
344 TEST_F(PwmChannelGetEnabledTest, Success) {
347 EXPECT_READ32(PWM_PWM_EN_REG_OFFSET, 0xA);
352 EXPECT_READ32(PWM_PWM_EN_REG_OFFSET, 0xA);
362 TEST_F(PwmLockTest, Success) {
363 EXPECT_WRITE32(PWM_REGWEN_REG_OFFSET, {{PWM_REGWEN_REGWEN_BIT, 0}});
375 TEST_F(PwmIsLockedTest, Success) {
378 EXPECT_READ32(PWM_REGWEN_REG_OFFSET, {{PWM_REGWEN_REGWEN_BIT, 1}});
380 EXPECT_FALSE(is_locked);
382 EXPECT_READ32(PWM_REGWEN_REG_OFFSET, {{PWM_REGWEN_REGWEN_BIT, 0}});
384 EXPECT_TRUE(is_locked);