From bab9f63207f02a49b93600178904c343eb626271 Mon Sep 17 00:00:00 2001 From: Jonas Berg Date: Sat, 9 Aug 2025 11:53:38 +0200 Subject: [PATCH] Boards: Add Adafruit RP2040 Adalogger Add the Adafruit RP2040 Adalogger board. The board image is from the Adafruit product page. Signed-off-by: Jonas Berg --- .../adafruit/feather_adalogger_rp2040/Kconfig | 5 + .../Kconfig.adafruit_feather_adalogger_rp2040 | 5 + .../Kconfig.defconfig | 16 ++ ...ruit_feather_adalogger_rp2040-pinctrl.dtsi | 69 ++++++ .../adafruit_feather_adalogger_rp2040.dts | 230 ++++++++++++++++++ .../adafruit_feather_adalogger_rp2040.yaml | 22 ++ ...dafruit_feather_adalogger_rp2040_defconfig | 12 + .../feather_adalogger_rp2040/board.cmake | 6 + .../feather_adalogger_rp2040/board.yml | 6 + .../adafruit_feather_adalogger_rp2040.webp | Bin 0 -> 31784 bytes .../feather_adalogger_rp2040/doc/index.rst | 123 ++++++++++ .../feather_connector.dtsi | 39 +++ 12 files changed, 533 insertions(+) create mode 100644 boards/adafruit/feather_adalogger_rp2040/Kconfig create mode 100644 boards/adafruit/feather_adalogger_rp2040/Kconfig.adafruit_feather_adalogger_rp2040 create mode 100644 boards/adafruit/feather_adalogger_rp2040/Kconfig.defconfig create mode 100644 boards/adafruit/feather_adalogger_rp2040/adafruit_feather_adalogger_rp2040-pinctrl.dtsi create mode 100644 boards/adafruit/feather_adalogger_rp2040/adafruit_feather_adalogger_rp2040.dts create mode 100644 boards/adafruit/feather_adalogger_rp2040/adafruit_feather_adalogger_rp2040.yaml create mode 100644 boards/adafruit/feather_adalogger_rp2040/adafruit_feather_adalogger_rp2040_defconfig create mode 100644 boards/adafruit/feather_adalogger_rp2040/board.cmake create mode 100644 boards/adafruit/feather_adalogger_rp2040/board.yml create mode 100644 boards/adafruit/feather_adalogger_rp2040/doc/img/adafruit_feather_adalogger_rp2040.webp create mode 100644 boards/adafruit/feather_adalogger_rp2040/doc/index.rst create mode 100644 boards/adafruit/feather_adalogger_rp2040/feather_connector.dtsi diff --git a/boards/adafruit/feather_adalogger_rp2040/Kconfig b/boards/adafruit/feather_adalogger_rp2040/Kconfig new file mode 100644 index 0000000000000..df911cbc615db --- /dev/null +++ b/boards/adafruit/feather_adalogger_rp2040/Kconfig @@ -0,0 +1,5 @@ +# Copyright (c) 2022 Peter Johanson +# SPDX-License-Identifier: Apache-2.0 + +config BOARD_ADAFRUIT_FEATHER_ADALOGGER_RP2040 + select RP2_FLASH_W25Q080 diff --git a/boards/adafruit/feather_adalogger_rp2040/Kconfig.adafruit_feather_adalogger_rp2040 b/boards/adafruit/feather_adalogger_rp2040/Kconfig.adafruit_feather_adalogger_rp2040 new file mode 100644 index 0000000000000..54a1614be4ecc --- /dev/null +++ b/boards/adafruit/feather_adalogger_rp2040/Kconfig.adafruit_feather_adalogger_rp2040 @@ -0,0 +1,5 @@ +# Copyright (c) 2025 Jonas Berg +# SPDX-License-Identifier: Apache-2.0 + +config BOARD_ADAFRUIT_FEATHER_ADALOGGER_RP2040 + select SOC_RP2040 diff --git a/boards/adafruit/feather_adalogger_rp2040/Kconfig.defconfig b/boards/adafruit/feather_adalogger_rp2040/Kconfig.defconfig new file mode 100644 index 0000000000000..247fa36da6c8f --- /dev/null +++ b/boards/adafruit/feather_adalogger_rp2040/Kconfig.defconfig @@ -0,0 +1,16 @@ +# Copyright (c) 2022 Peter Johanson +# SPDX-License-Identifier: Apache-2.0 + +if BOARD_ADAFRUIT_FEATHER_ADALOGGER_RP2040 + +if I2C_DW + +config I2C_DW_CLOCK_SPEED + default 125 + +endif # I2C_DW + +config USB_SELF_POWERED + default n + +endif # BOARD_ADAFRUIT_FEATHER_ADALOGGER_RP2040 diff --git a/boards/adafruit/feather_adalogger_rp2040/adafruit_feather_adalogger_rp2040-pinctrl.dtsi b/boards/adafruit/feather_adalogger_rp2040/adafruit_feather_adalogger_rp2040-pinctrl.dtsi new file mode 100644 index 0000000000000..185234bef8d90 --- /dev/null +++ b/boards/adafruit/feather_adalogger_rp2040/adafruit_feather_adalogger_rp2040-pinctrl.dtsi @@ -0,0 +1,69 @@ +#include + +&pinctrl { + uart0_default: uart0_default { + group1 { + pinmux = ; + }; + + group2 { + pinmux = ; + input-enable; + }; + }; + + i2c1_default: i2c1_default { + group1 { + pinmux = ; + input-enable; + }; + + group2 { + pinmux = ; + input-enable; + }; + }; + + spi0_default: spi0_default { + group1 { + pinmux = ; + }; + + group2 { + pinmux = ; + input-enable; + }; + + group3 { + pinmux = ; + }; + }; + + spi1_default: spi1_default { + group1 { + pinmux = ; + }; + + group2 { + pinmux = ; + input-enable; + }; + + group3 { + pinmux = ; + }; + }; + + adc_default: adc_default { + group1 { + pinmux = , , , ; + input-enable; + }; + }; + + ws2812_pio0_default: ws2812_pio0_default { + ws2812 { + pinmux = ; + }; + }; +}; diff --git a/boards/adafruit/feather_adalogger_rp2040/adafruit_feather_adalogger_rp2040.dts b/boards/adafruit/feather_adalogger_rp2040/adafruit_feather_adalogger_rp2040.dts new file mode 100644 index 0000000000000..5c71e20eb3f61 --- /dev/null +++ b/boards/adafruit/feather_adalogger_rp2040/adafruit_feather_adalogger_rp2040.dts @@ -0,0 +1,230 @@ +/* + * Copyright (c) 2021 Yonatan Schachter + * Copyright (c) 2022 Peter Johanson + * Copyright (c) 2025 Jonas Berg + * + * SPDX-License-Identifier: Apache-2.0 + */ + +/dts-v1/; + +#include +#include +#include +#include +#include "adafruit_feather_adalogger_rp2040-pinctrl.dtsi" +#include "feather_connector.dtsi" + +/ { + model = "Adafruit Feather RP2040 Adalogger"; + compatible = "adafruit,feather_adalogger_rp2040"; + + chosen { + zephyr,sram = &sram0; + zephyr,flash = &flash0; + zephyr,flash-controller = &ssi; + zephyr,console = &uart0; + zephyr,shell-uart = &uart0; + zephyr,code-partition = &code_partition; + }; + + aliases { + watchdog0 = &wdt0; + led-strip = &ws2812; + led0 = &red_led; + sdhc0 = &sdhc0; + sw0 = &user_button; + }; + + zephyr,user { + io-channels = <&adc 0>, <&adc 1>, <&adc 2>, <&adc 3>; + }; + + gpio_keys { + compatible = "gpio-keys"; + + user_button: button { + label = "User"; + gpios = <&gpio0 7 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; + zephyr,code = ; + }; + }; + + leds: leds { + compatible = "gpio-leds"; + + red_led: red_led { + gpios = <&gpio0 13 GPIO_ACTIVE_HIGH>; + label = "Red LED"; + }; + }; + + stemma_connector: stemma_connector { + compatible = "stemma-qt-connector"; + #gpio-cells = <2>; + gpio-map-mask = <0xffffffff 0xffffffc0>; + gpio-map-pass-thru = <0 0x3f>; + gpio-map = <0 0 &gpio0 3 0>, /* SCL */ + <1 0 &gpio0 2 0>; /* SDA */ + }; +}; + +&flash0 { + reg = <0x10000000 DT_SIZE_M(8)>; + + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; + + /* Reserved memory for the second stage bootloader */ + second_stage_bootloader: partition@0 { + label = "second_stage_bootloader"; + reg = <0x00000000 0x100>; + read-only; + }; + + /* + * Usable flash. Starts at 0x100, after the bootloader. The partition + * size is 8 MB minus the 0x100 bytes taken by the bootloader. + */ + code_partition: partition@100 { + label = "code-partition"; + reg = <0x100 (DT_SIZE_M(8) - 0x100)>; + read-only; + }; + }; +}; + +&gpio0 { + status = "okay"; +}; + +&uart0 { + current-speed = <115200>; + status = "okay"; + pinctrl-0 = <&uart0_default>; + pinctrl-names = "default"; +}; + +zephyr_i2c: &i2c1 { + status = "okay"; + pinctrl-0 = <&i2c1_default>; + pinctrl-names = "default"; + clock-frequency = ; +}; + +&spi0 { + pinctrl-0 = <&spi0_default>; + pinctrl-names = "default"; + status = "okay"; + cs-gpios = <&gpio0 23 GPIO_ACTIVE_LOW>; + + sdhc0: sdhc@0 { + compatible = "zephyr,sdhc-spi-slot"; + reg = <0>; + status = "okay"; + spi-max-frequency = <12000000>; + + mmc { + compatible = "zephyr,sdmmc-disk"; + disk-name = "SD"; + status = "okay"; + }; + }; +}; + +&spi1 { + pinctrl-0 = <&spi1_default>; + pinctrl-names = "default"; + status = "okay"; +}; + +&timer { + status = "okay"; +}; + +&wdt0 { + status = "okay"; +}; + +&adc { + status = "okay"; + pinctrl-0 = <&adc_default>; + pinctrl-names = "default"; + #address-cells = <1>; + #size-cells = <0>; + + channel@0 { + reg = <0>; + zephyr,gain = "ADC_GAIN_1"; + zephyr,reference = "ADC_REF_INTERNAL"; + zephyr,acquisition-time = ; + zephyr,resolution = <12>; + }; + + channel@1 { + reg = <1>; + zephyr,gain = "ADC_GAIN_1"; + zephyr,reference = "ADC_REF_INTERNAL"; + zephyr,acquisition-time = ; + zephyr,resolution = <12>; + }; + + channel@2 { + reg = <2>; + zephyr,gain = "ADC_GAIN_1"; + zephyr,reference = "ADC_REF_INTERNAL"; + zephyr,acquisition-time = ; + zephyr,resolution = <12>; + }; + + channel@3 { + reg = <3>; + zephyr,gain = "ADC_GAIN_1"; + zephyr,reference = "ADC_REF_INTERNAL"; + zephyr,acquisition-time = ; + zephyr,resolution = <12>; + }; +}; + +&pio0 { + status = "okay"; + + pio-ws2812 { + compatible = "worldsemi,ws2812-rpi_pico-pio"; + status = "okay"; + pinctrl-0 = <&ws2812_pio0_default>; + pinctrl-names = "default"; + bit-waveform = <3>, <3>, <4>; + + /* RGB LED (Neopixel) */ + ws2812: ws2812 { + status = "okay"; + gpios = <&gpio0 17 GPIO_ACTIVE_HIGH>; + chain-length = <1>; + color-mapping = ; + reset-delay = <280>; + frequency = <800000>; + }; + }; +}; + +zephyr_udc0: &usbd { + status = "okay"; +}; + +&die_temp { + status = "okay"; +}; + +&vreg { + regulator-always-on; + regulator-allowed-modes = ; +}; + +&xosc { + startup-delay-multiplier = <64>; +}; diff --git a/boards/adafruit/feather_adalogger_rp2040/adafruit_feather_adalogger_rp2040.yaml b/boards/adafruit/feather_adalogger_rp2040/adafruit_feather_adalogger_rp2040.yaml new file mode 100644 index 0000000000000..22f85b8aa37ac --- /dev/null +++ b/boards/adafruit/feather_adalogger_rp2040/adafruit_feather_adalogger_rp2040.yaml @@ -0,0 +1,22 @@ +identifier: adafruit_feather_adalogger_rp2040 +name: Adafruit Feather RP2040 Adalogger +type: mcu +arch: arm +flash: 8192 +ram: 264 +toolchain: + - zephyr + - gnuarmemb +supported: + - adc + - clock + - counter + - dma + - flash + - gpio + - hwinfo + - i2c + - pwm + - spi + - uart + - watchdog diff --git a/boards/adafruit/feather_adalogger_rp2040/adafruit_feather_adalogger_rp2040_defconfig b/boards/adafruit/feather_adalogger_rp2040/adafruit_feather_adalogger_rp2040_defconfig new file mode 100644 index 0000000000000..dc89ae43cf192 --- /dev/null +++ b/boards/adafruit/feather_adalogger_rp2040/adafruit_feather_adalogger_rp2040_defconfig @@ -0,0 +1,12 @@ +# SPDX-License-Identifier: Apache-2.0 + +CONFIG_BUILD_OUTPUT_UF2=y +CONFIG_CLOCK_CONTROL=y +CONFIG_GPIO=y +CONFIG_PIO_RPI_PICO=y +CONFIG_RESET=y +CONFIG_USE_DT_CODE_PARTITION=y +CONFIG_SERIAL=y +CONFIG_UART_INTERRUPT_DRIVEN=y +CONFIG_CONSOLE=y +CONFIG_UART_CONSOLE=y diff --git a/boards/adafruit/feather_adalogger_rp2040/board.cmake b/boards/adafruit/feather_adalogger_rp2040/board.cmake new file mode 100644 index 0000000000000..affc290a869d6 --- /dev/null +++ b/boards/adafruit/feather_adalogger_rp2040/board.cmake @@ -0,0 +1,6 @@ +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2023 TOKITA Hiroshi + +board_runner_args(uf2 "--board-id=RPI-RP2") + +include(${ZEPHYR_BASE}/boards/common/uf2.board.cmake) diff --git a/boards/adafruit/feather_adalogger_rp2040/board.yml b/boards/adafruit/feather_adalogger_rp2040/board.yml new file mode 100644 index 0000000000000..c7e36db06ae60 --- /dev/null +++ b/boards/adafruit/feather_adalogger_rp2040/board.yml @@ -0,0 +1,6 @@ +board: + name: adafruit_feather_adalogger_rp2040 + full_name: Feather RP2040 Adalogger + vendor: adafruit + socs: + - name: rp2040 diff --git a/boards/adafruit/feather_adalogger_rp2040/doc/img/adafruit_feather_adalogger_rp2040.webp b/boards/adafruit/feather_adalogger_rp2040/doc/img/adafruit_feather_adalogger_rp2040.webp new file mode 100644 index 0000000000000000000000000000000000000000..ac5d0b5cb76343752ac2174ee8e896d8544b0b51 GIT binary patch literal 31784 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 literal 0 HcmV?d00001 diff --git a/boards/adafruit/feather_adalogger_rp2040/doc/index.rst b/boards/adafruit/feather_adalogger_rp2040/doc/index.rst new file mode 100644 index 0000000000000..83ca0047d866b --- /dev/null +++ b/boards/adafruit/feather_adalogger_rp2040/doc/index.rst @@ -0,0 +1,123 @@ +.. zephyr:board:: adafruit_feather_adalogger_rp2040 + +Overview +******** + +The `Adafruit Feather Adalogger RP2040`_ board is based on the RP2040 +microcontroller from Raspberry Pi Ltd. The board has a MicroSD-card socket +for storing data, and a Stemma QT connector for easy sensor usage. +It is compatible with the Feather board form factor, and has +a USB type C connector. + + +Hardware +******** + +- Microcontroller Raspberry Pi RP2040, with a max frequency of 133 MHz +- Dual ARM Cortex M0+ cores +- 264 kByte SRAM +- 8 Mbyte QSPI flash +- 17 GPIO pins +- 4 ADC pins +- I2C +- SPI +- UART +- USB type C connector +- Reset and boot buttons +- Red LED +- RGB LED (Neopixel) +- Stemma QT I2C connector +- MicroSD-card holder +- Built-in lithium ion battery charger + + +Default Zephyr Peripheral Mapping +================================= + +.. rst-class:: rst-columns + + - A0 ADC0 : GPIO26 + - A1 ADC1 : GPIO27 + - A2 ADC2 : GPIO28 + - A3 ADC3 : GPIO29 + - D24 : GPIO24 + - D25 : GPIO25 + - SCK SPI1 SCK : GPIO14 + - MO SPI1 MOSI : GPIO15 + - MI SPI1 MISO : GPIO8 + - RX UART0 : GPIO1 + - TX UART0 : GPIO0 + - D4 : GPIO4 + - SDA I2C1 : GPIO2 + - SCL I2C1 : GPIO3 + - D5 : GPIO5 + - D6 : GPIO6 + - D9 : GPIO9 + - D10 : GPIO10 + - D11 : GPIO11 + - D12 : GPIO12 + - D13 and red LED: GPIO13 + - RGB LED : GPIO17 + - Button BOOT : GPIO7 + - SD-card CARD_DET : GPIO16 + - SD-card SPI0 SD_CLK : GPIO18 + - SD-card SPI0 CMD/MOSI : GPIO19 + - SD-card SPI0 DAT0/MISO : GPIO20 + - SD-card DAT1 : GPIO21 + - SD-card DAT2 : GPIO22 + - SD-card DAT3/CS : GPIO23 + +See also `pinout`_ and `schematic`_. + + +Supported Features +================== + +.. zephyr:board-supported-hw:: + + +Programming and Debugging +************************* + +.. zephyr:board-supported-runners:: + +The Adafruit Feather RP2040 Adalogger board does not expose +the SWDIO and SWCLK pins, so programming must be done via the USB +port. Press and hold the BOOT button, and then press the RST button, +and the device will appear as a USB mass storage unit. +Building your application will result in a :file:`build/zephyr/zephyr.uf2` file. +Drag and drop the file to the USB mass storage unit, and the board +will be reprogrammed. + +For more details on programming RP2040-based boards, see +:ref:`rpi_pico_programming_and_debugging`. + + +Flashing +======== + +To run the :zephyr:code-sample:`blinky` sample: + +.. zephyr-app-commands:: + :zephyr-app: samples/basic/blinky/ + :board: adafruit_feather_adalogger_rp2040 + :goals: build flash + +Try also the :zephyr:code-sample:`led-strip`, :zephyr:code-sample:`input-dump`, +:zephyr:code-sample:`fs`, :zephyr:code-sample:`usb-cdc-acm-console` and +:zephyr:code-sample:`adc_dt` samples. + + +References +********** + +.. target-notes:: + +.. _Adafruit Feather Adalogger RP2040: + https://learn.adafruit.com/adafruit-feather-rp2040-adalogger + +.. _pinout: + https://learn.adafruit.com/adafruit-feather-rp2040-adalogger/pinouts + +.. _schematic: + https://learn.adafruit.com/adafruit-feather-rp2040-pico/downloads diff --git a/boards/adafruit/feather_adalogger_rp2040/feather_connector.dtsi b/boards/adafruit/feather_adalogger_rp2040/feather_connector.dtsi new file mode 100644 index 0000000000000..4fd512b4277c0 --- /dev/null +++ b/boards/adafruit/feather_adalogger_rp2040/feather_connector.dtsi @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2025 Jonas Berg + * + * SPDX-License-Identifier: Apache-2.0 + */ + +/ { + feather_header: connector { + compatible = "adafruit-feather-header"; + #gpio-cells = <2>; + gpio-map-mask = <0xffffffff 0xffffffc0>; + gpio-map-pass-thru = <0 0x3f>; + gpio-map = <0 0 &gpio0 26 0>, /* A0 */ + <1 0 &gpio0 27 0>, /* A1 */ + <2 0 &gpio0 28 0>, /* A2 */ + <3 0 &gpio0 29 0>, /* A3 */ + <4 0 &gpio0 24 0>, /* D24 */ + <5 0 &gpio0 25 0>, /* D25 */ + <6 0 &gpio0 14 0>, /* SCK */ + <7 0 &gpio0 15 0>, /* MOSI */ + <8 0 &gpio0 8 0>, /* MISO */ + <9 0 &gpio0 1 0>, /* RX */ + <10 0 &gpio0 0 0>, /* TX */ + <11 0 &gpio0 4 0>, /* D4 */ + <12 0 &gpio0 2 0>, /* SDA */ + <13 0 &gpio0 3 0>, /* SCL */ + <14 0 &gpio0 5 0>, /* D5 */ + <15 0 &gpio0 6 0>, /* D6 */ + <16 0 &gpio0 9 0>, /* D9 */ + <17 0 &gpio0 10 0>, /* D10 */ + <18 0 &gpio0 11 0>, /* D11 */ + <19 0 &gpio0 12 0>, /* D12 */ + <20 0 &gpio0 13 0>; /* D13 */ + }; +}; + +feather_serial: &uart0 {}; +feather_i2c: &i2c1 {}; +feather_spi: &spi1 {};