From 2c9515e467337257a9733e5222d0bcbee8e333e1 Mon Sep 17 00:00:00 2001 From: Oliver Barta Date: Sun, 27 Nov 2022 09:49:14 +0100 Subject: [PATCH 1/6] samples: basic: blinky_pwm: fix divider setting for rpi_pico The fractional part of the divider value is a 4 bit value. Setting it to 255 leads to an overflow in pwm_rpi_get_clkdiv(). This has resulted in a slight deviation from the reported timing, which is btw. printed in nsec. Fixes: c5cb0d1a3bcb ("samples: blinky_pwm: Fix sample for rpi_pico") Signed-off-by: Oliver Barta --- samples/basic/blinky_pwm/boards/rpi_pico.overlay | 2 +- samples/basic/blinky_pwm/src/main.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/samples/basic/blinky_pwm/boards/rpi_pico.overlay b/samples/basic/blinky_pwm/boards/rpi_pico.overlay index 45621c8ea8b60..c3a3f1ff5d391 100644 --- a/samples/basic/blinky_pwm/boards/rpi_pico.overlay +++ b/samples/basic/blinky_pwm/boards/rpi_pico.overlay @@ -4,6 +4,6 @@ &pwm { status = "okay"; - divider-frac-4 = <255>; + divider-frac-4 = <15>; divider-int-4 = <255>; }; diff --git a/samples/basic/blinky_pwm/src/main.c b/samples/basic/blinky_pwm/src/main.c index fb4b7e2741c81..102e8a220f10c 100644 --- a/samples/basic/blinky_pwm/src/main.c +++ b/samples/basic/blinky_pwm/src/main.c @@ -53,7 +53,7 @@ void main(void) } } - printk("Done calibrating; maximum/minimum periods %u/%lu usec\n", + printk("Done calibrating; maximum/minimum periods %u/%lu nsec\n", max_period, MIN_PERIOD); period = max_period; From 80f8c3c538df6ccd1aff787bbd991ae2ac639f5c Mon Sep 17 00:00:00 2001 From: Oliver Barta Date: Mon, 28 Nov 2022 11:28:43 +0100 Subject: [PATCH 2/6] samples: drivers: led_pwm: enable immediate logging mode The default deferred logging mode is not appropriate here. The LOG_INF messages "Turned on", "Turned off", ... indicate the current state and should be printed immediately to keep log output in sync with actual LED state. Signed-off-by: Oliver Barta --- samples/drivers/led_pwm/prj.conf | 2 ++ 1 file changed, 2 insertions(+) diff --git a/samples/drivers/led_pwm/prj.conf b/samples/drivers/led_pwm/prj.conf index 9faba6b41f24a..b6286f0aa56aa 100644 --- a/samples/drivers/led_pwm/prj.conf +++ b/samples/drivers/led_pwm/prj.conf @@ -3,3 +3,5 @@ CONFIG_LOG=y CONFIG_PWM=y CONFIG_LED=y + +CONFIG_LOG_MODE_IMMEDIATE=y From b4c2764d23ae0ed0628d3f98079c643dfadec721 Mon Sep 17 00:00:00 2001 From: Oliver Barta Date: Mon, 28 Nov 2022 12:04:19 +0100 Subject: [PATCH 3/6] samples: drivers: led_pwm: fix divider setting for rpi_pico The fractional part of the divider value is a 4 bit value. Fixes: 91f659d70ad3 ("samples: led_pwm: add overlay for rpi_pico board") Signed-off-by: Oliver Barta --- samples/drivers/led_pwm/boards/rpi_pico.overlay | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/drivers/led_pwm/boards/rpi_pico.overlay b/samples/drivers/led_pwm/boards/rpi_pico.overlay index 45621c8ea8b60..c3a3f1ff5d391 100644 --- a/samples/drivers/led_pwm/boards/rpi_pico.overlay +++ b/samples/drivers/led_pwm/boards/rpi_pico.overlay @@ -4,6 +4,6 @@ &pwm { status = "okay"; - divider-frac-4 = <255>; + divider-frac-4 = <15>; divider-int-4 = <255>; }; From 730abd3d1f35a0a41d271b9b2b2ad3338c80f932 Mon Sep 17 00:00:00 2001 From: Oliver Barta Date: Tue, 29 Nov 2022 08:56:04 +0100 Subject: [PATCH 4/6] boards: rpi_pico: avoid conflicting use of LED led0 and pwm_led0 are both referring to the same LED. The usage is mutualy exclusive, as only one pin muxing can be applied. Disabling child nodes is currently neither supported by gpio-leds device nor by pwm-leds device. We need to disable either of the devices completely for correct operation. Please note that even if disabling of child nodes would be supported, the devices would be empty anyway, as both have only one singe LED defined at the moment. Therefore we can completely disable one of the devices in any case. Fixes: b876ad9d6f0b ("boards: arm: rpi_pico: add pwm bindings to devictree") Signed-off-by: Oliver Barta --- boards/arm/rpi_pico/rpi_pico.dts | 2 +- samples/drivers/led_pwm/boards/rpi_pico.overlay | 10 ++++++++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/boards/arm/rpi_pico/rpi_pico.dts b/boards/arm/rpi_pico/rpi_pico.dts index 2bb675cd023bf..20fc1b09f2fda 100644 --- a/boards/arm/rpi_pico/rpi_pico.dts +++ b/boards/arm/rpi_pico/rpi_pico.dts @@ -40,8 +40,8 @@ pwm_leds { compatible = "pwm-leds"; + status = "disabled"; pwm_led0: pwm_led_0 { - status = "disabled"; pwms = <&pwm 9 PWM_MSEC(20) PWM_POLARITY_NORMAL>; label = "PWM_LED"; }; diff --git a/samples/drivers/led_pwm/boards/rpi_pico.overlay b/samples/drivers/led_pwm/boards/rpi_pico.overlay index c3a3f1ff5d391..565dcd6fbbab9 100644 --- a/samples/drivers/led_pwm/boards/rpi_pico.overlay +++ b/samples/drivers/led_pwm/boards/rpi_pico.overlay @@ -1,5 +1,11 @@ -&pwm_led0 { - status = "okay"; +/ { + leds { + status = "disabled"; + }; + + pwm_leds { + status = "okay"; + }; }; &pwm { From 8773022ba2ed9e0882e266d867617beef65585ec Mon Sep 17 00:00:00 2001 From: Oliver Barta Date: Wed, 30 Nov 2022 11:31:30 +0100 Subject: [PATCH 5/6] samples: basic: fade_led: add support for rpi_pico board PWM device needs to be enabled and configured on rpi_pico board. Signed-off-by: Oliver Barta --- samples/basic/fade_led/boards/rpi_pico.overlay | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 samples/basic/fade_led/boards/rpi_pico.overlay diff --git a/samples/basic/fade_led/boards/rpi_pico.overlay b/samples/basic/fade_led/boards/rpi_pico.overlay new file mode 100644 index 0000000000000..62c3a142cd4a6 --- /dev/null +++ b/samples/basic/fade_led/boards/rpi_pico.overlay @@ -0,0 +1,4 @@ +&pwm { + status = "okay"; + divider-int-4 = <255>; +}; From d4699392b0895b18ecf5a07af7a9238596d0733d Mon Sep 17 00:00:00 2001 From: Oliver Barta Date: Wed, 30 Nov 2022 17:01:44 +0100 Subject: [PATCH 6/6] drivers: pwm: rpi_pico: fix setting of cycle count per period pwm_set_wrap() sets the TOP value, not the number of cycles. Counter will run from 0 to TOP inclusive, generating TOP + 1 cycles. To get n cycles, we need to set TOP to (n - 1). The wrong setting made it impossible to achieve 100 % duty cycle, as there was always one extra cycle. Fixes: 7e0fff24c7ab ("drivers: pwm: add pwm driver for rpi_pico") Signed-off-by: Oliver Barta --- drivers/pwm/pwm_rpi_pico.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/pwm/pwm_rpi_pico.c b/drivers/pwm/pwm_rpi_pico.c index be540a8730fed..4b23cc558f15b 100644 --- a/drivers/pwm/pwm_rpi_pico.c +++ b/drivers/pwm/pwm_rpi_pico.c @@ -100,7 +100,7 @@ static int pwm_rpi_set_cycles(const struct device *dev, uint32_t ch, uint32_t pe return -EINVAL; } - if (period_cycles > PWM_RPI_PICO_COUNTER_TOP_MAX || + if (period_cycles - 1 > PWM_RPI_PICO_COUNTER_TOP_MAX || pulse_cycles > PWM_RPI_PICO_COUNTER_TOP_MAX) { return -EINVAL; } @@ -112,7 +112,7 @@ static int pwm_rpi_set_cycles(const struct device *dev, uint32_t ch, uint32_t pe pwm_rpi_set_channel_polarity(dev, slice, pico_channel, (flags & PWM_POLARITY_MASK) == PWM_POLARITY_INVERTED); - pwm_set_wrap(slice, period_cycles); + pwm_set_wrap(slice, period_cycles - 1); pwm_set_chan_level(slice, pico_channel, pulse_cycles); return 0;