You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by ac...@apache.org on 2022/08/17 22:03:24 UTC

[incubator-nuttx] branch master updated: Added support for Raspberry Pi Pico W

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

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


The following commit(s) were added to refs/heads/master by this push:
     new 74f1bfbfd7 Added support for Raspberry Pi Pico W
74f1bfbfd7 is described below

commit 74f1bfbfd7d578ba74f1885548a8be0901df0c34
Author: curuvar <58...@users.noreply.github.com>
AuthorDate: Wed Aug 17 13:41:50 2022 -0400

    Added support for Raspberry Pi Pico W
---
 .../boards/raspberrypi-pico-w/RaspberryPiPicoW.png | Bin 0 -> 238329 bytes
 .../index.rst                                      |  55 +-
 .../arm/rp2040/boards/raspberrypi-pico/index.rst   |  24 +-
 arch/arm/src/rp2040/Kconfig                        |  19 +-
 arch/arm/src/rp2040/Make.defs                      |   5 +
 arch/arm/src/rp2040/hardware/rp2040_pads_bank0.h   |  10 +-
 arch/arm/src/rp2040/hardware/rp2040_pio.h          |   3 +
 arch/arm/src/rp2040/rp2040_cyw43439.c              | 832 +++++++++++++++++++++
 arch/arm/src/rp2040/rp2040_cyw43439.h              | 115 +++
 arch/arm/src/rp2040/rp2040_dmac.c                  | 141 +++-
 arch/arm/src/rp2040/rp2040_dmac.h                  |  84 +++
 arch/arm/src/rp2040/rp2040_gpio.c                  |  25 +
 arch/arm/src/rp2040/rp2040_gpio.h                  |  66 ++
 arch/arm/src/rp2040/rp2040_pio.h                   |  24 +
 arch/arm/src/rp2040/rp2040_ws2812.c                |   7 +-
 boards/Kconfig                                     |  12 +-
 .../configs/audiopack/defconfig                    |   1 -
 .../configs/composite/defconfig                    |   1 -
 .../configs/displaypack/defconfig                  |   1 -
 .../configs/enc28j60/defconfig                     |   1 -
 .../configs/lcd1602/defconfig                      |   1 -
 .../adafruit-feather-rp2040/configs/nsh/defconfig  |   1 -
 .../configs/nshsram/defconfig                      |   1 -
 .../adafruit-feather-rp2040/configs/smp/defconfig  |   1 -
 .../configs/spisd/defconfig                        |   1 -
 .../configs/ssd1306/defconfig                      |   1 -
 .../configs/st7735/defconfig                       |   1 -
 .../configs/usbmsc/defconfig                       |   1 -
 .../configs/usbnsh/defconfig                       |   1 -
 .../configs/waveshare-lcd-1.14/defconfig           |   1 -
 .../configs/waveshare-lcd-1.3/defconfig            |   1 -
 .../src/rp2040_boardinitialize.c                   | 105 +--
 .../adafruit-feather-rp2040/src/rp2040_bringup.c   | 465 +-----------
 .../adafruit-kb2040/configs/audiopack/defconfig    |   1 -
 .../adafruit-kb2040/configs/composite/defconfig    |   1 -
 .../adafruit-kb2040/configs/displaypack/defconfig  |   1 -
 .../adafruit-kb2040/configs/enc28j60/defconfig     |   1 -
 .../adafruit-kb2040/configs/lcd1602/defconfig      |   1 -
 .../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 |   1 -
 .../adafruit-kb2040/configs/ssd1306/defconfig      |   1 -
 .../adafruit-kb2040/configs/st7735/defconfig       |   1 -
 .../adafruit-kb2040/configs/usbmsc/defconfig       |   1 -
 .../adafruit-kb2040/configs/usbnsh/defconfig       |   1 -
 .../configs/waveshare-lcd-1.14/defconfig           |   1 -
 .../configs/waveshare-lcd-1.3/defconfig            |   1 -
 .../adafruit-kb2040/src/rp2040_boardinitialize.c   | 103 +--
 .../rp2040/adafruit-kb2040/src/rp2040_bringup.c    | 465 +-----------
 .../adafruit-qt-py-rp2040/configs/gpio/defconfig   |   1 -
 .../adafruit-qt-py-rp2040/configs/nsh/defconfig    |   1 -
 .../configs/nshsram/defconfig                      |   1 -
 .../adafruit-qt-py-rp2040/configs/smp/defconfig    |   1 -
 .../adafruit-qt-py-rp2040/configs/usbnsh/defconfig |   1 -
 .../src/rp2040_boardinitialize.c                   | 103 +--
 .../adafruit-qt-py-rp2040/src/rp2040_bringup.c     | 471 +-----------
 .../rp2040/common/include/rp2040_common_bringup.h  |  47 ++
 .../common/include/rp2040_common_initialize.h      |  60 ++
 boards/arm/rp2040/common/src/.gitignore            |   1 +
 boards/arm/rp2040/common/src/Make.defs             |   3 +
 .../src/rp2040_common_bringup.c}                   |  74 +-
 .../src/rp2040_common_initialize.c}                |  22 +-
 boards/arm/rp2040/common/src/rp2040_firmware.c     | 158 ++++
 .../pimoroni-tiny2040/src/rp2040_boardinitialize.c | 106 +--
 .../rp2040/pimoroni-tiny2040/src/rp2040_bringup.c  | 424 +----------
 .../arm/rp2040/pimoroni-tiny2040/src/rp2040_pico.h |  36 +
 boards/arm/rp2040/raspberrypi-pico-w/Kconfig       |  89 +++
 boards/arm/rp2040/raspberrypi-pico-w/README.txt    | 182 +++++
 .../configs/audiopack/defconfig                    |  12 +-
 .../configs/composite/defconfig                    |  12 +-
 .../configs/displaypack/defconfig                  |  12 +-
 .../configs/enc28j60/defconfig                     |  16 +-
 .../configs/lcd1602/defconfig                      |   4 +-
 .../configs/nsh/defconfig                          |   8 +-
 .../configs/nshsram/defconfig                      |   8 +-
 .../configs/smp/defconfig                          |   8 +-
 .../configs/spisd/defconfig                        |   8 +-
 .../configs/ssd1306/defconfig                      |   8 +-
 .../configs/st7735/defconfig                       |   8 +-
 .../configs/usbmsc}/defconfig                      |  17 +-
 .../configs/usbnsh/defconfig                       |   8 +-
 .../configs/waveshare-lcd-1.14/defconfig           |   8 +-
 .../configs/waveshare-lcd-1.3/defconfig            |   8 +-
 .../arm/rp2040/raspberrypi-pico-w/include/board.h  | 116 +++
 .../raspberrypi-pico-w/include/rp2040_extra_gpio.h | 132 ++++
 .../raspberrypi-pico-w/include/rp2040_i2cdev.h     |  72 ++
 .../raspberrypi-pico-w/include/rp2040_i2sdev.h     |  72 ++
 .../raspberrypi-pico-w/include/rp2040_spidev.h     |  69 ++
 .../raspberrypi-pico-w/include/rp2040_spisd.h      |  83 ++
 .../rp2040/raspberrypi-pico-w/scripts/Make.defs    |  45 ++
 .../scripts/raspberrypi-pico-flash.ld              | 112 +++
 .../scripts/raspberrypi-pico-sram.ld               |  97 +++
 boards/arm/rp2040/raspberrypi-pico-w/src/Make.defs |  65 ++
 .../rp2040/raspberrypi-pico-w/src/rp2040_appinit.c |  78 ++
 .../src/rp2040_boardinitialize.c                   |  81 ++
 .../rp2040/raspberrypi-pico-w/src/rp2040_bringup.c | 102 +++
 .../rp2040/raspberrypi-pico-w/src/rp2040_gpio.c    | 392 ++++++++++
 .../rp2040/raspberrypi-pico-w/src/rp2040_pico.h    |  36 +
 .../rp2040/raspberrypi-pico-w/src/rp2040_reset.c   |  61 ++
 .../arm/rp2040/raspberrypi-pico-w/src/rp2040_spi.c | 150 ++++
 .../raspberrypi-pico/configs/lcd1602/defconfig     |  19 +-
 .../raspberrypi-pico/src/rp2040_boardinitialize.c  | 105 +--
 .../rp2040/raspberrypi-pico/src/rp2040_bringup.c   | 501 +------------
 boards/boardctl.c                                  |   2 +-
 drivers/wireless/ieee80211/bcm43xxx/bcmf_cdc.c     |   2 +-
 drivers/wireless/ieee80211/bcm43xxx/bcmf_gspi.c    |   4 +-
 .../wireless/ieee80211/bcm43xxx/cyw_chip_43439.c   |  33 +-
 108 files changed, 3948 insertions(+), 2997 deletions(-)

diff --git a/Documentation/platforms/arm/rp2040/boards/raspberrypi-pico-w/RaspberryPiPicoW.png b/Documentation/platforms/arm/rp2040/boards/raspberrypi-pico-w/RaspberryPiPicoW.png
new file mode 100644
index 0000000000..c261236a8b
Binary files /dev/null and b/Documentation/platforms/arm/rp2040/boards/raspberrypi-pico-w/RaspberryPiPicoW.png differ
diff --git a/Documentation/platforms/arm/rp2040/boards/raspberrypi-pico/index.rst b/Documentation/platforms/arm/rp2040/boards/raspberrypi-pico-w/index.rst
similarity index 73%
copy from Documentation/platforms/arm/rp2040/boards/raspberrypi-pico/index.rst
copy to Documentation/platforms/arm/rp2040/boards/raspberrypi-pico-w/index.rst
index 69aed30a0d..b72b96b42d 100644
--- a/Documentation/platforms/arm/rp2040/boards/raspberrypi-pico/index.rst
+++ b/Documentation/platforms/arm/rp2040/boards/raspberrypi-pico-w/index.rst
@@ -3,9 +3,9 @@ Raspberry Pi Pico
 ===============================
 
 The `Raspberry Pi Pico <https://www.raspberrypi.com/products/raspberry-pi-pico/>`_ is a general purpose board supplied by
-the Raspberry Pi Foundation.
+the Raspberry Pi Foundation.  The W variant adds built in WiFi communications.
 
-.. figure:: RaspberryPiPico.png
+.. figure:: RaspberryPiPicoW.png
    :align: center
 
 Features
@@ -24,6 +24,7 @@ Features
 * Temperature sensor
 * Accelerated floating point libraries on-chip
 * 8 × Programmable IO (PIO) state machines for custom peripheral support
+* Built in WiFi radio (Infineon CYW43439)
 
 Serial Console
 ==============
@@ -36,20 +37,25 @@ The board can be configured to use the USB connection as the serial console.
 Buttons and LEDs
 ================
 
-User LED controlled by GPIO25.
+LED controlled by GPIO0 of the wireless chip (not the RP2040 processor).
 
 A BOOTSEL button, which if held down when power is first
-applied to the board, the cause the RP2040 to boot programming mode 
-and appear to a computer connected via USB as a storage device.  
-Saving a .UF2 file to this device will replace the Flash ROM contents 
+applied to the board, will cause the RP2040 to boot into programming
+mode and appear  as a storage device to a computer connected via USB.
+Saving a .UF2 file to this device will replace the Flash ROM contents
 on the RP2040.
 
+Wireless Communication
+======================
+
+The on board Infineon CYW43439 supports 2.4 GHz WiFi 4 communications
+(802.11n), WPS3 and SoftAP with up to four clients.
+
 Pin Mapping
 ===========
-Pads numbered anticlockwise from USB connector.
 
 ===== ========== ==========
-Pad   Signal     Notes
+Pin   Signal     Notes
 ===== ========== ==========
 1     GPIO0      Default TX for UART0 serial console
 2     GPIO1      Default RX for UART1 serial console
@@ -83,19 +89,42 @@ Pad   Signal     Notes
 30    Run
 31    GPIO26     ADC0
 32    GPIO27     ADC1
-33    AGND       Analog Ground 
+33    AGND       Analog Ground
 34    GPIO28     ADC2
 35    ADC_VREF
 36    3V3        Power output to peripherals
-37    3V3_EN     Pull to ground to turn off. 
+37    3V3_EN     Pull to ground to turn off.
 38    Ground
 39    VSYS       +5V Supply to board
 40    VBUS       Connected to USB +5V
 ===== ========== ==========
 
+Other RP2040 Pins
+=================
+
+GPIO23 Output - WiFi controller enable.
+GPIO24 I/O    - WiFi controller data line.
+GPIO25 Output - WiFi controller chip select line.
+GPIO29 Output - WiFi controller clock line.
+ADC3   Input  - Analog voltage equal to one third of VSys voltage.
+
+Note: ADC3 and GPIO29 share the same pin on the RP2040. If the
+GPIO25 line is held high (Wifi controller NOT selected) then a voltage
+equal to one third of the VSys voltage with appear on this line and
+can be read with ADC3.  When the WiFi chip is selected this voltage
+will be removed so the line can be used as a clock for data exchange
+with the WiFi controller.
+
 Separate pins for the Serial Debug Port (SDB) are available
 
-Power Supply 
+WiFi Controller GPIO
+====================
+
+GPIO0 - Output - On board LED.
+GPIO1 - Output - Power supply control.
+GPIO2 - Input  - High if USB port or Pad 40 supplying power.
+
+Power Supply
 ============
 
 The Raspberry Pi Pico can be powered via the USB connector,
@@ -108,9 +137,9 @@ by an onboard voltage regulator.  This regulator can be disabled
 by pulling pin 37 to ground.
 
 The regulator can run in two modes.  By default the regulator runs
-in PFM mode which provides the best efficiency, but may be 
+in PFM mode which provides the best efficiency, but may be
 switched to PWM mode for improved ripple by outputting a one
-on GPIO23. 
+on the wireless chip's GPIO1 (not the RP2040's GPIO1).
 
 Configurations
 ==============
diff --git a/Documentation/platforms/arm/rp2040/boards/raspberrypi-pico/index.rst b/Documentation/platforms/arm/rp2040/boards/raspberrypi-pico/index.rst
index 69aed30a0d..f4585c6e66 100644
--- a/Documentation/platforms/arm/rp2040/boards/raspberrypi-pico/index.rst
+++ b/Documentation/platforms/arm/rp2040/boards/raspberrypi-pico/index.rst
@@ -39,9 +39,9 @@ Buttons and LEDs
 User LED controlled by GPIO25.
 
 A BOOTSEL button, which if held down when power is first
-applied to the board, the cause the RP2040 to boot programming mode 
-and appear to a computer connected via USB as a storage device.  
-Saving a .UF2 file to this device will replace the Flash ROM contents 
+applied to the board, will cause the RP2040 to boot into programming
+mode and appear as a storage device to a computer connected via USB .
+Saving a .UF2 file to this device will replace the Flash ROM contents
 on the RP2040.
 
 Pin Mapping
@@ -83,19 +83,27 @@ Pad   Signal     Notes
 30    Run
 31    GPIO26     ADC0
 32    GPIO27     ADC1
-33    AGND       Analog Ground 
+33    AGND       Analog Ground
 34    GPIO28     ADC2
 35    ADC_VREF
 36    3V3        Power output to peripherals
-37    3V3_EN     Pull to ground to turn off. 
+37    3V3_EN     Pull to ground to turn off.
 38    Ground
 39    VSYS       +5V Supply to board
 40    VBUS       Connected to USB +5V
 ===== ========== ==========
 
+Other RP2040 Pins
+=================
+
+GPIO23 Output - Power supply control.
+GPIO24 Input  - High if USB port or Pad 40 supplying power.
+GPIO25 Output - On board LED.
+ADC3   Input  - Analog voltage equal to one third of VSys voltage.
+
 Separate pins for the Serial Debug Port (SDB) are available
 
-Power Supply 
+Power Supply
 ============
 
 The Raspberry Pi Pico can be powered via the USB connector,
@@ -108,9 +116,9 @@ by an onboard voltage regulator.  This regulator can be disabled
 by pulling pin 37 to ground.
 
 The regulator can run in two modes.  By default the regulator runs
-in PFM mode which provides the best efficiency, but may be 
+in PFM mode which provides the best efficiency, but may be
 switched to PWM mode for improved ripple by outputting a one
-on GPIO23. 
+on GPIO23.
 
 Configurations
 ==============
diff --git a/arch/arm/src/rp2040/Kconfig b/arch/arm/src/rp2040/Kconfig
index 00380ea430..8e19f13aa0 100644
--- a/arch/arm/src/rp2040/Kconfig
+++ b/arch/arm/src/rp2040/Kconfig
@@ -392,7 +392,7 @@ if RP2040_PWM
 	if RP2040_PWM3
 
 		config RP2040_PWM3A_GPIO
-			
+
 		config RP2040_PWM3A_INVERT
 			bool "PWM3 channel 1 invert"
 			default n
@@ -425,7 +425,7 @@ if RP2040_PWM
 			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
@@ -458,7 +458,7 @@ if RP2040_PWM
 			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
@@ -491,7 +491,7 @@ if RP2040_PWM
 			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
@@ -524,7 +524,7 @@ if RP2040_PWM
 			See the Board Selection menu to configure the pins used by I2C0.
 
 	if RP2040_PWM7
-			
+
 		config RP2040_PWM7A_INVERT
 			bool "PWM7 channel 1 invert"
 			default n
@@ -550,7 +550,7 @@ if RP2040_PWM
 			default n
 
 	endif # RP2040_PWM7
-			
+
 endif # RP2040_PWM
 
 #####################################################################
@@ -591,7 +591,7 @@ if RP2040_I2S
 		range 0 3
 
 endif
-		
+
 #####################################################################
 #  I2S Configuration
 #####################################################################
@@ -672,11 +672,11 @@ if RP2040_ADC
 			---help---
 				If y, then the ADC chip temperature
 				will be read.
-		
+
 	endif # ADC
 
 endif # RP2040_ADC
-		
+
 #####################################################################
 #  WS2812 Configuration
 #####################################################################
@@ -685,6 +685,7 @@ config RP2040_BOARD_HAS_WS2812
 	bool "Has ws2812 pixels"
 	default n
 	depends on WS2812
+	select WS2812_NON_SPI_DRIVER
 	---help---
 		See the Board Selection menu to configure the pins used
 		by ws2812.
diff --git a/arch/arm/src/rp2040/Make.defs b/arch/arm/src/rp2040/Make.defs
index f3533f0077..e950476ed3 100644
--- a/arch/arm/src/rp2040/Make.defs
+++ b/arch/arm/src/rp2040/Make.defs
@@ -82,4 +82,9 @@ ifeq ($(CONFIG_RP2040_FLASH_BOOT),y)
 ifneq ($(PICO_SDK_PATH),)
 include chip/boot2/Make.defs
 endif
+
+ifeq ($(CONFIG_IEEE80211_INFINEON_CYW43439),y)
+CHIP_CSRCS += rp2040_cyw43439.c
+endif
+
 endif
diff --git a/arch/arm/src/rp2040/hardware/rp2040_pads_bank0.h b/arch/arm/src/rp2040/hardware/rp2040_pads_bank0.h
index 588abd6a2a..1e3b068ea3 100644
--- a/arch/arm/src/rp2040/hardware/rp2040_pads_bank0.h
+++ b/arch/arm/src/rp2040/hardware/rp2040_pads_bank0.h
@@ -69,11 +69,11 @@
 #define RP2040_PADS_BANK0_GPIO_OD             (1 << 7)  /* Output disable. Has priority over output enable from peripherals */
 #define RP2040_PADS_BANK0_GPIO_IE             (1 << 6)  /* Input enable */
 #define RP2040_PADS_BANK0_GPIO_DRIVE_SHIFT    (4)       /* Drive strength. */
-#define RP2040_PADS_BANK0_GPIO_DRIVE_MASK     (0x03 << RP2040_PADS_BANK0_GPIO0_DRIVE_SHIFT)
-#define RP2040_PADS_BANK0_GPIO_DRIVE_2MA      (0x0 << RP2040_PADS_BANK0_GPIO0_DRIVE_SHIFT)
-#define RP2040_PADS_BANK0_GPIO_DRIVE_4MA      (0x1 << RP2040_PADS_BANK0_GPIO0_DRIVE_SHIFT)
-#define RP2040_PADS_BANK0_GPIO_DRIVE_8MA      (0x2 << RP2040_PADS_BANK0_GPIO0_DRIVE_SHIFT)
-#define RP2040_PADS_BANK0_GPIO_DRIVE_12MA     (0x3 << RP2040_PADS_BANK0_GPIO0_DRIVE_SHIFT)
+#define RP2040_PADS_BANK0_GPIO_DRIVE_MASK     (0x03 << RP2040_PADS_BANK0_GPIO_DRIVE_SHIFT)
+#define RP2040_PADS_BANK0_GPIO_DRIVE_2MA      (0x0 << RP2040_PADS_BANK0_GPIO_DRIVE_SHIFT)
+#define RP2040_PADS_BANK0_GPIO_DRIVE_4MA      (0x1 << RP2040_PADS_BANK0_GPIO_DRIVE_SHIFT)
+#define RP2040_PADS_BANK0_GPIO_DRIVE_8MA      (0x2 << RP2040_PADS_BANK0_GPIO_DRIVE_SHIFT)
+#define RP2040_PADS_BANK0_GPIO_DRIVE_12MA     (0x3 << RP2040_PADS_BANK0_GPIO_DRIVE_SHIFT)
 #define RP2040_PADS_BANK0_GPIO_PUE            (1 << 3)  /* Pull up enable */
 #define RP2040_PADS_BANK0_GPIO_PDE            (1 << 2)  /* Pull down enable */
 #define RP2040_PADS_BANK0_GPIO_SCHMITT        (1 << 1)  /* Enable schmitt trigger */
diff --git a/arch/arm/src/rp2040/hardware/rp2040_pio.h b/arch/arm/src/rp2040/hardware/rp2040_pio.h
index 7e9a523490..f797e2ad1b 100644
--- a/arch/arm/src/rp2040/hardware/rp2040_pio.h
+++ b/arch/arm/src/rp2040/hardware/rp2040_pio.h
@@ -207,6 +207,9 @@
 #define RP2040_PIO_FLEVEL_TX0_SHIFT                 (0)
 #define RP2040_PIO_FLEVEL_TX0_MASK                  (0x0f)
 
+#define RP2040_PIO_FLEVEL_TX_MASK(n)                (0x0f << 8*n)
+#define RP2040_PIO_FLEVEL_RX_MASK(n)                (0xf0 << 8*n)
+
 #define RP2040_PIO_IRQ_MASK                         (0xff)
 
 #define RP2040_PIO_IRQ_FORCE_MASK                   (0xff)
diff --git a/arch/arm/src/rp2040/rp2040_cyw43439.c b/arch/arm/src/rp2040/rp2040_cyw43439.c
new file mode 100644
index 0000000000..3c95f5444d
--- /dev/null
+++ b/arch/arm/src/rp2040/rp2040_cyw43439.c
@@ -0,0 +1,832 @@
+/****************************************************************************
+ * arch/arm/src/rp2040/rp2040_cyw43439.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 <stdio.h>
+#include <debug.h>
+#include <errno.h>
+
+#include <nuttx/kmalloc.h>
+#include <nuttx/wireless/ieee80211/bcmf_gspi.h>
+
+#include "rp2040_cyw43439.h"
+#include "rp2040_pio.h"
+#include "rp2040_pio_instructions.h"
+
+#ifdef CONFIG_NDEBUG
+#  define PRINT_GSPI(block)
+#else
+void bcmf_hexdump(uint8_t *data, unsigned int len, unsigned long offset);
+bool  g_print_gspi = false;
+#  define PRINT_GSPI(block) if (g_print_gspi) { block }
+#endif
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
+#define GSPI_CLOCK_FREQ 31250000  /* Hz  (Max: 50MHz) */
+
+#define PIO_WRAP_TARGET 0
+#define PIO_WRAP        5
+
+#define TX_FIFO_SIZE    4
+
+/****************************************************************************
+ * Private Type Definitions
+ ****************************************************************************/
+
+typedef struct dma_info_s
+{
+  sem_t         sem;
+  uint8_t       status;
+} dma_info_t;
+
+/****************************************************************************
+ * Private Data
+ ****************************************************************************/
+
+/* This is the PIO program to write and then read from the data pin.
+ *
+ * The X register is the output bit count register.  It should be set
+ * to one less than the total number of BITS to be transmitted.
+ *
+ * The Y register is the input bit count register.  It too must be set
+ * to one less thant the total number of bits to be read.
+ *
+ * The PIO's state machine is set up to auto-pull data from the input
+ * fifo whenever the output shift register is empty.  This happens at
+ * the start and every 32 bits thereafter.
+ *
+ * The state machine also auto-pushes whenever we have a full 32 bits
+ * in the input shift register.  To make sure we receive all the data,
+ * we need to make sure that the read bit count is a multiple of 32.
+ * (Y = 32*N - 1  for some integer N)
+ */
+
+static const uint16_t cyw_program_instructions[] =
+{
+  0x6001, /* 0: out  pins, 1     side 0 # Write one bit                  */
+  0x1040, /* 1: jmp  x--, 0      side 1 # Loop until write count is zero */
+  0xe080, /* 2: set  pindirs, 0  side 0 # Make data pin an input         */
+  0xb042, /* 3: nop              side 1 # Keep clock in sync             */
+  0x4001, /* 4: in   pins, 1     side 0 # Read 1 bit                     */
+  0x1084, /* 5: jmp  y--, 4      side 1 # Loop until read count is zero  */
+};
+
+static const rp2040_pio_program_t pio_program =
+{
+  .instructions = cyw_program_instructions,
+  .length       = 6,    /* Six, count 'em, six.    */
+  .origin       = -1,   /* Put it wherever it fits */
+};
+
+/****************************************************************************
+ * Private Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: dma_complete
+ *
+ * Description:
+ *   Called on completion of the DMA transfer.
+ *
+ * Input Parameters:
+ *   handle - handle to our DMA channel
+ *   status - status of the transfer
+ *   arg    - Pointer to dma info structure.
+ *
+ ****************************************************************************/
+
+static void dma_complete(DMA_HANDLE handle, uint8_t status, void *arg)
+{
+  FAR dma_info_t *dma_info = arg;
+
+  /* Remember the status and post the dma complete event. */
+
+  dma_info->status = status;
+  nxsem_post(&(dma_info->sem));
+}
+
+/****************************************************************************
+ * Name: my_init
+ *
+ * Description:
+ *   Connect to and initialize the cyw43439.
+ *
+ ****************************************************************************/
+
+static int my_init(FAR gspi_dev_t  *gspi)
+{
+  FAR rp2040_gspi_t *rp_io = (FAR rp2040_gspi_t *)(gspi->io_dev);
+
+  uint32_t              divisor;
+  irqstate_t            flags;
+  rp2040_pio_sm_config  config =
+    {
+      0
+    };
+
+  /* Make sure the cyw43439 chip is deselected, and off.
+   * so we know it is reset
+   */
+
+  rp2040_gpio_put(rp_io->gpio_select, true);  /* deselect  */
+  rp2040_gpio_put(rp_io->gpio_on, false);     /* power off */
+
+  /* Pull the data line low so that we initialise to gSPI mode */
+
+  rp2040_gpio_init(rp_io->gpio_data);
+  rp2040_gpio_setdir(rp_io->gpio_data, true);
+  rp2040_gpio_put(rp_io->gpio_data, false);
+
+  usleep(50000); /* Leave off for at least 50ms. */
+
+  rp2040_gpio_put(rp_io->gpio_on, true);     /* power on */
+
+  usleep(50000); /* Wait a bit to let the power come up. */
+
+  /* Don't let anyone else grab a PIO while we are doing so. */
+
+  flags = enter_critical_section();
+
+  /* Find a PIO instance and load program. */
+
+  for (rp_io->pio = 0; rp_io->pio < RP2040_PIO_NUM; ++rp_io->pio)
+    {
+      /* Try to claim a state machine. */
+
+      rp_io->pio_sm = rp2040_pio_claim_unused_sm(rp_io->pio, false);
+
+      /* If we did not get one try the next pio block, if any. */
+
+      if (rp_io->pio_sm < 0) continue;
+
+      /* See if we have space in this block to load our program. */
+
+      if (rp2040_pio_can_add_program(rp_io->pio, &pio_program))
+        {
+          /* Great! load the program and exit the pio choice loop. */
+
+          rp_io->pio_location = rp2040_pio_add_program(rp_io->pio,
+                                                      &pio_program);
+
+          break;
+        }
+
+      /* Oops -- no room at the inn!  Release sm and try next pio. */
+
+      rp2040_pio_sm_unclaim(rp_io->pio, rp_io->pio_sm);
+    }
+
+  if (rp_io->pio >= RP2040_PIO_NUM)
+    {
+      leave_critical_section(flags);
+      return -ENOMEM;
+    }
+
+  leave_critical_section(flags);
+
+  /* ==== Configure the PIO State Machine ==== */
+
+  /* Configure pins that are used by PIO. */
+
+  rp2040_pio_gpio_init(rp_io->pio, rp_io->gpio_data);
+  rp2040_pio_gpio_init(rp_io->pio, rp_io->gpio_clock);
+
+  rp2040_gpio_set_input_hysteresis_enabled(rp_io->gpio_data, true);
+
+  rp2040_gpio_set_slew_fast(rp_io->gpio_clock, true);
+  rp2040_gpio_set_drive_strength(rp_io->gpio_clock,
+                                 RP2040_PADS_BANK0_GPIO_DRIVE_12MA);
+
+  /* Set the clock divisor as appropriate for our system clock
+   * speed, so the pio clock runs the requested bit clock rate.
+   */
+
+  divisor = ((uint64_t)BOARD_SYS_FREQ << 8) / (2 * GSPI_CLOCK_FREQ);
+
+  rp2040_sm_config_set_clkdiv_int_frac(&config,
+                                       divisor >> 8,
+                                       divisor & 0xff);
+
+  /* Set the wrap points as required by the program. */
+
+  rp2040_sm_config_set_wrap(&config,
+                            rp_io->pio_location + PIO_WRAP_TARGET,
+                            rp_io->pio_location + PIO_WRAP);
+
+  /* set to shift left, 32 bits, with autopull/push  */
+
+  rp2040_sm_config_set_in_shift(&config, false, true, 32);
+  rp2040_sm_config_set_out_shift(&config, false, true, 32);
+
+  /* Configure a single mandatory side-set pin. */
+
+  rp2040_sm_config_set_sideset(&config, 1, false, false);
+
+  /* Configure our GPIO clock pin as side-set output. */
+
+  rp2040_sm_config_set_sideset_pins(&config, rp_io->gpio_clock);
+
+  /* Configure out GPIO data pin as an OUT pin, SET pin, and IN pin */
+
+  rp2040_sm_config_set_out_pins(&config, rp_io->gpio_data, 1);
+  rp2040_sm_config_set_set_pins(&config, rp_io->gpio_data, 1);
+  rp2040_sm_config_set_in_pins (&config, rp_io->gpio_data);
+
+  /* Load the configuration into the state machine. */
+
+  rp2040_pio_sm_init(rp_io->pio,
+                     rp_io->pio_sm,
+                     rp_io->pio_location,
+                     &config);
+
+  /* Disable the input synchronizers on the data pin */
+
+  rp2040_pio_set_input_sync_bypass(rp_io->pio, rp_io->gpio_data, true);
+
+  wlinfo("finished\n");
+
+  return OK;
+}
+
+/****************************************************************************
+ * Name: my_set_isr
+ *
+ * Description:
+ *   Setup the data line interrupt service routine.
+ *
+ ****************************************************************************/
+
+static int my_set_isr(FAR gspi_dev_t  *gspi,
+                      xcpt_t           thread_isr,
+                      FAR void        *thread_isr_arg)
+{
+  FAR rp2040_gspi_t *rp_io = (FAR rp2040_gspi_t *)(gspi->io_dev);
+
+  /* Set up, but do not enable, interrupt service for the data pin */
+
+  rp2040_gpio_irq_attach(rp_io->gpio_intr,
+                         RP2040_GPIO_INTR_LEVEL_HIGH,
+                         thread_isr,
+                         thread_isr_arg);
+
+  wlinfo("attached\n");
+
+  return OK;
+}
+
+/****************************************************************************
+ * Name: my_interrupt_enable
+ *
+ * Description:
+ *   Setup the data line isr.
+ *
+ ****************************************************************************/
+
+static int my_interrupt_enable(FAR gspi_dev_t  *gspi,
+                               bool             enable)
+{
+  FAR rp2040_gspi_t *rp_io         = (FAR rp2040_gspi_t *)(gspi->io_dev);
+  static int         disable_count = 0;
+
+  if (enable)
+    {
+      if (--disable_count <= 0) rp2040_gpio_enable_irq(rp_io->gpio_intr);
+    }
+  else
+    {
+      rp2040_gpio_disable_irq(rp_io->gpio_intr);
+      ++disable_count;
+    }
+
+  return OK;
+}
+
+/****************************************************************************
+ * Name: my_deinit
+ *
+ * Description:
+ *   Disconnect from cyw43439 and cleanup.
+ *
+ ****************************************************************************/
+
+static int my_deinit(FAR gspi_dev_t *gspi)
+{
+  FAR rp2040_gspi_t *rp_io = (FAR rp2040_gspi_t *)(gspi->io_dev);
+
+  rp2040_gpio_irq_attach(rp_io->gpio_data,
+                         RP2040_GPIO_INTR_EDGE_LOW,
+                         NULL,
+                         NULL);
+
+  rp2040_pio_sm_set_enabled(rp_io->pio, rp_io->pio_sm, false);
+  rp2040_pio_remove_program(rp_io->pio, &pio_program, rp_io->pio_location);
+  rp2040_pio_sm_unclaim(rp_io->pio, rp_io->pio_sm);
+
+  /* Turn the power off to the cyw43439. */
+
+  rp2040_gpio_put(rp_io->gpio_on, false);
+
+  return OK;
+}
+
+/****************************************************************************
+ * Name: my_write
+ *
+ * Description:
+ *   write data to the cyw43439
+ *
+ ****************************************************************************/
+
+static int my_write(FAR struct gspi_dev_s  *gspi,
+                    bool                    increment,
+                    enum gspi_cmd_func_e    function,
+                    uint32_t                address,
+                    uint16_t                length,
+                    FAR const uint32_t     *data)
+{
+  FAR rp2040_gspi_t *rp_io      = (FAR rp2040_gspi_t *)(gspi->io_dev);
+  dma_info_t         dma_info;
+  DMA_HANDLE         xfer_dma   = rp2040_dmachannel();
+  uint32_t           command    =    (0x1                  << 31)
+                                   | ((increment ? 1 : 0)  << 30)
+                                   | ((function & 0x3)     << 28)
+                                   | ((address  & 0x1ffff) << 11)
+                                   | (length    & 0x7ff);
+
+  dma_config_t       dma_config =
+    {
+      .size   = RP2040_DMA_SIZE_WORD,
+      .noincr = false,
+      .dreq   = rp2040_pio_get_dreq(rp_io->pio,
+                                    rp_io->pio_sm,
+                                    true),
+    };
+
+  PRINT_GSPI(
+    printf("------ cmd: 0x%08lx [W %d %d 0x%05lX %d]\n", command,
+                                                         increment,
+                                                         function,
+                                                         address,
+                                                         length);
+    bcmf_hexdump((void *)data, length, (uint32_t)data);
+  )
+
+  /* Claim the exclusive lock */
+
+  nxsem_wait(&gspi->exclsem);
+
+  /* Reset the PIO state machine just to be sure. */
+
+  rp2040_pio_sm_set_enabled(rp_io->pio, rp_io->pio_sm, false);
+
+  rp2040_pio_sm_clear_fifos(rp_io->pio, rp_io->pio_sm);
+
+  rp2040_pio_sm_restart(rp_io->pio, rp_io->pio_sm);
+
+  rp2040_pio_sm_clkdiv_restart(rp_io->pio, rp_io->pio_sm);
+
+  rp2040_pio_sm_exec(rp_io->pio,
+                     rp_io->pio_sm,
+                     pio_encode_jmp(rp_io->pio_location));
+
+  /* Set the PIO X (tx bit len) and Y (rx bit len) registers.
+   * This is slightly magical.  The way we load the X is to first
+   * push the the number of bits to transmit onto the transmit fifo.
+   * Then we force the PIO state machine to execute the instruction
+   * "out x, 32" which transfers the word from the output shift
+   * register (OSR) to the X register.  When this instruction executes
+   * the PIO will notice the the OSR is empty, so will automatically
+   * pull a value (the one we just added) from the input fifo.
+   *
+   * Loading the Y works the same way, except we round the number of
+   * bits up to a multiple of 32, so the pio program will be sure to
+   * autopush the final data to the output fifo.
+   */
+
+  rp2040_pio_sm_put(rp_io->pio, rp_io->pio_sm, 32 * ((length + 3) / 4) + 31);
+  rp2040_pio_sm_exec(rp_io->pio, rp_io->pio_sm, pio_encode_out(pio_x, 32));
+
+  rp2040_pio_sm_put(rp_io->pio, rp_io->pio_sm, 0);
+  rp2040_pio_sm_exec(rp_io->pio, rp_io->pio_sm, pio_encode_out(pio_y, 32));
+
+  /* Disable interrupts so data won't trigger interrupt. */
+
+  my_interrupt_enable(gspi, false);
+
+  /* Make sure the clock and data pins direction set to output. */
+
+  rp2040_pio_sm_set_pindirs_with_mask(rp_io->pio,
+                                      rp_io->pio_sm,
+                                        (1 << rp_io->gpio_data)
+                                      | (1 << rp_io->gpio_clock),
+                                        (1 << rp_io->gpio_data)
+                                      | (1 << rp_io->gpio_clock));
+
+  /* Make sure there is nothing in the fifos before starting DMA. */
+
+  rp2040_pio_sm_clear_fifos(rp_io->pio, rp_io->pio_sm);
+
+  /* Load the command into the transmit fifo. */
+
+  if (function == gspi_f0_bus_rev16)
+    {
+      __asm ("rev16 %0, %0" : "+l" (command) : :);
+    }
+
+  __asm ("rev %0, %0" : "+l" (command) : :);
+
+  putreg32(command, RP2040_PIO_TXF(rp_io->pio, rp_io->pio_sm));
+
+  /* Initialize and start the transmit DMA.  It will
+   * keep adding data to the TX_FIFO until all data is sent.
+   */
+
+  nxsem_init(&dma_info.sem, 0, 0);
+
+  rp2040_dmastop(xfer_dma);
+
+  rp2040_txdmasetup(xfer_dma,
+                    (uintptr_t) RP2040_PIO_TXF(rp_io->pio,
+                                                rp_io->pio_sm),
+                    (uintptr_t) data,
+                    (length + 3) & 0xfffffffc,
+                    dma_config);
+
+  modifyreg32(rp2040_dma_register(xfer_dma,
+                                  RP2040_DMA_CTRL_TRIG_OFFSET),
+                                  RP2040_DMA_CTRL_TRIG_BSWAP,
+                                  RP2040_DMA_CTRL_TRIG_BSWAP);
+
+  rp2040_dmastart(xfer_dma, dma_complete, &dma_info);
+
+  /* Assert gpio_select by pulling line low */
+
+  rp2040_gpio_put(rp_io->gpio_select, false);
+
+  /* Enable the state machine.  This starts the pio program running */
+
+  rp2040_pio_sm_set_enabled(rp_io->pio, rp_io->pio_sm, true);
+
+  /* Wait for transfer to complete */
+
+  nxsem_wait(&dma_info.sem);
+
+  /* Un-assert select by pulling line high. */
+
+  rp2040_gpio_put(rp_io->gpio_select, true);
+
+  /* Free the DMA controller */
+
+  rp2040_dmafree(xfer_dma);
+  nxsem_destroy(&dma_info.sem);
+
+  /* Disable the PIO */
+
+  rp2040_pio_sm_set_enabled(rp_io->pio, rp_io->pio_sm, false);
+
+  /* At this point the data pin is input so it should be pulled high */
+
+  my_interrupt_enable(gspi, true);
+
+  /* Release the exclusive lock */
+
+  nxsem_post(&gspi->exclsem);
+
+  return dma_info.status;
+}
+
+/****************************************************************************
+ * Name: my_read
+ *
+ * Description:
+ *   read data to the cyw43439
+ *
+ ****************************************************************************/
+
+static int my_read(FAR struct gspi_dev_s  *gspi,
+                   bool                    increment,
+                   enum gspi_cmd_func_e    function,
+                   uint32_t                address,
+                   uint16_t                length,
+                   FAR uint32_t           *buffer)
+{
+  FAR rp2040_gspi_t *rp_io      = (FAR rp2040_gspi_t *)(gspi->io_dev);
+  dma_info_t         dma_info;
+  DMA_HANDLE         xfer_dma   = rp2040_dmachannel();
+  DMA_HANDLE         ctrl_dma   = rp2040_dmachannel();
+  uint32_t           temp_word;
+  uint32_t           bit_length;
+  uint32_t           command    =    ((increment ? 1 : 0) << 30)
+                                   | ((function & 0x3)    << 28)
+                                   | ((address & 0x1ffff) << 11)
+                                   | (length & 0x7ff);
+
+  uint32_t           pacing = rp2040_pio_get_dreq(rp_io->pio,
+                                                  rp_io->pio_sm,
+                                                  false);
+
+  dma_control_block_t ctrl_blks[] =
+    {
+      /* For F1 transfers we read 1 word that we throw away */
+
+        {
+          rp2040_dma_ctrl_blk_ctrl(ctrl_dma,
+                                    RP2040_DMA_SIZE_WORD,
+                                    pacing,
+                                    0),
+          (uintptr_t) RP2040_PIO_RXF(rp_io->pio, rp_io->pio_sm),
+          (uintptr_t) &temp_word,
+          1,
+        },
+
+      /* Read requested data into output buffer */
+
+        {
+          rp2040_dma_ctrl_blk_ctrl(ctrl_dma,
+                                    RP2040_DMA_SIZE_WORD,
+                                    pacing,
+                                      RP2040_DMA_CTRL_TRIG_INCR_WRITE
+                                    | RP2040_DMA_CTRL_TRIG_BSWAP),
+          (uintptr_t) RP2040_PIO_RXF(rp_io->pio, rp_io->pio_sm),
+          (uintptr_t) buffer,
+          (length + 3) / 4,
+        },
+
+      RP2040_DMA_CTRL_BLOCK_END
+    };
+
+  PRINT_GSPI(
+    printf("------ cmd: 0x%08lx [R %d %d 0x%05lX %d]\n", command,
+                                                         increment,
+                                                         function,
+                                                         address,
+                                                         length);
+  )
+
+  /* Claim the exclusive lock */
+
+  nxsem_wait(&gspi->exclsem);
+
+  /* Reset the PIO state machine just to be sure. */
+
+  rp2040_pio_sm_set_enabled(rp_io->pio, rp_io->pio_sm, false);
+
+  rp2040_pio_sm_clear_fifos(rp_io->pio, rp_io->pio_sm);
+
+  rp2040_pio_sm_restart(rp_io->pio, rp_io->pio_sm);
+
+  rp2040_pio_sm_clkdiv_restart(rp_io->pio, rp_io->pio_sm);
+
+  rp2040_pio_sm_exec(rp_io->pio,
+                     rp_io->pio_sm,
+                     pio_encode_jmp(rp_io->pio_location));
+
+  /* Set the PIO X (tx bit len) and Y (rx bit len) registers.
+   * This is slightly magical.  The way we load the X is to first
+   * push the the number of bits to transmit onto the transmit fifo.
+   * Then we force the PIO state machine to execute the instruction
+   * "out x, 32" which transfers the word from the output shift
+   * register (OSR) to the X register.  When this instruction executes
+   * the PIO will notice the the OSR is empty, so will automatically
+   * pull a value (the one we just added) from the input fifo.
+   *
+   * Loading the Y works the same way, except we round the number of
+   * bits up to a multiple of 32, so the pio program will be sure to
+   * autopush the final data to the output fifo.
+   */
+
+  rp2040_pio_sm_put(rp_io->pio, rp_io->pio_sm, 31);
+  rp2040_pio_sm_exec(rp_io->pio, rp_io->pio_sm, pio_encode_out(pio_x, 32));
+
+  /* RX bit length is 32 bits for each 4 bytes requested
+   * plus 32 bits for status
+   */
+
+  bit_length = 32 * ((length + 3) / 4);
+
+  /* For F1 reads and 32 bits for delay */
+
+  if (function == gspi_f1_backplane) bit_length += 32;
+
+  rp2040_pio_sm_put(rp_io->pio, rp_io->pio_sm, bit_length);
+  rp2040_pio_sm_exec(rp_io->pio, rp_io->pio_sm, pio_encode_out(pio_y, 32));
+
+  /* Disable interrupts so data won't trigger interrupt. */
+
+  my_interrupt_enable(gspi, false);
+
+  /* Make sure the clock and data pins direction set to output. */
+
+  rp2040_pio_sm_set_pindirs_with_mask(rp_io->pio,
+                                      rp_io->pio_sm,
+                                        (1 << rp_io->gpio_data)
+                                      | (1 << rp_io->gpio_clock),
+                                        (1 << rp_io->gpio_data)
+                                      | (1 << rp_io->gpio_clock));
+
+  /* Make sure there is nothing in the fifos before starting DMA. */
+
+  rp2040_pio_sm_clear_fifos(rp_io->pio, rp_io->pio_sm);
+
+  /* Load the command into the transmit fifo. */
+
+  if (function == gspi_f0_bus_rev16)
+    {
+      __asm ("rev16 %0, %0" : "+l" (command) : :);
+    }
+
+  __asm ("rev %0, %0" : "+l" (command) : :);
+
+  putreg32(command, RP2040_PIO_TXF(rp_io->pio, rp_io->pio_sm));
+
+  /* Initialize and start the control DMA.  It will
+   * use the xfer_dma to transfer data from the chip.
+   */
+
+  nxsem_init(&dma_info.sem, 0, 0);
+
+  rp2040_dmastop(ctrl_dma);
+  rp2040_dmastop(xfer_dma);
+
+  /* Check the function bits if the command word to see if
+   * this is an F1 read.  If it is we throw away the first
+   * four bytes read as this is a delay word.
+   */
+
+  rp2040_ctrl_dmasetup(ctrl_dma,
+                       xfer_dma,
+                       &ctrl_blks[function == 1 ? 0 : 1],
+                       dma_complete,
+                       &dma_info);
+
+  rp2040_dmastart(ctrl_dma, NULL, NULL);
+
+  /* Assert gpio_select by pulling line low */
+
+  rp2040_gpio_put(rp_io->gpio_select, false);
+
+  /* Enable the state machine.  This starts the pio program running */
+
+  rp2040_pio_sm_set_enabled(rp_io->pio, rp_io->pio_sm, true);
+
+  /* Wait for transfer to complete */
+
+  nxsem_wait(&dma_info.sem);
+
+  PRINT_GSPI(
+    bcmf_hexdump((void *)buffer, length, (uint32_t)buffer);
+  )
+
+  /* Un-assert select by pulling line high. */
+
+  rp2040_gpio_put(rp_io->gpio_select, true);
+
+  /* Free the DMA controllers */
+
+  rp2040_dmafree(ctrl_dma);
+  rp2040_dmafree(xfer_dma);
+
+  nxsem_destroy(&dma_info.sem);
+
+  /* Disable the PIO */
+
+  rp2040_pio_sm_set_enabled(rp_io->pio, rp_io->pio_sm, false);
+
+  /* At this point the data pin is input so it should be pulled high */
+
+  my_interrupt_enable(gspi, true);
+
+  /* Release the exclusive lock */
+
+  nxsem_post(&gspi->exclsem);
+
+  return dma_info.status;
+}
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: rp2040_cyw_setup
+ *
+ * Description:
+ *   Initialize the cyw43439 private data and PIO communication.
+ ****************************************************************************/
+
+gspi_dev_t *rp2040_cyw_setup(uint8_t gpio_on,
+                             uint8_t gpio_select,
+                             uint8_t gpio_data,
+                             uint8_t gpio_clock,
+                             uint8_t gpio_intr)
+{
+  FAR gspi_dev_t    *gspi;
+  FAR rp2040_gspi_t *rp_io;
+  int                err;
+
+  wlinfo("entered.\n");
+
+  gspi = kmm_zalloc(sizeof(gspi_dev_t));
+
+  if (gspi == NULL)
+    {
+      set_errno(ENOMEM);
+      return NULL;
+    }
+
+  rp_io = kmm_zalloc(sizeof(rp2040_gspi_t));
+
+  if (rp_io == NULL)
+    {
+      kmm_free(gspi);
+      set_errno(ENOMEM);
+      return NULL;
+    }
+
+  gspi->init             = my_init;
+  gspi->deinit           = my_deinit;
+  gspi->set_isr          = my_set_isr;
+  gspi->interrupt_enable = my_interrupt_enable;
+  gspi->write            = my_write;
+  gspi->read             = my_read;
+  gspi->io_dev           = rp_io;
+
+  rp_io->gpio_on     = gpio_on;
+  rp_io->gpio_select = gpio_select;
+  rp_io->gpio_data   = gpio_data;
+  rp_io->gpio_clock  = gpio_clock;
+  rp_io->gpio_intr   = gpio_intr;
+
+  nxsem_init(&gspi->exclsem, 0, 1);
+
+  /* Initialize the cyw43439 power-on and chip select lines. */
+
+  rp2040_gpio_init(gpio_on);
+  rp2040_gpio_setdir(gpio_on, true);
+  rp2040_gpio_put(gpio_on, false);  /* set low to turn wifi chip off */
+
+  rp2040_gpio_init(gpio_select);
+  rp2040_gpio_setdir(gpio_select, true);
+  rp2040_gpio_put(gpio_select, true); /* set high to deselect chip */
+
+  err = bcmf_gspi_initialize(gspi);
+
+  if (err != OK)
+    {
+      kmm_free(gspi);
+      kmm_free(rp_io);
+
+      set_errno(err);
+      return NULL;
+    }
+
+  wlinfo("setup complete. gspi = 0x%08lX\n", (uint32_t) gspi);
+
+  return (FAR void *) gspi;
+}
+
+/****************************************************************************
+ * Name: rp2040_cyw_remove
+ *
+ * Description:
+ *   Deinitialize the cyw43439 PIO communication.
+ ****************************************************************************/
+
+void rp2040_cyw_remove(gspi_dev_t *gspi)
+{
+  /* gspi_deregister((FAR gspi_dev_t *)gspi); */
+}
+
+/****************************************************************************
+ * Name: bcmf_board_etheraddr
+ ****************************************************************************/
+
+bool bcmf_board_etheraddr(struct ether_addr *ethaddr)
+{
+  return false;
+}
diff --git a/arch/arm/src/rp2040/rp2040_cyw43439.h b/arch/arm/src/rp2040/rp2040_cyw43439.h
new file mode 100644
index 0000000000..8cbf7932cf
--- /dev/null
+++ b/arch/arm/src/rp2040/rp2040_cyw43439.h
@@ -0,0 +1,115 @@
+/****************************************************************************
+ * arch/arm/src/rp2040/rp2040_cyw43439.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_COMMON_INCLUDE_RP2040_CYW43439_H
+#define __BOARDS_ARM_RP2040_COMMON_INCLUDE_RP2040_CYW43439_H
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+#include <nuttx/net/netdev.h>
+
+#include <nuttx/wireless/ieee80211/bcmf_gspi.h>
+
+/****************************************************************************
+ * Public Types
+ ****************************************************************************/
+
+#ifndef __ASSEMBLY__
+
+/****************************************************************************
+ * Public Data
+ ****************************************************************************/
+
+#undef EXTERN
+#if defined(__cplusplus)
+#define EXTERN extern "C"
+extern "C"
+{
+#else
+#define EXTERN extern
+#endif
+
+/****************************************************************************
+ * Public Types
+ ****************************************************************************/
+
+typedef struct rp2040_gspi_s
+{
+  uint32_t              pio;          /* The pio instance we are using.    */
+  uint32_t              pio_sm;       /* The state machine we are using.   */
+  uint32_t              pio_location; /* the program location in the pio.  */
+  uint8_t               gpio_on;      /* Set high to power chip on         */
+  uint8_t               gpio_select;  /* Pull low to select chip           */
+  uint8_t               gpio_data;    /* Data line -- idle high            */
+  uint8_t               gpio_clock;   /* Clock line -- idle low            */
+  uint8_t               gpio_intr;    /* May be shared with data           */
+} rp2040_gspi_t;
+
+typedef struct cyw_pio_program_s
+{
+  const uint16_t *instructions;
+  uint8_t         length;
+  int8_t          origin; /* required instruction memory origin or -1 */
+} cyw_pio_program_t;
+
+/****************************************************************************
+ * Public Function Prototypes
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: rp2040_cyw_setup
+ *
+ * Description:
+ *   Initialize the cyw43439 device.
+ *
+ * Returns:
+ *   A pointer to the cyw43439 device
+ *
+ ****************************************************************************/
+
+gspi_dev_t *rp2040_cyw_setup(uint8_t gpio_on,
+                             uint8_t gpio_select,
+                             uint8_t gpio_data,
+                             uint8_t gpio_clock,
+                             uint8_t gpio_intr);
+
+/****************************************************************************
+ * Name: rp2040_cyw_remove
+ *
+ * Description:
+ *   Deinitialize the cyw43439 device.
+ *
+ * Parameters:
+ *   A pointer (as returned by rp2040_cyw_setup) to the device to remove.
+ *
+ ****************************************************************************/
+
+void rp2040_cyw_remove(FAR gspi_dev_t *dev);
+
+#undef EXTERN
+#if defined(__cplusplus)
+}
+#endif
+
+#endif /* __ASSEMBLY__ */
+#endif /* __BOARDS_ARM_RP2040_COMMON_INCLUDE_RP2040_CYW43439_H */
diff --git a/arch/arm/src/rp2040/rp2040_dmac.c b/arch/arm/src/rp2040/rp2040_dmac.c
index d43d3787dc..3d22127229 100644
--- a/arch/arm/src/rp2040/rp2040_dmac.c
+++ b/arch/arm/src/rp2040/rp2040_dmac.c
@@ -53,7 +53,6 @@ struct dma_channel_s
 {
   uint8_t        chan;          /* DMA channel number (0-RP2040_DMA_NCHANNELS) */
   bool           inuse;         /* TRUE: The DMA channel is in use */
-  dma_config_t   config;        /* Current configuration */
   dma_callback_t callback;      /* Callback invoked when the DMA completes */
   void          *arg;           /* Argument passed to callback function */
 };
@@ -334,10 +333,6 @@ void rp2040_rxdmasetup(DMA_HANDLE handle, uintptr_t paddr, uintptr_t maddr,
   DEBUGASSERT(dmach != NULL && dmach->inuse);
   ch  = dmach->chan;
 
-  /* Save the configuration (for rp2040_dmastart()). */
-
-  dmach->config = config;
-
   DEBUGASSERT(config.size >= RP2040_DMA_SIZE_BYTE &&
               config.size <= RP2040_DMA_SIZE_WORD);
 
@@ -395,10 +390,6 @@ void rp2040_txdmasetup(DMA_HANDLE handle, uintptr_t paddr, uintptr_t maddr,
   DEBUGASSERT(dmach != NULL && dmach->inuse);
   ch  = dmach->chan;
 
-  /* Save the configuration (for rp2040_dmastart()). */
-
-  dmach->config = config;
-
   DEBUGASSERT(config.size >= RP2040_DMA_SIZE_BYTE &&
               config.size <= RP2040_DMA_SIZE_WORD);
 
@@ -429,6 +420,115 @@ void rp2040_txdmasetup(DMA_HANDLE handle, uintptr_t paddr, uintptr_t maddr,
   putreg32(ctrl, RP2040_DMA_CTRL_TRIG(ch));
 }
 
+/****************************************************************************
+ * Name: rp2040_ctrl_dmasetup
+ *
+ * Description:
+ *   Configure a dma channel to send a list of channel control blocks to
+ *   a second dma channel..
+ *
+ * Input Parameters:
+ *   control   - the DMA handle that reads the control blocks.  This is
+ *               the one that should be started.
+ *   transfer  - the DMA handle the transfers data to the peripheral.
+ *   ctrl_blks - the array of control blocks to used.  Terminate this
+ *               list with an all zero control block.
+ *   callback  - callback when last transfer completes
+ *   arg       - arg to pass to callback
+ *
+ ****************************************************************************/
+
+void rp2040_ctrl_dmasetup(DMA_HANDLE           control,
+                          DMA_HANDLE           transfer,
+                          dma_control_block_t *ctrl_blks,
+                          dma_callback_t       callback,
+                          void                *arg)
+{
+  struct dma_channel_s *ctrl_dmach = (struct dma_channel_s *)control;
+  struct dma_channel_s *xfer_dmach = (struct dma_channel_s *)transfer;
+  uint32_t              ctrl_ch;
+  uint32_t              xfer_ch;
+  uint32_t              xfer_reg_addr;
+  uint32_t              ctrl;
+
+  DEBUGASSERT(ctrl_dmach && ctrl_dmach->inuse);
+  DEBUGASSERT(xfer_dmach && xfer_dmach->inuse);
+
+  ctrl_ch = ctrl_dmach->chan;
+  xfer_ch = xfer_dmach->chan;
+
+  xfer_dmach->callback = callback;
+  xfer_dmach->arg      = arg;
+
+  xfer_reg_addr = RP2040_DMA_AL1_CTRL(xfer_ch);
+
+  /* Set DMA registers */
+
+  putreg32((uint32_t)ctrl_blks, RP2040_DMA_READ_ADDR(ctrl_ch));
+  putreg32(xfer_reg_addr, RP2040_DMA_WRITE_ADDR(ctrl_ch));
+  putreg32(4, RP2040_DMA_TRANS_COUNT(ctrl_ch));
+
+  /* Configure the xfer dma channel as follows:
+   *    clear read and write error flags
+   *    set increment on both read and write
+   *    set 32-bit (word) transfer size
+   *    run the ctrl at high priority
+   *    RING_SIZE applies to write
+   *    set RING_SIZE to wrap every 16 bytes
+   *    don't chain to another dma (chain set to ourself)
+   *    use un-paced transfer mode  TREQ_SEL = 0x3f
+   */
+
+  ctrl = RP2040_DMA_CTRL_TRIG_READ_ERROR
+       | RP2040_DMA_CTRL_TRIG_WRITE_ERROR
+       | RP2040_DMA_CTRL_TRIG_INCR_READ
+       | RP2040_DMA_CTRL_TRIG_INCR_WRITE
+       | RP2040_DMA_CTRL_TRIG_HIGH_PRIORITY
+       | RP2040_DMA_CTRL_TRIG_RING_SEL
+       | (4 << RP2040_DMA_CTRL_TRIG_RING_SIZE_SHIFT)
+       | (RP2040_DMA_SIZE_WORD << RP2040_DMA_CTRL_TRIG_DATA_SIZE_SHIFT)
+       | (ctrl_ch << RP2040_DMA_CTRL_TRIG_CHAIN_TO_SHIFT)
+       | (0x3f << RP2040_DMA_CTRL_TRIG_TREQ_SEL_SHIFT);
+
+  putreg32(ctrl, RP2040_DMA_CTRL_TRIG(ctrl_ch));
+}
+
+/****************************************************************************
+ * Name: rp2040_ctrl_dmasetup
+ *
+ * Description:
+ *   Configure a dma channel to send a list of channel control blocks to
+ *   a second dma channel..
+ *
+ * Input Parameters:
+ *   control   - the DMA handle that reads the control blocks.  This is
+ *               the one that should be started.
+ *   size      - transfer size for this block
+ *   pacing    - dma pacing register for this block
+ *   ctrl      - Additional bits to set in CTRL_TRIG for this block.
+ *
+ ****************************************************************************/
+
+uint32_t rp2040_dma_ctrl_blk_ctrl(DMA_HANDLE  control,
+                                  int         size,
+                                  uint32_t    pacing,
+                                  uint32_t    ctrl)
+{
+  struct dma_channel_s *ctrl_dmach = (struct dma_channel_s *)control;
+  uint32_t              ctrl_ch;
+
+  DEBUGASSERT(ctrl_dmach && ctrl_dmach->inuse);
+
+  ctrl_ch = ctrl_dmach->chan;
+
+  return   RP2040_DMA_CTRL_TRIG_EN
+         | RP2040_DMA_CTRL_TRIG_IRQ_QUIET
+         | (ctrl_ch << RP2040_DMA_CTRL_TRIG_CHAIN_TO_SHIFT)
+         | (size    << RP2040_DMA_CTRL_TRIG_DATA_SIZE_SHIFT)
+         | (pacing  << RP2040_DMA_CTRL_TRIG_TREQ_SEL_SHIFT)
+         | ctrl;
+}
+
 /****************************************************************************
  * Name: rp2040_dmastart
  *
@@ -491,3 +591,26 @@ void rp2040_dmastop(DMA_HANDLE handle)
     }
   while (stat & bit);
 }
+
+/****************************************************************************
+ * Name: rp2040_dma_register
+ *
+ * Description:
+ *   Get the address of a DMA register based on the given dma handle that
+ *   can be used in the various putreg, getreg and modifyreg functions.
+ *
+ *   This allows other configuration options not normally supplied.
+ *
+ * Assumptions:
+ *   - DMA handle allocated by rp2040_dmachannel()
+ *
+ ****************************************************************************/
+
+uintptr_t rp2040_dma_register(DMA_HANDLE handle, uint16_t offset)
+{
+  struct dma_channel_s *dmach = (struct dma_channel_s *)handle;
+
+  DEBUGASSERT(dmach && dmach->inuse);
+
+  return RP2040_DMA_CH(dmach->chan) + offset;
+}
diff --git a/arch/arm/src/rp2040/rp2040_dmac.h b/arch/arm/src/rp2040/rp2040_dmac.h
index a56ce325a0..0169546a5a 100644
--- a/arch/arm/src/rp2040/rp2040_dmac.h
+++ b/arch/arm/src/rp2040/rp2040_dmac.h
@@ -84,6 +84,16 @@
 #define RP2040_DMA_SIZE_HALFWORD                1
 #define RP2040_DMA_SIZE_WORD                    2
 
+/* Use this as last item in a DMA control block chain */
+
+#define RP2040_DMA_CTRL_BLOCK_END                   \
+                {                                   \
+                  RP2040_DMA_CTRL_TRIG_IRQ_QUIET,   \
+                  0,                                \
+                  0,                                \
+                  0                                 \
+                }
+
 #ifndef __ASSEMBLY__
 
 #undef EXTERN
@@ -129,6 +139,18 @@ typedef struct
   uint8_t noincr;
 } dma_config_t;
 
+/* Type of items in the array items to 'ctrl_blks' argument for
+ * rp2040_ctrl_dmasetup().
+ */
+
+typedef struct
+  {
+    uint32_t  ctrl_trig;
+    uintptr_t read_addr;
+    uintptr_t write_addr;
+    uint32_t  xfer_count;
+  } dma_control_block_t;
+
 /****************************************************************************
  * Public Data
  ****************************************************************************/
@@ -221,6 +243,52 @@ void rp2040_rxdmasetup(DMA_HANDLE handle, uintptr_t paddr, uintptr_t maddr,
 void rp2040_txdmasetup(DMA_HANDLE handle, uintptr_t paddr, uintptr_t maddr,
                        size_t nbytes, dma_config_t config);
 
+/****************************************************************************
+ * Name: rp2040_ctrl_dmasetup
+ *
+ * Description:
+ *   Configure a dma channel to send a list of channel control blocks to
+ *   a second dma channel..
+ *
+ * Input Parameters:
+ *   control   - the DMA handle that reads the control blocks.  This is
+ *               the one that should be started.
+ *   transfer  - the DMA handle the transfers data to the peripheral. No
+ *               setup of this handle is required by the caller.
+ *   ctrl_blks - the array of control blocks to used.  Terminate this
+ *               list with an all zero control block.
+ *   callback  - callback when last transfer completes
+ *   arg       - arg to pass to callback
+ *
+ ****************************************************************************/
+
+void rp2040_ctrl_dmasetup(DMA_HANDLE           control,
+                          DMA_HANDLE           transfer,
+                          dma_control_block_t *ctrl_blks,
+                          dma_callback_t       callback,
+                          void                *arg);
+
+/****************************************************************************
+ * Name: rp2040_ctrl_dmasetup
+ *
+ * Description:
+ *   Configure a dma channel to send a list of channel control blocks to
+ *   a second dma channel..
+ *
+ * Input Parameters:
+ *   control   - the DMA handle that reads the control blocks.  This is
+ *               the one that should be started.
+ *   size      - transfer size for this block
+ *   pacing    - dma pacing register for this block
+ *   ctrl      - Additional bits to set in CTRL_TRIG for this block.
+ *
+ ****************************************************************************/
+
+uint32_t rp2040_dma_ctrl_blk_ctrl(DMA_HANDLE  control,
+                                  int         size,
+                                  uint32_t    pacing,
+                                  uint32_t    ctrl);
+
 /****************************************************************************
  * Name: rp2040_dmastart
  *
@@ -250,6 +318,22 @@ void rp2040_dmastart(DMA_HANDLE handle, dma_callback_t callback, void *arg);
 
 void rp2040_dmastop(DMA_HANDLE handle);
 
+/****************************************************************************
+ * Name: rp2040_dma_register
+ *
+ * Description:
+ *   Get the address of a DMA register based on the given DMA handle that
+ *   can be used in the various putreg, getreg and modifyreg functions.
+ *
+ *   This allows other configuration options not normally supplied.
+ *
+ * Assumptions:
+ *   - DMA handle allocated by rp2040_dmachannel()
+ *
+ ****************************************************************************/
+
+uintptr_t rp2040_dma_register(DMA_HANDLE handle, uint16_t offset);
+
 #undef EXTERN
 #if defined(__cplusplus)
 }
diff --git a/arch/arm/src/rp2040/rp2040_gpio.c b/arch/arm/src/rp2040/rp2040_gpio.c
index a29b29c665..666aa153c6 100644
--- a/arch/arm/src/rp2040/rp2040_gpio.c
+++ b/arch/arm/src/rp2040/rp2040_gpio.c
@@ -361,6 +361,31 @@ void rp2040_gpio_disable_irq(uint32_t gpio)
     }
 }
 
+/****************************************************************************
+ * Name: rp2040_gpio_clear_interrupt
+ *
+ * Description:
+ *   Clear the interrupt flags for a gpio pin.
+ *
+ ****************************************************************************/
+
+void rp2040_gpio_clear_interrupt(uint32_t gpio,
+                                 bool     edge_low,
+                                 bool     edge_high)
+{
+  uint32_t reg;
+  uint32_t bits = 0;
+
+  DEBUGASSERT(gpio < RP2040_GPIO_NUM);
+
+  reg = RP2040_IO_BANK0_INTR(gpio);
+
+  if (edge_low)  bits |= 0x04 << (gpio % 8);
+  if (edge_high) bits |= 0x08 << (gpio % 8);
+
+  clrbits_reg32(bits, reg);
+}
+
 /****************************************************************************
  * Name: r2040_gpio_initialize
  *
diff --git a/arch/arm/src/rp2040/rp2040_gpio.h b/arch/arm/src/rp2040/rp2040_gpio.h
index 68dd9f6fdf..7d6aa14898 100644
--- a/arch/arm/src/rp2040/rp2040_gpio.h
+++ b/arch/arm/src/rp2040/rp2040_gpio.h
@@ -126,6 +126,60 @@ static inline void rp2040_gpio_setdir(uint32_t gpio, int out)
     }
 }
 
+/****************************************************************************
+ * Name: rp2040_gpio_set_input_hysteresis_enabled
+ *
+ * Description:
+ *   Set whether the pin's input hysteresis will be enabled.
+ *
+ ****************************************************************************/
+
+static inline void rp2040_gpio_set_input_hysteresis_enabled(uint32_t gpio,
+                                                            bool enabled)
+{
+  DEBUGASSERT(gpio < RP2040_GPIO_NUM);
+
+  modbits_reg32(enabled ? RP2040_PADS_BANK0_GPIO_SCHMITT : 0,
+                RP2040_PADS_BANK0_GPIO_SCHMITT,
+                RP2040_PADS_BANK0_GPIO(gpio));
+}
+
+/****************************************************************************
+ * Name: rp2040_gpio_set_slew_fast
+ *
+ * Description:
+ *   Set whether the pin's fast slew rate will be enabled.
+ *
+ ****************************************************************************/
+
+static inline void rp2040_gpio_set_slew_fast(uint32_t gpio,
+                                             bool enabled)
+{
+  DEBUGASSERT(gpio < RP2040_GPIO_NUM);
+
+  modbits_reg32(enabled ? RP2040_PADS_BANK0_GPIO_SLEWFAST : 0,
+                RP2040_PADS_BANK0_GPIO_SLEWFAST,
+                RP2040_PADS_BANK0_GPIO(gpio));
+}
+
+/****************************************************************************
+ * Name: rp2040_gpio_set_drive_strength
+ *
+ * Description:
+ *   Set the pin's drive strength.
+ *
+ ****************************************************************************/
+
+static inline void rp2040_gpio_set_drive_strength(uint32_t gpio,
+                                                  uint32_t drive_strength)
+{
+  DEBUGASSERT(gpio < RP2040_GPIO_NUM);
+
+  modbits_reg32(drive_strength,
+                RP2040_PADS_BANK0_GPIO_DRIVE_MASK,
+                RP2040_PADS_BANK0_GPIO(gpio));
+}
+
 /****************************************************************************
  * Public Function Prototypes
  ****************************************************************************/
@@ -201,6 +255,18 @@ void rp2040_gpio_enable_irq(uint32_t gpio);
 
 void rp2040_gpio_disable_irq(uint32_t gpio);
 
+/****************************************************************************
+ * Name: rp2040_gpio_clear_interrupt
+ *
+ * Description:
+ *   Clear the interrupt flags for a gpio pin.
+ *
+ ****************************************************************************/
+
+void rp2040_gpio_clear_interrupt(uint32_t gpio,
+                                 bool     edge_low,
+                                 bool     edge_high);
+
 /****************************************************************************
  * Name: r2040_gpio_initialize
  *
diff --git a/arch/arm/src/rp2040/rp2040_pio.h b/arch/arm/src/rp2040/rp2040_pio.h
index e181210666..835cc512a9 100644
--- a/arch/arm/src/rp2040/rp2040_pio.h
+++ b/arch/arm/src/rp2040/rp2040_pio.h
@@ -1960,6 +1960,30 @@ void rp2040_pio_sm_unclaim(uint32_t pio, uint32_t sm);
 
 int rp2040_pio_claim_unused_sm(uint32_t pio, bool required);
 
+/****************************************************************************
+ * Name: rp2040_pio_set_input_sync_bypass
+ *
+ * Description:
+ *   Set the input synchronizer bypess bit for a GPIO pin
+ *
+ * Input Parameters:
+ *   pio - PIO index (0..1)
+ *   pin - GPIO pin number (0-29)
+ *   bypass - bypass set true to bypass the synchronizer.
+ *
+ ****************************************************************************/
+
+static inline void rp2040_pio_set_input_sync_bypass(uint32_t pio,
+                                                    uint32_t pin,
+                                                    bool bypass)
+{
+  DEBUGASSERT(pin < RP2040_GPIO_NUM);
+
+  modbits_reg32(bypass ? (1 << pin) : 0,
+                (1 << pin),
+                RP2040_PIO_INPUT_SYNC_BYPASS(pio));
+}
+
 #undef EXTERN
 #if defined(__cplusplus)
 }
diff --git a/arch/arm/src/rp2040/rp2040_ws2812.c b/arch/arm/src/rp2040/rp2040_ws2812.c
index 7e0837354a..eb472a5533 100644
--- a/arch/arm/src/rp2040/rp2040_ws2812.c
+++ b/arch/arm/src/rp2040/rp2040_ws2812.c
@@ -174,8 +174,9 @@ static int my_open(FAR struct file *filep)
   rp2040_pio_sm_config      config;
   int                       divisor;
   int                       ret;
+  irqstate_t                flags;
 
-  nxsem_wait(&dev_data->exclsem);
+  flags = enter_critical_section();
 
   priv->open_count += 1;
 
@@ -213,7 +214,7 @@ static int my_open(FAR struct file *filep)
 
       priv->pio_sm = rp2040_pio_claim_unused_sm(priv->pio, false);
 
-      /* If we did not get one try the nest pio block, if any */
+      /* If we did not get one try the next pio block, if any */
 
       if (priv->pio_sm < 0) continue;
 
@@ -322,7 +323,7 @@ static int my_open(FAR struct file *filep)
   ret = OK;
 
 post_and_return:
-  nxsem_post(&dev_data->exclsem);
+  leave_critical_section(flags);
 
   return ret;
 }
diff --git a/boards/Kconfig b/boards/Kconfig
index 22302dd4d7..527447a51f 100644
--- a/boards/Kconfig
+++ b/boards/Kconfig
@@ -1489,11 +1489,17 @@ config ARCH_BOARD_INTEL64_QEMU
 		generic Intel64 hardware.
 
 config ARCH_BOARD_RASPBERRYPI_PICO
-	bool "Raspberry Pi Pico board"
+	bool "Raspberry Pi Pico board (not W)"
 	depends on ARCH_CHIP_RP2040
 	---help---
 		This is a port to the Raspberry Pi Pico board.
 
+config ARCH_BOARD_RASPBERRYPI_PICO_W
+	bool "Raspberry Pi Pico W board"
+	depends on ARCH_CHIP_RP2040
+	---help---
+		This is a port to the Raspberry Pi Pico W board.
+
 config ARCH_BOARD_PIMORONI_TINY2040
 	bool "Pimoroni Tiny2040 board"
 	depends on ARCH_CHIP_RP2040
@@ -2706,6 +2712,7 @@ config ARCH_BOARD
 	default "qemu-i486"                if ARCH_BOARD_QEMU_I486
 	default "intel64-qemu"             if ARCH_BOARD_INTEL64_QEMU
 	default "raspberrypi-pico"         if ARCH_BOARD_RASPBERRYPI_PICO
+	default "raspberrypi-pico-w"       if ARCH_BOARD_RASPBERRYPI_PICO_W
 	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
@@ -3059,6 +3066,9 @@ endif
 if ARCH_BOARD_RASPBERRYPI_PICO
 source "boards/arm/rp2040/raspberrypi-pico/Kconfig"
 endif
+if ARCH_BOARD_RASPBERRYPI_PICO_W
+source "boards/arm/rp2040/raspberrypi-pico-w/Kconfig"
+endif
 if ARCH_BOARD_PIMORONI_TINY2040
 source "boards/arm/rp2040/pimoroni-tiny2040/Kconfig"
 endif
diff --git a/boards/arm/rp2040/adafruit-feather-rp2040/configs/audiopack/defconfig b/boards/arm/rp2040/adafruit-feather-rp2040/configs/audiopack/defconfig
index da306fb9a6..90f39aec34 100644
--- a/boards/arm/rp2040/adafruit-feather-rp2040/configs/audiopack/defconfig
+++ b/boards/arm/rp2040/adafruit-feather-rp2040/configs/audiopack/defconfig
@@ -75,4 +75,3 @@ CONFIG_TESTING_GETPRIME=y
 CONFIG_TESTING_OSTEST=y
 CONFIG_UART0_SERIAL_CONSOLE=y
 CONFIG_WS2812=y
-CONFIG_WS2812_NON_SPI_DRIVER=y
diff --git a/boards/arm/rp2040/adafruit-feather-rp2040/configs/composite/defconfig b/boards/arm/rp2040/adafruit-feather-rp2040/configs/composite/defconfig
index f7147bcb39..f03efa8668 100644
--- a/boards/arm/rp2040/adafruit-feather-rp2040/configs/composite/defconfig
+++ b/boards/arm/rp2040/adafruit-feather-rp2040/configs/composite/defconfig
@@ -78,4 +78,3 @@ CONFIG_USBMSC=y
 CONFIG_USBMSC_COMPOSITE=y
 CONFIG_USBMSC_NOT_STALL_BULKEP=y
 CONFIG_WS2812=y
-CONFIG_WS2812_NON_SPI_DRIVER=y
diff --git a/boards/arm/rp2040/adafruit-feather-rp2040/configs/displaypack/defconfig b/boards/arm/rp2040/adafruit-feather-rp2040/configs/displaypack/defconfig
index 92d150608c..adf03d81b3 100644
--- a/boards/arm/rp2040/adafruit-feather-rp2040/configs/displaypack/defconfig
+++ b/boards/arm/rp2040/adafruit-feather-rp2040/configs/displaypack/defconfig
@@ -102,4 +102,3 @@ CONFIG_USBDEV=y
 CONFIG_USBDEV_BUSPOWERED=y
 CONFIG_VIDEO_FB=y
 CONFIG_WS2812=y
-CONFIG_WS2812_NON_SPI_DRIVER=y
diff --git a/boards/arm/rp2040/adafruit-feather-rp2040/configs/enc28j60/defconfig b/boards/arm/rp2040/adafruit-feather-rp2040/configs/enc28j60/defconfig
index 2a8f1a72af..7f10af2ddf 100644
--- a/boards/arm/rp2040/adafruit-feather-rp2040/configs/enc28j60/defconfig
+++ b/boards/arm/rp2040/adafruit-feather-rp2040/configs/enc28j60/defconfig
@@ -86,4 +86,3 @@ CONFIG_TESTING_OSTEST=y
 CONFIG_UART0_SERIAL_CONSOLE=y
 CONFIG_WQUEUE_NOTIFIER=y
 CONFIG_WS2812=y
-CONFIG_WS2812_NON_SPI_DRIVER=y
diff --git a/boards/arm/rp2040/adafruit-feather-rp2040/configs/lcd1602/defconfig b/boards/arm/rp2040/adafruit-feather-rp2040/configs/lcd1602/defconfig
index 247debdc39..111f34fc9a 100644
--- a/boards/arm/rp2040/adafruit-feather-rp2040/configs/lcd1602/defconfig
+++ b/boards/arm/rp2040/adafruit-feather-rp2040/configs/lcd1602/defconfig
@@ -58,4 +58,3 @@ CONFIG_TESTING_GETPRIME=y
 CONFIG_TESTING_OSTEST=y
 CONFIG_UART0_SERIAL_CONSOLE=y
 CONFIG_WS2812=y
-CONFIG_WS2812_NON_SPI_DRIVER=y
diff --git a/boards/arm/rp2040/adafruit-feather-rp2040/configs/nsh/defconfig b/boards/arm/rp2040/adafruit-feather-rp2040/configs/nsh/defconfig
index ad2f809572..7258991252 100644
--- a/boards/arm/rp2040/adafruit-feather-rp2040/configs/nsh/defconfig
+++ b/boards/arm/rp2040/adafruit-feather-rp2040/configs/nsh/defconfig
@@ -49,4 +49,3 @@ CONFIG_TESTING_GETPRIME=y
 CONFIG_TESTING_OSTEST=y
 CONFIG_UART0_SERIAL_CONSOLE=y
 CONFIG_WS2812=y
-CONFIG_WS2812_NON_SPI_DRIVER=y
diff --git a/boards/arm/rp2040/adafruit-feather-rp2040/configs/nshsram/defconfig b/boards/arm/rp2040/adafruit-feather-rp2040/configs/nshsram/defconfig
index a623a02793..b801df30de 100644
--- a/boards/arm/rp2040/adafruit-feather-rp2040/configs/nshsram/defconfig
+++ b/boards/arm/rp2040/adafruit-feather-rp2040/configs/nshsram/defconfig
@@ -49,4 +49,3 @@ CONFIG_TESTING_GETPRIME=y
 CONFIG_TESTING_OSTEST=y
 CONFIG_UART0_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-feather-rp2040/configs/smp/defconfig
index b67fa9c1af..11696335fe 100644
--- a/boards/arm/rp2040/adafruit-feather-rp2040/configs/smp/defconfig
+++ b/boards/arm/rp2040/adafruit-feather-rp2040/configs/smp/defconfig
@@ -55,4 +55,3 @@ CONFIG_TESTING_OSTEST=y
 CONFIG_TESTING_SMP=y
 CONFIG_UART0_SERIAL_CONSOLE=y
 CONFIG_WS2812=y
-CONFIG_WS2812_NON_SPI_DRIVER=y
diff --git a/boards/arm/rp2040/adafruit-feather-rp2040/configs/spisd/defconfig b/boards/arm/rp2040/adafruit-feather-rp2040/configs/spisd/defconfig
index 1b0e4fe46d..52e44eff4c 100644
--- a/boards/arm/rp2040/adafruit-feather-rp2040/configs/spisd/defconfig
+++ b/boards/arm/rp2040/adafruit-feather-rp2040/configs/spisd/defconfig
@@ -60,4 +60,3 @@ CONFIG_TESTING_GETPRIME=y
 CONFIG_TESTING_OSTEST=y
 CONFIG_UART0_SERIAL_CONSOLE=y
 CONFIG_WS2812=y
-CONFIG_WS2812_NON_SPI_DRIVER=y
diff --git a/boards/arm/rp2040/adafruit-feather-rp2040/configs/ssd1306/defconfig b/boards/arm/rp2040/adafruit-feather-rp2040/configs/ssd1306/defconfig
index 0ba16157d8..da2d207336 100644
--- a/boards/arm/rp2040/adafruit-feather-rp2040/configs/ssd1306/defconfig
+++ b/boards/arm/rp2040/adafruit-feather-rp2040/configs/ssd1306/defconfig
@@ -77,4 +77,3 @@ CONFIG_TESTING_GETPRIME=y
 CONFIG_TESTING_OSTEST=y
 CONFIG_UART0_SERIAL_CONSOLE=y
 CONFIG_WS2812=y
-CONFIG_WS2812_NON_SPI_DRIVER=y
diff --git a/boards/arm/rp2040/adafruit-feather-rp2040/configs/st7735/defconfig b/boards/arm/rp2040/adafruit-feather-rp2040/configs/st7735/defconfig
index 157b1429e8..f3644b3ce5 100644
--- a/boards/arm/rp2040/adafruit-feather-rp2040/configs/st7735/defconfig
+++ b/boards/arm/rp2040/adafruit-feather-rp2040/configs/st7735/defconfig
@@ -59,4 +59,3 @@ CONFIG_TESTING_OSTEST=y
 CONFIG_UART0_SERIAL_CONSOLE=y
 CONFIG_VIDEO_FB=y
 CONFIG_WS2812=y
-CONFIG_WS2812_NON_SPI_DRIVER=y
diff --git a/boards/arm/rp2040/adafruit-feather-rp2040/configs/usbmsc/defconfig b/boards/arm/rp2040/adafruit-feather-rp2040/configs/usbmsc/defconfig
index 3c4d5a8364..1843a4fe7f 100644
--- a/boards/arm/rp2040/adafruit-feather-rp2040/configs/usbmsc/defconfig
+++ b/boards/arm/rp2040/adafruit-feather-rp2040/configs/usbmsc/defconfig
@@ -71,4 +71,3 @@ CONFIG_USBDEV_BUSPOWERED=y
 CONFIG_USBMSC=y
 CONFIG_USBMSC_NOT_STALL_BULKEP=y
 CONFIG_WS2812=y
-CONFIG_WS2812_NON_SPI_DRIVER=y
diff --git a/boards/arm/rp2040/adafruit-feather-rp2040/configs/usbnsh/defconfig b/boards/arm/rp2040/adafruit-feather-rp2040/configs/usbnsh/defconfig
index 267862e657..a4036a0a01 100644
--- a/boards/arm/rp2040/adafruit-feather-rp2040/configs/usbnsh/defconfig
+++ b/boards/arm/rp2040/adafruit-feather-rp2040/configs/usbnsh/defconfig
@@ -53,4 +53,3 @@ CONFIG_TESTING_OSTEST=y
 CONFIG_USBDEV=y
 CONFIG_USBDEV_BUSPOWERED=y
 CONFIG_WS2812=y
-CONFIG_WS2812_NON_SPI_DRIVER=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 f67c250c9a..ba6bab2b44 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
@@ -95,4 +95,3 @@ CONFIG_TESTING_OSTEST=y
 CONFIG_UART0_SERIAL_CONSOLE=y
 CONFIG_VIDEO_FB=y
 CONFIG_WS2812=y
-CONFIG_WS2812_NON_SPI_DRIVER=y
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 9e028c47e6..7c687b27ec 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
@@ -92,4 +92,3 @@ CONFIG_TESTING_OSTEST=y
 CONFIG_UART0_SERIAL_CONSOLE=y
 CONFIG_VIDEO_FB=y
 CONFIG_WS2812=y
-CONFIG_WS2812_NON_SPI_DRIVER=y
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 febd680071..2ec9864b66 100644
--- a/boards/arm/rp2040/adafruit-feather-rp2040/src/rp2040_boardinitialize.c
+++ b/boards/arm/rp2040/adafruit-feather-rp2040/src/rp2040_boardinitialize.c
@@ -32,6 +32,10 @@
 #include "arm_internal.h"
 #include "rp2040_gpio.h"
 
+#ifdef CONFIG_ARCH_BOARD_COMMON
+#include "rp2040_common_initialize.h"
+#endif /* CONFIG_ARCH_BOARD_COMMON */
+
 /****************************************************************************
  * Pre-processor Definitions
  ****************************************************************************/
@@ -53,52 +57,17 @@
 
 void rp2040_boardearlyinitialize(void)
 {
-  rp2040_gpio_initialize();
-
-  /* Disable IE on GPIO 26-29 */
+  #ifdef CONFIG_ARCH_BOARD_COMMON
+  rp2040_common_earlyinitialize();
+  #endif 
 
-  clrbits_reg32(RP2040_PADS_BANK0_GPIO_IE, RP2040_PADS_BANK0_GPIO(26));
-  clrbits_reg32(RP2040_PADS_BANK0_GPIO_IE, RP2040_PADS_BANK0_GPIO(27));
-  clrbits_reg32(RP2040_PADS_BANK0_GPIO_IE, RP2040_PADS_BANK0_GPIO(28));
-  clrbits_reg32(RP2040_PADS_BANK0_GPIO_IE, RP2040_PADS_BANK0_GPIO(29));
+  /* --- Place any board specific early initialization here --- */
 
   /* Set board LED pin */
 
   rp2040_gpio_init(BOARD_GPIO_LED_PIN);
   rp2040_gpio_setdir(BOARD_GPIO_LED_PIN, true);
   rp2040_gpio_put(BOARD_GPIO_LED_PIN, true);
-
-  /* Set default UART pin */
-
-#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_RX_GPIO,
-                           RP2040_GPIO_FUNC_UART);      /* RX */
-#ifdef CONFIG_SERIAL_OFLOWCONTROL
-  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_RTS_GPIO,
-                           RP2040_GPIO_FUNC_UART);      /* RTS */
-#endif
-#endif
-
-#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_RX_GPIO,
-                           RP2040_GPIO_FUNC_UART);      /* RX */
-#ifdef CONFIG_SERIAL_OFLOWCONTROL
-  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_RTS_GPIO,
-                           RP2040_GPIO_FUNC_UART);      /* RTS */
-#endif
-#endif
 }
 
 /****************************************************************************
@@ -110,57 +79,9 @@ void rp2040_boardearlyinitialize(void)
 
 void rp2040_boardinitialize(void)
 {
-  /* Set default I2C pin */
-
-#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_SCL_GPIO,
-                           RP2040_GPIO_FUNC_I2C);       /* SCL */
-
-  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
-
-#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_SCL_GPIO,
-                           RP2040_GPIO_FUNC_I2C);       /* SCL */
-
-  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 */
-
-#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_SCK_GPIO,
-                           RP2040_GPIO_FUNC_SPI);       /* SCK */
-  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_CS_GPIO);        /* CSn */
-  rp2040_gpio_setdir(CONFIG_RP2040_SPI0_CS_GPIO, true);
-  rp2040_gpio_put(CONFIG_RP2040_SPI0_CS_GPIO, true);
-#endif
-
-#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_SCK_GPIO,
-                           RP2040_GPIO_FUNC_SPI);       /* SCK */
-  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_CS_GPIO);        /* CSn */
-  rp2040_gpio_setdir(CONFIG_RP2040_SPI1_CS_GPIO, true);
-  rp2040_gpio_put(CONFIG_RP2040_SPI1_CS_GPIO, true);
-#endif
+  #ifdef CONFIG_ARCH_BOARD_COMMON
+  rp2040_common_initialize();
+  #endif 
+
+  /* --- Place any board specific initialization here --- */
 }
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 6c678ac86a..98c96d9015 100644
--- a/boards/arm/rp2040/adafruit-feather-rp2040/src/rp2040_bringup.c
+++ b/boards/arm/rp2040/adafruit-feather-rp2040/src/rp2040_bringup.c
@@ -33,50 +33,9 @@
 
 #include "rp2040_pico.h"
 
-#ifdef CONFIG_LCD_BACKPACK
-#include "rp2040_lcd_backpack.h"
-#endif
-
-#ifdef CONFIG_LCD
-#include <nuttx/board.h>
-#endif
-
-#ifdef CONFIG_LCD_DEV
-#include <nuttx/lcd/lcd_dev.h>
-#endif
-
-#ifdef CONFIG_VIDEO_FB
-#include <nuttx/video/fb.h>
-#endif
-
-#ifdef CONFIG_SENSORS_INA219
-#include <nuttx/sensors/ina219.h>
-#include "rp2040_ina219.h"
-#endif
-
-#ifdef CONFIG_SENSORS_BMP180
-#include <nuttx/sensors/bmp180.h>
-#include "rp2040_bmp180.h"
-#endif
-
-#ifdef CONFIG_RP2040_PWM
-#include "rp2040_pwm.h"
-#include "rp2040_pwmdev.h"
-#endif
-
-#if defined(CONFIG_RP2040_BOARD_HAS_WS2812) && defined(CONFIG_WS2812)
-#include "rp2040_ws2812.h"
-#endif
-
-#ifdef CONFIG_WS2812_HAS_WHITE
-#define HAS_WHITE true
-#else /* CONFIG_WS2812_HAS_WHITE */
-#define HAS_WHITE false
-#endif /* CONFIG_WS2812_HAS_WHITE */
-
-#if defined(CONFIG_ADC) && defined(CONFIG_RP2040_ADC)
-#include "rp2040_adc.h"
-#endif
+#ifdef CONFIG_ARCH_BOARD_COMMON
+#include "rp2040_common_bringup.h"
+#endif /* CONFIG_ARCH_BOARD_COMMON */
 
 /****************************************************************************
  * Public Functions
@@ -88,425 +47,17 @@
 
 int rp2040_bringup(void)
 {
-  int ret = 0;
+#ifdef CONFIG_ARCH_BOARD_COMMON
 
-#ifdef CONFIG_RP2040_I2C_DRIVER
-  #ifdef CONFIG_RP2040_I2C0
-  ret = board_i2cdev_initialize(0);
+  int ret = rp2040_common_bringup();
   if (ret < 0)
     {
-      _err("ERROR: Failed to initialize I2C0.\n");
-    }
-  #endif
-
-  #ifdef CONFIG_RP2040_I2C1
-  ret = board_i2cdev_initialize(1);
-  if (ret < 0)
-    {
-      _err("ERROR: Failed to initialize I2C1.\n");
-    }
-  #endif
-#endif
-
-#ifdef CONFIG_RP2040_SPI_DRIVER
-  #ifdef CONFIG_RP2040_SPI0
-  ret = board_spidev_initialize(0);
-  if (ret < 0)
-    {
-      _err("ERROR: Failed to initialize SPI0.\n");
-    }
-  #endif
-
-  #ifdef CONFIG_RP2040_SPI1
-  ret = board_spidev_initialize(1);
-  if (ret < 0)
-    {
-      _err("ERROR: Failed to initialize SPI1.\n");
-    }
-  #endif
-#endif
-
-#ifdef CONFIG_RP2040_PWM
-#  ifdef CONFIG_RP2040_PWM0
-#    if defined(CONFIG_PWM_NCHANNELS) && CONFIG_PWM_NCHANNELS == 2
-  ret = rp2040_pwmdev_initialize(0,
-                                 CONFIG_RP2040_PWM0A_GPIO,
-                                 CONFIG_RP2040_PWM0B_GPIO,
-                                 (0
-#      ifdef CONFIG_RP2040_PWM0A_INVERT
-                                  | RP2040_PWM_CSR_A_INV
-#      endif
-#      ifdef CONFIG_RP2040_PWM0B_INVERT
-                                  | RP2040_PWM_CSR_B_INV
-#      endif
-#      ifdef CONFIG_RP2040_PWM0_PHASE_CORRECT
-                                  | RP2040_PWM_CSR_PH_CORRECT
-#      endif
-                                 ));
-#    else
-  ret = rp2040_pwmdev_initialize(0,
-                                 CONFIG_RP2040_PWM0A_GPIO,
-                                 (0
-#      ifdef CONFIG_RP2040_PWM0A_INVERT
-                                  | RP2040_PWM_CSR_A_INV
-#      endif
-#      ifdef CONFIG_RP2040_PWM0_PHASE_CORRECT
-                                  | RP2040_PWM_CSR_PH_CORRECT
-#      endif
-                                 ));
-#    endif
-  if (ret < 0)
-    {
-      _err("ERROR: Failed to initialize PWM0.\n");
-    }
-#  endif
-
-#  ifdef CONFIG_RP2040_PWM1
-#    if defined(CONFIG_PWM_NCHANNELS) && CONFIG_PWM_NCHANNELS == 2
-  ret = rp2040_pwmdev_initialize(1,
-                                 CONFIG_RP2040_PWM1A_GPIO,
-                                 CONFIG_RP2040_PWM1B_GPIO,
-                                 (0
-#      ifdef CONFIG_RP2040_PWM1A_INVERT
-                                  | RP2040_PWM_CSR_A_INV
-#      endif
-#      ifdef CONFIG_RP2040_PWM1B_INVERT
-                                  | RP2040_PWM_CSR_B_INV
-#      endif
-#      ifdef CONFIG_RP2040_PWM1_PHASE_CORRECT
-                                  | RP2040_PWM_CSR_PH_CORRECT
-#      endif
-                                 ));
-#    else
-  ret = rp2040_pwmdev_initialize(1,
-                                 CONFIG_RP2040_PWM1A_GPIO,
-                                 (0
-#      ifdef CONFIG_RP2040_PWM1A_INVERT
-                                  | RP2040_PWM_CSR_A_INV
-#      endif
-#      ifdef CONFIG_RP2040_PWM1_PHASE_CORRECT
-                                  | RP2040_PWM_CSR_PH_CORRECT
-#      endif
-                                 ));
-#    endif
-  if (ret < 0)
-    {
-      _err("ERROR: Failed to initialize PWM1.\n");
-    }
-#  endif
-
-#  ifdef CONFIG_RP2040_PWM2
-#    if defined(CONFIG_PWM_NCHANNELS) && CONFIG_PWM_NCHANNELS == 2
-  ret = rp2040_pwmdev_initialize(2,
-                                 CONFIG_RP2040_PWM2A_GPIO,
-                                 CONFIG_RP2040_PWM2B_GPIO,
-                                 (0
-#      ifdef CONFIG_RP2040_PWM2A_INVERT
-                                  | RP2040_PWM_CSR_A_INV
-#      endif
-#      ifdef CONFIG_RP2040_PWM2B_INVERT
-                                  | RP2040_PWM_CSR_B_INV
-#      endif
-#      ifdef CONFIG_RP2040_PWM2_PHASE_CORRECT
-                                  | RP2040_PWM_CSR_PH_CORRECT
-#      endif
-                                 ));
-#    else
-  ret = rp2040_pwmdev_initialize(2,
-                                 CONFIG_RP2040_PWM2A_GPIO,
-                                 (0
-#      ifdef CONFIG_RP2040_PWM2A_INVERT
-                                  | RP2040_PWM_CSR_A_INV
-#      endif
-#      ifdef CONFIG_RP2040_PWM2_PHASE_CORRECT
-                                  | RP2040_PWM_CSR_PH_CORRECT
-#      endif
-                                 ));
-#    endif
-  if (ret < 0)
-    {
-      _err("ERROR: Failed to initialize PWM2.\n");
-    }
-#  endif
-
-#  ifdef CONFIG_RP2040_PWM3
-#    if defined(CONFIG_PWM_NCHANNELS) && CONFIG_PWM_NCHANNELS == 2
-  ret = rp2040_pwmdev_initialize(3,
-                                 CONFIG_RP2040_PWM3A_GPIO,
-                                 CONFIG_RP2040_PWM3B_GPIO,
-                                 (0
-#      ifdef CONFIG_RP2040_PWM3A_INVERT
-                                  | RP2040_PWM_CSR_A_INV
-#      endif
-#      ifdef CONFIG_RP2040_PWM3B_INVERT
-                                  | RP2040_PWM_CSR_B_INV
-#      endif
-#      ifdef CONFIG_RP2040_PWM3_PHASE_CORRECT
-                                  | RP2040_PWM_CSR_PH_CORRECT
-#      endif
-                                 ));
-#    else
-  ret = rp2040_pwmdev_initialize(3,
-                                 CONFIG_RP2040_PWM3A_GPIO,
-                                 (0
-#      ifdef CONFIG_RP2040_PWM3A_INVERT
-                                  | RP2040_PWM_CSR_A_INV
-#      endif
-#      ifdef CONFIG_RP2040_PWM3_PHASE_CORRECT
-                                  | RP2040_PWM_CSR_PH_CORRECT
-#      endif
-                                 ));
-#    endif
-  if (ret < 0)
-    {
-      _err("ERROR: Failed to initialize PWM3.\n");
-    }
-#  endif
-
-#  ifdef CONFIG_RP2040_PWM4
-#    if defined(CONFIG_PWM_NCHANNELS) && CONFIG_PWM_NCHANNELS == 2
-  ret = rp2040_pwmdev_initialize(4,
-                                 CONFIG_RP2040_PWM4A_GPIO,
-                                 CONFIG_RP2040_PWM4B_GPIO,
-                                 (0
-#      ifdef CONFIG_RP2040_PWM4A_INVERT
-                                  | RP2040_PWM_CSR_A_INV
-#      endif
-#      ifdef CONFIG_RP2040_PWM4B_INVERT
-                                  | RP2040_PWM_CSR_B_INV
-#      endif
-#      ifdef CONFIG_RP2040_PWM4_PHASE_CORRECT
-                                  | RP2040_PWM_CSR_PH_CORRECT
-#      endif
-                                 ));
-#    else
-  ret = rp2040_pwmdev_initialize(4,
-                                 CONFIG_RP2040_PWM4A_GPIO,
-                                 (0
-#      ifdef CONFIG_RP2040_PWM4A_INVERT
-                                  | RP2040_PWM_CSR_A_INV
-#      endif
-#      ifdef CONFIG_RP2040_PWM4_PHASE_CORRECT
-                                  | RP2040_PWM_CSR_PH_CORRECT
-#      endif
-                                 ));
-#    endif
-  if (ret < 0)
-    {
-      _err("ERROR: Failed to initialize PWM4.\n");
-    }
-#  endif
-
-#  ifdef CONFIG_RP2040_PWM5
-#    if defined(CONFIG_PWM_NCHANNELS) && CONFIG_PWM_NCHANNELS == 2
-  ret = rp2040_pwmdev_initialize(5,
-                                 CONFIG_RP2040_PWM5A_GPIO,
-                                 CONFIG_RP2040_PWM5B_GPIO,
-                                 (0
-#      ifdef CONFIG_RP2040_PWM5A_INVERT
-                                  | RP2040_PWM_CSR_A_INV
-#      endif
-#      ifdef CONFIG_RP2040_PWM5B_INVERT
-                                  | RP2040_PWM_CSR_B_INV
-#      endif
-#      ifdef CONFIG_RP2040_PWM5_PHASE_CORRECT
-                                  | RP2040_PWM_CSR_PH_CORRECT
-#      endif
-                                 ));
-#  else
-  ret = rp2040_pwmdev_initialize(5,
-                                 CONFIG_RP2040_PWM5A_GPIO,
-                                 (0
-#      ifdef CONFIG_RP2040_PWM5A_INVERT
-                                  | RP2040_PWM_CSR_A_INV
-#      endif
-#      ifdef CONFIG_RP2040_PWM5_PHASE_CORRECT
-                                  | RP2040_PWM_CSR_PH_CORRECT
-#      endif
-                                 ));
-#  endif
-  if (ret < 0)
-    {
-      _err("ERROR: Failed to initialize PWM5.\n");
-    }
-#  endif
-
-#  ifdef CONFIG_RP2040_PWM6
-#    if defined(CONFIG_PWM_NCHANNELS) && CONFIG_PWM_NCHANNELS == 2
-  ret = rp2040_pwmdev_initialize(6,
-                                 CONFIG_RP2040_PWM6A_GPIO,
-                                 CONFIG_RP2040_PWM6B_GPIO,
-                                 (0
-#      ifdef CONFIG_RP2040_PWM6A_INVERT
-                                  | RP2040_PWM_CSR_A_INV
-#      endif
-#      ifdef CONFIG_RP2040_PWM6B_INVERT
-                                  | RP2040_PWM_CSR_B_INV
-#      endif
-#      ifdef CONFIG_RP2040_PWM6_PHASE_CORRECT
-                                  | RP2040_PWM_CSR_PH_CORRECT
-#      endif
-                                 ));
-#    else
-  ret = rp2040_pwmdev_initialize(6,
-                                 CONFIG_RP2040_PWM6A_GPIO,
-                                 (0
-#      ifdef CONFIG_RP2040_PWM6A_INVERT
-                                  | RP2040_PWM_CSR_A_INV
-#      endif
-#      ifdef CONFIG_RP2040_PWM6_PHASE_CORRECT
-                                  | RP2040_PWM_CSR_PH_CORRECT
-#      endif
-                                 ));
-#    endif
-  if (ret < 0)
-    {
-      _err("ERROR: Failed to initialize PWM6.\n");
-    }
-#  endif
-#endif
-
-#ifdef CONFIG_RP2040_SPISD
-  /* Mount the SPI-based MMC/SD block driver */
-
-  ret = board_spisd_initialize(0, CONFIG_RP2040_SPISD_SPI_CH);
-  if (ret < 0)
-    {
-      _err("ERROR: Failed to initialize SPI device to MMC/SD: %d\n",
-           ret);
-    }
-#endif
-
-#ifdef CONFIG_FS_PROCFS
-  /* Mount the procfs file system */
-
-  ret = nx_mount(NULL, "/proc", "procfs", 0, NULL);
-  if (ret < 0)
-    {
-      serr("ERROR: Failed to mount procfs at %s: %d\n", "/proc", ret);
-    }
-#endif
-
-#ifdef CONFIG_SENSORS_BMP180
-  /* Try to register BMP180 device in I2C0 */
-
-  ret = board_bmp180_initialize(0);
-  if (ret < 0)
-    {
-      syslog(LOG_ERR, "Failed to initialize BMP180 driver: %d\n", ret);
-    }
-#endif
-
-#ifdef CONFIG_SENSORS_INA219
-  /* Configure and initialize the INA219 sensor in I2C0 */
-
-  ret = board_ina219_initialize(0);
-  if (ret < 0)
-    {
-      syslog(LOG_ERR, "ERROR: rp2040_ina219_initialize() failed: %d\n", ret);
-    }
-#endif
-
-#ifdef CONFIG_VIDEO_FB
-  ret = fb_register(0, 0);
-  if (ret < 0)
-    {
-      _err("ERROR: Failed to initialize Frame Buffer Driver.\n");
-    }
-#elif defined(CONFIG_LCD)
-  ret = board_lcd_initialize();
-  if (ret < 0)
-    {
-      syslog(LOG_ERR, "ERROR: Failed to initialize LCD.\n");
-    }
-#endif
-
-#ifdef CONFIG_LCD_DEV
-  ret = lcddev_register(0);
-  if (ret < 0)
-    {
-      syslog(LOG_ERR, "ERROR: lcddev_register() failed: %d\n", ret);
-    }
-#endif
-
-#ifdef CONFIG_LCD_BACKPACK
-  /* slcd:0, i2c:0, rows=2, cols=16 */
-
-  ret = board_lcd_backpack_init(0, 0, 2, 16);
-  if (ret < 0)
-    {
-      syslog(LOG_ERR, "Failed to initialize PCF8574 LCD, error %d\n", ret);
-      return ret;
-    }
-#endif
-
-#ifdef CONFIG_RP2040_I2S
-  ret = board_i2sdev_initialize(0);
-  if (ret < 0)
-    {
-      _err("ERROR: Failed to initialize I2S.\n");
-    }
-#endif
-
-#ifdef CONFIG_DEV_GPIO
-  ret = rp2040_dev_gpio_init();
-  if (ret < 0)
-    {
-      syslog(LOG_ERR, "Failed to initialize GPIO Driver: %d\n", ret);
       return ret;
     }
-#endif
-
-  /* Initialize board neo-pixel */
-
-#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
-
-#if defined(CONFIG_ADC) && defined(CONFIG_RP2040_ADC)
-
-# ifdef CONFIG_RPC2040_ADC_CHANNEL0
-#   define ADC_0 true
-# else
-#   define ADC_0 false
-# endif
-
-# ifdef CONFIG_RPC2040_ADC_CHANNEL1
-#   define ADC_1 true
-# else
-#   define ADC_1 false
-# endif
 
-# ifdef CONFIG_RPC2040_ADC_CHANNEL2
-#   define ADC_2 true
-# else
-#   define ADC_2 false
-# endif
-
-# ifdef CONFIG_RPC2040_ADC_CHANNEL3
-#   define ADC_3 true
-# else
-#   define ADC_3 false
-# endif
-
-# ifdef CONFIG_RPC2040_ADC_TEMPERATURE
-#   define ADC_TEMP true
-# else
-#   define ADC_TEMP false
-# endif
-
-  ret = rp2040_adc_setup("/dev/adc0", ADC_0, ADC_1, ADC_2, ADC_3, ADC_TEMP);
-  if (ret != OK)
-    {
-      syslog(LOG_ERR, "Failed to initialize ADC Driver: %d\n", ret);
-      return ret;
-    }
+#endif /* CONFIG_ARCH_BOARD_COMMON */
 
-#endif /* defined(CONFIG_ADC) && defined(CONFIG_RP2040_ADC) */
+  /* --- Place any board specific bringup code here --- */
 
-  return ret;
+  return OK;
 }
diff --git a/boards/arm/rp2040/adafruit-kb2040/configs/audiopack/defconfig b/boards/arm/rp2040/adafruit-kb2040/configs/audiopack/defconfig
index bcc9163ce5..2b0201e14d 100644
--- a/boards/arm/rp2040/adafruit-kb2040/configs/audiopack/defconfig
+++ b/boards/arm/rp2040/adafruit-kb2040/configs/audiopack/defconfig
@@ -75,4 +75,3 @@ CONFIG_TESTING_GETPRIME=y
 CONFIG_TESTING_OSTEST=y
 CONFIG_UART0_SERIAL_CONSOLE=y
 CONFIG_WS2812=y
-CONFIG_WS2812_NON_SPI_DRIVER=y
diff --git a/boards/arm/rp2040/adafruit-kb2040/configs/composite/defconfig b/boards/arm/rp2040/adafruit-kb2040/configs/composite/defconfig
index c33f3151cb..1dfd904cec 100644
--- a/boards/arm/rp2040/adafruit-kb2040/configs/composite/defconfig
+++ b/boards/arm/rp2040/adafruit-kb2040/configs/composite/defconfig
@@ -78,4 +78,3 @@ CONFIG_USBMSC=y
 CONFIG_USBMSC_COMPOSITE=y
 CONFIG_USBMSC_NOT_STALL_BULKEP=y
 CONFIG_WS2812=y
-CONFIG_WS2812_NON_SPI_DRIVER=y
diff --git a/boards/arm/rp2040/adafruit-kb2040/configs/displaypack/defconfig b/boards/arm/rp2040/adafruit-kb2040/configs/displaypack/defconfig
index bfc1e73539..2a1867e433 100644
--- a/boards/arm/rp2040/adafruit-kb2040/configs/displaypack/defconfig
+++ b/boards/arm/rp2040/adafruit-kb2040/configs/displaypack/defconfig
@@ -102,4 +102,3 @@ CONFIG_USBDEV=y
 CONFIG_USBDEV_BUSPOWERED=y
 CONFIG_VIDEO_FB=y
 CONFIG_WS2812=y
-CONFIG_WS2812_NON_SPI_DRIVER=y
diff --git a/boards/arm/rp2040/adafruit-kb2040/configs/enc28j60/defconfig b/boards/arm/rp2040/adafruit-kb2040/configs/enc28j60/defconfig
index 94ecec1693..14ce655231 100644
--- a/boards/arm/rp2040/adafruit-kb2040/configs/enc28j60/defconfig
+++ b/boards/arm/rp2040/adafruit-kb2040/configs/enc28j60/defconfig
@@ -87,4 +87,3 @@ CONFIG_TESTING_OSTEST=y
 CONFIG_UART0_SERIAL_CONSOLE=y
 CONFIG_WQUEUE_NOTIFIER=y
 CONFIG_WS2812=y
-CONFIG_WS2812_NON_SPI_DRIVER=y
diff --git a/boards/arm/rp2040/adafruit-kb2040/configs/lcd1602/defconfig b/boards/arm/rp2040/adafruit-kb2040/configs/lcd1602/defconfig
index 1b537cd666..b881311992 100644
--- a/boards/arm/rp2040/adafruit-kb2040/configs/lcd1602/defconfig
+++ b/boards/arm/rp2040/adafruit-kb2040/configs/lcd1602/defconfig
@@ -56,4 +56,3 @@ CONFIG_TESTING_GETPRIME=y
 CONFIG_TESTING_OSTEST=y
 CONFIG_UART0_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-kb2040/configs/nsh/defconfig
index 6c91410694..c71ca48ea1 100644
--- a/boards/arm/rp2040/adafruit-kb2040/configs/nsh/defconfig
+++ b/boards/arm/rp2040/adafruit-kb2040/configs/nsh/defconfig
@@ -49,4 +49,3 @@ CONFIG_TESTING_GETPRIME=y
 CONFIG_TESTING_OSTEST=y
 CONFIG_UART0_SERIAL_CONSOLE=y
 CONFIG_WS2812=y
-CONFIG_WS2812_NON_SPI_DRIVER=y
diff --git a/boards/arm/rp2040/adafruit-kb2040/configs/nshsram/defconfig b/boards/arm/rp2040/adafruit-kb2040/configs/nshsram/defconfig
index a968c49a48..2e40af9f39 100644
--- a/boards/arm/rp2040/adafruit-kb2040/configs/nshsram/defconfig
+++ b/boards/arm/rp2040/adafruit-kb2040/configs/nshsram/defconfig
@@ -49,4 +49,3 @@ CONFIG_TESTING_GETPRIME=y
 CONFIG_TESTING_OSTEST=y
 CONFIG_UART0_SERIAL_CONSOLE=y
 CONFIG_WS2812=y
-CONFIG_WS2812_NON_SPI_DRIVER=y
diff --git a/boards/arm/rp2040/adafruit-kb2040/configs/smp/defconfig b/boards/arm/rp2040/adafruit-kb2040/configs/smp/defconfig
index 19dba9bc35..48a2a1f837 100644
--- a/boards/arm/rp2040/adafruit-kb2040/configs/smp/defconfig
+++ b/boards/arm/rp2040/adafruit-kb2040/configs/smp/defconfig
@@ -55,4 +55,3 @@ CONFIG_TESTING_OSTEST=y
 CONFIG_TESTING_SMP=y
 CONFIG_UART0_SERIAL_CONSOLE=y
 CONFIG_WS2812=y
-CONFIG_WS2812_NON_SPI_DRIVER=y
diff --git a/boards/arm/rp2040/adafruit-kb2040/configs/spisd/defconfig b/boards/arm/rp2040/adafruit-kb2040/configs/spisd/defconfig
index ddd189112d..1709ce0dd7 100644
--- a/boards/arm/rp2040/adafruit-kb2040/configs/spisd/defconfig
+++ b/boards/arm/rp2040/adafruit-kb2040/configs/spisd/defconfig
@@ -64,4 +64,3 @@ CONFIG_TESTING_GETPRIME=y
 CONFIG_TESTING_OSTEST=y
 CONFIG_UART0_SERIAL_CONSOLE=y
 CONFIG_WS2812=y
-CONFIG_WS2812_NON_SPI_DRIVER=y
diff --git a/boards/arm/rp2040/adafruit-kb2040/configs/ssd1306/defconfig b/boards/arm/rp2040/adafruit-kb2040/configs/ssd1306/defconfig
index a9c7afa1cc..8c6d05849b 100644
--- a/boards/arm/rp2040/adafruit-kb2040/configs/ssd1306/defconfig
+++ b/boards/arm/rp2040/adafruit-kb2040/configs/ssd1306/defconfig
@@ -75,4 +75,3 @@ CONFIG_TESTING_GETPRIME=y
 CONFIG_TESTING_OSTEST=y
 CONFIG_UART0_SERIAL_CONSOLE=y
 CONFIG_WS2812=y
-CONFIG_WS2812_NON_SPI_DRIVER=y
diff --git a/boards/arm/rp2040/adafruit-kb2040/configs/st7735/defconfig b/boards/arm/rp2040/adafruit-kb2040/configs/st7735/defconfig
index 84c8330fc9..7f6c713906 100644
--- a/boards/arm/rp2040/adafruit-kb2040/configs/st7735/defconfig
+++ b/boards/arm/rp2040/adafruit-kb2040/configs/st7735/defconfig
@@ -60,4 +60,3 @@ CONFIG_TESTING_OSTEST=y
 CONFIG_UART0_SERIAL_CONSOLE=y
 CONFIG_VIDEO_FB=y
 CONFIG_WS2812=y
-CONFIG_WS2812_NON_SPI_DRIVER=y
diff --git a/boards/arm/rp2040/adafruit-kb2040/configs/usbmsc/defconfig b/boards/arm/rp2040/adafruit-kb2040/configs/usbmsc/defconfig
index d03f3a032b..8fc2feac30 100644
--- a/boards/arm/rp2040/adafruit-kb2040/configs/usbmsc/defconfig
+++ b/boards/arm/rp2040/adafruit-kb2040/configs/usbmsc/defconfig
@@ -71,4 +71,3 @@ CONFIG_USBDEV_BUSPOWERED=y
 CONFIG_USBMSC=y
 CONFIG_USBMSC_NOT_STALL_BULKEP=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-kb2040/configs/usbnsh/defconfig
index 0fe5e5c827..ffa7bb6a1d 100644
--- a/boards/arm/rp2040/adafruit-kb2040/configs/usbnsh/defconfig
+++ b/boards/arm/rp2040/adafruit-kb2040/configs/usbnsh/defconfig
@@ -53,4 +53,3 @@ CONFIG_TESTING_OSTEST=y
 CONFIG_USBDEV=y
 CONFIG_USBDEV_BUSPOWERED=y
 CONFIG_WS2812=y
-CONFIG_WS2812_NON_SPI_DRIVER=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 6d9edec8e7..aeefc71ce2 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
@@ -95,4 +95,3 @@ CONFIG_TESTING_OSTEST=y
 CONFIG_UART0_SERIAL_CONSOLE=y
 CONFIG_VIDEO_FB=y
 CONFIG_WS2812=y
-CONFIG_WS2812_NON_SPI_DRIVER=y
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 f769781099..9c290f1924 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
@@ -92,4 +92,3 @@ CONFIG_TESTING_OSTEST=y
 CONFIG_UART0_SERIAL_CONSOLE=y
 CONFIG_VIDEO_FB=y
 CONFIG_WS2812=y
-CONFIG_WS2812_NON_SPI_DRIVER=y
diff --git a/boards/arm/rp2040/adafruit-kb2040/src/rp2040_boardinitialize.c b/boards/arm/rp2040/adafruit-kb2040/src/rp2040_boardinitialize.c
index a34ab08910..f11ea5cad1 100644
--- a/boards/arm/rp2040/adafruit-kb2040/src/rp2040_boardinitialize.c
+++ b/boards/arm/rp2040/adafruit-kb2040/src/rp2040_boardinitialize.c
@@ -32,6 +32,10 @@
 #include "arm_internal.h"
 #include "rp2040_gpio.h"
 
+#ifdef CONFIG_ARCH_BOARD_COMMON
+#include "rp2040_common_initialize.h"
+#endif /* CONFIG_ARCH_BOARD_COMMON */
+
 /****************************************************************************
  * Pre-processor Definitions
  ****************************************************************************/
@@ -53,46 +57,11 @@
 
 void rp2040_boardearlyinitialize(void)
 {
-  rp2040_gpio_initialize();
-
-  /* Disable IE on GPIO 26-29 */
-
-  clrbits_reg32(RP2040_PADS_BANK0_GPIO_IE, RP2040_PADS_BANK0_GPIO(26));
-  clrbits_reg32(RP2040_PADS_BANK0_GPIO_IE, RP2040_PADS_BANK0_GPIO(27));
-  clrbits_reg32(RP2040_PADS_BANK0_GPIO_IE, RP2040_PADS_BANK0_GPIO(28));
-  clrbits_reg32(RP2040_PADS_BANK0_GPIO_IE, RP2040_PADS_BANK0_GPIO(29));
-
-  /* Set default UART pin */
+  #ifdef CONFIG_ARCH_BOARD_COMMON
+  rp2040_common_earlyinitialize();
+  #endif 
 
-#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_RX_GPIO,
-                           RP2040_GPIO_FUNC_UART);      /* RX */
-#ifdef CONFIG_SERIAL_OFLOWCONTROL
-  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_RTS_GPIO,
-                           RP2040_GPIO_FUNC_UART);      /* RTS */
-#endif
-#endif
-
-#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_RX_GPIO,
-                           RP2040_GPIO_FUNC_UART);      /* RX */
-#ifdef CONFIG_SERIAL_OFLOWCONTROL
-  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_RTS_GPIO,
-                           RP2040_GPIO_FUNC_UART);      /* RTS */
-#endif
-#endif
+  /* --- Place any board specific early initialization here --- */
 }
 
 /****************************************************************************
@@ -104,57 +73,9 @@ void rp2040_boardearlyinitialize(void)
 
 void rp2040_boardinitialize(void)
 {
-  /* Set default I2C pin */
-
-#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_SCL_GPIO,
-                           RP2040_GPIO_FUNC_I2C);       /* SCL */
-
-  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
-
-#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_SCL_GPIO,
-                           RP2040_GPIO_FUNC_I2C);       /* SCL */
-
-  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 */
-
-#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_SCK_GPIO,
-                           RP2040_GPIO_FUNC_SPI);       /* SCK */
-  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_CS_GPIO);        /* CSn */
-  rp2040_gpio_setdir(CONFIG_RP2040_SPI0_CS_GPIO, true);
-  rp2040_gpio_put(CONFIG_RP2040_SPI0_CS_GPIO, true);
-#endif
-
-#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_SCK_GPIO,
-                           RP2040_GPIO_FUNC_SPI);       /* SCK */
-  rp2040_gpio_set_function(CONFIG_RP2040_SPI1_TX_GPIO,
-                           RP2040_GPIO_FUNC_SPI);       /* TX */
-
-  /* CSn is controlled by board-specific logic */
+  #ifdef CONFIG_ARCH_BOARD_COMMON
+  rp2040_common_initialize();
+  #endif 
 
-  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
+  /* --- Place any board specific initialization here --- */
 }
diff --git a/boards/arm/rp2040/adafruit-kb2040/src/rp2040_bringup.c b/boards/arm/rp2040/adafruit-kb2040/src/rp2040_bringup.c
index 5bc59fdee2..b3fefade4a 100644
--- a/boards/arm/rp2040/adafruit-kb2040/src/rp2040_bringup.c
+++ b/boards/arm/rp2040/adafruit-kb2040/src/rp2040_bringup.c
@@ -33,50 +33,9 @@
 
 #include "rp2040_pico.h"
 
-#ifdef CONFIG_LCD_BACKPACK
-#include "rp2040_lcd_backpack.h"
-#endif
-
-#ifdef CONFIG_LCD
-#include <nuttx/board.h>
-#endif
-
-#ifdef CONFIG_LCD_DEV
-#include <nuttx/lcd/lcd_dev.h>
-#endif
-
-#ifdef CONFIG_VIDEO_FB
-#include <nuttx/video/fb.h>
-#endif
-
-#ifdef CONFIG_SENSORS_INA219
-#include <nuttx/sensors/ina219.h>
-#include "rp2040_ina219.h"
-#endif
-
-#ifdef CONFIG_SENSORS_BMP180
-#include <nuttx/sensors/bmp180.h>
-#include "rp2040_bmp180.h"
-#endif
-
-#ifdef CONFIG_RP2040_PWM
-#include "rp2040_pwm.h"
-#include "rp2040_pwmdev.h"
-#endif
-
-#if defined(CONFIG_RP2040_BOARD_HAS_WS2812) && defined(CONFIG_WS2812)
-#include "rp2040_ws2812.h"
-#endif
-
-#ifdef CONFIG_WS2812_HAS_WHITE
-#define HAS_WHITE true
-#else /* CONFIG_WS2812_HAS_WHITE */
-#define HAS_WHITE false
-#endif /* CONFIG_WS2812_HAS_WHITE */
-
-#if defined(CONFIG_ADC) && defined(CONFIG_RP2040_ADC)
-#include "rp2040_adc.h"
-#endif
+#ifdef CONFIG_ARCH_BOARD_COMMON
+#include "rp2040_common_bringup.h"
+#endif /* CONFIG_ARCH_BOARD_COMMON */
 
 /****************************************************************************
  * Public Functions
@@ -88,425 +47,17 @@
 
 int rp2040_bringup(void)
 {
-  int ret = 0;
+#ifdef CONFIG_ARCH_BOARD_COMMON
 
-#ifdef CONFIG_RP2040_I2C_DRIVER
-  #ifdef CONFIG_RP2040_I2C0
-  ret = board_i2cdev_initialize(0);
+  int ret = rp2040_common_bringup();
   if (ret < 0)
     {
-      _err("ERROR: Failed to initialize I2C0.\n");
-    }
-  #endif
-
-  #ifdef CONFIG_RP2040_I2C1
-  ret = board_i2cdev_initialize(1);
-  if (ret < 0)
-    {
-      _err("ERROR: Failed to initialize I2C1.\n");
-    }
-  #endif
-#endif
-
-#ifdef CONFIG_RP2040_SPI_DRIVER
-  #ifdef CONFIG_RP2040_SPI0
-  ret = board_spidev_initialize(0);
-  if (ret < 0)
-    {
-      _err("ERROR: Failed to initialize SPI0.\n");
-    }
-  #endif
-
-  #ifdef CONFIG_RP2040_SPI1
-  ret = board_spidev_initialize(1);
-  if (ret < 0)
-    {
-      _err("ERROR: Failed to initialize SPI1.\n");
-    }
-  #endif
-#endif
-
-#ifdef CONFIG_RP2040_PWM
-#  ifdef CONFIG_RP2040_PWM0
-#    if defined(CONFIG_PWM_NCHANNELS) && CONFIG_PWM_NCHANNELS == 2
-  ret = rp2040_pwmdev_initialize(0,
-                                 CONFIG_RP2040_PWM0A_GPIO,
-                                 CONFIG_RP2040_PWM0B_GPIO,
-                                 (0
-#      ifdef CONFIG_RP2040_PWM0A_INVERT
-                                  | RP2040_PWM_CSR_A_INV
-#      endif
-#      ifdef CONFIG_RP2040_PWM0B_INVERT
-                                  | RP2040_PWM_CSR_B_INV
-#      endif
-#      ifdef CONFIG_RP2040_PWM0_PHASE_CORRECT
-                                  | RP2040_PWM_CSR_PH_CORRECT
-#      endif
-                                 ));
-#    else
-  ret = rp2040_pwmdev_initialize(0,
-                                 CONFIG_RP2040_PWM0A_GPIO,
-                                 (0
-#      ifdef CONFIG_RP2040_PWM0A_INVERT
-                                  | RP2040_PWM_CSR_A_INV
-#      endif
-#      ifdef CONFIG_RP2040_PWM0_PHASE_CORRECT
-                                  | RP2040_PWM_CSR_PH_CORRECT
-#      endif
-                                 ));
-#    endif
-  if (ret < 0)
-    {
-      _err("ERROR: Failed to initialize PWM0.\n");
-    }
-#  endif
-
-#  ifdef CONFIG_RP2040_PWM1
-#    if defined(CONFIG_PWM_NCHANNELS) && CONFIG_PWM_NCHANNELS == 2
-  ret = rp2040_pwmdev_initialize(1,
-                                 CONFIG_RP2040_PWM1A_GPIO,
-                                 CONFIG_RP2040_PWM1B_GPIO,
-                                 (0
-#      ifdef CONFIG_RP2040_PWM1A_INVERT
-                                  | RP2040_PWM_CSR_A_INV
-#      endif
-#      ifdef CONFIG_RP2040_PWM1B_INVERT
-                                  | RP2040_PWM_CSR_B_INV
-#      endif
-#      ifdef CONFIG_RP2040_PWM1_PHASE_CORRECT
-                                  | RP2040_PWM_CSR_PH_CORRECT
-#      endif
-                                 ));
-#    else
-  ret = rp2040_pwmdev_initialize(1,
-                                 CONFIG_RP2040_PWM1A_GPIO,
-                                 (0
-#      ifdef CONFIG_RP2040_PWM1A_INVERT
-                                  | RP2040_PWM_CSR_A_INV
-#      endif
-#      ifdef CONFIG_RP2040_PWM1_PHASE_CORRECT
-                                  | RP2040_PWM_CSR_PH_CORRECT
-#      endif
-                                 ));
-#    endif
-  if (ret < 0)
-    {
-      _err("ERROR: Failed to initialize PWM1.\n");
-    }
-#  endif
-
-#  ifdef CONFIG_RP2040_PWM2
-#    if defined(CONFIG_PWM_NCHANNELS) && CONFIG_PWM_NCHANNELS == 2
-  ret = rp2040_pwmdev_initialize(2,
-                                 CONFIG_RP2040_PWM2A_GPIO,
-                                 CONFIG_RP2040_PWM2B_GPIO,
-                                 (0
-#      ifdef CONFIG_RP2040_PWM2A_INVERT
-                                  | RP2040_PWM_CSR_A_INV
-#      endif
-#      ifdef CONFIG_RP2040_PWM2B_INVERT
-                                  | RP2040_PWM_CSR_B_INV
-#      endif
-#      ifdef CONFIG_RP2040_PWM2_PHASE_CORRECT
-                                  | RP2040_PWM_CSR_PH_CORRECT
-#      endif
-                                 ));
-#    else
-  ret = rp2040_pwmdev_initialize(2,
-                                 CONFIG_RP2040_PWM2A_GPIO,
-                                 (0
-#      ifdef CONFIG_RP2040_PWM2A_INVERT
-                                  | RP2040_PWM_CSR_A_INV
-#      endif
-#      ifdef CONFIG_RP2040_PWM2_PHASE_CORRECT
-                                  | RP2040_PWM_CSR_PH_CORRECT
-#      endif
-                                 ));
-#    endif
-  if (ret < 0)
-    {
-      _err("ERROR: Failed to initialize PWM2.\n");
-    }
-#  endif
-
-#  ifdef CONFIG_RP2040_PWM3
-#    if defined(CONFIG_PWM_NCHANNELS) && CONFIG_PWM_NCHANNELS == 2
-  ret = rp2040_pwmdev_initialize(3,
-                                 CONFIG_RP2040_PWM3A_GPIO,
-                                 CONFIG_RP2040_PWM3B_GPIO,
-                                 (0
-#      ifdef CONFIG_RP2040_PWM3A_INVERT
-                                  | RP2040_PWM_CSR_A_INV
-#      endif
-#      ifdef CONFIG_RP2040_PWM3B_INVERT
-                                  | RP2040_PWM_CSR_B_INV
-#      endif
-#      ifdef CONFIG_RP2040_PWM3_PHASE_CORRECT
-                                  | RP2040_PWM_CSR_PH_CORRECT
-#      endif
-                                 ));
-#    else
-  ret = rp2040_pwmdev_initialize(3,
-                                 CONFIG_RP2040_PWM3A_GPIO,
-                                 (0
-#      ifdef CONFIG_RP2040_PWM3A_INVERT
-                                  | RP2040_PWM_CSR_A_INV
-#      endif
-#      ifdef CONFIG_RP2040_PWM3_PHASE_CORRECT
-                                  | RP2040_PWM_CSR_PH_CORRECT
-#      endif
-                                 ));
-#    endif
-  if (ret < 0)
-    {
-      _err("ERROR: Failed to initialize PWM3.\n");
-    }
-#  endif
-
-#  ifdef CONFIG_RP2040_PWM4
-#    if defined(CONFIG_PWM_NCHANNELS) && CONFIG_PWM_NCHANNELS == 2
-  ret = rp2040_pwmdev_initialize(4,
-                                 CONFIG_RP2040_PWM4A_GPIO,
-                                 CONFIG_RP2040_PWM4B_GPIO,
-                                 (0
-#      ifdef CONFIG_RP2040_PWM4A_INVERT
-                                  | RP2040_PWM_CSR_A_INV
-#      endif
-#      ifdef CONFIG_RP2040_PWM4B_INVERT
-                                  | RP2040_PWM_CSR_B_INV
-#      endif
-#      ifdef CONFIG_RP2040_PWM4_PHASE_CORRECT
-                                  | RP2040_PWM_CSR_PH_CORRECT
-#      endif
-                                 ));
-#    else
-  ret = rp2040_pwmdev_initialize(4,
-                                 CONFIG_RP2040_PWM4A_GPIO,
-                                 (0
-#      ifdef CONFIG_RP2040_PWM4A_INVERT
-                                  | RP2040_PWM_CSR_A_INV
-#      endif
-#      ifdef CONFIG_RP2040_PWM4_PHASE_CORRECT
-                                  | RP2040_PWM_CSR_PH_CORRECT
-#      endif
-                                 ));
-#    endif
-  if (ret < 0)
-    {
-      _err("ERROR: Failed to initialize PWM4.\n");
-    }
-#  endif
-
-#  ifdef CONFIG_RP2040_PWM5
-#    if defined(CONFIG_PWM_NCHANNELS) && CONFIG_PWM_NCHANNELS == 2
-  ret = rp2040_pwmdev_initialize(5,
-                                 CONFIG_RP2040_PWM5A_GPIO,
-                                 CONFIG_RP2040_PWM5B_GPIO,
-                                 (0
-#      ifdef CONFIG_RP2040_PWM5A_INVERT
-                                  | RP2040_PWM_CSR_A_INV
-#      endif
-#      ifdef CONFIG_RP2040_PWM5B_INVERT
-                                  | RP2040_PWM_CSR_B_INV
-#      endif
-#      ifdef CONFIG_RP2040_PWM5_PHASE_CORRECT
-                                  | RP2040_PWM_CSR_PH_CORRECT
-#      endif
-                                 ));
-#  else
-  ret = rp2040_pwmdev_initialize(5,
-                                 CONFIG_RP2040_PWM5A_GPIO,
-                                 (0
-#      ifdef CONFIG_RP2040_PWM5A_INVERT
-                                  | RP2040_PWM_CSR_A_INV
-#      endif
-#      ifdef CONFIG_RP2040_PWM5_PHASE_CORRECT
-                                  | RP2040_PWM_CSR_PH_CORRECT
-#      endif
-                                 ));
-#  endif
-  if (ret < 0)
-    {
-      _err("ERROR: Failed to initialize PWM5.\n");
-    }
-#  endif
-
-#  ifdef CONFIG_RP2040_PWM6
-#    if defined(CONFIG_PWM_NCHANNELS) && CONFIG_PWM_NCHANNELS == 2
-  ret = rp2040_pwmdev_initialize(6,
-                                 CONFIG_RP2040_PWM6A_GPIO,
-                                 CONFIG_RP2040_PWM6B_GPIO,
-                                 (0
-#      ifdef CONFIG_RP2040_PWM6A_INVERT
-                                  | RP2040_PWM_CSR_A_INV
-#      endif
-#      ifdef CONFIG_RP2040_PWM6B_INVERT
-                                  | RP2040_PWM_CSR_B_INV
-#      endif
-#      ifdef CONFIG_RP2040_PWM6_PHASE_CORRECT
-                                  | RP2040_PWM_CSR_PH_CORRECT
-#      endif
-                                 ));
-#    else
-  ret = rp2040_pwmdev_initialize(6,
-                                 CONFIG_RP2040_PWM6A_GPIO,
-                                 (0
-#      ifdef CONFIG_RP2040_PWM6A_INVERT
-                                  | RP2040_PWM_CSR_A_INV
-#      endif
-#      ifdef CONFIG_RP2040_PWM6_PHASE_CORRECT
-                                  | RP2040_PWM_CSR_PH_CORRECT
-#      endif
-                                 ));
-#    endif
-  if (ret < 0)
-    {
-      _err("ERROR: Failed to initialize PWM6.\n");
-    }
-#  endif
-#endif
-
-#ifdef CONFIG_RP2040_SPISD
-  /* Mount the SPI-based MMC/SD block driver */
-
-  ret = board_spisd_initialize(0, CONFIG_RP2040_SPISD_SPI_CH);
-  if (ret < 0)
-    {
-      _err("ERROR: Failed to initialize SPI device to MMC/SD: %d\n",
-           ret);
-    }
-#endif
-
-#ifdef CONFIG_FS_PROCFS
-  /* Mount the procfs file system */
-
-  ret = nx_mount(NULL, "/proc", "procfs", 0, NULL);
-  if (ret < 0)
-    {
-      serr("ERROR: Failed to mount procfs at %s: %d\n", "/proc", ret);
-    }
-#endif
-
-#ifdef CONFIG_SENSORS_BMP180
-  /* Try to register BMP180 device in I2C0 */
-
-  ret = board_bmp180_initialize(0);
-  if (ret < 0)
-    {
-      syslog(LOG_ERR, "Failed to initialize BMP180 driver: %d\n", ret);
-    }
-#endif
-
-#ifdef CONFIG_SENSORS_INA219
-  /* Configure and initialize the INA219 sensor in I2C0 */
-
-  ret = board_ina219_initialize(0);
-  if (ret < 0)
-    {
-      syslog(LOG_ERR, "ERROR: rp2040_ina219_initialize() failed: %d\n", ret);
-    }
-#endif
-
-#ifdef CONFIG_VIDEO_FB
-  ret = fb_register(0, 0);
-  if (ret < 0)
-    {
-      _err("ERROR: Failed to initialize Frame Buffer Driver.\n");
-    }
-#elif defined(CONFIG_LCD)
-  ret = board_lcd_initialize();
-  if (ret < 0)
-    {
-      syslog(LOG_ERR, "ERROR: Failed to initialize LCD.\n");
-    }
-#endif
-
-#ifdef CONFIG_LCD_DEV
-  ret = lcddev_register(0);
-  if (ret < 0)
-    {
-      syslog(LOG_ERR, "ERROR: lcddev_register() failed: %d\n", ret);
-    }
-#endif
-
-#ifdef CONFIG_LCD_BACKPACK
-  /* slcd:0, i2c:0, rows=2, cols=16 */
-
-  ret = board_lcd_backpack_init(0, 0, 2, 16);
-  if (ret < 0)
-    {
-      syslog(LOG_ERR, "Failed to initialize PCF8574 LCD, error %d\n", ret);
-      return ret;
-    }
-#endif
-
-#ifdef CONFIG_RP2040_I2S
-  ret = board_i2sdev_initialize(0);
-  if (ret < 0)
-    {
-      _err("ERROR: Failed to initialize I2S.\n");
-    }
-#endif
-
-#ifdef CONFIG_DEV_GPIO
-  ret = rp2040_dev_gpio_init();
-  if (ret < 0)
-    {
-      syslog(LOG_ERR, "Failed to initialize GPIO Driver: %d\n", ret);
       return ret;
     }
-#endif
-
-  /* Initialize board neo-pixel */
-
-#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
-
-#if defined(CONFIG_ADC) && defined(CONFIG_RP2040_ADC)
-
-# ifdef CONFIG_RPC2040_ADC_CHANNEL0
-#   define ADC_0 true
-# else
-#   define ADC_0 false
-# endif
-
-# ifdef CONFIG_RPC2040_ADC_CHANNEL1
-#   define ADC_1 true
-# else
-#   define ADC_1 false
-# endif
 
-# ifdef CONFIG_RPC2040_ADC_CHANNEL2
-#   define ADC_2 true
-# else
-#   define ADC_2 false
-# endif
-
-# ifdef CONFIG_RPC2040_ADC_CHANNEL3
-#   define ADC_3 true
-# else
-#   define ADC_3 false
-# endif
-
-# ifdef CONFIG_RPC2040_ADC_TEMPERATURE
-#   define ADC_TEMP true
-# else
-#   define ADC_TEMP false
-# endif
-
-  ret = rp2040_adc_setup("/dev/adc0", ADC_0, ADC_1, ADC_2, ADC_3, ADC_TEMP);
-  if (ret != OK)
-    {
-      syslog(LOG_ERR, "Failed to initialize ADC Driver: %d\n", ret);
-      return ret;
-    }
+#endif /* CONFIG_ARCH_BOARD_COMMON */
 
-#endif /* defined(CONFIG_ADC) && defined(CONFIG_RP2040_ADC) */
+  /* --- Place any board specific bringup code here --- */
 
-  return ret;
+  return OK;
 }
diff --git a/boards/arm/rp2040/adafruit-qt-py-rp2040/configs/gpio/defconfig b/boards/arm/rp2040/adafruit-qt-py-rp2040/configs/gpio/defconfig
index f5362d78c5..e5f6b58d17 100644
--- a/boards/arm/rp2040/adafruit-qt-py-rp2040/configs/gpio/defconfig
+++ b/boards/arm/rp2040/adafruit-qt-py-rp2040/configs/gpio/defconfig
@@ -54,4 +54,3 @@ CONFIG_TESTING_GETPRIME=y
 CONFIG_TESTING_OSTEST=y
 CONFIG_UART1_SERIAL_CONSOLE=y
 CONFIG_WS2812=y
-CONFIG_WS2812_NON_SPI_DRIVER=y
diff --git a/boards/arm/rp2040/adafruit-qt-py-rp2040/configs/nsh/defconfig b/boards/arm/rp2040/adafruit-qt-py-rp2040/configs/nsh/defconfig
index 084cb978f0..6de7d7eb77 100644
--- a/boards/arm/rp2040/adafruit-qt-py-rp2040/configs/nsh/defconfig
+++ b/boards/arm/rp2040/adafruit-qt-py-rp2040/configs/nsh/defconfig
@@ -52,4 +52,3 @@ CONFIG_TESTING_GETPRIME=y
 CONFIG_TESTING_OSTEST=y
 CONFIG_UART1_SERIAL_CONSOLE=y
 CONFIG_WS2812=y
-CONFIG_WS2812_NON_SPI_DRIVER=y
diff --git a/boards/arm/rp2040/adafruit-qt-py-rp2040/configs/nshsram/defconfig b/boards/arm/rp2040/adafruit-qt-py-rp2040/configs/nshsram/defconfig
index 4dce15a151..35cdedead4 100644
--- a/boards/arm/rp2040/adafruit-qt-py-rp2040/configs/nshsram/defconfig
+++ b/boards/arm/rp2040/adafruit-qt-py-rp2040/configs/nshsram/defconfig
@@ -51,4 +51,3 @@ CONFIG_TESTING_GETPRIME=y
 CONFIG_TESTING_OSTEST=y
 CONFIG_UART1_SERIAL_CONSOLE=y
 CONFIG_WS2812=y
-CONFIG_WS2812_NON_SPI_DRIVER=y
diff --git a/boards/arm/rp2040/adafruit-qt-py-rp2040/configs/smp/defconfig b/boards/arm/rp2040/adafruit-qt-py-rp2040/configs/smp/defconfig
index 0df779d086..9b4c708b01 100644
--- a/boards/arm/rp2040/adafruit-qt-py-rp2040/configs/smp/defconfig
+++ b/boards/arm/rp2040/adafruit-qt-py-rp2040/configs/smp/defconfig
@@ -58,4 +58,3 @@ CONFIG_TESTING_OSTEST=y
 CONFIG_TESTING_SMP=y
 CONFIG_UART1_SERIAL_CONSOLE=y
 CONFIG_WS2812=y
-CONFIG_WS2812_NON_SPI_DRIVER=y
diff --git a/boards/arm/rp2040/adafruit-qt-py-rp2040/configs/usbnsh/defconfig b/boards/arm/rp2040/adafruit-qt-py-rp2040/configs/usbnsh/defconfig
index 0edc888649..760c113648 100644
--- a/boards/arm/rp2040/adafruit-qt-py-rp2040/configs/usbnsh/defconfig
+++ b/boards/arm/rp2040/adafruit-qt-py-rp2040/configs/usbnsh/defconfig
@@ -53,4 +53,3 @@ CONFIG_TESTING_OSTEST=y
 CONFIG_USBDEV=y
 CONFIG_USBDEV_BUSPOWERED=y
 CONFIG_WS2812=y
-CONFIG_WS2812_NON_SPI_DRIVER=y
diff --git a/boards/arm/rp2040/adafruit-qt-py-rp2040/src/rp2040_boardinitialize.c b/boards/arm/rp2040/adafruit-qt-py-rp2040/src/rp2040_boardinitialize.c
index e2935b3e46..4d3010f8f4 100644
--- a/boards/arm/rp2040/adafruit-qt-py-rp2040/src/rp2040_boardinitialize.c
+++ b/boards/arm/rp2040/adafruit-qt-py-rp2040/src/rp2040_boardinitialize.c
@@ -32,6 +32,10 @@
 #include "arm_internal.h"
 #include "rp2040_gpio.h"
 
+#ifdef CONFIG_ARCH_BOARD_COMMON
+#include "rp2040_common_initialize.h"
+#endif /* CONFIG_ARCH_BOARD_COMMON */
+
 /****************************************************************************
  * Pre-processor Definitions
  ****************************************************************************/
@@ -53,46 +57,11 @@
 
 void rp2040_boardearlyinitialize(void)
 {
-  rp2040_gpio_initialize();
-
-  /* Disable IE on GPIO 26-29 */
-
-  clrbits_reg32(RP2040_PADS_BANK0_GPIO_IE, RP2040_PADS_BANK0_GPIO(26));
-  clrbits_reg32(RP2040_PADS_BANK0_GPIO_IE, RP2040_PADS_BANK0_GPIO(27));
-  clrbits_reg32(RP2040_PADS_BANK0_GPIO_IE, RP2040_PADS_BANK0_GPIO(28));
-  clrbits_reg32(RP2040_PADS_BANK0_GPIO_IE, RP2040_PADS_BANK0_GPIO(29));
-
-  /* Set default UART pin */
+  #ifdef CONFIG_ARCH_BOARD_COMMON
+  rp2040_common_earlyinitialize();
+  #endif 
 
-#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_RX_GPIO,
-                           RP2040_GPIO_FUNC_UART);      /* RX */
-#ifdef CONFIG_SERIAL_OFLOWCONTROL
-  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_RTS_GPIO,
-                           RP2040_GPIO_FUNC_UART);      /* RTS */
-#endif
-#endif
-
-#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_RX_GPIO,
-                           RP2040_GPIO_FUNC_UART);      /* RX */
-#ifdef CONFIG_SERIAL_OFLOWCONTROL
-  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_RTS_GPIO,
-                           RP2040_GPIO_FUNC_UART);      /* RTS */
-#endif
-#endif
+  /* --- Place any board specific early initialization here --- */
 }
 
 /****************************************************************************
@@ -104,57 +73,9 @@ void rp2040_boardearlyinitialize(void)
 
 void rp2040_boardinitialize(void)
 {
-  /* Set default I2C pin */
-
-#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_SCL_GPIO,
-                           RP2040_GPIO_FUNC_I2C);       /* SCL */
-
-  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
-
-#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_SCL_GPIO,
-                           RP2040_GPIO_FUNC_I2C);       /* SCL */
-
-  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 */
-
-#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_SCK_GPIO,
-                           RP2040_GPIO_FUNC_SPI);       /* SCK */
-  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_CS_GPIO);        /* CSn */
-  rp2040_gpio_setdir(CONFIG_RP2040_SPI0_CS_GPIO, true);
-  rp2040_gpio_put(CONFIG_RP2040_SPI0_CS_GPIO, true);
-#endif
-
-#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_SCK_GPIO,
-                           RP2040_GPIO_FUNC_SPI);       /* SCK */
-  rp2040_gpio_set_function(CONFIG_RP2040_SPI1_TX_GPIO,
-                           RP2040_GPIO_FUNC_SPI);       /* TX */
-
-  /* CSn is controlled by board-specific logic */
+  #ifdef CONFIG_ARCH_BOARD_COMMON
+  rp2040_common_initialize();
+  #endif 
 
-  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
+  /* --- Place any board specific initialization here --- */
 }
diff --git a/boards/arm/rp2040/adafruit-qt-py-rp2040/src/rp2040_bringup.c b/boards/arm/rp2040/adafruit-qt-py-rp2040/src/rp2040_bringup.c
index 3814acd727..83d4679ba7 100644
--- a/boards/arm/rp2040/adafruit-qt-py-rp2040/src/rp2040_bringup.c
+++ b/boards/arm/rp2040/adafruit-qt-py-rp2040/src/rp2040_bringup.c
@@ -27,56 +27,9 @@
 #include <debug.h>
 #include <stddef.h>
 
-#include <nuttx/fs/fs.h>
-
-#include <arch/board/board.h>
-
-#include "rp2040_pico.h"
-
-#ifdef CONFIG_LCD_BACKPACK
-#include "rp2040_lcd_backpack.h"
-#endif
-
-#ifdef CONFIG_LCD
-#include <nuttx/board.h>
-#endif
-
-#ifdef CONFIG_LCD_DEV
-#include <nuttx/lcd/lcd_dev.h>
-#endif
-
-#ifdef CONFIG_VIDEO_FB
-#include <nuttx/video/fb.h>
-#endif
-
-#ifdef CONFIG_SENSORS_INA219
-#include <nuttx/sensors/ina219.h>
-#include "rp2040_ina219.h"
-#endif
-
-#ifdef CONFIG_SENSORS_BMP180
-#include <nuttx/sensors/bmp180.h>
-#include "rp2040_bmp180.h"
-#endif
-
-#ifdef CONFIG_RP2040_PWM
-#include "rp2040_pwm.h"
-#include "rp2040_pwmdev.h"
-#endif
-
-#if defined(CONFIG_RP2040_BOARD_HAS_WS2812) && defined(CONFIG_WS2812)
-#include "rp2040_ws2812.h"
-#endif
-
-#ifdef CONFIG_WS2812_HAS_WHITE
-#define HAS_WHITE true
-#else /* CONFIG_WS2812_HAS_WHITE */
-#define HAS_WHITE false
-#endif /* CONFIG_WS2812_HAS_WHITE */
-
-#if defined(CONFIG_ADC) && defined(CONFIG_RP2040_ADC)
-#include "rp2040_adc.h"
-#endif
+#ifdef CONFIG_ARCH_BOARD_COMMON
+#include "rp2040_common_bringup.h"
+#endif /* CONFIG_ARCH_BOARD_COMMON */
 
 /****************************************************************************
  * Public Functions
@@ -88,425 +41,17 @@
 
 int rp2040_bringup(void)
 {
-  int ret = 0;
-
-#ifdef CONFIG_RP2040_I2C_DRIVER
-  #ifdef CONFIG_RP2040_I2C0
-  ret = board_i2cdev_initialize(0);
-  if (ret < 0)
-    {
-      _err("ERROR: Failed to initialize I2C0.\n");
-    }
-  #endif
-
-  #ifdef CONFIG_RP2040_I2C1
-  ret = board_i2cdev_initialize(1);
-  if (ret < 0)
-    {
-      _err("ERROR: Failed to initialize I2C1.\n");
-    }
-  #endif
-#endif
-
-#ifdef CONFIG_RP2040_SPI_DRIVER
-  #ifdef CONFIG_RP2040_SPI0
-  ret = board_spidev_initialize(0);
-  if (ret < 0)
-    {
-      _err("ERROR: Failed to initialize SPI0.\n");
-    }
-  #endif
-
-  #ifdef CONFIG_RP2040_SPI1
-  ret = board_spidev_initialize(1);
-  if (ret < 0)
-    {
-      _err("ERROR: Failed to initialize SPI1.\n");
-    }
-  #endif
-#endif
-
-#ifdef CONFIG_RP2040_PWM
-#  ifdef CONFIG_RP2040_PWM0
-#    if defined(CONFIG_PWM_NCHANNELS) && CONFIG_PWM_NCHANNELS == 2
-  ret = rp2040_pwmdev_initialize(0,
-                                 CONFIG_RP2040_PWM0A_GPIO,
-                                 CONFIG_RP2040_PWM0B_GPIO,
-                                 (0
-#      ifdef CONFIG_RP2040_PWM0A_INVERT
-                                  | RP2040_PWM_CSR_A_INV
-#      endif
-#      ifdef CONFIG_RP2040_PWM0B_INVERT
-                                  | RP2040_PWM_CSR_B_INV
-#      endif
-#      ifdef CONFIG_RP2040_PWM0_PHASE_CORRECT
-                                  | RP2040_PWM_CSR_PH_CORRECT
-#      endif
-                                 ));
-#    else
-  ret = rp2040_pwmdev_initialize(0,
-                                 CONFIG_RP2040_PWM0A_GPIO,
-                                 (0
-#      ifdef CONFIG_RP2040_PWM0A_INVERT
-                                  | RP2040_PWM_CSR_A_INV
-#      endif
-#      ifdef CONFIG_RP2040_PWM0_PHASE_CORRECT
-                                  | RP2040_PWM_CSR_PH_CORRECT
-#      endif
-                                 ));
-#    endif
-  if (ret < 0)
-    {
-      _err("ERROR: Failed to initialize PWM0.\n");
-    }
-#  endif
-
-#  ifdef CONFIG_RP2040_PWM1
-#    if defined(CONFIG_PWM_NCHANNELS) && CONFIG_PWM_NCHANNELS == 2
-  ret = rp2040_pwmdev_initialize(1,
-                                 CONFIG_RP2040_PWM1A_GPIO,
-                                 CONFIG_RP2040_PWM1B_GPIO,
-                                 (0
-#      ifdef CONFIG_RP2040_PWM1A_INVERT
-                                  | RP2040_PWM_CSR_A_INV
-#      endif
-#      ifdef CONFIG_RP2040_PWM1B_INVERT
-                                  | RP2040_PWM_CSR_B_INV
-#      endif
-#      ifdef CONFIG_RP2040_PWM1_PHASE_CORRECT
-                                  | RP2040_PWM_CSR_PH_CORRECT
-#      endif
-                                 ));
-#    else
-  ret = rp2040_pwmdev_initialize(1,
-                                 CONFIG_RP2040_PWM1A_GPIO,
-                                 (0
-#      ifdef CONFIG_RP2040_PWM1A_INVERT
-                                  | RP2040_PWM_CSR_A_INV
-#      endif
-#      ifdef CONFIG_RP2040_PWM1_PHASE_CORRECT
-                                  | RP2040_PWM_CSR_PH_CORRECT
-#      endif
-                                 ));
-#    endif
-  if (ret < 0)
-    {
-      _err("ERROR: Failed to initialize PWM1.\n");
-    }
-#  endif
-
-#  ifdef CONFIG_RP2040_PWM2
-#    if defined(CONFIG_PWM_NCHANNELS) && CONFIG_PWM_NCHANNELS == 2
-  ret = rp2040_pwmdev_initialize(2,
-                                 CONFIG_RP2040_PWM2A_GPIO,
-                                 CONFIG_RP2040_PWM2B_GPIO,
-                                 (0
-#      ifdef CONFIG_RP2040_PWM2A_INVERT
-                                  | RP2040_PWM_CSR_A_INV
-#      endif
-#      ifdef CONFIG_RP2040_PWM2B_INVERT
-                                  | RP2040_PWM_CSR_B_INV
-#      endif
-#      ifdef CONFIG_RP2040_PWM2_PHASE_CORRECT
-                                  | RP2040_PWM_CSR_PH_CORRECT
-#      endif
-                                 ));
-#    else
-  ret = rp2040_pwmdev_initialize(2,
-                                 CONFIG_RP2040_PWM2A_GPIO,
-                                 (0
-#      ifdef CONFIG_RP2040_PWM2A_INVERT
-                                  | RP2040_PWM_CSR_A_INV
-#      endif
-#      ifdef CONFIG_RP2040_PWM2_PHASE_CORRECT
-                                  | RP2040_PWM_CSR_PH_CORRECT
-#      endif
-                                 ));
-#    endif
-  if (ret < 0)
-    {
-      _err("ERROR: Failed to initialize PWM2.\n");
-    }
-#  endif
-
-#  ifdef CONFIG_RP2040_PWM3
-#    if defined(CONFIG_PWM_NCHANNELS) && CONFIG_PWM_NCHANNELS == 2
-  ret = rp2040_pwmdev_initialize(3,
-                                 CONFIG_RP2040_PWM3A_GPIO,
-                                 CONFIG_RP2040_PWM3B_GPIO,
-                                 (0
-#      ifdef CONFIG_RP2040_PWM3A_INVERT
-                                  | RP2040_PWM_CSR_A_INV
-#      endif
-#      ifdef CONFIG_RP2040_PWM3B_INVERT
-                                  | RP2040_PWM_CSR_B_INV
-#      endif
-#      ifdef CONFIG_RP2040_PWM3_PHASE_CORRECT
-                                  | RP2040_PWM_CSR_PH_CORRECT
-#      endif
-                                 ));
-#    else
-  ret = rp2040_pwmdev_initialize(3,
-                                 CONFIG_RP2040_PWM3A_GPIO,
-                                 (0
-#      ifdef CONFIG_RP2040_PWM3A_INVERT
-                                  | RP2040_PWM_CSR_A_INV
-#      endif
-#      ifdef CONFIG_RP2040_PWM3_PHASE_CORRECT
-                                  | RP2040_PWM_CSR_PH_CORRECT
-#      endif
-                                 ));
-#    endif
-  if (ret < 0)
-    {
-      _err("ERROR: Failed to initialize PWM3.\n");
-    }
-#  endif
-
-#  ifdef CONFIG_RP2040_PWM4
-#    if defined(CONFIG_PWM_NCHANNELS) && CONFIG_PWM_NCHANNELS == 2
-  ret = rp2040_pwmdev_initialize(4,
-                                 CONFIG_RP2040_PWM4A_GPIO,
-                                 CONFIG_RP2040_PWM4B_GPIO,
-                                 (0
-#      ifdef CONFIG_RP2040_PWM4A_INVERT
-                                  | RP2040_PWM_CSR_A_INV
-#      endif
-#      ifdef CONFIG_RP2040_PWM4B_INVERT
-                                  | RP2040_PWM_CSR_B_INV
-#      endif
-#      ifdef CONFIG_RP2040_PWM4_PHASE_CORRECT
-                                  | RP2040_PWM_CSR_PH_CORRECT
-#      endif
-                                 ));
-#    else
-  ret = rp2040_pwmdev_initialize(4,
-                                 CONFIG_RP2040_PWM4A_GPIO,
-                                 (0
-#      ifdef CONFIG_RP2040_PWM4A_INVERT
-                                  | RP2040_PWM_CSR_A_INV
-#      endif
-#      ifdef CONFIG_RP2040_PWM4_PHASE_CORRECT
-                                  | RP2040_PWM_CSR_PH_CORRECT
-#      endif
-                                 ));
-#    endif
-  if (ret < 0)
-    {
-      _err("ERROR: Failed to initialize PWM4.\n");
-    }
-#  endif
-
-#  ifdef CONFIG_RP2040_PWM5
-#    if defined(CONFIG_PWM_NCHANNELS) && CONFIG_PWM_NCHANNELS == 2
-  ret = rp2040_pwmdev_initialize(5,
-                                 CONFIG_RP2040_PWM5A_GPIO,
-                                 CONFIG_RP2040_PWM5B_GPIO,
-                                 (0
-#      ifdef CONFIG_RP2040_PWM5A_INVERT
-                                  | RP2040_PWM_CSR_A_INV
-#      endif
-#      ifdef CONFIG_RP2040_PWM5B_INVERT
-                                  | RP2040_PWM_CSR_B_INV
-#      endif
-#      ifdef CONFIG_RP2040_PWM5_PHASE_CORRECT
-                                  | RP2040_PWM_CSR_PH_CORRECT
-#      endif
-                                 ));
-#  else
-  ret = rp2040_pwmdev_initialize(5,
-                                 CONFIG_RP2040_PWM5A_GPIO,
-                                 (0
-#      ifdef CONFIG_RP2040_PWM5A_INVERT
-                                  | RP2040_PWM_CSR_A_INV
-#      endif
-#      ifdef CONFIG_RP2040_PWM5_PHASE_CORRECT
-                                  | RP2040_PWM_CSR_PH_CORRECT
-#      endif
-                                 ));
-#  endif
-  if (ret < 0)
-    {
-      _err("ERROR: Failed to initialize PWM5.\n");
-    }
-#  endif
-
-#  ifdef CONFIG_RP2040_PWM6
-#    if defined(CONFIG_PWM_NCHANNELS) && CONFIG_PWM_NCHANNELS == 2
-  ret = rp2040_pwmdev_initialize(6,
-                                 CONFIG_RP2040_PWM6A_GPIO,
-                                 CONFIG_RP2040_PWM6B_GPIO,
-                                 (0
-#      ifdef CONFIG_RP2040_PWM6A_INVERT
-                                  | RP2040_PWM_CSR_A_INV
-#      endif
-#      ifdef CONFIG_RP2040_PWM6B_INVERT
-                                  | RP2040_PWM_CSR_B_INV
-#      endif
-#      ifdef CONFIG_RP2040_PWM6_PHASE_CORRECT
-                                  | RP2040_PWM_CSR_PH_CORRECT
-#      endif
-                                 ));
-#    else
-  ret = rp2040_pwmdev_initialize(6,
-                                 CONFIG_RP2040_PWM6A_GPIO,
-                                 (0
-#      ifdef CONFIG_RP2040_PWM6A_INVERT
-                                  | RP2040_PWM_CSR_A_INV
-#      endif
-#      ifdef CONFIG_RP2040_PWM6_PHASE_CORRECT
-                                  | RP2040_PWM_CSR_PH_CORRECT
-#      endif
-                                 ));
-#    endif
-  if (ret < 0)
-    {
-      _err("ERROR: Failed to initialize PWM6.\n");
-    }
-#  endif
-#endif
-
-#ifdef CONFIG_RP2040_SPISD
-  /* Mount the SPI-based MMC/SD block driver */
-
-  ret = board_spisd_initialize(0, CONFIG_RP2040_SPISD_SPI_CH);
-  if (ret < 0)
-    {
-      _err("ERROR: Failed to initialize SPI device to MMC/SD: %d\n",
-           ret);
-    }
-#endif
-
-#ifdef CONFIG_FS_PROCFS
-  /* Mount the procfs file system */
-
-  ret = nx_mount(NULL, "/proc", "procfs", 0, NULL);
-  if (ret < 0)
-    {
-      serr("ERROR: Failed to mount procfs at %s: %d\n", "/proc", ret);
-    }
-#endif
-
-#ifdef CONFIG_SENSORS_BMP180
-  /* Try to register BMP180 device in I2C0 */
-
-  ret = board_bmp180_initialize(0);
-  if (ret < 0)
-    {
-      syslog(LOG_ERR, "Failed to initialize BMP180 driver: %d\n", ret);
-    }
-#endif
-
-#ifdef CONFIG_SENSORS_INA219
-  /* Configure and initialize the INA219 sensor in I2C0 */
-
-  ret = board_ina219_initialize(0);
-  if (ret < 0)
-    {
-      syslog(LOG_ERR, "ERROR: rp2040_ina219_initialize() failed: %d\n", ret);
-    }
-#endif
-
-#ifdef CONFIG_VIDEO_FB
-  ret = fb_register(0, 0);
-  if (ret < 0)
-    {
-      _err("ERROR: Failed to initialize Frame Buffer Driver.\n");
-    }
-#elif defined(CONFIG_LCD)
-  ret = board_lcd_initialize();
-  if (ret < 0)
-    {
-      syslog(LOG_ERR, "ERROR: Failed to initialize LCD.\n");
-    }
-#endif
-
-#ifdef CONFIG_LCD_DEV
-  ret = lcddev_register(0);
-  if (ret < 0)
-    {
-      syslog(LOG_ERR, "ERROR: lcddev_register() failed: %d\n", ret);
-    }
-#endif
-
-#ifdef CONFIG_LCD_BACKPACK
-  /* slcd:0, i2c:0, rows=2, cols=16 */
+#ifdef CONFIG_ARCH_BOARD_COMMON
 
-  ret = board_lcd_backpack_init(0, 0, 2, 16);
+  int ret = rp2040_common_bringup();
   if (ret < 0)
     {
-      syslog(LOG_ERR, "Failed to initialize PCF8574 LCD, error %d\n", ret);
       return ret;
     }
-#endif
 
-#ifdef CONFIG_RP2040_I2S
-  ret = board_i2sdev_initialize(0);
-  if (ret < 0)
-    {
-      _err("ERROR: Failed to initialize I2S.\n");
-    }
-#endif
-
-#ifdef CONFIG_DEV_GPIO
-  ret = rp2040_dev_gpio_init();
-  if (ret < 0)
-    {
-      syslog(LOG_ERR, "Failed to initialize GPIO Driver: %d\n", ret);
-      return ret;
-    }
-#endif
-
-  /* Initialize board neo-pixel */
-
-#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
-
-#if defined(CONFIG_ADC) && defined(CONFIG_RP2040_ADC)
-
-# ifdef CONFIG_RPC2040_ADC_CHANNEL0
-#   define ADC_0 true
-# else
-#   define ADC_0 false
-# endif
-
-# ifdef CONFIG_RPC2040_ADC_CHANNEL1
-#   define ADC_1 true
-# else
-#   define ADC_1 false
-# endif
-
-# ifdef CONFIG_RPC2040_ADC_CHANNEL2
-#   define ADC_2 true
-# else
-#   define ADC_2 false
-# endif
-
-# ifdef CONFIG_RPC2040_ADC_CHANNEL3
-#   define ADC_3 true
-# else
-#   define ADC_3 false
-# endif
-
-# ifdef CONFIG_RPC2040_ADC_TEMPERATURE
-#   define ADC_TEMP true
-# else
-#   define ADC_TEMP false
-# endif
-
-  ret = rp2040_adc_setup("/dev/adc0", ADC_0, ADC_1, ADC_2, ADC_3, ADC_TEMP);
-  if (ret != OK)
-    {
-      syslog(LOG_ERR, "Failed to initialize ADC Driver: %d\n", ret);
-      return ret;
-    }
+#endif /* CONFIG_ARCH_BOARD_COMMON */
 
-#endif /* defined(CONFIG_ADC) && defined(CONFIG_RP2040_ADC) */
+  /* --- Place any board specific bringup code here --- */
 
-  return ret;
+  return OK;
 }
diff --git a/boards/arm/rp2040/common/include/rp2040_common_bringup.h b/boards/arm/rp2040/common/include/rp2040_common_bringup.h
new file mode 100644
index 0000000000..d1c3483d19
--- /dev/null
+++ b/boards/arm/rp2040/common/include/rp2040_common_bringup.h
@@ -0,0 +1,47 @@
+/****************************************************************************
+ * boards/arm/rp2040/common/include/rp2040_common_bringup.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_COMMON_INCLUDE_RP2040_COMMON_BRINGUP_H
+#define __BOARDS_ARM_RP2040_COMMON_INCLUDE_RP2040_COMMON_BRINGUP_H
+
+#ifdef __cplusplus
+#define EXTERN extern "C"
+extern "C"
+{
+#else
+#define EXTERN extern
+#endif
+
+/****************************************************************************
+ * Public Function Prototypes
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: rp2040_common_bringup
+ ****************************************************************************/
+
+int rp2040_common_bringup(void);
+
+#undef EXTERN
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __BOARDS_ARM_RP2040_COMMON_INCLUDE_RP2040_COMMON_BRINGUP_H */
\ No newline at end of file
diff --git a/boards/arm/rp2040/common/include/rp2040_common_initialize.h b/boards/arm/rp2040/common/include/rp2040_common_initialize.h
new file mode 100644
index 0000000000..d8bb654f78
--- /dev/null
+++ b/boards/arm/rp2040/common/include/rp2040_common_initialize.h
@@ -0,0 +1,60 @@
+/****************************************************************************
+ * boards/arm/rp2040/common/include/rp2040_common_initialize.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_COMMON_INCLUDE_RP2040_COMMON_INITIALIZE_H
+#define __BOARDS_ARM_RP2040_COMMON_INCLUDE_RP2040_COMMON_INITIALIZE_H
+
+#ifdef __cplusplus
+#define EXTERN extern "C"
+extern "C"
+{
+#else
+#define EXTERN extern
+#endif
+
+/****************************************************************************
+ * Public Function Prototypes
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: rp2040_common_earlyinitialize
+ *
+ * This is the early initialization common to all RP2040 boards.
+ * It configures the GPIO, SPI, and I2C pins.
+ ****************************************************************************/
+
+int rp2040_common_earlyinitialize(void);
+
+/****************************************************************************
+ * Name: rp2040_common_initialize
+ *
+ * Description:
+ *  It configures the pin assignments that were not done in the early
+ *  initialization.
+ ****************************************************************************/
+
+void rp2040_common_initialize(void);
+
+#undef EXTERN
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __BOARDS_ARM_RP2040_COMMON_INCLUDE_RP2040_COMMON_INITIALIZE_H */
\ No newline at end of file
diff --git a/boards/arm/rp2040/common/src/.gitignore b/boards/arm/rp2040/common/src/.gitignore
new file mode 100644
index 0000000000..608fca90db
--- /dev/null
+++ b/boards/arm/rp2040/common/src/.gitignore
@@ -0,0 +1 @@
+*.image
diff --git a/boards/arm/rp2040/common/src/Make.defs b/boards/arm/rp2040/common/src/Make.defs
index 0f6c36cfec..3c93e2c1f7 100644
--- a/boards/arm/rp2040/common/src/Make.defs
+++ b/boards/arm/rp2040/common/src/Make.defs
@@ -20,6 +20,9 @@
 
 ifeq ($(CONFIG_ARCH_BOARD_COMMON),y)
 
+CSRCS += rp2040_common_bringup.c
+CSRCS += rp2040_common_initialize.c
+
 ifeq ($(CONFIG_RP2040_I2C_DRIVER),y)
 CSRCS += rp2040_i2cdev.c
 endif
diff --git a/boards/arm/rp2040/raspberrypi-pico/src/rp2040_bringup.c b/boards/arm/rp2040/common/src/rp2040_common_bringup.c
similarity index 89%
copy from boards/arm/rp2040/raspberrypi-pico/src/rp2040_bringup.c
copy to boards/arm/rp2040/common/src/rp2040_common_bringup.c
index 2e5ae58070..15d40a0f78 100644
--- a/boards/arm/rp2040/raspberrypi-pico/src/rp2040_bringup.c
+++ b/boards/arm/rp2040/common/src/rp2040_common_bringup.c
@@ -1,5 +1,5 @@
 /****************************************************************************
- * boards/arm/rp2040/raspberrypi-pico/src/rp2040_bringup.c
+ * boards/arm/rp2040/common/src/rp2040_common_bringup.c
  *
  * Licensed to the Apache Software Foundation (ASF) under one or more
  * contributor license agreements.  See the NOTICE file distributed with
@@ -25,6 +25,7 @@
 #include <nuttx/config.h>
 
 #include <debug.h>
+#include <errno.h>
 #include <stddef.h>
 
 #include <nuttx/fs/fs.h>
@@ -32,6 +33,7 @@
 #include <arch/board/board.h>
 
 #include "rp2040_pico.h"
+#include "rp2040_common_bringup.h"
 
 #ifdef CONFIG_LCD_BACKPACK
 #include "rp2040_lcd_backpack.h"
@@ -83,10 +85,10 @@
  ****************************************************************************/
 
 /****************************************************************************
- * Name: rp2040_bringup
+ * Name: rp2040_common_bringup
  ****************************************************************************/
 
-int rp2040_bringup(void)
+int rp2040_common_bringup(void)
 {
   int ret = 0;
 
@@ -95,7 +97,8 @@ int rp2040_bringup(void)
   ret = board_i2cdev_initialize(0);
   if (ret < 0)
     {
-      _err("ERROR: Failed to initialize I2C0.\n");
+      syslog(LOG_ERR, "Failed to initialize I2C0.\n");
+      return ret;
     }
   #endif
 
@@ -103,7 +106,8 @@ int rp2040_bringup(void)
   ret = board_i2cdev_initialize(1);
   if (ret < 0)
     {
-      _err("ERROR: Failed to initialize I2C1.\n");
+      syslog(LOG_ERR, "Failed to initialize I2C1.\n");
+      return ret;
     }
   #endif
 #endif
@@ -113,7 +117,8 @@ int rp2040_bringup(void)
   ret = board_spidev_initialize(0);
   if (ret < 0)
     {
-      _err("ERROR: Failed to initialize SPI0.\n");
+      syslog(LOG_ERR, "Failed to initialize SPI0.\n");
+      return ret;
     }
   #endif
 
@@ -121,7 +126,8 @@ int rp2040_bringup(void)
   ret = board_spidev_initialize(1);
   if (ret < 0)
     {
-      _err("ERROR: Failed to initialize SPI1.\n");
+      syslog(LOG_ERR, "Failed to initialize SPI1.\n");
+      return ret;
     }
   #endif
 #endif
@@ -157,7 +163,8 @@ int rp2040_bringup(void)
 #    endif
   if (ret < 0)
     {
-      _err("ERROR: Failed to initialize PWM0.\n");
+      syslog(LOG_ERR, "Failed to initialize PWM0.\n");
+      return ret;
     }
 #  endif
 
@@ -191,7 +198,8 @@ int rp2040_bringup(void)
 #    endif
   if (ret < 0)
     {
-      _err("ERROR: Failed to initialize PWM1.\n");
+      syslog(LOG_ERR, "Failed to initialize PWM1.\n");
+      return ret;
     }
 #  endif
 
@@ -225,7 +233,8 @@ int rp2040_bringup(void)
 #    endif
   if (ret < 0)
     {
-      _err("ERROR: Failed to initialize PWM2.\n");
+      syslog(LOG_ERR, "Failed to initialize PWM2.\n");
+      return ret;
     }
 #  endif
 
@@ -259,7 +268,8 @@ int rp2040_bringup(void)
 #    endif
   if (ret < 0)
     {
-      _err("ERROR: Failed to initialize PWM3.\n");
+      syslog(LOG_ERR, "Failed to initialize PWM3.\n");
+      return ret;
     }
 #  endif
 
@@ -293,7 +303,8 @@ int rp2040_bringup(void)
 #    endif
   if (ret < 0)
     {
-      _err("ERROR: Failed to initialize PWM4.\n");
+      syslog(LOG_ERR, "Failed to initialize PWM4.\n");
+      return ret;
     }
 #  endif
 
@@ -327,7 +338,8 @@ int rp2040_bringup(void)
 #  endif
   if (ret < 0)
     {
-      _err("ERROR: Failed to initialize PWM5.\n");
+      syslog(LOG_ERR, "Failed to initialize PWM5.\n");
+      return ret;
     }
 #  endif
 
@@ -361,7 +373,8 @@ int rp2040_bringup(void)
 #    endif
   if (ret < 0)
     {
-      _err("ERROR: Failed to initialize PWM6.\n");
+      syslog(LOG_ERR, "Failed to initialize PWM6.\n");
+      return ret;
     }
 #  endif
 
@@ -395,7 +408,8 @@ int rp2040_bringup(void)
 #    endif
   if (ret < 0)
     {
-      _err("ERROR: Failed to initialize PWM7.\n");
+      syslog(LOG_ERR, "Failed to initialize PWM7.\n");
+      return ret;
     }
 #  endif
 #endif
@@ -406,7 +420,7 @@ int rp2040_bringup(void)
   ret = board_spisd_initialize(0, CONFIG_RP2040_SPISD_SPI_CH);
   if (ret < 0)
     {
-      _err("ERROR: Failed to initialize SPI device to MMC/SD: %d\n",
+      syslog(LOG_ERR, "Failed to initialize SPI device to MMC/SD: %d\n",
            ret);
     }
 #endif
@@ -428,6 +442,7 @@ int rp2040_bringup(void)
   if (ret < 0)
     {
       syslog(LOG_ERR, "Failed to initialize BMP180 driver: %d\n", ret);
+      return ret;
     }
 #endif
 
@@ -438,6 +453,7 @@ int rp2040_bringup(void)
   if (ret < 0)
     {
       syslog(LOG_ERR, "ERROR: rp2040_ina219_initialize() failed: %d\n", ret);
+      return ret;
     }
 #endif
 
@@ -445,13 +461,15 @@ int rp2040_bringup(void)
   ret = fb_register(0, 0);
   if (ret < 0)
     {
-      _err("ERROR: Failed to initialize Frame Buffer Driver.\n");
+      syslog(LOG_ERR, "Failed to initialize Frame Buffer Driver.\n");
+      return ret;
     }
 #elif defined(CONFIG_LCD)
   ret = board_lcd_initialize();
   if (ret < 0)
     {
       syslog(LOG_ERR, "ERROR: Failed to initialize LCD.\n");
+      return ret;
     }
 #endif
 
@@ -460,6 +478,7 @@ int rp2040_bringup(void)
   if (ret < 0)
     {
       syslog(LOG_ERR, "ERROR: lcddev_register() failed: %d\n", ret);
+      return ret;
     }
 #endif
 
@@ -471,6 +490,7 @@ int rp2040_bringup(void)
     {
       syslog(LOG_ERR, "Failed to initialize PCF8574 LCD, error %d\n", ret);
       return ret;
+      return ret;
     }
 #endif
 
@@ -478,7 +498,8 @@ int rp2040_bringup(void)
   ret = board_i2sdev_initialize(0);
   if (ret < 0)
     {
-      _err("ERROR: Failed to initialize I2S.\n");
+      syslog(LOG_ERR, "Failed to initialize I2S.\n");
+      return ret;
     }
 #endif
 
@@ -537,12 +558,17 @@ int rp2040_bringup(void)
   /* Initialize board neo-pixel */
 
 #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);
+
+  if (rp2040_ws2812_setup("/dev/leds0",
+                          CONFIG_RP2040_WS2812_GPIO_PIN,
+                          CONFIG_RP2040_WS2812_PWR_GPIO,
+                          CONFIG_WS2812_LED_COUNT,
+                          HAS_WHITE) == NULL)
+    {
+      syslog(LOG_ERR, "Failed to initialize WS2812: %d\n", errno);
+      return -errno;
+    }
 #endif
 
-  return ret;
+  return OK;
 }
diff --git a/boards/arm/rp2040/raspberrypi-pico/src/rp2040_boardinitialize.c b/boards/arm/rp2040/common/src/rp2040_common_initialize.c
similarity index 93%
copy from boards/arm/rp2040/raspberrypi-pico/src/rp2040_boardinitialize.c
copy to boards/arm/rp2040/common/src/rp2040_common_initialize.c
index a3eba93eae..6e86c52986 100644
--- a/boards/arm/rp2040/raspberrypi-pico/src/rp2040_boardinitialize.c
+++ b/boards/arm/rp2040/common/src/rp2040_common_initialize.c
@@ -1,5 +1,5 @@
 /****************************************************************************
- * boards/arm/rp2040/raspberrypi-pico/src/rp2040_boardinitialize.c
+ * boards/arm/rp2040/common/src/rp2040_common_initialize.c
  *
  * Licensed to the Apache Software Foundation (ASF) under one or more
  * contributor license agreements.  See the NOTICE file distributed with
@@ -45,13 +45,14 @@
  ****************************************************************************/
 
 /****************************************************************************
- * Name: rp2040_boardearlyinitialize
+ * Name: rp2040_common_earlyinitialize
  *
  * Description:
- *
+ *  This is the early initialization common to all RP2040 boards.
+ *  It configures the UART pins so the system console can be used.
  ****************************************************************************/
 
-void rp2040_boardearlyinitialize(void)
+void rp2040_common_earlyinitialize(void)
 {
   rp2040_gpio_initialize();
 
@@ -62,12 +63,6 @@ void rp2040_boardearlyinitialize(void)
   clrbits_reg32(RP2040_PADS_BANK0_GPIO_IE, RP2040_PADS_BANK0_GPIO(28));
   clrbits_reg32(RP2040_PADS_BANK0_GPIO_IE, RP2040_PADS_BANK0_GPIO(29));
 
-  /* Set board LED pin */
-
-  rp2040_gpio_init(BOARD_GPIO_LED_PIN);
-  rp2040_gpio_setdir(BOARD_GPIO_LED_PIN, true);
-  rp2040_gpio_put(BOARD_GPIO_LED_PIN, true);
-
   /* Set default UART pin */
 
 #ifdef CONFIG_RP2040_UART0
@@ -102,13 +97,14 @@ void rp2040_boardearlyinitialize(void)
 }
 
 /****************************************************************************
- * Name: rp2040_boardinitialize
+ * Name: rp2040_common_initialize
  *
  * Description:
- *
+ *  It configures the pin assignments that were not done in the early
+ *  initialization.
  ****************************************************************************/
 
-void rp2040_boardinitialize(void)
+void rp2040_common_initialize(void)
 {
   /* Set default I2C pin */
 
diff --git a/boards/arm/rp2040/common/src/rp2040_firmware.c b/boards/arm/rp2040/common/src/rp2040_firmware.c
new file mode 100644
index 0000000000..74148893fc
--- /dev/null
+++ b/boards/arm/rp2040/common/src/rp2040_firmware.c
@@ -0,0 +1,158 @@
+/****************************************************************************
+ * boards/arm/rp2040/common/src/rp2040_firmware.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 <stdint.h>
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
+#define _STR(x) #x
+#define STR(x) _STR(x)
+
+#define ROUNDED_FIRMWARE_LEN ((CONFIG_CYW43439_FIRMWARE_LEN + 0xff) & ~0xff)
+
+/****************************************************************************
+ * Public Data
+ ****************************************************************************/
+
+#ifdef CONFIG_IEEE80211_INFINEON_CYW43439
+
+/****************************************************************************
+ * Character array of NVRAM image
+ * Generated from cyw943439wlpth_rev1_0.txt
+ * $ Copyright Broadcom Corporation $
+ ****************************************************************************/
+
+const uint8_t g_cyw43439_nvram_image[] __attribute__((aligned(4))) =
+        "NVRAMRev=$Rev$"                         "\x00"
+        "manfid=0x2d0"                           "\x00"
+        "prodid=0x0727"                          "\x00"
+        "vendid=0x14e4"                          "\x00"
+        "devid=0x43e2"                           "\x00"
+        "boardtype=0x0887"                       "\x00"
+        "boardrev=0x1100"                        "\x00"
+        "boardnum=22"                            "\x00"
+        "macaddr=00:A0:50:b5:59:5e"              "\x00"
+        "sromrev=11"                             "\x00"
+        "boardflags=0x00404001"                  "\x00"
+        "boardflags3=0x04000000"                 "\x00"
+        "xtalfreq=37400"                         "\x00"
+        "nocrc=1"                                "\x00"
+        "ag0=255"                                "\x00"
+        "aa2g=1"                                 "\x00"
+        "ccode=ALL"                              "\x00"
+        "pa0itssit=0x20"                         "\x00"
+        "extpagain2g=0"                          "\x00"
+        "pa2ga0=-168,6649,-778"                  "\x00"
+        "AvVmid_c0=0x0,0xc8"                     "\x00"
+        "cckpwroffset0=5"                        "\x00"
+        "maxp2ga0=84"                            "\x00"
+        "txpwrbckof=6"                           "\x00"
+        "cckbw202gpo=0"                          "\x00"
+        "legofdmbw202gpo=0x66111111"             "\x00"
+        "mcsbw202gpo=0x77711111"                 "\x00"
+        "propbw202gpo=0xdd"                      "\x00"
+        "ofdmdigfilttype=18"                     "\x00"
+        "ofdmdigfilttypebe=18"                   "\x00"
+        "papdmode=1"                             "\x00"
+        "papdvalidtest=1"                        "\x00"
+        "pacalidx2g=45"                          "\x00"
+        "papdepsoffset=-30"                      "\x00"
+        "papdendidx=58"                          "\x00"
+        "ltecxmux=0"                             "\x00"
+        "ltecxpadnum=0x0102"                     "\x00"
+        "ltecxfnsel=0x44"                        "\x00"
+        "ltecxgcigpio=0x01"                      "\x00"
+        "il0macaddr=00:90:4c:c5:12:38"           "\x00"
+        "wl0id=0x431b"                           "\x00"
+        "deadman_to=0xffffffff"                  "\x00"
+        "muxenab=0x100"                          "\x00"
+        "spurconfig=0x3"                         "\x00"
+        "glitch_based_crsmin=1"                  "\x00"
+        "btc_mode=1"                             "\x00"
+        "\x00\x00";
+
+const unsigned int   g_cyw43439_nvram_len = sizeof(g_cyw43439_nvram_image);
+
+/****************************************************************************
+ * Include the firmware blob.  This assembly code defines the global
+ * symbol g_cyw43439_firmware_image as the address of this included
+ * blob. This is similar in effect to the C statement:
+ *     const uint8_t g_cyw43439_firmware_image[]  = {...};
+ *     const uint8_t ng_cyw43439_clm_blob_image[] = {...};
+ ****************************************************************************/
+
+/* These are defined as array because the symbols name an actual address
+ * not a pointer to an address.  This is not one of the many cases where
+ * pointers and arrays are interchangable in C.
+ */
+
+extern const uint8_t       g_cyw43439_firmware_image[];
+extern const uint8_t       g_cyw43439_clm_blob_image[];
+extern const unsigned int  g_cyw43439_clm_blob_len;
+
+/* This assembly code does the following:
+ *    - Force 16-byte alignment
+ *    - Defines g_cyw43439_firmware_image as a location in memory
+ *    - Copies the firmware image file data to that location.
+ *    - Defines g_cyw43439_firmware_end as the location directly beyond
+ *      that data.
+ *    - Defines g_cyw43439_clm_blob_image as a location withing that
+ *      data where the clm_blob begins.
+ *    - Force 4-byte alignment
+ *    - Allocates an integer named g_cyw43439_clm_blob_len that
+ *      contains the length of the clm_blob.
+ */
+
+__asm__("\n     .balign  16"
+        "\n     .globl   g_cyw43439_firmware_image"
+        "\n     .globl   g_cyw43439_clm_blob_image"
+        "\n     .globl   g_cyw43439_clm_blob_len"
+        "\n g_cyw43439_firmware_image:"
+        "\n     .incbin  \"cyw43439.firmware.image\""
+        "\n firmware_end:"
+        "\n g_cyw43439_clm_blob_image=g_cyw43439_firmware_image+"
+                         STR(ROUNDED_FIRMWARE_LEN)
+        "\n     .balign  4"
+        "\n g_cyw43439_clm_blob_len:"
+        "\n     .word    firmware_end-g_cyw43439_clm_blob_image"
+        "\n");
+
+/****************************************************************************
+ * Other CYW43439 Firmware global definitions
+ ****************************************************************************/
+
+#ifndef CONFIG_IEEE80211_BROADCOM_FWFILES
+
+const unsigned int  g_cyw43439_firmware_len = CONFIG_CYW43439_FIRMWARE_LEN;
+
+#endif /* CONFIG_IEEE80211_BROADCOM_FWFILES */
+
+#endif /* CONFIG_IEEE80211_INFINEON_CYW43439 */
+
+/****************************************************************************
+ * Private Functions
+ ****************************************************************************/
diff --git a/boards/arm/rp2040/pimoroni-tiny2040/src/rp2040_boardinitialize.c b/boards/arm/rp2040/pimoroni-tiny2040/src/rp2040_boardinitialize.c
index 882dcf32fc..05986e662f 100644
--- a/boards/arm/rp2040/pimoroni-tiny2040/src/rp2040_boardinitialize.c
+++ b/boards/arm/rp2040/pimoroni-tiny2040/src/rp2040_boardinitialize.c
@@ -29,8 +29,13 @@
 #include <nuttx/board.h>
 #include <arch/board/board.h>
 
+#include "arm_internal.h"
 #include "rp2040_gpio.h"
 
+#ifdef CONFIG_ARCH_BOARD_COMMON
+#include "rp2040_common_initialize.h"
+#endif /* CONFIG_ARCH_BOARD_COMMON */
+
 /****************************************************************************
  * Pre-processor Definitions
  ****************************************************************************/
@@ -52,14 +57,11 @@
 
 void rp2040_boardearlyinitialize(void)
 {
-  rp2040_gpio_initialize();
-
-  /* Disable IE on GPIO 26-29 */
+  #ifdef CONFIG_ARCH_BOARD_COMMON
+  rp2040_common_earlyinitialize();
+  #endif 
 
-  clrbits_reg32(RP2040_PADS_BANK0_GPIO_IE, RP2040_PADS_BANK0_GPIO(26));
-  clrbits_reg32(RP2040_PADS_BANK0_GPIO_IE, RP2040_PADS_BANK0_GPIO(27));
-  clrbits_reg32(RP2040_PADS_BANK0_GPIO_IE, RP2040_PADS_BANK0_GPIO(28));
-  clrbits_reg32(RP2040_PADS_BANK0_GPIO_IE, RP2040_PADS_BANK0_GPIO(29));
+  /* --- Place any board specific early initialization here --- */
 
   /* Set all board RGB LED pins to HIGH:
    * LEDs turned off (driven from external pull-up)
@@ -76,38 +78,6 @@ void rp2040_boardearlyinitialize(void)
   rp2040_gpio_init(BOARD_GPIO_LED_PIN_B);
   rp2040_gpio_setdir(BOARD_GPIO_LED_PIN_B, true);
   rp2040_gpio_put(BOARD_GPIO_LED_PIN_B, true);
-
-  /* Set default UART pin */
-
-#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_RX_GPIO,
-                           RP2040_GPIO_FUNC_UART);      /* RX */
-#ifdef CONFIG_SERIAL_OFLOWCONTROL
-  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_RTS_GPIO,
-                           RP2040_GPIO_FUNC_UART);      /* RTS */
-#endif
-#endif
-
-#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_RX_GPIO,
-                           RP2040_GPIO_FUNC_UART);      /* RX */
-#ifdef CONFIG_SERIAL_OFLOWCONTROL
-  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_RTS_GPIO,
-                           RP2040_GPIO_FUNC_UART);      /* RTS */
-#endif
-#endif
 }
 
 /****************************************************************************
@@ -119,57 +89,9 @@ void rp2040_boardearlyinitialize(void)
 
 void rp2040_boardinitialize(void)
 {
-  /* Set default I2C pin */
-
-#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_SCL_GPIO,
-                           RP2040_GPIO_FUNC_I2C);       /* SCL */
-
-  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
-
-#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_SCL_GPIO,
-                           RP2040_GPIO_FUNC_I2C);       /* SCL */
-
-  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 */
-
-#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_SCK_GPIO,
-                           RP2040_GPIO_FUNC_SPI);       /* SCK */
-  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_CS_GPIO);        /* CSn */
-  rp2040_gpio_setdir(CONFIG_RP2040_SPI0_CS_GPIO, true);
-  rp2040_gpio_put(CONFIG_RP2040_SPI0_CS_GPIO, true);
-#endif
-
-#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_SCK_GPIO,
-                           RP2040_GPIO_FUNC_SPI);       /* SCK */
-  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_CS_GPIO);        /* CSn */
-  rp2040_gpio_setdir(CONFIG_RP2040_SPI1_CS_GPIO, true);
-  rp2040_gpio_put(CONFIG_RP2040_SPI1_CS_GPIO, true);
-#endif
+  #ifdef CONFIG_ARCH_BOARD_COMMON
+  rp2040_common_initialize();
+  #endif 
+
+  /* --- Place any board specific initialization here --- */
 }
diff --git a/boards/arm/rp2040/pimoroni-tiny2040/src/rp2040_bringup.c b/boards/arm/rp2040/pimoroni-tiny2040/src/rp2040_bringup.c
index a43aa21937..30173915c2 100644
--- a/boards/arm/rp2040/pimoroni-tiny2040/src/rp2040_bringup.c
+++ b/boards/arm/rp2040/pimoroni-tiny2040/src/rp2040_bringup.c
@@ -31,26 +31,11 @@
 
 #include <arch/board/board.h>
 
-#include "rp2040_tiny2040.h"
+#include "rp2040_pico.h"
 
-#ifdef CONFIG_RP2040_PWM
-#include "rp2040_pwm.h"
-#include "rp2040_pwmdev.h"
-#endif
-
-#if defined(CONFIG_ADC) && defined(CONFIG_RP2040_ADC)
-#include "rp2040_adc.h"
-#endif
-
-#if defined(CONFIG_RP2040_BOARD_HAS_WS2812) && defined(CONFIG_WS2812)
-#include "rp2040_ws2812.h"
-#endif
-
-#ifdef CONFIG_WS2812_HAS_WHITE
-#define HAS_WHITE true
-#else /* CONFIG_WS2812_HAS_WHITE */
-#define HAS_WHITE false
-#endif /* CONFIG_WS2812_HAS_WHITE */
+#ifdef CONFIG_ARCH_BOARD_COMMON
+#include "rp2040_common_bringup.h"
+#endif /* CONFIG_ARCH_BOARD_COMMON */
 
 /****************************************************************************
  * Public Functions
@@ -62,408 +47,17 @@
 
 int rp2040_bringup(void)
 {
-  int ret = 0;
-
-#ifdef CONFIG_RP2040_I2C_DRIVER
-  #ifdef CONFIG_RP2040_I2C0
-  ret = board_i2cdev_initialize(0);
-  if (ret < 0)
-    {
-      _err("ERROR: Failed to initialize I2C0.\n");
-    }
-  #endif
-
-  #ifdef CONFIG_RP2040_I2C1
-  ret = board_i2cdev_initialize(1);
-  if (ret < 0)
-    {
-      _err("ERROR: Failed to initialize I2C1.\n");
-    }
-  #endif
-#endif
-
-#ifdef CONFIG_RP2040_SPI_DRIVER
-  #ifdef CONFIG_RP2040_SPI0
-  ret = board_spidev_initialize(0);
-  if (ret < 0)
-    {
-      _err("ERROR: Failed to initialize SPI0.\n");
-    }
-  #endif
-
-  #ifdef CONFIG_RP2040_SPI1
-  ret = board_spidev_initialize(1);
-  if (ret < 0)
-    {
-      _err("ERROR: Failed to initialize SPI1.\n");
-    }
-  #endif
-#endif
-
-#ifdef CONFIG_RP2040_SPISD
-  /* Mount the SPI-based MMC/SD block driver */
+#ifdef CONFIG_ARCH_BOARD_COMMON
 
-  ret = board_spisd_initialize(0, CONFIG_RP2040_SPISD_SPI_CH);
+  int ret = rp2040_common_bringup();
   if (ret < 0)
     {
-      _err("ERROR: Failed to initialize SPI device to MMC/SD: %d\n",
-           ret);
-    }
-#endif
-
-#ifdef CONFIG_FS_PROCFS
-  /* Mount the procfs file system */
-
-  ret = nx_mount(NULL, "/proc", "procfs", 0, NULL);
-  if (ret < 0)
-    {
-      serr("ERROR: Failed to mount procfs at %s: %d\n", "/proc", ret);
-    }
-#endif
-
-#ifdef CONFIG_RP2040_I2S
-  ret = board_i2sdev_initialize(0);
-  if (ret < 0)
-    {
-      _err("ERROR: Failed to initialize I2S.\n");
-    }
-#endif
-
-#ifdef CONFIG_DEV_GPIO
-  ret = rp2040_dev_gpio_init();
-  if (ret < 0)
-    {
-      syslog(LOG_ERR, "Failed to initialize GPIO Driver: %d\n", ret);
       return ret;
     }
-#endif
-
-#ifdef CONFIG_RP2040_PWM
-#  ifdef CONFIG_RP2040_PWM0
-#    if defined(CONFIG_PWM_NCHANNELS) && CONFIG_PWM_NCHANNELS == 2
-  ret = rp2040_pwmdev_initialize(0,
-                                 CONFIG_RP2040_PWM0A_GPIO,
-                                 CONFIG_RP2040_PWM0B_GPIO,
-                                 (0
-#      ifdef CONFIG_RP2040_PWM0A_INVERT
-                                  | RP2040_PWM_CSR_A_INV
-#      endif
-#      ifdef CONFIG_RP2040_PWM0B_INVERT
-                                  | RP2040_PWM_CSR_B_INV
-#      endif
-#      ifdef CONFIG_RP2040_PWM0_PHASE_CORRECT
-                                  | RP2040_PWM_CSR_PH_CORRECT
-#      endif
-                                 ));
-#    else
-  ret = rp2040_pwmdev_initialize(0,
-                                 CONFIG_RP2040_PWM0A_GPIO,
-                                 (0
-#      ifdef CONFIG_RP2040_PWM0A_INVERT
-                                  | RP2040_PWM_CSR_A_INV
-#      endif
-#      ifdef CONFIG_RP2040_PWM0_PHASE_CORRECT
-                                  | RP2040_PWM_CSR_PH_CORRECT
-#      endif
-                                 ));
-#    endif
-  if (ret < 0)
-    {
-      _err("ERROR: Failed to initialize PWM0.\n");
-    }
-#  endif
-
-#  ifdef CONFIG_RP2040_PWM1
-#    if defined(CONFIG_PWM_NCHANNELS) && CONFIG_PWM_NCHANNELS == 2
-  ret = rp2040_pwmdev_initialize(1,
-                                 CONFIG_RP2040_PWM1A_GPIO,
-                                 CONFIG_RP2040_PWM1B_GPIO,
-                                 (0
-#      ifdef CONFIG_RP2040_PWM1A_INVERT
-                                  | RP2040_PWM_CSR_A_INV
-#      endif
-#      ifdef CONFIG_RP2040_PWM1B_INVERT
-                                  | RP2040_PWM_CSR_B_INV
-#      endif
-#      ifdef CONFIG_RP2040_PWM1_PHASE_CORRECT
-                                  | RP2040_PWM_CSR_PH_CORRECT
-#      endif
-                                 ));
-#    else
-  ret = rp2040_pwmdev_initialize(1,
-                                 CONFIG_RP2040_PWM1A_GPIO,
-                                 (0
-#      ifdef CONFIG_RP2040_PWM1A_INVERT
-                                  | RP2040_PWM_CSR_A_INV
-#      endif
-#      ifdef CONFIG_RP2040_PWM1_PHASE_CORRECT
-                                  | RP2040_PWM_CSR_PH_CORRECT
-#      endif
-                                 ));
-#    endif
-  if (ret < 0)
-    {
-      _err("ERROR: Failed to initialize PWM1.\n");
-    }
-#  endif
-
-#  ifdef CONFIG_RP2040_PWM2
-#    if defined(CONFIG_PWM_NCHANNELS) && CONFIG_PWM_NCHANNELS == 2
-  ret = rp2040_pwmdev_initialize(2,
-                                 CONFIG_RP2040_PWM2A_GPIO,
-                                 CONFIG_RP2040_PWM2B_GPIO,
-                                 (0
-#      ifdef CONFIG_RP2040_PWM2A_INVERT
-                                  | RP2040_PWM_CSR_A_INV
-#      endif
-#      ifdef CONFIG_RP2040_PWM2B_INVERT
-                                  | RP2040_PWM_CSR_B_INV
-#      endif
-#      ifdef CONFIG_RP2040_PWM2_PHASE_CORRECT
-                                  | RP2040_PWM_CSR_PH_CORRECT
-#      endif
-                                 ));
-#    else
-  ret = rp2040_pwmdev_initialize(2,
-                                 CONFIG_RP2040_PWM2A_GPIO,
-                                 (0
-#      ifdef CONFIG_RP2040_PWM2A_INVERT
-                                  | RP2040_PWM_CSR_A_INV
-#      endif
-#      ifdef CONFIG_RP2040_PWM2_PHASE_CORRECT
-                                  | RP2040_PWM_CSR_PH_CORRECT
-#      endif
-                                 ));
-#    endif
-  if (ret < 0)
-    {
-      _err("ERROR: Failed to initialize PWM2.\n");
-    }
-#  endif
-
-#  ifdef CONFIG_RP2040_PWM3
-#    if defined(CONFIG_PWM_NCHANNELS) && CONFIG_PWM_NCHANNELS == 2
-  ret = rp2040_pwmdev_initialize(3,
-                                 CONFIG_RP2040_PWM3A_GPIO,
-                                 CONFIG_RP2040_PWM3B_GPIO,
-                                 (0
-#      ifdef CONFIG_RP2040_PWM3A_INVERT
-                                  | RP2040_PWM_CSR_A_INV
-#      endif
-#      ifdef CONFIG_RP2040_PWM3B_INVERT
-                                  | RP2040_PWM_CSR_B_INV
-#      endif
-#      ifdef CONFIG_RP2040_PWM3_PHASE_CORRECT
-                                  | RP2040_PWM_CSR_PH_CORRECT
-#      endif
-                                 ));
-#    else
-  ret = rp2040_pwmdev_initialize(3,
-                                 CONFIG_RP2040_PWM3A_GPIO,
-                                 (0
-#      ifdef CONFIG_RP2040_PWM3A_INVERT
-                                  | RP2040_PWM_CSR_A_INV
-#      endif
-#      ifdef CONFIG_RP2040_PWM3_PHASE_CORRECT
-                                  | RP2040_PWM_CSR_PH_CORRECT
-#      endif
-                                 ));
-#    endif
-  if (ret < 0)
-    {
-      _err("ERROR: Failed to initialize PWM3.\n");
-    }
-#  endif
-
-#  ifdef CONFIG_RP2040_PWM4
-#    if defined(CONFIG_PWM_NCHANNELS) && CONFIG_PWM_NCHANNELS == 2
-  ret = rp2040_pwmdev_initialize(4,
-                                 CONFIG_RP2040_PWM4A_GPIO,
-                                 CONFIG_RP2040_PWM4B_GPIO,
-                                 (0
-#      ifdef CONFIG_RP2040_PWM4A_INVERT
-                                  | RP2040_PWM_CSR_A_INV
-#      endif
-#      ifdef CONFIG_RP2040_PWM4B_INVERT
-                                  | RP2040_PWM_CSR_B_INV
-#      endif
-#      ifdef CONFIG_RP2040_PWM4_PHASE_CORRECT
-                                  | RP2040_PWM_CSR_PH_CORRECT
-#      endif
-                                 ));
-#    else
-  ret = rp2040_pwmdev_initialize(4,
-                                 CONFIG_RP2040_PWM4A_GPIO,
-                                 (0
-#      ifdef CONFIG_RP2040_PWM4A_INVERT
-                                  | RP2040_PWM_CSR_A_INV
-#      endif
-#      ifdef CONFIG_RP2040_PWM4_PHASE_CORRECT
-                                  | RP2040_PWM_CSR_PH_CORRECT
-#      endif
-                                 ));
-#    endif
-  if (ret < 0)
-    {
-      _err("ERROR: Failed to initialize PWM4.\n");
-    }
-#  endif
-
-#  ifdef CONFIG_RP2040_PWM5
-#    if defined(CONFIG_PWM_NCHANNELS) && CONFIG_PWM_NCHANNELS == 2
-  ret = rp2040_pwmdev_initialize(5,
-                                 CONFIG_RP2040_PWM5A_GPIO,
-                                 CONFIG_RP2040_PWM5B_GPIO,
-                                 (0
-#      ifdef CONFIG_RP2040_PWM5A_INVERT
-                                  | RP2040_PWM_CSR_A_INV
-#      endif
-#      ifdef CONFIG_RP2040_PWM5B_INVERT
-                                  | RP2040_PWM_CSR_B_INV
-#      endif
-#      ifdef CONFIG_RP2040_PWM5_PHASE_CORRECT
-                                  | RP2040_PWM_CSR_PH_CORRECT
-#      endif
-                                 ));
-#  else
-  ret = rp2040_pwmdev_initialize(5,
-                                 CONFIG_RP2040_PWM5A_GPIO,
-                                 (0
-#      ifdef CONFIG_RP2040_PWM5A_INVERT
-                                  | RP2040_PWM_CSR_A_INV
-#      endif
-#      ifdef CONFIG_RP2040_PWM5_PHASE_CORRECT
-                                  | RP2040_PWM_CSR_PH_CORRECT
-#      endif
-                                 ));
-#  endif
-  if (ret < 0)
-    {
-      _err("ERROR: Failed to initialize PWM5.\n");
-    }
-#  endif
-
-#  ifdef CONFIG_RP2040_PWM6
-#    if defined(CONFIG_PWM_NCHANNELS) && CONFIG_PWM_NCHANNELS == 2
-  ret = rp2040_pwmdev_initialize(6,
-                                 CONFIG_RP2040_PWM6A_GPIO,
-                                 CONFIG_RP2040_PWM6B_GPIO,
-                                 (0
-#      ifdef CONFIG_RP2040_PWM6A_INVERT
-                                  | RP2040_PWM_CSR_A_INV
-#      endif
-#      ifdef CONFIG_RP2040_PWM6B_INVERT
-                                  | RP2040_PWM_CSR_B_INV
-#      endif
-#      ifdef CONFIG_RP2040_PWM6_PHASE_CORRECT
-                                  | RP2040_PWM_CSR_PH_CORRECT
-#      endif
-                                 ));
-#    else
-  ret = rp2040_pwmdev_initialize(6,
-                                 CONFIG_RP2040_PWM6A_GPIO,
-                                 (0
-#      ifdef CONFIG_RP2040_PWM6A_INVERT
-                                  | RP2040_PWM_CSR_A_INV
-#      endif
-#      ifdef CONFIG_RP2040_PWM6_PHASE_CORRECT
-                                  | RP2040_PWM_CSR_PH_CORRECT
-#      endif
-                                 ));
-#    endif
-  if (ret < 0)
-    {
-      _err("ERROR: Failed to initialize PWM6.\n");
-    }
-#  endif
-
-#  ifdef CONFIG_RP2040_PWM7
-#    if defined(CONFIG_PWM_NCHANNELS) && CONFIG_PWM_NCHANNELS == 2
-  ret = rp2040_pwmdev_initialize(7,
-                                 CONFIG_RP2040_PWM7A_GPIO,
-                                 CONFIG_RP2040_PWM7B_GPIO,
-                                 (0
-#      ifdef CONFIG_RP2040_PWM7A_INVERT
-                                  | RP2040_PWM_CSR_A_INV
-#      endif
-#      ifdef CONFIG_RP2040_PWM7B_INVERT
-                                  | RP2040_PWM_CSR_B_INV
-#      endif
-#      ifdef CONFIG_RP2040_PWM7_PHASE_CORRECT
-                                  | RP2040_PWM_CSR_PH_CORRECT
-#      endif
-                                 ));
-#    else
-  ret = rp2040_pwmdev_initialize(7,
-                                 CONFIG_RP2040_PWM7A_GPIO,
-                                 (0
-#      ifdef CONFIG_RP2040_PWM7A_INVERT
-                                  | RP2040_PWM_CSR_A_INV
-#      endif
-#      ifdef CONFIG_RP2040_PWM7_PHASE_CORRECT
-                                  | RP2040_PWM_CSR_PH_CORRECT
-#      endif
-                                 ));
-#    endif
-  if (ret < 0)
-    {
-      _err("ERROR: Failed to initialize PWM7.\n");
-    }
-#  endif
-#endif
-
-  /* Initialize ADC */
-
-#if defined(CONFIG_ADC) && defined(CONFIG_RP2040_ADC)
-
-# ifdef CONFIG_RPC2040_ADC_CHANNEL0
-#   define ADC_0 true
-# else
-#   define ADC_0 false
-# endif
-
-# ifdef CONFIG_RPC2040_ADC_CHANNEL1
-#   define ADC_1 true
-# else
-#   define ADC_1 false
-# endif
-
-# ifdef CONFIG_RPC2040_ADC_CHANNEL2
-#   define ADC_2 true
-# else
-#   define ADC_2 false
-# endif
-
-# ifdef CONFIG_RPC2040_ADC_CHANNEL3
-#   define ADC_3 true
-# else
-#   define ADC_3 false
-# endif
-
-# ifdef CONFIG_RPC2040_ADC_TEMPERATURE
-#   define ADC_TEMP true
-# else
-#   define ADC_TEMP false
-# endif
-
-  ret = rp2040_adc_setup("/dev/adc0", ADC_0, ADC_1, ADC_2, ADC_3, ADC_TEMP);
-  if (ret != OK)
-    {
-      syslog(LOG_ERR, "Failed to initialize ADC Driver: %d\n", ret);
-      return ret;
-    }
-
-#endif /* defined(CONFIG_ADC) && defined(CONFIG_RP2040_ADC) */
 
-  /* Initialize board neo-pixel */
+#endif /* CONFIG_ARCH_BOARD_COMMON */
 
-#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
+  /* --- Place any board specific bringup code here --- */
 
-  return ret;
+  return OK;
 }
diff --git a/boards/arm/rp2040/pimoroni-tiny2040/src/rp2040_pico.h b/boards/arm/rp2040/pimoroni-tiny2040/src/rp2040_pico.h
new file mode 100644
index 0000000000..43f0e41b3d
--- /dev/null
+++ b/boards/arm/rp2040/pimoroni-tiny2040/src/rp2040_pico.h
@@ -0,0 +1,36 @@
+/****************************************************************************
+ * boards/arm/rp2040/pimoroni-tiny2040/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_FEATHER_RP2040_PICO_H
+#define __BOARDS_ARM_RP2040_ADAFRUIT_FEATHER_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_FEATHER_RP2040_PICO_H */
diff --git a/boards/arm/rp2040/raspberrypi-pico-w/Kconfig b/boards/arm/rp2040/raspberrypi-pico-w/Kconfig
new file mode 100644
index 0000000000..47cb9b8013
--- /dev/null
+++ b/boards/arm/rp2040/raspberrypi-pico-w/Kconfig
@@ -0,0 +1,89 @@
+#
+# For a description of the syntax of this configuration file,
+# see the file kconfig-language.txt in the NuttX tools repository.
+#
+
+if ARCH_BOARD_RASPBERRYPI_PICO_W
+
+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 Q16 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.
+
+config RP2040_LCD_SPI_CH
+	int "RP2040 LCD SPI channel number"
+	default 0
+	range 0 1
+	depends on LCD
+	---help---
+		Select SPI channel number to use LCD display.
+
+config RP2040_ENC28J60_SPI_CH
+	int "ENC28J60 SPI channel number"
+	default 1
+	range 0 1
+	depends on ENC28J60
+	---help---
+		Select SPI channel number to use ENC28J60 ethernet.
+
+config RP2040_ENC28J60_INTR_GPIO
+	int "ENC28J60 interrupt GPIO pin assign"
+	default -1
+	range -1 29
+	depends on ENC28J60
+
+config RP2040_ENC28J60_RESET_GPIO
+	int "ENC28J60 reset GPIO pin assign (optional)"
+	default -1
+	range -1 29
+	depends on ENC28J60
+
+menuconfig RP2040_INFINEON_CYW43439
+	bool "Has Infineon cyw43439 WiFi chip"
+	depends on IEEE80211_INFINEON_CYW43439
+  default y
+endif
+
+if RP2040_INFINEON_CYW43439
+
+	config CYW43439_FIRMWARE_BIN_PATH
+		string "Path to Infineon 43439 firmware file"
+		default "${PICO_SDK_PATH}/lib/cyw43-driver/firmware/43439A0-7.95.49.00.combined"
+		---help---
+			This should be a path to a file containing both the cyw43439 firmware and
+			the CLB blob.   The firmware should be padded to a 256 byte boundary and
+			then the CLM blob should be appended.
+
+			If this file is updated, check the CYW43439_FIRMWARE_LEN below to make sure
+			it reflects the un-padded length of the firmware part.
+
+	config CYW43439_FIRMWARE_LEN
+		int "Infineon 43439 firmware length (bytes)"
+		default 224190
+		---help---
+			This is the length of just the base firmware in the firmware file specified
+			by the "Path to Infineon 43439 firmware file" configuration option.  
+			
+			This length does not include the length of any padding nor the length of
+			the appended clm_blob. If a clm_blob is present in the firmware file, this 
+			length will be less than the length of the whole file.
+
+
+endif
diff --git a/boards/arm/rp2040/raspberrypi-pico-w/README.txt b/boards/arm/rp2040/raspberrypi-pico-w/README.txt
new file mode 100644
index 0000000000..b0a96277ee
--- /dev/null
+++ b/boards/arm/rp2040/raspberrypi-pico-w/README.txt
@@ -0,0 +1,182 @@
+README
+======
+
+This directory contains the port of NuttX to the Raspberry Pi Pico.
+See https://www.raspberrypi.org/products/raspberry-pi-pico/ for information
+about Raspberry Pi Pico W
+
+Currently only the following devices are supported.
+
+  Supported:
+  - UART  (console port)
+    - GPIO 0 (UART0 TX) and GPIO 1 (UART0 RX) 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.
+  - WiFi wireless communication
+  - BMP180 sensor at I2C0 (don't forget to define I2C0 GPIOs at "I2C0 GPIO pin assign" in Board Selection menu)
+  - INA219 sensor / module (don't forget to define I2C0 GPIOs at "I2C0 GPIO pin assign" in Board Selection menu)
+  - Pico Display Pack (ST7789 LCD)
+    - RGB leds and buttons are not supported yet.
+  - Pico Audio Pack (PCM5100A I2S DAC)
+    - I2S interface is realized by PIO.
+
+  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 Raspberry Pi Pico 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 0 and 1 pins must be connected to the
+   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.
+
+- ssd1306
+    SSD1306 OLED display (I2C) test configuration
+    Connection:
+       SSD1306       Raspberry Pi Pico
+           GND ----- GND            (Pin 3 or 38 or ...)
+           VCC ----- 3V3 OUT        (Pin 36)
+           SDA ----- GP4 (I2C0 SDA) (Pin 6)
+           SCL ----- GP5 (I2C0 SCL) (Pin 7)
+           
+- lcd1602 
+    LCD 1602 Segment LCD Disaply (I2C)
+    Connection:
+    PCF8574 BackPack Raspberry Pi Pico
+           GND ----- GND            (Pin 3 or 38 or ...)
+           VCC ----- 5V Vbus        (Pin 40)
+           SDA ----- GP4 (I2C0 SDA) (Pin 6)
+           SCL ----- GP5 (I2C0 SCL) (Pin 7)
+- spisd
+    SD card support (SPI connection)
+    Connection:
+      SD card slot   Raspberry Pi Pico
+       DAT2          (NC)
+       DAT3/CS ----- GP17 (SPI0 CSn) (Pin 22)
+       CMD /DI ----- GP19 (SPI0 TX)  (Pin 25)
+       VDD     ----- 3V3 OUT         (Pin 36)
+       CLK/SCK ----- GP18 (SPI0 SCK) (Pin 24)
+       VSS     ----- GND             (Pin 3 or 38 or ...)
+       DAT0/DO ----- GP16 (SPI0 RX)  (Pin 21)
+       DAT1          (NC)
+    * Card hot swapping is not supported.
+
+- st7735
+    st7735 SPI LCD support      
+    Connection:
+      st7735         Raspberry Pi Pico
+           GND ----- GND             (Pin 3 or 38 or ...)
+           VCC ----- 5V Vbus         (Pin 40)
+           SDA ----- GP15 (SPI1 TX)  (Pin 20)
+           SCK ----- GP14 (SPI1 SCK) (Pin 19)
+            CS ----- GP13 (SPI1 CSn) (Pin 17)
+       AO(D/C) ----- GP12 (SPI1 RX)  (Pin 16)
+            BL ----- GP11            (Pin 15)
+         RESET ----- GP10            (Pin 14)  
+
+- enc28j60
+    ENC28J60 SPI ethernet controller support
+      - IP address is configured by DHCP.
+      - DNS address is 8.8.8.8 (CONFIG_NETINIT_DNSIPADDR)
+      - NTP client is enabled.
+    Connection:
+      ENC28J60       Raspberry Pi Pico
+           GND ----- GND             (Pin 3 or 38 or ...)
+           3.3 ----- 3V3 OUT         (Pin 36)
+            SI ----- GP15 (SPI1 TX)  (Pin 20)
+           SCK ----- GP14 (SPI1 SCK) (Pin 19)
+            CS ----- GP13 (SPI1 CSn) (Pin 17)
+            SO ----- GP12 (SPI1 RX)  (Pin 16)
+           INT ----- GP11            (Pin 15)
+         RESET ----- GP10            (Pin 14)
+
+- displaypack
+    Pico Display Pack support
+    See the following page for connection:
+      https://shop.pimoroni.com/products/pico-display-pack
+
+- audiopack
+    Pico Audio Pack support
+    See the following page for connection:
+      https://shop.pimoroni.com/products/pico-audio-pack
+    SD card interface is also enabled.
+
+- usbnsh
+    USB CDC/ACM serial console with NuttShell
+
+- usbmsc
+    USB MSC and CDC/ACM support
+    `msconn` and `sercon` commands enable the MSC and CDC/ACM devices.
+    The MSC support provides the interface to the SD card with SPI,
+    so the SD card slot connection like spisd configuration is required.
+
+- 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/adafruit-kb2040/configs/audiopack/defconfig b/boards/arm/rp2040/raspberrypi-pico-w/configs/audiopack/defconfig
similarity index 86%
copy from boards/arm/rp2040/adafruit-kb2040/configs/audiopack/defconfig
copy to boards/arm/rp2040/raspberrypi-pico-w/configs/audiopack/defconfig
index bcc9163ce5..5c6a3712ff 100644
--- a/boards/arm/rp2040/adafruit-kb2040/configs/audiopack/defconfig
+++ b/boards/arm/rp2040/raspberrypi-pico-w/configs/audiopack/defconfig
@@ -20,8 +20,8 @@
 # CONFIG_SPI_CALLBACK 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="raspberrypi-pico-w"
+CONFIG_ARCH_BOARD_RASPBERRYPI_PICO_W=y
 CONFIG_ARCH_CHIP="rp2040"
 CONFIG_ARCH_CHIP_RP2040=y
 CONFIG_ARCH_RAMVECTORS=y
@@ -51,16 +51,10 @@ CONFIG_NXPLAYER_DEFAULT_MEDIADIR="/mnt/sd0"
 CONFIG_RAM_SIZE=270336
 CONFIG_RAM_START=0x20000000
 CONFIG_READLINE_CMD_HISTORY=y
-CONFIG_RP2040_BOARD_HAS_WS2812=y
 CONFIG_RP2040_I2S=y
 CONFIG_RP2040_SPI0=y
-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
 CONFIG_RR_INTERVAL=200
 CONFIG_SCHED_HPWORK=y
 CONFIG_SCHED_WAITPID=y
@@ -74,5 +68,3 @@ CONFIG_SYSTEM_SPITOOL=y
 CONFIG_TESTING_GETPRIME=y
 CONFIG_TESTING_OSTEST=y
 CONFIG_UART0_SERIAL_CONSOLE=y
-CONFIG_WS2812=y
-CONFIG_WS2812_NON_SPI_DRIVER=y
diff --git a/boards/arm/rp2040/adafruit-kb2040/configs/composite/defconfig b/boards/arm/rp2040/raspberrypi-pico-w/configs/composite/defconfig
similarity index 86%
copy from boards/arm/rp2040/adafruit-kb2040/configs/composite/defconfig
copy to boards/arm/rp2040/raspberrypi-pico-w/configs/composite/defconfig
index c33f3151cb..aed31c2b63 100644
--- a/boards/arm/rp2040/adafruit-kb2040/configs/composite/defconfig
+++ b/boards/arm/rp2040/raspberrypi-pico-w/configs/composite/defconfig
@@ -16,8 +16,8 @@
 # CONFIG_SPI_CALLBACK 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="raspberrypi-pico-w"
+CONFIG_ARCH_BOARD_RASPBERRYPI_PICO_W=y
 CONFIG_ARCH_CHIP="rp2040"
 CONFIG_ARCH_CHIP_RP2040=y
 CONFIG_ARCH_RAMVECTORS=y
@@ -51,15 +51,9 @@ 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_SPI0=y
-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
 CONFIG_RR_INTERVAL=200
 CONFIG_SCHED_WAITPID=y
 CONFIG_START_DAY=9
@@ -77,5 +71,3 @@ CONFIG_USBDEV_COMPOSITE=y
 CONFIG_USBMSC=y
 CONFIG_USBMSC_COMPOSITE=y
 CONFIG_USBMSC_NOT_STALL_BULKEP=y
-CONFIG_WS2812=y
-CONFIG_WS2812_NON_SPI_DRIVER=y
diff --git a/boards/arm/rp2040/adafruit-kb2040/configs/displaypack/defconfig b/boards/arm/rp2040/raspberrypi-pico-w/configs/displaypack/defconfig
similarity index 89%
copy from boards/arm/rp2040/adafruit-kb2040/configs/displaypack/defconfig
copy to boards/arm/rp2040/raspberrypi-pico-w/configs/displaypack/defconfig
index bfc1e73539..23040836d6 100644
--- a/boards/arm/rp2040/adafruit-kb2040/configs/displaypack/defconfig
+++ b/boards/arm/rp2040/raspberrypi-pico-w/configs/displaypack/defconfig
@@ -19,8 +19,8 @@
 # CONFIG_NX_WRITEONLY 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="raspberrypi-pico-w"
+CONFIG_ARCH_BOARD_RASPBERRYPI_PICO_W=y
 CONFIG_ARCH_CHIP="rp2040"
 CONFIG_ARCH_CHIP_RP2040=y
 CONFIG_ARCH_RAMVECTORS=y
@@ -79,14 +79,8 @@ CONFIG_NX_BLOCKING=y
 CONFIG_RAM_SIZE=270336
 CONFIG_RAM_START=0x20000000
 CONFIG_READLINE_CMD_HISTORY=y
-CONFIG_RP2040_BOARD_HAS_WS2812=y
 CONFIG_RP2040_SPI0=y
-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
 CONFIG_SCHED_WAITPID=y
 CONFIG_SPI_CMDDATA=y
@@ -101,5 +95,3 @@ CONFIG_TESTING_OSTEST=y
 CONFIG_USBDEV=y
 CONFIG_USBDEV_BUSPOWERED=y
 CONFIG_VIDEO_FB=y
-CONFIG_WS2812=y
-CONFIG_WS2812_NON_SPI_DRIVER=y
diff --git a/boards/arm/rp2040/adafruit-feather-rp2040/configs/enc28j60/defconfig b/boards/arm/rp2040/raspberrypi-pico-w/configs/enc28j60/defconfig
similarity index 83%
copy from boards/arm/rp2040/adafruit-feather-rp2040/configs/enc28j60/defconfig
copy to boards/arm/rp2040/raspberrypi-pico-w/configs/enc28j60/defconfig
index 2a8f1a72af..733ffaeed0 100644
--- a/boards/arm/rp2040/adafruit-feather-rp2040/configs/enc28j60/defconfig
+++ b/boards/arm/rp2040/raspberrypi-pico-w/configs/enc28j60/defconfig
@@ -13,8 +13,8 @@
 # CONFIG_NSH_DISABLE_LOSMART 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="raspberrypi-pico-w"
+CONFIG_ARCH_BOARD_RASPBERRYPI_PICO_W=y
 CONFIG_ARCH_CHIP="rp2040"
 CONFIG_ARCH_CHIP_RP2040=y
 CONFIG_ARCH_RAMVECTORS=y
@@ -55,17 +55,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_ENC28J60_INTR_GPIO=19
-CONFIG_RP2040_ENC28J60_RESET_GPIO=18
+CONFIG_RP2040_ENC28J60_INTR_GPIO=11
+CONFIG_RP2040_ENC28J60_RESET_GPIO=10
 CONFIG_RP2040_SPI0=y
-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_SPI=y
-CONFIG_RP2040_WS2812_GPIO_PIN=16
 CONFIG_RR_INTERVAL=200
 CONFIG_SCHED_HPWORK=y
 CONFIG_SCHED_LPWORK=y
@@ -85,5 +79,3 @@ CONFIG_TESTING_GETPRIME=y
 CONFIG_TESTING_OSTEST=y
 CONFIG_UART0_SERIAL_CONSOLE=y
 CONFIG_WQUEUE_NOTIFIER=y
-CONFIG_WS2812=y
-CONFIG_WS2812_NON_SPI_DRIVER=y
diff --git a/boards/arm/rp2040/raspberrypi-pico/configs/lcd1602/defconfig b/boards/arm/rp2040/raspberrypi-pico-w/configs/lcd1602/defconfig
similarity index 94%
copy from boards/arm/rp2040/raspberrypi-pico/configs/lcd1602/defconfig
copy to boards/arm/rp2040/raspberrypi-pico-w/configs/lcd1602/defconfig
index 7767f6443a..45590c8d27 100644
--- a/boards/arm/rp2040/raspberrypi-pico/configs/lcd1602/defconfig
+++ b/boards/arm/rp2040/raspberrypi-pico-w/configs/lcd1602/defconfig
@@ -13,8 +13,8 @@
 # CONFIG_NSH_DISABLE_LOSMART is not set
 # CONFIG_STANDARD_SERIAL is not set
 CONFIG_ARCH="arm"
-CONFIG_ARCH_BOARD="raspberrypi-pico"
-CONFIG_ARCH_BOARD_RASPBERRYPI_PICO=y
+CONFIG_ARCH_BOARD="raspberrypi-pico-w"
+CONFIG_ARCH_BOARD_RASPBERRYPI_PICO_W=y
 CONFIG_ARCH_CHIP="rp2040"
 CONFIG_ARCH_CHIP_RP2040=y
 CONFIG_ARCH_RAMVECTORS=y
diff --git a/boards/arm/rp2040/adafruit-kb2040/configs/nsh/defconfig b/boards/arm/rp2040/raspberrypi-pico-w/configs/nsh/defconfig
similarity index 87%
copy from boards/arm/rp2040/adafruit-kb2040/configs/nsh/defconfig
copy to boards/arm/rp2040/raspberrypi-pico-w/configs/nsh/defconfig
index 6c91410694..d034b5a923 100644
--- a/boards/arm/rp2040/adafruit-kb2040/configs/nsh/defconfig
+++ b/boards/arm/rp2040/raspberrypi-pico-w/configs/nsh/defconfig
@@ -13,8 +13,8 @@
 # CONFIG_NSH_DISABLE_LOSMART 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="raspberrypi-pico-w"
+CONFIG_ARCH_BOARD_RASPBERRYPI_PICO_W=y
 CONFIG_ARCH_CHIP="rp2040"
 CONFIG_ARCH_CHIP_RP2040=y
 CONFIG_ARCH_RAMVECTORS=y
@@ -36,8 +36,6 @@ 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_WS2812_GPIO_PIN=17
 CONFIG_RR_INTERVAL=200
 CONFIG_SCHED_WAITPID=y
 CONFIG_START_DAY=9
@@ -48,5 +46,3 @@ CONFIG_SYSTEM_NSH=y
 CONFIG_TESTING_GETPRIME=y
 CONFIG_TESTING_OSTEST=y
 CONFIG_UART0_SERIAL_CONSOLE=y
-CONFIG_WS2812=y
-CONFIG_WS2812_NON_SPI_DRIVER=y
diff --git a/boards/arm/rp2040/adafruit-kb2040/configs/nshsram/defconfig b/boards/arm/rp2040/raspberrypi-pico-w/configs/nshsram/defconfig
similarity index 87%
copy from boards/arm/rp2040/adafruit-kb2040/configs/nshsram/defconfig
copy to boards/arm/rp2040/raspberrypi-pico-w/configs/nshsram/defconfig
index a968c49a48..5829c9c774 100644
--- a/boards/arm/rp2040/adafruit-kb2040/configs/nshsram/defconfig
+++ b/boards/arm/rp2040/raspberrypi-pico-w/configs/nshsram/defconfig
@@ -14,8 +14,8 @@
 # CONFIG_RP2040_FLASH_BOOT 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="raspberrypi-pico-w"
+CONFIG_ARCH_BOARD_RASPBERRYPI_PICO_W=y
 CONFIG_ARCH_CHIP="rp2040"
 CONFIG_ARCH_CHIP_RP2040=y
 CONFIG_ARCH_STACKDUMP=y
@@ -36,8 +36,6 @@ 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_WS2812_GPIO_PIN=17
 CONFIG_RR_INTERVAL=200
 CONFIG_SCHED_WAITPID=y
 CONFIG_START_DAY=9
@@ -48,5 +46,3 @@ CONFIG_SYSTEM_NSH=y
 CONFIG_TESTING_GETPRIME=y
 CONFIG_TESTING_OSTEST=y
 CONFIG_UART0_SERIAL_CONSOLE=y
-CONFIG_WS2812=y
-CONFIG_WS2812_NON_SPI_DRIVER=y
diff --git a/boards/arm/rp2040/adafruit-kb2040/configs/smp/defconfig b/boards/arm/rp2040/raspberrypi-pico-w/configs/smp/defconfig
similarity index 88%
copy from boards/arm/rp2040/adafruit-kb2040/configs/smp/defconfig
copy to boards/arm/rp2040/raspberrypi-pico-w/configs/smp/defconfig
index 19dba9bc35..a77882e92c 100644
--- a/boards/arm/rp2040/adafruit-kb2040/configs/smp/defconfig
+++ b/boards/arm/rp2040/raspberrypi-pico-w/configs/smp/defconfig
@@ -13,8 +13,8 @@
 # CONFIG_NSH_DISABLE_LOSMART 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="raspberrypi-pico-w"
+CONFIG_ARCH_BOARD_RASPBERRYPI_PICO_W=y
 CONFIG_ARCH_CHIP="rp2040"
 CONFIG_ARCH_CHIP_RP2040=y
 CONFIG_ARCH_INTERRUPTSTACK=2048
@@ -37,8 +37,6 @@ 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_WS2812_GPIO_PIN=17
 CONFIG_RR_INTERVAL=200
 CONFIG_SMP=y
 CONFIG_SMP_NCPUS=2
@@ -54,5 +52,3 @@ CONFIG_TESTING_GETPRIME=y
 CONFIG_TESTING_OSTEST=y
 CONFIG_TESTING_SMP=y
 CONFIG_UART0_SERIAL_CONSOLE=y
-CONFIG_WS2812=y
-CONFIG_WS2812_NON_SPI_DRIVER=y
diff --git a/boards/arm/rp2040/adafruit-feather-rp2040/configs/spisd/defconfig b/boards/arm/rp2040/raspberrypi-pico-w/configs/spisd/defconfig
similarity index 88%
copy from boards/arm/rp2040/adafruit-feather-rp2040/configs/spisd/defconfig
copy to boards/arm/rp2040/raspberrypi-pico-w/configs/spisd/defconfig
index 1b0e4fe46d..30c226754e 100644
--- a/boards/arm/rp2040/adafruit-feather-rp2040/configs/spisd/defconfig
+++ b/boards/arm/rp2040/raspberrypi-pico-w/configs/spisd/defconfig
@@ -16,8 +16,8 @@
 # CONFIG_SPI_CALLBACK 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="raspberrypi-pico-w"
+CONFIG_ARCH_BOARD_RASPBERRYPI_PICO_W=y
 CONFIG_ARCH_CHIP="rp2040"
 CONFIG_ARCH_CHIP_RP2040=y
 CONFIG_ARCH_RAMVECTORS=y
@@ -43,11 +43,9 @@ 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_SPI0=y
 CONFIG_RP2040_SPI=y
 CONFIG_RP2040_SPISD=y
-CONFIG_RP2040_WS2812_GPIO_PIN=16
 CONFIG_RR_INTERVAL=200
 CONFIG_SCHED_WAITPID=y
 CONFIG_START_DAY=9
@@ -59,5 +57,3 @@ CONFIG_SYSTEM_SPITOOL=y
 CONFIG_TESTING_GETPRIME=y
 CONFIG_TESTING_OSTEST=y
 CONFIG_UART0_SERIAL_CONSOLE=y
-CONFIG_WS2812=y
-CONFIG_WS2812_NON_SPI_DRIVER=y
diff --git a/boards/arm/rp2040/adafruit-kb2040/configs/ssd1306/defconfig b/boards/arm/rp2040/raspberrypi-pico-w/configs/ssd1306/defconfig
similarity index 91%
copy from boards/arm/rp2040/adafruit-kb2040/configs/ssd1306/defconfig
copy to boards/arm/rp2040/raspberrypi-pico-w/configs/ssd1306/defconfig
index a9c7afa1cc..33ae970365 100644
--- a/boards/arm/rp2040/adafruit-kb2040/configs/ssd1306/defconfig
+++ b/boards/arm/rp2040/raspberrypi-pico-w/configs/ssd1306/defconfig
@@ -16,8 +16,8 @@
 # CONFIG_NX_PACKEDMSFIRST 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="raspberrypi-pico-w"
+CONFIG_ARCH_BOARD_RASPBERRYPI_PICO_W=y
 CONFIG_ARCH_CHIP="rp2040"
 CONFIG_ARCH_CHIP_RP2040=y
 CONFIG_ARCH_RAMVECTORS=y
@@ -58,11 +58,9 @@ CONFIG_NX_BLOCKING=y
 CONFIG_RAM_SIZE=270336
 CONFIG_RAM_START=0x20000000
 CONFIG_READLINE_CMD_HISTORY=y
-CONFIG_RP2040_BOARD_HAS_WS2812=y
 CONFIG_RP2040_I2C0=y
 CONFIG_RP2040_I2C=y
 CONFIG_RP2040_I2C_DRIVER=y
-CONFIG_RP2040_WS2812_GPIO_PIN=17
 CONFIG_RR_INTERVAL=200
 CONFIG_SCHED_WAITPID=y
 CONFIG_START_DAY=9
@@ -74,5 +72,3 @@ CONFIG_SYSTEM_NSH=y
 CONFIG_TESTING_GETPRIME=y
 CONFIG_TESTING_OSTEST=y
 CONFIG_UART0_SERIAL_CONSOLE=y
-CONFIG_WS2812=y
-CONFIG_WS2812_NON_SPI_DRIVER=y
diff --git a/boards/arm/rp2040/adafruit-feather-rp2040/configs/st7735/defconfig b/boards/arm/rp2040/raspberrypi-pico-w/configs/st7735/defconfig
similarity index 88%
copy from boards/arm/rp2040/adafruit-feather-rp2040/configs/st7735/defconfig
copy to boards/arm/rp2040/raspberrypi-pico-w/configs/st7735/defconfig
index 157b1429e8..1bd1f5820f 100644
--- a/boards/arm/rp2040/adafruit-feather-rp2040/configs/st7735/defconfig
+++ b/boards/arm/rp2040/raspberrypi-pico-w/configs/st7735/defconfig
@@ -13,8 +13,8 @@
 # CONFIG_NSH_DISABLE_LOSMART 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="raspberrypi-pico-w"
+CONFIG_ARCH_BOARD_RASPBERRYPI_PICO_W=y
 CONFIG_ARCH_CHIP="rp2040"
 CONFIG_ARCH_CHIP_RP2040=y
 CONFIG_ARCH_RAMVECTORS=y
@@ -42,10 +42,8 @@ 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_SPI1=y
 CONFIG_RP2040_SPI=y
-CONFIG_RP2040_WS2812_GPIO_PIN=16
 CONFIG_RR_INTERVAL=200
 CONFIG_SCHED_WAITPID=y
 CONFIG_SPI_CMDDATA=y
@@ -58,5 +56,3 @@ CONFIG_TESTING_GETPRIME=y
 CONFIG_TESTING_OSTEST=y
 CONFIG_UART0_SERIAL_CONSOLE=y
 CONFIG_VIDEO_FB=y
-CONFIG_WS2812=y
-CONFIG_WS2812_NON_SPI_DRIVER=y
diff --git a/boards/arm/rp2040/adafruit-feather-rp2040/configs/spisd/defconfig b/boards/arm/rp2040/raspberrypi-pico-w/configs/usbmsc/defconfig
similarity index 85%
copy from boards/arm/rp2040/adafruit-feather-rp2040/configs/spisd/defconfig
copy to boards/arm/rp2040/raspberrypi-pico-w/configs/usbmsc/defconfig
index 1b0e4fe46d..b8e65f6d2c 100644
--- a/boards/arm/rp2040/adafruit-feather-rp2040/configs/spisd/defconfig
+++ b/boards/arm/rp2040/raspberrypi-pico-w/configs/usbmsc/defconfig
@@ -16,8 +16,8 @@
 # CONFIG_SPI_CALLBACK 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="raspberrypi-pico-w"
+CONFIG_ARCH_BOARD_RASPBERRYPI_PICO_W=y
 CONFIG_ARCH_CHIP="rp2040"
 CONFIG_ARCH_CHIP_RP2040=y
 CONFIG_ARCH_RAMVECTORS=y
@@ -25,10 +25,12 @@ CONFIG_ARCH_STACKDUMP=y
 CONFIG_BOARDCTL_RESET=y
 CONFIG_BOARD_LOOPSPERMSEC=10450
 CONFIG_BUILTIN=y
+CONFIG_CDCACM=y
 CONFIG_DEBUG_FULLOPT=y
 CONFIG_DEBUG_SYMBOLS=y
 CONFIG_DISABLE_POSIX_TIMERS=y
 CONFIG_EXAMPLES_HELLO=y
+CONFIG_EXAMPLES_USBSERIAL=y
 CONFIG_FAT_LCNAMES=y
 CONFIG_FAT_LFN=y
 CONFIG_FS_FAT=y
@@ -43,21 +45,22 @@ 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_SPI0=y
 CONFIG_RP2040_SPI=y
 CONFIG_RP2040_SPISD=y
-CONFIG_RP2040_WS2812_GPIO_PIN=16
 CONFIG_RR_INTERVAL=200
 CONFIG_SCHED_WAITPID=y
 CONFIG_START_DAY=9
 CONFIG_START_MONTH=2
 CONFIG_START_YEAR=2021
-CONFIG_SYSLOG_CONSOLE=y
+CONFIG_SYSTEM_CDCACM=y
 CONFIG_SYSTEM_NSH=y
 CONFIG_SYSTEM_SPITOOL=y
+CONFIG_SYSTEM_USBMSC=y
 CONFIG_TESTING_GETPRIME=y
 CONFIG_TESTING_OSTEST=y
 CONFIG_UART0_SERIAL_CONSOLE=y
-CONFIG_WS2812=y
-CONFIG_WS2812_NON_SPI_DRIVER=y
+CONFIG_USBDEV=y
+CONFIG_USBDEV_BUSPOWERED=y
+CONFIG_USBMSC=y
+CONFIG_USBMSC_NOT_STALL_BULKEP=y
diff --git a/boards/arm/rp2040/adafruit-kb2040/configs/usbnsh/defconfig b/boards/arm/rp2040/raspberrypi-pico-w/configs/usbnsh/defconfig
similarity index 88%
copy from boards/arm/rp2040/adafruit-kb2040/configs/usbnsh/defconfig
copy to boards/arm/rp2040/raspberrypi-pico-w/configs/usbnsh/defconfig
index 0fe5e5c827..37f64e3e63 100644
--- a/boards/arm/rp2040/adafruit-kb2040/configs/usbnsh/defconfig
+++ b/boards/arm/rp2040/raspberrypi-pico-w/configs/usbnsh/defconfig
@@ -14,8 +14,8 @@
 # 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="raspberrypi-pico-w"
+CONFIG_ARCH_BOARD_RASPBERRYPI_PICO_W=y
 CONFIG_ARCH_CHIP="rp2040"
 CONFIG_ARCH_CHIP_RP2040=y
 CONFIG_ARCH_RAMVECTORS=y
@@ -40,8 +40,6 @@ CONFIG_NSH_USBCONSOLE=y
 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_RR_INTERVAL=200
 CONFIG_SCHED_WAITPID=y
 CONFIG_START_DAY=9
@@ -52,5 +50,3 @@ CONFIG_TESTING_GETPRIME=y
 CONFIG_TESTING_OSTEST=y
 CONFIG_USBDEV=y
 CONFIG_USBDEV_BUSPOWERED=y
-CONFIG_WS2812=y
-CONFIG_WS2812_NON_SPI_DRIVER=y
diff --git a/boards/arm/rp2040/adafruit-kb2040/configs/waveshare-lcd-1.14/defconfig b/boards/arm/rp2040/raspberrypi-pico-w/configs/waveshare-lcd-1.14/defconfig
similarity index 93%
copy from boards/arm/rp2040/adafruit-kb2040/configs/waveshare-lcd-1.14/defconfig
copy to boards/arm/rp2040/raspberrypi-pico-w/configs/waveshare-lcd-1.14/defconfig
index 6d9edec8e7..38e81878f3 100644
--- a/boards/arm/rp2040/adafruit-kb2040/configs/waveshare-lcd-1.14/defconfig
+++ b/boards/arm/rp2040/raspberrypi-pico-w/configs/waveshare-lcd-1.14/defconfig
@@ -18,8 +18,8 @@
 # CONFIG_NX_WRITEONLY 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="raspberrypi-pico-w"
+CONFIG_ARCH_BOARD_RASPBERRYPI_PICO_W=y
 CONFIG_ARCH_CHIP="rp2040"
 CONFIG_ARCH_CHIP_RP2040=y
 CONFIG_ARCH_RAMVECTORS=y
@@ -75,11 +75,9 @@ CONFIG_NX_BLOCKING=y
 CONFIG_RAM_SIZE=270336
 CONFIG_RAM_START=0x20000000
 CONFIG_READLINE_CMD_HISTORY=y
-CONFIG_RP2040_BOARD_HAS_WS2812=y
 CONFIG_RP2040_LCD_SPI_CH=1
 CONFIG_RP2040_SPI1=y
 CONFIG_RP2040_SPI=y
-CONFIG_RP2040_WS2812_GPIO_PIN=17
 CONFIG_RR_INTERVAL=200
 CONFIG_SCHED_WAITPID=y
 CONFIG_SPI_CMDDATA=y
@@ -94,5 +92,3 @@ CONFIG_TESTING_GETPRIME=y
 CONFIG_TESTING_OSTEST=y
 CONFIG_UART0_SERIAL_CONSOLE=y
 CONFIG_VIDEO_FB=y
-CONFIG_WS2812=y
-CONFIG_WS2812_NON_SPI_DRIVER=y
diff --git a/boards/arm/rp2040/adafruit-kb2040/configs/waveshare-lcd-1.3/defconfig b/boards/arm/rp2040/raspberrypi-pico-w/configs/waveshare-lcd-1.3/defconfig
similarity index 93%
copy from boards/arm/rp2040/adafruit-kb2040/configs/waveshare-lcd-1.3/defconfig
copy to boards/arm/rp2040/raspberrypi-pico-w/configs/waveshare-lcd-1.3/defconfig
index f769781099..664b062c3a 100644
--- a/boards/arm/rp2040/adafruit-kb2040/configs/waveshare-lcd-1.3/defconfig
+++ b/boards/arm/rp2040/raspberrypi-pico-w/configs/waveshare-lcd-1.3/defconfig
@@ -18,8 +18,8 @@
 # CONFIG_NX_WRITEONLY 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="raspberrypi-pico-w"
+CONFIG_ARCH_BOARD_RASPBERRYPI_PICO_W=y
 CONFIG_ARCH_CHIP="rp2040"
 CONFIG_ARCH_CHIP_RP2040=y
 CONFIG_ARCH_RAMVECTORS=y
@@ -72,11 +72,9 @@ CONFIG_NX_BLOCKING=y
 CONFIG_RAM_SIZE=270336
 CONFIG_RAM_START=0x20000000
 CONFIG_READLINE_CMD_HISTORY=y
-CONFIG_RP2040_BOARD_HAS_WS2812=y
 CONFIG_RP2040_LCD_SPI_CH=1
 CONFIG_RP2040_SPI1=y
 CONFIG_RP2040_SPI=y
-CONFIG_RP2040_WS2812_GPIO_PIN=17
 CONFIG_RR_INTERVAL=200
 CONFIG_SCHED_WAITPID=y
 CONFIG_SPI_CMDDATA=y
@@ -91,5 +89,3 @@ CONFIG_TESTING_GETPRIME=y
 CONFIG_TESTING_OSTEST=y
 CONFIG_UART0_SERIAL_CONSOLE=y
 CONFIG_VIDEO_FB=y
-CONFIG_WS2812=y
-CONFIG_WS2812_NON_SPI_DRIVER=y
diff --git a/boards/arm/rp2040/raspberrypi-pico-w/include/board.h b/boards/arm/rp2040/raspberrypi-pico-w/include/board.h
new file mode 100644
index 0000000000..83c516eb74
--- /dev/null
+++ b/boards/arm/rp2040/raspberrypi-pico-w/include/board.h
@@ -0,0 +1,116 @@
+/****************************************************************************
+ * boards/arm/rp2040/raspberrypi-pico-w/include/board.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_RASPBERRYPI_PICO_W_INCLUDE_BOARD_H
+#define __BOARDS_ARM_RP2040_RASPBERRYPI_PICO_W_INCLUDE_BOARD_H
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+
+#include "rp2040_i2cdev.h"
+#include "rp2040_spidev.h"
+#include "rp2040_i2sdev.h"
+
+#include "rp2040_spisd.h"
+
+#ifndef __ASSEMBLY__
+# include <stdint.h>
+#endif
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
+/* Clocking *****************************************************************/
+
+#define MHZ                     1000000
+
+#define BOARD_XOSC_FREQ         (12 * MHZ)
+#define BOARD_PLL_SYS_FREQ      (125 * MHZ)
+#define BOARD_PLL_USB_FREQ      (48 * MHZ)
+
+#define BOARD_REF_FREQ          (12 * MHZ)
+#define BOARD_SYS_FREQ          (125 * MHZ)
+#define BOARD_PERI_FREQ         (125 * MHZ)
+#define BOARD_USB_FREQ          (48 * MHZ)
+#define BOARD_ADC_FREQ          (48 * MHZ)
+#define BOARD_RTC_FREQ          46875
+
+#define BOARD_UART_BASEFREQ     BOARD_PERI_FREQ
+
+#define BOARD_TICK_CLOCK        (1 * MHZ)
+
+/* GPIO definitions *********************************************************/
+
+#undef BOARD_GPIO_LED_PIN     
+#define BOARD_NGPIOOUT          1
+#define BOARD_NGPIOIN           1
+#define BOARD_NGPIOINT          1
+
+/****************************************************************************
+ * Public Types
+ ****************************************************************************/
+
+#ifndef __ASSEMBLY__
+
+/****************************************************************************
+ * Public Data
+ ****************************************************************************/
+
+#undef EXTERN
+#if defined(__cplusplus)
+#define EXTERN extern "C"
+extern "C"
+{
+#else
+#define EXTERN extern
+#endif
+
+/****************************************************************************
+ * Public Function Prototypes
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: rp2040_boardearlyinitialize
+ *
+ * Description:
+ *
+ ****************************************************************************/
+
+void rp2040_boardearlyinitialize(void);
+
+/****************************************************************************
+ * Name: rp2040_boardinitialize
+ *
+ * Description:
+ *
+ ****************************************************************************/
+
+void rp2040_boardinitialize(void);
+
+#undef EXTERN
+#if defined(__cplusplus)
+}
+#endif
+#endif /* __ASSEMBLY__ */
+#endif /* __BOARDS_ARM_RP2040_RASPBERRYPI_PICO_W_INCLUDE_BOARD_H */
diff --git a/boards/arm/rp2040/raspberrypi-pico-w/include/rp2040_extra_gpio.h b/boards/arm/rp2040/raspberrypi-pico-w/include/rp2040_extra_gpio.h
new file mode 100644
index 0000000000..e097105001
--- /dev/null
+++ b/boards/arm/rp2040/raspberrypi-pico-w/include/rp2040_extra_gpio.h
@@ -0,0 +1,132 @@
+/****************************************************************************
+ * boards/arm/rp2040/raspberrypi-pico-w/include/rp2040_extra_gpio.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_RASPBERRYPI_PICO_W_INCLUDE_RP2040_EXTRA_GPIO_H
+#define __BOARDS_ARM_RP2040_RASPBERRYPI_PICO_W_INCLUDE_RP2040_EXTRA_GPIO_H
+
+/****************************************************************************
+ *  These functions control the gpio pins on the CYW43439 not the RP2040.
+ *  The pin assignments for the Raspberry Pi Pico W are:
+ *
+ *  GPIO 0 - output - controls the onboard LED
+ *  GPIO 1 - output - controls the onboard voltage regulator mode.
+ *  GPIO 2 - input  - Reads as non-zero if power supplied by USB or VBUS pin.
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+#include <stdint.h>
+#include <assert.h>
+#include <stdbool.h>
+
+#include <nuttx/wireless/ieee80211/bcmf_gpio.h>
+#include <nuttx/wireless/ieee80211/bcmf_gspi.h>
+
+/****************************************************************************
+ * Public Types
+ ****************************************************************************/
+
+#ifndef __ASSEMBLY__
+
+/****************************************************************************
+ * Public Data
+ ****************************************************************************/
+
+#undef EXTERN
+#if defined(__cplusplus)
+#define EXTERN extern "C"
+extern "C"
+{
+#else
+#define EXTERN extern
+#endif
+
+extern gspi_dev_t *g_cyw43439;
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
+#define RP2040_EXTRA_GPIO_NUM    3     /* Number of extra GPIO pins */
+
+/****************************************************************************
+ * Public Function Prototypes
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: rp2040_extra_gpio_put
+ *
+ * Description:
+ *  Change the state of the GPIO pins on the CYW43439
+ ****************************************************************************/
+
+static inline void rp2040_extra_gpio_put(uint32_t gpio, int val)
+{
+  DEBUGASSERT(gpio < RP2040_EXTRA_GPIO_NUM);
+
+  bcmf_set_gpio(g_cyw43439->priv, gpio, val);
+}
+
+/****************************************************************************
+ * Name: rp2040_extra_gpio_get
+ *
+ * Description:
+ *  Get the state of the GPIO pins on the CYW43439
+ ****************************************************************************/
+
+static inline bool rp2040_extra_gpio_get(uint32_t gpio)
+{
+  bool value;
+
+  DEBUGASSERT(gpio < RP2040_EXTRA_GPIO_NUM);
+
+  bcmf_get_gpio(g_cyw43439->priv, gpio, &value);
+
+  return value;
+}
+
+/****************************************************************************
+ * Name: rp2040_extra_gpio_setdir
+ *
+ * Description:
+ *  Change the direction of the GPIO pins on the CYW43439
+ *
+ * Note -- I added this function as a placeholder in case other boards
+ *         implement extra GPIO pins where controlling the direction
+ *         makes sense.
+ ****************************************************************************/
+
+static inline void rp2040_extra_gpio_setdir(uint32_t gpio, int out)
+{
+  DEBUGASSERT(gpio < RP2040_EXTRA_GPIO_NUM);
+
+  DEBUGPANIC(); /* Function not yet implemented. */
+}
+
+#undef EXTERN
+#if defined(__cplusplus)
+}
+#endif
+
+#endif /* __ASSEMBLY__ */
+#endif
\ No newline at end of file
diff --git a/boards/arm/rp2040/raspberrypi-pico-w/include/rp2040_i2cdev.h b/boards/arm/rp2040/raspberrypi-pico-w/include/rp2040_i2cdev.h
new file mode 100644
index 0000000000..f626e8195b
--- /dev/null
+++ b/boards/arm/rp2040/raspberrypi-pico-w/include/rp2040_i2cdev.h
@@ -0,0 +1,72 @@
+/****************************************************************************
+ * boards/arm/rp2040/raspberrypi-pico-w/include/rp2040_i2cdev.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_RASPBERRYPI_PICO_W_INCLUDE_RP2040_I2CDEV_H
+#define __BOARDS_ARM_RP2040_RASPBERRYPI_PICO_W_INCLUDE_RP2040_I2CDEV_H
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+#include <stdint.h>
+
+/****************************************************************************
+ * Public Types
+ ****************************************************************************/
+
+#ifndef __ASSEMBLY__
+
+/****************************************************************************
+ * Public Data
+ ****************************************************************************/
+
+#undef EXTERN
+#if defined(__cplusplus)
+#define EXTERN extern "C"
+extern "C"
+{
+#else
+#define EXTERN extern
+#endif
+
+/****************************************************************************
+ * Public Function Prototypes
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: board_i2cdev_initialize
+ *
+ * Description:
+ *   Initialize i2c driver and register the /dev/i2c device.
+ *
+ ****************************************************************************/
+
+#ifdef CONFIG_RP2040_I2C_DRIVER
+int board_i2cdev_initialize(int bus);
+#endif
+
+#undef EXTERN
+#if defined(__cplusplus)
+}
+#endif
+
+#endif /* __ASSEMBLY__ */
+#endif /* __BOARDS_ARM_RP2040_RASPBERRYPI_PICO_W_INCLUDE_RP2040_I2CDEV_H */
diff --git a/boards/arm/rp2040/raspberrypi-pico-w/include/rp2040_i2sdev.h b/boards/arm/rp2040/raspberrypi-pico-w/include/rp2040_i2sdev.h
new file mode 100644
index 0000000000..ec26956d06
--- /dev/null
+++ b/boards/arm/rp2040/raspberrypi-pico-w/include/rp2040_i2sdev.h
@@ -0,0 +1,72 @@
+/****************************************************************************
+ * boards/arm/rp2040/raspberrypi-pico-w/include/rp2040_i2sdev.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_RASPBERRYPI_PICO_W_INCLUDE_RP2040_I2SDEV_H
+#define __BOARDS_ARM_RP2040_RASPBERRYPI_PICO_W_INCLUDE_RP2040_I2SDEV_H
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+#include <stdint.h>
+
+/****************************************************************************
+ * Public Types
+ ****************************************************************************/
+
+#ifndef __ASSEMBLY__
+
+/****************************************************************************
+ * Public Data
+ ****************************************************************************/
+
+#undef EXTERN
+#if defined(__cplusplus)
+#define EXTERN extern "C"
+extern "C"
+{
+#else
+#define EXTERN extern
+#endif
+
+/****************************************************************************
+ * Public Function Prototypes
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: board_i2sdev_initialize
+ *
+ * Description:
+ *   Initialize i2s driver and register the /dev/audio/pcm0 device.
+ *
+ ****************************************************************************/
+
+#ifdef CONFIG_RP2040_I2S
+int board_i2sdev_initialize(int bus);
+#endif
+
+#undef EXTERN
+#if defined(__cplusplus)
+}
+#endif
+
+#endif /* __ASSEMBLY__ */
+#endif /* __BOARDS_ARM_RP2040_RASPBERRYPI_PICO_W_INCLUDE_RP2040_I2SDEV_H */
diff --git a/boards/arm/rp2040/raspberrypi-pico-w/include/rp2040_spidev.h b/boards/arm/rp2040/raspberrypi-pico-w/include/rp2040_spidev.h
new file mode 100644
index 0000000000..27161905ba
--- /dev/null
+++ b/boards/arm/rp2040/raspberrypi-pico-w/include/rp2040_spidev.h
@@ -0,0 +1,69 @@
+/****************************************************************************
+ * boards/arm/rp2040/raspberrypi-pico-w/include/rp2040_spidev.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_RASPBERRYPI_PICO_W_INCLUDE_RP2040_SPIDEV_H
+#define __BOARDS_ARM_RP2040_RASPBERRYPI_PICO_W_INCLUDE_RP2040_SPIDEV_H
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+
+/****************************************************************************
+ * Public Types
+ ****************************************************************************/
+
+#ifndef __ASSEMBLY__
+
+/****************************************************************************
+ * Public Data
+ ****************************************************************************/
+
+#undef EXTERN
+#if defined(__cplusplus)
+#define EXTERN extern "C"
+extern "C"
+{
+#else
+#define EXTERN extern
+#endif
+
+/****************************************************************************
+ * Public Function Prototypes
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: board_spidev_initialize
+ *
+ * Description:
+ *   Initialize spi driver and register the /dev/spi device.
+ *
+ ****************************************************************************/
+
+int board_spidev_initialize(int bus);
+
+#undef EXTERN
+#if defined(__cplusplus)
+}
+#endif
+
+#endif /* __ASSEMBLY__ */
+#endif /* __BOARDS_ARM_RP2040_RASPBERRYPI_PICO_W_INCLUDE_RP2040_SPIDEV_H */
diff --git a/boards/arm/rp2040/raspberrypi-pico-w/include/rp2040_spisd.h b/boards/arm/rp2040/raspberrypi-pico-w/include/rp2040_spisd.h
new file mode 100644
index 0000000000..e5fcc42d4d
--- /dev/null
+++ b/boards/arm/rp2040/raspberrypi-pico-w/include/rp2040_spisd.h
@@ -0,0 +1,83 @@
+/****************************************************************************
+ * boards/arm/rp2040/raspberrypi-pico-w/include/rp2040_spisd.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_RASPBERRYPI_PICO_W_INCLUDE_RP2040_SPISD_H
+#define __BOARDS_ARM_RP2040_RASPBERRYPI_PICO_W_INCLUDE_RP2040_SPISD_H
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+
+/****************************************************************************
+ * Public Types
+ ****************************************************************************/
+
+#ifndef __ASSEMBLY__
+
+/****************************************************************************
+ * Public Data
+ ****************************************************************************/
+
+#undef EXTERN
+#if defined(__cplusplus)
+#define EXTERN extern "C"
+extern "C"
+{
+#else
+#define EXTERN extern
+#endif
+
+/****************************************************************************
+ * Public Function Prototypes
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: board_spisd_initialize
+ *
+ * Description:
+ *   Initialize the SPI-based SD card.
+ *
+ ****************************************************************************/
+
+#ifdef CONFIG_RP2040_SPISD
+int board_spisd_initialize(int minor, int bus);
+#endif
+
+/****************************************************************************
+ * Name: board_spisd_status
+ *
+ * Description:
+ *   Get the status whether SD Card is present or not.
+ *
+ ****************************************************************************/
+
+#ifdef CONFIG_RP2040_SPISD
+uint8_t board_spisd_status(struct spi_dev_s *dev, uint32_t devid);
+#endif
+
+#undef EXTERN
+#if defined(__cplusplus)
+}
+#endif
+
+#endif /* __ASSEMBLY__ */
+#endif /* __BOARDS_ARM_RP2040_RASPBERRYPI_PICO_W_INCLUDE_RP2040_SPISD_H */
diff --git a/boards/arm/rp2040/raspberrypi-pico-w/scripts/Make.defs b/boards/arm/rp2040/raspberrypi-pico-w/scripts/Make.defs
new file mode 100644
index 0000000000..1fa4a91047
--- /dev/null
+++ b/boards/arm/rp2040/raspberrypi-pico-w/scripts/Make.defs
@@ -0,0 +1,45 @@
+############################################################################
+# boards/arm/rp2040/raspberrypi-pico-w/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 = raspberrypi-pico-flash.ld
+else
+  LDSCRIPT = raspberrypi-pico-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/raspberrypi-pico-w/scripts/raspberrypi-pico-flash.ld b/boards/arm/rp2040/raspberrypi-pico-w/scripts/raspberrypi-pico-flash.ld
new file mode 100644
index 0000000000..f370cca326
--- /dev/null
+++ b/boards/arm/rp2040/raspberrypi-pico-w/scripts/raspberrypi-pico-flash.ld
@@ -0,0 +1,112 @@
+/****************************************************************************
+ * boards/arm/rp2040/raspberrypi-pico/scripts/raspberrypi-pico-flash.ld
+ *
+ * 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.
+ *
+ ****************************************************************************/
+
+MEMORY
+{
+  flash (rx) : ORIGIN = 0x10000000, LENGTH = 2048K
+  sram (rwx) : ORIGIN = 0x20000000, LENGTH = 264K
+}
+
+OUTPUT_ARCH(arm)
+EXTERN(_vectors)
+ENTRY(_stext)
+
+SECTIONS
+{
+    .flash_begin : {
+        __flash_binary_start = .;
+    } > flash
+
+    .boot2 : {
+        __boot2_start__ = .;
+        KEEP (*(.boot2))
+        __boot2_end__ = .;
+    } > flash
+
+    .text : {
+        _stext = ABSOLUTE(.);
+        *(.vectors)
+        *(.text .text.*)
+        *(.fixup)
+        *(.gnu.warning)
+        *(.rodata .rodata.*)
+        *(.gnu.linkonce.t.*)
+        *(.glue_7)
+        *(.glue_7t)
+        *(.got)
+        *(.gcc_except_table)
+        *(.gnu.linkonce.r.*)
+        _etext = ABSOLUTE(.);
+    } > flash
+
+    .init_section : {
+        _sinit = ABSOLUTE(.);
+        *(.init_array .init_array.*)
+        _einit = ABSOLUTE(.);
+    } > flash
+
+    .ARM.extab : {
+        *(.ARM.extab*)
+    } > flash
+
+    __exidx_start = ABSOLUTE(.);
+    .ARM.exidx : {
+        *(.ARM.exidx*)
+    } > flash
+    __exidx_end = ABSOLUTE(.);
+
+    _eronly = ABSOLUTE(.);
+
+    .ram_vectors (COPY) : {
+        *(.ram_vectors)
+    } > sram
+
+    .data : {
+        _sdata = ABSOLUTE(.);
+        *(.data .data.*)
+        *(.gnu.linkonce.d.*)
+        CONSTRUCTORS
+        . = ALIGN(4);
+        _edata = ABSOLUTE(.);
+    } > sram AT > flash
+
+    .bss : {
+        _sbss = ABSOLUTE(.);
+        *(.bss .bss.*)
+        *(.gnu.linkonce.b.*)
+        *(COMMON)
+        . = ALIGN(4);
+        _ebss = ABSOLUTE(.);
+    } > sram
+
+    /* Stabs debugging sections. */
+    .stab 0 : { *(.stab) }
+    .stabstr 0 : { *(.stabstr) }
+    .stab.excl 0 : { *(.stab.excl) }
+    .stab.exclstr 0 : { *(.stab.exclstr) }
+    .stab.index 0 : { *(.stab.index) }
+    .stab.indexstr 0 : { *(.stab.indexstr) }
+    .comment 0 : { *(.comment) }
+    .debug_abbrev 0 : { *(.debug_abbrev) }
+    .debug_info 0 : { *(.debug_info) }
+    .debug_line 0 : { *(.debug_line) }
+    .debug_pubnames 0 : { *(.debug_pubnames) }
+    .debug_aranges 0 : { *(.debug_aranges) }
+}
diff --git a/boards/arm/rp2040/raspberrypi-pico-w/scripts/raspberrypi-pico-sram.ld b/boards/arm/rp2040/raspberrypi-pico-w/scripts/raspberrypi-pico-sram.ld
new file mode 100644
index 0000000000..d9278950cf
--- /dev/null
+++ b/boards/arm/rp2040/raspberrypi-pico-w/scripts/raspberrypi-pico-sram.ld
@@ -0,0 +1,97 @@
+/****************************************************************************
+ * boards/arm/rp2040/raspberrypi-pico/scripts/raspberrypi-pico-sram.ld
+ *
+ * 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.
+ *
+ ****************************************************************************/
+
+MEMORY
+{
+  sram (rwx) : ORIGIN = 0x20000000, LENGTH = 264K
+}
+
+OUTPUT_ARCH(arm)
+EXTERN(_vectors)
+ENTRY(_stext)
+
+SECTIONS
+{
+    .text : {
+        _stext = ABSOLUTE(.);
+        rp2040_start.o(.text)
+        . = ALIGN(256);
+        *(.vectors)
+        *(.text .text.*)
+        *(.fixup)
+        *(.gnu.warning)
+        *(.rodata .rodata.*)
+        *(.gnu.linkonce.t.*)
+        *(.glue_7)
+        *(.glue_7t)
+        *(.got)
+        *(.gcc_except_table)
+        *(.gnu.linkonce.r.*)
+        _etext = ABSOLUTE(.);
+    } > sram
+
+    .init_section : {
+        _sinit = ABSOLUTE(.);
+        *(.init_array .init_array.*)
+        _einit = ABSOLUTE(.);
+    } > sram
+
+    .ARM.extab : {
+        *(.ARM.extab*)
+    } > sram
+
+    __exidx_start = ABSOLUTE(.);
+    .ARM.exidx : {
+        *(.ARM.exidx*)
+    } > sram
+    __exidx_end = ABSOLUTE(.);
+
+    .data : {
+        _sdata = ABSOLUTE(.);
+        *(.data .data.*)
+        *(.gnu.linkonce.d.*)
+        CONSTRUCTORS
+        . = ALIGN(4);
+        _edata = ABSOLUTE(.);
+    } > sram
+
+    .bss : {
+        _sbss = ABSOLUTE(.);
+        *(.bss .bss.*)
+        *(.gnu.linkonce.b.*)
+        *(COMMON)
+        . = ALIGN(4);
+        _ebss = ABSOLUTE(.);
+    } > sram
+
+    /* Stabs debugging sections. */
+    .stab 0 : { *(.stab) }
+    .stabstr 0 : { *(.stabstr) }
+    .stab.excl 0 : { *(.stab.excl) }
+    .stab.exclstr 0 : { *(.stab.exclstr) }
+    .stab.index 0 : { *(.stab.index) }
+    .stab.indexstr 0 : { *(.stab.indexstr) }
+    .comment 0 : { *(.comment) }
+    .debug_abbrev 0 : { *(.debug_abbrev) }
+    .debug_info 0 : { *(.debug_info) }
+    .debug_line 0 : { *(.debug_line) }
+    .debug_pubnames 0 : { *(.debug_pubnames) }
+    .debug_aranges 0 : { *(.debug_aranges) }
+}
diff --git a/boards/arm/rp2040/raspberrypi-pico-w/src/Make.defs b/boards/arm/rp2040/raspberrypi-pico-w/src/Make.defs
new file mode 100644
index 0000000000..ddddef17c2
--- /dev/null
+++ b/boards/arm/rp2040/raspberrypi-pico-w/src/Make.defs
@@ -0,0 +1,65 @@
+############################################################################
+# boards/arm/rp2040/raspberrypi-pico/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
+
+CSRCS += rp2040_firmware.c
+
+DEPPATH += --dep-path board
+VPATH += :board
+CFLAGS += $(shell $(INCDIR) "$(CC)" $(TOPDIR)$(DELIM)arch$(DELIM)$(CONFIG_ARCH)$(DELIM)src$(DELIM)board$(DELIM)board)
+
+############################################################################
+# The rules below copy the cyw43439 blob from pico_sdk
+############################################################################
+
+ifeq ($(CONFIG_IEEE80211_INFINEON_CYW43439),y)
+
+FIRMWARE = src$(DELIM)cyw43439.firmware.image
+
+FIRMWARE_SRC := $(patsubst "%",%,$(CONFIG_CYW43439_FIRMWARE_BIN_PATH))
+
+src$(DELIM)cyw43439.firmware.image: $(FIRMWARE_SRC)
+	$(call CATFILE, src$(DELIM)cyw43439.firmware.image, $(FIRMWARE_SRC))
+
+src$(DELIM)rp2040_firmware.c: $(FIRMWARE) 
+
+#depend: $(FIRMWARE) 
+
+distclean:: 
+	$(call DELFILE, src$(DELIM)cyw43439.firmware.image)
+
+endif
diff --git a/boards/arm/rp2040/raspberrypi-pico-w/src/rp2040_appinit.c b/boards/arm/rp2040/raspberrypi-pico-w/src/rp2040_appinit.c
new file mode 100644
index 0000000000..7588accca0
--- /dev/null
+++ b/boards/arm/rp2040/raspberrypi-pico-w/src/rp2040_appinit.c
@@ -0,0 +1,78 @@
+/****************************************************************************
+ * boards/arm/rp2040/raspberrypi-pico-w/src/rp2040_appinit.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 "rp2040_pico.h"
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
+#ifndef OK
+#  define OK 0
+#endif
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: board_app_initialize
+ *
+ * Description:
+ *   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:
+ *   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:
+ *   Zero (OK) is returned on success; a negated errno value is returned on
+ *   any failure to indicate the nature of the failure.
+ *
+ ****************************************************************************/
+
+int board_app_initialize(uintptr_t arg)
+{
+#ifdef CONFIG_BOARD_LATE_INITIALIZE
+  /* Board initialization already performed by board_late_initialize() */
+
+  return OK;
+#else
+  /* Perform board-specific initialization */
+
+  return rp2040_bringup();
+#endif
+}
diff --git a/boards/arm/rp2040/raspberrypi-pico-w/src/rp2040_boardinitialize.c b/boards/arm/rp2040/raspberrypi-pico-w/src/rp2040_boardinitialize.c
new file mode 100644
index 0000000000..b9b582589d
--- /dev/null
+++ b/boards/arm/rp2040/raspberrypi-pico-w/src/rp2040_boardinitialize.c
@@ -0,0 +1,81 @@
+/****************************************************************************
+ * boards/arm/rp2040/raspberrypi-pico-w/src/rp2040_boardinitialize.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 <debug.h>
+
+#include <nuttx/board.h>
+#include <arch/board/board.h>
+
+#include "arm_internal.h"
+#include "rp2040_gpio.h"
+
+#ifdef CONFIG_ARCH_BOARD_COMMON
+#include "rp2040_common_initialize.h"
+#endif /* CONFIG_ARCH_BOARD_COMMON */
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Private Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: rp2040_boardearlyinitialize
+ *
+ * Description:
+ *
+ ****************************************************************************/
+
+void rp2040_boardearlyinitialize(void)
+{
+  #ifdef CONFIG_ARCH_BOARD_COMMON
+  rp2040_common_earlyinitialize();
+  #endif 
+
+  /* --- Place any board specific early initialization here --- */
+}
+
+/****************************************************************************
+ * Name: rp2040_boardinitialize
+ *
+ * Description:
+ *
+ ****************************************************************************/
+
+void rp2040_boardinitialize(void)
+{
+  #ifdef CONFIG_ARCH_BOARD_COMMON
+  rp2040_common_initialize();
+  #endif 
+
+  /* --- Place any board specific initialization here --- */
+}
diff --git a/boards/arm/rp2040/raspberrypi-pico-w/src/rp2040_bringup.c b/boards/arm/rp2040/raspberrypi-pico-w/src/rp2040_bringup.c
new file mode 100644
index 0000000000..e99e43c196
--- /dev/null
+++ b/boards/arm/rp2040/raspberrypi-pico-w/src/rp2040_bringup.c
@@ -0,0 +1,102 @@
+/****************************************************************************
+ * boards/arm/rp2040/raspberrypi-pico-w/src/rp2040_bringup.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 <debug.h>
+#include <stddef.h>
+#include <errno.h>
+
+#include <nuttx/wireless/ieee80211/bcmf_gpio.h>
+
+#include <arch/board/board.h>
+
+#include "rp2040_pico.h"
+
+#ifdef CONFIG_ARCH_BOARD_COMMON
+#include "rp2040_common_bringup.h"
+#endif /* CONFIG_ARCH_BOARD_COMMON */
+
+#ifdef CONFIG_RP2040_INFINEON_CYW43439
+#include "rp2040_cyw43439.h"
+#endif
+
+/****************************************************************************
+ * Global Data
+ ****************************************************************************/
+
+#ifdef CONFIG_RP2040_INFINEON_CYW43439
+gspi_dev_t *g_cyw43439 = NULL;
+#endif
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: rp2040_bringup
+ ****************************************************************************/
+
+int rp2040_bringup(void)
+{
+#ifdef CONFIG_ARCH_BOARD_COMMON
+
+  int ret = rp2040_common_bringup();
+  if (ret < 0)
+    {
+      return ret;
+    }
+
+#endif /* CONFIG_ARCH_BOARD_COMMON */
+
+  /* --- Place any board specific bringup code here --- */
+
+#define CYW43439_POWER_ON_GPIO     23
+#define CYW43439_CHIP_SELECT_GPIO  25
+#define CYW43439_DATA_GPIO         24
+#define CYW43439_CLOCK_GPIO        29
+
+#ifdef CONFIG_RP2040_INFINEON_CYW43439
+
+  g_cyw43439 = rp2040_cyw_setup(CYW43439_POWER_ON_GPIO,
+                                CYW43439_CHIP_SELECT_GPIO,
+                                CYW43439_DATA_GPIO,
+                                CYW43439_CLOCK_GPIO,
+                                CYW43439_DATA_GPIO);
+
+  if (g_cyw43439 == NULL)
+    {
+      ret = errno;
+
+      syslog(LOG_ERR,
+             "Failed to initialize cyw43439 (WiFi chip): %d\n",
+             ret);
+
+      return ret;
+    }
+
+#endif
+
+  return OK;
+}
diff --git a/boards/arm/rp2040/raspberrypi-pico-w/src/rp2040_gpio.c b/boards/arm/rp2040/raspberrypi-pico-w/src/rp2040_gpio.c
new file mode 100644
index 0000000000..816136c252
--- /dev/null
+++ b/boards/arm/rp2040/raspberrypi-pico-w/src/rp2040_gpio.c
@@ -0,0 +1,392 @@
+/****************************************************************************
+ * boards/arm/rp2040/raspberrypi-pico-w/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  14
+
+/****************************************************************************
+ * 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/raspberrypi-pico-w/src/rp2040_pico.h b/boards/arm/rp2040/raspberrypi-pico-w/src/rp2040_pico.h
new file mode 100644
index 0000000000..0475e3506d
--- /dev/null
+++ b/boards/arm/rp2040/raspberrypi-pico-w/src/rp2040_pico.h
@@ -0,0 +1,36 @@
+/****************************************************************************
+ * boards/arm/rp2040/raspberrypi-pico-w/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_RASPBERRYPI_PICO_SRC_RP2040_PICO_H
+#define __BOARDS_ARM_RP2040_RASPBERRYPI_PICO_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_RASPBERRYPI_PICO_SRC_RP2040_PICO_H */
diff --git a/boards/arm/rp2040/raspberrypi-pico-w/src/rp2040_reset.c b/boards/arm/rp2040/raspberrypi-pico-w/src/rp2040_reset.c
new file mode 100644
index 0000000000..15bc3779b3
--- /dev/null
+++ b/boards/arm/rp2040/raspberrypi-pico-w/src/rp2040_reset.c
@@ -0,0 +1,61 @@
+/****************************************************************************
+ * boards/arm/rp2040/raspberrypi-pico-w/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/raspberrypi-pico-w/src/rp2040_spi.c b/boards/arm/rp2040/raspberrypi-pico-w/src/rp2040_spi.c
new file mode 100644
index 0000000000..36af5597c3
--- /dev/null
+++ b/boards/arm/rp2040/raspberrypi-pico-w/src/rp2040_spi.c
@@ -0,0 +1,150 @@
+/****************************************************************************
+ * boards/arm/rp2040/raspberrypi-pico-w/src/rp2040_spi.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 <stdint.h>
+#include <stdbool.h>
+#include <errno.h>
+#include <debug.h>
+
+#include <nuttx/spi/spi.h>
+#include <arch/board/board.h>
+
+#include "arm_internal.h"
+#include "chip.h"
+#include "rp2040_gpio.h"
+#include "hardware/rp2040_spi.h"
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name:  rp2040_spi0/1select and rp2040_spi0/1status
+ *
+ * Description:
+ *   The external functions, rp2040_spi0/1select and rp2040_spi0/1status
+ *   must be provided by board-specific logic.
+ *   They are implementations of the select and status methods of the SPI
+ *   interface defined by struct spi_ops_s (see include/nuttx/spi/spi.h).
+ *   All other methods (including rp2040_spibus_initialize()) are provided by
+ *   common RP2040 logic.  To use this common SPI logic on your board:
+ *
+ *   1. Provide logic in rp2040_boardinitialize() to configure SPI chip
+ *      select pins.
+ *   2. Provide rp2040_spi0/1select() and rp2040_spi0/1status()
+ *      functions in your board-specific logic.
+ *      These functions will perform chip selection and status operations
+ *      using GPIOs in the way your board is configured.
+ *   3. Add a calls to rp2040_spibus_initialize() in your low level
+ *      application initialization logic
+ *   4. The handle returned by rp2040_spibus_initialize() may then be used to
+ *      bind the SPI driver to higher level logic (e.g., calling
+ *      mmcsd_spislotinitialize(), for example, will bind the SPI driver to
+ *      the SPI MMC/SD driver).
+ *
+ ****************************************************************************/
+
+#ifdef CONFIG_RP2040_SPI0
+void rp2040_spi0select(struct spi_dev_s *dev, uint32_t devid,
+                       bool selected)
+{
+  spiinfo("devid: %d CS: %s\n", (int)devid,
+          selected ? "assert" : "de-assert");
+
+  rp2040_gpio_put(CONFIG_RP2040_SPI0_CS_GPIO, !selected);
+}
+
+uint8_t rp2040_spi0status(struct spi_dev_s *dev, uint32_t devid)
+{
+  uint8_t ret = 0;
+
+#  if defined(CONFIG_RP2040_SPISD) && (CONFIG_RP2040_SPISD_SPI_CH == 0)
+  ret = board_spisd_status(dev, devid);
+#  endif
+  return ret;
+}
+
+#ifdef CONFIG_SPI_CMDDATA
+int rp2040_spi0cmddata(struct spi_dev_s *dev, uint32_t devid, bool cmd)
+{
+#ifdef CONFIG_LCD_ST7789
+  if (devid == SPIDEV_DISPLAY(0))
+    {
+      /*  This is the Data/Command control pad which determines whether the
+       *  data bits are data or a command.
+       */
+
+      rp2040_gpio_put(CONFIG_RP2040_SPI0_RX_GPIO, !cmd);
+
+      return OK;
+    }
+#endif
+
+  return -ENODEV;
+}
+#endif
+#endif
+
+#ifdef CONFIG_RP2040_SPI1
+void rp2040_spi1select(struct spi_dev_s *dev, uint32_t devid,
+                       bool selected)
+{
+  spiinfo("devid: %d CS: %s\n", (int)devid,
+          selected ? "assert" : "de-assert");
+
+  rp2040_gpio_put(CONFIG_RP2040_SPI1_CS_GPIO, !selected);
+}
+
+uint8_t rp2040_spi1status(struct spi_dev_s *dev, uint32_t devid)
+{
+  uint8_t ret = 0;
+
+#  if defined(CONFIG_RP2040_SPISD) && (CONFIG_RP2040_SPISD_SPI_CH == 1)
+  ret = board_spisd_status(dev, devid);
+#  endif
+  return ret;
+}
+
+#ifdef CONFIG_SPI_CMDDATA
+int rp2040_spi1cmddata(struct spi_dev_s *dev, uint32_t devid, bool cmd)
+{
+#if defined (CONFIG_LCD_ST7789) || (CONFIG_LCD_ST7735)
+  if (devid == SPIDEV_DISPLAY(0))
+    {
+      /*  This is the Data/Command control pad which determines whether the
+       *  data bits are data or a command.
+       */
+
+      rp2040_gpio_put(CONFIG_RP2040_SPI1_RX_GPIO, !cmd);
+
+      return OK;
+    }
+#endif
+
+  return -ENODEV;
+}
+#endif
+#endif
diff --git a/boards/arm/rp2040/raspberrypi-pico/configs/lcd1602/defconfig b/boards/arm/rp2040/raspberrypi-pico/configs/lcd1602/defconfig
index 7767f6443a..a77882e92c 100644
--- a/boards/arm/rp2040/raspberrypi-pico/configs/lcd1602/defconfig
+++ b/boards/arm/rp2040/raspberrypi-pico/configs/lcd1602/defconfig
@@ -13,10 +13,11 @@
 # CONFIG_NSH_DISABLE_LOSMART is not set
 # CONFIG_STANDARD_SERIAL is not set
 CONFIG_ARCH="arm"
-CONFIG_ARCH_BOARD="raspberrypi-pico"
-CONFIG_ARCH_BOARD_RASPBERRYPI_PICO=y
+CONFIG_ARCH_BOARD="raspberrypi-pico-w"
+CONFIG_ARCH_BOARD_RASPBERRYPI_PICO_W=y
 CONFIG_ARCH_CHIP="rp2040"
 CONFIG_ARCH_CHIP_RP2040=y
+CONFIG_ARCH_INTERRUPTSTACK=2048
 CONFIG_ARCH_RAMVECTORS=y
 CONFIG_ARCH_STACKDUMP=y
 CONFIG_BOARDCTL_RESET=y
@@ -26,12 +27,9 @@ CONFIG_DEBUG_FULLOPT=y
 CONFIG_DEBUG_SYMBOLS=y
 CONFIG_DISABLE_POSIX_TIMERS=y
 CONFIG_EXAMPLES_HELLO=y
-CONFIG_EXAMPLES_SLCD=y
 CONFIG_FS_PROCFS=y
 CONFIG_FS_PROCFS_REGISTER=y
 CONFIG_INIT_ENTRYPOINT="nsh_main"
-CONFIG_LCD_BACKPACK=y
-CONFIG_LCD_LCD1602=y
 CONFIG_NFILE_DESCRIPTORS_PER_BLOCK=6
 CONFIG_NSH_ARCHINIT=y
 CONFIG_NSH_BUILTIN_APPS=y
@@ -39,17 +37,18 @@ CONFIG_NSH_READLINE=y
 CONFIG_RAM_SIZE=270336
 CONFIG_RAM_START=0x20000000
 CONFIG_READLINE_CMD_HISTORY=y
-CONFIG_RP2040_I2C0=y
-CONFIG_RP2040_I2C=y
-CONFIG_RP2040_I2C_DRIVER=y
 CONFIG_RR_INTERVAL=200
-CONFIG_SCHED_WAITPID=y
-CONFIG_SLCD=y
+CONFIG_SMP=y
+CONFIG_SMP_NCPUS=2
+CONFIG_STACK_COLORATION=y
 CONFIG_START_DAY=9
 CONFIG_START_MONTH=2
 CONFIG_START_YEAR=2021
 CONFIG_SYSLOG_CONSOLE=y
 CONFIG_SYSTEM_NSH=y
+CONFIG_SYSTEM_SYSTEM=y
+CONFIG_SYSTEM_TASKSET=y
 CONFIG_TESTING_GETPRIME=y
 CONFIG_TESTING_OSTEST=y
+CONFIG_TESTING_SMP=y
 CONFIG_UART0_SERIAL_CONSOLE=y
diff --git a/boards/arm/rp2040/raspberrypi-pico/src/rp2040_boardinitialize.c b/boards/arm/rp2040/raspberrypi-pico/src/rp2040_boardinitialize.c
index a3eba93eae..c35e85fd13 100644
--- a/boards/arm/rp2040/raspberrypi-pico/src/rp2040_boardinitialize.c
+++ b/boards/arm/rp2040/raspberrypi-pico/src/rp2040_boardinitialize.c
@@ -32,6 +32,10 @@
 #include "arm_internal.h"
 #include "rp2040_gpio.h"
 
+#ifdef CONFIG_ARCH_BOARD_COMMON
+#include "rp2040_common_initialize.h"
+#endif /* CONFIG_ARCH_BOARD_COMMON */
+
 /****************************************************************************
  * Pre-processor Definitions
  ****************************************************************************/
@@ -53,52 +57,17 @@
 
 void rp2040_boardearlyinitialize(void)
 {
-  rp2040_gpio_initialize();
-
-  /* Disable IE on GPIO 26-29 */
+  #ifdef CONFIG_ARCH_BOARD_COMMON
+  rp2040_common_earlyinitialize();
+  #endif 
 
-  clrbits_reg32(RP2040_PADS_BANK0_GPIO_IE, RP2040_PADS_BANK0_GPIO(26));
-  clrbits_reg32(RP2040_PADS_BANK0_GPIO_IE, RP2040_PADS_BANK0_GPIO(27));
-  clrbits_reg32(RP2040_PADS_BANK0_GPIO_IE, RP2040_PADS_BANK0_GPIO(28));
-  clrbits_reg32(RP2040_PADS_BANK0_GPIO_IE, RP2040_PADS_BANK0_GPIO(29));
+  /* --- Place any board specific early initialization here --- */
 
   /* Set board LED pin */
 
   rp2040_gpio_init(BOARD_GPIO_LED_PIN);
   rp2040_gpio_setdir(BOARD_GPIO_LED_PIN, true);
   rp2040_gpio_put(BOARD_GPIO_LED_PIN, true);
-
-  /* Set default UART pin */
-
-#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_RX_GPIO,
-                           RP2040_GPIO_FUNC_UART);      /* RX */
-#ifdef CONFIG_SERIAL_OFLOWCONTROL
-  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_RTS_GPIO,
-                           RP2040_GPIO_FUNC_UART);      /* RTS */
-#endif
-#endif
-
-#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_RX_GPIO,
-                           RP2040_GPIO_FUNC_UART);      /* RX */
-#ifdef CONFIG_SERIAL_OFLOWCONTROL
-  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_RTS_GPIO,
-                           RP2040_GPIO_FUNC_UART);      /* RTS */
-#endif
-#endif
 }
 
 /****************************************************************************
@@ -110,57 +79,9 @@ void rp2040_boardearlyinitialize(void)
 
 void rp2040_boardinitialize(void)
 {
-  /* Set default I2C pin */
-
-#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_SCL_GPIO,
-                           RP2040_GPIO_FUNC_I2C);       /* SCL */
-
-  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
-
-#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_SCL_GPIO,
-                           RP2040_GPIO_FUNC_I2C);       /* SCL */
-
-  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 */
-
-#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_SCK_GPIO,
-                           RP2040_GPIO_FUNC_SPI);       /* SCK */
-  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_CS_GPIO);        /* CSn */
-  rp2040_gpio_setdir(CONFIG_RP2040_SPI0_CS_GPIO, true);
-  rp2040_gpio_put(CONFIG_RP2040_SPI0_CS_GPIO, true);
-#endif
-
-#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_SCK_GPIO,
-                           RP2040_GPIO_FUNC_SPI);       /* SCK */
-  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_CS_GPIO);        /* CSn */
-  rp2040_gpio_setdir(CONFIG_RP2040_SPI1_CS_GPIO, true);
-  rp2040_gpio_put(CONFIG_RP2040_SPI1_CS_GPIO, true);
-#endif
+  #ifdef CONFIG_ARCH_BOARD_COMMON
+  rp2040_common_initialize();
+  #endif 
+
+  /* --- Place any board specific initialization here --- */
 }
diff --git a/boards/arm/rp2040/raspberrypi-pico/src/rp2040_bringup.c b/boards/arm/rp2040/raspberrypi-pico/src/rp2040_bringup.c
index 2e5ae58070..a20a397c00 100644
--- a/boards/arm/rp2040/raspberrypi-pico/src/rp2040_bringup.c
+++ b/boards/arm/rp2040/raspberrypi-pico/src/rp2040_bringup.c
@@ -33,50 +33,9 @@
 
 #include "rp2040_pico.h"
 
-#ifdef CONFIG_LCD_BACKPACK
-#include "rp2040_lcd_backpack.h"
-#endif
-
-#ifdef CONFIG_LCD
-#include <nuttx/board.h>
-#endif
-
-#ifdef CONFIG_LCD_DEV
-#include <nuttx/lcd/lcd_dev.h>
-#endif
-
-#ifdef CONFIG_VIDEO_FB
-#include <nuttx/video/fb.h>
-#endif
-
-#ifdef CONFIG_SENSORS_INA219
-#include <nuttx/sensors/ina219.h>
-#include "rp2040_ina219.h"
-#endif
-
-#ifdef CONFIG_SENSORS_BMP180
-#include <nuttx/sensors/bmp180.h>
-#include "rp2040_bmp180.h"
-#endif
-
-#ifdef CONFIG_RP2040_PWM
-#include "rp2040_pwm.h"
-#include "rp2040_pwmdev.h"
-#endif
-
-#if defined(CONFIG_ADC) && defined(CONFIG_RP2040_ADC)
-#include "rp2040_adc.h"
-#endif
-
-#if defined(CONFIG_RP2040_BOARD_HAS_WS2812) && defined(CONFIG_WS2812)
-#include "rp2040_ws2812.h"
-#endif
-
-#ifdef CONFIG_WS2812_HAS_WHITE
-#define HAS_WHITE true
-#else /* CONFIG_WS2812_HAS_WHITE */
-#define HAS_WHITE false
-#endif /* CONFIG_WS2812_HAS_WHITE */
+#ifdef CONFIG_ARCH_BOARD_COMMON
+#include "rp2040_common_bringup.h"
+#endif /* CONFIG_ARCH_BOARD_COMMON */
 
 /****************************************************************************
  * Public Functions
@@ -88,461 +47,17 @@
 
 int rp2040_bringup(void)
 {
-  int ret = 0;
-
-#ifdef CONFIG_RP2040_I2C_DRIVER
-  #ifdef CONFIG_RP2040_I2C0
-  ret = board_i2cdev_initialize(0);
-  if (ret < 0)
-    {
-      _err("ERROR: Failed to initialize I2C0.\n");
-    }
-  #endif
-
-  #ifdef CONFIG_RP2040_I2C1
-  ret = board_i2cdev_initialize(1);
-  if (ret < 0)
-    {
-      _err("ERROR: Failed to initialize I2C1.\n");
-    }
-  #endif
-#endif
-
-#ifdef CONFIG_RP2040_SPI_DRIVER
-  #ifdef CONFIG_RP2040_SPI0
-  ret = board_spidev_initialize(0);
-  if (ret < 0)
-    {
-      _err("ERROR: Failed to initialize SPI0.\n");
-    }
-  #endif
-
-  #ifdef CONFIG_RP2040_SPI1
-  ret = board_spidev_initialize(1);
-  if (ret < 0)
-    {
-      _err("ERROR: Failed to initialize SPI1.\n");
-    }
-  #endif
-#endif
-
-#ifdef CONFIG_RP2040_PWM
-#  ifdef CONFIG_RP2040_PWM0
-#    if defined(CONFIG_PWM_NCHANNELS) && CONFIG_PWM_NCHANNELS == 2
-  ret = rp2040_pwmdev_initialize(0,
-                                 CONFIG_RP2040_PWM0A_GPIO,
-                                 CONFIG_RP2040_PWM0B_GPIO,
-                                 (0
-#      ifdef CONFIG_RP2040_PWM0A_INVERT
-                                  | RP2040_PWM_CSR_A_INV
-#      endif
-#      ifdef CONFIG_RP2040_PWM0B_INVERT
-                                  | RP2040_PWM_CSR_B_INV
-#      endif
-#      ifdef CONFIG_RP2040_PWM0_PHASE_CORRECT
-                                  | RP2040_PWM_CSR_PH_CORRECT
-#      endif
-                                 ));
-#    else
-  ret = rp2040_pwmdev_initialize(0,
-                                 CONFIG_RP2040_PWM0A_GPIO,
-                                 (0
-#      ifdef CONFIG_RP2040_PWM0A_INVERT
-                                  | RP2040_PWM_CSR_A_INV
-#      endif
-#      ifdef CONFIG_RP2040_PWM0_PHASE_CORRECT
-                                  | RP2040_PWM_CSR_PH_CORRECT
-#      endif
-                                 ));
-#    endif
-  if (ret < 0)
-    {
-      _err("ERROR: Failed to initialize PWM0.\n");
-    }
-#  endif
-
-#  ifdef CONFIG_RP2040_PWM1
-#    if defined(CONFIG_PWM_NCHANNELS) && CONFIG_PWM_NCHANNELS == 2
-  ret = rp2040_pwmdev_initialize(1,
-                                 CONFIG_RP2040_PWM1A_GPIO,
-                                 CONFIG_RP2040_PWM1B_GPIO,
-                                 (0
-#      ifdef CONFIG_RP2040_PWM1A_INVERT
-                                  | RP2040_PWM_CSR_A_INV
-#      endif
-#      ifdef CONFIG_RP2040_PWM1B_INVERT
-                                  | RP2040_PWM_CSR_B_INV
-#      endif
-#      ifdef CONFIG_RP2040_PWM1_PHASE_CORRECT
-                                  | RP2040_PWM_CSR_PH_CORRECT
-#      endif
-                                 ));
-#    else
-  ret = rp2040_pwmdev_initialize(1,
-                                 CONFIG_RP2040_PWM1A_GPIO,
-                                 (0
-#      ifdef CONFIG_RP2040_PWM1A_INVERT
-                                  | RP2040_PWM_CSR_A_INV
-#      endif
-#      ifdef CONFIG_RP2040_PWM1_PHASE_CORRECT
-                                  | RP2040_PWM_CSR_PH_CORRECT
-#      endif
-                                 ));
-#    endif
-  if (ret < 0)
-    {
-      _err("ERROR: Failed to initialize PWM1.\n");
-    }
-#  endif
-
-#  ifdef CONFIG_RP2040_PWM2
-#    if defined(CONFIG_PWM_NCHANNELS) && CONFIG_PWM_NCHANNELS == 2
-  ret = rp2040_pwmdev_initialize(2,
-                                 CONFIG_RP2040_PWM2A_GPIO,
-                                 CONFIG_RP2040_PWM2B_GPIO,
-                                 (0
-#      ifdef CONFIG_RP2040_PWM2A_INVERT
-                                  | RP2040_PWM_CSR_A_INV
-#      endif
-#      ifdef CONFIG_RP2040_PWM2B_INVERT
-                                  | RP2040_PWM_CSR_B_INV
-#      endif
-#      ifdef CONFIG_RP2040_PWM2_PHASE_CORRECT
-                                  | RP2040_PWM_CSR_PH_CORRECT
-#      endif
-                                 ));
-#    else
-  ret = rp2040_pwmdev_initialize(2,
-                                 CONFIG_RP2040_PWM2A_GPIO,
-                                 (0
-#      ifdef CONFIG_RP2040_PWM2A_INVERT
-                                  | RP2040_PWM_CSR_A_INV
-#      endif
-#      ifdef CONFIG_RP2040_PWM2_PHASE_CORRECT
-                                  | RP2040_PWM_CSR_PH_CORRECT
-#      endif
-                                 ));
-#    endif
-  if (ret < 0)
-    {
-      _err("ERROR: Failed to initialize PWM2.\n");
-    }
-#  endif
-
-#  ifdef CONFIG_RP2040_PWM3
-#    if defined(CONFIG_PWM_NCHANNELS) && CONFIG_PWM_NCHANNELS == 2
-  ret = rp2040_pwmdev_initialize(3,
-                                 CONFIG_RP2040_PWM3A_GPIO,
-                                 CONFIG_RP2040_PWM3B_GPIO,
-                                 (0
-#      ifdef CONFIG_RP2040_PWM3A_INVERT
-                                  | RP2040_PWM_CSR_A_INV
-#      endif
-#      ifdef CONFIG_RP2040_PWM3B_INVERT
-                                  | RP2040_PWM_CSR_B_INV
-#      endif
-#      ifdef CONFIG_RP2040_PWM3_PHASE_CORRECT
-                                  | RP2040_PWM_CSR_PH_CORRECT
-#      endif
-                                 ));
-#    else
-  ret = rp2040_pwmdev_initialize(3,
-                                 CONFIG_RP2040_PWM3A_GPIO,
-                                 (0
-#      ifdef CONFIG_RP2040_PWM3A_INVERT
-                                  | RP2040_PWM_CSR_A_INV
-#      endif
-#      ifdef CONFIG_RP2040_PWM3_PHASE_CORRECT
-                                  | RP2040_PWM_CSR_PH_CORRECT
-#      endif
-                                 ));
-#    endif
-  if (ret < 0)
-    {
-      _err("ERROR: Failed to initialize PWM3.\n");
-    }
-#  endif
-
-#  ifdef CONFIG_RP2040_PWM4
-#    if defined(CONFIG_PWM_NCHANNELS) && CONFIG_PWM_NCHANNELS == 2
-  ret = rp2040_pwmdev_initialize(4,
-                                 CONFIG_RP2040_PWM4A_GPIO,
-                                 CONFIG_RP2040_PWM4B_GPIO,
-                                 (0
-#      ifdef CONFIG_RP2040_PWM4A_INVERT
-                                  | RP2040_PWM_CSR_A_INV
-#      endif
-#      ifdef CONFIG_RP2040_PWM4B_INVERT
-                                  | RP2040_PWM_CSR_B_INV
-#      endif
-#      ifdef CONFIG_RP2040_PWM4_PHASE_CORRECT
-                                  | RP2040_PWM_CSR_PH_CORRECT
-#      endif
-                                 ));
-#    else
-  ret = rp2040_pwmdev_initialize(4,
-                                 CONFIG_RP2040_PWM4A_GPIO,
-                                 (0
-#      ifdef CONFIG_RP2040_PWM4A_INVERT
-                                  | RP2040_PWM_CSR_A_INV
-#      endif
-#      ifdef CONFIG_RP2040_PWM4_PHASE_CORRECT
-                                  | RP2040_PWM_CSR_PH_CORRECT
-#      endif
-                                 ));
-#    endif
-  if (ret < 0)
-    {
-      _err("ERROR: Failed to initialize PWM4.\n");
-    }
-#  endif
-
-#  ifdef CONFIG_RP2040_PWM5
-#    if defined(CONFIG_PWM_NCHANNELS) && CONFIG_PWM_NCHANNELS == 2
-  ret = rp2040_pwmdev_initialize(5,
-                                 CONFIG_RP2040_PWM5A_GPIO,
-                                 CONFIG_RP2040_PWM5B_GPIO,
-                                 (0
-#      ifdef CONFIG_RP2040_PWM5A_INVERT
-                                  | RP2040_PWM_CSR_A_INV
-#      endif
-#      ifdef CONFIG_RP2040_PWM5B_INVERT
-                                  | RP2040_PWM_CSR_B_INV
-#      endif
-#      ifdef CONFIG_RP2040_PWM5_PHASE_CORRECT
-                                  | RP2040_PWM_CSR_PH_CORRECT
-#      endif
-                                 ));
-#  else
-  ret = rp2040_pwmdev_initialize(5,
-                                 CONFIG_RP2040_PWM5A_GPIO,
-                                 (0
-#      ifdef CONFIG_RP2040_PWM5A_INVERT
-                                  | RP2040_PWM_CSR_A_INV
-#      endif
-#      ifdef CONFIG_RP2040_PWM5_PHASE_CORRECT
-                                  | RP2040_PWM_CSR_PH_CORRECT
-#      endif
-                                 ));
-#  endif
-  if (ret < 0)
-    {
-      _err("ERROR: Failed to initialize PWM5.\n");
-    }
-#  endif
-
-#  ifdef CONFIG_RP2040_PWM6
-#    if defined(CONFIG_PWM_NCHANNELS) && CONFIG_PWM_NCHANNELS == 2
-  ret = rp2040_pwmdev_initialize(6,
-                                 CONFIG_RP2040_PWM6A_GPIO,
-                                 CONFIG_RP2040_PWM6B_GPIO,
-                                 (0
-#      ifdef CONFIG_RP2040_PWM6A_INVERT
-                                  | RP2040_PWM_CSR_A_INV
-#      endif
-#      ifdef CONFIG_RP2040_PWM6B_INVERT
-                                  | RP2040_PWM_CSR_B_INV
-#      endif
-#      ifdef CONFIG_RP2040_PWM6_PHASE_CORRECT
-                                  | RP2040_PWM_CSR_PH_CORRECT
-#      endif
-                                 ));
-#    else
-  ret = rp2040_pwmdev_initialize(6,
-                                 CONFIG_RP2040_PWM6A_GPIO,
-                                 (0
-#      ifdef CONFIG_RP2040_PWM6A_INVERT
-                                  | RP2040_PWM_CSR_A_INV
-#      endif
-#      ifdef CONFIG_RP2040_PWM6_PHASE_CORRECT
-                                  | RP2040_PWM_CSR_PH_CORRECT
-#      endif
-                                 ));
-#    endif
-  if (ret < 0)
-    {
-      _err("ERROR: Failed to initialize PWM6.\n");
-    }
-#  endif
-
-#  ifdef CONFIG_RP2040_PWM7
-#    if defined(CONFIG_PWM_NCHANNELS) && CONFIG_PWM_NCHANNELS == 2
-  ret = rp2040_pwmdev_initialize(7,
-                                 CONFIG_RP2040_PWM7A_GPIO,
-                                 CONFIG_RP2040_PWM7B_GPIO,
-                                 (0
-#      ifdef CONFIG_RP2040_PWM7A_INVERT
-                                  | RP2040_PWM_CSR_A_INV
-#      endif
-#      ifdef CONFIG_RP2040_PWM7B_INVERT
-                                  | RP2040_PWM_CSR_B_INV
-#      endif
-#      ifdef CONFIG_RP2040_PWM7_PHASE_CORRECT
-                                  | RP2040_PWM_CSR_PH_CORRECT
-#      endif
-                                 ));
-#    else
-  ret = rp2040_pwmdev_initialize(7,
-                                 CONFIG_RP2040_PWM7A_GPIO,
-                                 (0
-#      ifdef CONFIG_RP2040_PWM7A_INVERT
-                                  | RP2040_PWM_CSR_A_INV
-#      endif
-#      ifdef CONFIG_RP2040_PWM7_PHASE_CORRECT
-                                  | RP2040_PWM_CSR_PH_CORRECT
-#      endif
-                                 ));
-#    endif
-  if (ret < 0)
-    {
-      _err("ERROR: Failed to initialize PWM7.\n");
-    }
-#  endif
-#endif
-
-#ifdef CONFIG_RP2040_SPISD
-  /* Mount the SPI-based MMC/SD block driver */
-
-  ret = board_spisd_initialize(0, CONFIG_RP2040_SPISD_SPI_CH);
-  if (ret < 0)
-    {
-      _err("ERROR: Failed to initialize SPI device to MMC/SD: %d\n",
-           ret);
-    }
-#endif
-
-#ifdef CONFIG_FS_PROCFS
-  /* Mount the procfs file system */
-
-  ret = nx_mount(NULL, "/proc", "procfs", 0, NULL);
-  if (ret < 0)
-    {
-      serr("ERROR: Failed to mount procfs at %s: %d\n", "/proc", ret);
-    }
-#endif
-
-#ifdef CONFIG_SENSORS_BMP180
-  /* Try to register BMP180 device in I2C0 */
-
-  ret = board_bmp180_initialize(0);
-  if (ret < 0)
-    {
-      syslog(LOG_ERR, "Failed to initialize BMP180 driver: %d\n", ret);
-    }
-#endif
-
-#ifdef CONFIG_SENSORS_INA219
-  /* Configure and initialize the INA219 sensor in I2C0 */
-
-  ret = board_ina219_initialize(0);
-  if (ret < 0)
-    {
-      syslog(LOG_ERR, "ERROR: rp2040_ina219_initialize() failed: %d\n", ret);
-    }
-#endif
+#ifdef CONFIG_ARCH_BOARD_COMMON
 
-#ifdef CONFIG_VIDEO_FB
-  ret = fb_register(0, 0);
-  if (ret < 0)
-    {
-      _err("ERROR: Failed to initialize Frame Buffer Driver.\n");
-    }
-#elif defined(CONFIG_LCD)
-  ret = board_lcd_initialize();
+  int ret = rp2040_common_bringup();
   if (ret < 0)
     {
-      syslog(LOG_ERR, "ERROR: Failed to initialize LCD.\n");
-    }
-#endif
-
-#ifdef CONFIG_LCD_DEV
-  ret = lcddev_register(0);
-  if (ret < 0)
-    {
-      syslog(LOG_ERR, "ERROR: lcddev_register() failed: %d\n", ret);
-    }
-#endif
-
-#ifdef CONFIG_LCD_BACKPACK
-  /* slcd:0, i2c:0, rows=2, cols=16 */
-
-  ret = board_lcd_backpack_init(0, 0, 2, 16);
-  if (ret < 0)
-    {
-      syslog(LOG_ERR, "Failed to initialize PCF8574 LCD, error %d\n", ret);
       return ret;
     }
-#endif
-
-#ifdef CONFIG_RP2040_I2S
-  ret = board_i2sdev_initialize(0);
-  if (ret < 0)
-    {
-      _err("ERROR: Failed to initialize I2S.\n");
-    }
-#endif
-
-#ifdef CONFIG_DEV_GPIO
-  ret = rp2040_dev_gpio_init();
-  if (ret < 0)
-    {
-      syslog(LOG_ERR, "Failed to initialize GPIO Driver: %d\n", ret);
-      return ret;
-    }
-#endif
-
-  /* Initialize ADC */
-
-#if defined(CONFIG_ADC) && defined(CONFIG_RP2040_ADC)
-
-# ifdef CONFIG_RPC2040_ADC_CHANNEL0
-#   define ADC_0 true
-# else
-#   define ADC_0 false
-# endif
-
-# ifdef CONFIG_RPC2040_ADC_CHANNEL1
-#   define ADC_1 true
-# else
-#   define ADC_1 false
-# endif
-
-# ifdef CONFIG_RPC2040_ADC_CHANNEL2
-#   define ADC_2 true
-# else
-#   define ADC_2 false
-# endif
-
-# ifdef CONFIG_RPC2040_ADC_CHANNEL3
-#   define ADC_3 true
-# else
-#   define ADC_3 false
-# endif
-
-# ifdef CONFIG_RPC2040_ADC_TEMPERATURE
-#   define ADC_TEMP true
-# else
-#   define ADC_TEMP false
-# endif
-
-  ret = rp2040_adc_setup("/dev/adc0", ADC_0, ADC_1, ADC_2, ADC_3, ADC_TEMP);
-  if (ret != OK)
-    {
-      syslog(LOG_ERR, "Failed to initialize ADC Driver: %d\n", ret);
-      return ret;
-    }
-
-#endif /* defined(CONFIG_ADC) && defined(CONFIG_RP2040_ADC) */
 
-  /* Initialize board neo-pixel */
+#endif /* CONFIG_ARCH_BOARD_COMMON */
 
-#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
+  /* --- Place any board specific bringup code here --- */
 
-  return ret;
+  return OK;
 }
diff --git a/boards/boardctl.c b/boards/boardctl.c
index d01cf0467a..0027cdbb2b 100644
--- a/boards/boardctl.c
+++ b/boards/boardctl.c
@@ -383,7 +383,7 @@ int boardctl(unsigned int cmd, uintptr_t arg)
 
 #ifdef CONFIG_PM
       /* CMD:           BOARDIOC_PM_CONTROL
-       * DESCRIPTION:   anage power state transition and query
+       * DESCRIPTION:   manage power state transition and query
        * ARG:           A pointer to an instance of struct boardioc_pm_ctrl_s
        * CONFIGURATION: CONFIG_PM
        * DEPENDENCIES:  None
diff --git a/drivers/wireless/ieee80211/bcm43xxx/bcmf_cdc.c b/drivers/wireless/ieee80211/bcm43xxx/bcmf_cdc.c
index e0bb291785..1c2fc7fb2c 100644
--- a/drivers/wireless/ieee80211/bcm43xxx/bcmf_cdc.c
+++ b/drivers/wireless/ieee80211/bcm43xxx/bcmf_cdc.c
@@ -48,7 +48,7 @@
 #define BCMF_CONTROL_INTERFACE_SHIFT 12
 #define BCMF_CONTROL_REQID_SHIFT     16
 
-#define BCMF_CONTROL_TIMEOUT_MS 2000
+#define BCMF_CONTROL_TIMEOUT_MS 10000
 
 /****************************************************************************
  * Private Types
diff --git a/drivers/wireless/ieee80211/bcm43xxx/bcmf_gspi.c b/drivers/wireless/ieee80211/bcm43xxx/bcmf_gspi.c
index 8e64025874..db3f516878 100644
--- a/drivers/wireless/ieee80211/bcm43xxx/bcmf_gspi.c
+++ b/drivers/wireless/ieee80211/bcm43xxx/bcmf_gspi.c
@@ -61,7 +61,7 @@
 #define BCMF_GSPI_LOWPOWER_TIMEOUT_TICK SEC2TICK(2)
 
 #ifdef CONFIG_IEEE80211_INFINEON_CYW43439
-extern const struct bcmf_chip_data cyw43439_config_data;
+extern const struct bcmf_chip_data g_cyw43439_config_data;
 #endif
 
 #define REV16(x) (((x & 0x000000ff) << 8)   \
@@ -634,7 +634,7 @@ static int bcmf_gspi_probe_chip(FAR bcmf_gspi_dev_t *gbus)
 #ifdef CONFIG_IEEE80211_INFINEON_CYW43439
       case SDIO_DEVICE_ID_INFINEON_CYW43439:
         wlinfo("cyw%d chip detected\n", chipid);
-        gbus->chip = (struct bcmf_chip_data *)&cyw43439_config_data;
+        gbus->chip = (struct bcmf_chip_data *)&g_cyw43439_config_data;
         break;
 #endif
 
diff --git a/drivers/wireless/ieee80211/bcm43xxx/cyw_chip_43439.c b/drivers/wireless/ieee80211/bcm43xxx/cyw_chip_43439.c
index 529b5c5f96..828e72e5bf 100644
--- a/drivers/wireless/ieee80211/bcm43xxx/cyw_chip_43439.c
+++ b/drivers/wireless/ieee80211/bcm43xxx/cyw_chip_43439.c
@@ -37,18 +37,23 @@
  * Public Data
  ****************************************************************************/
 
-extern const char cyw43439_nvram_image[];
-extern const unsigned int cyw43439_nvram_image_len;
+extern const uint8_t       g_cyw43439_nvram_image[];
+extern unsigned int        g_cyw43439_nvram_len;
 
 #ifndef CONFIG_IEEE80211_BROADCOM_FWFILES
-extern const uint8_t cyw43439_firmware_image[];
-extern const unsigned int cyw43439_firmware_len;
 
-extern const uint8_t cyw43439_clm_blob_image[];
-extern const unsigned int cyw43439_clm_blob_len;
+extern const uint8_t       g_cyw43439_firmware_image[];
+extern const unsigned int  g_cyw43439_firmware_len;
+
+#ifdef CONFIG_IEEE80211_BROADCOM_HAVE_CLM
+
+extern const uint8_t       g_cyw43439_clm_blob_image[];
+extern const unsigned int  g_cyw43439_clm_blob_len;
+
+#endif
 #endif
 
-const struct bcmf_chip_data cyw43439_config_data =
+const struct bcmf_chip_data g_cyw43439_config_data =
 {
   /* General chip stats */
 
@@ -70,18 +75,16 @@ const struct bcmf_chip_data cyw43439_config_data =
 
   /* Firmware images */
 
-  /* TODO find something smarter than using image_len references */
-
-  .nvram_image         = (FAR uint8_t *)cyw43439_nvram_image,
-  .nvram_image_size    = (FAR unsigned int *)&cyw43439_nvram_image_len,
+  .nvram_image         = (FAR uint8_t *)g_cyw43439_nvram_image,
+  .nvram_image_size    = (FAR unsigned int *)&g_cyw43439_nvram_len,
 
 #ifndef CONFIG_IEEE80211_BROADCOM_FWFILES
-  .firmware_image      = (FAR uint8_t *)cyw43439_firmware_image,
-  .firmware_image_size = (FAR unsigned int *)&cyw43439_firmware_len,
+  .firmware_image      = (FAR uint8_t *)g_cyw43439_firmware_image,
+  .firmware_image_size = (FAR unsigned int *)&g_cyw43439_firmware_len,
 
 #ifdef CONFIG_IEEE80211_BROADCOM_HAVE_CLM
-  .clm_blob_image      = (FAR uint8_t *)cyw43439_clm_blob_image,
-  .clm_blob_image_size = (FAR unsigned int *)&cyw43439_clm_blob_len
+  .clm_blob_image      = (FAR uint8_t *)g_cyw43439_clm_blob_image,
+  .clm_blob_image_size = (FAR unsigned int *)&g_cyw43439_clm_blob_len
 #endif
 #endif
 };