You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by ac...@apache.org on 2022/06/23 13:17:45 UTC
[incubator-nuttx] 01/02: Added PWM support for rp2040
This is an automated email from the ASF dual-hosted git repository.
acassis pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-nuttx.git
commit 75facdee728967824472901504a61aba8fa347cb
Author: curuvar <58...@users.noreply.github.com>
AuthorDate: Wed Jun 22 20:23:07 2022 -0400
Added PWM support for rp2040
---
.gitignore | 4 +
arch/arm/Kconfig | 1 +
arch/arm/src/rp2040/Kconfig | 76 ++++++
arch/arm/src/rp2040/Make.defs | 4 +
boards/arm/rp2040/common/src/Make.defs | 4 +
boards/arm/rp2040/pimoroni-tiny2040/Kconfig | 266 ++++++++++++++++++
boards/arm/rp2040/pimoroni-tiny2040/README.txt | 1 +
.../rp2040/pimoroni-tiny2040/src/rp2040_bringup.c | 279 +++++++++++++++++++
boards/arm/rp2040/raspberrypi-pico/Kconfig | 304 +++++++++++++++++++++
boards/arm/rp2040/raspberrypi-pico/README.txt | 1 +
.../rp2040/raspberrypi-pico/src/rp2040_bringup.c | 279 +++++++++++++++++++
11 files changed, 1219 insertions(+)
diff --git a/.gitignore b/.gitignore
index b632f78ca3..658e3c09b5 100644
--- a/.gitignore
+++ b/.gitignore
@@ -30,6 +30,7 @@
.depend
/.config
/.config.old
+/.config\ *
/.cproject
/.gdbinit
/.project
@@ -50,5 +51,8 @@ uImage
/external
# $(TOPDIR)/Makefile.[unix|win]::$(CONTEXTDIRS_DEPS)
.context
+.context\ *
# $(TOPDIR)/Makefile.[unix|win]::$(DIRLINKS_EXTERNAL_DIRS)
.dirlinks
+.vscode
+.DS_Store
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
index 8061da504c..da54cacfa5 100644
--- a/arch/arm/Kconfig
+++ b/arch/arm/Kconfig
@@ -235,6 +235,7 @@ config ARCH_CHIP_RP2040
select ARCH_HAVE_I2CRESET
select ARM_HAVE_WFE_SEV
select LIBC_ARCH_ATOMIC
+ select ARCH_HAVE_PWM_MULTICHAN
---help---
Raspberry Pi RP2040 architectures (ARM dual Cortex-M0+).
diff --git a/arch/arm/src/rp2040/Kconfig b/arch/arm/src/rp2040/Kconfig
index cd0c35cf59..79913bb041 100644
--- a/arch/arm/src/rp2040/Kconfig
+++ b/arch/arm/src/rp2040/Kconfig
@@ -141,6 +141,82 @@ config RP2040_I2C_DRIVER
endif
+config RP2040_PWM
+ bool "PWM"
+ select PWM
+ ---help---
+ After enabling PWM support here, configure the GPIO pins to use
+ under the Board Selection menu.
+
+if RP2040_PWM
+
+config PWM_MULTICHAN
+ bool "Support Multi-Channel PWM"
+ default y
+ ---help---
+ If support for multi-channel PWM is disabled, the generated code
+ will only support the A channel of the PWM slices.
+
+ if PWM_MULTICHAN
+ config PWM_NCHANNELS
+ int "Number of channels"
+ default 2
+ ---help---
+ If the number of channels is set to 1, the generated code will
+ only support the A channel of the PWM slices. This is functionally
+ identical to disabling multi-channel PWM support.
+ endif
+
+ config RP2040_PWM0
+ bool "PWM0"
+ ---help---
+ Drives GPIO pin 0 or 16 with the A channel, and
+ drives GPIO pin 1 or 17 with the B channel.
+
+ config RP2040_PWM1
+ bool "PWM1"
+ ---help---
+ Drives GPIO pin 2 or 18 with the A channel, and
+ drives GPIO pin 3 or 19 with the B channel.
+
+ config RP2040_PWM2
+ bool "PWM2"
+ ---help---
+ Drives GPIO pin 4 or 20 with the A channel, and
+ drives GPIO pin 5 or 21 with the B channel.
+
+ config RP2040_PWM3
+ bool "PWM3"
+ ---help---
+ Drives GPIO pin 6 or 22 with the A channel, and
+ drives GPIO pin 7 or 23 with the B channel.
+
+ config RP2040_PWM4
+ bool "PWM4"
+ ---help---
+ Drives GPIO pin 8 or 24 with the A channel, and
+ drives GPIO pin 9 or 25 with the B channel.
+
+ config RP2040_PWM5
+ bool "PWM5"
+ ---help---
+ Drives GPIO pin 10 or 26 with the A channel, and
+ drives GPIO pin 11 or 27 with the B channel.
+
+ config RP2040_PWM6
+ bool "PWM6"
+ ---help---
+ Drives GPIO pin 12 or 28 with the A channel, and
+ drives GPIO pin 13 or 29 with the B channel.
+
+ config RP2040_PWM7
+ bool "PWM7 (Pin 14 and 15)"
+ ---help---
+ Drives GPIO pin 14 with the A channel, and
+ drives GPIO pin 15 with the B channel.
+
+endif
+
config RP2040_I2S
bool "I2S"
select I2S
diff --git a/arch/arm/src/rp2040/Make.defs b/arch/arm/src/rp2040/Make.defs
index 95fe8d1d24..d9819d9a67 100644
--- a/arch/arm/src/rp2040/Make.defs
+++ b/arch/arm/src/rp2040/Make.defs
@@ -49,6 +49,10 @@ ifeq ($(CONFIG_RP2040_SPI),y)
CHIP_CSRCS += rp2040_spi.c
endif
+ifeq ($(CONFIG_RP2040_PWM),y)
+CHIP_CSRCS += rp2040_pwm.c
+endif
+
ifeq ($(CONFIG_RP2040_I2C),y)
CHIP_CSRCS += rp2040_i2c.c
endif
diff --git a/boards/arm/rp2040/common/src/Make.defs b/boards/arm/rp2040/common/src/Make.defs
index 1fa5ecb93a..0f6c36cfec 100644
--- a/boards/arm/rp2040/common/src/Make.defs
+++ b/boards/arm/rp2040/common/src/Make.defs
@@ -24,6 +24,10 @@ ifeq ($(CONFIG_RP2040_I2C_DRIVER),y)
CSRCS += rp2040_i2cdev.c
endif
+ifeq ($(CONFIG_RP2040_PWM),y)
+CSRCS += rp2040_pwmdev.c
+endif
+
ifeq ($(CONFIG_RP2040_SPI_DRIVER),y)
CSRCS += rp2040_spidev.c
endif
diff --git a/boards/arm/rp2040/pimoroni-tiny2040/Kconfig b/boards/arm/rp2040/pimoroni-tiny2040/Kconfig
index 5c8bab8ca5..a021973340 100644
--- a/boards/arm/rp2040/pimoroni-tiny2040/Kconfig
+++ b/boards/arm/rp2040/pimoroni-tiny2040/Kconfig
@@ -50,6 +50,272 @@ config RP2040_I2C1_GPIO
range -1 29
depends on RP2040_I2C1
+if RP2040_PWM0
+ config RP2040_PWM0A_GPIO
+ int "PWM0 channel 1 GPIO pin assign (0 or -1:no assign)"
+ default 0
+ range -1 16
+ ---help---
+ This sets the GPIO pin to use for the A channel it must be
+ either 0, any other value disables the output.
+
+ config RP2040_PWM0A_INVERT
+ bool "PWM0 channel 1 invert"
+ default n
+ ---help---
+ If invert is enabled, the PWM on the A pin will idle high
+ with the pulse going low.
+
+ if PWM_MULTICHAN && PWM_NCHANNELS > 1
+ config RP2040_PWM0B_GPIO
+ int "PWM0 channel 2 GPIO pin assign (1 or -1:no assign)"
+ default 1
+ range -1 29
+ ---help---
+ This sets the GPIO pin to use for the B channel it must be
+ either 1, any other value disables the output.
+
+ config RP2040_PWM0B_INVERT
+ bool "PWM0 channel 2 invert"
+ default n
+ ---help---
+ If invert is enabled, the PWM on the B pin will idle high
+ with the pulse going low.
+ endif
+
+ config RP2040_PWM0_PHASE_CORRECT
+ bool "PWM0 phase correct"
+ default n
+endif
+
+if RP2040_PWM1
+ config RP2040_PWM1A_GPIO
+ int "PWM1 channel 1 GPIO pin assign (2, 18 or -1:no assign)"
+ default 2
+ range -1 29
+ ---help---
+ This sets the GPIO pin to use for the A channel it must be
+ either 2 or 18, any other value disables the output.
+
+ config RP2040_PWM1A_INVERT
+ bool "PWM1 channel 1 invert"
+ default n
+ ---help---
+ If invert is enabled, the PWM on the A pin will idle high
+ with the pulse going low.
+
+ if PWM_MULTICHAN && PWM_NCHANNELS > 1
+ config RP2040_PWM1B_GPIO
+ int "PWM1 channel 2 GPIO pin assign (3, 19 or -1:no assign)"
+ default 3
+ range -1 29
+ ---help---
+ This sets the GPIO pin to use for the B channel it must be
+ either 3 or 19, any other value disables the output.
+
+ config RP2040_PWM1B_INVERT
+ bool "PWM1 channel 2 invert"
+ default n
+ ---help---
+ If invert is enabled, the PWM on the B pin will idle high
+ with the pulse going low.
+ endif
+
+ config RP2040_PWM1_PHASE_CORRECT
+ bool "PWM1 phase correct"
+ default n
+endif
+
+if RP2040_PWM2
+ config RP2040_PWM2A_GPIO
+ int "PWM2 channel 1 GPIO pin assign (4, 20 or -1:no assign)"
+ default 4
+ range -1 29
+ ---help---
+ This sets the GPIO pin to use for the A channel it must be
+ either 4 or 20, any other value disables the output.
+
+ config RP2040_PWM2A_INVERT
+ bool "PWM2 channel 1 invert"
+ default n
+ ---help---
+ If invert is enabled, the PWM on the A pin will idle high
+ with the pulse going low.
+
+ if PWM_MULTICHAN && PWM_NCHANNELS > 1
+ config RP2040_PWM2B_GPIO
+ int "PWM2 channel 2 GPIO pin assign (5, 21 or -1:no assign)"
+ default 5
+ range -1 29
+ ---help---
+ This sets the GPIO pin to use for the B channel it must be
+ either 5 or 21, any other value disables the output.
+
+ config RP2040_PWM2B_INVERT
+ bool "PWM2 channel 2 invert"
+ default n
+ ---help---
+ If invert is enabled, the PWM on the B pin will idle high
+ with the pulse going low.
+ endif
+
+ config RP2040_PWM2_PHASE_CORRECT
+ bool "PWM2 phase correct"
+ default n
+endif
+
+if RP2040_PWM3
+ config RP2040_PWM3A_GPIO
+ int "PWM3 channel 1 GPIO pin assign (6 or -1:no assign)"
+ default 6
+ range -1 29
+ ---help---
+ This sets the GPIO pin to use for the A channel it must be
+ either 6, any other value disables the output.
+
+ config RP2040_PWM3A_INVERT
+ bool "PWM3 channel 1 invert"
+ default n
+ ---help---
+ If invert is enabled, the PWM on the A pin will idle high
+ with the pulse going low.
+
+ if PWM_MULTICHAN && PWM_NCHANNELS > 1
+ config RP2040_PWM3B_GPIO
+ int "PWM3 channel 2 GPIO pin assign (7 or -1:no assign)"
+ default 7
+ range -1 29
+ ---help---
+ This sets the GPIO pin to use for the B channel it must be
+ either 7, any other value disables the output.
+
+ config RP2040_PWM3B_INVERT
+ bool "PWM3 channel 2 invert"
+ default n
+ ---help---
+ If invert is enabled, the PWM on the B pin will idle high
+ with the pulse going low.
+ endif
+
+ config RP2040_PWM3_PHASE_CORRECT
+ bool "PWM3 phase correct"
+ default n
+endif
+
+if RP2040_PWM5
+ config RP2040_PWM5A_GPIO
+ int "PWM5 channel 1 GPIO pin assign (26 or -1:no assign)"
+ default 26
+ range -1 29
+ ---help---
+ This sets the GPIO pin to use for the A channel it must be
+ either 26, any other value disables the output.
+
+ config RP2040_PWM5A_INVERT
+ bool "PWM5 channel 1 invert"
+ default n
+ ---help---
+ If invert is enabled, the PWM on the A pin will idle high
+ with the pulse going low.
+
+ if PWM_MULTICHAN && PWM_NCHANNELS > 1
+ config RP2040_PWM5B_GPIO
+ int "PWM5 channel 2 GPIO pin assign (27 or -1:no assign)"
+ default 27
+ range -1 29
+ ---help---
+ This sets the GPIO pin to use for the B channel it must be
+ either 27, any other value disables the output.
+
+ config RP2040_PWM5B_INVERT
+ bool "PWM5 channel 2 invert"
+ default n
+ ---help---
+ If invert is enabled, the PWM on the B pin will idle high
+ with the pulse going low.
+ endif
+
+ config RP2040_PWM5_PHASE_CORRECT
+ bool "PWM5 phase correct"
+ default n
+endif
+
+if RP2040_PWM6
+ config RP2040_PWM6A_GPIO
+ int "PWM6 channel 1 GPIO pin assign (28 or -1:no assign)"
+ default 28
+ range -1 29
+ ---help---
+ This sets the GPIO pin to use for the A channel it must be
+ either 28, any other value disables the output.
+
+ config RP2040_PWM6A_INVERT
+ bool "PWM6 channel 1 invert"
+ default n
+ ---help---
+ If invert is enabled, the PWM on the A pin will idle high
+ with the pulse going low.
+
+ if PWM_MULTICHAN && PWM_NCHANNELS > 1
+ config RP2040_PWM6B_GPIO
+ int "PWM6 channel 2 GPIO pin assign (29 or -1:no assign)"
+ default 29
+ range -1 29
+ ---help---
+ This sets the GPIO pin to use for the B channel it must be
+ either 29, any other value disables the output.
+
+ config RP2040_PWM6B_INVERT
+ bool "PWM6 channel 2 invert"
+ default n
+ ---help---
+ If invert is enabled, the PWM on the B pin will idle high
+ with the pulse going low.
+ endif
+
+ config RP2040_PWM6_PHASE_CORRECT
+ bool "PWM6 phase correct"
+ default n
+endif
+
+if RP2040_PWM7
+ config RP2040_PWM7A_GPIO
+ int "PWM7 channel 1 GPIO pin assign (14 or -1:no assign)"
+ default 14
+ range -1 29
+ ---help---
+ This sets the GPIO pin to use for the A channel it must be
+ either 14, any other value disables the output.
+
+ config RP2040_PWM7A_INVERT
+ bool "PWM7 channel 1 invert"
+ default n
+ ---help---
+ If invert is enabled, the PWM on the A pin will idle high
+ with the pulse going low.
+
+ if PWM_MULTICHAN && PWM_NCHANNELS > 1
+ config RP2040_PWM7B_GPIO
+ int "PWM7 channel 2 GPIO pin assign (15 or -1:no assign)"
+ default 15
+ range -1 29
+ ---help---
+ This sets the GPIO pin to use for the B channel it must be
+ either 15, any other value disables the output.
+
+ config RP2040_PWM7B_INVERT
+ bool "PWM7 channel 2 invert"
+ default n
+ ---help---
+ If invert is enabled, the PWM on the B pin will idle high
+ with the pulse going low.
+ endif
+
+ config RP2040_PWM7_PHASE_CORRECT
+ bool "PWM7 phase correct"
+ default n
+endif
+
config RP2040_SPI0_GPIO
int "SPI0 GPIO pin assign (0,4,16,20 or -1:no assign)"
default -1
diff --git a/boards/arm/rp2040/pimoroni-tiny2040/README.txt b/boards/arm/rp2040/pimoroni-tiny2040/README.txt
index 04ce9d17b5..c742f8c037 100644
--- a/boards/arm/rp2040/pimoroni-tiny2040/README.txt
+++ b/boards/arm/rp2040/pimoroni-tiny2040/README.txt
@@ -16,6 +16,7 @@ Currently only the following devices are supported.
- I2C (not tested on Tiny 2040)
- SPI
- DMAC
+ - PWM
- USB device
- MSC, CDC/ACM serial and these composite device are supported.
- CDC/ACM serial device can be used for the console.
diff --git a/boards/arm/rp2040/pimoroni-tiny2040/src/rp2040_bringup.c b/boards/arm/rp2040/pimoroni-tiny2040/src/rp2040_bringup.c
index 755dfb9241..99e8657d82 100644
--- a/boards/arm/rp2040/pimoroni-tiny2040/src/rp2040_bringup.c
+++ b/boards/arm/rp2040/pimoroni-tiny2040/src/rp2040_bringup.c
@@ -33,6 +33,11 @@
#include "rp2040_tiny2040.h"
+#ifdef CONFIG_RP2040_PWM
+#include "rp2040_pwm.h"
+#include "rp2040_pwmdev.h"
+#endif
+
/****************************************************************************
* Public Functions
****************************************************************************/
@@ -119,5 +124,279 @@ int rp2040_bringup(void)
}
#endif
+#ifdef CONFIG_RP2040_PWM
+# ifdef CONFIG_RP2040_PWM0
+# if defined(CONFIG_PWM_NCHANNELS) && CONFIG_PWM_NCHANNELS == 2
+ ret = rp2040_pwmdev_initialize(0,
+ CONFIG_RP2040_PWM0A_GPIO,
+ CONFIG_RP2040_PWM0B_GPIO,
+ (0
+# ifdef CONFIG_RP2040_PWM0A_INVERT
+ | RP2040_PWM_CSR_A_INV
+# endif
+# ifdef CONFIG_RP2040_PWM0B_INVERT
+ | RP2040_PWM_CSR_B_INV
+# endif
+# ifdef CONFIG_RP2040_PWM0_PHASE_CORRECT
+ | RP2040_PWM_CSR_PH_CORRECT
+# endif
+ ));
+# else
+ ret = rp2040_pwmdev_initialize(0,
+ CONFIG_RP2040_PWM0A_GPIO,
+ (0
+# ifdef CONFIG_RP2040_PWM0A_INVERT
+ | RP2040_PWM_CSR_A_INV
+# endif
+# ifdef CONFIG_RP2040_PWM0_PHASE_CORRECT
+ | RP2040_PWM_CSR_PH_CORRECT
+# endif
+ ));
+# endif
+ if (ret < 0)
+ {
+ _err("ERROR: Failed to initialize PWM0.\n");
+ }
+# endif
+
+# ifdef CONFIG_RP2040_PWM1
+# if defined(CONFIG_PWM_NCHANNELS) && CONFIG_PWM_NCHANNELS == 2
+ ret = rp2040_pwmdev_initialize(1,
+ CONFIG_RP2040_PWM1A_GPIO,
+ CONFIG_RP2040_PWM1B_GPIO,
+ (0
+# ifdef CONFIG_RP2040_PWM1A_INVERT
+ | RP2040_PWM_CSR_A_INV
+# endif
+# ifdef CONFIG_RP2040_PWM1B_INVERT
+ | RP2040_PWM_CSR_B_INV
+# endif
+# ifdef CONFIG_RP2040_PWM1_PHASE_CORRECT
+ | RP2040_PWM_CSR_PH_CORRECT
+# endif
+ ));
+# else
+ ret = rp2040_pwmdev_initialize(1,
+ CONFIG_RP2040_PWM1A_GPIO,
+ (0
+# ifdef CONFIG_RP2040_PWM1A_INVERT
+ | RP2040_PWM_CSR_A_INV
+# endif
+# ifdef CONFIG_RP2040_PWM1_PHASE_CORRECT
+ | RP2040_PWM_CSR_PH_CORRECT
+# endif
+ ));
+# endif
+ if (ret < 0)
+ {
+ _err("ERROR: Failed to initialize PWM1.\n");
+ }
+# endif
+
+# ifdef CONFIG_RP2040_PWM2
+# if defined(CONFIG_PWM_NCHANNELS) && CONFIG_PWM_NCHANNELS == 2
+ ret = rp2040_pwmdev_initialize(2,
+ CONFIG_RP2040_PWM2A_GPIO,
+ CONFIG_RP2040_PWM2B_GPIO,
+ (0
+# ifdef CONFIG_RP2040_PWM2A_INVERT
+ | RP2040_PWM_CSR_A_INV
+# endif
+# ifdef CONFIG_RP2040_PWM2B_INVERT
+ | RP2040_PWM_CSR_B_INV
+# endif
+# ifdef CONFIG_RP2040_PWM2_PHASE_CORRECT
+ | RP2040_PWM_CSR_PH_CORRECT
+# endif
+ ));
+# else
+ ret = rp2040_pwmdev_initialize(2,
+ CONFIG_RP2040_PWM2A_GPIO,
+ (0
+# ifdef CONFIG_RP2040_PWM2A_INVERT
+ | RP2040_PWM_CSR_A_INV
+# endif
+# ifdef CONFIG_RP2040_PWM2_PHASE_CORRECT
+ | RP2040_PWM_CSR_PH_CORRECT
+# endif
+ ));
+# endif
+ if (ret < 0)
+ {
+ _err("ERROR: Failed to initialize PWM2.\n");
+ }
+# endif
+
+# ifdef CONFIG_RP2040_PWM3
+# if defined(CONFIG_PWM_NCHANNELS) && CONFIG_PWM_NCHANNELS == 2
+ ret = rp2040_pwmdev_initialize(3,
+ CONFIG_RP2040_PWM3A_GPIO,
+ CONFIG_RP2040_PWM3B_GPIO,
+ (0
+# ifdef CONFIG_RP2040_PWM3A_INVERT
+ | RP2040_PWM_CSR_A_INV
+# endif
+# ifdef CONFIG_RP2040_PWM3B_INVERT
+ | RP2040_PWM_CSR_B_INV
+# endif
+# ifdef CONFIG_RP2040_PWM3_PHASE_CORRECT
+ | RP2040_PWM_CSR_PH_CORRECT
+# endif
+ ));
+# else
+ ret = rp2040_pwmdev_initialize(3,
+ CONFIG_RP2040_PWM3A_GPIO,
+ (0
+# ifdef CONFIG_RP2040_PWM3A_INVERT
+ | RP2040_PWM_CSR_A_INV
+# endif
+# ifdef CONFIG_RP2040_PWM3_PHASE_CORRECT
+ | RP2040_PWM_CSR_PH_CORRECT
+# endif
+ ));
+# endif
+ if (ret < 0)
+ {
+ _err("ERROR: Failed to initialize PWM3.\n");
+ }
+# endif
+
+# ifdef CONFIG_RP2040_PWM4
+# if defined(CONFIG_PWM_NCHANNELS) && CONFIG_PWM_NCHANNELS == 2
+ ret = rp2040_pwmdev_initialize(4,
+ CONFIG_RP2040_PWM4A_GPIO,
+ CONFIG_RP2040_PWM4B_GPIO,
+ (0
+# ifdef CONFIG_RP2040_PWM4A_INVERT
+ | RP2040_PWM_CSR_A_INV
+# endif
+# ifdef CONFIG_RP2040_PWM4B_INVERT
+ | RP2040_PWM_CSR_B_INV
+# endif
+# ifdef CONFIG_RP2040_PWM4_PHASE_CORRECT
+ | RP2040_PWM_CSR_PH_CORRECT
+# endif
+ ));
+# else
+ ret = rp2040_pwmdev_initialize(4,
+ CONFIG_RP2040_PWM4A_GPIO,
+ (0
+# ifdef CONFIG_RP2040_PWM4A_INVERT
+ | RP2040_PWM_CSR_A_INV
+# endif
+# ifdef CONFIG_RP2040_PWM4_PHASE_CORRECT
+ | RP2040_PWM_CSR_PH_CORRECT
+# endif
+ ));
+# endif
+ if (ret < 0)
+ {
+ _err("ERROR: Failed to initialize PWM4.\n");
+ }
+# endif
+
+# ifdef CONFIG_RP2040_PWM5
+# if defined(CONFIG_PWM_NCHANNELS) && CONFIG_PWM_NCHANNELS == 2
+ ret = rp2040_pwmdev_initialize(5,
+ CONFIG_RP2040_PWM5A_GPIO,
+ CONFIG_RP2040_PWM5B_GPIO,
+ (0
+# ifdef CONFIG_RP2040_PWM5A_INVERT
+ | RP2040_PWM_CSR_A_INV
+# endif
+# ifdef CONFIG_RP2040_PWM5B_INVERT
+ | RP2040_PWM_CSR_B_INV
+# endif
+# ifdef CONFIG_RP2040_PWM5_PHASE_CORRECT
+ | RP2040_PWM_CSR_PH_CORRECT
+# endif
+ ));
+# else
+ ret = rp2040_pwmdev_initialize(5,
+ CONFIG_RP2040_PWM5A_GPIO,
+ (0
+# ifdef CONFIG_RP2040_PWM5A_INVERT
+ | RP2040_PWM_CSR_A_INV
+# endif
+# ifdef CONFIG_RP2040_PWM5_PHASE_CORRECT
+ | RP2040_PWM_CSR_PH_CORRECT
+# endif
+ ));
+# endif
+ if (ret < 0)
+ {
+ _err("ERROR: Failed to initialize PWM5.\n");
+ }
+# endif
+
+# ifdef CONFIG_RP2040_PWM6
+# if defined(CONFIG_PWM_NCHANNELS) && CONFIG_PWM_NCHANNELS == 2
+ ret = rp2040_pwmdev_initialize(6,
+ CONFIG_RP2040_PWM6A_GPIO,
+ CONFIG_RP2040_PWM6B_GPIO,
+ (0
+# ifdef CONFIG_RP2040_PWM6A_INVERT
+ | RP2040_PWM_CSR_A_INV
+# endif
+# ifdef CONFIG_RP2040_PWM6B_INVERT
+ | RP2040_PWM_CSR_B_INV
+# endif
+# ifdef CONFIG_RP2040_PWM6_PHASE_CORRECT
+ | RP2040_PWM_CSR_PH_CORRECT
+# endif
+ ));
+# else
+ ret = rp2040_pwmdev_initialize(6,
+ CONFIG_RP2040_PWM6A_GPIO,
+ (0
+# ifdef CONFIG_RP2040_PWM6A_INVERT
+ | RP2040_PWM_CSR_A_INV
+# endif
+# ifdef CONFIG_RP2040_PWM6_PHASE_CORRECT
+ | RP2040_PWM_CSR_PH_CORRECT
+# endif
+ ));
+# endif
+ if (ret < 0)
+ {
+ _err("ERROR: Failed to initialize PWM6.\n");
+ }
+# endif
+
+# ifdef CONFIG_RP2040_PWM7
+# if defined(CONFIG_PWM_NCHANNELS) && CONFIG_PWM_NCHANNELS == 2
+ ret = rp2040_pwmdev_initialize(7,
+ CONFIG_RP2040_PWM7A_GPIO,
+ CONFIG_RP2040_PWM7B_GPIO,
+ (0
+# ifdef CONFIG_RP2040_PWM7A_INVERT
+ | RP2040_PWM_CSR_A_INV
+# endif
+# ifdef CONFIG_RP2040_PWM7B_INVERT
+ | RP2040_PWM_CSR_B_INV
+# endif
+# ifdef CONFIG_RP2040_PWM7_PHASE_CORRECT
+ | RP2040_PWM_CSR_PH_CORRECT
+# endif
+ ));
+# else
+ ret = rp2040_pwmdev_initialize(7,
+ CONFIG_RP2040_PWM7A_GPIO,
+ (0
+# ifdef CONFIG_RP2040_PWM7A_INVERT
+ | RP2040_PWM_CSR_A_INV
+# endif
+# ifdef CONFIG_RP2040_PWM7_PHASE_CORRECT
+ | RP2040_PWM_CSR_PH_CORRECT
+# endif
+ ));
+# endif
+ if (ret < 0)
+ {
+ _err("ERROR: Failed to initialize PWM7.\n");
+ }
+# endif
+#endif
+
return ret;
}
diff --git a/boards/arm/rp2040/raspberrypi-pico/Kconfig b/boards/arm/rp2040/raspberrypi-pico/Kconfig
index 871e53b8ac..a2bf69e6af 100644
--- a/boards/arm/rp2040/raspberrypi-pico/Kconfig
+++ b/boards/arm/rp2040/raspberrypi-pico/Kconfig
@@ -50,6 +50,310 @@ config RP2040_I2C1_GPIO
range -1 29
depends on RP2040_I2C1
+if RP2040_PWM0
+ config RP2040_PWM0A_GPIO
+ int "PWM0 channel 1 GPIO pin assign (0, 16 or -1:no assign)"
+ default 0
+ range -1 16
+ ---help---
+ This sets the GPIO pin to use for the A channel it must be
+ either 0 or 16, any other value disables the output.
+
+ config RP2040_PWM0A_INVERT
+ bool "PWM0 channel 1 invert"
+ default n
+ ---help---
+ If invert is enabled, the PWM on the A pin will idle high
+ with the pulse going low.
+
+ if PWM_MULTICHAN && PWM_NCHANNELS > 1
+ config RP2040_PWM0B_GPIO
+ int "PWM0 channel 2 GPIO pin assign (1, 17 or -1:no assign)"
+ default 1
+ range -1 29
+ ---help---
+ This sets the GPIO pin to use for the B channel it must be
+ either 1 or 17, any other value disables the output.
+
+ config RP2040_PWM0B_INVERT
+ bool "PWM0 channel 2 invert"
+ default n
+ ---help---
+ If invert is enabled, the PWM on the B pin will idle high
+ with the pulse going low.
+ endif
+
+ config RP2040_PWM0_PHASE_CORRECT
+ bool "PWM0 phase correct"
+ default n
+endif
+
+if RP2040_PWM1
+ config RP2040_PWM1A_GPIO
+ int "PWM1 channel 1 GPIO pin assign (2, 18 or -1:no assign)"
+ default 2
+ range -1 29
+ ---help---
+ This sets the GPIO pin to use for the A channel it must be
+ either 2 or 18, any other value disables the output.
+
+ config RP2040_PWM1A_INVERT
+ bool "PWM1 channel 1 invert"
+ default n
+ ---help---
+ If invert is enabled, the PWM on the A pin will idle high
+ with the pulse going low.
+
+ if PWM_MULTICHAN && PWM_NCHANNELS > 1
+ config RP2040_PWM1B_GPIO
+ int "PWM1 channel 2 GPIO pin assign (3, 19 or -1:no assign)"
+ default 3
+ range -1 29
+ ---help---
+ This sets the GPIO pin to use for the B channel it must be
+ either 3 or 19, any other value disables the output.
+
+ config RP2040_PWM1B_INVERT
+ bool "PWM1 channel 2 invert"
+ default n
+ ---help---
+ If invert is enabled, the PWM on the B pin will idle high
+ with the pulse going low.
+ endif
+
+ config RP2040_PWM1_PHASE_CORRECT
+ bool "PWM1 phase correct"
+ default n
+endif
+
+if RP2040_PWM2
+ config RP2040_PWM2A_GPIO
+ int "PWM2 channel 1 GPIO pin assign (4, 20 or -1:no assign)"
+ default 4
+ range -1 29
+ ---help---
+ This sets the GPIO pin to use for the A channel it must be
+ either 4 or 20, any other value disables the output.
+
+ config RP2040_PWM2A_INVERT
+ bool "PWM2 channel 1 invert"
+ default n
+ ---help---
+ If invert is enabled, the PWM on the A pin will idle high
+ with the pulse going low.
+
+ if PWM_MULTICHAN && PWM_NCHANNELS > 1
+ config RP2040_PWM2B_GPIO
+ int "PWM2 channel 2 GPIO pin assign (5, 21 or -1:no assign)"
+ default 5
+ range -1 29
+ ---help---
+ This sets the GPIO pin to use for the B channel it must be
+ either 5 or 21, any other value disables the output.
+
+ config RP2040_PWM2B_INVERT
+ bool "PWM2 channel 2 invert"
+ default n
+ ---help---
+ If invert is enabled, the PWM on the B pin will idle high
+ with the pulse going low.
+ endif
+
+ config RP2040_PWM2_PHASE_CORRECT
+ bool "PWM2 phase correct"
+ default n
+endif
+
+if RP2040_PWM3
+ config RP2040_PWM3A_GPIO
+ int "PWM3 channel 1 GPIO pin assign (6, 22 or -1:no assign)"
+ default 6
+ range -1 29
+ ---help---
+ This sets the GPIO pin to use for the A channel it must be
+ either 6 or 22, any other value disables the output.
+
+ config RP2040_PWM3A_INVERT
+ bool "PWM3 channel 1 invert"
+ default n
+ ---help---
+ If invert is enabled, the PWM on the A pin will idle high
+ with the pulse going low.
+
+ if PWM_MULTICHAN && PWM_NCHANNELS > 1
+ config RP2040_PWM3B_GPIO
+ int "PWM3 channel 2 GPIO pin assign (7, 23 or -1:no assign)"
+ default 7
+ range -1 29
+ ---help---
+ This sets the GPIO pin to use for the B channel it must be
+ either 7 or 23, any other value disables the output.
+
+ config RP2040_PWM3B_INVERT
+ bool "PWM3 channel 2 invert"
+ default n
+ ---help---
+ If invert is enabled, the PWM on the B pin will idle high
+ with the pulse going low.
+ endif
+
+ config RP2040_PWM3_PHASE_CORRECT
+ bool "PWM3 phase correct"
+ default n
+endif
+
+if RP2040_PWM4
+ config RP2040_PWM4A_GPIO
+ int "PWM4 channel 1 GPIO pin assign (8, 24 or -1:no assign)"
+ default 8
+ range -1 29
+ ---help---
+ This sets the GPIO pin to use for the A channel it must be
+ either 8 or 24, any other value disables the output.
+
+ config RP2040_PWM4A_INVERT
+ bool "PWM4 channel 1 invert"
+ default n
+ ---help---
+ If invert is enabled, the PWM on the A pin will idle high
+ with the pulse going low.
+
+ if PWM_MULTICHAN && PWM_NCHANNELS > 1
+ config RP2040_PWM4B_GPIO
+ int "PWM4 channel 2 GPIO pin assign (9, 25 or -1:no assign)"
+ default 9
+ range -1 29
+ ---help---
+ This sets the GPIO pin to use for the B channel it must be
+ either 9 or 25, any other value disables the output.
+
+ config RP2040_PWM4B_INVERT
+ bool "PWM4 channel 2 invert"
+ default n
+ ---help---
+ If invert is enabled, the PWM on the B pin will idle high
+ with the pulse going low.
+ endif
+
+ config RP2040_PWM4_PHASE_CORRECT
+ bool "PWM4 phase correct"
+ default n
+endif
+
+if RP2040_PWM5
+ config RP2040_PWM5A_GPIO
+ int "PWM5 channel 1 GPIO pin assign (10, 26 or -1:no assign)"
+ default 10
+ range -1 29
+ ---help---
+ This sets the GPIO pin to use for the A channel it must be
+ either 10 or 26, any other value disables the output.
+
+ config RP2040_PWM5A_INVERT
+ bool "PWM5 channel 1 invert"
+ default n
+ ---help---
+ If invert is enabled, the PWM on the A pin will idle high
+ with the pulse going low.
+
+ if PWM_MULTICHAN && PWM_NCHANNELS > 1
+ config RP2040_PWM5B_GPIO
+ int "PWM5 channel 2 GPIO pin assign (11, 27 or -1:no assign)"
+ default 11
+ range -1 29
+ ---help---
+ This sets the GPIO pin to use for the B channel it must be
+ either 11 or 27, any other value disables the output.
+
+ config RP2040_PWM5B_INVERT
+ bool "PWM5 channel 2 invert"
+ default n
+ ---help---
+ If invert is enabled, the PWM on the B pin will idle high
+ with the pulse going low.
+ endif
+
+ config RP2040_PWM5_PHASE_CORRECT
+ bool "PWM5 phase correct"
+ default n
+endif
+
+if RP2040_PWM6
+ config RP2040_PWM6A_GPIO
+ int "PWM6 channel 1 GPIO pin assign (12, 28 or -1:no assign)"
+ default 12
+ range -1 29
+ ---help---
+ This sets the GPIO pin to use for the A channel it must be
+ either 12 or 28, any other value disables the output.
+
+ config RP2040_PWM6A_INVERT
+ bool "PWM6 channel 1 invert"
+ default n
+ ---help---
+ If invert is enabled, the PWM on the A pin will idle high
+ with the pulse going low.
+
+ if PWM_MULTICHAN && PWM_NCHANNELS > 1
+ config RP2040_PWM6B_GPIO
+ int "PWM6 channel 2 GPIO pin assign (13, 29 or -1:no assign)"
+ default 13
+ range -1 29
+ ---help---
+ This sets the GPIO pin to use for the B channel it must be
+ either 13 or 29, any other value disables the output.
+
+ config RP2040_PWM6B_INVERT
+ bool "PWM6 channel 2 invert"
+ default n
+ ---help---
+ If invert is enabled, the PWM on the B pin will idle high
+ with the pulse going low.
+ endif
+
+ config RP2040_PWM6_PHASE_CORRECT
+ bool "PWM6 phase correct"
+ default n
+endif
+
+if RP2040_PWM7
+ config RP2040_PWM7A_GPIO
+ int "PWM7 channel 1 GPIO pin assign (14 or -1:no assign)"
+ default 14
+ range -1 29
+ ---help---
+ This sets the GPIO pin to use for the A channel it must be
+ either 14, any other value disables the output.
+
+ config RP2040_PWM7A_INVERT
+ bool "PWM7 channel 1 invert"
+ default n
+ ---help---
+ If invert is enabled, the PWM on the A pin will idle high
+ with the pulse going low.
+
+ if PWM_MULTICHAN && PWM_NCHANNELS > 1
+ config RP2040_PWM7B_GPIO
+ int "PWM7 channel 2 GPIO pin assign (15 or -1:no assign)"
+ default 15
+ range -1 29
+ ---help---
+ This sets the GPIO pin to use for the B channel it must be
+ either 15, any other value disables the output.
+
+ config RP2040_PWM7B_INVERT
+ bool "PWM7 channel 2 invert"
+ default n
+ ---help---
+ If invert is enabled, the PWM on the B pin will idle high
+ with the pulse going low.
+ endif
+
+ config RP2040_PWM7_PHASE_CORRECT
+ bool "PWM7 phase correct"
+ default n
+endif
+
config RP2040_SPI0_GPIO
int "SPI0 GPIO pin assign (0,4,16,20 or -1:no assign)"
default -1
diff --git a/boards/arm/rp2040/raspberrypi-pico/README.txt b/boards/arm/rp2040/raspberrypi-pico/README.txt
index 392335525d..ed799eadd3 100644
--- a/boards/arm/rp2040/raspberrypi-pico/README.txt
+++ b/boards/arm/rp2040/raspberrypi-pico/README.txt
@@ -13,6 +13,7 @@ Currently only the following devices are supported.
- I2C
- SPI
- DMAC
+ - PWM
- USB device
- MSC, CDC/ACM serial and these composite device are supported.
- CDC/ACM serial device can be used for the console.
diff --git a/boards/arm/rp2040/raspberrypi-pico/src/rp2040_bringup.c b/boards/arm/rp2040/raspberrypi-pico/src/rp2040_bringup.c
index 750a93b1e5..76ff7058c2 100644
--- a/boards/arm/rp2040/raspberrypi-pico/src/rp2040_bringup.c
+++ b/boards/arm/rp2040/raspberrypi-pico/src/rp2040_bringup.c
@@ -59,6 +59,11 @@
#include "rp2040_bmp180.h"
#endif
+#ifdef CONFIG_RP2040_PWM
+#include "rp2040_pwm.h"
+#include "rp2040_pwmdev.h"
+#endif
+
/****************************************************************************
* Public Functions
****************************************************************************/
@@ -107,6 +112,280 @@ int rp2040_bringup(void)
#endif
#endif
+#ifdef CONFIG_RP2040_PWM
+# ifdef CONFIG_RP2040_PWM0
+# if defined(CONFIG_PWM_NCHANNELS) && CONFIG_PWM_NCHANNELS == 2
+ ret = rp2040_pwmdev_initialize(0,
+ CONFIG_RP2040_PWM0A_GPIO,
+ CONFIG_RP2040_PWM0B_GPIO,
+ (0
+# ifdef CONFIG_RP2040_PWM0A_INVERT
+ | RP2040_PWM_CSR_A_INV
+# endif
+# ifdef CONFIG_RP2040_PWM0B_INVERT
+ | RP2040_PWM_CSR_B_INV
+# endif
+# ifdef CONFIG_RP2040_PWM0_PHASE_CORRECT
+ | RP2040_PWM_CSR_PH_CORRECT
+# endif
+ ));
+# else
+ ret = rp2040_pwmdev_initialize(0,
+ CONFIG_RP2040_PWM0A_GPIO,
+ (0
+# ifdef CONFIG_RP2040_PWM0A_INVERT
+ | RP2040_PWM_CSR_A_INV
+# endif
+# ifdef CONFIG_RP2040_PWM0_PHASE_CORRECT
+ | RP2040_PWM_CSR_PH_CORRECT
+# endif
+ ));
+# endif
+ if (ret < 0)
+ {
+ _err("ERROR: Failed to initialize PWM0.\n");
+ }
+# endif
+
+# ifdef CONFIG_RP2040_PWM1
+# if defined(CONFIG_PWM_NCHANNELS) && CONFIG_PWM_NCHANNELS == 2
+ ret = rp2040_pwmdev_initialize(1,
+ CONFIG_RP2040_PWM1A_GPIO,
+ CONFIG_RP2040_PWM1B_GPIO,
+ (0
+# ifdef CONFIG_RP2040_PWM1A_INVERT
+ | RP2040_PWM_CSR_A_INV
+# endif
+# ifdef CONFIG_RP2040_PWM1B_INVERT
+ | RP2040_PWM_CSR_B_INV
+# endif
+# ifdef CONFIG_RP2040_PWM1_PHASE_CORRECT
+ | RP2040_PWM_CSR_PH_CORRECT
+# endif
+ ));
+# else
+ ret = rp2040_pwmdev_initialize(1,
+ CONFIG_RP2040_PWM1A_GPIO,
+ (0
+# ifdef CONFIG_RP2040_PWM1A_INVERT
+ | RP2040_PWM_CSR_A_INV
+# endif
+# ifdef CONFIG_RP2040_PWM1_PHASE_CORRECT
+ | RP2040_PWM_CSR_PH_CORRECT
+# endif
+ ));
+# endif
+ if (ret < 0)
+ {
+ _err("ERROR: Failed to initialize PWM1.\n");
+ }
+# endif
+
+# ifdef CONFIG_RP2040_PWM2
+# if defined(CONFIG_PWM_NCHANNELS) && CONFIG_PWM_NCHANNELS == 2
+ ret = rp2040_pwmdev_initialize(2,
+ CONFIG_RP2040_PWM2A_GPIO,
+ CONFIG_RP2040_PWM2B_GPIO,
+ (0
+# ifdef CONFIG_RP2040_PWM2A_INVERT
+ | RP2040_PWM_CSR_A_INV
+# endif
+# ifdef CONFIG_RP2040_PWM2B_INVERT
+ | RP2040_PWM_CSR_B_INV
+# endif
+# ifdef CONFIG_RP2040_PWM2_PHASE_CORRECT
+ | RP2040_PWM_CSR_PH_CORRECT
+# endif
+ ));
+# else
+ ret = rp2040_pwmdev_initialize(2,
+ CONFIG_RP2040_PWM2A_GPIO,
+ (0
+# ifdef CONFIG_RP2040_PWM2A_INVERT
+ | RP2040_PWM_CSR_A_INV
+# endif
+# ifdef CONFIG_RP2040_PWM2_PHASE_CORRECT
+ | RP2040_PWM_CSR_PH_CORRECT
+# endif
+ ));
+# endif
+ if (ret < 0)
+ {
+ _err("ERROR: Failed to initialize PWM2.\n");
+ }
+# endif
+
+# ifdef CONFIG_RP2040_PWM3
+# if defined(CONFIG_PWM_NCHANNELS) && CONFIG_PWM_NCHANNELS == 2
+ ret = rp2040_pwmdev_initialize(3,
+ CONFIG_RP2040_PWM3A_GPIO,
+ CONFIG_RP2040_PWM3B_GPIO,
+ (0
+# ifdef CONFIG_RP2040_PWM3A_INVERT
+ | RP2040_PWM_CSR_A_INV
+# endif
+# ifdef CONFIG_RP2040_PWM3B_INVERT
+ | RP2040_PWM_CSR_B_INV
+# endif
+# ifdef CONFIG_RP2040_PWM3_PHASE_CORRECT
+ | RP2040_PWM_CSR_PH_CORRECT
+# endif
+ ));
+# else
+ ret = rp2040_pwmdev_initialize(3,
+ CONFIG_RP2040_PWM3A_GPIO,
+ (0
+# ifdef CONFIG_RP2040_PWM3A_INVERT
+ | RP2040_PWM_CSR_A_INV
+# endif
+# ifdef CONFIG_RP2040_PWM3_PHASE_CORRECT
+ | RP2040_PWM_CSR_PH_CORRECT
+# endif
+ ));
+# endif
+ if (ret < 0)
+ {
+ _err("ERROR: Failed to initialize PWM3.\n");
+ }
+# endif
+
+# ifdef CONFIG_RP2040_PWM4
+# if defined(CONFIG_PWM_NCHANNELS) && CONFIG_PWM_NCHANNELS == 2
+ ret = rp2040_pwmdev_initialize(4,
+ CONFIG_RP2040_PWM4A_GPIO,
+ CONFIG_RP2040_PWM4B_GPIO,
+ (0
+# ifdef CONFIG_RP2040_PWM4A_INVERT
+ | RP2040_PWM_CSR_A_INV
+# endif
+# ifdef CONFIG_RP2040_PWM4B_INVERT
+ | RP2040_PWM_CSR_B_INV
+# endif
+# ifdef CONFIG_RP2040_PWM4_PHASE_CORRECT
+ | RP2040_PWM_CSR_PH_CORRECT
+# endif
+ ));
+# else
+ ret = rp2040_pwmdev_initialize(4,
+ CONFIG_RP2040_PWM4A_GPIO,
+ (0
+# ifdef CONFIG_RP2040_PWM4A_INVERT
+ | RP2040_PWM_CSR_A_INV
+# endif
+# ifdef CONFIG_RP2040_PWM4_PHASE_CORRECT
+ | RP2040_PWM_CSR_PH_CORRECT
+# endif
+ ));
+# endif
+ if (ret < 0)
+ {
+ _err("ERROR: Failed to initialize PWM4.\n");
+ }
+# endif
+
+# ifdef CONFIG_RP2040_PWM5
+# if defined(CONFIG_PWM_NCHANNELS) && CONFIG_PWM_NCHANNELS == 2
+ ret = rp2040_pwmdev_initialize(5,
+ CONFIG_RP2040_PWM5A_GPIO,
+ CONFIG_RP2040_PWM5B_GPIO,
+ (0
+# ifdef CONFIG_RP2040_PWM5A_INVERT
+ | RP2040_PWM_CSR_A_INV
+# endif
+# ifdef CONFIG_RP2040_PWM5B_INVERT
+ | RP2040_PWM_CSR_B_INV
+# endif
+# ifdef CONFIG_RP2040_PWM5_PHASE_CORRECT
+ | RP2040_PWM_CSR_PH_CORRECT
+# endif
+ ));
+# else
+ ret = rp2040_pwmdev_initialize(5,
+ CONFIG_RP2040_PWM5A_GPIO,
+ (0
+# ifdef CONFIG_RP2040_PWM5A_INVERT
+ | RP2040_PWM_CSR_A_INV
+# endif
+# ifdef CONFIG_RP2040_PWM5_PHASE_CORRECT
+ | RP2040_PWM_CSR_PH_CORRECT
+# endif
+ ));
+# endif
+ if (ret < 0)
+ {
+ _err("ERROR: Failed to initialize PWM5.\n");
+ }
+# endif
+
+# ifdef CONFIG_RP2040_PWM6
+# if defined(CONFIG_PWM_NCHANNELS) && CONFIG_PWM_NCHANNELS == 2
+ ret = rp2040_pwmdev_initialize(6,
+ CONFIG_RP2040_PWM6A_GPIO,
+ CONFIG_RP2040_PWM6B_GPIO,
+ (0
+# ifdef CONFIG_RP2040_PWM6A_INVERT
+ | RP2040_PWM_CSR_A_INV
+# endif
+# ifdef CONFIG_RP2040_PWM6B_INVERT
+ | RP2040_PWM_CSR_B_INV
+# endif
+# ifdef CONFIG_RP2040_PWM6_PHASE_CORRECT
+ | RP2040_PWM_CSR_PH_CORRECT
+# endif
+ ));
+# else
+ ret = rp2040_pwmdev_initialize(6,
+ CONFIG_RP2040_PWM6A_GPIO,
+ (0
+# ifdef CONFIG_RP2040_PWM6A_INVERT
+ | RP2040_PWM_CSR_A_INV
+# endif
+# ifdef CONFIG_RP2040_PWM6_PHASE_CORRECT
+ | RP2040_PWM_CSR_PH_CORRECT
+# endif
+ ));
+# endif
+ if (ret < 0)
+ {
+ _err("ERROR: Failed to initialize PWM6.\n");
+ }
+# endif
+
+# ifdef CONFIG_RP2040_PWM7
+# if defined(CONFIG_PWM_NCHANNELS) && CONFIG_PWM_NCHANNELS == 2
+ ret = rp2040_pwmdev_initialize(7,
+ CONFIG_RP2040_PWM7A_GPIO,
+ CONFIG_RP2040_PWM7B_GPIO,
+ (0
+# ifdef CONFIG_RP2040_PWM7A_INVERT
+ | RP2040_PWM_CSR_A_INV
+# endif
+# ifdef CONFIG_RP2040_PWM7B_INVERT
+ | RP2040_PWM_CSR_B_INV
+# endif
+# ifdef CONFIG_RP2040_PWM7_PHASE_CORRECT
+ | RP2040_PWM_CSR_PH_CORRECT
+# endif
+ ));
+# else
+ ret = rp2040_pwmdev_initialize(7,
+ CONFIG_RP2040_PWM7A_GPIO,
+ (0
+# ifdef CONFIG_RP2040_PWM7A_INVERT
+ | RP2040_PWM_CSR_A_INV
+# endif
+# ifdef CONFIG_RP2040_PWM7_PHASE_CORRECT
+ | RP2040_PWM_CSR_PH_CORRECT
+# endif
+ ));
+# endif
+ if (ret < 0)
+ {
+ _err("ERROR: Failed to initialize PWM7.\n");
+ }
+# endif
+#endif
+
#ifdef CONFIG_RP2040_SPISD
/* Mount the SPI-based MMC/SD block driver */