You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by xi...@apache.org on 2022/07/23 10:25:43 UTC

[incubator-nuttx] branch master updated: Added Adafruit QT Py RP2040 board. Added ability to configure indivdual UART, SPI and I2C pin location.

This is an automated email from the ASF dual-hosted git repository.

xiaoxiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-nuttx.git


The following commit(s) were added to refs/heads/master by this push:
     new c21c7ac8dc Added Adafruit QT Py RP2040 board. Added ability to configure indivdual UART, SPI and I2C pin location.
c21c7ac8dc is described below

commit c21c7ac8dc1ec3bb6e14924635e2e30b26f72432
Author: curuvar <58...@users.noreply.github.com>
AuthorDate: Thu Jul 21 21:04:05 2022 -0400

    Added Adafruit QT Py RP2040 board.
    Added ability to configure indivdual UART, SPI and I2C pin location.
---
 .../boards/adafruit-feather-rp2040/index.rst       |   3 +-
 .../arm/rp2040/boards/adafruit-kb2040/index.rst    |   3 +-
 .../rp2040/boards/adafruit-qt-py-rp2040/QT-Py.png  | Bin 0 -> 127939 bytes
 .../rp2040/boards/adafruit-qt-py-rp2040/index.rst  | 119 ++++
 .../arm/rp2040/boards/pimoroni-tiny2040/index.rst  |   3 +-
 .../arm/rp2040/boards/raspberrypi-pico/index.rst   |   3 +-
 arch/arm/Kconfig                                   |   1 +
 arch/arm/src/rp2040/Kconfig                        | 780 ++++++++++++++-------
 arch/arm/src/rp2040/rp2040_i2c_slave.c             |  16 +-
 arch/arm/src/rp2040/rp2040_ws2812.c                |  66 +-
 arch/arm/src/rp2040/rp2040_ws2812.h                |   2 +
 boards/Kconfig                                     |  11 +
 boards/arm/rp2040/adafruit-feather-rp2040/Kconfig  | 292 +-------
 .../configs/audiopack/defconfig                    |   6 +-
 .../configs/composite/defconfig                    |   6 +-
 .../configs/displaypack/defconfig                  |   6 +-
 .../configs/enc28j60/defconfig                     |  11 +-
 .../configs/lcd1602/defconfig                      |   4 +-
 .../adafruit-feather-rp2040/configs/nsh/defconfig  |   1 -
 .../configs/nshsram/defconfig                      |   1 -
 .../adafruit-feather-rp2040/configs/smp/defconfig  |   1 -
 .../configs/spisd/defconfig                        |   2 -
 .../configs/ssd1306/defconfig                      |   4 +-
 .../configs/st7735/defconfig                       |   2 -
 .../configs/usbmsc/defconfig                       |   6 +-
 .../configs/usbnsh/defconfig                       |   1 -
 .../configs/waveshare-lcd-1.14/defconfig           |   2 -
 .../configs/waveshare-lcd-1.3/defconfig            |   2 -
 .../scripts/adafruit-feather-rp2040-flash.ld       |   2 +-
 .../src/rp2040_boardinitialize.c                   |  68 +-
 .../adafruit-feather-rp2040/src/rp2040_bringup.c   |   1 +
 .../adafruit-feather-rp2040/src/rp2040_spi.c       |   8 +-
 boards/arm/rp2040/adafruit-kb2040/Kconfig          | 309 +-------
 .../adafruit-kb2040/configs/audiopack/defconfig    |   6 +-
 .../adafruit-kb2040/configs/composite/defconfig    |   6 +-
 .../adafruit-kb2040/configs/displaypack/defconfig  |   6 +-
 .../adafruit-kb2040/configs/enc28j60/defconfig     |  12 +-
 .../adafruit-kb2040/configs/lcd1602/defconfig      |   2 -
 .../rp2040/adafruit-kb2040/configs/nsh/defconfig   |   1 -
 .../adafruit-kb2040/configs/nshsram/defconfig      |   1 -
 .../rp2040/adafruit-kb2040/configs/smp/defconfig   |   1 -
 .../rp2040/adafruit-kb2040/configs/spisd/defconfig |   6 +-
 .../adafruit-kb2040/configs/ssd1306/defconfig      |   2 -
 .../adafruit-kb2040/configs/st7735/defconfig       |   3 +-
 .../adafruit-kb2040/configs/usbmsc/defconfig       |   6 +-
 .../adafruit-kb2040/configs/usbnsh/defconfig       |   1 -
 .../configs/waveshare-lcd-1.14/defconfig           |   2 -
 .../configs/waveshare-lcd-1.3/defconfig            |   2 -
 boards/arm/rp2040/adafruit-kb2040/include/board.h  |   9 +-
 .../scripts/adafruit-kb2040-flash.ld               |   2 +-
 .../adafruit-kb2040/src/rp2040_boardinitialize.c   |  68 +-
 .../rp2040/adafruit-kb2040/src/rp2040_bringup.c    |   1 +
 boards/arm/rp2040/adafruit-kb2040/src/rp2040_spi.c |   8 +-
 boards/arm/rp2040/adafruit-qt-py-rp2040/Kconfig    |  30 +
 boards/arm/rp2040/adafruit-qt-py-rp2040/README.txt |  98 +++
 .../configs/gpio/defconfig                         |  16 +-
 .../configs/nsh/defconfig                          |  14 +-
 .../configs/nshsram}/defconfig                     |  15 +-
 .../configs/smp/defconfig                          |  14 +-
 .../configs/usbnsh/defconfig                       |   9 +-
 .../include/board.h                                |  17 +-
 .../adafruit-qt-py-rp2040/include/rp2040_i2cdev.h  |  61 +-
 .../adafruit-qt-py-rp2040/include/rp2040_i2sdev.h  |  61 +-
 .../adafruit-qt-py-rp2040/include/rp2040_spidev.h  |  60 +-
 .../adafruit-qt-py-rp2040/include/rp2040_spisd.h   |  58 +-
 .../rp2040/adafruit-qt-py-rp2040/scripts/Make.defs |  45 ++
 .../scripts/adafruit-qt-py-rp2040-flash.ld}        |   4 +-
 .../scripts/adafruit-qt-py-rp2040-sram.ld}         |  31 +-
 .../arm/rp2040/adafruit-qt-py-rp2040/src/Make.defs |  41 ++
 .../adafruit-qt-py-rp2040/src/rp2040_appinit.c     |  79 +--
 .../src/rp2040_boardinitialize.c                   |  70 +-
 .../src/rp2040_bringup.c                           |   3 +-
 .../rp2040/adafruit-qt-py-rp2040/src/rp2040_gpio.c | 392 +++++++++++
 .../rp2040/adafruit-qt-py-rp2040/src/rp2040_pico.h |  36 +
 .../adafruit-qt-py-rp2040/src/rp2040_reset.c       |  61 ++
 .../src/rp2040_spi.c                               |  10 +-
 boards/arm/rp2040/common/Kconfig                   | 525 +++++++++++++-
 boards/arm/rp2040/common/src/rp2040_spisd.c        |   4 +-
 boards/arm/rp2040/common/src/rp2040_st7735.c       |   4 +-
 boards/arm/rp2040/common/src/rp2040_st7789.c       |   4 +-
 boards/arm/rp2040/pimoroni-tiny2040/Kconfig        | 309 +-------
 .../pimoroni-tiny2040/configs/composite/defconfig  |   6 +-
 .../pimoroni-tiny2040/configs/gpio/defconfig       |   1 -
 .../rp2040/pimoroni-tiny2040/configs/nsh/defconfig |   1 -
 .../pimoroni-tiny2040/configs/nshsram/defconfig    |   1 -
 .../rp2040/pimoroni-tiny2040/configs/smp/defconfig |   1 -
 .../pimoroni-tiny2040/configs/spisd/defconfig      |   6 +-
 .../pimoroni-tiny2040/configs/usbmsc/defconfig     |   6 +-
 .../pimoroni-tiny2040/configs/usbnsh/defconfig     |   1 -
 .../pimoroni-tiny2040/src/rp2040_boardinitialize.c |  68 +-
 .../rp2040/pimoroni-tiny2040/src/rp2040_bringup.c  |   1 +
 .../arm/rp2040/pimoroni-tiny2040/src/rp2040_spi.c  |   4 +-
 boards/arm/rp2040/raspberrypi-pico/Kconfig         | 347 +--------
 .../raspberrypi-pico/configs/audiopack/defconfig   |   2 -
 .../raspberrypi-pico/configs/composite/defconfig   |   2 -
 .../raspberrypi-pico/configs/displaypack/defconfig |   2 -
 .../raspberrypi-pico/configs/enc28j60/defconfig    |   7 +-
 .../raspberrypi-pico/configs/lcd1602/defconfig     |   2 -
 .../rp2040/raspberrypi-pico/configs/nsh/defconfig  |   1 -
 .../raspberrypi-pico/configs/nshsram/defconfig     |   1 -
 .../rp2040/raspberrypi-pico/configs/smp/defconfig  |   1 -
 .../raspberrypi-pico/configs/spisd/defconfig       |   2 -
 .../raspberrypi-pico/configs/ssd1306/defconfig     |   2 -
 .../raspberrypi-pico/configs/st7735/defconfig      |   6 +-
 .../raspberrypi-pico/configs/usbmsc/defconfig      |   2 -
 .../raspberrypi-pico/configs/usbnsh/defconfig      |   1 -
 .../configs/waveshare-lcd-1.14/defconfig           |   2 -
 .../configs/waveshare-lcd-1.3/defconfig            |   2 -
 .../raspberrypi-pico/src/rp2040_boardinitialize.c  |  68 +-
 .../rp2040/raspberrypi-pico/src/rp2040_bringup.c   |   1 +
 .../arm/rp2040/raspberrypi-pico/src/rp2040_spi.c   |   8 +-
 drivers/leds/ws2812.c                              |   2 +-
 include/nuttx/leds/ws2812.h                        |   7 +-
 113 files changed, 2392 insertions(+), 2130 deletions(-)

diff --git a/Documentation/platforms/arm/rp2040/boards/adafruit-feather-rp2040/index.rst b/Documentation/platforms/arm/rp2040/boards/adafruit-feather-rp2040/index.rst
index 7b128bb653..2804c50eab 100644
--- a/Documentation/platforms/arm/rp2040/boards/adafruit-feather-rp2040/index.rst
+++ b/Documentation/platforms/arm/rp2040/boards/adafruit-feather-rp2040/index.rst
@@ -55,9 +55,10 @@ the power.
 
 Pin Mapping
 ===========
+Pads numbered anticlockwise from USB connector.
 
 ===== ========== ==========
-Pin   Signal     Notes
+Pad   Signal     Notes
 ===== ========== ==========
 1     Reset      Pull to ground to reset the RP2040 processor.
 2     3.3V       Power out to peripherals.
diff --git a/Documentation/platforms/arm/rp2040/boards/adafruit-kb2040/index.rst b/Documentation/platforms/arm/rp2040/boards/adafruit-kb2040/index.rst
index 546aa1bc48..d3074d5b26 100644
--- a/Documentation/platforms/arm/rp2040/boards/adafruit-kb2040/index.rst
+++ b/Documentation/platforms/arm/rp2040/boards/adafruit-kb2040/index.rst
@@ -50,9 +50,10 @@ A ws2812 (NeoPixel) smart RGB LED controlled by GPIO17.
 
 Pin Mapping
 ===========
+Pads numbered anticlockwise from USB connector.
 
 ===== ========== ==========
-Pin   Signal     Notes
+Pad   Signal     Notes
 ===== ========== ==========
 1     D+         Alternate USB data connection.
 2     GPIO0      Default TX for UART0 serial console
diff --git a/Documentation/platforms/arm/rp2040/boards/adafruit-qt-py-rp2040/QT-Py.png b/Documentation/platforms/arm/rp2040/boards/adafruit-qt-py-rp2040/QT-Py.png
new file mode 100644
index 0000000000..6441fec3c6
Binary files /dev/null and b/Documentation/platforms/arm/rp2040/boards/adafruit-qt-py-rp2040/QT-Py.png differ
diff --git a/Documentation/platforms/arm/rp2040/boards/adafruit-qt-py-rp2040/index.rst b/Documentation/platforms/arm/rp2040/boards/adafruit-qt-py-rp2040/index.rst
new file mode 100644
index 0000000000..3052d078e6
--- /dev/null
+++ b/Documentation/platforms/arm/rp2040/boards/adafruit-qt-py-rp2040/index.rst
@@ -0,0 +1,119 @@
+=======================
+Adafruit QT Py RP2040
+=======================
+
+The QT Py RP2040 is a tiny general purpose RP2040 board supplied by 
+Adafruit.
+
+.. figure:: QT-Py.png
+   :align: center
+
+Features
+========
+
+* RP2040 microcontroller chip
+* Dual-core ARM Cortex M0+ processor, flexible clock running up to 133 MHz
+* 264kB of SRAM, and 8MB of on-board Flash memory
+* Castellated module allows soldering direct to carrier boards
+* USB Host and Device support via type C connector.
+* Low-power sleep and dormant modes
+* Drag & drop programming using mass storage over USB
+* 13 multi-function GPIO pins (11 breakout pads and two QT pads)
+* 2× SPI, 2× I2C, 2× UART, 4× 12-bit ADC, 16× controllable PWM channels
+* Accurate clock and timer on-chip
+* Temperature sensor
+* Accelerated floating point libraries on-chip
+* 8 × Programmable IO (PIO) state machines for custom peripheral support
+
+Serial Console
+==============
+
+By default a serial console appears on GPIO pins 20 (RX GPIO1) and pin 5
+(TX GPIO1).  This console runs a 115200-8N1.
+
+The board can be configured to use the USB connection as the serial console.
+
+Buttons and LEDs
+================
+
+A ws2812 (NeoPixel) smart RGB LED controlled by GPIO12 (data) and
+GPIO11 (power).
+
+There is a BOOT button which if held down when power is first
+applied or the RESET button is pressed will cause the RP2040 to
+boot into program mode and appear as a storage device to
+a USB connecter.  Saving a .UF2 file to this device will 
+replace the Flash ROM contents on the RP2040.
+
+A RESET button that allows rebooting the board without disconnecting
+the power.
+
+Pin Mapping
+===========
+Pads numbered anticlockwise from USB connector.
+
+===== ========== ==========
+Pad   Signal     Notes
+===== ========== ==========
+1     GPIO26     ADC0
+2     GPIO27     ADC1
+3     GPIO28     ADC2
+4     GPIO29     ADC3
+5     GPIO24
+6     GPIO25
+7     GPIO20     Default TX for UART1 serial console
+8     GPIO5      Default RX for UART1 serial console
+9     GPIO6      
+10    GPIO4
+11    GPIO3
+12    3.3V       Power out to peripherals.
+13    Ground
+14    5V
+===== ========== ==========
+
+The board has a STEMMA QT connector that is also connected to
+pins GPIO22 (I2C1 SDA) and GPIO23 (I2C1 SCL).
+
+Power Supply 
+============
+
+The Raspberry Pi Pico can be powered via the USB connector,
+or by supplying +5V to pin 14.  The board had a diode that prevents
+power from pin 14 from flowing back to the USB socket, although
+this can be disabled by connecting on-board solder pads if there
+is need to run as a usb host.
+
+The Raspberry Pi Pico chip run on 3.3 volts which is supplied by
+an on board regulator.
+
+
+Configurations
+==============
+
+gpio
+--------
+
+NuttShell configuration (console enabled in UART1, at 115200 bps) with GPIO examples.
+
+nsh
+---
+
+Basic NuttShell configuration (console enabled in UART1, at 115200 bps).
+
+nshsram
+-------
+
+NuttShell configuration (console enabled in UART1, at 115200 bps) with interrupt
+vectors in RAM.
+
+smp
+---
+
+Basic NuttShell configuration (console enabled in UART1, at 115200 bps) with
+both ARM cores enabled.
+
+usbnsh
+------
+
+Basic NuttShell configuration (console enabled in USB Port, at 115200 bps).
+
diff --git a/Documentation/platforms/arm/rp2040/boards/pimoroni-tiny2040/index.rst b/Documentation/platforms/arm/rp2040/boards/pimoroni-tiny2040/index.rst
index 7bb7f3fe96..e4b61efd11 100644
--- a/Documentation/platforms/arm/rp2040/boards/pimoroni-tiny2040/index.rst
+++ b/Documentation/platforms/arm/rp2040/boards/pimoroni-tiny2040/index.rst
@@ -46,9 +46,10 @@ on the RP2040.
 
 Pin Mapping
 ===========
+Pads numbered anticlockwise from USB connector.
 
 ===== ========== ==========
-Pin   Signal     Notes
+Pad   Signal     Notes
 ===== ========== ==========
 1     VBUS       Connected to USB +5V
 2     Ground
diff --git a/Documentation/platforms/arm/rp2040/boards/raspberrypi-pico/index.rst b/Documentation/platforms/arm/rp2040/boards/raspberrypi-pico/index.rst
index a5d24637fc..69aed30a0d 100644
--- a/Documentation/platforms/arm/rp2040/boards/raspberrypi-pico/index.rst
+++ b/Documentation/platforms/arm/rp2040/boards/raspberrypi-pico/index.rst
@@ -46,9 +46,10 @@ on the RP2040.
 
 Pin Mapping
 ===========
+Pads numbered anticlockwise from USB connector.
 
 ===== ========== ==========
-Pin   Signal     Notes
+Pad   Signal     Notes
 ===== ========== ==========
 1     GPIO0      Default TX for UART0 serial console
 2     GPIO1      Default RX for UART1 serial console
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
index 353dc7440e..c26c70c490 100644
--- a/arch/arm/Kconfig
+++ b/arch/arm/Kconfig
@@ -236,6 +236,7 @@ config ARCH_CHIP_RP2040
 	select ARM_HAVE_WFE_SEV
 	select LIBC_ARCH_ATOMIC
 	select ARCH_HAVE_PWM_MULTICHAN
+	select ARCH_BOARD_COMMON
 	---help---
 		Raspberry Pi RP2040 architectures (ARM dual Cortex-M0+).
 
diff --git a/arch/arm/src/rp2040/Kconfig b/arch/arm/src/rp2040/Kconfig
index a2453d86af..00380ea430 100644
--- a/arch/arm/src/rp2040/Kconfig
+++ b/arch/arm/src/rp2040/Kconfig
@@ -3,229 +3,261 @@
 # see the file kconfig-language.txt in the NuttX tools repository.
 #
 
-comment "RP2040 Configuration Options"
+		comment "RP2040 Configuration Options"
+
+config RP2040_DMAC
+	bool "DMAC support"
+	default y
+	select ARCH_DMA
+
+#####################################################################
+#  UART Configuration
+#####################################################################
 
 config RP2040_UART0
 	bool "UART0"
 	default y
 	select UART0_SERIALDRIVER
 	select ARCH_HAVE_SERIAL_TERMIOS
+	---help---
+		Most UART parameters are configured here.  See also the
+		Board Selection menu to configure the pins used by UART0
 
 if RP2040_UART0
 
-config RP2040_UART0_BAUD
-	int "RP2040 UART0 BAUD"
-	default 115200
+	config RP2040_UART0_BAUD
+		int "RP2040 UART0 BAUD"
+		default 115200
+		---help---
+			RP2040 UART0 communication bit rate.  The range of available
+			baud rates depend on the clock supplied to the UART. Given
+			the normally configured 125 MHz clock, the baud
+			rates between 120 and 7 812 500 baud are available.
+
+	config RP2040_UART0_PARITY
+		int "RP2040 UART0 parity"
+		default 0
+		range 0 2
+		---help---
+			RP2040 UART0 parity.  0=None, 1=Odd, 2=Even.  Default: None
 
-config RP2040_UART0_PARITY
-	int "RP2040 UART0 parity"
-	default 0
-	range 0 2
-	---help---
-		RP2040 UART0 parity.  0=None, 1=Odd, 2=Even.  Default: None
+	config RP2040_UART0_BITS
+		int "RP2040 UART0 number of bits"
+		default 8
+		range 5 8
+		---help---
+			RP2040 UART0 number of bits.  Default: 8
 
-config RP2040_UART0_BITS
-	int "RP2040 UART0 number of bits"
-	default 8
-	range 5 8
-	---help---
-		RP2040 UART0 number of bits.  Default: 8
+	config RP2040_UART0_2STOP
+		int "RP2040 UART0 two stop bits"
+		default 0
+		---help---
+			0=1 stop bit, 1=Two stop bits.  Default: 1 stop bit
 
-config RP2040_UART0_2STOP
-	int "RP2040 UART0 two stop bits"
-	default 0
-	---help---
-		0=1 stop bit, 1=Two stop bits.  Default: 1 stop bit
+endif # RP2040_UART0
 
-endif
+#####################################################################
 
 config RP2040_UART1
 	bool "UART1"
 	default n
 	select UART1_SERIALDRIVER
 	select ARCH_HAVE_SERIAL_TERMIOS
+	---help---
+		Most UART parameters are configured here.  See also the
+		Board Selection menu to configure the pins used by UART1
 
 if RP2040_UART1
 
-config RP2040_UART1_BAUD
-	int "RP2040 UART1 BAUD"
-	default 115200
-
-config RP2040_UART1_PARITY
-	int "RP2040 UART1 parity"
-	default 0
-	range 0 2
-	---help---
-		RP2040 UART1 parity.  0=None, 1=Odd, 2=Even.  Default: None
+	config RP2040_UART1_BAUD
+		int "RP2040 UART1 BAUD"
+		default 115200
+		---help---
+			RP2040 UART0 communication bit rate.  The range of available
+			baud rates depend on the clock supplied to the UART. Given
+			the normally configured 125 MHz clock, the baud
+			rates between 120 and 7 812 500 baud are available.
+
+	config RP2040_UART1_PARITY
+		int "RP2040 UART1 parity"
+		default 0
+		range 0 2
+		---help---
+			RP2040 UART1 parity.  0=None, 1=Odd, 2=Even.  Default: None
 
-config RP2040_UART1_BITS
-	int "RP2040 UART1 number of bits"
-	default 8
-	range 5 8
-	---help---
-		RP2040 UART1 number of bits.  Default: 8
+	config RP2040_UART1_BITS
+		int "RP2040 UART1 number of bits"
+		default 8
+		range 5 8
+		---help---
+			RP2040 UART1 number of bits.  Default: 8
 
-config RP2040_UART1_2STOP
-	int "RP2040 UART1 two stop bits"
-	default 0
-	---help---
-		0=1 stop bit, 1=Two stop bits.  Default: 1 stop bit
+	config RP2040_UART1_2STOP
+		int "RP2040 UART1 two stop bits"
+		default 0
+		---help---
+			0=1 stop bit, 1=Two stop bits.  Default: 1 stop bit
 
 endif
 
-config RP2040_DMAC
-	bool "DMAC support"
-	default y
-	select ARCH_DMA
+#####################################################################
+#  SPI Configuration
+#####################################################################
 
 config RP2040_SPI
-	bool "SPI"
+	bool "SPI Master Mode Support"
 	select SPI
 
 if RP2040_SPI
 
-config RP2040_SPI0
-	bool "SPI0"
+	config RP2040_SPI0
+		bool "SPI0"
+		default n
+		---help---
+			Most SPI parameters are configured here.  See also the
+			Board Selection menu to configure the pins used by SPI0
 
-config RP2040_SPI1
-	bool "SPI1"
+	config RP2040_SPI1
+		bool "SPI1"
+		default n
+		---help---
+			Most SPI parameters are configured here.  See also the
+			Board Selection menu to configure the pins used by SPI1
 
-config RP2040_SPI_DMA
-	bool "SPI DMA"
-	default y
-	depends on RP2040_DMAC
-	---help---
-		Use DMA to improve SPI transfer performance.
+	config RP2040_SPI_DMA
+		bool "SPI DMA"
+		default y
+		depends on RP2040_DMAC
+		---help---
+			Use DMA to improve SPI transfer performance.
 
-config RP2040_SPI_DMATHRESHOLD
-	int "SPI DMA threshold"
-	default 4
-	depends on RP2040_SPI_DMA
-	---help---
-		When SPI DMA is enabled, small DMA transfers will still be performed
-		by polling logic.  But we need a threshold value to determine what
-		is small.  That value is provided by RP2040_SPI_DMATHRESHOLD.
+	config RP2040_SPI_DMATHRESHOLD
+		int "SPI DMA threshold"
+		default 4
+		depends on RP2040_SPI_DMA
+		---help---
+			When SPI DMA is enabled, small DMA transfers will still be performed
+			by polling logic.  But we need a threshold value to determine what
+			is small.  That value is provided by RP2040_SPI_DMATHRESHOLD.
+
+	config RP2040_SPI_DRIVER
+		bool "SPI character driver"
+		default y
+		select SPI_DRIVER
+		---help---
+			Build in support for a character driver at /dev/spi[N] that may be
+			used to perform SPI bus transfers from applications.  The intent of
+			this driver is to support SPI testing.
 
-config RP2040_SPI_DRIVER
-	bool "SPI character driver"
-	default y
-	select SPI_DRIVER
-	---help---
-		Build in support for a character driver at /dev/spi[N] that may be
-		used to perform SPI bus transfers from applications.  The intent of
-		this driver is to support SPI testing.
+endif # RP2040_SPI
 
-endif
+#####################################################################
+#  I2C Configuration (Master)
+#####################################################################
 
 config RP2040_I2C
 	bool "I2C Master"
 	select I2C
 	---help---
 		Build in support for I2C master mode.
-
 		Note: Do not configure the same port as both master and slave.
 
 if RP2040_I2C
 
-config RP2040_I2C0
-	bool "I2C0"
+	config RP2040_I2C0
+		bool "I2C0"
+		default n
+		---help---
+			See the Board Selection menu to configure the pins used by I2C0.
 
-config RP2040_I2C1
-	bool "I2C1"
+	config RP2040_I2C1
+		bool "I2C1"
+		default n
+		---help---
+			See the Board Selection menu to configure the pins used by I2C1.
 
-config RP2040_I2C_DRIVER
-	bool "I2C character driver"
-	default n
-	select I2C_DRIVER
-	---help---
-		Build in support for a character driver at /dev/i2c[N] that may be
-		used to perform I2C bus transfers from applications.  The intent of
-		this driver is to support I2C testing.  It is not suitable for use
-		in any real driver application.
+	config RP2040_I2C_DRIVER
+		bool "I2C character driver"
+		default n
+		select I2C_DRIVER
+		---help---
+			Build in support for a character driver at /dev/i2c[N] that may be
+			used to perform I2C bus transfers from applications.  The intent of
+			this driver is to support I2C testing.  It is not suitable for use
+			in any real driver application.
 
-endif
+endif # RP2040_I2C
+
+#####################################################################
+#  I2C Configuration (Slave)
+#####################################################################
 
 config RP2040_I2C_SLAVE
 	bool "I2C Slave"
 	select I2C_SLAVE
 	---help---
 		Build in support for I2C slave mode.
-
 		Note: Do not configure the same port as both master and slave.
 
 if RP2040_I2C_SLAVE
 
-config RP2040_I2C0_SLAVE
-	bool "I2C0"
-
-if RP2040_I2C0_SLAVE
-
-config RP2040_I2C0_SLAVE_SDA
-	int "GPIO pin number for SDA (data) line"
-	default 4
-	---help---
-		This pin must be one of: 0, 4, 8, 12, 16, 20, 24, or 28
-
-config RP2040_I2C0_SLAVE_SCL
-	int "GPIO pin number for SCL (clock) line"
-	default 5
-	---help---
-		This pin must be one of: 1, 5, 9, 13, 17, 21, 25, or 29
-
-config RP2040_I2C0_SLAVE_ADDRESS
-	int "Slave Address (in decimal)"
-	default 42
-	---help---
-		This is the default address of this device on the I2C bus.
-		It should be the canonical address (not the shifted address)
-		in the range 8-119 for 7-bit mode and in the range 0-1023
-		for 10-bit mode.
-
-config RP2040_I2C0_SLAVE_10BIT
-	bool "Enable 10-bit slave address"
-	default n
-	---help---
-		Set to enable 10-bit mode addressing.
-
-endif
+	config RP2040_I2C0_SLAVE
+		bool "I2C0"
+		default n
+		---help---
+			See the Board Selection menu to configure the pins used by I2C0.
+
+	if RP2040_I2C0_SLAVE
+
+		config RP2040_I2C0_SLAVE_ADDRESS
+			int "Slave Address (in decimal)"
+			default 42
+			---help---
+				This is the default address of this device on the I2C bus.
+				It should be the canonical address (not the shifted address)
+				in the range 8-119 for 7-bit mode and in the range 0-1023
+				for 10-bit mode.
+
+		config RP2040_I2C0_SLAVE_10BIT
+			bool "Enable 10-bit slave address"
+			default n
+			---help---
+				Set to enable 10-bit mode addressing.
+
+	endif # RP2040_I2C0_SLAVE
+
+	config RP2040_I2C1_SLAVE
+		bool "I2C1"
+		default n
+		---help---
+			See the Board Selection menu to configure the pins used by I2C0.
 
-config RP2040_I2C1_SLAVE
-	bool "I2C1"
+	if RP2040_I2C1_SLAVE
 
-if RP2040_I2C1_SLAVE
+		config RP2040_I2C1_SLAVE_ADDRESS
+			int "Slave Address (in decimal)"
+			default 42
+			---help---
+				This is the default address of this device on the I2C bus.
+				It should be the canonical address (not the shifted address)
+				in the range 8-119 for 7-bit mode and in the range 0-1023
+				for 10-bit mode.
 
-config RP2040_I2C1_SLAVE_SDA
-	int "GPIO pin number for SDA (data) line"
-	default 6
-	---help---
-		This pin must be one of: 2, 6, 10, 14, 18, 22, or 26
-
-config RP2040_I2C1_SLAVE_SCL
-	int "GPIO pin number for SCL (clock) line"
-	default 7
-	---help---
-		This pin must be one of: 3, 7, 11, 15, 19, 23, or 27
+		config RP2040_I2C1_SLAVE_10BIT
+			bool "Enable 10-bit slave address"
+			default n
+			---help---
+				Set to enable 10-bit mode addressing.
 
-config RP2040_I2C1_SLAVE_ADDRESS
-	int "Slave Address (in decimal)"
-	default 42
-	---help---
-		This is the default address of this device on the I2C bus.
-		It should be the canonical address (not the shifted address)
-		in the range 8-119 for 7-bit mode and in the range 0-1023
-		for 10-bit mode.
+	endif # RP2040_I2C1_SLAVE
 
-config RP2040_I2C1_SLAVE_10BIT
-	bool "Enable 10-bit slave address"
-	default n
-	---help---
-		Set to enable 10-bit mode addressing.
+endif # RP2040_I2C_SLAVE
 
-endif
+#####################################################################
+#  PWM Configuration
+#####################################################################
 
-endif
-
-menuconfig RP2040_PWM
+config RP2040_PWM
 	bool "PWM"
 	select PWM
 	---help---
@@ -234,145 +266,425 @@ menuconfig RP2040_PWM
 
 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.
+	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
+			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 # PWM_MULTICHAN
 
 	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.
+			See the Board Selection menu to configure the pins used by I2C0.
+
+	if RP2040_PWM0
+
+		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_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 # PWM_MULTICHAN && PWM_NCHANNELS > 1
+
+		config RP2040_PWM0_PHASE_CORRECT
+			bool "PWM0 phase correct"
+			default n
+
+	endif # RP2040_PWM0
+
+  ###################################################################
 
 	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.
+			See the Board Selection menu to configure the pins used by I2C0.
+
+	if RP2040_PWM1
+
+		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_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 # PWM_MULTICHAN && PWM_NCHANNELS > 1
+
+		config RP2040_PWM1_PHASE_CORRECT
+			bool "PWM1 phase correct"
+			default n
+
+	endif # RP2040_PWM1
+
+  ###################################################################
 
 	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.
+			See the Board Selection menu to configure the pins used by I2C0.
+
+	if RP2040_PWM2
+
+		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_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 # PWM_MULTICHAN && PWM_NCHANNELS > 1
+
+		config RP2040_PWM2_PHASE_CORRECT
+			bool "PWM2 phase correct"
+			default n
+
+	endif # RP2040_PWM2
+
+  ###################################################################
 
 	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.
+			See the Board Selection menu to configure the pins used by I2C0.
+
+	if RP2040_PWM3
+
+		config RP2040_PWM3A_GPIO
+			
+		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_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 # PWM_MULTICHAN && PWM_NCHANNELS > 1
+
+		config RP2040_PWM3_PHASE_CORRECT
+			bool "PWM3 phase correct"
+			default n
+
+	endif # RP2040_PWM3
+
+#####################################################################
 
 	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.
+			See the Board Selection menu to configure the pins used by I2C0.
+
+	if RP2040_PWM4
+		
+		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_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 # PWM_MULTICHAN && PWM_NCHANNELS > 1
+
+		config RP2040_PWM4_PHASE_CORRECT
+			bool "PWM4 phase correct"
+			default n
+
+	endif # RP2040_PWM4
+
+#####################################################################
 
 	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.
+			See the Board Selection menu to configure the pins used by I2C0.
+
+	if RP2040_PWM5
+			
+		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_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 # PWM_MULTICHAN && PWM_NCHANNELS > 1
+
+		config RP2040_PWM5_PHASE_CORRECT
+			bool "PWM5 phase correct"
+			default n
+
+	endif # RP2040_PWM5
+
+#####################################################################
 
 	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.
+			See the Board Selection menu to configure the pins used by I2C0.
+
+	if RP2040_PWM6
+			
+		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_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 # PWM_MULTICHAN && PWM_NCHANNELS > 1
+
+		config RP2040_PWM6_PHASE_CORRECT
+			bool "PWM6 phase correct"
+			default n
+
+	endif # RP2040_PWM6
+
+#####################################################################
 
 	config RP2040_PWM7
 		bool "PWM7"
 		---help---
-			Drives GPIO pin 14 with the A channel, and
-			drives GPIO pin 15 with the B channel.
+			See the Board Selection menu to configure the pins used by I2C0.
 
-endif
+	if RP2040_PWM7
+			
+		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
+
+			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 # PWM_MULTICHAN && PWM_NCHANNELS > 1
+
+		config RP2040_PWM7_PHASE_CORRECT
+			bool "PWM7 phase correct"
+			default n
+
+	endif # RP2040_PWM7
+			
+endif # RP2040_PWM
+
+#####################################################################
+#  I2S Configuration
+#####################################################################
 
 config RP2040_I2S
 	bool "I2S"
 	select I2S
-
-if RP2040_I2S
-
-config RP2040_I2S_MAXINFLIGHT
-	int "I2S queue size"
-	default 16
 	---help---
-		This is the total number of transfers that can be enqueue before
-		the caller is required to wait.  This setting determines the number
-		certain queue data structures that will be pre-allocated.
+		See the Board Selection menu to configure the pins used by I2S.
 
-config RP2040_I2S_DATALEN
-	int "Data width (bits)"
-	default 16
-	---help---
-		Data width in bits.  This is a default value and may be change
-		via the I2S interface
+if RP2040_I2S
 
-config RP2040_I2S_DATA
-	int "I2S DATA GPIO pin assign (0-29)"
-	default 9
-	range 0 29
+	config RP2040_I2S_MAXINFLIGHT
+		int "I2S queue size"
+		default 16
+		---help---
+			This is the total number of transfers that can be enqueue before
+			the caller is required to wait.  This setting determines the number
+			certain queue data structures that will be pre-allocated.
 
-config RP2040_I2S_CLOCK
-	int "I2S CLOCk GPIO pin assign (0-29)"
-	default 10
-	range 0 29
+	config RP2040_I2S_DATALEN
+		int "Data width (bits)"
+		default 16
+		---help---
+			Data width in bits.  This is a default value and may be change
+			via the I2S interface
 
-config RP2040_I2S_PIO
-	int "RP2040 PIO number used for I2S (0-1)"
-	default 0
-	range 0 1
+	config RP2040_I2S_PIO
+		int "RP2040 PIO number used for I2S (0-1)"
+		default 0
+		range 0 1
 
-config RP2040_I2S_PIO_SM
-	int "RP2040 PIO state machine number used for I2S (0-3)"
-	default 0
-	range 0 3
+	config RP2040_I2S_PIO_SM
+		int "RP2040 PIO state machine number used for I2S (0-3)"
+		default 0
+		range 0 3
 
 endif
+		
+#####################################################################
+#  I2S Configuration
+#####################################################################
 
-menuconfig RP2040_SPISD
+config RP2040_SPISD
 	bool "SPI SD Card"
 	default n
 	select MMCSD_SPI
 
 if RP2040_SPISD
 
-config RP2040_SPISD_SLOT_NO
-	int "SPI SD Card Slot Number"
-	default 0
-	---help---
-		Select spi sd card slot number.
+	config RP2040_SPISD_SLOT_NO
+		int "SPI SD Card Slot Number"
+		default 0
+		---help---
+			Select spi sd card slot number.
 
-config RP2040_SPISD_SPI_CH
-	int "SPI channel number"
-	default 0
-	range 0 1
-	---help---
-		Select spi channel number to use spi sd card.
+	config RP2040_SPISD_SPI_CH
+		int "SPI channel number"
+		default 0
+		range 0 1
+		---help---
+			Select spi channel number to use spi sd card.
 
 endif # SPISD Configuration
 
+#####################################################################
+#  ADC Configuration
+#####################################################################
+
+config RP2040_ADC
+	bool "Enable ADC Support"
+	default n
+	---help---
+		If y, the RP2040 ADC code will be built.
+		If the ADC device driver is not built, basic functions
+		to programmatically access the ADC ports will be added.
+
+if RP2040_ADC
+
+	config ADC
+		bool "Include ADC device driver"
+		default n
+		---help---
+			Additional ADC device drivers can be set under the
+			"Analog-to-Digital Conversion" item in the
+			"Device Driver/Analog Device Support" menu.
+
+	if ADC
+
+		config RPC2040_ADC_CHANNEL0
+			bool "Read ADC channel 0"
+			default n
+			---help---
+				If y, then ADC0 will be read.
+
+		config RPC2040_ADC_CHANNEL1
+			bool "Read ADC channel 1"
+			default n
+			---help---
+				If y, then ADC1 will be read.
+
+		config RPC2040_ADC_CHANNEL2
+			bool "Read ADC channel 2"
+			default n
+			---help---
+				If y, then ADC2 will be read.
+
+			config RPC2040_ADC_CHANNEL3
+			bool "Read ADC channel 3"
+			default n
+			---help---
+				If y, then ADC3 will be read.
+
+			config RPC2040_ADC_TEMPERATURE
+			bool "Read ADC chip temperature channel"
+			default n
+			---help---
+				If y, then the ADC chip temperature
+				will be read.
+		
+	endif # ADC
+
+endif # RP2040_ADC
+		
+#####################################################################
+#  WS2812 Configuration
+#####################################################################
+
 config RP2040_BOARD_HAS_WS2812
 	bool "Has ws2812 pixels"
 	default n
 	depends on WS2812
-
-menuconfig RP2040_WS2812_GPIO_PIN
-	int "GPIO pin for ws2812 pixels"
-	default 0
-	range 0 29
-	depends on RP2040_BOARD_HAS_WS2812
+	---help---
+		See the Board Selection menu to configure the pins used
+		by ws2812.
diff --git a/arch/arm/src/rp2040/rp2040_i2c_slave.c b/arch/arm/src/rp2040/rp2040_i2c_slave.c
index 5ca199f127..b64fee3b6f 100644
--- a/arch/arm/src/rp2040/rp2040_i2c_slave.c
+++ b/arch/arm/src/rp2040/rp2040_i2c_slave.c
@@ -487,15 +487,15 @@ struct i2c_slave_s * rp2040_i2c0_slave_initialize
 {
   rp2040_i2c_slave_t *priv = &i2c0_slave_dev;
 
-  rp2040_gpio_set_function(CONFIG_RP2040_I2C0_SLAVE_SDA,
+  rp2040_gpio_set_function(CONFIG_RP2040_I2C0_SDA_GPIO,
                            RP2040_GPIO_FUNC_I2C);
 
-  rp2040_gpio_set_pulls(CONFIG_RP2040_I2C0_SLAVE_SDA, true, false);
+  rp2040_gpio_set_pulls(CONFIG_RP2040_I2C0_SDA_GPIO, true, false);
 
-  rp2040_gpio_set_function(CONFIG_RP2040_I2C0_SLAVE_SCL,
+  rp2040_gpio_set_function(CONFIG_RP2040_I2C0_SCL_GPIO,
                            RP2040_GPIO_FUNC_I2C);
 
-  rp2040_gpio_set_pulls(CONFIG_RP2040_I2C0_SLAVE_SCL, true, false);
+  rp2040_gpio_set_pulls(CONFIG_RP2040_I2C0_SCL_GPIO, true, false);
 
   priv->rx_buffer  = rx_buffer;
   priv->rx_buf_ptr = rx_buffer;
@@ -552,15 +552,15 @@ struct i2c_slave_s * rp2040_i2c1_slave_initialize
 {
   rp2040_i2c_slave_t *priv = &i2c1_slave_dev;
 
-  rp2040_gpio_set_function(CONFIG_RP2040_I2C1_SLAVE_SDA,
+  rp2040_gpio_set_function(CONFIG_RP2040_I2C1_SDA_GPIO,
                            RP2040_GPIO_FUNC_I2C);
 
-  rp2040_gpio_set_pulls(CONFIG_RP2040_I2C1_SLAVE_SDA, true, false);
+  rp2040_gpio_set_pulls(CONFIG_RP2040_I2C1_SDA_GPIO, true, false);
 
-  rp2040_gpio_set_function(CONFIG_RP2040_I2C1_SLAVE_SCL,
+  rp2040_gpio_set_function(CONFIG_RP2040_I2C1_SCL_GPIO,
                            RP2040_GPIO_FUNC_I2C);
 
-  rp2040_gpio_set_pulls(CONFIG_RP2040_I2C1_SLAVE_SCL, true, false);
+  rp2040_gpio_set_pulls(CONFIG_RP2040_I2C1_SCL_GPIO, true, false);
 
   priv->rx_buffer  = rx_buffer;
   priv->rx_buf_ptr = rx_buffer;
diff --git a/arch/arm/src/rp2040/rp2040_ws2812.c b/arch/arm/src/rp2040/rp2040_ws2812.c
index b2ab9aed4e..7e0837354a 100644
--- a/arch/arm/src/rp2040/rp2040_ws2812.c
+++ b/arch/arm/src/rp2040/rp2040_ws2812.c
@@ -48,6 +48,7 @@ struct instance
   FAR uint8_t          *pixels;       /* Buffer to hold pixels             */
   size_t                open_count;   /* Number of opens on this instance. */
   clock_t               last_dma;     /* when last DMA completed.          */
+  int                   power_pin;    /* pin for ws2812 power              */
 };
 
 /****************************************************************************
@@ -168,57 +169,40 @@ static int my_open(FAR struct file *filep)
 {
   FAR struct inode         *inode     = filep->f_inode;
   FAR struct ws2812_dev_s  *dev_data  = inode->i_private;
-  FAR struct instance      *priv;
+  FAR struct instance      *priv      = (FAR struct instance *)
+                                                  dev_data->private;
   rp2040_pio_sm_config      config;
   int                       divisor;
   int                       ret;
 
   nxsem_wait(&dev_data->exclsem);
 
-  if (dev_data->private != NULL)
+  priv->open_count += 1;
+
+  if (priv->pixels != NULL)
     {
       /* We've already been initialized.  Keep on truckin' */
 
       ledinfo("rp2040_ws2812 re-open dev: 0x%08lX\n", (uint32_t) dev_data);
 
-      priv     = (FAR struct instance *) dev_data->private;
-      priv->open_count += 1;
-
       ret = OK;
       goto post_and_return;
     }
 
   ledinfo("rp2040_ws2812 open dev: 0x%08lX\n", (uint32_t) dev_data);
 
-  /* Allocate struct holding out persistent data */
-
-  priv = kmm_zalloc(sizeof(struct instance));
-
-  if (priv == NULL)
-    {
-      lederr("rp2040_ws2812 open: out of memory\n");
-
-      ret = -ENOMEM;
-      goto post_and_return;
-    }
-
-  priv->open_count = 1;
-
   /* Allocate the pixel buffer */
 
-  priv->pixels    = kmm_zalloc(4 * dev_data->nleds);
+  priv->pixels = kmm_zalloc(4 * dev_data->nleds);
 
   if (priv->pixels == NULL)
     {
-      kmm_free(priv);
       lederr("rp2040_ws2812 open: out of memory\n");
 
       ret = -ENOMEM;
       goto post_and_return;
     }
 
-  dev_data->private = priv;
-
   /* ==== Load the pio program ==== */
 
   /* get pio instance and load program */
@@ -254,9 +238,6 @@ static int my_open(FAR struct file *filep)
     {
       kmm_free(priv->pixels);
 
-      dev_data->private = NULL;
-      kmm_free(priv);
-
       ret = -ENOMEM;
       goto post_and_return;
     }
@@ -329,6 +310,15 @@ static int my_open(FAR struct file *filep)
 
   rp2040_pio_sm_set_enabled(priv->pio, priv->pio_sm, true);
 
+  /* Turn on the power pin if any */
+
+  if (priv->power_pin >= 0)
+    {
+      rp2040_gpio_init(priv->power_pin);
+      rp2040_gpio_setdir(priv->power_pin, true);
+      rp2040_gpio_put(priv->power_pin, true);
+    }
+
   ret = OK;
 
 post_and_return:
@@ -363,6 +353,11 @@ static int my_close(FAR struct file *filep)
 
   priv->open_count -= 1;
 
+  if (priv->open_count == 0  &&  priv->power_pin >= 0)
+    {
+      rp2040_gpio_put(priv->power_pin, false);
+    }
+
   nxsem_post(&dev_data->exclsem);
 
   return OK;
@@ -538,6 +533,7 @@ static ssize_t my_read(FAR struct file *filep,
  * Input Parameters:
  *   Path to the ws2812 device  (e.g. "/dev/leds0")
  *   Port number for the ws2812 chain
+ *   Pin for ws2812 power
  *   The number of pixels in the chain
  *   Whether ws2812s have white LEDs
  *
@@ -548,10 +544,12 @@ static ssize_t my_read(FAR struct file *filep,
 
 FAR void * rp2040_ws2812_setup(FAR const char *path,
                                int             port,
+                               int             power_pin,
                                uint16_t        pixel_count,
                                bool            has_white)
 {
   FAR struct ws2812_dev_s * dev_data;
+  FAR struct instance     * priv;
   int err;
 
   dev_data = kmm_zalloc(sizeof(struct ws2812_dev_s));
@@ -562,6 +560,19 @@ FAR void * rp2040_ws2812_setup(FAR const char *path,
       return NULL;
     }
 
+  /* Allocate struct holding out persistent data */
+
+  priv = kmm_zalloc(sizeof(struct instance));
+
+  if (priv == NULL)
+    {
+      lederr("rp2040_ws2812 open: out of memory\n");
+
+      kmm_free(dev_data);
+      set_errno(ENOMEM);
+      return NULL;
+    }
+
   dev_data->open      = my_open;
   dev_data->close     = my_close;
   dev_data->write     = my_write;
@@ -569,9 +580,12 @@ FAR void * rp2040_ws2812_setup(FAR const char *path,
   dev_data->port      = port;
   dev_data->nleds     = pixel_count;
   dev_data->clock     = CONFIG_WS2812_FREQUENCY;
+  dev_data->private   = priv;
 
   nxsem_init(&dev_data->exclsem, 0, 1);
 
+  priv->power_pin     = power_pin;
+
   ledinfo("register dev_data: 0x%08lX\n", (uint32_t) dev_data);
 
   err = ws2812_register(path, dev_data);
diff --git a/arch/arm/src/rp2040/rp2040_ws2812.h b/arch/arm/src/rp2040/rp2040_ws2812.h
index 3f91cfc9fe..8513637b10 100644
--- a/arch/arm/src/rp2040/rp2040_ws2812.h
+++ b/arch/arm/src/rp2040/rp2040_ws2812.h
@@ -53,6 +53,7 @@ extern "C"
  * Input Parameters:
  *   Path to the ws2812 device  (e.g. "/dev/leds0")
  *   Port number for the ws2812 chain
+ *   Pin for ws2812 power
  *   The number of pixels in the chain
  *   Whether ws2812s have white LEDs
  *
@@ -63,6 +64,7 @@ extern "C"
 
 FAR void * rp2040_ws2812_setup(FAR const char *path,
                                int             port,
+                               int             power_pin,
                                uint16_t        pixel_count,
                                bool            has_white);
 
diff --git a/boards/Kconfig b/boards/Kconfig
index 6a63aa24ff..877e1a272f 100644
--- a/boards/Kconfig
+++ b/boards/Kconfig
@@ -1494,6 +1494,13 @@ config ARCH_BOARD_ADAFRUIT_KB2040
 		This is a port to the Adafruit KB2040 board.
 		Support is derived from Raspberry Pi Pico support.
 
+config ARCH_BOARD_ADAFRUIT_QT_PY_RP2040
+	bool "Adafruit QT Py RP2040 board"
+	depends on ARCH_CHIP_RP2040
+	---help---
+		This is a port to the Adafruit QT Py RP2040 board.
+		Support is derived from Raspberry Pi Pico support.
+
 config ARCH_BOARD_RX65N
 	bool "RX65N renesas board"
 	depends on ARCH_CHIP_R5F565NEDDFC
@@ -2645,6 +2652,7 @@ config ARCH_BOARD
 	default "pimoroni-tiny2040"        if ARCH_BOARD_PIMORONI_TINY2040
 	default "adafruit-feather-rp2040"  if ARCH_BOARD_ADAFRUIT_FEATHER_RP2040
 	default "adafruit-kb2040"          if ARCH_BOARD_ADAFRUIT_KB2040
+	default "adafruit-qt-py-rp2040"    if ARCH_BOARD_ADAFRUIT_QT_PY_RP2040
 	default "rx65n"                    if ARCH_BOARD_RX65N
 	default "rx65n-rsk1mb"             if ARCH_BOARD_RX65N_RSK1MB
 	default "rx65n-rsk2mb"             if ARCH_BOARD_RX65N_RSK2MB
@@ -2989,6 +2997,9 @@ endif
 if ARCH_BOARD_ADAFRUIT_KB2040
 source "boards/arm/rp2040/adafruit-kb2040/Kconfig"
 endif
+if ARCH_BOARD_ADAFRUIT_QT_PY_RP2040
+source "boards/arm/rp2040/adafruit-qt-py-rp2040/Kconfig"
+endif
 if ARCH_BOARD_ARDUINO_DUE
 source "boards/arm/sam34/arduino-due/Kconfig"
 endif
diff --git a/boards/arm/rp2040/adafruit-feather-rp2040/Kconfig b/boards/arm/rp2040/adafruit-feather-rp2040/Kconfig
index 87b4d88e4a..c73c7671a4 100644
--- a/boards/arm/rp2040/adafruit-feather-rp2040/Kconfig
+++ b/boards/arm/rp2040/adafruit-feather-rp2040/Kconfig
@@ -13,11 +13,12 @@ config RP2040_FLASH_BOOT
 		If not, the binary is for SRAM boot.
 
 config RP2040_FLASH_CHIP
-	string "flash chip name"
+	string "Second stage boot loader"
 	default "w25q080"
 	---help---
-		Name of NOR flash device connected to RP2040 SoC.
-		(Used to choose the secondary boot loader.)
+		This is the name of the Pico-SDK second stage boot loader
+		to use for this board.  This board using a Q64 flash chip
+		which is compatible with the w25q080 boot loader.
 		Basically this option should not be changed.
 
 config RP2040_UF2_BINARY
@@ -26,291 +27,6 @@ config RP2040_UF2_BINARY
 	---help---
 		Create nuttx.uf2 binary format used on RP2040 based arch.
 
-config RP2040_UART0_GPIO
-	int "UART0 GPIO pin assign (0,12,28 or -1:no assign)"
-	default 0
-	range -1 29
-	depends on RP2040_UART0
-
-config RP2040_UART1_GPIO
-	int "UART1 GPIO pin assign (8,20,24 or -1:no assign)"
-	default -1
-	range -1 29
-	depends on RP2040_UART1
-
-config RP2040_I2C0_GPIO
-	int "I2C0 GPIO pin assign (0,8,12,20,24,28 or -1:no assign)"
-	default -1
-	range -1 29
-	depends on RP2040_I2C0
-
-config RP2040_I2C1_GPIO
-	int "I2C1 GPIO pin assign (2,6,10,18,26 or -1:no assign)"
-	default -1
-	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 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 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 (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.
-
-	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 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 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
-
-config RP2040_SPI0_GPIO
-	int "SPI0 GPIO pin assign (0,16 or -1:no assign)"
-	default -1
-	range -1 29
-	depends on RP2040_SPI0
-
-config RP2040_SPI1_GPIO
-	int "SPI1 GPIO pin assign (8,24,28 or -1:no assign)"
-	default -1
-	range -1 29
-	depends on RP2040_SPI1
-
 config RP2040_LCD_SPI_CH
 	int "RP2040 LCD SPI channel number"
 	default 0
diff --git a/boards/arm/rp2040/adafruit-feather-rp2040/configs/audiopack/defconfig b/boards/arm/rp2040/adafruit-feather-rp2040/configs/audiopack/defconfig
index a9238b9ead..da306fb9a6 100644
--- a/boards/arm/rp2040/adafruit-feather-rp2040/configs/audiopack/defconfig
+++ b/boards/arm/rp2040/adafruit-feather-rp2040/configs/audiopack/defconfig
@@ -22,7 +22,6 @@
 CONFIG_ARCH="arm"
 CONFIG_ARCH_BOARD="adafruit-feather-rp2040"
 CONFIG_ARCH_BOARD_ADAFRUIT_FEATHER_RP2040=y
-CONFIG_ARCH_BOARD_COMMON=y
 CONFIG_ARCH_CHIP="rp2040"
 CONFIG_ARCH_CHIP_RP2040=y
 CONFIG_ARCH_RAMVECTORS=y
@@ -55,7 +54,10 @@ CONFIG_READLINE_CMD_HISTORY=y
 CONFIG_RP2040_BOARD_HAS_WS2812=y
 CONFIG_RP2040_I2S=y
 CONFIG_RP2040_SPI0=y
-CONFIG_RP2040_SPI0_GPIO=16
+CONFIG_RP2040_SPI0_CS_GPIO=5
+CONFIG_RP2040_SPI0_RX_GPIO=4
+CONFIG_RP2040_SPI0_SCK_GPIO=6
+CONFIG_RP2040_SPI0_TX_GPIO=7
 CONFIG_RP2040_SPI=y
 CONFIG_RP2040_SPISD=y
 CONFIG_RP2040_WS2812_GPIO_PIN=16
diff --git a/boards/arm/rp2040/adafruit-feather-rp2040/configs/composite/defconfig b/boards/arm/rp2040/adafruit-feather-rp2040/configs/composite/defconfig
index 2872983bfc..f7147bcb39 100644
--- a/boards/arm/rp2040/adafruit-feather-rp2040/configs/composite/defconfig
+++ b/boards/arm/rp2040/adafruit-feather-rp2040/configs/composite/defconfig
@@ -18,7 +18,6 @@
 CONFIG_ARCH="arm"
 CONFIG_ARCH_BOARD="adafruit-feather-rp2040"
 CONFIG_ARCH_BOARD_ADAFRUIT_FEATHER_RP2040=y
-CONFIG_ARCH_BOARD_COMMON=y
 CONFIG_ARCH_CHIP="rp2040"
 CONFIG_ARCH_CHIP_RP2040=y
 CONFIG_ARCH_RAMVECTORS=y
@@ -54,7 +53,10 @@ CONFIG_RAM_START=0x20000000
 CONFIG_READLINE_CMD_HISTORY=y
 CONFIG_RP2040_BOARD_HAS_WS2812=y
 CONFIG_RP2040_SPI0=y
-CONFIG_RP2040_SPI0_GPIO=16
+CONFIG_RP2040_SPI0_CS_GPIO=5
+CONFIG_RP2040_SPI0_RX_GPIO=4
+CONFIG_RP2040_SPI0_SCK_GPIO=6
+CONFIG_RP2040_SPI0_TX_GPIO=7
 CONFIG_RP2040_SPI=y
 CONFIG_RP2040_SPISD=y
 CONFIG_RP2040_WS2812_GPIO_PIN=16
diff --git a/boards/arm/rp2040/adafruit-feather-rp2040/configs/displaypack/defconfig b/boards/arm/rp2040/adafruit-feather-rp2040/configs/displaypack/defconfig
index d727b5327f..92d150608c 100644
--- a/boards/arm/rp2040/adafruit-feather-rp2040/configs/displaypack/defconfig
+++ b/boards/arm/rp2040/adafruit-feather-rp2040/configs/displaypack/defconfig
@@ -21,7 +21,6 @@
 CONFIG_ARCH="arm"
 CONFIG_ARCH_BOARD="adafruit-feather-rp2040"
 CONFIG_ARCH_BOARD_ADAFRUIT_FEATHER_RP2040=y
-CONFIG_ARCH_BOARD_COMMON=y
 CONFIG_ARCH_CHIP="rp2040"
 CONFIG_ARCH_CHIP_RP2040=y
 CONFIG_ARCH_RAMVECTORS=y
@@ -82,7 +81,10 @@ CONFIG_RAM_START=0x20000000
 CONFIG_READLINE_CMD_HISTORY=y
 CONFIG_RP2040_BOARD_HAS_WS2812=y
 CONFIG_RP2040_SPI0=y
-CONFIG_RP2040_SPI0_GPIO=16
+CONFIG_RP2040_SPI0_CS_GPIO=5
+CONFIG_RP2040_SPI0_RX_GPIO=4
+CONFIG_RP2040_SPI0_SCK_GPIO=6
+CONFIG_RP2040_SPI0_TX_GPIO=7
 CONFIG_RP2040_SPI=y
 CONFIG_RP2040_WS2812_GPIO_PIN=16
 CONFIG_RR_INTERVAL=200
diff --git a/boards/arm/rp2040/adafruit-feather-rp2040/configs/enc28j60/defconfig b/boards/arm/rp2040/adafruit-feather-rp2040/configs/enc28j60/defconfig
index 72e13ca259..2a8f1a72af 100644
--- a/boards/arm/rp2040/adafruit-feather-rp2040/configs/enc28j60/defconfig
+++ b/boards/arm/rp2040/adafruit-feather-rp2040/configs/enc28j60/defconfig
@@ -15,7 +15,6 @@
 CONFIG_ARCH="arm"
 CONFIG_ARCH_BOARD="adafruit-feather-rp2040"
 CONFIG_ARCH_BOARD_ADAFRUIT_FEATHER_RP2040=y
-CONFIG_ARCH_BOARD_COMMON=y
 CONFIG_ARCH_CHIP="rp2040"
 CONFIG_ARCH_CHIP_RP2040=y
 CONFIG_ARCH_RAMVECTORS=y
@@ -57,12 +56,14 @@ CONFIG_RAM_SIZE=270336
 CONFIG_RAM_START=0x20000000
 CONFIG_READLINE_CMD_HISTORY=y
 CONFIG_RP2040_BOARD_HAS_WS2812=y
-CONFIG_RP2040_ENC28J60_INTR_GPIO=11
-CONFIG_RP2040_ENC28J60_RESET_GPIO=10
+CONFIG_RP2040_ENC28J60_INTR_GPIO=19
+CONFIG_RP2040_ENC28J60_RESET_GPIO=18
 CONFIG_RP2040_SPI0=y
-CONFIG_RP2040_SPI0_GPIO=16
+CONFIG_RP2040_SPI0_CS_GPIO=5
+CONFIG_RP2040_SPI0_RX_GPIO=4
+CONFIG_RP2040_SPI0_SCK_GPIO=6
+CONFIG_RP2040_SPI0_TX_GPIO=7
 CONFIG_RP2040_SPI1=y
-CONFIG_RP2040_SPI1_GPIO=12
 CONFIG_RP2040_SPI=y
 CONFIG_RP2040_WS2812_GPIO_PIN=16
 CONFIG_RR_INTERVAL=200
diff --git a/boards/arm/rp2040/adafruit-feather-rp2040/configs/lcd1602/defconfig b/boards/arm/rp2040/adafruit-feather-rp2040/configs/lcd1602/defconfig
index f3ce6b844b..247debdc39 100644
--- a/boards/arm/rp2040/adafruit-feather-rp2040/configs/lcd1602/defconfig
+++ b/boards/arm/rp2040/adafruit-feather-rp2040/configs/lcd1602/defconfig
@@ -15,7 +15,6 @@
 CONFIG_ARCH="arm"
 CONFIG_ARCH_BOARD="adafruit-feather-rp2040"
 CONFIG_ARCH_BOARD_ADAFRUIT_FEATHER_RP2040=y
-CONFIG_ARCH_BOARD_COMMON=y
 CONFIG_ARCH_CHIP="rp2040"
 CONFIG_ARCH_CHIP_RP2040=y
 CONFIG_ARCH_RAMVECTORS=y
@@ -42,7 +41,8 @@ CONFIG_RAM_START=0x20000000
 CONFIG_READLINE_CMD_HISTORY=y
 CONFIG_RP2040_BOARD_HAS_WS2812=y
 CONFIG_RP2040_I2C0=y
-CONFIG_RP2040_I2C0_GPIO=4
+CONFIG_RP2040_I2C0_SCL_GPIO=9
+CONFIG_RP2040_I2C0_SDA_GPIO=8
 CONFIG_RP2040_I2C=y
 CONFIG_RP2040_I2C_DRIVER=y
 CONFIG_RP2040_WS2812_GPIO_PIN=16
diff --git a/boards/arm/rp2040/adafruit-feather-rp2040/configs/nsh/defconfig b/boards/arm/rp2040/adafruit-feather-rp2040/configs/nsh/defconfig
index 6ba24969c2..ad2f809572 100644
--- a/boards/arm/rp2040/adafruit-feather-rp2040/configs/nsh/defconfig
+++ b/boards/arm/rp2040/adafruit-feather-rp2040/configs/nsh/defconfig
@@ -15,7 +15,6 @@
 CONFIG_ARCH="arm"
 CONFIG_ARCH_BOARD="adafruit-feather-rp2040"
 CONFIG_ARCH_BOARD_ADAFRUIT_FEATHER_RP2040=y
-CONFIG_ARCH_BOARD_COMMON=y
 CONFIG_ARCH_CHIP="rp2040"
 CONFIG_ARCH_CHIP_RP2040=y
 CONFIG_ARCH_RAMVECTORS=y
diff --git a/boards/arm/rp2040/adafruit-feather-rp2040/configs/nshsram/defconfig b/boards/arm/rp2040/adafruit-feather-rp2040/configs/nshsram/defconfig
index 89ed83f457..a623a02793 100644
--- a/boards/arm/rp2040/adafruit-feather-rp2040/configs/nshsram/defconfig
+++ b/boards/arm/rp2040/adafruit-feather-rp2040/configs/nshsram/defconfig
@@ -16,7 +16,6 @@
 CONFIG_ARCH="arm"
 CONFIG_ARCH_BOARD="adafruit-feather-rp2040"
 CONFIG_ARCH_BOARD_ADAFRUIT_FEATHER_RP2040=y
-CONFIG_ARCH_BOARD_COMMON=y
 CONFIG_ARCH_CHIP="rp2040"
 CONFIG_ARCH_CHIP_RP2040=y
 CONFIG_ARCH_STACKDUMP=y
diff --git a/boards/arm/rp2040/adafruit-feather-rp2040/configs/smp/defconfig b/boards/arm/rp2040/adafruit-feather-rp2040/configs/smp/defconfig
index 2f08ff6743..b67fa9c1af 100644
--- a/boards/arm/rp2040/adafruit-feather-rp2040/configs/smp/defconfig
+++ b/boards/arm/rp2040/adafruit-feather-rp2040/configs/smp/defconfig
@@ -15,7 +15,6 @@
 CONFIG_ARCH="arm"
 CONFIG_ARCH_BOARD="adafruit-feather-rp2040"
 CONFIG_ARCH_BOARD_ADAFRUIT_FEATHER_RP2040=y
-CONFIG_ARCH_BOARD_COMMON=y
 CONFIG_ARCH_CHIP="rp2040"
 CONFIG_ARCH_CHIP_RP2040=y
 CONFIG_ARCH_INTERRUPTSTACK=2048
diff --git a/boards/arm/rp2040/adafruit-feather-rp2040/configs/spisd/defconfig b/boards/arm/rp2040/adafruit-feather-rp2040/configs/spisd/defconfig
index b8493f32fb..1b0e4fe46d 100644
--- a/boards/arm/rp2040/adafruit-feather-rp2040/configs/spisd/defconfig
+++ b/boards/arm/rp2040/adafruit-feather-rp2040/configs/spisd/defconfig
@@ -18,7 +18,6 @@
 CONFIG_ARCH="arm"
 CONFIG_ARCH_BOARD="adafruit-feather-rp2040"
 CONFIG_ARCH_BOARD_ADAFRUIT_FEATHER_RP2040=y
-CONFIG_ARCH_BOARD_COMMON=y
 CONFIG_ARCH_CHIP="rp2040"
 CONFIG_ARCH_CHIP_RP2040=y
 CONFIG_ARCH_RAMVECTORS=y
@@ -46,7 +45,6 @@ CONFIG_RAM_START=0x20000000
 CONFIG_READLINE_CMD_HISTORY=y
 CONFIG_RP2040_BOARD_HAS_WS2812=y
 CONFIG_RP2040_SPI0=y
-CONFIG_RP2040_SPI0_GPIO=16
 CONFIG_RP2040_SPI=y
 CONFIG_RP2040_SPISD=y
 CONFIG_RP2040_WS2812_GPIO_PIN=16
diff --git a/boards/arm/rp2040/adafruit-feather-rp2040/configs/ssd1306/defconfig b/boards/arm/rp2040/adafruit-feather-rp2040/configs/ssd1306/defconfig
index df472a28e7..0ba16157d8 100644
--- a/boards/arm/rp2040/adafruit-feather-rp2040/configs/ssd1306/defconfig
+++ b/boards/arm/rp2040/adafruit-feather-rp2040/configs/ssd1306/defconfig
@@ -18,7 +18,6 @@
 CONFIG_ARCH="arm"
 CONFIG_ARCH_BOARD="adafruit-feather-rp2040"
 CONFIG_ARCH_BOARD_ADAFRUIT_FEATHER_RP2040=y
-CONFIG_ARCH_BOARD_COMMON=y
 CONFIG_ARCH_CHIP="rp2040"
 CONFIG_ARCH_CHIP_RP2040=y
 CONFIG_ARCH_RAMVECTORS=y
@@ -61,7 +60,8 @@ CONFIG_RAM_START=0x20000000
 CONFIG_READLINE_CMD_HISTORY=y
 CONFIG_RP2040_BOARD_HAS_WS2812=y
 CONFIG_RP2040_I2C0=y
-CONFIG_RP2040_I2C0_GPIO=4
+CONFIG_RP2040_I2C0_SCL_GPIO=9
+CONFIG_RP2040_I2C0_SDA_GPIO=8
 CONFIG_RP2040_I2C=y
 CONFIG_RP2040_I2C_DRIVER=y
 CONFIG_RP2040_WS2812_GPIO_PIN=16
diff --git a/boards/arm/rp2040/adafruit-feather-rp2040/configs/st7735/defconfig b/boards/arm/rp2040/adafruit-feather-rp2040/configs/st7735/defconfig
index 7e3b081237..157b1429e8 100644
--- a/boards/arm/rp2040/adafruit-feather-rp2040/configs/st7735/defconfig
+++ b/boards/arm/rp2040/adafruit-feather-rp2040/configs/st7735/defconfig
@@ -15,7 +15,6 @@
 CONFIG_ARCH="arm"
 CONFIG_ARCH_BOARD="adafruit-feather-rp2040"
 CONFIG_ARCH_BOARD_ADAFRUIT_FEATHER_RP2040=y
-CONFIG_ARCH_BOARD_COMMON=y
 CONFIG_ARCH_CHIP="rp2040"
 CONFIG_ARCH_CHIP_RP2040=y
 CONFIG_ARCH_RAMVECTORS=y
@@ -45,7 +44,6 @@ CONFIG_RAM_START=0x20000000
 CONFIG_READLINE_CMD_HISTORY=y
 CONFIG_RP2040_BOARD_HAS_WS2812=y
 CONFIG_RP2040_SPI1=y
-CONFIG_RP2040_SPI1_GPIO=12
 CONFIG_RP2040_SPI=y
 CONFIG_RP2040_WS2812_GPIO_PIN=16
 CONFIG_RR_INTERVAL=200
diff --git a/boards/arm/rp2040/adafruit-feather-rp2040/configs/usbmsc/defconfig b/boards/arm/rp2040/adafruit-feather-rp2040/configs/usbmsc/defconfig
index 2da9edb2e1..3c4d5a8364 100644
--- a/boards/arm/rp2040/adafruit-feather-rp2040/configs/usbmsc/defconfig
+++ b/boards/arm/rp2040/adafruit-feather-rp2040/configs/usbmsc/defconfig
@@ -18,7 +18,6 @@
 CONFIG_ARCH="arm"
 CONFIG_ARCH_BOARD="adafruit-feather-rp2040"
 CONFIG_ARCH_BOARD_ADAFRUIT_FEATHER_RP2040=y
-CONFIG_ARCH_BOARD_COMMON=y
 CONFIG_ARCH_CHIP="rp2040"
 CONFIG_ARCH_CHIP_RP2040=y
 CONFIG_ARCH_RAMVECTORS=y
@@ -48,7 +47,10 @@ CONFIG_RAM_START=0x20000000
 CONFIG_READLINE_CMD_HISTORY=y
 CONFIG_RP2040_BOARD_HAS_WS2812=y
 CONFIG_RP2040_SPI0=y
-CONFIG_RP2040_SPI0_GPIO=16
+CONFIG_RP2040_SPI0_CS_GPIO=5
+CONFIG_RP2040_SPI0_RX_GPIO=4
+CONFIG_RP2040_SPI0_SCK_GPIO=6
+CONFIG_RP2040_SPI0_TX_GPIO=7
 CONFIG_RP2040_SPI=y
 CONFIG_RP2040_SPISD=y
 CONFIG_RP2040_WS2812_GPIO_PIN=16
diff --git a/boards/arm/rp2040/adafruit-feather-rp2040/configs/usbnsh/defconfig b/boards/arm/rp2040/adafruit-feather-rp2040/configs/usbnsh/defconfig
index 0739d67096..267862e657 100644
--- a/boards/arm/rp2040/adafruit-feather-rp2040/configs/usbnsh/defconfig
+++ b/boards/arm/rp2040/adafruit-feather-rp2040/configs/usbnsh/defconfig
@@ -16,7 +16,6 @@
 CONFIG_ARCH="arm"
 CONFIG_ARCH_BOARD="adafruit-feather-rp2040"
 CONFIG_ARCH_BOARD_ADAFRUIT_FEATHER_RP2040=y
-CONFIG_ARCH_BOARD_COMMON=y
 CONFIG_ARCH_CHIP="rp2040"
 CONFIG_ARCH_CHIP_RP2040=y
 CONFIG_ARCH_RAMVECTORS=y
diff --git a/boards/arm/rp2040/adafruit-feather-rp2040/configs/waveshare-lcd-1.14/defconfig b/boards/arm/rp2040/adafruit-feather-rp2040/configs/waveshare-lcd-1.14/defconfig
index 9728913ab7..f67c250c9a 100644
--- a/boards/arm/rp2040/adafruit-feather-rp2040/configs/waveshare-lcd-1.14/defconfig
+++ b/boards/arm/rp2040/adafruit-feather-rp2040/configs/waveshare-lcd-1.14/defconfig
@@ -20,7 +20,6 @@
 CONFIG_ARCH="arm"
 CONFIG_ARCH_BOARD="adafruit-feather-rp2040"
 CONFIG_ARCH_BOARD_ADAFRUIT_FEATHER_RP2040=y
-CONFIG_ARCH_BOARD_COMMON=y
 CONFIG_ARCH_CHIP="rp2040"
 CONFIG_ARCH_CHIP_RP2040=y
 CONFIG_ARCH_RAMVECTORS=y
@@ -79,7 +78,6 @@ CONFIG_READLINE_CMD_HISTORY=y
 CONFIG_RP2040_BOARD_HAS_WS2812=y
 CONFIG_RP2040_LCD_SPI_CH=1
 CONFIG_RP2040_SPI1=y
-CONFIG_RP2040_SPI1_GPIO=8
 CONFIG_RP2040_SPI=y
 CONFIG_RP2040_WS2812_GPIO_PIN=16
 CONFIG_RR_INTERVAL=200
diff --git a/boards/arm/rp2040/adafruit-feather-rp2040/configs/waveshare-lcd-1.3/defconfig b/boards/arm/rp2040/adafruit-feather-rp2040/configs/waveshare-lcd-1.3/defconfig
index 03d0591c5e..9e028c47e6 100644
--- a/boards/arm/rp2040/adafruit-feather-rp2040/configs/waveshare-lcd-1.3/defconfig
+++ b/boards/arm/rp2040/adafruit-feather-rp2040/configs/waveshare-lcd-1.3/defconfig
@@ -20,7 +20,6 @@
 CONFIG_ARCH="arm"
 CONFIG_ARCH_BOARD="adafruit-feather-rp2040"
 CONFIG_ARCH_BOARD_ADAFRUIT_FEATHER_RP2040=y
-CONFIG_ARCH_BOARD_COMMON=y
 CONFIG_ARCH_CHIP="rp2040"
 CONFIG_ARCH_CHIP_RP2040=y
 CONFIG_ARCH_RAMVECTORS=y
@@ -76,7 +75,6 @@ CONFIG_READLINE_CMD_HISTORY=y
 CONFIG_RP2040_BOARD_HAS_WS2812=y
 CONFIG_RP2040_LCD_SPI_CH=1
 CONFIG_RP2040_SPI1=y
-CONFIG_RP2040_SPI1_GPIO=8
 CONFIG_RP2040_SPI=y
 CONFIG_RP2040_WS2812_GPIO_PIN=16
 CONFIG_RR_INTERVAL=200
diff --git a/boards/arm/rp2040/adafruit-feather-rp2040/scripts/adafruit-feather-rp2040-flash.ld b/boards/arm/rp2040/adafruit-feather-rp2040/scripts/adafruit-feather-rp2040-flash.ld
index 997c14e84d..28c31bacc2 100644
--- a/boards/arm/rp2040/adafruit-feather-rp2040/scripts/adafruit-feather-rp2040-flash.ld
+++ b/boards/arm/rp2040/adafruit-feather-rp2040/scripts/adafruit-feather-rp2040-flash.ld
@@ -20,7 +20,7 @@
 
 MEMORY
 {
-  flash (rx) : ORIGIN = 0x10000000, LENGTH = 2048K
+  flash (rx) : ORIGIN = 0x10000000, LENGTH = 8192K
   sram (rwx) : ORIGIN = 0x20000000, LENGTH = 264K
 }
 
diff --git a/boards/arm/rp2040/adafruit-feather-rp2040/src/rp2040_boardinitialize.c b/boards/arm/rp2040/adafruit-feather-rp2040/src/rp2040_boardinitialize.c
index d408fadf0e..febd680071 100644
--- a/boards/arm/rp2040/adafruit-feather-rp2040/src/rp2040_boardinitialize.c
+++ b/boards/arm/rp2040/adafruit-feather-rp2040/src/rp2040_boardinitialize.c
@@ -70,32 +70,32 @@ void rp2040_boardearlyinitialize(void)
 
   /* Set default UART pin */
 
-#if defined(CONFIG_RP2040_UART0) && CONFIG_RP2040_UART0_GPIO >= 0
-  rp2040_gpio_set_function(CONFIG_RP2040_UART0_GPIO,
+#ifdef CONFIG_RP2040_UART0
+  rp2040_gpio_set_function(CONFIG_RP2040_UART0_TX_GPIO,
                            RP2040_GPIO_FUNC_UART);      /* TX */
-  rp2040_gpio_set_function(CONFIG_RP2040_UART0_GPIO + 1,
+  rp2040_gpio_set_function(CONFIG_RP2040_UART0_RX_GPIO,
                            RP2040_GPIO_FUNC_UART);      /* RX */
 #ifdef CONFIG_SERIAL_OFLOWCONTROL
-  rp2040_gpio_set_function(CONFIG_RP2040_UART0_GPIO + 2,
+  rp2040_gpio_set_function(CONFIG_RP2040_UART0_CTS_GPIO,
                            RP2040_GPIO_FUNC_UART);      /* CTS */
 #endif
 #ifdef CONFIG_SERIAL_IFLOWCONTROL
-  rp2040_gpio_set_function(CONFIG_RP2040_UART0_GPIO + 3,
+  rp2040_gpio_set_function(CONFIG_RP2040_UART0_RTS_GPIO,
                            RP2040_GPIO_FUNC_UART);      /* RTS */
 #endif
 #endif
 
-#if defined(CONFIG_RP2040_UART1) && CONFIG_RP2040_UART1_GPIO >= 0
-  rp2040_gpio_set_function(CONFIG_RP2040_UART1_GPIO,
+#ifdef CONFIG_RP2040_UART1
+  rp2040_gpio_set_function(CONFIG_RP2040_UART1_TX_GPIO,
                            RP2040_GPIO_FUNC_UART);      /* TX */
-  rp2040_gpio_set_function(CONFIG_RP2040_UART1_GPIO + 1,
+  rp2040_gpio_set_function(CONFIG_RP2040_UART1_RX_GPIO,
                            RP2040_GPIO_FUNC_UART);      /* RX */
 #ifdef CONFIG_SERIAL_OFLOWCONTROL
-  rp2040_gpio_set_function(CONFIG_RP2040_UART1_GPIO + 2,
+  rp2040_gpio_set_function(CONFIG_RP2040_UART1_CTS_GPIO,
                            RP2040_GPIO_FUNC_UART);      /* CTS */
 #endif
 #ifdef CONFIG_SERIAL_IFLOWCONTROL
-  rp2040_gpio_set_function(CONFIG_RP2040_UART1_GPIO + 3,
+  rp2040_gpio_set_function(CONFIG_RP2040_UART1_RTS_GPIO,
                            RP2040_GPIO_FUNC_UART);      /* RTS */
 #endif
 #endif
@@ -112,55 +112,55 @@ void rp2040_boardinitialize(void)
 {
   /* Set default I2C pin */
 
-#if defined(CONFIG_RP2040_I2C0) && CONFIG_RP2040_I2C0_GPIO >= 0
-  rp2040_gpio_set_function(CONFIG_RP2040_I2C0_GPIO,
+#ifdef CONFIG_RP2040_I2C0
+  rp2040_gpio_set_function(CONFIG_RP2040_I2C0_SDA_GPIO,
                            RP2040_GPIO_FUNC_I2C);       /* SDA */
-  rp2040_gpio_set_function(CONFIG_RP2040_I2C0_GPIO + 1,
+  rp2040_gpio_set_function(CONFIG_RP2040_I2C0_SCL_GPIO,
                            RP2040_GPIO_FUNC_I2C);       /* SCL */
 
-  rp2040_gpio_set_pulls(CONFIG_RP2040_I2C0_GPIO, true, false);  /* Pull up */
-  rp2040_gpio_set_pulls(CONFIG_RP2040_I2C0_GPIO + 1, true, false);
+  rp2040_gpio_set_pulls(CONFIG_RP2040_I2C0_SDA_GPIO, true, false);  /* Pull up */
+  rp2040_gpio_set_pulls(CONFIG_RP2040_I2C0_SCL_GPIO, true, false);
 #endif
 
-#if defined(CONFIG_RP2040_I2C1) &&  CONFIG_RP2040_I2C1_GPIO >= 0
-  rp2040_gpio_set_function(CONFIG_RP2040_I2C1_GPIO,
+#ifdef CONFIG_RP2040_I2C1
+  rp2040_gpio_set_function(CONFIG_RP2040_I2C1_SDA_GPIO,
                            RP2040_GPIO_FUNC_I2C);       /* SDA */
-  rp2040_gpio_set_function(CONFIG_RP2040_I2C1_GPIO + 1,
+  rp2040_gpio_set_function(CONFIG_RP2040_I2C1_SCL_GPIO,
                            RP2040_GPIO_FUNC_I2C);       /* SCL */
 
-  rp2040_gpio_set_pulls(CONFIG_RP2040_I2C1_GPIO, true, false);  /* Pull up */
-  rp2040_gpio_set_pulls(CONFIG_RP2040_I2C1_GPIO + 1, true, false);
+  rp2040_gpio_set_pulls(CONFIG_RP2040_I2C1_SDA_GPIO, true, false);  /* Pull up */
+  rp2040_gpio_set_pulls(CONFIG_RP2040_I2C1_SCL_GPIO, true, false);
 #endif
 
   /* Set default SPI pin */
 
-#if defined(CONFIG_RP2040_SPI0) && CONFIG_RP2040_SPI0_GPIO >= 0
-  rp2040_gpio_set_function(CONFIG_RP2040_SPI0_GPIO,
+#ifdef CONFIG_RP2040_SPI0
+  rp2040_gpio_set_function(CONFIG_RP2040_SPI0_RX_GPIO,
                            RP2040_GPIO_FUNC_SPI);       /* RX */
-  rp2040_gpio_set_function(CONFIG_RP2040_SPI0_GPIO + 2,
+  rp2040_gpio_set_function(CONFIG_RP2040_SPI0_SCK_GPIO,
                            RP2040_GPIO_FUNC_SPI);       /* SCK */
-  rp2040_gpio_set_function(CONFIG_RP2040_SPI0_GPIO + 3,
+  rp2040_gpio_set_function(CONFIG_RP2040_SPI0_TX_GPIO,
                            RP2040_GPIO_FUNC_SPI);       /* TX */
 
   /* CSn is controlled by board-specific logic */
 
-  rp2040_gpio_init(CONFIG_RP2040_SPI0_GPIO + 1);        /* CSn */
-  rp2040_gpio_setdir(CONFIG_RP2040_SPI0_GPIO + 1, true);
-  rp2040_gpio_put(CONFIG_RP2040_SPI0_GPIO + 1, true);
+  rp2040_gpio_init(CONFIG_RP2040_SPI0_CS_GPIO);        /* CSn */
+  rp2040_gpio_setdir(CONFIG_RP2040_SPI0_CS_GPIO, true);
+  rp2040_gpio_put(CONFIG_RP2040_SPI0_CS_GPIO, true);
 #endif
 
-#if defined(CONFIG_RP2040_SPI1) &&  CONFIG_RP2040_SPI1_GPIO >= 0
-  rp2040_gpio_set_function(CONFIG_RP2040_SPI1_GPIO,
+#ifdef CONFIG_RP2040_SPI1
+  rp2040_gpio_set_function(CONFIG_RP2040_SPI1_RX_GPIO,
                            RP2040_GPIO_FUNC_SPI);       /* RX */
-  rp2040_gpio_set_function(CONFIG_RP2040_SPI1_GPIO + 2,
+  rp2040_gpio_set_function(CONFIG_RP2040_SPI1_SCK_GPIO,
                            RP2040_GPIO_FUNC_SPI);       /* SCK */
-  rp2040_gpio_set_function(CONFIG_RP2040_SPI1_GPIO + 3,
+  rp2040_gpio_set_function(CONFIG_RP2040_SPI1_TX_GPIO,
                            RP2040_GPIO_FUNC_SPI);       /* TX */
 
   /* CSn is controlled by board-specific logic */
 
-  rp2040_gpio_init(CONFIG_RP2040_SPI1_GPIO + 1);        /* CSn */
-  rp2040_gpio_setdir(CONFIG_RP2040_SPI1_GPIO + 1, true);
-  rp2040_gpio_put(CONFIG_RP2040_SPI1_GPIO + 1, true);
+  rp2040_gpio_init(CONFIG_RP2040_SPI1_CS_GPIO);        /* CSn */
+  rp2040_gpio_setdir(CONFIG_RP2040_SPI1_CS_GPIO, true);
+  rp2040_gpio_put(CONFIG_RP2040_SPI1_CS_GPIO, true);
 #endif
 }
diff --git a/boards/arm/rp2040/adafruit-feather-rp2040/src/rp2040_bringup.c b/boards/arm/rp2040/adafruit-feather-rp2040/src/rp2040_bringup.c
index c0637c8131..6c678ac86a 100644
--- a/boards/arm/rp2040/adafruit-feather-rp2040/src/rp2040_bringup.c
+++ b/boards/arm/rp2040/adafruit-feather-rp2040/src/rp2040_bringup.c
@@ -462,6 +462,7 @@ int rp2040_bringup(void)
 #if defined(CONFIG_RP2040_BOARD_HAS_WS2812) && defined(CONFIG_WS2812)
   rp2040_ws2812_setup("/dev/leds0",
                       CONFIG_RP2040_WS2812_GPIO_PIN,
+                      CONFIG_RP2040_WS2812_PWR_GPIO,
                       CONFIG_WS2812_LED_COUNT,
                       HAS_WHITE);
 #endif
diff --git a/boards/arm/rp2040/adafruit-feather-rp2040/src/rp2040_spi.c b/boards/arm/rp2040/adafruit-feather-rp2040/src/rp2040_spi.c
index f6b23acbcd..7fd0ffc754 100644
--- a/boards/arm/rp2040/adafruit-feather-rp2040/src/rp2040_spi.c
+++ b/boards/arm/rp2040/adafruit-feather-rp2040/src/rp2040_spi.c
@@ -74,7 +74,7 @@ void rp2040_spi0select(struct spi_dev_s *dev, uint32_t devid,
   spiinfo("devid: %d CS: %s\n", (int)devid,
           selected ? "assert" : "de-assert");
 
-  rp2040_gpio_put(CONFIG_RP2040_SPI0_GPIO + 1, !selected);
+  rp2040_gpio_put(CONFIG_RP2040_SPI0_CS_GPIO, !selected);
 }
 
 uint8_t rp2040_spi0status(struct spi_dev_s *dev, uint32_t devid)
@@ -97,7 +97,7 @@ int rp2040_spi0cmddata(struct spi_dev_s *dev, uint32_t devid, bool cmd)
        *  data bits are data or a command.
        */
 
-      rp2040_gpio_put(CONFIG_RP2040_SPI0_GPIO, !cmd);
+      rp2040_gpio_put(CONFIG_RP2040_SPI0_RX_GPIO, !cmd);
 
       return OK;
     }
@@ -115,7 +115,7 @@ void rp2040_spi1select(struct spi_dev_s *dev, uint32_t devid,
   spiinfo("devid: %d CS: %s\n", (int)devid,
           selected ? "assert" : "de-assert");
 
-  rp2040_gpio_put(CONFIG_RP2040_SPI1_GPIO + 1, !selected);
+  rp2040_gpio_put(CONFIG_RP2040_SPI1_CS_GPIO, !selected);
 }
 
 uint8_t rp2040_spi1status(struct spi_dev_s *dev, uint32_t devid)
@@ -138,7 +138,7 @@ int rp2040_spi1cmddata(struct spi_dev_s *dev, uint32_t devid, bool cmd)
        *  data bits are data or a command.
        */
 
-      rp2040_gpio_put(CONFIG_RP2040_SPI1_GPIO, !cmd);
+      rp2040_gpio_put(CONFIG_RP2040_SPI1_RX_GPIO, !cmd);
 
       return OK;
     }
diff --git a/boards/arm/rp2040/adafruit-kb2040/Kconfig b/boards/arm/rp2040/adafruit-kb2040/Kconfig
index 38fd50ff06..6866bf4fa4 100644
--- a/boards/arm/rp2040/adafruit-kb2040/Kconfig
+++ b/boards/arm/rp2040/adafruit-kb2040/Kconfig
@@ -13,11 +13,12 @@ config RP2040_FLASH_BOOT
 		If not, the binary is for SRAM boot.
 
 config RP2040_FLASH_CHIP
-	string "flash chip name"
+	string "Second stage boot loader"
 	default "w25q080"
 	---help---
-		Name of NOR flash device connected to RP2040 SoC.
-		(Used to choose the secondary boot loader.)
+		This is the name of the Pico-SDK second stage boot loader
+		to use for this board.  This board using a Q64 flash chip
+		which is compatible with the w25q080 boot loader.
 		Basically this option should not be changed.
 
 config RP2040_UF2_BINARY
@@ -26,308 +27,6 @@ config RP2040_UF2_BINARY
 	---help---
 		Create nuttx.uf2 binary format used on RP2040 based arch.
 
-config RP2040_UART0_GPIO
-	int "UART0 GPIO pin assign (0,12,16,28 or -1:no assign)"
-	default 0
-	range -1 29
-	depends on RP2040_UART0
-
-config RP2040_UART1_GPIO
-	int "UART1 GPIO pin assign (4,8,20,24 or -1:no assign)"
-	default -1
-	range -1 29
-	depends on RP2040_UART1
-
-config RP2040_I2C0_GPIO
-	int "I2C0 GPIO pin assign (0,4,8,12,28 or -1:no assign)"
-	default -1
-	range -1 29
-	depends on RP2040_I2C0
-
-config RP2040_I2C1_GPIO
-	int "I2C1 GPIO pin assign (2,6,10,18,26 or -1:no assign)"
-	default -1
-	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 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 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 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 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 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 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 (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
-
-config RP2040_SPI0_GPIO
-	int "SPI0 GPIO pin assign (0,4,16,20 or -1:no assign)"
-	default -1
-	range -1 29
-	depends on RP2040_SPI0
-
-config RP2040_SPI1_GPIO
-	int "SPI1 GPIO pin assign (8,12,24,28 or -1:no assign)"
-	default -1
-	range -1 29
-	depends on RP2040_SPI1
-
 config RP2040_LCD_SPI_CH
 	int "RP2040 LCD SPI channel number"
 	default 0
diff --git a/boards/arm/rp2040/adafruit-kb2040/configs/audiopack/defconfig b/boards/arm/rp2040/adafruit-kb2040/configs/audiopack/defconfig
index f7da58bc23..bcc9163ce5 100644
--- a/boards/arm/rp2040/adafruit-kb2040/configs/audiopack/defconfig
+++ b/boards/arm/rp2040/adafruit-kb2040/configs/audiopack/defconfig
@@ -22,7 +22,6 @@
 CONFIG_ARCH="arm"
 CONFIG_ARCH_BOARD="adafruit-kb2040"
 CONFIG_ARCH_BOARD_ADAFRUIT_KB2040=y
-CONFIG_ARCH_BOARD_COMMON=y
 CONFIG_ARCH_CHIP="rp2040"
 CONFIG_ARCH_CHIP_RP2040=y
 CONFIG_ARCH_RAMVECTORS=y
@@ -55,7 +54,10 @@ CONFIG_READLINE_CMD_HISTORY=y
 CONFIG_RP2040_BOARD_HAS_WS2812=y
 CONFIG_RP2040_I2S=y
 CONFIG_RP2040_SPI0=y
-CONFIG_RP2040_SPI0_GPIO=16
+CONFIG_RP2040_SPI0_CS_GPIO=5
+CONFIG_RP2040_SPI0_RX_GPIO=4
+CONFIG_RP2040_SPI0_SCK_GPIO=6
+CONFIG_RP2040_SPI0_TX_GPIO=7
 CONFIG_RP2040_SPI=y
 CONFIG_RP2040_SPISD=y
 CONFIG_RP2040_WS2812_GPIO_PIN=17
diff --git a/boards/arm/rp2040/adafruit-kb2040/configs/composite/defconfig b/boards/arm/rp2040/adafruit-kb2040/configs/composite/defconfig
index 75bf88f4a5..c33f3151cb 100644
--- a/boards/arm/rp2040/adafruit-kb2040/configs/composite/defconfig
+++ b/boards/arm/rp2040/adafruit-kb2040/configs/composite/defconfig
@@ -18,7 +18,6 @@
 CONFIG_ARCH="arm"
 CONFIG_ARCH_BOARD="adafruit-kb2040"
 CONFIG_ARCH_BOARD_ADAFRUIT_KB2040=y
-CONFIG_ARCH_BOARD_COMMON=y
 CONFIG_ARCH_CHIP="rp2040"
 CONFIG_ARCH_CHIP_RP2040=y
 CONFIG_ARCH_RAMVECTORS=y
@@ -54,7 +53,10 @@ CONFIG_RAM_START=0x20000000
 CONFIG_READLINE_CMD_HISTORY=y
 CONFIG_RP2040_BOARD_HAS_WS2812=y
 CONFIG_RP2040_SPI0=y
-CONFIG_RP2040_SPI0_GPIO=16
+CONFIG_RP2040_SPI0_CS_GPIO=5
+CONFIG_RP2040_SPI0_RX_GPIO=4
+CONFIG_RP2040_SPI0_SCK_GPIO=6
+CONFIG_RP2040_SPI0_TX_GPIO=7
 CONFIG_RP2040_SPI=y
 CONFIG_RP2040_SPISD=y
 CONFIG_RP2040_WS2812_GPIO_PIN=17
diff --git a/boards/arm/rp2040/adafruit-kb2040/configs/displaypack/defconfig b/boards/arm/rp2040/adafruit-kb2040/configs/displaypack/defconfig
index f00c1c10d6..bfc1e73539 100644
--- a/boards/arm/rp2040/adafruit-kb2040/configs/displaypack/defconfig
+++ b/boards/arm/rp2040/adafruit-kb2040/configs/displaypack/defconfig
@@ -21,7 +21,6 @@
 CONFIG_ARCH="arm"
 CONFIG_ARCH_BOARD="adafruit-kb2040"
 CONFIG_ARCH_BOARD_ADAFRUIT_KB2040=y
-CONFIG_ARCH_BOARD_COMMON=y
 CONFIG_ARCH_CHIP="rp2040"
 CONFIG_ARCH_CHIP_RP2040=y
 CONFIG_ARCH_RAMVECTORS=y
@@ -82,7 +81,10 @@ CONFIG_RAM_START=0x20000000
 CONFIG_READLINE_CMD_HISTORY=y
 CONFIG_RP2040_BOARD_HAS_WS2812=y
 CONFIG_RP2040_SPI0=y
-CONFIG_RP2040_SPI0_GPIO=16
+CONFIG_RP2040_SPI0_CS_GPIO=5
+CONFIG_RP2040_SPI0_RX_GPIO=4
+CONFIG_RP2040_SPI0_SCK_GPIO=6
+CONFIG_RP2040_SPI0_TX_GPIO=7
 CONFIG_RP2040_SPI=y
 CONFIG_RP2040_WS2812_GPIO_PIN=17
 CONFIG_RR_INTERVAL=200
diff --git a/boards/arm/rp2040/adafruit-kb2040/configs/enc28j60/defconfig b/boards/arm/rp2040/adafruit-kb2040/configs/enc28j60/defconfig
index 76f2f7c5e1..94ecec1693 100644
--- a/boards/arm/rp2040/adafruit-kb2040/configs/enc28j60/defconfig
+++ b/boards/arm/rp2040/adafruit-kb2040/configs/enc28j60/defconfig
@@ -15,7 +15,6 @@
 CONFIG_ARCH="arm"
 CONFIG_ARCH_BOARD="adafruit-kb2040"
 CONFIG_ARCH_BOARD_ADAFRUIT_KB2040=y
-CONFIG_ARCH_BOARD_COMMON=y
 CONFIG_ARCH_CHIP="rp2040"
 CONFIG_ARCH_CHIP_RP2040=y
 CONFIG_ARCH_RAMVECTORS=y
@@ -57,12 +56,15 @@ CONFIG_RAM_SIZE=270336
 CONFIG_RAM_START=0x20000000
 CONFIG_READLINE_CMD_HISTORY=y
 CONFIG_RP2040_BOARD_HAS_WS2812=y
-CONFIG_RP2040_ENC28J60_INTR_GPIO=11
-CONFIG_RP2040_ENC28J60_RESET_GPIO=10
+CONFIG_RP2040_ENC28J60_INTR_GPIO=3
+CONFIG_RP2040_ENC28J60_RESET_GPIO=2
 CONFIG_RP2040_SPI0=y
-CONFIG_RP2040_SPI0_GPIO=16
+CONFIG_RP2040_SPI0_CS_GPIO=5
+CONFIG_RP2040_SPI0_RX_GPIO=4
+CONFIG_RP2040_SPI0_SCK_GPIO=6
+CONFIG_RP2040_SPI0_TX_GPIO=7
 CONFIG_RP2040_SPI1=y
-CONFIG_RP2040_SPI1_GPIO=12
+CONFIG_RP2040_SPI1_TX_GPIO=27
 CONFIG_RP2040_SPI=y
 CONFIG_RP2040_WS2812_GPIO_PIN=17
 CONFIG_RR_INTERVAL=200
diff --git a/boards/arm/rp2040/adafruit-kb2040/configs/lcd1602/defconfig b/boards/arm/rp2040/adafruit-kb2040/configs/lcd1602/defconfig
index edcfef241e..1b537cd666 100644
--- a/boards/arm/rp2040/adafruit-kb2040/configs/lcd1602/defconfig
+++ b/boards/arm/rp2040/adafruit-kb2040/configs/lcd1602/defconfig
@@ -15,7 +15,6 @@
 CONFIG_ARCH="arm"
 CONFIG_ARCH_BOARD="adafruit-kb2040"
 CONFIG_ARCH_BOARD_ADAFRUIT_KB2040=y
-CONFIG_ARCH_BOARD_COMMON=y
 CONFIG_ARCH_CHIP="rp2040"
 CONFIG_ARCH_CHIP_RP2040=y
 CONFIG_ARCH_RAMVECTORS=y
@@ -42,7 +41,6 @@ CONFIG_RAM_START=0x20000000
 CONFIG_READLINE_CMD_HISTORY=y
 CONFIG_RP2040_BOARD_HAS_WS2812=y
 CONFIG_RP2040_I2C0=y
-CONFIG_RP2040_I2C0_GPIO=4
 CONFIG_RP2040_I2C=y
 CONFIG_RP2040_I2C_DRIVER=y
 CONFIG_RP2040_WS2812_GPIO_PIN=17
diff --git a/boards/arm/rp2040/adafruit-kb2040/configs/nsh/defconfig b/boards/arm/rp2040/adafruit-kb2040/configs/nsh/defconfig
index d050b73350..6c91410694 100644
--- a/boards/arm/rp2040/adafruit-kb2040/configs/nsh/defconfig
+++ b/boards/arm/rp2040/adafruit-kb2040/configs/nsh/defconfig
@@ -15,7 +15,6 @@
 CONFIG_ARCH="arm"
 CONFIG_ARCH_BOARD="adafruit-kb2040"
 CONFIG_ARCH_BOARD_ADAFRUIT_KB2040=y
-CONFIG_ARCH_BOARD_COMMON=y
 CONFIG_ARCH_CHIP="rp2040"
 CONFIG_ARCH_CHIP_RP2040=y
 CONFIG_ARCH_RAMVECTORS=y
diff --git a/boards/arm/rp2040/adafruit-kb2040/configs/nshsram/defconfig b/boards/arm/rp2040/adafruit-kb2040/configs/nshsram/defconfig
index 0640dc38be..a968c49a48 100644
--- a/boards/arm/rp2040/adafruit-kb2040/configs/nshsram/defconfig
+++ b/boards/arm/rp2040/adafruit-kb2040/configs/nshsram/defconfig
@@ -16,7 +16,6 @@
 CONFIG_ARCH="arm"
 CONFIG_ARCH_BOARD="adafruit-kb2040"
 CONFIG_ARCH_BOARD_ADAFRUIT_KB2040=y
-CONFIG_ARCH_BOARD_COMMON=y
 CONFIG_ARCH_CHIP="rp2040"
 CONFIG_ARCH_CHIP_RP2040=y
 CONFIG_ARCH_STACKDUMP=y
diff --git a/boards/arm/rp2040/adafruit-kb2040/configs/smp/defconfig b/boards/arm/rp2040/adafruit-kb2040/configs/smp/defconfig
index 14b4395cf5..19dba9bc35 100644
--- a/boards/arm/rp2040/adafruit-kb2040/configs/smp/defconfig
+++ b/boards/arm/rp2040/adafruit-kb2040/configs/smp/defconfig
@@ -15,7 +15,6 @@
 CONFIG_ARCH="arm"
 CONFIG_ARCH_BOARD="adafruit-kb2040"
 CONFIG_ARCH_BOARD_ADAFRUIT_KB2040=y
-CONFIG_ARCH_BOARD_COMMON=y
 CONFIG_ARCH_CHIP="rp2040"
 CONFIG_ARCH_CHIP_RP2040=y
 CONFIG_ARCH_INTERRUPTSTACK=2048
diff --git a/boards/arm/rp2040/adafruit-kb2040/configs/spisd/defconfig b/boards/arm/rp2040/adafruit-kb2040/configs/spisd/defconfig
index e136fde9d9..ddd189112d 100644
--- a/boards/arm/rp2040/adafruit-kb2040/configs/spisd/defconfig
+++ b/boards/arm/rp2040/adafruit-kb2040/configs/spisd/defconfig
@@ -18,7 +18,6 @@
 CONFIG_ARCH="arm"
 CONFIG_ARCH_BOARD="adafruit-kb2040"
 CONFIG_ARCH_BOARD_ADAFRUIT_KB2040=y
-CONFIG_ARCH_BOARD_COMMON=y
 CONFIG_ARCH_CHIP="rp2040"
 CONFIG_ARCH_CHIP_RP2040=y
 CONFIG_ARCH_RAMVECTORS=y
@@ -46,7 +45,10 @@ CONFIG_RAM_START=0x20000000
 CONFIG_READLINE_CMD_HISTORY=y
 CONFIG_RP2040_BOARD_HAS_WS2812=y
 CONFIG_RP2040_SPI0=y
-CONFIG_RP2040_SPI0_GPIO=16
+CONFIG_RP2040_SPI0_CS_GPIO=5
+CONFIG_RP2040_SPI0_RX_GPIO=4
+CONFIG_RP2040_SPI0_SCK_GPIO=6
+CONFIG_RP2040_SPI0_TX_GPIO=7
 CONFIG_RP2040_SPI=y
 CONFIG_RP2040_SPISD=y
 CONFIG_RP2040_WS2812_GPIO_PIN=17
diff --git a/boards/arm/rp2040/adafruit-kb2040/configs/ssd1306/defconfig b/boards/arm/rp2040/adafruit-kb2040/configs/ssd1306/defconfig
index 7188c9f22e..a9c7afa1cc 100644
--- a/boards/arm/rp2040/adafruit-kb2040/configs/ssd1306/defconfig
+++ b/boards/arm/rp2040/adafruit-kb2040/configs/ssd1306/defconfig
@@ -18,7 +18,6 @@
 CONFIG_ARCH="arm"
 CONFIG_ARCH_BOARD="adafruit-kb2040"
 CONFIG_ARCH_BOARD_ADAFRUIT_KB2040=y
-CONFIG_ARCH_BOARD_COMMON=y
 CONFIG_ARCH_CHIP="rp2040"
 CONFIG_ARCH_CHIP_RP2040=y
 CONFIG_ARCH_RAMVECTORS=y
@@ -61,7 +60,6 @@ CONFIG_RAM_START=0x20000000
 CONFIG_READLINE_CMD_HISTORY=y
 CONFIG_RP2040_BOARD_HAS_WS2812=y
 CONFIG_RP2040_I2C0=y
-CONFIG_RP2040_I2C0_GPIO=4
 CONFIG_RP2040_I2C=y
 CONFIG_RP2040_I2C_DRIVER=y
 CONFIG_RP2040_WS2812_GPIO_PIN=17
diff --git a/boards/arm/rp2040/adafruit-kb2040/configs/st7735/defconfig b/boards/arm/rp2040/adafruit-kb2040/configs/st7735/defconfig
index c129acbea1..84c8330fc9 100644
--- a/boards/arm/rp2040/adafruit-kb2040/configs/st7735/defconfig
+++ b/boards/arm/rp2040/adafruit-kb2040/configs/st7735/defconfig
@@ -15,7 +15,6 @@
 CONFIG_ARCH="arm"
 CONFIG_ARCH_BOARD="adafruit-kb2040"
 CONFIG_ARCH_BOARD_ADAFRUIT_KB2040=y
-CONFIG_ARCH_BOARD_COMMON=y
 CONFIG_ARCH_CHIP="rp2040"
 CONFIG_ARCH_CHIP_RP2040=y
 CONFIG_ARCH_RAMVECTORS=y
@@ -45,7 +44,7 @@ CONFIG_RAM_START=0x20000000
 CONFIG_READLINE_CMD_HISTORY=y
 CONFIG_RP2040_BOARD_HAS_WS2812=y
 CONFIG_RP2040_SPI1=y
-CONFIG_RP2040_SPI1_GPIO=12
+CONFIG_RP2040_SPI1_TX_GPIO=27
 CONFIG_RP2040_SPI=y
 CONFIG_RP2040_WS2812_GPIO_PIN=17
 CONFIG_RR_INTERVAL=200
diff --git a/boards/arm/rp2040/adafruit-kb2040/configs/usbmsc/defconfig b/boards/arm/rp2040/adafruit-kb2040/configs/usbmsc/defconfig
index 4b4d1cee69..d03f3a032b 100644
--- a/boards/arm/rp2040/adafruit-kb2040/configs/usbmsc/defconfig
+++ b/boards/arm/rp2040/adafruit-kb2040/configs/usbmsc/defconfig
@@ -18,7 +18,6 @@
 CONFIG_ARCH="arm"
 CONFIG_ARCH_BOARD="adafruit-kb2040"
 CONFIG_ARCH_BOARD_ADAFRUIT_KB2040=y
-CONFIG_ARCH_BOARD_COMMON=y
 CONFIG_ARCH_CHIP="rp2040"
 CONFIG_ARCH_CHIP_RP2040=y
 CONFIG_ARCH_RAMVECTORS=y
@@ -48,7 +47,10 @@ CONFIG_RAM_START=0x20000000
 CONFIG_READLINE_CMD_HISTORY=y
 CONFIG_RP2040_BOARD_HAS_WS2812=y
 CONFIG_RP2040_SPI0=y
-CONFIG_RP2040_SPI0_GPIO=16
+CONFIG_RP2040_SPI0_CS_GPIO=5
+CONFIG_RP2040_SPI0_RX_GPIO=4
+CONFIG_RP2040_SPI0_SCK_GPIO=6
+CONFIG_RP2040_SPI0_TX_GPIO=7
 CONFIG_RP2040_SPI=y
 CONFIG_RP2040_SPISD=y
 CONFIG_RP2040_WS2812_GPIO_PIN=17
diff --git a/boards/arm/rp2040/adafruit-kb2040/configs/usbnsh/defconfig b/boards/arm/rp2040/adafruit-kb2040/configs/usbnsh/defconfig
index d4658760b8..0fe5e5c827 100644
--- a/boards/arm/rp2040/adafruit-kb2040/configs/usbnsh/defconfig
+++ b/boards/arm/rp2040/adafruit-kb2040/configs/usbnsh/defconfig
@@ -16,7 +16,6 @@
 CONFIG_ARCH="arm"
 CONFIG_ARCH_BOARD="adafruit-kb2040"
 CONFIG_ARCH_BOARD_ADAFRUIT_KB2040=y
-CONFIG_ARCH_BOARD_COMMON=y
 CONFIG_ARCH_CHIP="rp2040"
 CONFIG_ARCH_CHIP_RP2040=y
 CONFIG_ARCH_RAMVECTORS=y
diff --git a/boards/arm/rp2040/adafruit-kb2040/configs/waveshare-lcd-1.14/defconfig b/boards/arm/rp2040/adafruit-kb2040/configs/waveshare-lcd-1.14/defconfig
index 4d7593b7d3..6d9edec8e7 100644
--- a/boards/arm/rp2040/adafruit-kb2040/configs/waveshare-lcd-1.14/defconfig
+++ b/boards/arm/rp2040/adafruit-kb2040/configs/waveshare-lcd-1.14/defconfig
@@ -20,7 +20,6 @@
 CONFIG_ARCH="arm"
 CONFIG_ARCH_BOARD="adafruit-kb2040"
 CONFIG_ARCH_BOARD_ADAFRUIT_KB2040=y
-CONFIG_ARCH_BOARD_COMMON=y
 CONFIG_ARCH_CHIP="rp2040"
 CONFIG_ARCH_CHIP_RP2040=y
 CONFIG_ARCH_RAMVECTORS=y
@@ -79,7 +78,6 @@ CONFIG_READLINE_CMD_HISTORY=y
 CONFIG_RP2040_BOARD_HAS_WS2812=y
 CONFIG_RP2040_LCD_SPI_CH=1
 CONFIG_RP2040_SPI1=y
-CONFIG_RP2040_SPI1_GPIO=8
 CONFIG_RP2040_SPI=y
 CONFIG_RP2040_WS2812_GPIO_PIN=17
 CONFIG_RR_INTERVAL=200
diff --git a/boards/arm/rp2040/adafruit-kb2040/configs/waveshare-lcd-1.3/defconfig b/boards/arm/rp2040/adafruit-kb2040/configs/waveshare-lcd-1.3/defconfig
index 629e0b14da..f769781099 100644
--- a/boards/arm/rp2040/adafruit-kb2040/configs/waveshare-lcd-1.3/defconfig
+++ b/boards/arm/rp2040/adafruit-kb2040/configs/waveshare-lcd-1.3/defconfig
@@ -20,7 +20,6 @@
 CONFIG_ARCH="arm"
 CONFIG_ARCH_BOARD="adafruit-kb2040"
 CONFIG_ARCH_BOARD_ADAFRUIT_KB2040=y
-CONFIG_ARCH_BOARD_COMMON=y
 CONFIG_ARCH_CHIP="rp2040"
 CONFIG_ARCH_CHIP_RP2040=y
 CONFIG_ARCH_RAMVECTORS=y
@@ -76,7 +75,6 @@ CONFIG_READLINE_CMD_HISTORY=y
 CONFIG_RP2040_BOARD_HAS_WS2812=y
 CONFIG_RP2040_LCD_SPI_CH=1
 CONFIG_RP2040_SPI1=y
-CONFIG_RP2040_SPI1_GPIO=8
 CONFIG_RP2040_SPI=y
 CONFIG_RP2040_WS2812_GPIO_PIN=17
 CONFIG_RR_INTERVAL=200
diff --git a/boards/arm/rp2040/adafruit-kb2040/include/board.h b/boards/arm/rp2040/adafruit-kb2040/include/board.h
index 8caa301931..093c68ed41 100644
--- a/boards/arm/rp2040/adafruit-kb2040/include/board.h
+++ b/boards/arm/rp2040/adafruit-kb2040/include/board.h
@@ -62,10 +62,11 @@
 
 /* GPIO definitions *********************************************************/
 
-#undef BOARD_GPIO_LED_PIN
-#define BOARD_NGPIOOUT           1
-#define BOARD_NGPIOIN            1
-#define BOARD_NGPIOINT           1
+#undef  BOARD_GPIO_LED_PIN
+#define BOARD_GPIO_WS2812_PWR_PIN 11
+#define BOARD_NGPIOOUT             1
+#define BOARD_NGPIOIN              1
+#define BOARD_NGPIOINT             1
 
 /****************************************************************************
  * Public Types
diff --git a/boards/arm/rp2040/adafruit-kb2040/scripts/adafruit-kb2040-flash.ld b/boards/arm/rp2040/adafruit-kb2040/scripts/adafruit-kb2040-flash.ld
index 4d7719c423..f30276ace0 100644
--- a/boards/arm/rp2040/adafruit-kb2040/scripts/adafruit-kb2040-flash.ld
+++ b/boards/arm/rp2040/adafruit-kb2040/scripts/adafruit-kb2040-flash.ld
@@ -20,7 +20,7 @@
 
 MEMORY
 {
-  flash (rx) : ORIGIN = 0x10000000, LENGTH = 2048K
+  flash (rx) : ORIGIN = 0x10000000, LENGTH = 8192K
   sram (rwx) : ORIGIN = 0x20000000, LENGTH = 264K
 }
 
diff --git a/boards/arm/rp2040/adafruit-kb2040/src/rp2040_boardinitialize.c b/boards/arm/rp2040/adafruit-kb2040/src/rp2040_boardinitialize.c
index 09d4b315bb..a34ab08910 100644
--- a/boards/arm/rp2040/adafruit-kb2040/src/rp2040_boardinitialize.c
+++ b/boards/arm/rp2040/adafruit-kb2040/src/rp2040_boardinitialize.c
@@ -64,32 +64,32 @@ void rp2040_boardearlyinitialize(void)
 
   /* Set default UART pin */
 
-#if defined(CONFIG_RP2040_UART0) && CONFIG_RP2040_UART0_GPIO >= 0
-  rp2040_gpio_set_function(CONFIG_RP2040_UART0_GPIO,
+#ifdef CONFIG_RP2040_UART0
+  rp2040_gpio_set_function(CONFIG_RP2040_UART0_TX_GPIO,
                            RP2040_GPIO_FUNC_UART);      /* TX */
-  rp2040_gpio_set_function(CONFIG_RP2040_UART0_GPIO + 1,
+  rp2040_gpio_set_function(CONFIG_RP2040_UART0_RX_GPIO,
                            RP2040_GPIO_FUNC_UART);      /* RX */
 #ifdef CONFIG_SERIAL_OFLOWCONTROL
-  rp2040_gpio_set_function(CONFIG_RP2040_UART0_GPIO + 2,
+  rp2040_gpio_set_function(CONFIG_RP2040_UART0_CTS_GPIO,
                            RP2040_GPIO_FUNC_UART);      /* CTS */
 #endif
 #ifdef CONFIG_SERIAL_IFLOWCONTROL
-  rp2040_gpio_set_function(CONFIG_RP2040_UART0_GPIO + 3,
+  rp2040_gpio_set_function(CONFIG_RP2040_UART0_RTS_GPIO,
                            RP2040_GPIO_FUNC_UART);      /* RTS */
 #endif
 #endif
 
-#if defined(CONFIG_RP2040_UART1) && CONFIG_RP2040_UART1_GPIO >= 0
-  rp2040_gpio_set_function(CONFIG_RP2040_UART1_GPIO,
+#ifdef CONFIG_RP2040_UART1
+  rp2040_gpio_set_function(CONFIG_RP2040_UART1_TX_GPIO,
                            RP2040_GPIO_FUNC_UART);      /* TX */
-  rp2040_gpio_set_function(CONFIG_RP2040_UART1_GPIO + 1,
+  rp2040_gpio_set_function(CONFIG_RP2040_UART1_RX_GPIO,
                            RP2040_GPIO_FUNC_UART);      /* RX */
 #ifdef CONFIG_SERIAL_OFLOWCONTROL
-  rp2040_gpio_set_function(CONFIG_RP2040_UART1_GPIO + 2,
+  rp2040_gpio_set_function(CONFIG_RP2040_UART1_CTS_GPIO,
                            RP2040_GPIO_FUNC_UART);      /* CTS */
 #endif
 #ifdef CONFIG_SERIAL_IFLOWCONTROL
-  rp2040_gpio_set_function(CONFIG_RP2040_UART1_GPIO + 3,
+  rp2040_gpio_set_function(CONFIG_RP2040_UART1_RTS_GPIO,
                            RP2040_GPIO_FUNC_UART);      /* RTS */
 #endif
 #endif
@@ -106,55 +106,55 @@ void rp2040_boardinitialize(void)
 {
   /* Set default I2C pin */
 
-#if defined(CONFIG_RP2040_I2C0) && CONFIG_RP2040_I2C0_GPIO >= 0
-  rp2040_gpio_set_function(CONFIG_RP2040_I2C0_GPIO,
+#ifdef CONFIG_RP2040_I2C0
+  rp2040_gpio_set_function(CONFIG_RP2040_I2C0_SDA_GPIO,
                            RP2040_GPIO_FUNC_I2C);       /* SDA */
-  rp2040_gpio_set_function(CONFIG_RP2040_I2C0_GPIO + 1,
+  rp2040_gpio_set_function(CONFIG_RP2040_I2C0_SCL_GPIO,
                            RP2040_GPIO_FUNC_I2C);       /* SCL */
 
-  rp2040_gpio_set_pulls(CONFIG_RP2040_I2C0_GPIO, true, false);  /* Pull up */
-  rp2040_gpio_set_pulls(CONFIG_RP2040_I2C0_GPIO + 1, true, false);
+  rp2040_gpio_set_pulls(CONFIG_RP2040_I2C0_SDA_GPIO, true, false);  /* Pull up */
+  rp2040_gpio_set_pulls(CONFIG_RP2040_I2C0_SCL_GPIO, true, false);
 #endif
 
-#if defined(CONFIG_RP2040_I2C1) &&  CONFIG_RP2040_I2C1_GPIO >= 0
-  rp2040_gpio_set_function(CONFIG_RP2040_I2C1_GPIO,
+#ifdef CONFIG_RP2040_I2C1
+  rp2040_gpio_set_function(CONFIG_RP2040_I2C1_SDA_GPIO,
                            RP2040_GPIO_FUNC_I2C);       /* SDA */
-  rp2040_gpio_set_function(CONFIG_RP2040_I2C1_GPIO + 1,
+  rp2040_gpio_set_function(CONFIG_RP2040_I2C1_SCL_GPIO,
                            RP2040_GPIO_FUNC_I2C);       /* SCL */
 
-  rp2040_gpio_set_pulls(CONFIG_RP2040_I2C1_GPIO, true, false);  /* Pull up */
-  rp2040_gpio_set_pulls(CONFIG_RP2040_I2C1_GPIO + 1, true, false);
+  rp2040_gpio_set_pulls(CONFIG_RP2040_I2C1_SDA_GPIO, true, false);  /* Pull up */
+  rp2040_gpio_set_pulls(CONFIG_RP2040_I2C1_SCL_GPIO, true, false);
 #endif
 
   /* Set default SPI pin */
 
-#if defined(CONFIG_RP2040_SPI0) && CONFIG_RP2040_SPI0_GPIO >= 0
-  rp2040_gpio_set_function(CONFIG_RP2040_SPI0_GPIO,
+#ifdef CONFIG_RP2040_SPI0
+  rp2040_gpio_set_function(CONFIG_RP2040_SPI0_RX_GPIO,
                            RP2040_GPIO_FUNC_SPI);       /* RX */
-  rp2040_gpio_set_function(CONFIG_RP2040_SPI0_GPIO + 2,
+  rp2040_gpio_set_function(CONFIG_RP2040_SPI0_SCK_GPIO,
                            RP2040_GPIO_FUNC_SPI);       /* SCK */
-  rp2040_gpio_set_function(CONFIG_RP2040_SPI0_GPIO + 3,
+  rp2040_gpio_set_function(CONFIG_RP2040_SPI0_TX_GPIO,
                            RP2040_GPIO_FUNC_SPI);       /* TX */
 
   /* CSn is controlled by board-specific logic */
 
-  rp2040_gpio_init(CONFIG_RP2040_SPI0_GPIO + 1);        /* CSn */
-  rp2040_gpio_setdir(CONFIG_RP2040_SPI0_GPIO + 1, true);
-  rp2040_gpio_put(CONFIG_RP2040_SPI0_GPIO + 1, true);
+  rp2040_gpio_init(CONFIG_RP2040_SPI0_CS_GPIO);        /* CSn */
+  rp2040_gpio_setdir(CONFIG_RP2040_SPI0_CS_GPIO, true);
+  rp2040_gpio_put(CONFIG_RP2040_SPI0_CS_GPIO, true);
 #endif
 
-#if defined(CONFIG_RP2040_SPI1) &&  CONFIG_RP2040_SPI1_GPIO >= 0
-  rp2040_gpio_set_function(CONFIG_RP2040_SPI1_GPIO,
+#ifdef CONFIG_RP2040_SPI1
+  rp2040_gpio_set_function(CONFIG_RP2040_SPI1_RX_GPIO,
                            RP2040_GPIO_FUNC_SPI);       /* RX */
-  rp2040_gpio_set_function(CONFIG_RP2040_SPI1_GPIO + 2,
+  rp2040_gpio_set_function(CONFIG_RP2040_SPI1_SCK_GPIO,
                            RP2040_GPIO_FUNC_SPI);       /* SCK */
-  rp2040_gpio_set_function(CONFIG_RP2040_SPI1_GPIO + 3,
+  rp2040_gpio_set_function(CONFIG_RP2040_SPI1_TX_GPIO,
                            RP2040_GPIO_FUNC_SPI);       /* TX */
 
   /* CSn is controlled by board-specific logic */
 
-  rp2040_gpio_init(CONFIG_RP2040_SPI1_GPIO + 1);        /* CSn */
-  rp2040_gpio_setdir(CONFIG_RP2040_SPI1_GPIO + 1, true);
-  rp2040_gpio_put(CONFIG_RP2040_SPI1_GPIO + 1, true);
+  rp2040_gpio_init(CONFIG_RP2040_SPI1_CS_GPIO);        /* CSn */
+  rp2040_gpio_setdir(CONFIG_RP2040_SPI1_CS_GPIO, true);
+  rp2040_gpio_put(CONFIG_RP2040_SPI1_CS_GPIO, true);
 #endif
 }
diff --git a/boards/arm/rp2040/adafruit-kb2040/src/rp2040_bringup.c b/boards/arm/rp2040/adafruit-kb2040/src/rp2040_bringup.c
index c1a071ccfe..5bc59fdee2 100644
--- a/boards/arm/rp2040/adafruit-kb2040/src/rp2040_bringup.c
+++ b/boards/arm/rp2040/adafruit-kb2040/src/rp2040_bringup.c
@@ -462,6 +462,7 @@ int rp2040_bringup(void)
 #if defined(CONFIG_RP2040_BOARD_HAS_WS2812) && defined(CONFIG_WS2812)
   rp2040_ws2812_setup("/dev/leds0",
                       CONFIG_RP2040_WS2812_GPIO_PIN,
+                      CONFIG_RP2040_WS2812_PWR_GPIO,
                       CONFIG_WS2812_LED_COUNT,
                       HAS_WHITE);
 #endif
diff --git a/boards/arm/rp2040/adafruit-kb2040/src/rp2040_spi.c b/boards/arm/rp2040/adafruit-kb2040/src/rp2040_spi.c
index 242305bf6d..b2cdee6503 100644
--- a/boards/arm/rp2040/adafruit-kb2040/src/rp2040_spi.c
+++ b/boards/arm/rp2040/adafruit-kb2040/src/rp2040_spi.c
@@ -74,7 +74,7 @@ void rp2040_spi0select(struct spi_dev_s *dev, uint32_t devid,
   spiinfo("devid: %d CS: %s\n", (int)devid,
           selected ? "assert" : "de-assert");
 
-  rp2040_gpio_put(CONFIG_RP2040_SPI0_GPIO + 1, !selected);
+  rp2040_gpio_put(CONFIG_RP2040_SPI0_CS_GPIO, !selected);
 }
 
 uint8_t rp2040_spi0status(struct spi_dev_s *dev, uint32_t devid)
@@ -97,7 +97,7 @@ int rp2040_spi0cmddata(struct spi_dev_s *dev, uint32_t devid, bool cmd)
        *  data bits are data or a command.
        */
 
-      rp2040_gpio_put(CONFIG_RP2040_SPI0_GPIO, !cmd);
+      rp2040_gpio_put(CONFIG_RP2040_SPI0_RX_GPIO, !cmd);
 
       return OK;
     }
@@ -115,7 +115,7 @@ void rp2040_spi1select(struct spi_dev_s *dev, uint32_t devid,
   spiinfo("devid: %d CS: %s\n", (int)devid,
           selected ? "assert" : "de-assert");
 
-  rp2040_gpio_put(CONFIG_RP2040_SPI1_GPIO + 1, !selected);
+  rp2040_gpio_put(CONFIG_RP2040_SPI1_CS_GPIO, !selected);
 }
 
 uint8_t rp2040_spi1status(struct spi_dev_s *dev, uint32_t devid)
@@ -138,7 +138,7 @@ int rp2040_spi1cmddata(struct spi_dev_s *dev, uint32_t devid, bool cmd)
        *  data bits are data or a command.
        */
 
-      rp2040_gpio_put(CONFIG_RP2040_SPI1_GPIO, !cmd);
+      rp2040_gpio_put(CONFIG_RP2040_SPI1_RX_GPIO, !cmd);
 
       return OK;
     }
diff --git a/boards/arm/rp2040/adafruit-qt-py-rp2040/Kconfig b/boards/arm/rp2040/adafruit-qt-py-rp2040/Kconfig
new file mode 100644
index 0000000000..1233c2bb5a
--- /dev/null
+++ b/boards/arm/rp2040/adafruit-qt-py-rp2040/Kconfig
@@ -0,0 +1,30 @@
+#
+# For a description of the syntax of this configuration file,
+# see the file kconfig-language.txt in the NuttX tools repository.
+#
+
+if ARCH_BOARD_ADAFRUIT_QT_PY_RP2040
+
+config RP2040_FLASH_BOOT
+	bool "flash boot"
+	default y
+	---help---
+		If y, the built binary can be used for flash boot.
+		If not, the binary is for SRAM boot.
+
+config RP2040_FLASH_CHIP
+	string "Second stage boot loader"
+	default "w25q080"
+	---help---
+		This is the name of the Pico-SDK second stage boot loader
+		to use for this board.  This board using a Q64 flash chip
+		which is compatible with the w25q080 boot loader.
+		Basically this option should not be changed.
+
+config RP2040_UF2_BINARY
+	bool "uf2 binary format"
+	default y
+	---help---
+		Create nuttx.uf2 binary format used on RP2040 based arch.
+
+endif
diff --git a/boards/arm/rp2040/adafruit-qt-py-rp2040/README.txt b/boards/arm/rp2040/adafruit-qt-py-rp2040/README.txt
new file mode 100644
index 0000000000..d6add66f0d
--- /dev/null
+++ b/boards/arm/rp2040/adafruit-qt-py-rp2040/README.txt
@@ -0,0 +1,98 @@
+README
+======
+
+This directory contains the port of NuttX to the Adafruit QT Py RP2040.
+See https://learn.adafruit.com/adafruit-qt-py-2040 for information 
+about Adafruit QT Py RP2040.
+
+Currently only the following devices are supported.
+
+  Supported:
+  - UART  (console port)
+    - GPIO 5 (UART1 RX) and GPIO 20 (UART1 TX) are used for the console.
+  - I2C
+  - SPI
+  - DMAC
+  - PWM
+  - ADC
+  - USB device
+    - MSC, CDC/ACM serial and these composite device are supported.
+    - CDC/ACM serial device can be used for the console.
+  - PIO (RP2040 Programmable I/O)
+  - Flash ROM Boot
+  - SRAM Boot
+    - If Pico SDK is available, nuttx.uf2 file which can be used in
+      BOOTSEL mode will be created.
+
+  Not supported:
+  - All other devices
+
+Installation
+============
+
+1. Download Raspberry Pi Pico SDK
+
+  $ git clone -b 1.1.2 https://github.com/raspberrypi/pico-sdk.git
+
+2. Set PICO_SDK_PATH environment variable
+
+  $ export PICO_SDK_PATH=<absolute_path_to_pico-sdk_directory>
+
+3. Configure and build NuttX
+
+  $ git clone https://github.com/apache/incubator-nuttx.git nuttx
+  $ git clone https://github.com/apache/incubator-nuttx-apps.git apps
+  $ cd nuttx
+  $ make distclean
+  $ ./tools/configure.sh raspberrypi-pico:nsh
+  $ make V=1
+
+4. Connect Adafruit KB2040 board to USB port while pressing BOOTSEL.
+   The board will be detected as USB Mass Storage Device.
+   Then copy "nuttx.uf2" into the device.
+   (Same manner as the standard Pico SDK applications installation.)
+
+5. To access the console, GPIO 20 (TX) and 5 (RX) pins must be connected to a
+   device such as USB-serial converter.
+
+   `usbnsh` configuration provides the console access by USB CDC/ACM serial
+   devcice.  The console is available by using a terminal software on the USB
+   host.
+
+Defconfigs
+==========
+
+- nsh
+    Minimum configuration with NuttShell
+
+- nshsram
+    Load NuttX binary to SRAM
+  
+- smp
+    Enable SMP mode. Both Core 0 and Core 1 are used by NuttX.
+
+- usbnsh
+    USB CDC/ACM serial console with NuttShell
+
+- composite
+    USB composite device (MSC + CDC/ACM) support
+    `conn` command enables the composite device.
+
+License exceptions
+==================
+
+The following files are originated from the files in Pico SDK.
+So, the files are licensed under 3-Clause BSD same as Pico SDK.
+
+- arch/arm/src/rp2040/rp2040_clock.c
+- arch/arm/src/rp2040/rp2040_pll.c
+- arch/arm/src/rp2040/rp2040_xosc.c
+  - These are created by referring the Pico SDK clock initialization.
+
+- arch/arm/src/rp2040/rp2040_pio.c
+- arch/arm/src/rp2040/rp2040_pio.h
+- arch/arm/src/rp2040/rp2040_pio_instructions.h
+  - These provide the similar APIs to Pico SDK's hardware_pio APIs.
+
+- arch/arm/src/rp2040/hardware/*.h
+  - These are generated from rp2040.svd originally provided in Pico SDK.
diff --git a/boards/arm/rp2040/pimoroni-tiny2040/configs/gpio/defconfig b/boards/arm/rp2040/adafruit-qt-py-rp2040/configs/gpio/defconfig
similarity index 78%
copy from boards/arm/rp2040/pimoroni-tiny2040/configs/gpio/defconfig
copy to boards/arm/rp2040/adafruit-qt-py-rp2040/configs/gpio/defconfig
index a25898b337..f5362d78c5 100644
--- a/boards/arm/rp2040/pimoroni-tiny2040/configs/gpio/defconfig
+++ b/boards/arm/rp2040/adafruit-qt-py-rp2040/configs/gpio/defconfig
@@ -6,16 +6,15 @@
 # modifications.
 #
 # CONFIG_FS_PROCFS_EXCLUDE_ENVIRON is not set
-# CONFIG_LIBC_LONG_LONG is not set
 # CONFIG_NSH_ARGCAT is not set
 # CONFIG_NSH_CMDOPT_HEXDUMP is not set
 # CONFIG_NSH_DISABLE_DATE is not set
 # CONFIG_NSH_DISABLE_LOSMART is not set
+# CONFIG_RP2040_UART0 is not set
 # CONFIG_STANDARD_SERIAL is not set
 CONFIG_ARCH="arm"
-CONFIG_ARCH_BOARD="pimoroni-tiny2040"
-CONFIG_ARCH_BOARD_COMMON=y
-CONFIG_ARCH_BOARD_PIMORONI_TINY2040=y
+CONFIG_ARCH_BOARD="adafruit-qt-py-rp2040"
+CONFIG_ARCH_BOARD_ADAFRUIT_QT_PY_RP2040=y
 CONFIG_ARCH_CHIP="rp2040"
 CONFIG_ARCH_CHIP_RP2040=y
 CONFIG_ARCH_RAMVECTORS=y
@@ -39,6 +38,11 @@ CONFIG_NSH_READLINE=y
 CONFIG_RAM_SIZE=270336
 CONFIG_RAM_START=0x20000000
 CONFIG_READLINE_CMD_HISTORY=y
+CONFIG_RP2040_BOARD_HAS_WS2812=y
+CONFIG_RP2040_UART1=y
+CONFIG_RP2040_UART1_RX_GPIO=5
+CONFIG_RP2040_WS2812_GPIO_PIN=12
+CONFIG_RP2040_WS2812_PWR_GPIO=11
 CONFIG_RR_INTERVAL=200
 CONFIG_SCHED_WAITPID=y
 CONFIG_START_DAY=11
@@ -48,4 +52,6 @@ CONFIG_SYSLOG_CONSOLE=y
 CONFIG_SYSTEM_NSH=y
 CONFIG_TESTING_GETPRIME=y
 CONFIG_TESTING_OSTEST=y
-CONFIG_UART0_SERIAL_CONSOLE=y
+CONFIG_UART1_SERIAL_CONSOLE=y
+CONFIG_WS2812=y
+CONFIG_WS2812_NON_SPI_DRIVER=y
diff --git a/boards/arm/rp2040/adafruit-kb2040/configs/nsh/defconfig b/boards/arm/rp2040/adafruit-qt-py-rp2040/configs/nsh/defconfig
similarity index 83%
copy from boards/arm/rp2040/adafruit-kb2040/configs/nsh/defconfig
copy to boards/arm/rp2040/adafruit-qt-py-rp2040/configs/nsh/defconfig
index d050b73350..084cb978f0 100644
--- a/boards/arm/rp2040/adafruit-kb2040/configs/nsh/defconfig
+++ b/boards/arm/rp2040/adafruit-qt-py-rp2040/configs/nsh/defconfig
@@ -6,16 +6,15 @@
 # modifications.
 #
 # CONFIG_FS_PROCFS_EXCLUDE_ENVIRON is not set
-# CONFIG_LIBC_LONG_LONG is not set
 # CONFIG_NSH_ARGCAT is not set
 # CONFIG_NSH_CMDOPT_HEXDUMP is not set
 # CONFIG_NSH_DISABLE_DATE is not set
 # CONFIG_NSH_DISABLE_LOSMART is not set
+# CONFIG_RP2040_UART0 is not set
 # CONFIG_STANDARD_SERIAL is not set
 CONFIG_ARCH="arm"
-CONFIG_ARCH_BOARD="adafruit-kb2040"
-CONFIG_ARCH_BOARD_ADAFRUIT_KB2040=y
-CONFIG_ARCH_BOARD_COMMON=y
+CONFIG_ARCH_BOARD="adafruit-qt-py-rp2040"
+CONFIG_ARCH_BOARD_ADAFRUIT_QT_PY_RP2040=y
 CONFIG_ARCH_CHIP="rp2040"
 CONFIG_ARCH_CHIP_RP2040=y
 CONFIG_ARCH_RAMVECTORS=y
@@ -38,7 +37,10 @@ CONFIG_RAM_SIZE=270336
 CONFIG_RAM_START=0x20000000
 CONFIG_READLINE_CMD_HISTORY=y
 CONFIG_RP2040_BOARD_HAS_WS2812=y
-CONFIG_RP2040_WS2812_GPIO_PIN=17
+CONFIG_RP2040_UART1=y
+CONFIG_RP2040_UART1_RX_GPIO=5
+CONFIG_RP2040_WS2812_GPIO_PIN=12
+CONFIG_RP2040_WS2812_PWR_GPIO=11
 CONFIG_RR_INTERVAL=200
 CONFIG_SCHED_WAITPID=y
 CONFIG_START_DAY=9
@@ -48,6 +50,6 @@ CONFIG_SYSLOG_CONSOLE=y
 CONFIG_SYSTEM_NSH=y
 CONFIG_TESTING_GETPRIME=y
 CONFIG_TESTING_OSTEST=y
-CONFIG_UART0_SERIAL_CONSOLE=y
+CONFIG_UART1_SERIAL_CONSOLE=y
 CONFIG_WS2812=y
 CONFIG_WS2812_NON_SPI_DRIVER=y
diff --git a/boards/arm/rp2040/adafruit-kb2040/configs/nsh/defconfig b/boards/arm/rp2040/adafruit-qt-py-rp2040/configs/nshsram/defconfig
similarity index 83%
copy from boards/arm/rp2040/adafruit-kb2040/configs/nsh/defconfig
copy to boards/arm/rp2040/adafruit-qt-py-rp2040/configs/nshsram/defconfig
index d050b73350..4dce15a151 100644
--- a/boards/arm/rp2040/adafruit-kb2040/configs/nsh/defconfig
+++ b/boards/arm/rp2040/adafruit-qt-py-rp2040/configs/nshsram/defconfig
@@ -6,19 +6,17 @@
 # modifications.
 #
 # CONFIG_FS_PROCFS_EXCLUDE_ENVIRON is not set
-# CONFIG_LIBC_LONG_LONG is not set
 # CONFIG_NSH_ARGCAT is not set
 # CONFIG_NSH_CMDOPT_HEXDUMP is not set
 # CONFIG_NSH_DISABLE_DATE is not set
 # CONFIG_NSH_DISABLE_LOSMART is not set
+# CONFIG_RP2040_UART0 is not set
 # CONFIG_STANDARD_SERIAL is not set
 CONFIG_ARCH="arm"
-CONFIG_ARCH_BOARD="adafruit-kb2040"
-CONFIG_ARCH_BOARD_ADAFRUIT_KB2040=y
-CONFIG_ARCH_BOARD_COMMON=y
+CONFIG_ARCH_BOARD="adafruit-qt-py-rp2040"
+CONFIG_ARCH_BOARD_ADAFRUIT_QT_PY_RP2040=y
 CONFIG_ARCH_CHIP="rp2040"
 CONFIG_ARCH_CHIP_RP2040=y
-CONFIG_ARCH_RAMVECTORS=y
 CONFIG_ARCH_STACKDUMP=y
 CONFIG_BOARDCTL_RESET=y
 CONFIG_BOARD_LOOPSPERMSEC=10450
@@ -38,7 +36,10 @@ CONFIG_RAM_SIZE=270336
 CONFIG_RAM_START=0x20000000
 CONFIG_READLINE_CMD_HISTORY=y
 CONFIG_RP2040_BOARD_HAS_WS2812=y
-CONFIG_RP2040_WS2812_GPIO_PIN=17
+CONFIG_RP2040_UART1=y
+CONFIG_RP2040_UART1_RX_GPIO=5
+CONFIG_RP2040_WS2812_GPIO_PIN=12
+CONFIG_RP2040_WS2812_PWR_GPIO=11
 CONFIG_RR_INTERVAL=200
 CONFIG_SCHED_WAITPID=y
 CONFIG_START_DAY=9
@@ -48,6 +49,6 @@ CONFIG_SYSLOG_CONSOLE=y
 CONFIG_SYSTEM_NSH=y
 CONFIG_TESTING_GETPRIME=y
 CONFIG_TESTING_OSTEST=y
-CONFIG_UART0_SERIAL_CONSOLE=y
+CONFIG_UART1_SERIAL_CONSOLE=y
 CONFIG_WS2812=y
 CONFIG_WS2812_NON_SPI_DRIVER=y
diff --git a/boards/arm/rp2040/adafruit-feather-rp2040/configs/smp/defconfig b/boards/arm/rp2040/adafruit-qt-py-rp2040/configs/smp/defconfig
similarity index 84%
copy from boards/arm/rp2040/adafruit-feather-rp2040/configs/smp/defconfig
copy to boards/arm/rp2040/adafruit-qt-py-rp2040/configs/smp/defconfig
index 2f08ff6743..0df779d086 100644
--- a/boards/arm/rp2040/adafruit-feather-rp2040/configs/smp/defconfig
+++ b/boards/arm/rp2040/adafruit-qt-py-rp2040/configs/smp/defconfig
@@ -6,16 +6,15 @@
 # modifications.
 #
 # CONFIG_FS_PROCFS_EXCLUDE_ENVIRON is not set
-# CONFIG_LIBC_LONG_LONG is not set
 # CONFIG_NSH_ARGCAT is not set
 # CONFIG_NSH_CMDOPT_HEXDUMP is not set
 # CONFIG_NSH_DISABLE_DATE is not set
 # CONFIG_NSH_DISABLE_LOSMART is not set
+# CONFIG_RP2040_UART0 is not set
 # CONFIG_STANDARD_SERIAL is not set
 CONFIG_ARCH="arm"
-CONFIG_ARCH_BOARD="adafruit-feather-rp2040"
-CONFIG_ARCH_BOARD_ADAFRUIT_FEATHER_RP2040=y
-CONFIG_ARCH_BOARD_COMMON=y
+CONFIG_ARCH_BOARD="adafruit-qt-py-rp2040"
+CONFIG_ARCH_BOARD_ADAFRUIT_QT_PY_RP2040=y
 CONFIG_ARCH_CHIP="rp2040"
 CONFIG_ARCH_CHIP_RP2040=y
 CONFIG_ARCH_INTERRUPTSTACK=2048
@@ -39,7 +38,10 @@ CONFIG_RAM_SIZE=270336
 CONFIG_RAM_START=0x20000000
 CONFIG_READLINE_CMD_HISTORY=y
 CONFIG_RP2040_BOARD_HAS_WS2812=y
-CONFIG_RP2040_WS2812_GPIO_PIN=16
+CONFIG_RP2040_UART1=y
+CONFIG_RP2040_UART1_RX_GPIO=5
+CONFIG_RP2040_WS2812_GPIO_PIN=12
+CONFIG_RP2040_WS2812_PWR_GPIO=11
 CONFIG_RR_INTERVAL=200
 CONFIG_SMP=y
 CONFIG_SMP_NCPUS=2
@@ -54,6 +56,6 @@ CONFIG_SYSTEM_TASKSET=y
 CONFIG_TESTING_GETPRIME=y
 CONFIG_TESTING_OSTEST=y
 CONFIG_TESTING_SMP=y
-CONFIG_UART0_SERIAL_CONSOLE=y
+CONFIG_UART1_SERIAL_CONSOLE=y
 CONFIG_WS2812=y
 CONFIG_WS2812_NON_SPI_DRIVER=y
diff --git a/boards/arm/rp2040/adafruit-kb2040/configs/usbnsh/defconfig b/boards/arm/rp2040/adafruit-qt-py-rp2040/configs/usbnsh/defconfig
similarity index 89%
copy from boards/arm/rp2040/adafruit-kb2040/configs/usbnsh/defconfig
copy to boards/arm/rp2040/adafruit-qt-py-rp2040/configs/usbnsh/defconfig
index d4658760b8..0edc888649 100644
--- a/boards/arm/rp2040/adafruit-kb2040/configs/usbnsh/defconfig
+++ b/boards/arm/rp2040/adafruit-qt-py-rp2040/configs/usbnsh/defconfig
@@ -7,16 +7,14 @@
 #
 # CONFIG_DEV_CONSOLE is not set
 # CONFIG_FS_PROCFS_EXCLUDE_ENVIRON is not set
-# CONFIG_LIBC_LONG_LONG is not set
 # CONFIG_NSH_ARGCAT is not set
 # CONFIG_NSH_CMDOPT_HEXDUMP is not set
 # CONFIG_NSH_DISABLE_DATE is not set
 # CONFIG_NSH_DISABLE_LOSMART is not set
 # CONFIG_RP2040_UART0 is not set
 CONFIG_ARCH="arm"
-CONFIG_ARCH_BOARD="adafruit-kb2040"
-CONFIG_ARCH_BOARD_ADAFRUIT_KB2040=y
-CONFIG_ARCH_BOARD_COMMON=y
+CONFIG_ARCH_BOARD="adafruit-qt-py-rp2040"
+CONFIG_ARCH_BOARD_ADAFRUIT_QT_PY_RP2040=y
 CONFIG_ARCH_CHIP="rp2040"
 CONFIG_ARCH_CHIP_RP2040=y
 CONFIG_ARCH_RAMVECTORS=y
@@ -42,7 +40,8 @@ CONFIG_RAM_SIZE=270336
 CONFIG_RAM_START=0x20000000
 CONFIG_READLINE_CMD_HISTORY=y
 CONFIG_RP2040_BOARD_HAS_WS2812=y
-CONFIG_RP2040_WS2812_GPIO_PIN=17
+CONFIG_RP2040_WS2812_GPIO_PIN=12
+CONFIG_RP2040_WS2812_PWR_GPIO=11
 CONFIG_RR_INTERVAL=200
 CONFIG_SCHED_WAITPID=y
 CONFIG_START_DAY=9
diff --git a/boards/arm/rp2040/adafruit-kb2040/include/board.h b/boards/arm/rp2040/adafruit-qt-py-rp2040/include/board.h
similarity index 88%
copy from boards/arm/rp2040/adafruit-kb2040/include/board.h
copy to boards/arm/rp2040/adafruit-qt-py-rp2040/include/board.h
index 8caa301931..00e8e36dba 100644
--- a/boards/arm/rp2040/adafruit-kb2040/include/board.h
+++ b/boards/arm/rp2040/adafruit-qt-py-rp2040/include/board.h
@@ -1,5 +1,5 @@
 /****************************************************************************
- * boards/arm/rp2040/adafruit-kb2040/include/board.h
+ * boards/arm/rp2040/adafruit-qt-py-rp2040/include/board.h
  *
  * Licensed to the Apache Software Foundation (ASF) under one or more
  * contributor license agreements.  See the NOTICE file distributed with
@@ -18,8 +18,8 @@
  *
  ****************************************************************************/
 
-#ifndef __BOARDS_ARM_RP2040_ADAFRUIT_KB2040_INCLUDE_BOARD_H
-#define __BOARDS_ARM_RP2040_ADAFRUIT_KB2040_INCLUDE_BOARD_H
+#ifndef __BOARDS_ARM_RP2040_ADAFRUIT_QT_PY_RP2040_INCLUDE_BOARD_H
+#define __BOARDS_ARM_RP2040_ADAFRUIT_QT_PY_RP2040_INCLUDE_BOARD_H
 
 /****************************************************************************
  * Included Files
@@ -62,10 +62,11 @@
 
 /* GPIO definitions *********************************************************/
 
-#undef BOARD_GPIO_LED_PIN
-#define BOARD_NGPIOOUT           1
-#define BOARD_NGPIOIN            1
-#define BOARD_NGPIOINT           1
+#undef  BOARD_GPIO_LED_PIN
+#define BOARD_GPIO_WS2812_PWR_PIN 11
+#define BOARD_NGPIOOUT             1
+#define BOARD_NGPIOIN              1
+#define BOARD_NGPIOINT             1
 
 /****************************************************************************
  * Public Types
@@ -113,4 +114,4 @@ void rp2040_boardinitialize(void);
 }
 #endif
 #endif /* __ASSEMBLY__ */
-#endif /* __BOARDS_ARM_RP2040_ADAFRUIT_KB2040_INCLUDE_BOARD_H */
+#endif /* __BOARDS_ARM_RP2040_ADAFRUIT_QT_PY_RP2040_INCLUDE_BOARD_H */
diff --git a/arch/arm/src/rp2040/rp2040_ws2812.h b/boards/arm/rp2040/adafruit-qt-py-rp2040/include/rp2040_i2cdev.h
similarity index 59%
copy from arch/arm/src/rp2040/rp2040_ws2812.h
copy to boards/arm/rp2040/adafruit-qt-py-rp2040/include/rp2040_i2cdev.h
index 3f91cfc9fe..30c378cd7a 100644
--- a/arch/arm/src/rp2040/rp2040_ws2812.h
+++ b/boards/arm/rp2040/adafruit-qt-py-rp2040/include/rp2040_i2cdev.h
@@ -1,5 +1,5 @@
 /****************************************************************************
- * arch/arm/src/rp2040/rp2040_ws2812.h
+ * boards/arm/rp2040/adafruit-qt-py-rp2040/include/rp2040_i2cdev.h
  *
  * Licensed to the Apache Software Foundation (ASF) under one or more
  * contributor license agreements.  See the NOTICE file distributed with
@@ -18,18 +18,27 @@
  *
  ****************************************************************************/
 
-#ifndef __ARCH_ARM_SRC_RP2040_RP2040_WS2812_H
-#define __ARCH_ARM_SRC_RP2040_RP2040_WS2812_H
+#ifndef __BOARDS_ARM_RP2040_ADAFRUIT_QT_PY_RB2040_INCLUDE_RP2040_I2CDEV_H
+#define __BOARDS_ARM_RP2040_ADAFRUIT_QT_PY_RB2040_INCLUDE_RP2040_I2CDEV_H
 
 /****************************************************************************
  * Included Files
  ****************************************************************************/
 
 #include <nuttx/config.h>
-#include <debug.h>
-#include <stdbool.h>
+#include <stdint.h>
+
+/****************************************************************************
+ * Public Types
+ ****************************************************************************/
 
 #ifndef __ASSEMBLY__
+
+/****************************************************************************
+ * Public Data
+ ****************************************************************************/
+
+#undef EXTERN
 #if defined(__cplusplus)
 #define EXTERN extern "C"
 extern "C"
@@ -38,52 +47,20 @@ extern "C"
 #define EXTERN extern
 #endif
 
-#ifdef CONFIG_WS2812
-
 /****************************************************************************
  * Public Function Prototypes
  ****************************************************************************/
 
 /****************************************************************************
- * Name: rp2040_ws2812_setup
- *
- * Description:
- *   Initialize and register the ws2812 driver.
- *
- * Input Parameters:
- *   Path to the ws2812 device  (e.g. "/dev/leds0")
- *   Port number for the ws2812 chain
- *   The number of pixels in the chain
- *   Whether ws2812s have white LEDs
- *
- * Returned Value:
- *   An opaque pointer that can be passed to rp2040_ws2812_teardown on
- *   success or NULL (with errno set) on failure
- ****************************************************************************/
-
-FAR void * rp2040_ws2812_setup(FAR const char *path,
-                               int             port,
-                               uint16_t        pixel_count,
-                               bool            has_white);
-
-/****************************************************************************
- * Name: rp2040_ws2812_release
+ * Name: board_i2cdev_initialize
  *
  * Description:
- *   This function releases the internal memory structures created when
- *   a driver is opened.  It will fail with an error -EBUSY the driver
- *   is open when it is called.
- *
- * Input Parameters:
- *   driver      - Opaque pointer returned by rp2040_ws2812_setup.
- *
- * Returned Value:
- *   OK on success or an ERROR on failure
+ *   Initialize i2c driver and register the /dev/i2c device.
  *
  ****************************************************************************/
 
-int rp2040_ws2812_release(FAR void * driver);
-
+#ifdef CONFIG_RP2040_I2C_DRIVER
+int board_i2cdev_initialize(int bus);
 #endif
 
 #undef EXTERN
@@ -92,4 +69,4 @@ int rp2040_ws2812_release(FAR void * driver);
 #endif
 
 #endif /* __ASSEMBLY__ */
-#endif /* __ARCH_ARM_SRC_RP2040_RP2040_WS2812_H */
+#endif /* __BOARDS_ARM_RP2040_ADAFRUIT_QT_PY_RB2040_INCLUDE_RP2040_I2CDEV_H */
diff --git a/arch/arm/src/rp2040/rp2040_ws2812.h b/boards/arm/rp2040/adafruit-qt-py-rp2040/include/rp2040_i2sdev.h
similarity index 59%
copy from arch/arm/src/rp2040/rp2040_ws2812.h
copy to boards/arm/rp2040/adafruit-qt-py-rp2040/include/rp2040_i2sdev.h
index 3f91cfc9fe..ac3ccbc030 100644
--- a/arch/arm/src/rp2040/rp2040_ws2812.h
+++ b/boards/arm/rp2040/adafruit-qt-py-rp2040/include/rp2040_i2sdev.h
@@ -1,5 +1,5 @@
 /****************************************************************************
- * arch/arm/src/rp2040/rp2040_ws2812.h
+ * boards/arm/rp2040/adafruit-qt-py-rp2040/include/rp2040_i2sdev.h
  *
  * Licensed to the Apache Software Foundation (ASF) under one or more
  * contributor license agreements.  See the NOTICE file distributed with
@@ -18,18 +18,27 @@
  *
  ****************************************************************************/
 
-#ifndef __ARCH_ARM_SRC_RP2040_RP2040_WS2812_H
-#define __ARCH_ARM_SRC_RP2040_RP2040_WS2812_H
+#ifndef __BOARDS_ARM_RP2040_ADAFRUIT_QT_PY_RB2040_INCLUDE_RP2040_I2SDEV_H
+#define __BOARDS_ARM_RP2040_ADAFRUIT_QT_PY_RB2040_INCLUDE_RP2040_I2SDEV_H
 
 /****************************************************************************
  * Included Files
  ****************************************************************************/
 
 #include <nuttx/config.h>
-#include <debug.h>
-#include <stdbool.h>
+#include <stdint.h>
+
+/****************************************************************************
+ * Public Types
+ ****************************************************************************/
 
 #ifndef __ASSEMBLY__
+
+/****************************************************************************
+ * Public Data
+ ****************************************************************************/
+
+#undef EXTERN
 #if defined(__cplusplus)
 #define EXTERN extern "C"
 extern "C"
@@ -38,52 +47,20 @@ extern "C"
 #define EXTERN extern
 #endif
 
-#ifdef CONFIG_WS2812
-
 /****************************************************************************
  * Public Function Prototypes
  ****************************************************************************/
 
 /****************************************************************************
- * Name: rp2040_ws2812_setup
- *
- * Description:
- *   Initialize and register the ws2812 driver.
- *
- * Input Parameters:
- *   Path to the ws2812 device  (e.g. "/dev/leds0")
- *   Port number for the ws2812 chain
- *   The number of pixels in the chain
- *   Whether ws2812s have white LEDs
- *
- * Returned Value:
- *   An opaque pointer that can be passed to rp2040_ws2812_teardown on
- *   success or NULL (with errno set) on failure
- ****************************************************************************/
-
-FAR void * rp2040_ws2812_setup(FAR const char *path,
-                               int             port,
-                               uint16_t        pixel_count,
-                               bool            has_white);
-
-/****************************************************************************
- * Name: rp2040_ws2812_release
+ * Name: board_i2sdev_initialize
  *
  * Description:
- *   This function releases the internal memory structures created when
- *   a driver is opened.  It will fail with an error -EBUSY the driver
- *   is open when it is called.
- *
- * Input Parameters:
- *   driver      - Opaque pointer returned by rp2040_ws2812_setup.
- *
- * Returned Value:
- *   OK on success or an ERROR on failure
+ *   Initialize i2s driver and register the /dev/audio/pcm0 device.
  *
  ****************************************************************************/
 
-int rp2040_ws2812_release(FAR void * driver);
-
+#ifdef CONFIG_RP2040_I2S
+int board_i2sdev_initialize(int bus);
 #endif
 
 #undef EXTERN
@@ -92,4 +69,4 @@ int rp2040_ws2812_release(FAR void * driver);
 #endif
 
 #endif /* __ASSEMBLY__ */
-#endif /* __ARCH_ARM_SRC_RP2040_RP2040_WS2812_H */
+#endif /* __BOARDS_ARM_RP2040_ADAFRUIT_QT_PY_RB2040_INCLUDE_RP2040_I2SDEV_H */
diff --git a/arch/arm/src/rp2040/rp2040_ws2812.h b/boards/arm/rp2040/adafruit-qt-py-rp2040/include/rp2040_spidev.h
similarity index 59%
copy from arch/arm/src/rp2040/rp2040_ws2812.h
copy to boards/arm/rp2040/adafruit-qt-py-rp2040/include/rp2040_spidev.h
index 3f91cfc9fe..293b55cd13 100644
--- a/arch/arm/src/rp2040/rp2040_ws2812.h
+++ b/boards/arm/rp2040/adafruit-qt-py-rp2040/include/rp2040_spidev.h
@@ -1,5 +1,5 @@
 /****************************************************************************
- * arch/arm/src/rp2040/rp2040_ws2812.h
+ * boards/arm/rp2040/adafruit-qt-py-rp2040/include/rp2040_spidev.h
  *
  * Licensed to the Apache Software Foundation (ASF) under one or more
  * contributor license agreements.  See the NOTICE file distributed with
@@ -18,18 +18,26 @@
  *
  ****************************************************************************/
 
-#ifndef __ARCH_ARM_SRC_RP2040_RP2040_WS2812_H
-#define __ARCH_ARM_SRC_RP2040_RP2040_WS2812_H
+#ifndef __BOARDS_ARM_RP2040_ADAFRUIT_QT_PY_RB2040_INCLUDE_RP2040_SPIDEV_H
+#define __BOARDS_ARM_RP2040_ADAFRUIT_QT_PY_RB2040_INCLUDE_RP2040_SPIDEV_H
 
 /****************************************************************************
  * Included Files
  ****************************************************************************/
 
 #include <nuttx/config.h>
-#include <debug.h>
-#include <stdbool.h>
+
+/****************************************************************************
+ * Public Types
+ ****************************************************************************/
 
 #ifndef __ASSEMBLY__
+
+/****************************************************************************
+ * Public Data
+ ****************************************************************************/
+
+#undef EXTERN
 #if defined(__cplusplus)
 #define EXTERN extern "C"
 extern "C"
@@ -38,53 +46,19 @@ extern "C"
 #define EXTERN extern
 #endif
 
-#ifdef CONFIG_WS2812
-
 /****************************************************************************
  * Public Function Prototypes
  ****************************************************************************/
 
 /****************************************************************************
- * Name: rp2040_ws2812_setup
+ * Name: board_spidev_initialize
  *
  * Description:
- *   Initialize and register the ws2812 driver.
+ *   Initialize spi driver and register the /dev/spi device.
  *
- * Input Parameters:
- *   Path to the ws2812 device  (e.g. "/dev/leds0")
- *   Port number for the ws2812 chain
- *   The number of pixels in the chain
- *   Whether ws2812s have white LEDs
- *
- * Returned Value:
- *   An opaque pointer that can be passed to rp2040_ws2812_teardown on
- *   success or NULL (with errno set) on failure
  ****************************************************************************/
 
-FAR void * rp2040_ws2812_setup(FAR const char *path,
-                               int             port,
-                               uint16_t        pixel_count,
-                               bool            has_white);
-
-/****************************************************************************
- * Name: rp2040_ws2812_release
- *
- * Description:
- *   This function releases the internal memory structures created when
- *   a driver is opened.  It will fail with an error -EBUSY the driver
- *   is open when it is called.
- *
- * Input Parameters:
- *   driver      - Opaque pointer returned by rp2040_ws2812_setup.
- *
- * Returned Value:
- *   OK on success or an ERROR on failure
- *
- ****************************************************************************/
-
-int rp2040_ws2812_release(FAR void * driver);
-
-#endif
+int board_spidev_initialize(int bus);
 
 #undef EXTERN
 #if defined(__cplusplus)
@@ -92,4 +66,4 @@ int rp2040_ws2812_release(FAR void * driver);
 #endif
 
 #endif /* __ASSEMBLY__ */
-#endif /* __ARCH_ARM_SRC_RP2040_RP2040_WS2812_H */
+#endif /* __BOARDS_ARM_RP2040_ADAFRUIT_QT_PY_RB2040_INCLUDE_RP2040_SPIDEV_H */
diff --git a/arch/arm/src/rp2040/rp2040_ws2812.h b/boards/arm/rp2040/adafruit-qt-py-rp2040/include/rp2040_spisd.h
similarity index 59%
copy from arch/arm/src/rp2040/rp2040_ws2812.h
copy to boards/arm/rp2040/adafruit-qt-py-rp2040/include/rp2040_spisd.h
index 3f91cfc9fe..4894378abf 100644
--- a/arch/arm/src/rp2040/rp2040_ws2812.h
+++ b/boards/arm/rp2040/adafruit-qt-py-rp2040/include/rp2040_spisd.h
@@ -1,5 +1,5 @@
 /****************************************************************************
- * arch/arm/src/rp2040/rp2040_ws2812.h
+ * boards/arm/rp2040/adafruit-qt-py-rp2040/include/rp2040_spisd.h
  *
  * Licensed to the Apache Software Foundation (ASF) under one or more
  * contributor license agreements.  See the NOTICE file distributed with
@@ -18,18 +18,26 @@
  *
  ****************************************************************************/
 
-#ifndef __ARCH_ARM_SRC_RP2040_RP2040_WS2812_H
-#define __ARCH_ARM_SRC_RP2040_RP2040_WS2812_H
+#ifndef __BOARDS_ARM_RP2040_ADAFRUIT_QT_PY_RB2040_INCLUDE_RP2040_SPISD_H
+#define __BOARDS_ARM_RP2040_ADAFRUIT_QT_PY_RB2040_INCLUDE_RP2040_SPISD_H
 
 /****************************************************************************
  * Included Files
  ****************************************************************************/
 
 #include <nuttx/config.h>
-#include <debug.h>
-#include <stdbool.h>
+
+/****************************************************************************
+ * Public Types
+ ****************************************************************************/
 
 #ifndef __ASSEMBLY__
+
+/****************************************************************************
+ * Public Data
+ ****************************************************************************/
+
+#undef EXTERN
 #if defined(__cplusplus)
 #define EXTERN extern "C"
 extern "C"
@@ -38,52 +46,32 @@ extern "C"
 #define EXTERN extern
 #endif
 
-#ifdef CONFIG_WS2812
-
 /****************************************************************************
  * Public Function Prototypes
  ****************************************************************************/
 
 /****************************************************************************
- * Name: rp2040_ws2812_setup
+ * Name: board_spisd_initialize
  *
  * Description:
- *   Initialize and register the ws2812 driver.
+ *   Initialize the SPI-based SD card.
  *
- * Input Parameters:
- *   Path to the ws2812 device  (e.g. "/dev/leds0")
- *   Port number for the ws2812 chain
- *   The number of pixels in the chain
- *   Whether ws2812s have white LEDs
- *
- * Returned Value:
- *   An opaque pointer that can be passed to rp2040_ws2812_teardown on
- *   success or NULL (with errno set) on failure
  ****************************************************************************/
 
-FAR void * rp2040_ws2812_setup(FAR const char *path,
-                               int             port,
-                               uint16_t        pixel_count,
-                               bool            has_white);
+#ifdef CONFIG_RP2040_SPISD
+int board_spisd_initialize(int minor, int bus);
+#endif
 
 /****************************************************************************
- * Name: rp2040_ws2812_release
+ * Name: board_spisd_status
  *
  * Description:
- *   This function releases the internal memory structures created when
- *   a driver is opened.  It will fail with an error -EBUSY the driver
- *   is open when it is called.
- *
- * Input Parameters:
- *   driver      - Opaque pointer returned by rp2040_ws2812_setup.
- *
- * Returned Value:
- *   OK on success or an ERROR on failure
+ *   Get the status whether SD Card is present or not.
  *
  ****************************************************************************/
 
-int rp2040_ws2812_release(FAR void * driver);
-
+#ifdef CONFIG_RP2040_SPISD
+uint8_t board_spisd_status(struct spi_dev_s *dev, uint32_t devid);
 #endif
 
 #undef EXTERN
@@ -92,4 +80,4 @@ int rp2040_ws2812_release(FAR void * driver);
 #endif
 
 #endif /* __ASSEMBLY__ */
-#endif /* __ARCH_ARM_SRC_RP2040_RP2040_WS2812_H */
+#endif /* __BOARDS_ARM_RP2040_ADAFRUIT_QT_PY_RB2040_INCLUDE_RP2040_SPISD_H */
diff --git a/boards/arm/rp2040/adafruit-qt-py-rp2040/scripts/Make.defs b/boards/arm/rp2040/adafruit-qt-py-rp2040/scripts/Make.defs
new file mode 100644
index 0000000000..58ed13a6aa
--- /dev/null
+++ b/boards/arm/rp2040/adafruit-qt-py-rp2040/scripts/Make.defs
@@ -0,0 +1,45 @@
+############################################################################
+# boards/arm/rp2040/adafruit-qt-py-rp2040/scripts/Make.defs
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.  The
+# ASF licenses this file to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance with the
+# License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+# License for the specific language governing permissions and limitations
+# under the License.
+#
+############################################################################
+
+include $(TOPDIR)/.config
+include $(TOPDIR)/tools/Config.mk
+include $(TOPDIR)/tools/rp2040/Config.mk
+include $(TOPDIR)/arch/arm/src/armv6-m/Toolchain.defs
+
+ifeq ($(CONFIG_RP2040_FLASH_BOOT),y)
+  LDSCRIPT = adafruit-qt-py-rp2040-flash.ld
+else
+  LDSCRIPT = adafruit-qt-py-rp2040-sram.ld
+endif
+
+ARCHSCRIPT += $(BOARD_DIR)$(DELIM)scripts$(DELIM)$(LDSCRIPT)
+
+ARCHPICFLAGS = -fpic -msingle-pic-base -mpic-register=r10
+
+CFLAGS := $(ARCHCFLAGS) $(ARCHOPTIMIZATION) $(ARCHCPUFLAGS) $(ARCHINCLUDES) $(ARCHDEFINES) $(EXTRAFLAGS) -pipe
+CPICFLAGS = $(ARCHPICFLAGS) $(CFLAGS)
+CXXFLAGS := $(ARCHCXXFLAGS) $(ARCHOPTIMIZATION) $(ARCHCPUFLAGS) $(ARCHXXINCLUDES) $(ARCHDEFINES) $(EXTRAFLAGS) -pipe
+CXXPICFLAGS = $(ARCHPICFLAGS) $(CXXFLAGS)
+CPPFLAGS := $(ARCHINCLUDES) $(ARCHDEFINES) $(EXTRAFLAGS)
+AFLAGS := $(CFLAGS) -D__ASSEMBLY__
+
+NXFLATLDFLAGS1 = -r -d -warn-common
+NXFLATLDFLAGS2 = $(NXFLATLDFLAGS1) -T$(TOPDIR)/binfmt/libnxflat/gnu-nxflat-pcrel.ld -no-check-sections
+LDNXFLATFLAGS = -e main -s 2048
diff --git a/boards/arm/rp2040/adafruit-kb2040/scripts/adafruit-kb2040-flash.ld b/boards/arm/rp2040/adafruit-qt-py-rp2040/scripts/adafruit-qt-py-rp2040-flash.ld
similarity index 95%
copy from boards/arm/rp2040/adafruit-kb2040/scripts/adafruit-kb2040-flash.ld
copy to boards/arm/rp2040/adafruit-qt-py-rp2040/scripts/adafruit-qt-py-rp2040-flash.ld
index 4d7719c423..9fc8ee22a4 100644
--- a/boards/arm/rp2040/adafruit-kb2040/scripts/adafruit-kb2040-flash.ld
+++ b/boards/arm/rp2040/adafruit-qt-py-rp2040/scripts/adafruit-qt-py-rp2040-flash.ld
@@ -1,5 +1,5 @@
 /****************************************************************************
- * boards/arm/rp2040/adafruit-kb2040/scripts/adafruit-kb2040-flash.ld
+ * boards/arm/rp2040/adafruit-kb2040/scripts/adafruit-qt-py-rp2040-flash.ld
  *
  * Licensed to the Apache Software Foundation (ASF) under one or more
  * contributor license agreements.  See the NOTICE file distributed with
@@ -20,7 +20,7 @@
 
 MEMORY
 {
-  flash (rx) : ORIGIN = 0x10000000, LENGTH = 2048K
+  flash (rx) : ORIGIN = 0x10000000, LENGTH = 8192K
   sram (rwx) : ORIGIN = 0x20000000, LENGTH = 264K
 }
 
diff --git a/boards/arm/rp2040/adafruit-kb2040/scripts/adafruit-kb2040-flash.ld b/boards/arm/rp2040/adafruit-qt-py-rp2040/scripts/adafruit-qt-py-rp2040-sram.ld
similarity index 84%
copy from boards/arm/rp2040/adafruit-kb2040/scripts/adafruit-kb2040-flash.ld
copy to boards/arm/rp2040/adafruit-qt-py-rp2040/scripts/adafruit-qt-py-rp2040-sram.ld
index 4d7719c423..7b559bf00c 100644
--- a/boards/arm/rp2040/adafruit-kb2040/scripts/adafruit-kb2040-flash.ld
+++ b/boards/arm/rp2040/adafruit-qt-py-rp2040/scripts/adafruit-qt-py-rp2040-sram.ld
@@ -1,5 +1,5 @@
 /****************************************************************************
- * boards/arm/rp2040/adafruit-kb2040/scripts/adafruit-kb2040-flash.ld
+ * boards/arm/rp2040/adafruit-kb2040/scripts/adafruit-qt-py-rp2040-sram.ld
  *
  * Licensed to the Apache Software Foundation (ASF) under one or more
  * contributor license agreements.  See the NOTICE file distributed with
@@ -20,7 +20,6 @@
 
 MEMORY
 {
-  flash (rx) : ORIGIN = 0x10000000, LENGTH = 2048K
   sram (rwx) : ORIGIN = 0x20000000, LENGTH = 264K
 }
 
@@ -30,18 +29,10 @@ ENTRY(_stext)
 
 SECTIONS
 {
-    .flash_begin : {
-        __flash_binary_start = .;
-    } > flash
-
-    .boot2 : {
-        __boot2_start__ = .;
-        KEEP (*(.boot2))
-        __boot2_end__ = .;
-    } > flash
-
     .text : {
         _stext = ABSOLUTE(.);
+        rp2040_start.o(.text)
+        . = ALIGN(256);
         *(.vectors)
         *(.text .text.*)
         *(.fixup)
@@ -54,29 +45,23 @@ SECTIONS
         *(.gcc_except_table)
         *(.gnu.linkonce.r.*)
         _etext = ABSOLUTE(.);
-    } > flash
+    } > sram
 
     .init_section : {
         _sinit = ABSOLUTE(.);
         *(.init_array .init_array.*)
         _einit = ABSOLUTE(.);
-    } > flash
+    } > sram
 
     .ARM.extab : {
         *(.ARM.extab*)
-    } > flash
+    } > sram
 
     __exidx_start = ABSOLUTE(.);
     .ARM.exidx : {
         *(.ARM.exidx*)
-    } > flash
-    __exidx_end = ABSOLUTE(.);
-
-    _eronly = ABSOLUTE(.);
-
-    .ram_vectors (COPY) : {
-        *(.ram_vectors)
     } > sram
+    __exidx_end = ABSOLUTE(.);
 
     .data : {
         _sdata = ABSOLUTE(.);
@@ -85,7 +70,7 @@ SECTIONS
         CONSTRUCTORS
         . = ALIGN(4);
         _edata = ABSOLUTE(.);
-    } > sram AT > flash
+    } > sram
 
     .bss : {
         _sbss = ABSOLUTE(.);
diff --git a/boards/arm/rp2040/adafruit-qt-py-rp2040/src/Make.defs b/boards/arm/rp2040/adafruit-qt-py-rp2040/src/Make.defs
new file mode 100644
index 0000000000..5a73b36fde
--- /dev/null
+++ b/boards/arm/rp2040/adafruit-qt-py-rp2040/src/Make.defs
@@ -0,0 +1,41 @@
+############################################################################
+# boards/arm/rp2040/adafruit-qt-py-rp2040/src/Make.defs
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.  The
+# ASF licenses this file to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance with the
+# License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+# License for the specific language governing permissions and limitations
+# under the License.
+#
+############################################################################
+
+include $(TOPDIR)/Make.defs
+
+CSRCS = rp2040_boardinitialize.c
+CSRCS += rp2040_appinit.c
+CSRCS += rp2040_bringup.c
+
+ifeq ($(CONFIG_BOARDCTL_RESET),y)
+CSRCS += rp2040_reset.c
+endif
+
+ifeq ($(CONFIG_SPI),y)
+CSRCS += rp2040_spi.c
+endif
+
+ifeq ($(CONFIG_DEV_GPIO),y)
+CSRCS += rp2040_gpio.c
+endif
+
+DEPPATH += --dep-path board
+VPATH += :board
+CFLAGS += $(shell $(INCDIR) "$(CC)" $(TOPDIR)$(DELIM)arch$(DELIM)$(CONFIG_ARCH)$(DELIM)src$(DELIM)board$(DELIM)board)
diff --git a/arch/arm/src/rp2040/rp2040_ws2812.h b/boards/arm/rp2040/adafruit-qt-py-rp2040/src/rp2040_appinit.c
similarity index 53%
copy from arch/arm/src/rp2040/rp2040_ws2812.h
copy to boards/arm/rp2040/adafruit-qt-py-rp2040/src/rp2040_appinit.c
index 3f91cfc9fe..d263ce78ee 100644
--- a/arch/arm/src/rp2040/rp2040_ws2812.h
+++ b/boards/arm/rp2040/adafruit-qt-py-rp2040/src/rp2040_appinit.c
@@ -1,5 +1,5 @@
 /****************************************************************************
- * arch/arm/src/rp2040/rp2040_ws2812.h
+ * boards/arm/rp2040/adafruit-qt-py-rp2040/src/rp2040_appinit.c
  *
  * Licensed to the Apache Software Foundation (ASF) under one or more
  * contributor license agreements.  See the NOTICE file distributed with
@@ -18,78 +18,59 @@
  *
  ****************************************************************************/
 
-#ifndef __ARCH_ARM_SRC_RP2040_RP2040_WS2812_H
-#define __ARCH_ARM_SRC_RP2040_RP2040_WS2812_H
-
 /****************************************************************************
  * Included Files
  ****************************************************************************/
 
 #include <nuttx/config.h>
-#include <debug.h>
-#include <stdbool.h>
+#include <nuttx/board.h>
 
-#ifndef __ASSEMBLY__
-#if defined(__cplusplus)
-#define EXTERN extern "C"
-extern "C"
-{
-#else
-#define EXTERN extern
-#endif
+#include <sys/types.h>
 
-#ifdef CONFIG_WS2812
+#include "rp2040_pico.h"
 
 /****************************************************************************
- * Public Function Prototypes
+ * Pre-processor Definitions
  ****************************************************************************/
 
 /****************************************************************************
- * Name: rp2040_ws2812_setup
- *
- * Description:
- *   Initialize and register the ws2812 driver.
- *
- * Input Parameters:
- *   Path to the ws2812 device  (e.g. "/dev/leds0")
- *   Port number for the ws2812 chain
- *   The number of pixels in the chain
- *   Whether ws2812s have white LEDs
- *
- * Returned Value:
- *   An opaque pointer that can be passed to rp2040_ws2812_teardown on
- *   success or NULL (with errno set) on failure
+ * Public Functions
  ****************************************************************************/
 
-FAR void * rp2040_ws2812_setup(FAR const char *path,
-                               int             port,
-                               uint16_t        pixel_count,
-                               bool            has_white);
-
 /****************************************************************************
- * Name: rp2040_ws2812_release
+ * Name: board_app_initialize
  *
  * Description:
- *   This function releases the internal memory structures created when
- *   a driver is opened.  It will fail with an error -EBUSY the driver
- *   is open when it is called.
+ *   Perform application specific initialization.  This function is never
+ *   called directly from application code, but only indirectly via the
+ *   (non-standard) boardctl() interface using the command BOARDIOC_INIT.
  *
  * Input Parameters:
- *   driver      - Opaque pointer returned by rp2040_ws2812_setup.
+ *   arg - The boardctl() argument is passed to the board_app_initialize()
+ *         implementation without modification.  The argument has no
+ *         meaning to NuttX; the meaning of the argument is a contract
+ *         between the board-specific initialization logic and the
+ *         matching application logic.  The value could be such things as a
+ *         mode enumeration value, a set of DIP switch switch settings, a
+ *         pointer to configuration data read from a file or serial FLASH,
+ *         or whatever you would like to do with it.  Every implementation
+ *         should accept zero/NULL as a default configuration.
  *
  * Returned Value:
- *   OK on success or an ERROR on failure
+ *   Zero (OK) is returned on success; a negated errno value is returned on
+ *   any failure to indicate the nature of the failure.
  *
  ****************************************************************************/
 
-int rp2040_ws2812_release(FAR void * driver);
+int board_app_initialize(uintptr_t arg)
+{
+#ifdef CONFIG_BOARD_LATE_INITIALIZE
+  /* Board initialization already performed by board_late_initialize() */
 
-#endif
+  return OK;
+#else
+  /* Perform board-specific initialization */
 
-#undef EXTERN
-#if defined(__cplusplus)
-}
+  return rp2040_bringup();
 #endif
-
-#endif /* __ASSEMBLY__ */
-#endif /* __ARCH_ARM_SRC_RP2040_RP2040_WS2812_H */
+}
diff --git a/boards/arm/rp2040/adafruit-kb2040/src/rp2040_boardinitialize.c b/boards/arm/rp2040/adafruit-qt-py-rp2040/src/rp2040_boardinitialize.c
similarity index 67%
copy from boards/arm/rp2040/adafruit-kb2040/src/rp2040_boardinitialize.c
copy to boards/arm/rp2040/adafruit-qt-py-rp2040/src/rp2040_boardinitialize.c
index 09d4b315bb..e2935b3e46 100644
--- a/boards/arm/rp2040/adafruit-kb2040/src/rp2040_boardinitialize.c
+++ b/boards/arm/rp2040/adafruit-qt-py-rp2040/src/rp2040_boardinitialize.c
@@ -1,5 +1,5 @@
 /****************************************************************************
- * boards/arm/rp2040/adafruit-kb2040/src/rp2040_boardinitialize.c
+ * boards/arm/rp2040/adafruit-qt-py-rp2040/src/rp2040_boardinitialize.c
  *
  * Licensed to the Apache Software Foundation (ASF) under one or more
  * contributor license agreements.  See the NOTICE file distributed with
@@ -64,32 +64,32 @@ void rp2040_boardearlyinitialize(void)
 
   /* Set default UART pin */
 
-#if defined(CONFIG_RP2040_UART0) && CONFIG_RP2040_UART0_GPIO >= 0
-  rp2040_gpio_set_function(CONFIG_RP2040_UART0_GPIO,
+#ifdef CONFIG_RP2040_UART0
+  rp2040_gpio_set_function(CONFIG_RP2040_UART0_TX_GPIO,
                            RP2040_GPIO_FUNC_UART);      /* TX */
-  rp2040_gpio_set_function(CONFIG_RP2040_UART0_GPIO + 1,
+  rp2040_gpio_set_function(CONFIG_RP2040_UART0_RX_GPIO,
                            RP2040_GPIO_FUNC_UART);      /* RX */
 #ifdef CONFIG_SERIAL_OFLOWCONTROL
-  rp2040_gpio_set_function(CONFIG_RP2040_UART0_GPIO + 2,
+  rp2040_gpio_set_function(CONFIG_RP2040_UART0_CTS_GPIO,
                            RP2040_GPIO_FUNC_UART);      /* CTS */
 #endif
 #ifdef CONFIG_SERIAL_IFLOWCONTROL
-  rp2040_gpio_set_function(CONFIG_RP2040_UART0_GPIO + 3,
+  rp2040_gpio_set_function(CONFIG_RP2040_UART0_RTS_GPIO,
                            RP2040_GPIO_FUNC_UART);      /* RTS */
 #endif
 #endif
 
-#if defined(CONFIG_RP2040_UART1) && CONFIG_RP2040_UART1_GPIO >= 0
-  rp2040_gpio_set_function(CONFIG_RP2040_UART1_GPIO,
+#ifdef CONFIG_RP2040_UART1
+  rp2040_gpio_set_function(CONFIG_RP2040_UART1_TX_GPIO,
                            RP2040_GPIO_FUNC_UART);      /* TX */
-  rp2040_gpio_set_function(CONFIG_RP2040_UART1_GPIO + 1,
+  rp2040_gpio_set_function(CONFIG_RP2040_UART1_RX_GPIO,
                            RP2040_GPIO_FUNC_UART);      /* RX */
 #ifdef CONFIG_SERIAL_OFLOWCONTROL
-  rp2040_gpio_set_function(CONFIG_RP2040_UART1_GPIO + 2,
+  rp2040_gpio_set_function(CONFIG_RP2040_UART1_CTS_GPIO,
                            RP2040_GPIO_FUNC_UART);      /* CTS */
 #endif
 #ifdef CONFIG_SERIAL_IFLOWCONTROL
-  rp2040_gpio_set_function(CONFIG_RP2040_UART1_GPIO + 3,
+  rp2040_gpio_set_function(CONFIG_RP2040_UART1_RTS_GPIO,
                            RP2040_GPIO_FUNC_UART);      /* RTS */
 #endif
 #endif
@@ -106,55 +106,55 @@ void rp2040_boardinitialize(void)
 {
   /* Set default I2C pin */
 
-#if defined(CONFIG_RP2040_I2C0) && CONFIG_RP2040_I2C0_GPIO >= 0
-  rp2040_gpio_set_function(CONFIG_RP2040_I2C0_GPIO,
+#ifdef CONFIG_RP2040_I2C0
+  rp2040_gpio_set_function(CONFIG_RP2040_I2C0_SDA_GPIO,
                            RP2040_GPIO_FUNC_I2C);       /* SDA */
-  rp2040_gpio_set_function(CONFIG_RP2040_I2C0_GPIO + 1,
+  rp2040_gpio_set_function(CONFIG_RP2040_I2C0_SCL_GPIO,
                            RP2040_GPIO_FUNC_I2C);       /* SCL */
 
-  rp2040_gpio_set_pulls(CONFIG_RP2040_I2C0_GPIO, true, false);  /* Pull up */
-  rp2040_gpio_set_pulls(CONFIG_RP2040_I2C0_GPIO + 1, true, false);
+  rp2040_gpio_set_pulls(CONFIG_RP2040_I2C0_SDA_GPIO, true, false);  /* Pull up */
+  rp2040_gpio_set_pulls(CONFIG_RP2040_I2C0_SCL_GPIO, true, false);
 #endif
 
-#if defined(CONFIG_RP2040_I2C1) &&  CONFIG_RP2040_I2C1_GPIO >= 0
-  rp2040_gpio_set_function(CONFIG_RP2040_I2C1_GPIO,
+#ifdef CONFIG_RP2040_I2C1
+  rp2040_gpio_set_function(CONFIG_RP2040_I2C1_SDA_GPIO,
                            RP2040_GPIO_FUNC_I2C);       /* SDA */
-  rp2040_gpio_set_function(CONFIG_RP2040_I2C1_GPIO + 1,
+  rp2040_gpio_set_function(CONFIG_RP2040_I2C1_SCL_GPIO,
                            RP2040_GPIO_FUNC_I2C);       /* SCL */
 
-  rp2040_gpio_set_pulls(CONFIG_RP2040_I2C1_GPIO, true, false);  /* Pull up */
-  rp2040_gpio_set_pulls(CONFIG_RP2040_I2C1_GPIO + 1, true, false);
+  rp2040_gpio_set_pulls(CONFIG_RP2040_I2C1_SDA_GPIO, true, false);  /* Pull up */
+  rp2040_gpio_set_pulls(CONFIG_RP2040_I2C1_SCL_GPIO, true, false);
 #endif
 
   /* Set default SPI pin */
 
-#if defined(CONFIG_RP2040_SPI0) && CONFIG_RP2040_SPI0_GPIO >= 0
-  rp2040_gpio_set_function(CONFIG_RP2040_SPI0_GPIO,
+#ifdef CONFIG_RP2040_SPI0
+  rp2040_gpio_set_function(CONFIG_RP2040_SPI0_RX_GPIO,
                            RP2040_GPIO_FUNC_SPI);       /* RX */
-  rp2040_gpio_set_function(CONFIG_RP2040_SPI0_GPIO + 2,
+  rp2040_gpio_set_function(CONFIG_RP2040_SPI0_SCK_GPIO,
                            RP2040_GPIO_FUNC_SPI);       /* SCK */
-  rp2040_gpio_set_function(CONFIG_RP2040_SPI0_GPIO + 3,
+  rp2040_gpio_set_function(CONFIG_RP2040_SPI0_TX_GPIO,
                            RP2040_GPIO_FUNC_SPI);       /* TX */
 
   /* CSn is controlled by board-specific logic */
 
-  rp2040_gpio_init(CONFIG_RP2040_SPI0_GPIO + 1);        /* CSn */
-  rp2040_gpio_setdir(CONFIG_RP2040_SPI0_GPIO + 1, true);
-  rp2040_gpio_put(CONFIG_RP2040_SPI0_GPIO + 1, true);
+  rp2040_gpio_init(CONFIG_RP2040_SPI0_CS_GPIO);        /* CSn */
+  rp2040_gpio_setdir(CONFIG_RP2040_SPI0_CS_GPIO, true);
+  rp2040_gpio_put(CONFIG_RP2040_SPI0_CS_GPIO, true);
 #endif
 
-#if defined(CONFIG_RP2040_SPI1) &&  CONFIG_RP2040_SPI1_GPIO >= 0
-  rp2040_gpio_set_function(CONFIG_RP2040_SPI1_GPIO,
+#ifdef CONFIG_RP2040_SPI1
+  rp2040_gpio_set_function(CONFIG_RP2040_SPI1_RX_GPIO,
                            RP2040_GPIO_FUNC_SPI);       /* RX */
-  rp2040_gpio_set_function(CONFIG_RP2040_SPI1_GPIO + 2,
+  rp2040_gpio_set_function(CONFIG_RP2040_SPI1_SCK_GPIO,
                            RP2040_GPIO_FUNC_SPI);       /* SCK */
-  rp2040_gpio_set_function(CONFIG_RP2040_SPI1_GPIO + 3,
+  rp2040_gpio_set_function(CONFIG_RP2040_SPI1_TX_GPIO,
                            RP2040_GPIO_FUNC_SPI);       /* TX */
 
   /* CSn is controlled by board-specific logic */
 
-  rp2040_gpio_init(CONFIG_RP2040_SPI1_GPIO + 1);        /* CSn */
-  rp2040_gpio_setdir(CONFIG_RP2040_SPI1_GPIO + 1, true);
-  rp2040_gpio_put(CONFIG_RP2040_SPI1_GPIO + 1, true);
+  rp2040_gpio_init(CONFIG_RP2040_SPI1_CS_GPIO);        /* CSn */
+  rp2040_gpio_setdir(CONFIG_RP2040_SPI1_CS_GPIO, true);
+  rp2040_gpio_put(CONFIG_RP2040_SPI1_CS_GPIO, true);
 #endif
 }
diff --git a/boards/arm/rp2040/adafruit-feather-rp2040/src/rp2040_bringup.c b/boards/arm/rp2040/adafruit-qt-py-rp2040/src/rp2040_bringup.c
similarity index 99%
copy from boards/arm/rp2040/adafruit-feather-rp2040/src/rp2040_bringup.c
copy to boards/arm/rp2040/adafruit-qt-py-rp2040/src/rp2040_bringup.c
index c0637c8131..3814acd727 100644
--- a/boards/arm/rp2040/adafruit-feather-rp2040/src/rp2040_bringup.c
+++ b/boards/arm/rp2040/adafruit-qt-py-rp2040/src/rp2040_bringup.c
@@ -1,5 +1,5 @@
 /****************************************************************************
- * boards/arm/rp2040/adafruit-feather-rp2040/src/rp2040_bringup.c
+ * boards/arm/rp2040/adafruit-qt-py-rp2040/src/rp2040_bringup.c
  *
  * Licensed to the Apache Software Foundation (ASF) under one or more
  * contributor license agreements.  See the NOTICE file distributed with
@@ -462,6 +462,7 @@ int rp2040_bringup(void)
 #if defined(CONFIG_RP2040_BOARD_HAS_WS2812) && defined(CONFIG_WS2812)
   rp2040_ws2812_setup("/dev/leds0",
                       CONFIG_RP2040_WS2812_GPIO_PIN,
+                      CONFIG_RP2040_WS2812_PWR_GPIO,
                       CONFIG_WS2812_LED_COUNT,
                       HAS_WHITE);
 #endif
diff --git a/boards/arm/rp2040/adafruit-qt-py-rp2040/src/rp2040_gpio.c b/boards/arm/rp2040/adafruit-qt-py-rp2040/src/rp2040_gpio.c
new file mode 100644
index 0000000000..de580fb8d2
--- /dev/null
+++ b/boards/arm/rp2040/adafruit-qt-py-rp2040/src/rp2040_gpio.c
@@ -0,0 +1,392 @@
+/****************************************************************************
+ * boards/arm/rp2040/adafruit-qt-py-rp2040/src/rp2040_gpio.c
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.  The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+
+#include <sys/types.h>
+#include <syslog.h>
+#include <nuttx/irq.h>
+#include <arch/irq.h>
+#include <assert.h>
+#include <debug.h>
+
+#include <nuttx/ioexpander/gpio.h>
+
+#include <arch/board/board.h>
+
+#include "arm_internal.h"
+#include "chip.h"
+#include "rp2040_gpio.h"
+
+#if defined(CONFIG_DEV_GPIO) && !defined(CONFIG_GPIO_LOWER_HALF)
+
+/* Output pins. GPIO25 is onboard LED any other outputs could be used.
+ */
+
+#define GPIO_OUT1     25
+
+/* Input pins.
+ */
+
+#define GPIO_IN1      6
+
+/* Interrupt pins.
+ */
+
+#define GPIO_IRQPIN1  11
+
+/****************************************************************************
+ * Private Types
+ ****************************************************************************/
+
+struct rp2040gpio_dev_s
+{
+  struct gpio_dev_s gpio;
+  uint8_t id;
+};
+
+struct rp2040gpint_dev_s
+{
+  struct rp2040gpio_dev_s rp2040gpio;
+  pin_interrupt_t callback;
+};
+
+/****************************************************************************
+ * Private Function Prototypes
+ ****************************************************************************/
+
+#if BOARD_NGPIOOUT > 0
+static int gpout_read(struct gpio_dev_s *dev, bool *value);
+static int gpout_write(struct gpio_dev_s *dev, bool value);
+#endif
+
+#if BOARD_NGPIOIN > 0
+static int gpin_read(struct gpio_dev_s *dev, bool *value);
+#endif
+
+#if BOARD_NGPIOINT > 0
+static int gpint_read(struct gpio_dev_s *dev, bool *value);
+static int gpint_attach(struct gpio_dev_s *dev,
+                        pin_interrupt_t callback);
+static int gpint_enable(struct gpio_dev_s *dev, bool enable);
+#endif
+
+/****************************************************************************
+ * Private Data
+ ****************************************************************************/
+
+#if BOARD_NGPIOOUT > 0
+static const struct gpio_operations_s gpout_ops =
+{
+  .go_read   = gpout_read,
+  .go_write  = gpout_write,
+  .go_attach = NULL,
+  .go_enable = NULL,
+};
+
+/* This array maps the GPIO pins used as OUTPUT */
+
+static const uint32_t g_gpiooutputs[BOARD_NGPIOOUT] =
+{
+  GPIO_OUT1
+};
+
+static struct rp2040gpio_dev_s g_gpout[BOARD_NGPIOOUT];
+#endif
+
+#if BOARD_NGPIOIN > 0
+static const struct gpio_operations_s gpin_ops =
+{
+  .go_read   = gpin_read,
+  .go_write  = NULL,
+  .go_attach = NULL,
+  .go_enable = NULL,
+};
+
+/* This array maps the GPIO pins used as INTERRUPT INPUTS */
+
+static const uint32_t g_gpioinputs[BOARD_NGPIOIN] =
+{
+  GPIO_IN1
+};
+
+static struct rp2040gpio_dev_s g_gpin[BOARD_NGPIOIN];
+#endif
+
+#if BOARD_NGPIOINT > 0
+static const struct gpio_operations_s gpint_ops =
+{
+  .go_read   = gpint_read,
+  .go_write  = NULL,
+  .go_attach = gpint_attach,
+  .go_enable = gpint_enable,
+};
+
+/* This array maps the GPIO pins used as INTERRUPT INPUTS */
+
+static const uint32_t g_gpiointinputs[BOARD_NGPIOINT] =
+{
+  GPIO_IRQPIN1,
+};
+
+static struct rp2040gpint_dev_s g_gpint[BOARD_NGPIOINT];
+#endif
+
+/****************************************************************************
+ * Private Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: gpout_read
+ ****************************************************************************/
+
+#if BOARD_NGPIOOUT > 0
+static int gpout_read(struct gpio_dev_s *dev, bool *value)
+{
+  struct rp2040gpio_dev_s *rp2040gpio =
+    (struct rp2040gpio_dev_s *)dev;
+
+  DEBUGASSERT(rp2040gpio != NULL && value != NULL);
+  DEBUGASSERT(rp2040gpio->id < BOARD_NGPIOOUT);
+  gpioinfo("Reading...\n");
+
+  *value = rp2040_gpio_get(g_gpiooutputs[rp2040gpio->id]);
+  return OK;
+}
+
+/****************************************************************************
+ * Name: gpout_write
+ ****************************************************************************/
+
+static int gpout_write(struct gpio_dev_s *dev, bool value)
+{
+  struct rp2040gpio_dev_s *rp2040gpio =
+    (struct rp2040gpio_dev_s *)dev;
+
+  DEBUGASSERT(rp2040gpio != NULL);
+  DEBUGASSERT(rp2040gpio->id < BOARD_NGPIOOUT);
+  gpioinfo("Writing %d\n", (int)value);
+
+  rp2040_gpio_put(g_gpiooutputs[rp2040gpio->id], value);
+  return OK;
+}
+#endif
+
+/****************************************************************************
+ * Name: gpin_read
+ ****************************************************************************/
+
+#if BOARD_NGPIOIN > 0
+static int gpin_read(struct gpio_dev_s *dev, bool *value)
+{
+  struct rp2040gpio_dev_s *rp2040gpio =
+    (struct rp2040gpio_dev_s *)dev;
+
+  DEBUGASSERT(rp2040gpio != NULL && value != NULL);
+  DEBUGASSERT(rp2040gpio->id < BOARD_NGPIOIN);
+  gpioinfo("Reading... pin %d\n", (int)g_gpioinputs[rp2040gpio->id]);
+
+  *value = rp2040_gpio_get(g_gpioinputs[rp2040gpio->id]);
+  return OK;
+}
+#endif
+
+/****************************************************************************
+ * Name: rp2040gpio_interrupt
+ ****************************************************************************/
+
+#if BOARD_NGPIOINT > 0
+static int rp2040gpio_interrupt(int irq, void *context, void *arg)
+{
+  struct rp2040gpint_dev_s *rp2040gpint =
+    (struct rp2040gpint_dev_s *)arg;
+
+  DEBUGASSERT(rp2040gpint != NULL && rp2040gpint->callback != NULL);
+  gpioinfo("Interrupt! callback=%p\n", rp2040gpint->callback);
+
+  rp2040gpint->callback(&rp2040gpint->rp2040gpio.gpio,
+                       rp2040gpint->rp2040gpio.id);
+  return OK;
+}
+
+/****************************************************************************
+ * Name: gpint_read
+ ****************************************************************************/
+
+static int gpint_read(struct gpio_dev_s *dev, bool *value)
+{
+  struct rp2040gpint_dev_s *rp2040gpint =
+    (struct rp2040gpint_dev_s *)dev;
+
+  DEBUGASSERT(rp2040gpint != NULL && value != NULL);
+  DEBUGASSERT(rp2040gpint->rp2040gpio.id < BOARD_NGPIOINT);
+  gpioinfo("Reading int pin...\n");
+
+  *value = rp2040_gpio_get(g_gpiointinputs[rp2040gpint->rp2040gpio.id]);
+  return OK;
+}
+
+/****************************************************************************
+ * Name: gpint_attach
+ ****************************************************************************/
+
+static int gpint_attach(struct gpio_dev_s *dev,
+                        pin_interrupt_t callback)
+{
+  struct rp2040gpint_dev_s *rp2040gpint =
+    (struct rp2040gpint_dev_s *)dev;
+  int irq = g_gpiointinputs[rp2040gpint->rp2040gpio.id];
+  int ret;
+
+  gpioinfo("Attaching the callback\n");
+
+  /* Make sure the interrupt is disabled */
+
+  rp2040_gpio_disable_irq(irq);
+  ret = rp2040_gpio_irq_attach(irq,
+                               RP2040_GPIO_INTR_EDGE_LOW,
+                               rp2040gpio_interrupt,
+                               &g_gpint[rp2040gpint->rp2040gpio.id]);
+  if (ret < 0)
+    {
+      syslog(LOG_ERR, "ERROR: gpint_attach() failed: %d\n", ret);
+      return ret;
+    }
+
+  gpioinfo("Attach %p\n", callback);
+  rp2040gpint->callback = callback;
+  return OK;
+}
+
+/****************************************************************************
+ * Name: gpint_enable
+ ****************************************************************************/
+
+static int gpint_enable(struct gpio_dev_s *dev, bool enable)
+{
+  struct rp2040gpint_dev_s *rp2040gpint =
+    (struct rp2040gpint_dev_s *)dev;
+  int irq = g_gpiointinputs[rp2040gpint->rp2040gpio.id];
+
+  if (enable)
+    {
+      if (rp2040gpint->callback != NULL)
+        {
+          gpioinfo("Enabling the interrupt\n");
+
+          /* Configure the interrupt for rising edge */
+
+          rp2040_gpio_enable_irq(irq);
+        }
+    }
+  else
+    {
+      gpioinfo("Disable the interrupt\n");
+      rp2040_gpio_disable_irq(irq);
+    }
+
+  return OK;
+}
+#endif
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: rp2040_dev_gpio_init
+ ****************************************************************************/
+
+int rp2040_dev_gpio_init(void)
+{
+  int i;
+  int pincount = 0;
+
+#if BOARD_NGPIOOUT > 0
+  for (i = 0; i < BOARD_NGPIOOUT; i++)
+    {
+      /* Setup and register the GPIO pin */
+
+      g_gpout[i].gpio.gp_pintype = GPIO_OUTPUT_PIN;
+      g_gpout[i].gpio.gp_ops     = &gpout_ops;
+      g_gpout[i].id              = i;
+      gpio_pin_register(&g_gpout[i].gpio, g_gpiooutputs[i]);
+
+      /* Configure the pins that will be used as output */
+
+      rp2040_gpio_init(g_gpiooutputs[i]);
+      rp2040_gpio_setdir(g_gpiooutputs[i], true);
+      rp2040_gpio_put(g_gpiooutputs[i], false);
+
+      pincount++;
+    }
+#endif
+
+  pincount = 0;
+
+#if BOARD_NGPIOIN > 0
+  for (i = 0; i < BOARD_NGPIOIN; i++)
+    {
+      /* Setup and register the GPIO pin */
+
+      g_gpin[i].gpio.gp_pintype = GPIO_INPUT_PIN;
+      g_gpin[i].gpio.gp_ops     = &gpin_ops;
+      g_gpin[i].id              = i;
+      gpio_pin_register(&g_gpin[i].gpio, g_gpioinputs[i]);
+
+      /* Configure the pins that will be used as INPUT */
+
+      rp2040_gpio_init(g_gpioinputs[i]);
+
+      pincount++;
+    }
+#endif
+
+  pincount = 0;
+
+#if BOARD_NGPIOINT > 0
+  for (i = 0; i < BOARD_NGPIOINT; i++)
+    {
+      /* Setup and register the GPIO pin */
+
+      g_gpint[i].rp2040gpio.gpio.gp_pintype = GPIO_INTERRUPT_PIN;
+      g_gpint[i].rp2040gpio.gpio.gp_ops     = &gpint_ops;
+      g_gpint[i].rp2040gpio.id              = i;
+      gpio_pin_register(&g_gpint[i].rp2040gpio.gpio, g_gpiointinputs[i]);
+
+      /* Configure the pins that will be used as interrupt input */
+
+      rp2040_gpio_init(g_gpiointinputs[i]);
+
+      /* pull-up = false : pull-down = true */
+
+      rp2040_gpio_set_pulls(g_gpiointinputs[i], false, true);
+
+      pincount++;
+    }
+#endif
+
+  return OK;
+}
+#endif /* CONFIG_DEV_GPIO && !CONFIG_GPIO_LOWER_HALF */
diff --git a/boards/arm/rp2040/adafruit-qt-py-rp2040/src/rp2040_pico.h b/boards/arm/rp2040/adafruit-qt-py-rp2040/src/rp2040_pico.h
new file mode 100644
index 0000000000..84d4a2d4e5
--- /dev/null
+++ b/boards/arm/rp2040/adafruit-qt-py-rp2040/src/rp2040_pico.h
@@ -0,0 +1,36 @@
+/****************************************************************************
+ * boards/arm/rp2040/adafruit-qt-py-rp2040/src/rp2040_pico.h
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.  The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+#ifndef __BOARDS_ARM_RP2040_ADAFRUIT_KB2040_SRC_RP2040_PICO_H
+#define __BOARDS_ARM_RP2040_ADAFRUIT_KB2040_SRC_RP2040_PICO_H
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+
+int rp2040_bringup(void);
+
+#ifdef CONFIG_DEV_GPIO
+int rp2040_dev_gpio_init(void);
+#endif
+
+#endif /* __BOARDS_ARM_RP2040_ADAFRUIT_KB2040_SRC_RP2040_PICO_H */
diff --git a/boards/arm/rp2040/adafruit-qt-py-rp2040/src/rp2040_reset.c b/boards/arm/rp2040/adafruit-qt-py-rp2040/src/rp2040_reset.c
new file mode 100644
index 0000000000..5276cddc84
--- /dev/null
+++ b/boards/arm/rp2040/adafruit-qt-py-rp2040/src/rp2040_reset.c
@@ -0,0 +1,61 @@
+/****************************************************************************
+ * boards/arm/rp2040/adafruit-qt-py-rp2040/src/rp2040_reset.c
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.  The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+#include <nuttx/board.h>
+#include <nuttx/arch.h>
+
+#ifdef CONFIG_BOARDCTL_RESET
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: board_reset
+ *
+ * Description:
+ *   Reset board.  Support for this function is required by board-level
+ *   logic if CONFIG_BOARDCTL_RESET is selected.
+ *
+ * Input Parameters:
+ *   status - Status information provided with the reset event.  This
+ *            meaning of this status information is board-specific.  If not
+ *            used by a board, the value zero may be provided in calls to
+ *            board_reset().
+ *
+ * Returned Value:
+ *   If this function returns, then it was not possible to power-off the
+ *   board due to some constraints.  The return value int this case is a
+ *   board-specific reason for the failure to shutdown.
+ *
+ ****************************************************************************/
+
+int board_reset(int status)
+{
+  up_systemreset();
+  return 0;
+}
+
+#endif /* CONFIG_BOARDCTL_RESET */
diff --git a/boards/arm/rp2040/adafruit-feather-rp2040/src/rp2040_spi.c b/boards/arm/rp2040/adafruit-qt-py-rp2040/src/rp2040_spi.c
similarity index 94%
copy from boards/arm/rp2040/adafruit-feather-rp2040/src/rp2040_spi.c
copy to boards/arm/rp2040/adafruit-qt-py-rp2040/src/rp2040_spi.c
index f6b23acbcd..14ce78cc43 100644
--- a/boards/arm/rp2040/adafruit-feather-rp2040/src/rp2040_spi.c
+++ b/boards/arm/rp2040/adafruit-qt-py-rp2040/src/rp2040_spi.c
@@ -1,5 +1,5 @@
 /****************************************************************************
- * boards/arm/rp2040/adafruit-feather-rp2040/src/rp2040_spi.c
+ * boards/arm/rp2040/adafruit-qt-py-rp2040/src/rp2040_spi.c
  *
  * Licensed to the Apache Software Foundation (ASF) under one or more
  * contributor license agreements.  See the NOTICE file distributed with
@@ -74,7 +74,7 @@ void rp2040_spi0select(struct spi_dev_s *dev, uint32_t devid,
   spiinfo("devid: %d CS: %s\n", (int)devid,
           selected ? "assert" : "de-assert");
 
-  rp2040_gpio_put(CONFIG_RP2040_SPI0_GPIO + 1, !selected);
+  rp2040_gpio_put(CONFIG_RP2040_SPI0_CS_GPIO, !selected);
 }
 
 uint8_t rp2040_spi0status(struct spi_dev_s *dev, uint32_t devid)
@@ -97,7 +97,7 @@ int rp2040_spi0cmddata(struct spi_dev_s *dev, uint32_t devid, bool cmd)
        *  data bits are data or a command.
        */
 
-      rp2040_gpio_put(CONFIG_RP2040_SPI0_GPIO, !cmd);
+      rp2040_gpio_put(CONFIG_RP2040_SPI0_RX_GPIO, !cmd);
 
       return OK;
     }
@@ -115,7 +115,7 @@ void rp2040_spi1select(struct spi_dev_s *dev, uint32_t devid,
   spiinfo("devid: %d CS: %s\n", (int)devid,
           selected ? "assert" : "de-assert");
 
-  rp2040_gpio_put(CONFIG_RP2040_SPI1_GPIO + 1, !selected);
+  rp2040_gpio_put(CONFIG_RP2040_SPI1_CS_GPIO, !selected);
 }
 
 uint8_t rp2040_spi1status(struct spi_dev_s *dev, uint32_t devid)
@@ -138,7 +138,7 @@ int rp2040_spi1cmddata(struct spi_dev_s *dev, uint32_t devid, bool cmd)
        *  data bits are data or a command.
        */
 
-      rp2040_gpio_put(CONFIG_RP2040_SPI1_GPIO, !cmd);
+      rp2040_gpio_put(CONFIG_RP2040_SPI1_RX_GPIO, !cmd);
 
       return OK;
     }
diff --git a/boards/arm/rp2040/common/Kconfig b/boards/arm/rp2040/common/Kconfig
index 266bebabdd..0c95ae9b8f 100644
--- a/boards/arm/rp2040/common/Kconfig
+++ b/boards/arm/rp2040/common/Kconfig
@@ -3,52 +3,501 @@
 # see the file kconfig-language.txt in the NuttX tools repository.
 #
 
-if ARCH_BOARD_RASPBERRYPI_PICO
+#####################################################################
+#  UART Configuration
+#####################################################################
 
-config RP2040_ADC
-	bool "Enable ADC Support"
-	default n
-	---help---
-		If y, the RP2040 ADC code will be built.  For ADC device driver 
-		support you must also select "Analog-to-Digital Conversion"
-		under the "Device Driver/Analog Device Support" menu.
+if RP2040_UART0
 
-		If the ADC device driver is not built, basic functions
-		to programatically access the ADC ports will be added.
+  config RP2040_UART0_TX_GPIO
+   int "GPIO pin for UART0 TX (0, 12, 16, or 28)"
+    default 0
+    range 0 28
+    ---help---
+      RP2040 UART0 TX pin number used for data transmitted
+      from the RP2040. Refer to board documentation to see
+      which pins are available.
 
-if RP2040_ADC && ADC
+  config RP2040_UART0_RX_GPIO
+   int "GPIO pin for UART0 RX (1, 13, 17, or 29)"
+    default 1
+    range 1 29
+    ---help---
+      RP2040 UART0 RX pin number used for data received by the
+      RP2040.  Refer to board documentation to see which pins
+      are available.
 
-	config RPC2040_ADC_CHANNEL0
-		bool "Read ADC channel 0"
-		default n
-		---help---
-			If y, then ADC0 will be read.
+  if SERIAL_IFLOWCONTROL
 
-	config RPC2040_ADC_CHANNEL1
-		bool "Read ADC channel 1"
-		default n
-		---help---
-			If y, then ADC1 will be read.
+  config RP2040_UART0_CTS_GPIO
+   int "GPIO pin for UART0 CTS (2, 14, or 18)"
+    default 2
+    range 2 18
+    ---help---
+      RP2040 UART0 CTS pin number an output pin that reflects the
+      UARTs ability to receive data.  This pin will be asserted when
+      the UART is able to receive another character. Refer to board
+      documentation to see which pins are available.
 
-	config RPC2040_ADC_CHANNEL2
-		bool "Read ADC channel 2"
-		default n
-		---help---
-			If y, then ADC2 will be read.
+  endif # SERIAL_IFLOWCONTROL
+
+  if SERIAL_OFLOWCONTROL
+
+    config RP2040_UART0_RTS_GPIO
+   int "GPIO pin for UART0 RTS (3, 15, or 19)"
+      default 3
+      range 2 19
+      ---help---
+        RP2040 UART0 RTS pin number an input pin used to control
+        transmission by the UART.  If output flow control is
+        enabled this pin must be asserted before data will be
+        transmitted.  Refer to board documentation to see which
+        pins are available.
+
+  endif # SERIAL_OFLOWCONTROL
+
+endif # RP2040_UART0
+
+#####################################################################
+
+if RP2040_UART1
+
+  config RP2040_UART1_TX_GPIO
+   int "GPIO pin for UART1 TX (4, 8, 20, or 24)"
+    default 20
+    range 4 24
+    ---help---
+      RP2040 UART1 TX pin number.  Refer to board documentation
+      to see which pins are available.
+
+  config RP2040_UART1_RX_GPIO
+   int "GPIO pin for UART1 RX (5, 9, 21, or 25)"
+    default 21
+    range 5 25
+    ---help---
+      RP2040 UART1 RX pin number.  Refer to board documentation
+      to see which pins are available.
+
+  if SERIAL_IFLOWCONTROL
+
+    config RP2040_UART1_CTS_GPIO
+   int "GPIO pin for UART1 CTS (6, 10, 22, or 26)"
+      default 22
+      range 6 26
+      ---help---
+        RP2040 UART1 CTS pin number an output pin that reflects the
+        UARTs ability to receive data.  This pin will be asserted when
+        the UART is able to receive another character.  Refer to board
+        documentation to see which pins are available.
+
+  endif # SERIAL_IFLOWCONTROL
+
+  if SERIAL_OFLOWCONTROL
+
+    config RP2040_UART1_RTS_GPIO
+   int "GPIO pin for UART1 RTS (7, 11, 23, or 27)"
+      default 23
+      range 7 27
+      ---help---
+        RP2040 UART01 RTS pin number an input pin used to control
+        transmission by the UART.  If output flow control is
+        enabled this pin must be asserted before data will be
+        transmitted.  Refer to board documentation to see which
+        pins are available.
+
+  endif # SERIAL_OFLOWCONTROL
+
+endif # RP2040_UART1
+
+#####################################################################
+#  SPI Configuration
+#####################################################################
+
+if RP2040_SPI0
+
+  config RP2040_SPI0_RX_GPIO
+   int "GPIO pin for SPI0 RX (0, 4, 16, or 20)"
+    default 16
+    range 0 20
+    ---help---
+      Refer to board documentation to see which pins are available.
+      This line is also known as MISO when we are configured in
+      SPI master mode.
+
+  config RP2040_SPI0_CS_GPIO
+   int "GPIO pin for SPI0 CSn (1, 5, 17, or 21)"
+    default 17
+    range 1 21
+    ---help---
+      Refer to board documentation to see which pins are available.
+
+
+  config RP2040_SPI0_SCK_GPIO
+   int "GPIO pin for SPI0 SCK (2, 6, 18, or 22)"
+    default 18
+    range 2 22
+    ---help---
+      Refer to board documentation to see which pins are available.
+
+  config RP2040_SPI0_TX_GPIO
+   int "GPIO pin for SPI0 TX (3, 7, 19, or 23)"
+    default 19
+    range 3 23
+    ---help---
+      Refer to board documentation to see which pins are available.
+      This line is also known as MOSI when we are configured in
+      SPI master mode.
+
+endif # RP2040_SPI0
+
+#####################################################################
+
+if RP2040_SPI1
+
+  config RP2040_SPI1_RX_GPIO
+   int "GPIO pin for SPI1 RX (8, 12, 24, or 28)"
+    default 8
+    range 8 28
+    ---help---
+      Refer to board documentation to see which pins are available.
+      This line is also known as MISO when we are configured in
+      SPI master mode, or MOSI when slave mode is configured.
+
+  config RP2040_SPI1_CS_GPIO
+   int "GPIO pin for SPI1 CSn (9, 13, 25, or 29)"
+    default 9
+    range 9 29
+    ---help---
+      Refer to board documentation to see which pins are available.
+
+  config RP2040_SPI1_SCK_GPIO
+   int "GPIO pin for SPI1 SCK (10, 14, or 26)"
+    default 10
+    range 10 26
+    ---help---
+      Refer to board documentation to see which pins are available.
+
+  config RP2040_SPI1_TX_GPIO
+   int "GPIO pin for SPI1 TX (11, 15, or 27)"
+    default 11
+    range 11 27
+    ---help---
+      Refer to board documentation to see which pins are available.
+      This line is also known as MOSI when we are configured in
+      SPI master mode, or MISO when slave mode is configured.
+
+endif # RP2040_SPI1
+
+#####################################################################
+#  I2C Configuration
+#####################################################################
+
+if RP2040_I2C0 || RP2040_I2C0_SLAVE
+
+  config RP2040_I2C0_SDA_GPIO
+   int "GPIO pin for I2C0 SDA (0, 4, 8, 12, 16, 20, 24, or 28)"
+    default 4
+    range 0 28
+    ---help---
+      Refer to board documentation to see which pins are available.
+
+  config RP2040_I2C0_SCL_GPIO
+   int "GPIO pin for I2C0 SCL (1, 5, 9, 13, 17, 21, 25, or 29)"
+    default 5
+    range 1 29
+    ---help---
+      Refer to board documentation to see which pins are available.
+
+endif # RP2040_I2C0 || RP2040_I2C0_SLAVE
+
+#####################################################################
+
+if RP2040_I2C1 || RP2040_I2C0_SLAVE
+
+  config RP2040_I2C1_SDA_GPIO
+   int "GPIO pin for I2C1 SDA (2, 6, 10, 14, 18, 22, or 26)"
+    default 6
+    range 2 26
+    ---help---
+      Refer to board documentation to see which pins are available.
+
+  config RP2040_I2C1_SCL_GPIO
+   int "GPIO pin for I2C1 SCL (3, 7, 11, 15, 19, 23, or 27)"
+    default 7
+    range 3 27
+    ---help---
+      Refer to board documentation to see which pins are available.
+
+endif # RP2040_I2C1 || RP2040_I2C0_SLAVE
+
+#####################################################################
+#  PWM Configuration
+#####################################################################
+
+if RP2040_PWM0
+
+  config RP2040_PWM0A_GPIO
+    int "GPIO pin for PWM0 channel 1 (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.
+      Refer to board documentation to see which pins are available.
+
+  if PWM_MULTICHAN && PWM_NCHANNELS > 1
+
+    config RP2040_PWM0B_GPIO
+      int "GPIO pin for PWM0 channel 2 (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.
+        Refer to board documentation to see which pins are available.
+
+  endif # PWM_MULTICHAN && PWM_NCHANNELS > 1
+
+endif # RP2040_PWM0
+
+#####################################################################
+
+if RP2040_PWM1
+
+  config RP2040_PWM1A_GPIO
+    int "GPIO pin for PWM1 channel 1 (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.
+      Refer to board documentation to see which pins are available.
+
+  if PWM_MULTICHAN && PWM_NCHANNELS > 1
+
+    config RP2040_PWM1B_GPIO
+      int "GPIO pin for PWM1 channel 2 (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.
+        Refer to board documentation to see which pins are available.
+
+  endif # PWM_MULTICHAN && PWM_NCHANNELS > 1
+
+endif # RP2040_PWM1
+
+#####################################################################
+
+if RP2040_PWM2
+
+  config RP2040_PWM2A_GPIO
+    int "GPIO pin for PWM2 channel 1 (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.
+      Refer to board documentation to see which pins are available.
+
+  if PWM_MULTICHAN && PWM_NCHANNELS > 1
+
+    config RP2040_PWM2B_GPIO
+      int "GPIO pin for PWM2 channel 2 (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.
+        Refer to board documentation to see which pins are available.
+
+  endif # PWM_MULTICHAN && PWM_NCHANNELS > 1
+
+endif # RP2040_PWM2
+
+#####################################################################
+
+if RP2040_PWM3
+
+  config RP2040_PWM3A_GPIO
+
+    int "GPIO pin for PWM3 channel 1 (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.
+      Refer to board documentation to see which pins are available.
+
+  if PWM_MULTICHAN && PWM_NCHANNELS > 1
+
+    config RP2040_PWM3B_GPIO
+      int "GPIO pin for PWM3 channel 2 (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.
+        Refer to board documentation to see which pins are available.
+
+  endif # PWM_MULTICHAN && PWM_NCHANNELS > 1
+
+endif # RP2040_PWM3
+
+#####################################################################
+
+if RP2040_PWM4
+
+  config RP2040_PWM4A_GPIO
+    int "GPIO pin for PWM4 channel 1 (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.
+      Refer to board documentation to see which pins are available.
+
+  if PWM_MULTICHAN && PWM_NCHANNELS > 1
+
+    config RP2040_PWM4B_GPIO
+      int "GPIO pin for PWM4 channel 2 (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.
+        Refer to board documentation to see which pins are available.
+
+  endif # PWM_MULTICHAN && PWM_NCHANNELS > 1
+
+endif # RP2040_PWM4
+
+#####################################################################
+
+if RP2040_PWM5
+
+  config RP2040_PWM5A_GPIO
+    int "GPIO pin for PWM5 channel 1 (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.
+      Refer to board documentation to see which pins are available.
+
+  if PWM_MULTICHAN && PWM_NCHANNELS > 1
+
+    config RP2040_PWM5B_GPIO
+      int "GPIO pin for PWM5 channel 2 (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.
+        Refer to board documentation to see which pins are available.
+
+  endif # PWM_MULTICHAN && PWM_NCHANNELS > 1
+
+endif # RP2040_PWM5
+
+#####################################################################
+
+if RP2040_PWM6
+
+  config RP2040_PWM6A_GPIO
+    int "GPIO pin for PWM6 channel 1 (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.
+      Refer to board documentation to see which pins are available.
+
+  if PWM_MULTICHAN && PWM_NCHANNELS > 1
+
+    config RP2040_PWM6B_GPIO
+      int "GPIO pin for PWM6 channel 2 (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.
+        Refer to board documentation to see which pins are available.
+
+  endif # PWM_MULTICHAN && PWM_NCHANNELS > 1
+
+endif # RP2040_PWM6
+
+#####################################################################
+
+if RP2040_PWM7
+
+  config RP2040_PWM7A_GPIO
+    int "GPIO pin for PWM7 channel 1 (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.
+      Refer to board documentation to see if pin 14 is available.
+
+  if PWM_MULTICHAN && PWM_NCHANNELS > 1
+
+    config RP2040_PWM7B_GPIO
+      int "GPIO pin for PWM7 channel 2 (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.
+        Refer to board documentation to see if pin 15 is available.
+
+  endif # PWM_MULTICHAN && PWM_NCHANNELS > 1
+
+endif # RP2040_PWM7
+		
+#####################################################################
+#  I2S Configuration
+#####################################################################
+
+if RP2040_I2S
+
+  config RP2040_I2S_DATA
+    int "GPIO pin for I2S DATA (0-29)"
+    default 9
+    range 0 29
+
+  config RP2040_I2S_CLOCK
+    int "GPIO pin for I2S CLOCK (0-29)"
+    default 10
+    range 0 29
+
+endif # RP2040_I2S
+
+		
+#####################################################################
+#  WS2812 Configuration
+#####################################################################
+
+if RP2040_BOARD_HAS_WS2812
 
-		config RPC2040_ADC_CHANNEL3
-		bool "Read ADC channel 3"
-		default n
+	config RP2040_WS2812_GPIO_PIN
+		int "GPIO pin for ws2812 data line (0-29)"
+		default 0
+		range 0 29
 		---help---
-			If y, then ADC3 will be read.
+			This is the GPIO pin used to send data to the
+			configured ws2812 pixels.
 
-		config RPC2040_ADC_TEMPERATURE
-		bool "Read ADC chip temperature channel"
-		default n
+	config RP2040_WS2812_PWR_GPIO
+		int "GPIO pin for ws2812 power (0-29, or -1 if not used)"
+		default -1
+		range -1 29
 		---help---
-			If y, then the ADC chip temperature
-			will be read.
-	
-	endif
+			Some RP2040 boards have an on-board ws2812
+			that is powered by a GPIO pin.  Set this
+			value to -1 if your board does not have
+			such a pin.
 
-endif
+endif # RP2040_BOARD_HAS_WS2812
diff --git a/boards/arm/rp2040/common/src/rp2040_spisd.c b/boards/arm/rp2040/common/src/rp2040_spisd.c
index 7980191975..9d56b668c4 100644
--- a/boards/arm/rp2040/common/src/rp2040_spisd.c
+++ b/boards/arm/rp2040/common/src/rp2040_spisd.c
@@ -73,14 +73,14 @@ int board_spisd_initialize(int minor, int bus)
 #ifdef CONFIG_RP2040_SPI0
   if (bus == 0)
     {
-      rp2040_gpio_set_pulls(CONFIG_RP2040_SPI0_GPIO, true, false);
+      rp2040_gpio_set_pulls(CONFIG_RP2040_SPI0_RX_GPIO, true, false);
     }
 #endif
 
 #ifdef CONFIG_RP2040_SPI1
   if (bus == 1)
     {
-      rp2040_gpio_set_pulls(CONFIG_RP2040_SPI1_GPIO, true, false);
+      rp2040_gpio_set_pulls(CONFIG_RP2040_SPI1_RX_GPIO, true, false);
     }
 #endif
 
diff --git a/boards/arm/rp2040/common/src/rp2040_st7735.c b/boards/arm/rp2040/common/src/rp2040_st7735.c
index 451370cfb2..770136c5d4 100644
--- a/boards/arm/rp2040/common/src/rp2040_st7735.c
+++ b/boards/arm/rp2040/common/src/rp2040_st7735.c
@@ -45,11 +45,11 @@
 #define LCD_SPI_PORTNO 1
 
 #if LCD_SPI_PORTNO
-#define LCD_DC         CONFIG_RP2040_SPI1_GPIO
+#define LCD_DC         CONFIG_RP2040_SPI1_RX_GPIO
 #define LCD_RST        10
 #define LCD_BL         11
 #else
-#define LCD_DC         CONFIG_RP2040_SPI0_GPIO
+#define LCD_DC         CONFIG_RP2040_SPI0_RX_GPIO
 #endif
 
 /****************************************************************************
diff --git a/boards/arm/rp2040/common/src/rp2040_st7789.c b/boards/arm/rp2040/common/src/rp2040_st7789.c
index 9c61df6cfe..832d5eb07b 100644
--- a/boards/arm/rp2040/common/src/rp2040_st7789.c
+++ b/boards/arm/rp2040/common/src/rp2040_st7789.c
@@ -45,11 +45,11 @@
 #define LCD_SPI_PORTNO CONFIG_RP2040_LCD_SPI_CH
 
 #if LCD_SPI_PORTNO
-#define LCD_DC         CONFIG_RP2040_SPI1_GPIO
+#define LCD_DC         CONFIG_RP2040_SPI1_RX_GPIO
 #define LCD_RST        12
 #define LCD_BL         13
 #else
-#define LCD_DC         CONFIG_RP2040_SPI0_GPIO
+#define LCD_DC         CONFIG_RP2040_SPI0_RX_GPIO
 #endif
 
 /****************************************************************************
diff --git a/boards/arm/rp2040/pimoroni-tiny2040/Kconfig b/boards/arm/rp2040/pimoroni-tiny2040/Kconfig
index a021973340..0af7a58fa7 100644
--- a/boards/arm/rp2040/pimoroni-tiny2040/Kconfig
+++ b/boards/arm/rp2040/pimoroni-tiny2040/Kconfig
@@ -13,11 +13,12 @@ config RP2040_FLASH_BOOT
 		If not, the binary is for SRAM boot.
 
 config RP2040_FLASH_CHIP
-	string "flash chip name"
+	string "Second stage boot loader"
 	default "w25q080"
 	---help---
-		Name of NOR flash device connected to RP2040 SoC.
-		(Used to choose the secondary boot loader.)
+		This is the name of the Pico-SDK second stage boot loader
+		to use for this board.  This board using a Q16 flash chip
+		which is compatible with the w25q080 boot loader.
 		Basically this option should not be changed.
 
 config RP2040_UF2_BINARY
@@ -26,306 +27,4 @@ config RP2040_UF2_BINARY
 	---help---
 		Create nuttx.uf2 binary format used on RP2040 based arch.
 
-config RP2040_UART0_GPIO
-	int "UART0 GPIO pin assign (0,12,16,28 or -1:no assign)"
-	default 0
-	range -1 29
-	depends on RP2040_UART0
-
-config RP2040_UART1_GPIO
-	int "UART1 GPIO pin assign (4,8,20,24 or -1:no assign)"
-	default -1
-	range -1 29
-	depends on RP2040_UART1
-
-config RP2040_I2C0_GPIO
-	int "I2C0 GPIO pin assign (0,4,8,12,16,20,24,28 or -1:no assign)"
-	default -1
-	range -1 29
-	depends on RP2040_I2C0
-
-config RP2040_I2C1_GPIO
-	int "I2C1 GPIO pin assign (2,6,10,14,18,22,26 or -1:no assign)"
-	default -1
-	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
-	range -1 29
-	depends on RP2040_SPI0
-
-config RP2040_SPI1_GPIO
-	int "SPI1 GPIO pin assign (8,12,24,28 or -1:no assign)"
-	default -1
-	range -1 29
-	depends on RP2040_SPI1
-
 endif
diff --git a/boards/arm/rp2040/pimoroni-tiny2040/configs/composite/defconfig b/boards/arm/rp2040/pimoroni-tiny2040/configs/composite/defconfig
index 573206543a..3a1ffeceff 100644
--- a/boards/arm/rp2040/pimoroni-tiny2040/configs/composite/defconfig
+++ b/boards/arm/rp2040/pimoroni-tiny2040/configs/composite/defconfig
@@ -17,7 +17,6 @@
 # CONFIG_STANDARD_SERIAL is not set
 CONFIG_ARCH="arm"
 CONFIG_ARCH_BOARD="pimoroni-tiny2040"
-CONFIG_ARCH_BOARD_COMMON=y
 CONFIG_ARCH_BOARD_PIMORONI_TINY2040=y
 CONFIG_ARCH_CHIP="rp2040"
 CONFIG_ARCH_CHIP_RP2040=y
@@ -53,7 +52,10 @@ CONFIG_RAM_SIZE=270336
 CONFIG_RAM_START=0x20000000
 CONFIG_READLINE_CMD_HISTORY=y
 CONFIG_RP2040_SPI0=y
-CONFIG_RP2040_SPI0_GPIO=4
+CONFIG_RP2040_SPI0_CS_GPIO=5
+CONFIG_RP2040_SPI0_RX_GPIO=4
+CONFIG_RP2040_SPI0_SCK_GPIO=6
+CONFIG_RP2040_SPI0_TX_GPIO=3
 CONFIG_RP2040_SPI=y
 CONFIG_RP2040_SPISD=y
 CONFIG_RR_INTERVAL=200
diff --git a/boards/arm/rp2040/pimoroni-tiny2040/configs/gpio/defconfig b/boards/arm/rp2040/pimoroni-tiny2040/configs/gpio/defconfig
index a25898b337..3ad6d6cb19 100644
--- a/boards/arm/rp2040/pimoroni-tiny2040/configs/gpio/defconfig
+++ b/boards/arm/rp2040/pimoroni-tiny2040/configs/gpio/defconfig
@@ -14,7 +14,6 @@
 # CONFIG_STANDARD_SERIAL is not set
 CONFIG_ARCH="arm"
 CONFIG_ARCH_BOARD="pimoroni-tiny2040"
-CONFIG_ARCH_BOARD_COMMON=y
 CONFIG_ARCH_BOARD_PIMORONI_TINY2040=y
 CONFIG_ARCH_CHIP="rp2040"
 CONFIG_ARCH_CHIP_RP2040=y
diff --git a/boards/arm/rp2040/pimoroni-tiny2040/configs/nsh/defconfig b/boards/arm/rp2040/pimoroni-tiny2040/configs/nsh/defconfig
index 3630991fa0..4a33d5fba0 100644
--- a/boards/arm/rp2040/pimoroni-tiny2040/configs/nsh/defconfig
+++ b/boards/arm/rp2040/pimoroni-tiny2040/configs/nsh/defconfig
@@ -14,7 +14,6 @@
 # CONFIG_STANDARD_SERIAL is not set
 CONFIG_ARCH="arm"
 CONFIG_ARCH_BOARD="pimoroni-tiny2040"
-CONFIG_ARCH_BOARD_COMMON=y
 CONFIG_ARCH_BOARD_PIMORONI_TINY2040=y
 CONFIG_ARCH_CHIP="rp2040"
 CONFIG_ARCH_CHIP_RP2040=y
diff --git a/boards/arm/rp2040/pimoroni-tiny2040/configs/nshsram/defconfig b/boards/arm/rp2040/pimoroni-tiny2040/configs/nshsram/defconfig
index 99dbb282a9..f0e347c9bf 100644
--- a/boards/arm/rp2040/pimoroni-tiny2040/configs/nshsram/defconfig
+++ b/boards/arm/rp2040/pimoroni-tiny2040/configs/nshsram/defconfig
@@ -15,7 +15,6 @@
 # CONFIG_STANDARD_SERIAL is not set
 CONFIG_ARCH="arm"
 CONFIG_ARCH_BOARD="pimoroni-tiny2040"
-CONFIG_ARCH_BOARD_COMMON=y
 CONFIG_ARCH_BOARD_PIMORONI_TINY2040=y
 CONFIG_ARCH_CHIP="rp2040"
 CONFIG_ARCH_CHIP_RP2040=y
diff --git a/boards/arm/rp2040/pimoroni-tiny2040/configs/smp/defconfig b/boards/arm/rp2040/pimoroni-tiny2040/configs/smp/defconfig
index 235ce75b96..3512946e54 100644
--- a/boards/arm/rp2040/pimoroni-tiny2040/configs/smp/defconfig
+++ b/boards/arm/rp2040/pimoroni-tiny2040/configs/smp/defconfig
@@ -14,7 +14,6 @@
 # CONFIG_STANDARD_SERIAL is not set
 CONFIG_ARCH="arm"
 CONFIG_ARCH_BOARD="pimoroni-tiny2040"
-CONFIG_ARCH_BOARD_COMMON=y
 CONFIG_ARCH_BOARD_PIMORONI_TINY2040=y
 CONFIG_ARCH_CHIP="rp2040"
 CONFIG_ARCH_CHIP_RP2040=y
diff --git a/boards/arm/rp2040/pimoroni-tiny2040/configs/spisd/defconfig b/boards/arm/rp2040/pimoroni-tiny2040/configs/spisd/defconfig
index de1e4d5a48..ce16a6bea7 100644
--- a/boards/arm/rp2040/pimoroni-tiny2040/configs/spisd/defconfig
+++ b/boards/arm/rp2040/pimoroni-tiny2040/configs/spisd/defconfig
@@ -17,7 +17,6 @@
 # CONFIG_STANDARD_SERIAL is not set
 CONFIG_ARCH="arm"
 CONFIG_ARCH_BOARD="pimoroni-tiny2040"
-CONFIG_ARCH_BOARD_COMMON=y
 CONFIG_ARCH_BOARD_PIMORONI_TINY2040=y
 CONFIG_ARCH_CHIP="rp2040"
 CONFIG_ARCH_CHIP_RP2040=y
@@ -45,7 +44,10 @@ CONFIG_RAM_SIZE=270336
 CONFIG_RAM_START=0x20000000
 CONFIG_READLINE_CMD_HISTORY=y
 CONFIG_RP2040_SPI0=y
-CONFIG_RP2040_SPI0_GPIO=4
+CONFIG_RP2040_SPI0_CS_GPIO=5
+CONFIG_RP2040_SPI0_RX_GPIO=4
+CONFIG_RP2040_SPI0_SCK_GPIO=6
+CONFIG_RP2040_SPI0_TX_GPIO=3
 CONFIG_RP2040_SPI=y
 CONFIG_RP2040_SPISD=y
 CONFIG_RR_INTERVAL=200
diff --git a/boards/arm/rp2040/pimoroni-tiny2040/configs/usbmsc/defconfig b/boards/arm/rp2040/pimoroni-tiny2040/configs/usbmsc/defconfig
index 57cddbec76..62831d35bb 100644
--- a/boards/arm/rp2040/pimoroni-tiny2040/configs/usbmsc/defconfig
+++ b/boards/arm/rp2040/pimoroni-tiny2040/configs/usbmsc/defconfig
@@ -17,7 +17,6 @@
 # CONFIG_STANDARD_SERIAL is not set
 CONFIG_ARCH="arm"
 CONFIG_ARCH_BOARD="pimoroni-tiny2040"
-CONFIG_ARCH_BOARD_COMMON=y
 CONFIG_ARCH_BOARD_PIMORONI_TINY2040=y
 CONFIG_ARCH_CHIP="rp2040"
 CONFIG_ARCH_CHIP_RP2040=y
@@ -47,7 +46,10 @@ CONFIG_RAM_SIZE=270336
 CONFIG_RAM_START=0x20000000
 CONFIG_READLINE_CMD_HISTORY=y
 CONFIG_RP2040_SPI0=y
-CONFIG_RP2040_SPI0_GPIO=4
+CONFIG_RP2040_SPI0_CS_GPIO=5
+CONFIG_RP2040_SPI0_RX_GPIO=4
+CONFIG_RP2040_SPI0_SCK_GPIO=6
+CONFIG_RP2040_SPI0_TX_GPIO=3
 CONFIG_RP2040_SPI=y
 CONFIG_RP2040_SPISD=y
 CONFIG_RR_INTERVAL=200
diff --git a/boards/arm/rp2040/pimoroni-tiny2040/configs/usbnsh/defconfig b/boards/arm/rp2040/pimoroni-tiny2040/configs/usbnsh/defconfig
index d1af1ca2e9..9504215089 100644
--- a/boards/arm/rp2040/pimoroni-tiny2040/configs/usbnsh/defconfig
+++ b/boards/arm/rp2040/pimoroni-tiny2040/configs/usbnsh/defconfig
@@ -15,7 +15,6 @@
 # CONFIG_RP2040_UART0 is not set
 CONFIG_ARCH="arm"
 CONFIG_ARCH_BOARD="pimoroni-tiny2040"
-CONFIG_ARCH_BOARD_COMMON=y
 CONFIG_ARCH_BOARD_PIMORONI_TINY2040=y
 CONFIG_ARCH_CHIP="rp2040"
 CONFIG_ARCH_CHIP_RP2040=y
diff --git a/boards/arm/rp2040/pimoroni-tiny2040/src/rp2040_boardinitialize.c b/boards/arm/rp2040/pimoroni-tiny2040/src/rp2040_boardinitialize.c
index 714e43534a..882dcf32fc 100644
--- a/boards/arm/rp2040/pimoroni-tiny2040/src/rp2040_boardinitialize.c
+++ b/boards/arm/rp2040/pimoroni-tiny2040/src/rp2040_boardinitialize.c
@@ -79,32 +79,32 @@ void rp2040_boardearlyinitialize(void)
 
   /* Set default UART pin */
 
-#if defined(CONFIG_RP2040_UART0) && CONFIG_RP2040_UART0_GPIO >= 0
-  rp2040_gpio_set_function(CONFIG_RP2040_UART0_GPIO,
+#ifdef CONFIG_RP2040_UART0
+  rp2040_gpio_set_function(CONFIG_RP2040_UART0_TX_GPIO,
                            RP2040_GPIO_FUNC_UART);      /* TX */
-  rp2040_gpio_set_function(CONFIG_RP2040_UART0_GPIO + 1,
+  rp2040_gpio_set_function(CONFIG_RP2040_UART0_RX_GPIO,
                            RP2040_GPIO_FUNC_UART);      /* RX */
 #ifdef CONFIG_SERIAL_OFLOWCONTROL
-  rp2040_gpio_set_function(CONFIG_RP2040_UART0_GPIO + 2,
+  rp2040_gpio_set_function(CONFIG_RP2040_UART0_CTS_GPIO,
                            RP2040_GPIO_FUNC_UART);      /* CTS */
 #endif
 #ifdef CONFIG_SERIAL_IFLOWCONTROL
-  rp2040_gpio_set_function(CONFIG_RP2040_UART0_GPIO + 3,
+  rp2040_gpio_set_function(CONFIG_RP2040_UART0_RTS_GPIO,
                            RP2040_GPIO_FUNC_UART);      /* RTS */
 #endif
 #endif
 
-#if defined(CONFIG_RP2040_UART1) && CONFIG_RP2040_UART1_GPIO >= 0
-  rp2040_gpio_set_function(CONFIG_RP2040_UART1_GPIO,
+#ifdef CONFIG_RP2040_UART1
+  rp2040_gpio_set_function(CONFIG_RP2040_UART1_TX_GPIO,
                            RP2040_GPIO_FUNC_UART);      /* TX */
-  rp2040_gpio_set_function(CONFIG_RP2040_UART1_GPIO + 1,
+  rp2040_gpio_set_function(CONFIG_RP2040_UART1_RX_GPIO,
                            RP2040_GPIO_FUNC_UART);      /* RX */
 #ifdef CONFIG_SERIAL_OFLOWCONTROL
-  rp2040_gpio_set_function(CONFIG_RP2040_UART1_GPIO + 2,
+  rp2040_gpio_set_function(CONFIG_RP2040_UART1_CTS_GPIO,
                            RP2040_GPIO_FUNC_UART);      /* CTS */
 #endif
 #ifdef CONFIG_SERIAL_IFLOWCONTROL
-  rp2040_gpio_set_function(CONFIG_RP2040_UART1_GPIO + 3,
+  rp2040_gpio_set_function(CONFIG_RP2040_UART1_RTS_GPIO,
                            RP2040_GPIO_FUNC_UART);      /* RTS */
 #endif
 #endif
@@ -121,55 +121,55 @@ void rp2040_boardinitialize(void)
 {
   /* Set default I2C pin */
 
-#if defined(CONFIG_RP2040_I2C0) && CONFIG_RP2040_I2C0_GPIO >= 0
-  rp2040_gpio_set_function(CONFIG_RP2040_I2C0_GPIO,
+#ifdef CONFIG_RP2040_I2C0
+  rp2040_gpio_set_function(CONFIG_RP2040_I2C0_SDA_GPIO,
                            RP2040_GPIO_FUNC_I2C);       /* SDA */
-  rp2040_gpio_set_function(CONFIG_RP2040_I2C0_GPIO + 1,
+  rp2040_gpio_set_function(CONFIG_RP2040_I2C0_SCL_GPIO,
                            RP2040_GPIO_FUNC_I2C);       /* SCL */
 
-  rp2040_gpio_set_pulls(CONFIG_RP2040_I2C0_GPIO, true, false);  /* Pull up */
-  rp2040_gpio_set_pulls(CONFIG_RP2040_I2C0_GPIO + 1, true, false);
+  rp2040_gpio_set_pulls(CONFIG_RP2040_I2C0_SDA_GPIO, true, false);  /* Pull up */
+  rp2040_gpio_set_pulls(CONFIG_RP2040_I2C0_SCL_GPIO, true, false);
 #endif
 
-#if defined(CONFIG_RP2040_I2C1) &&  CONFIG_RP2040_I2C1_GPIO >= 0
-  rp2040_gpio_set_function(CONFIG_RP2040_I2C1_GPIO,
+#ifdef CONFIG_RP2040_I2C1
+  rp2040_gpio_set_function(CONFIG_RP2040_I2C1_SDA_GPIO,
                            RP2040_GPIO_FUNC_I2C);       /* SDA */
-  rp2040_gpio_set_function(CONFIG_RP2040_I2C1_GPIO + 1,
+  rp2040_gpio_set_function(CONFIG_RP2040_I2C1_SCL_GPIO,
                            RP2040_GPIO_FUNC_I2C);       /* SCL */
 
-  rp2040_gpio_set_pulls(CONFIG_RP2040_I2C1_GPIO, true, false);  /* Pull up */
-  rp2040_gpio_set_pulls(CONFIG_RP2040_I2C1_GPIO + 1, true, false);
+  rp2040_gpio_set_pulls(CONFIG_RP2040_I2C1_SDA_GPIO, true, false);  /* Pull up */
+  rp2040_gpio_set_pulls(CONFIG_RP2040_I2C1_SCL_GPIO, true, false);
 #endif
 
   /* Set default SPI pin */
 
-#if defined(CONFIG_RP2040_SPI0) && CONFIG_RP2040_SPI0_GPIO >= 0
-  rp2040_gpio_set_function(CONFIG_RP2040_SPI0_GPIO,
+#ifdef CONFIG_RP2040_SPI0
+  rp2040_gpio_set_function(CONFIG_RP2040_SPI0_RX_GPIO,
                            RP2040_GPIO_FUNC_SPI);       /* RX */
-  rp2040_gpio_set_function(CONFIG_RP2040_SPI0_GPIO + 2,
+  rp2040_gpio_set_function(CONFIG_RP2040_SPI0_SCK_GPIO,
                            RP2040_GPIO_FUNC_SPI);       /* SCK */
-  rp2040_gpio_set_function(CONFIG_RP2040_SPI0_GPIO + 3,
+  rp2040_gpio_set_function(CONFIG_RP2040_SPI0_TX_GPIO,
                            RP2040_GPIO_FUNC_SPI);       /* TX */
 
   /* CSn is controlled by board-specific logic */
 
-  rp2040_gpio_init(CONFIG_RP2040_SPI0_GPIO + 1);        /* CSn */
-  rp2040_gpio_setdir(CONFIG_RP2040_SPI0_GPIO + 1, true);
-  rp2040_gpio_put(CONFIG_RP2040_SPI0_GPIO + 1, true);
+  rp2040_gpio_init(CONFIG_RP2040_SPI0_CS_GPIO);        /* CSn */
+  rp2040_gpio_setdir(CONFIG_RP2040_SPI0_CS_GPIO, true);
+  rp2040_gpio_put(CONFIG_RP2040_SPI0_CS_GPIO, true);
 #endif
 
-#if defined(CONFIG_RP2040_SPI1) &&  CONFIG_RP2040_SPI1_GPIO >= 0
-  rp2040_gpio_set_function(CONFIG_RP2040_SPI1_GPIO,
+#ifdef CONFIG_RP2040_SPI1
+  rp2040_gpio_set_function(CONFIG_RP2040_SPI1_RX_GPIO,
                            RP2040_GPIO_FUNC_SPI);       /* RX */
-  rp2040_gpio_set_function(CONFIG_RP2040_SPI1_GPIO + 2,
+  rp2040_gpio_set_function(CONFIG_RP2040_SPI1_SCK_GPIO,
                            RP2040_GPIO_FUNC_SPI);       /* SCK */
-  rp2040_gpio_set_function(CONFIG_RP2040_SPI1_GPIO + 3,
+  rp2040_gpio_set_function(CONFIG_RP2040_SPI1_TX_GPIO,
                            RP2040_GPIO_FUNC_SPI);       /* TX */
 
   /* CSn is controlled by board-specific logic */
 
-  rp2040_gpio_init(CONFIG_RP2040_SPI1_GPIO + 1);        /* CSn */
-  rp2040_gpio_setdir(CONFIG_RP2040_SPI1_GPIO + 1, true);
-  rp2040_gpio_put(CONFIG_RP2040_SPI1_GPIO + 1, true);
+  rp2040_gpio_init(CONFIG_RP2040_SPI1_CS_GPIO);        /* CSn */
+  rp2040_gpio_setdir(CONFIG_RP2040_SPI1_CS_GPIO, true);
+  rp2040_gpio_put(CONFIG_RP2040_SPI1_CS_GPIO, true);
 #endif
 }
diff --git a/boards/arm/rp2040/pimoroni-tiny2040/src/rp2040_bringup.c b/boards/arm/rp2040/pimoroni-tiny2040/src/rp2040_bringup.c
index 8082bbf121..a43aa21937 100644
--- a/boards/arm/rp2040/pimoroni-tiny2040/src/rp2040_bringup.c
+++ b/boards/arm/rp2040/pimoroni-tiny2040/src/rp2040_bringup.c
@@ -460,6 +460,7 @@ int rp2040_bringup(void)
 #if defined(CONFIG_RP2040_BOARD_HAS_WS2812) && defined(CONFIG_WS2812)
   rp2040_ws2812_setup("/dev/leds0",
                       CONFIG_RP2040_WS2812_GPIO_PIN,
+                      CONFIG_RP2040_WS2812_PWR_GPIO,
                       CONFIG_WS2812_LED_COUNT,
                       HAS_WHITE);
 #endif
diff --git a/boards/arm/rp2040/pimoroni-tiny2040/src/rp2040_spi.c b/boards/arm/rp2040/pimoroni-tiny2040/src/rp2040_spi.c
index 4faf44d9ea..111765b392 100644
--- a/boards/arm/rp2040/pimoroni-tiny2040/src/rp2040_spi.c
+++ b/boards/arm/rp2040/pimoroni-tiny2040/src/rp2040_spi.c
@@ -74,7 +74,7 @@ void rp2040_spi0select(struct spi_dev_s *dev, uint32_t devid,
   spiinfo("devid: %d CS: %s\n", (int)devid,
           selected ? "assert" : "de-assert");
 
-  rp2040_gpio_put(CONFIG_RP2040_SPI0_GPIO + 1, !selected);
+  rp2040_gpio_put(CONFIG_RP2040_SPI0_CS_GPIO, !selected);
 }
 
 uint8_t rp2040_spi0status(struct spi_dev_s *dev, uint32_t devid)
@@ -102,7 +102,7 @@ void rp2040_spi1select(struct spi_dev_s *dev, uint32_t devid,
   spiinfo("devid: %d CS: %s\n", (int)devid,
           selected ? "assert" : "de-assert");
 
-  rp2040_gpio_put(CONFIG_RP2040_SPI1_GPIO + 1, !selected);
+  rp2040_gpio_put(CONFIG_RP2040_SPI1_CS_GPIO, !selected);
 }
 
 uint8_t rp2040_spi1status(struct spi_dev_s *dev, uint32_t devid)
diff --git a/boards/arm/rp2040/raspberrypi-pico/Kconfig b/boards/arm/rp2040/raspberrypi-pico/Kconfig
index a2bf69e6af..a1a01a010d 100644
--- a/boards/arm/rp2040/raspberrypi-pico/Kconfig
+++ b/boards/arm/rp2040/raspberrypi-pico/Kconfig
@@ -13,11 +13,12 @@ config RP2040_FLASH_BOOT
 		If not, the binary is for SRAM boot.
 
 config RP2040_FLASH_CHIP
-	string "flash chip name"
+	string "Second stage boot loader"
 	default "w25q080"
 	---help---
-		Name of NOR flash device connected to RP2040 SoC.
-		(Used to choose the secondary boot loader.)
+		This is the name of the Pico-SDK second stage boot loader
+		to use for this board.  This board using a Q16 flash chip
+		which is compatible with the w25q080 boot loader.
 		Basically this option should not be changed.
 
 config RP2040_UF2_BINARY
@@ -26,346 +27,6 @@ config RP2040_UF2_BINARY
 	---help---
 		Create nuttx.uf2 binary format used on RP2040 based arch.
 
-config RP2040_UART0_GPIO
-	int "UART0 GPIO pin assign (0,12,16,28 or -1:no assign)"
-	default 0
-	range -1 29
-	depends on RP2040_UART0
-
-config RP2040_UART1_GPIO
-	int "UART1 GPIO pin assign (4,8,20,24 or -1:no assign)"
-	default -1
-	range -1 29
-	depends on RP2040_UART1
-
-config RP2040_I2C0_GPIO
-	int "I2C0 GPIO pin assign (0,4,8,12,16,20,24,28 or -1:no assign)"
-	default -1
-	range -1 29
-	depends on RP2040_I2C0
-
-config RP2040_I2C1_GPIO
-	int "I2C1 GPIO pin assign (2,6,10,14,18,22,26 or -1:no assign)"
-	default -1
-	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
-	range -1 29
-	depends on RP2040_SPI0
-
-config RP2040_SPI1_GPIO
-	int "SPI1 GPIO pin assign (8,12,24,28 or -1:no assign)"
-	default -1
-	range -1 29
-	depends on RP2040_SPI1
-
 config RP2040_LCD_SPI_CH
 	int "RP2040 LCD SPI channel number"
 	default 0
diff --git a/boards/arm/rp2040/raspberrypi-pico/configs/audiopack/defconfig b/boards/arm/rp2040/raspberrypi-pico/configs/audiopack/defconfig
index 41d32edef7..a365d1ce8a 100644
--- a/boards/arm/rp2040/raspberrypi-pico/configs/audiopack/defconfig
+++ b/boards/arm/rp2040/raspberrypi-pico/configs/audiopack/defconfig
@@ -21,7 +21,6 @@
 # CONFIG_STANDARD_SERIAL is not set
 CONFIG_ARCH="arm"
 CONFIG_ARCH_BOARD="raspberrypi-pico"
-CONFIG_ARCH_BOARD_COMMON=y
 CONFIG_ARCH_BOARD_RASPBERRYPI_PICO=y
 CONFIG_ARCH_CHIP="rp2040"
 CONFIG_ARCH_CHIP_RP2040=y
@@ -54,7 +53,6 @@ CONFIG_RAM_START=0x20000000
 CONFIG_READLINE_CMD_HISTORY=y
 CONFIG_RP2040_I2S=y
 CONFIG_RP2040_SPI0=y
-CONFIG_RP2040_SPI0_GPIO=16
 CONFIG_RP2040_SPI=y
 CONFIG_RP2040_SPISD=y
 CONFIG_RR_INTERVAL=200
diff --git a/boards/arm/rp2040/raspberrypi-pico/configs/composite/defconfig b/boards/arm/rp2040/raspberrypi-pico/configs/composite/defconfig
index 38484216bc..6b246a0ee6 100644
--- a/boards/arm/rp2040/raspberrypi-pico/configs/composite/defconfig
+++ b/boards/arm/rp2040/raspberrypi-pico/configs/composite/defconfig
@@ -17,7 +17,6 @@
 # CONFIG_STANDARD_SERIAL is not set
 CONFIG_ARCH="arm"
 CONFIG_ARCH_BOARD="raspberrypi-pico"
-CONFIG_ARCH_BOARD_COMMON=y
 CONFIG_ARCH_BOARD_RASPBERRYPI_PICO=y
 CONFIG_ARCH_CHIP="rp2040"
 CONFIG_ARCH_CHIP_RP2040=y
@@ -53,7 +52,6 @@ CONFIG_RAM_SIZE=270336
 CONFIG_RAM_START=0x20000000
 CONFIG_READLINE_CMD_HISTORY=y
 CONFIG_RP2040_SPI0=y
-CONFIG_RP2040_SPI0_GPIO=16
 CONFIG_RP2040_SPI=y
 CONFIG_RP2040_SPISD=y
 CONFIG_RR_INTERVAL=200
diff --git a/boards/arm/rp2040/raspberrypi-pico/configs/displaypack/defconfig b/boards/arm/rp2040/raspberrypi-pico/configs/displaypack/defconfig
index f48923f4ae..e1a0ec7469 100644
--- a/boards/arm/rp2040/raspberrypi-pico/configs/displaypack/defconfig
+++ b/boards/arm/rp2040/raspberrypi-pico/configs/displaypack/defconfig
@@ -20,7 +20,6 @@
 # CONFIG_STANDARD_SERIAL is not set
 CONFIG_ARCH="arm"
 CONFIG_ARCH_BOARD="raspberrypi-pico"
-CONFIG_ARCH_BOARD_COMMON=y
 CONFIG_ARCH_BOARD_RASPBERRYPI_PICO=y
 CONFIG_ARCH_CHIP="rp2040"
 CONFIG_ARCH_CHIP_RP2040=y
@@ -81,7 +80,6 @@ CONFIG_RAM_SIZE=270336
 CONFIG_RAM_START=0x20000000
 CONFIG_READLINE_CMD_HISTORY=y
 CONFIG_RP2040_SPI0=y
-CONFIG_RP2040_SPI0_GPIO=16
 CONFIG_RP2040_SPI=y
 CONFIG_RR_INTERVAL=200
 CONFIG_SCHED_WAITPID=y
diff --git a/boards/arm/rp2040/raspberrypi-pico/configs/enc28j60/defconfig b/boards/arm/rp2040/raspberrypi-pico/configs/enc28j60/defconfig
index 89c73fc0c7..09d4ca2a17 100644
--- a/boards/arm/rp2040/raspberrypi-pico/configs/enc28j60/defconfig
+++ b/boards/arm/rp2040/raspberrypi-pico/configs/enc28j60/defconfig
@@ -14,7 +14,6 @@
 # CONFIG_STANDARD_SERIAL is not set
 CONFIG_ARCH="arm"
 CONFIG_ARCH_BOARD="raspberrypi-pico"
-CONFIG_ARCH_BOARD_COMMON=y
 CONFIG_ARCH_BOARD_RASPBERRYPI_PICO=y
 CONFIG_ARCH_CHIP="rp2040"
 CONFIG_ARCH_CHIP_RP2040=y
@@ -59,9 +58,11 @@ CONFIG_READLINE_CMD_HISTORY=y
 CONFIG_RP2040_ENC28J60_INTR_GPIO=11
 CONFIG_RP2040_ENC28J60_RESET_GPIO=10
 CONFIG_RP2040_SPI0=y
-CONFIG_RP2040_SPI0_GPIO=16
 CONFIG_RP2040_SPI1=y
-CONFIG_RP2040_SPI1_GPIO=12
+CONFIG_RP2040_SPI1_CS_GPIO=13
+CONFIG_RP2040_SPI1_RX_GPIO=12
+CONFIG_RP2040_SPI1_SCK_GPIO=14
+CONFIG_RP2040_SPI1_TX_GPIO=15
 CONFIG_RP2040_SPI=y
 CONFIG_RR_INTERVAL=200
 CONFIG_SCHED_HPWORK=y
diff --git a/boards/arm/rp2040/raspberrypi-pico/configs/lcd1602/defconfig b/boards/arm/rp2040/raspberrypi-pico/configs/lcd1602/defconfig
index db9f390dec..7767f6443a 100644
--- a/boards/arm/rp2040/raspberrypi-pico/configs/lcd1602/defconfig
+++ b/boards/arm/rp2040/raspberrypi-pico/configs/lcd1602/defconfig
@@ -14,7 +14,6 @@
 # CONFIG_STANDARD_SERIAL is not set
 CONFIG_ARCH="arm"
 CONFIG_ARCH_BOARD="raspberrypi-pico"
-CONFIG_ARCH_BOARD_COMMON=y
 CONFIG_ARCH_BOARD_RASPBERRYPI_PICO=y
 CONFIG_ARCH_CHIP="rp2040"
 CONFIG_ARCH_CHIP_RP2040=y
@@ -41,7 +40,6 @@ CONFIG_RAM_SIZE=270336
 CONFIG_RAM_START=0x20000000
 CONFIG_READLINE_CMD_HISTORY=y
 CONFIG_RP2040_I2C0=y
-CONFIG_RP2040_I2C0_GPIO=4
 CONFIG_RP2040_I2C=y
 CONFIG_RP2040_I2C_DRIVER=y
 CONFIG_RR_INTERVAL=200
diff --git a/boards/arm/rp2040/raspberrypi-pico/configs/nsh/defconfig b/boards/arm/rp2040/raspberrypi-pico/configs/nsh/defconfig
index 421ba0692a..545734df1e 100644
--- a/boards/arm/rp2040/raspberrypi-pico/configs/nsh/defconfig
+++ b/boards/arm/rp2040/raspberrypi-pico/configs/nsh/defconfig
@@ -14,7 +14,6 @@
 # CONFIG_STANDARD_SERIAL is not set
 CONFIG_ARCH="arm"
 CONFIG_ARCH_BOARD="raspberrypi-pico"
-CONFIG_ARCH_BOARD_COMMON=y
 CONFIG_ARCH_BOARD_RASPBERRYPI_PICO=y
 CONFIG_ARCH_CHIP="rp2040"
 CONFIG_ARCH_CHIP_RP2040=y
diff --git a/boards/arm/rp2040/raspberrypi-pico/configs/nshsram/defconfig b/boards/arm/rp2040/raspberrypi-pico/configs/nshsram/defconfig
index 854cb64d53..e90297c312 100644
--- a/boards/arm/rp2040/raspberrypi-pico/configs/nshsram/defconfig
+++ b/boards/arm/rp2040/raspberrypi-pico/configs/nshsram/defconfig
@@ -15,7 +15,6 @@
 # CONFIG_STANDARD_SERIAL is not set
 CONFIG_ARCH="arm"
 CONFIG_ARCH_BOARD="raspberrypi-pico"
-CONFIG_ARCH_BOARD_COMMON=y
 CONFIG_ARCH_BOARD_RASPBERRYPI_PICO=y
 CONFIG_ARCH_CHIP="rp2040"
 CONFIG_ARCH_CHIP_RP2040=y
diff --git a/boards/arm/rp2040/raspberrypi-pico/configs/smp/defconfig b/boards/arm/rp2040/raspberrypi-pico/configs/smp/defconfig
index e7fc281bcd..40de637396 100644
--- a/boards/arm/rp2040/raspberrypi-pico/configs/smp/defconfig
+++ b/boards/arm/rp2040/raspberrypi-pico/configs/smp/defconfig
@@ -14,7 +14,6 @@
 # CONFIG_STANDARD_SERIAL is not set
 CONFIG_ARCH="arm"
 CONFIG_ARCH_BOARD="raspberrypi-pico"
-CONFIG_ARCH_BOARD_COMMON=y
 CONFIG_ARCH_BOARD_RASPBERRYPI_PICO=y
 CONFIG_ARCH_CHIP="rp2040"
 CONFIG_ARCH_CHIP_RP2040=y
diff --git a/boards/arm/rp2040/raspberrypi-pico/configs/spisd/defconfig b/boards/arm/rp2040/raspberrypi-pico/configs/spisd/defconfig
index b662bbaa52..a27ca55151 100644
--- a/boards/arm/rp2040/raspberrypi-pico/configs/spisd/defconfig
+++ b/boards/arm/rp2040/raspberrypi-pico/configs/spisd/defconfig
@@ -17,7 +17,6 @@
 # CONFIG_STANDARD_SERIAL is not set
 CONFIG_ARCH="arm"
 CONFIG_ARCH_BOARD="raspberrypi-pico"
-CONFIG_ARCH_BOARD_COMMON=y
 CONFIG_ARCH_BOARD_RASPBERRYPI_PICO=y
 CONFIG_ARCH_CHIP="rp2040"
 CONFIG_ARCH_CHIP_RP2040=y
@@ -45,7 +44,6 @@ CONFIG_RAM_SIZE=270336
 CONFIG_RAM_START=0x20000000
 CONFIG_READLINE_CMD_HISTORY=y
 CONFIG_RP2040_SPI0=y
-CONFIG_RP2040_SPI0_GPIO=16
 CONFIG_RP2040_SPI=y
 CONFIG_RP2040_SPISD=y
 CONFIG_RR_INTERVAL=200
diff --git a/boards/arm/rp2040/raspberrypi-pico/configs/ssd1306/defconfig b/boards/arm/rp2040/raspberrypi-pico/configs/ssd1306/defconfig
index e9ebc400d2..814ea27d43 100644
--- a/boards/arm/rp2040/raspberrypi-pico/configs/ssd1306/defconfig
+++ b/boards/arm/rp2040/raspberrypi-pico/configs/ssd1306/defconfig
@@ -17,7 +17,6 @@
 # CONFIG_STANDARD_SERIAL is not set
 CONFIG_ARCH="arm"
 CONFIG_ARCH_BOARD="raspberrypi-pico"
-CONFIG_ARCH_BOARD_COMMON=y
 CONFIG_ARCH_BOARD_RASPBERRYPI_PICO=y
 CONFIG_ARCH_CHIP="rp2040"
 CONFIG_ARCH_CHIP_RP2040=y
@@ -60,7 +59,6 @@ CONFIG_RAM_SIZE=270336
 CONFIG_RAM_START=0x20000000
 CONFIG_READLINE_CMD_HISTORY=y
 CONFIG_RP2040_I2C0=y
-CONFIG_RP2040_I2C0_GPIO=4
 CONFIG_RP2040_I2C=y
 CONFIG_RP2040_I2C_DRIVER=y
 CONFIG_RR_INTERVAL=200
diff --git a/boards/arm/rp2040/raspberrypi-pico/configs/st7735/defconfig b/boards/arm/rp2040/raspberrypi-pico/configs/st7735/defconfig
index 9e7d8caaab..a218a25400 100644
--- a/boards/arm/rp2040/raspberrypi-pico/configs/st7735/defconfig
+++ b/boards/arm/rp2040/raspberrypi-pico/configs/st7735/defconfig
@@ -14,7 +14,6 @@
 # CONFIG_STANDARD_SERIAL is not set
 CONFIG_ARCH="arm"
 CONFIG_ARCH_BOARD="raspberrypi-pico"
-CONFIG_ARCH_BOARD_COMMON=y
 CONFIG_ARCH_BOARD_RASPBERRYPI_PICO=y
 CONFIG_ARCH_CHIP="rp2040"
 CONFIG_ARCH_CHIP_RP2040=y
@@ -44,7 +43,10 @@ CONFIG_RAM_SIZE=270336
 CONFIG_RAM_START=0x20000000
 CONFIG_READLINE_CMD_HISTORY=y
 CONFIG_RP2040_SPI1=y
-CONFIG_RP2040_SPI1_GPIO=12
+CONFIG_RP2040_SPI1_CS_GPIO=13
+CONFIG_RP2040_SPI1_RX_GPIO=12
+CONFIG_RP2040_SPI1_SCK_GPIO=14
+CONFIG_RP2040_SPI1_TX_GPIO=15
 CONFIG_RP2040_SPI=y
 CONFIG_RR_INTERVAL=200
 CONFIG_SCHED_WAITPID=y
diff --git a/boards/arm/rp2040/raspberrypi-pico/configs/usbmsc/defconfig b/boards/arm/rp2040/raspberrypi-pico/configs/usbmsc/defconfig
index fc4af6e603..495a998957 100644
--- a/boards/arm/rp2040/raspberrypi-pico/configs/usbmsc/defconfig
+++ b/boards/arm/rp2040/raspberrypi-pico/configs/usbmsc/defconfig
@@ -17,7 +17,6 @@
 # CONFIG_STANDARD_SERIAL is not set
 CONFIG_ARCH="arm"
 CONFIG_ARCH_BOARD="raspberrypi-pico"
-CONFIG_ARCH_BOARD_COMMON=y
 CONFIG_ARCH_BOARD_RASPBERRYPI_PICO=y
 CONFIG_ARCH_CHIP="rp2040"
 CONFIG_ARCH_CHIP_RP2040=y
@@ -47,7 +46,6 @@ CONFIG_RAM_SIZE=270336
 CONFIG_RAM_START=0x20000000
 CONFIG_READLINE_CMD_HISTORY=y
 CONFIG_RP2040_SPI0=y
-CONFIG_RP2040_SPI0_GPIO=16
 CONFIG_RP2040_SPI=y
 CONFIG_RP2040_SPISD=y
 CONFIG_RR_INTERVAL=200
diff --git a/boards/arm/rp2040/raspberrypi-pico/configs/usbnsh/defconfig b/boards/arm/rp2040/raspberrypi-pico/configs/usbnsh/defconfig
index 1944655f00..e45f7ee4c6 100644
--- a/boards/arm/rp2040/raspberrypi-pico/configs/usbnsh/defconfig
+++ b/boards/arm/rp2040/raspberrypi-pico/configs/usbnsh/defconfig
@@ -15,7 +15,6 @@
 # CONFIG_RP2040_UART0 is not set
 CONFIG_ARCH="arm"
 CONFIG_ARCH_BOARD="raspberrypi-pico"
-CONFIG_ARCH_BOARD_COMMON=y
 CONFIG_ARCH_BOARD_RASPBERRYPI_PICO=y
 CONFIG_ARCH_CHIP="rp2040"
 CONFIG_ARCH_CHIP_RP2040=y
diff --git a/boards/arm/rp2040/raspberrypi-pico/configs/waveshare-lcd-1.14/defconfig b/boards/arm/rp2040/raspberrypi-pico/configs/waveshare-lcd-1.14/defconfig
index b4748ad3df..83ae1bb1c6 100644
--- a/boards/arm/rp2040/raspberrypi-pico/configs/waveshare-lcd-1.14/defconfig
+++ b/boards/arm/rp2040/raspberrypi-pico/configs/waveshare-lcd-1.14/defconfig
@@ -19,7 +19,6 @@
 # CONFIG_STANDARD_SERIAL is not set
 CONFIG_ARCH="arm"
 CONFIG_ARCH_BOARD="raspberrypi-pico"
-CONFIG_ARCH_BOARD_COMMON=y
 CONFIG_ARCH_BOARD_RASPBERRYPI_PICO=y
 CONFIG_ARCH_CHIP="rp2040"
 CONFIG_ARCH_CHIP_RP2040=y
@@ -78,7 +77,6 @@ CONFIG_RAM_START=0x20000000
 CONFIG_READLINE_CMD_HISTORY=y
 CONFIG_RP2040_LCD_SPI_CH=1
 CONFIG_RP2040_SPI1=y
-CONFIG_RP2040_SPI1_GPIO=8
 CONFIG_RP2040_SPI=y
 CONFIG_RR_INTERVAL=200
 CONFIG_SCHED_WAITPID=y
diff --git a/boards/arm/rp2040/raspberrypi-pico/configs/waveshare-lcd-1.3/defconfig b/boards/arm/rp2040/raspberrypi-pico/configs/waveshare-lcd-1.3/defconfig
index 70ffeac581..8f2f50ea19 100644
--- a/boards/arm/rp2040/raspberrypi-pico/configs/waveshare-lcd-1.3/defconfig
+++ b/boards/arm/rp2040/raspberrypi-pico/configs/waveshare-lcd-1.3/defconfig
@@ -19,7 +19,6 @@
 # CONFIG_STANDARD_SERIAL is not set
 CONFIG_ARCH="arm"
 CONFIG_ARCH_BOARD="raspberrypi-pico"
-CONFIG_ARCH_BOARD_COMMON=y
 CONFIG_ARCH_BOARD_RASPBERRYPI_PICO=y
 CONFIG_ARCH_CHIP="rp2040"
 CONFIG_ARCH_CHIP_RP2040=y
@@ -75,7 +74,6 @@ CONFIG_RAM_START=0x20000000
 CONFIG_READLINE_CMD_HISTORY=y
 CONFIG_RP2040_LCD_SPI_CH=1
 CONFIG_RP2040_SPI1=y
-CONFIG_RP2040_SPI1_GPIO=8
 CONFIG_RP2040_SPI=y
 CONFIG_RR_INTERVAL=200
 CONFIG_SCHED_WAITPID=y
diff --git a/boards/arm/rp2040/raspberrypi-pico/src/rp2040_boardinitialize.c b/boards/arm/rp2040/raspberrypi-pico/src/rp2040_boardinitialize.c
index 33e6790870..a3eba93eae 100644
--- a/boards/arm/rp2040/raspberrypi-pico/src/rp2040_boardinitialize.c
+++ b/boards/arm/rp2040/raspberrypi-pico/src/rp2040_boardinitialize.c
@@ -70,32 +70,32 @@ void rp2040_boardearlyinitialize(void)
 
   /* Set default UART pin */
 
-#if defined(CONFIG_RP2040_UART0) && CONFIG_RP2040_UART0_GPIO >= 0
-  rp2040_gpio_set_function(CONFIG_RP2040_UART0_GPIO,
+#ifdef CONFIG_RP2040_UART0
+  rp2040_gpio_set_function(CONFIG_RP2040_UART0_TX_GPIO,
                            RP2040_GPIO_FUNC_UART);      /* TX */
-  rp2040_gpio_set_function(CONFIG_RP2040_UART0_GPIO + 1,
+  rp2040_gpio_set_function(CONFIG_RP2040_UART0_RX_GPIO,
                            RP2040_GPIO_FUNC_UART);      /* RX */
 #ifdef CONFIG_SERIAL_OFLOWCONTROL
-  rp2040_gpio_set_function(CONFIG_RP2040_UART0_GPIO + 2,
+  rp2040_gpio_set_function(CONFIG_RP2040_UART0_CTS_GPIO,
                            RP2040_GPIO_FUNC_UART);      /* CTS */
 #endif
 #ifdef CONFIG_SERIAL_IFLOWCONTROL
-  rp2040_gpio_set_function(CONFIG_RP2040_UART0_GPIO + 3,
+  rp2040_gpio_set_function(CONFIG_RP2040_UART0_RTS_GPIO,
                            RP2040_GPIO_FUNC_UART);      /* RTS */
 #endif
 #endif
 
-#if defined(CONFIG_RP2040_UART1) && CONFIG_RP2040_UART1_GPIO >= 0
-  rp2040_gpio_set_function(CONFIG_RP2040_UART1_GPIO,
+#ifdef CONFIG_RP2040_UART1
+  rp2040_gpio_set_function(CONFIG_RP2040_UART1_TX_GPIO,
                            RP2040_GPIO_FUNC_UART);      /* TX */
-  rp2040_gpio_set_function(CONFIG_RP2040_UART1_GPIO + 1,
+  rp2040_gpio_set_function(CONFIG_RP2040_UART1_RX_GPIO,
                            RP2040_GPIO_FUNC_UART);      /* RX */
 #ifdef CONFIG_SERIAL_OFLOWCONTROL
-  rp2040_gpio_set_function(CONFIG_RP2040_UART1_GPIO + 2,
+  rp2040_gpio_set_function(CONFIG_RP2040_UART1_CTS_GPIO,
                            RP2040_GPIO_FUNC_UART);      /* CTS */
 #endif
 #ifdef CONFIG_SERIAL_IFLOWCONTROL
-  rp2040_gpio_set_function(CONFIG_RP2040_UART1_GPIO + 3,
+  rp2040_gpio_set_function(CONFIG_RP2040_UART1_RTS_GPIO,
                            RP2040_GPIO_FUNC_UART);      /* RTS */
 #endif
 #endif
@@ -112,55 +112,55 @@ void rp2040_boardinitialize(void)
 {
   /* Set default I2C pin */
 
-#if defined(CONFIG_RP2040_I2C0) && CONFIG_RP2040_I2C0_GPIO >= 0
-  rp2040_gpio_set_function(CONFIG_RP2040_I2C0_GPIO,
+#ifdef CONFIG_RP2040_I2C0
+  rp2040_gpio_set_function(CONFIG_RP2040_I2C0_SDA_GPIO,
                            RP2040_GPIO_FUNC_I2C);       /* SDA */
-  rp2040_gpio_set_function(CONFIG_RP2040_I2C0_GPIO + 1,
+  rp2040_gpio_set_function(CONFIG_RP2040_I2C0_SCL_GPIO,
                            RP2040_GPIO_FUNC_I2C);       /* SCL */
 
-  rp2040_gpio_set_pulls(CONFIG_RP2040_I2C0_GPIO, true, false);  /* Pull up */
-  rp2040_gpio_set_pulls(CONFIG_RP2040_I2C0_GPIO + 1, true, false);
+  rp2040_gpio_set_pulls(CONFIG_RP2040_I2C0_SDA_GPIO, true, false);  /* Pull up */
+  rp2040_gpio_set_pulls(CONFIG_RP2040_I2C0_SCL_GPIO, true, false);
 #endif
 
-#if defined(CONFIG_RP2040_I2C1) &&  CONFIG_RP2040_I2C1_GPIO >= 0
-  rp2040_gpio_set_function(CONFIG_RP2040_I2C1_GPIO,
+#ifdef CONFIG_RP2040_I2C1
+  rp2040_gpio_set_function(CONFIG_RP2040_I2C1_SDA_GPIO,
                            RP2040_GPIO_FUNC_I2C);       /* SDA */
-  rp2040_gpio_set_function(CONFIG_RP2040_I2C1_GPIO + 1,
+  rp2040_gpio_set_function(CONFIG_RP2040_I2C1_SCL_GPIO,
                            RP2040_GPIO_FUNC_I2C);       /* SCL */
 
-  rp2040_gpio_set_pulls(CONFIG_RP2040_I2C1_GPIO, true, false);  /* Pull up */
-  rp2040_gpio_set_pulls(CONFIG_RP2040_I2C1_GPIO + 1, true, false);
+  rp2040_gpio_set_pulls(CONFIG_RP2040_I2C1_SDA_GPIO, true, false);  /* Pull up */
+  rp2040_gpio_set_pulls(CONFIG_RP2040_I2C1_SCL_GPIO, true, false);
 #endif
 
   /* Set default SPI pin */
 
-#if defined(CONFIG_RP2040_SPI0) && CONFIG_RP2040_SPI0_GPIO >= 0
-  rp2040_gpio_set_function(CONFIG_RP2040_SPI0_GPIO,
+#ifdef CONFIG_RP2040_SPI0
+  rp2040_gpio_set_function(CONFIG_RP2040_SPI0_RX_GPIO,
                            RP2040_GPIO_FUNC_SPI);       /* RX */
-  rp2040_gpio_set_function(CONFIG_RP2040_SPI0_GPIO + 2,
+  rp2040_gpio_set_function(CONFIG_RP2040_SPI0_SCK_GPIO,
                            RP2040_GPIO_FUNC_SPI);       /* SCK */
-  rp2040_gpio_set_function(CONFIG_RP2040_SPI0_GPIO + 3,
+  rp2040_gpio_set_function(CONFIG_RP2040_SPI0_TX_GPIO,
                            RP2040_GPIO_FUNC_SPI);       /* TX */
 
   /* CSn is controlled by board-specific logic */
 
-  rp2040_gpio_init(CONFIG_RP2040_SPI0_GPIO + 1);        /* CSn */
-  rp2040_gpio_setdir(CONFIG_RP2040_SPI0_GPIO + 1, true);
-  rp2040_gpio_put(CONFIG_RP2040_SPI0_GPIO + 1, true);
+  rp2040_gpio_init(CONFIG_RP2040_SPI0_CS_GPIO);        /* CSn */
+  rp2040_gpio_setdir(CONFIG_RP2040_SPI0_CS_GPIO, true);
+  rp2040_gpio_put(CONFIG_RP2040_SPI0_CS_GPIO, true);
 #endif
 
-#if defined(CONFIG_RP2040_SPI1) &&  CONFIG_RP2040_SPI1_GPIO >= 0
-  rp2040_gpio_set_function(CONFIG_RP2040_SPI1_GPIO,
+#ifdef CONFIG_RP2040_SPI1
+  rp2040_gpio_set_function(CONFIG_RP2040_SPI1_RX_GPIO,
                            RP2040_GPIO_FUNC_SPI);       /* RX */
-  rp2040_gpio_set_function(CONFIG_RP2040_SPI1_GPIO + 2,
+  rp2040_gpio_set_function(CONFIG_RP2040_SPI1_SCK_GPIO,
                            RP2040_GPIO_FUNC_SPI);       /* SCK */
-  rp2040_gpio_set_function(CONFIG_RP2040_SPI1_GPIO + 3,
+  rp2040_gpio_set_function(CONFIG_RP2040_SPI1_TX_GPIO,
                            RP2040_GPIO_FUNC_SPI);       /* TX */
 
   /* CSn is controlled by board-specific logic */
 
-  rp2040_gpio_init(CONFIG_RP2040_SPI1_GPIO + 1);        /* CSn */
-  rp2040_gpio_setdir(CONFIG_RP2040_SPI1_GPIO + 1, true);
-  rp2040_gpio_put(CONFIG_RP2040_SPI1_GPIO + 1, true);
+  rp2040_gpio_init(CONFIG_RP2040_SPI1_CS_GPIO);        /* CSn */
+  rp2040_gpio_setdir(CONFIG_RP2040_SPI1_CS_GPIO, true);
+  rp2040_gpio_put(CONFIG_RP2040_SPI1_CS_GPIO, true);
 #endif
 }
diff --git a/boards/arm/rp2040/raspberrypi-pico/src/rp2040_bringup.c b/boards/arm/rp2040/raspberrypi-pico/src/rp2040_bringup.c
index b5b19e7e1b..2e5ae58070 100644
--- a/boards/arm/rp2040/raspberrypi-pico/src/rp2040_bringup.c
+++ b/boards/arm/rp2040/raspberrypi-pico/src/rp2040_bringup.c
@@ -539,6 +539,7 @@ int rp2040_bringup(void)
 #if defined(CONFIG_RP2040_BOARD_HAS_WS2812) && defined(CONFIG_WS2812)
   rp2040_ws2812_setup("/dev/leds0",
                       CONFIG_RP2040_WS2812_GPIO_PIN,
+                      CONFIG_RP2040_WS2812_PWR_GPIO,
                       CONFIG_WS2812_LED_COUNT,
                       HAS_WHITE);
 #endif
diff --git a/boards/arm/rp2040/raspberrypi-pico/src/rp2040_spi.c b/boards/arm/rp2040/raspberrypi-pico/src/rp2040_spi.c
index 9e6c3d1e44..db9b8e4981 100644
--- a/boards/arm/rp2040/raspberrypi-pico/src/rp2040_spi.c
+++ b/boards/arm/rp2040/raspberrypi-pico/src/rp2040_spi.c
@@ -74,7 +74,7 @@ void rp2040_spi0select(struct spi_dev_s *dev, uint32_t devid,
   spiinfo("devid: %d CS: %s\n", (int)devid,
           selected ? "assert" : "de-assert");
 
-  rp2040_gpio_put(CONFIG_RP2040_SPI0_GPIO + 1, !selected);
+  rp2040_gpio_put(CONFIG_RP2040_SPI0_CS_GPIO, !selected);
 }
 
 uint8_t rp2040_spi0status(struct spi_dev_s *dev, uint32_t devid)
@@ -97,7 +97,7 @@ int rp2040_spi0cmddata(struct spi_dev_s *dev, uint32_t devid, bool cmd)
        *  data bits are data or a command.
        */
 
-      rp2040_gpio_put(CONFIG_RP2040_SPI0_GPIO, !cmd);
+      rp2040_gpio_put(CONFIG_RP2040_SPI0_RX_GPIO, !cmd);
 
       return OK;
     }
@@ -115,7 +115,7 @@ void rp2040_spi1select(struct spi_dev_s *dev, uint32_t devid,
   spiinfo("devid: %d CS: %s\n", (int)devid,
           selected ? "assert" : "de-assert");
 
-  rp2040_gpio_put(CONFIG_RP2040_SPI1_GPIO + 1, !selected);
+  rp2040_gpio_put(CONFIG_RP2040_SPI1_CS_GPIO, !selected);
 }
 
 uint8_t rp2040_spi1status(struct spi_dev_s *dev, uint32_t devid)
@@ -138,7 +138,7 @@ int rp2040_spi1cmddata(struct spi_dev_s *dev, uint32_t devid, bool cmd)
        *  data bits are data or a command.
        */
 
-      rp2040_gpio_put(CONFIG_RP2040_SPI1_GPIO, !cmd);
+      rp2040_gpio_put(CONFIG_RP2040_SPI1_RX_GPIO, !cmd);
 
       return OK;
     }
diff --git a/drivers/leds/ws2812.c b/drivers/leds/ws2812.c
index 1c2b0df89b..0919d3f500 100644
--- a/drivers/leds/ws2812.c
+++ b/drivers/leds/ws2812.c
@@ -667,7 +667,7 @@ int ws2812_leds_register(FAR const char *devpath, FAR struct spi_dev_s *spi,
       return -ENOMEM;
     }
 
-  priv->nleds = nleds;
+  priv->nleds  = nleds;
   priv->tx_buf = (FAR uint8_t *)kmm_zalloc(TXBUFF_SIZE(priv->nleds));
   if (!priv->tx_buf)
     {
diff --git a/include/nuttx/leds/ws2812.h b/include/nuttx/leds/ws2812.h
index e64759e6d6..5ab44468cb 100644
--- a/include/nuttx/leds/ws2812.h
+++ b/include/nuttx/leds/ws2812.h
@@ -88,17 +88,12 @@ struct ws2812_dev_s
                         FAR char        *data,
                         size_t           len);
 
+  void                  *private;    /* Private data for opened device */
   uint32_t               clock;
   sem_t                  exclsem;
   int                    port;
   uint16_t               nleds;
   bool                   has_white;
-
-  /* --------------------------------------------------------
-   * Other fields must be set to zero.
-   */
-
-  void     *private;    /* Private data for opened device */
 };
 
 #endif