From e8963196bb0438c046840463816319f369a7971a Mon Sep 17 00:00:00 2001 From: Frank Bintakies Date: Thu, 7 Nov 2024 12:15:00 +0100 Subject: [PATCH 1/8] boards: pico_spe: add vendor add of vendor Signed-off-by: Frank Bintakies --- boards/kws/index.rst | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 boards/kws/index.rst diff --git a/boards/kws/index.rst b/boards/kws/index.rst new file mode 100644 index 0000000000000..0f8fc102b9457 --- /dev/null +++ b/boards/kws/index.rst @@ -0,0 +1,10 @@ +.. _boards-kws: + +KWS Computersysteme Gmbh +######################## + +.. toctree:: + :maxdepth: 1 + :glob: + + **/* From a5d0f02bf1bc549e3bee3f9eaec31eb20667e668 Mon Sep 17 00:00:00 2001 From: Frank Bintakies Date: Wed, 6 Nov 2024 15:41:46 +0100 Subject: [PATCH 2/8] boards: pico_spe: add support Add variant of rp2040 with SinglePairEthernet Signed-off-by: Frank Bintakies --- boards/kws/pico_spe/Kconfig | 5 + boards/kws/pico_spe/Kconfig.defconfig | 34 +++ boards/kws/pico_spe/Kconfig.pico_spe | 5 + boards/kws/pico_spe/board.cmake | 36 +++ boards/kws/pico_spe/board.yml | 6 + boards/kws/pico_spe/doc/img/pico_spe.webp | Bin 0 -> 24890 bytes boards/kws/pico_spe/doc/index.rst | 285 ++++++++++++++++++ boards/kws/pico_spe/pico_spe-pinctrl.dtsi | 70 +++++ boards/kws/pico_spe/pico_spe.dts | 218 ++++++++++++++ boards/kws/pico_spe/pico_spe.yaml | 23 ++ boards/kws/pico_spe/pico_spe_defconfig | 11 + boards/kws/pico_spe/support/openocd.cfg | 11 + dts/bindings/vendor-prefixes.txt | 1 + .../adc/adc_api/boards/pico_spe.overlay | 32 ++ 14 files changed, 737 insertions(+) create mode 100644 boards/kws/pico_spe/Kconfig create mode 100644 boards/kws/pico_spe/Kconfig.defconfig create mode 100644 boards/kws/pico_spe/Kconfig.pico_spe create mode 100644 boards/kws/pico_spe/board.cmake create mode 100644 boards/kws/pico_spe/board.yml create mode 100644 boards/kws/pico_spe/doc/img/pico_spe.webp create mode 100644 boards/kws/pico_spe/doc/index.rst create mode 100644 boards/kws/pico_spe/pico_spe-pinctrl.dtsi create mode 100644 boards/kws/pico_spe/pico_spe.dts create mode 100644 boards/kws/pico_spe/pico_spe.yaml create mode 100644 boards/kws/pico_spe/pico_spe_defconfig create mode 100644 boards/kws/pico_spe/support/openocd.cfg create mode 100644 tests/drivers/adc/adc_api/boards/pico_spe.overlay diff --git a/boards/kws/pico_spe/Kconfig b/boards/kws/pico_spe/Kconfig new file mode 100644 index 0000000000000..e1a877543e64a --- /dev/null +++ b/boards/kws/pico_spe/Kconfig @@ -0,0 +1,5 @@ +# Copyright (c) 2024 KWS Computersysteme Gmbh +# SPDX-License-Identifier: Apache-2.0 + +config BOARD_PICO_SPE + select RP2_FLASH_W25Q080 diff --git a/boards/kws/pico_spe/Kconfig.defconfig b/boards/kws/pico_spe/Kconfig.defconfig new file mode 100644 index 0000000000000..4f5d509016333 --- /dev/null +++ b/boards/kws/pico_spe/Kconfig.defconfig @@ -0,0 +1,34 @@ +# Copyright (c) 2024 KWS Computersysteme Gmbh +# SPDX-License-Identifier: Apache-2.0 + +if BOARD_PICO_SPE + +if I2C_DW + +config I2C_DW_CLOCK_SPEED + default 125 + +endif # I2C_DW + +config USB_SELF_POWERED + default n + +config PHY_INIT_PRIORITY + default 82 + depends on NET_L2_ETHERNET && ETH_DRIVER + +if NETWORKING + +config NET_L2_ETHERNET + default y + +if ETH_LAN865X + +config NET_IF_MAX_IPV4_COUNT + default 2 + +endif # ETH_LAN865X + +endif # NETWORKING + +endif # BOARD_PICO_SPE diff --git a/boards/kws/pico_spe/Kconfig.pico_spe b/boards/kws/pico_spe/Kconfig.pico_spe new file mode 100644 index 0000000000000..1ecb279b3f66e --- /dev/null +++ b/boards/kws/pico_spe/Kconfig.pico_spe @@ -0,0 +1,5 @@ +# Copyright (c) 2024 KWS Computersysteme Gmbh +# SPDX-License-Identifier: Apache-2.0 + +config BOARD_PICO_SPE + select SOC_RP2040 diff --git a/boards/kws/pico_spe/board.cmake b/boards/kws/pico_spe/board.cmake new file mode 100644 index 0000000000000..5f9bbfd18125f --- /dev/null +++ b/boards/kws/pico_spe/board.cmake @@ -0,0 +1,36 @@ +# SPDX-License-Identifier: Apache-2.0 + +# This configuration allows selecting what debug adapter debugging Pico-SPE +# by a command-line argument. +# It is mainly intended to support both the 'picoprobe' and 'raspberrypi-swd' +# adapter described in "Getting started with Raspberry Pi Pico". +# And any other SWD debug adapter might also be usable with this configuration. + +# Set RPI_PICO_DEBUG_ADAPTER to select debug adapter by command-line arguments. +# e.g.) west build -b pico_spe -- -DRPI_PICO_DEBUG_ADAPTER=raspberrypi-swd +# The value is treated as a part of an interface file name that +# the debugger's configuration file. +# The value must be the 'stem' part of the name of one of the files +# in the openocd interface configuration file. +# The setting is store to CMakeCache.txt. +if ("${RPI_PICO_DEBUG_ADAPTER}" STREQUAL "") + set(RPI_PICO_DEBUG_ADAPTER "cmsis-dap") +endif() + +board_runner_args(openocd --cmd-pre-init "source [find interface/${RPI_PICO_DEBUG_ADAPTER}.cfg]") +board_runner_args(openocd --cmd-pre-init "transport select swd") +board_runner_args(openocd --cmd-pre-init "source [find target/rp2040.cfg]") + +# The adapter speed is expected to be set by interface configuration. +# But if not so, set 2000 to adapter speed. +board_runner_args(openocd --cmd-pre-init "set_adapter_speed_if_not_set 2000") + +board_runner_args(jlink "--device=RP2040_M0_0") +board_runner_args(uf2 "--board-id=RPI-RP2") +board_runner_args(pyocd "--target=rp2040") + +include(${ZEPHYR_BASE}/boards/common/openocd.board.cmake) +include(${ZEPHYR_BASE}/boards/common/jlink.board.cmake) +include(${ZEPHYR_BASE}/boards/common/uf2.board.cmake) +include(${ZEPHYR_BASE}/boards/common/blackmagicprobe.board.cmake) +include(${ZEPHYR_BASE}/boards/common/pyocd.board.cmake) \ No newline at end of file diff --git a/boards/kws/pico_spe/board.yml b/boards/kws/pico_spe/board.yml new file mode 100644 index 0000000000000..5d80b878c0b30 --- /dev/null +++ b/boards/kws/pico_spe/board.yml @@ -0,0 +1,6 @@ +board: + name: pico_spe + full_name: Pico-SPE + vendor: kws + socs: + - name: rp2040 diff --git a/boards/kws/pico_spe/doc/img/pico_spe.webp b/boards/kws/pico_spe/doc/img/pico_spe.webp new file mode 100644 index 0000000000000000000000000000000000000000..00e143500b49cb5e0710f780f6416ab5275b5276 GIT binary patch literal 24890 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 P000000000000000flM%1 literal 0 HcmV?d00001 diff --git a/boards/kws/pico_spe/doc/index.rst b/boards/kws/pico_spe/doc/index.rst new file mode 100644 index 0000000000000..f542cafa35e74 --- /dev/null +++ b/boards/kws/pico_spe/doc/index.rst @@ -0,0 +1,285 @@ +.. zephyr:board:: pico_spe + +Overview +******** + +The Pico-SPE is a small, low-cost, versatile boards from +KWS Computersysteme Gmbh. They are equipped with an RP2040 SoC, an on-board LED, +a USB connector, an SWD interface. The Pico-SPE additionally contains an +Microchip LAN8651 10Base-T1S module. The USB bootloader allows the +ability to flash without any adapter, in a drag-and-drop manner. +It is also possible to flash and debug the boards with their SWD interface, +using an external adapter. + +Hardware +******** +- Dual core Arm Cortex-M0+ processor running up to 133MHz +- 264KB on-chip SRAM +- 16MB on-board QSPI flash with XIP capabilities +- 16 GPIO pins +- 3 Analog inputs +- 2 UART peripherals +- 2 I2C controllers +- 16 PWM channels +- USB 1.1 controller (host/device) +- 8 Programmable I/O (PIO) for custom peripherals +- On-board LED +- 1 Watchdog timer peripheral +- Microchip LAN8651 10Base-T1S + +Supported Features +================== + +The ``pico_spe`` board target supports the following +hardware features: + +.. list-table:: + :header-rows: 1 + + * - Peripheral + - Kconfig option + - Devicetree compatible + * - NVIC + - N/A + - :dtcompatible:`arm,v6m-nvic` + * - UART + - :kconfig:option:`CONFIG_SERIAL` + - :dtcompatible:`raspberrypi,pico-uart` + * - GPIO + - :kconfig:option:`CONFIG_GPIO` + - :dtcompatible:`raspberrypi,pico-gpio` + * - ADC + - :kconfig:option:`CONFIG_ADC` + - :dtcompatible:`raspberrypi,pico-adc` + * - I2C + - :kconfig:option:`CONFIG_I2C` + - :dtcompatible:`snps,designware-i2c` + * - SPI + - :kconfig:option:`CONFIG_SPI` + - :dtcompatible:`raspberrypi,pico-spi` + * - USB Device + - :kconfig:option:`CONFIG_USB_DEVICE_STACK` + - :dtcompatible:`raspberrypi,pico-usbd` + * - HWINFO + - :kconfig:option:`CONFIG_HWINFO` + - N/A + * - Watchdog Timer (WDT) + - :kconfig:option:`CONFIG_WATCHDOG` + - :dtcompatible:`raspberrypi,pico-watchdog` + * - PWM + - :kconfig:option:`CONFIG_PWM` + - :dtcompatible:`raspberrypi,pico-pwm` + * - Flash + - :kconfig:option:`CONFIG_FLASH` + - :dtcompatible:`raspberrypi,pico-flash` + * - Clock controller + - :kconfig:option:`CONFIG_CLOCK_CONTROL` + - :dtcompatible:`raspberrypi,pico-clock-controller` + * - UART (PIO) + - :kconfig:option:`CONFIG_SERIAL` + - :dtcompatible:`raspberrypi,pico-uart-pio` + * - SPI (PIO) + - :kconfig:option:`CONFIG_SPI` + - :dtcompatible:`raspberrypi,pico-spi-pio` + * - LAN8651 Single Pair Ethernet + - :kconfig:option:`CONFIG_NETWORKING` + - :dtcompatible:`microchip,lan865x` + +Pin Mapping +=========== + +The peripherals of the RP2040 SoC can be routed to various pins on the board. +The configuration of these routes can be modified through DTS. Please refer to +the datasheet to see the possible routings for each peripheral. + +External pin mapping on the Pico-SPE is identical to the Pico, but note that internal +RP2040 GPIO lines 10, 11, 12, 13, 20, 21 are routed to the Microchip LAN8651 on the +Pico-SPE. + +Default Zephyr Peripheral Mapping: +---------------------------------- + +.. rst-class:: rst-columns + +- UART0_TX : P0 +- UART0_RX : P1 +- I2C0_SDA : P4 +- I2C0_SCL : P5 +- I2C1_SDA : P6 +- I2C1_SCL : P7 +- ADC_CH0 : P26 +- ADC_CH1 : P27 +- ADC_CH2 : P28 + +Programmable I/O (PIO) +********************** +The RP2040 SoC comes with two PIO periherals. These are two simple +co-processors that are designed for I/O operations. The PIOs run +a custom instruction set, generated from a custom assembly language. +PIO programs are assembled using :command:`pioasm`, a tool provided by Raspberry Pi. + +Zephyr does not (currently) assemble PIO programs. Rather, they should be +manually assembled and embedded in source code. An example of how this is done +can be found at :zephyr_file:`drivers/serial/uart_rpi_pico_pio.c`. + +Sample: SPI via PIO +==================== + +The :zephyr:code-sample:`bme280` sample includes a +demonstration of using the PIO SPI driver to communicate with an +environmental sensor. The PIO SPI driver supports using any +combination of GPIO pins for an SPI bus, as well as allowing up to +four independent SPI buses on a single board (using the two SPI +devices as well as both PIO devices). + +Programming and Debugging +************************* + +Flashing +======== + +Using SEGGER JLink +------------------ + +You can Flash the pico_spe with a SEGGER JLink debug probe as described in +:ref:`Building, Flashing and Debugging `. + +Here is an example of building and flashing the :zephyr:code-sample:`blinky` application. + +.. zephyr-app-commands:: + :zephyr-app: samples/basic/blinky + :board: pico_spe + :goals: build + +.. code-block:: bash + + west flash --runner jlink + +Using OpenOCD +------------- + +To use CMSIS-DAP, you must configure **udev**. + +Create a file in /etc/udev.rules.d with any name, and write the line below. + +.. code-block:: bash + + ATTRS{idVendor}=="2e8a", ATTRS{idProduct}=="000c", MODE="660", GROUP="plugdev", TAG+="uaccess" + +This example is valid for the case that the user joins to ``plugdev`` groups. + +The Pico-SPE has an SWD interface that can be used to program +and debug the on board RP2040. This interface can be utilized by OpenOCD. +To use it with the RP2040, OpenOCD version 0.12.0 or later is needed. + +If you are using a Debian based system (including RaspberryPi OS, Ubuntu. and more), +using the `pico_setup.sh`_ script is a convenient way to set up the forked version of OpenOCD. + +Depending on the interface used (such as JLink), you might need to +checkout to a branch that supports this interface, before proceeding. +Build and install OpenOCD as described in the README. + +Here is an example of building and flashing the :zephyr:code-sample:`blinky` application. + +.. zephyr-app-commands:: + :zephyr-app: samples/basic/blinky + :board: pico_spe + :goals: build flash + :gen-args: -DOPENOCD=/usr/local/bin/openocd -DOPENOCD_DEFAULT_PATH=/usr/local/share/openocd/scripts -DRPI_PICO_DEBUG_ADAPTER=cmsis-dap + +Set the environment variables **OPENOCD** to :file:`/usr/local/bin/openocd` +and **OPENOCD_DEFAULT_PATH** to :file:`/usr/local/share/openocd/scripts`. This should work +with the OpenOCD that was installed with the default configuration. +This configuration also works with an environment that is set up by the `pico_setup.sh`_ script. + +**RPI_PICO_DEBUG_ADAPTER** specifies what debug adapter is used for debugging. + +If **RPI_PICO_DEBUG_ADAPTER** was not assigned, ``cmsis-dap`` is used by default. +The other supported adapters are ``raspberrypi-swd``, ``jlink`` and ``blackmagicprobe``. +How to connect ``cmsis-dap`` and ``raspberrypi-swd`` is described in `Getting Started with Pico-SPE`_. +Any other SWD debug adapter maybe also work with this configuration. + +The value of **RPI_PICO_DEBUG_ADAPTER** is cached, so it can be omitted from +``west flash`` and ``west debug`` if it was previously set while running +``west build``. + +**RPI_PICO_DEBUG_ADAPTER** is used in an argument to OpenOCD as ``"source [find interface/${RPI_PICO_DEBUG_ADAPTER}.cfg]"``. +Thus, **RPI_PICO_DEBUG_ADAPTER** needs to be assigned the file name of the debug adapter. + +You can also flash the board with the following +command that directly calls OpenOCD (assuming a SEGGER JLink adapter is used): + +.. code-block:: console + + $ openocd -f interface/jlink.cfg -c 'transport select swd' -f target/rp2040.cfg -c "adapter speed 2000" -c 'targets rp2040.core0' -c 'program path/to/zephyr.elf verify reset exit' + +Using UF2 +--------- + +If you don't have an SWD adapter, you can flash the Pico-SPE with +a UF2 file. By default, building an app for this board will generate a +:file:`build/zephyr/zephyr.uf2` file. If the Pico is powered on with the ``BOOTSEL`` +button pressed, it will appear on the host as a mass storage device. The +UF2 file should be drag-and-dropped to the device, which will flash the Pico. + +Debugging +========= + +The SWD interface can also be used to debug the board. To achieve this, you can +either use SEGGER JLink or OpenOCD. + +Using SEGGER JLink +------------------ + +Use a SEGGER JLink debug probe and follow the instruction in +:ref:`Building, Flashing and Debugging`. + + +Using OpenOCD +------------- + +Install OpenOCD as described for flashing the board. + +Here is an example for debugging the :zephyr:code-sample:`blinky` application. + +.. zephyr-app-commands:: + :zephyr-app: samples/basic/blinky + :board: pico_spe + :maybe-skip-config: + :goals: debug + :gen-args: -DOPENOCD=/usr/local/bin/openocd -DOPENOCD_DEFAULT_PATH=/usr/local/share/openocd/scripts -DRPI_PICO_DEBUG_ADAPTER=raspberrypi-swd + +As with flashing, you can specify the debug adapter by specifying **RPI_PICO_DEBUG_ADAPTER** +at ``west build`` time. No needs to specify it at ``west debug`` time. + +You can also debug with OpenOCD and gdb launching from command-line. +Run the following command: + +.. code-block:: console + + $ openocd -f interface/jlink.cfg -c 'transport select swd' -f target/rp2040.cfg -c "adapter speed 2000" -c 'targets rp2040.core0' + +On another terminal, run: + +.. code-block:: console + + $ gdb-multiarch + +Inside gdb, run: + +.. code-block:: console + + (gdb) tar ext :3333 + (gdb) file path/to/zephyr.elf + +You can then start debugging the board. + +.. target-notes:: +.. _pico_setup.sh: + https://raw.githubusercontent.com/raspberrypi/pico-setup/master/pico_setup.sh + +.. _Getting Started with Pico-SPE: + https://kws-computer.de/go/pico-spe-getting-started + +.. _Pico-SPE Documentation: + https://kws-computer.de/go/pico-spe-datasheet diff --git a/boards/kws/pico_spe/pico_spe-pinctrl.dtsi b/boards/kws/pico_spe/pico_spe-pinctrl.dtsi new file mode 100644 index 0000000000000..f07ab21b0d70b --- /dev/null +++ b/boards/kws/pico_spe/pico_spe-pinctrl.dtsi @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2024 KWS Computersysteme Gmbh + * SPDX-License-Identifier: Apache-2.0 + */ + +#include + +&pinctrl { + uart0_default: uart0_default { + group1 { + pinmux = ; + }; + group2 { + pinmux = ; + input-enable; + }; + }; + + i2c0_default: i2c0_default { + group1 { + pinmux = , ; + input-enable; + input-schmitt-enable; + }; + }; + + i2c1_default: i2c1_default { + group1 { + pinmux = , ; + input-enable; + input-schmitt-enable; + }; + }; + + spi0_default: spi0_default { + group1 { + pinmux = , , ; + }; + group2 { + pinmux = ; + input-enable; + }; + }; + + spi1_default: spi1_default { + group1 { + pinmux = , , ; + }; + group2 { + pinmux = ; + input-enable; + }; + }; + + pwm_ch4b_default: pwm_ch4b_default { + group1 { + pinmux = ; + }; + }; + + adc_default: adc_default { + group1 { + pinmux = , , , ; + input-enable; + }; + }; + + clocks_default: clocks_default { + }; +}; diff --git a/boards/kws/pico_spe/pico_spe.dts b/boards/kws/pico_spe/pico_spe.dts new file mode 100644 index 0000000000000..972f1e0cea43f --- /dev/null +++ b/boards/kws/pico_spe/pico_spe.dts @@ -0,0 +1,218 @@ +/* + * Copyright (c) 2024 KWS Computersysteme Gmbh + * + * SPDX-License-Identifier: Apache-2.0 + */ + +/dts-v1/; + +#include + +#include +#include "pico_spe-pinctrl.dtsi" +#include + +#include + +#include + +/ { + chosen { + zephyr,sram = &sram0; + zephyr,flash = &flash0; + zephyr,flash-controller = &ssi; + zephyr,console = &uart0; + zephyr,shell-uart = &uart0; + zephyr,code-partition = &code_partition; + }; + + leds { + compatible = "gpio-leds"; + led0: led_0 { + gpios = <&gpio0 25 GPIO_ACTIVE_HIGH>; + label = "LED"; + }; + red1: red_p1 { + gpios = <&gpio0 2 GPIO_ACTIVE_HIGH>; + label = "RED_P1"; + }; + + yellow2: yel_p2 { + gpios = <&gpio0 3 GPIO_ACTIVE_HIGH>; + label = "YEL_P2"; + }; + + green3: gre_p3 { + gpios = <&gpio0 4 GPIO_ACTIVE_HIGH>; + label = "GRE_P3"; + }; + }; + + pwm_leds { + compatible = "pwm-leds"; + status = "disabled"; + pwm_led0: pwm_led_0 { + pwms = <&pwm 9 PWM_MSEC(20) PWM_POLARITY_NORMAL>; + label = "PWM_LED"; + }; + }; + + aliases { + led0 = &led0; + red = &red1; + yellow = &yellow2; + green = &green3; + pwm-led0 = &pwm_led0; + rtc = &rtc; + watchdog0 = &wdt0; + }; + + pico_header: connector { + compatible = "raspberrypi,pico-header"; + #gpio-cells = <2>; + gpio-map-mask = <0xffffffff 0xffffffc0>; + gpio-map-pass-thru = <0 0x3f>; + gpio-map = <0 0 &gpio0 0 0>, /* GP0 */ + <1 0 &gpio0 1 0>, /* GP1 */ + <2 0 &gpio0 2 0>, /* GP2 */ + <3 0 &gpio0 3 0>, /* GP3 */ + <4 0 &gpio0 4 0>, /* GP4 */ + <5 0 &gpio0 5 0>, /* GP5 */ + <6 0 &gpio0 6 0>, /* GP6 */ + <7 0 &gpio0 7 0>, /* GP7 */ + <8 0 &gpio0 8 0>, /* GP8 */ + <9 0 &gpio0 9 0>, /* GP9 */ + <10 0 &gpio0 10 0>, /* GP10 */ + <11 0 &gpio0 11 0>, /* GP11 */ + <12 0 &gpio0 12 0>, /* GP12 */ + <13 0 &gpio0 13 0>, /* GP13 */ + <14 0 &gpio0 14 0>, /* GP14 */ + <15 0 &gpio0 15 0>, /* GP15 */ + <16 0 &gpio0 16 0>, /* GP16 */ + <17 0 &gpio0 17 0>, /* GP17 */ + <18 0 &gpio0 18 0>, /* GP18 */ + <19 0 &gpio0 19 0>, /* GP19 */ + <20 0 &gpio0 20 0>, /* GP20 */ + <21 0 &gpio0 21 0>, /* GP21 */ + <22 0 &gpio0 22 0>, /* GP22 */ + <26 0 &gpio0 26 0>, /* GP26 */ + <27 0 &gpio0 27 0>, /* GP27 */ + <28 0 &gpio0 28 0>; /* GP28 */ + }; +}; + +&flash0 { + reg = <0x10000000 DT_SIZE_M(2)>; + + 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 2MB minus the 0x100 bytes taken by the bootloader. + */ + code_partition: partition@100 { + label = "code-partition"; + reg = <0x100 (DT_SIZE_M(2) - 0x100)>; + read-only; + }; + }; +}; + +&uart0 { + current-speed = <115200>; + status = "okay"; + pinctrl-0 = <&uart0_default>; + pinctrl-names = "default"; +}; + +&gpio0 { + status = "okay"; +}; + +&i2c0 { + clock-frequency = ; + status = "okay"; + pinctrl-0 = <&i2c0_default>; + pinctrl-names = "default"; +}; + +&i2c1 { + pinctrl-0 = <&i2c1_default>; + pinctrl-names = "default"; + status = "disabled"; + clock-frequency = ; +}; + +&spi1 { + clock-frequency = ; + status = "okay"; + pinctrl-0 = <&spi1_default>; + pinctrl-names = "default"; + cs-gpios = <&pico_header 13 GPIO_ACTIVE_LOW>; + + lan8651: lan865x@0 { + compatible = "microchip,lan865x"; + reg = <0x0>; + spi-max-frequency = ; + int-gpios = <&gpio0 21 (GPIO_ACTIVE_LOW)>; + rst-gpios = <&gpio0 20 GPIO_ACTIVE_LOW>; + status = "okay"; + + plca-enable; + plca-node-id = <1>; + plca-node-count = <8>; + plca-burst-count = <0x0>; + plca-burst-timer = <0x80>; + plca-to-timer = <0x20>; + + local-mac-address = [ CA 2F B7 10 23 75]; + }; +}; + +&timer { + status = "okay"; +}; + +&wdt0 { + status = "okay"; +}; + +&rtc { + clocks = <&clocks RPI_PICO_CLKID_CLK_RTC>; + status = "okay"; +}; + +&adc { + status = "okay"; + pinctrl-0 = <&adc_default>; + pinctrl-names = "default"; +}; + +zephyr_udc0: &usbd { + status = "okay"; +}; + +&pwm { + pinctrl-0 = <&pwm_ch4b_default>; + pinctrl-names = "default"; +}; + +&vreg { + regulator-always-on; + regulator-allowed-modes = ; +}; + +pico_spi: &spi1 {}; +pico_i2c0: &i2c0 {}; +pico_i2c1: &i2c1 {}; +pico_serial: &uart0 {}; diff --git a/boards/kws/pico_spe/pico_spe.yaml b/boards/kws/pico_spe/pico_spe.yaml new file mode 100644 index 0000000000000..c0b383270f571 --- /dev/null +++ b/boards/kws/pico_spe/pico_spe.yaml @@ -0,0 +1,23 @@ +identifier: pico_spe +name: KWS Pico SinglePairEthernet +type: mcu +arch: arm +flash: 2048 +ram: 264 +toolchain: + - zephyr + - gnuarmemb + - xtools +supported: + - uart + - gpio + - adc + - i2c + - spi + - hwinfo + - watchdog + - pwm + - flash + - dma + - counter + - clock diff --git a/boards/kws/pico_spe/pico_spe_defconfig b/boards/kws/pico_spe/pico_spe_defconfig new file mode 100644 index 0000000000000..df003531af9c8 --- /dev/null +++ b/boards/kws/pico_spe/pico_spe_defconfig @@ -0,0 +1,11 @@ +CONFIG_SYS_CLOCK_HW_CYCLES_PER_SEC=125000000 +CONFIG_SERIAL=y +CONFIG_CONSOLE=y +CONFIG_UART_CONSOLE=y +CONFIG_GPIO=y +CONFIG_USE_DT_CODE_PARTITION=y +CONFIG_BUILD_OUTPUT_UF2=y +CONFIG_BUILD_OUTPUT_HEX=y +CONFIG_UART_INTERRUPT_DRIVEN=y +CONFIG_RESET=y +CONFIG_CLOCK_CONTROL=y diff --git a/boards/kws/pico_spe/support/openocd.cfg b/boards/kws/pico_spe/support/openocd.cfg new file mode 100644 index 0000000000000..34ab592b1861d --- /dev/null +++ b/boards/kws/pico_spe/support/openocd.cfg @@ -0,0 +1,11 @@ +# Copyright (c) 2022 Tokita, Hiroshi +# SPDX-License-Identifier: Apache-2.0 + +# Checking and set 'adapter speed'. +# Set the adaptor speed, if unset, and given as an argument. +proc set_adapter_speed_if_not_set { speed } { + puts "checking adapter speed..." + if { [catch {adapter speed} ret] } { + adapter speed $speed + } +} diff --git a/dts/bindings/vendor-prefixes.txt b/dts/bindings/vendor-prefixes.txt index 5ad47d5969b67..b44db9518c9f4 100644 --- a/dts/bindings/vendor-prefixes.txt +++ b/dts/bindings/vendor-prefixes.txt @@ -356,6 +356,7 @@ kontron Kontron S&T AG kosagi Sutajio Ko-Usagi PTE Ltd. kvaser Kvaser kvg Kverneland Group +kws KWS Computersysteme Gmbh kyo Kyocera Corporation lacie LaCie laird Laird PLC diff --git a/tests/drivers/adc/adc_api/boards/pico_spe.overlay b/tests/drivers/adc/adc_api/boards/pico_spe.overlay new file mode 100644 index 0000000000000..a2a8bc205dd1c --- /dev/null +++ b/tests/drivers/adc/adc_api/boards/pico_spe.overlay @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2024 KWS Computersysteme Gmbh + * + * SPDX-License-Identifier: Apache-2.0 + */ + +/ { + zephyr,user { + io-channels = <&adc 0>, <&adc 1>; + }; +}; + +&adc { + #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>; + }; +}; From 834564d08f36ee39202547295c7cb44405182a85 Mon Sep 17 00:00:00 2001 From: Frank Bintakies Date: Fri, 6 Dec 2024 08:51:42 +0100 Subject: [PATCH 3/8] Revert "boards: pico_spe: add support" This reverts commit a5d0f02bf1bc549e3bee3f9eaec31eb20667e668. --- boards/kws/pico_spe/Kconfig | 5 - boards/kws/pico_spe/Kconfig.defconfig | 34 --- boards/kws/pico_spe/Kconfig.pico_spe | 5 - boards/kws/pico_spe/board.cmake | 36 --- boards/kws/pico_spe/board.yml | 6 - boards/kws/pico_spe/doc/img/pico_spe.webp | Bin 24890 -> 0 bytes boards/kws/pico_spe/doc/index.rst | 285 ------------------ boards/kws/pico_spe/pico_spe-pinctrl.dtsi | 70 ----- boards/kws/pico_spe/pico_spe.dts | 218 -------------- boards/kws/pico_spe/pico_spe.yaml | 23 -- boards/kws/pico_spe/pico_spe_defconfig | 11 - boards/kws/pico_spe/support/openocd.cfg | 11 - dts/bindings/vendor-prefixes.txt | 1 - .../adc/adc_api/boards/pico_spe.overlay | 32 -- 14 files changed, 737 deletions(-) delete mode 100644 boards/kws/pico_spe/Kconfig delete mode 100644 boards/kws/pico_spe/Kconfig.defconfig delete mode 100644 boards/kws/pico_spe/Kconfig.pico_spe delete mode 100644 boards/kws/pico_spe/board.cmake delete mode 100644 boards/kws/pico_spe/board.yml delete mode 100644 boards/kws/pico_spe/doc/img/pico_spe.webp delete mode 100644 boards/kws/pico_spe/doc/index.rst delete mode 100644 boards/kws/pico_spe/pico_spe-pinctrl.dtsi delete mode 100644 boards/kws/pico_spe/pico_spe.dts delete mode 100644 boards/kws/pico_spe/pico_spe.yaml delete mode 100644 boards/kws/pico_spe/pico_spe_defconfig delete mode 100644 boards/kws/pico_spe/support/openocd.cfg delete mode 100644 tests/drivers/adc/adc_api/boards/pico_spe.overlay diff --git a/boards/kws/pico_spe/Kconfig b/boards/kws/pico_spe/Kconfig deleted file mode 100644 index e1a877543e64a..0000000000000 --- a/boards/kws/pico_spe/Kconfig +++ /dev/null @@ -1,5 +0,0 @@ -# Copyright (c) 2024 KWS Computersysteme Gmbh -# SPDX-License-Identifier: Apache-2.0 - -config BOARD_PICO_SPE - select RP2_FLASH_W25Q080 diff --git a/boards/kws/pico_spe/Kconfig.defconfig b/boards/kws/pico_spe/Kconfig.defconfig deleted file mode 100644 index 4f5d509016333..0000000000000 --- a/boards/kws/pico_spe/Kconfig.defconfig +++ /dev/null @@ -1,34 +0,0 @@ -# Copyright (c) 2024 KWS Computersysteme Gmbh -# SPDX-License-Identifier: Apache-2.0 - -if BOARD_PICO_SPE - -if I2C_DW - -config I2C_DW_CLOCK_SPEED - default 125 - -endif # I2C_DW - -config USB_SELF_POWERED - default n - -config PHY_INIT_PRIORITY - default 82 - depends on NET_L2_ETHERNET && ETH_DRIVER - -if NETWORKING - -config NET_L2_ETHERNET - default y - -if ETH_LAN865X - -config NET_IF_MAX_IPV4_COUNT - default 2 - -endif # ETH_LAN865X - -endif # NETWORKING - -endif # BOARD_PICO_SPE diff --git a/boards/kws/pico_spe/Kconfig.pico_spe b/boards/kws/pico_spe/Kconfig.pico_spe deleted file mode 100644 index 1ecb279b3f66e..0000000000000 --- a/boards/kws/pico_spe/Kconfig.pico_spe +++ /dev/null @@ -1,5 +0,0 @@ -# Copyright (c) 2024 KWS Computersysteme Gmbh -# SPDX-License-Identifier: Apache-2.0 - -config BOARD_PICO_SPE - select SOC_RP2040 diff --git a/boards/kws/pico_spe/board.cmake b/boards/kws/pico_spe/board.cmake deleted file mode 100644 index 5f9bbfd18125f..0000000000000 --- a/boards/kws/pico_spe/board.cmake +++ /dev/null @@ -1,36 +0,0 @@ -# SPDX-License-Identifier: Apache-2.0 - -# This configuration allows selecting what debug adapter debugging Pico-SPE -# by a command-line argument. -# It is mainly intended to support both the 'picoprobe' and 'raspberrypi-swd' -# adapter described in "Getting started with Raspberry Pi Pico". -# And any other SWD debug adapter might also be usable with this configuration. - -# Set RPI_PICO_DEBUG_ADAPTER to select debug adapter by command-line arguments. -# e.g.) west build -b pico_spe -- -DRPI_PICO_DEBUG_ADAPTER=raspberrypi-swd -# The value is treated as a part of an interface file name that -# the debugger's configuration file. -# The value must be the 'stem' part of the name of one of the files -# in the openocd interface configuration file. -# The setting is store to CMakeCache.txt. -if ("${RPI_PICO_DEBUG_ADAPTER}" STREQUAL "") - set(RPI_PICO_DEBUG_ADAPTER "cmsis-dap") -endif() - -board_runner_args(openocd --cmd-pre-init "source [find interface/${RPI_PICO_DEBUG_ADAPTER}.cfg]") -board_runner_args(openocd --cmd-pre-init "transport select swd") -board_runner_args(openocd --cmd-pre-init "source [find target/rp2040.cfg]") - -# The adapter speed is expected to be set by interface configuration. -# But if not so, set 2000 to adapter speed. -board_runner_args(openocd --cmd-pre-init "set_adapter_speed_if_not_set 2000") - -board_runner_args(jlink "--device=RP2040_M0_0") -board_runner_args(uf2 "--board-id=RPI-RP2") -board_runner_args(pyocd "--target=rp2040") - -include(${ZEPHYR_BASE}/boards/common/openocd.board.cmake) -include(${ZEPHYR_BASE}/boards/common/jlink.board.cmake) -include(${ZEPHYR_BASE}/boards/common/uf2.board.cmake) -include(${ZEPHYR_BASE}/boards/common/blackmagicprobe.board.cmake) -include(${ZEPHYR_BASE}/boards/common/pyocd.board.cmake) \ No newline at end of file diff --git a/boards/kws/pico_spe/board.yml b/boards/kws/pico_spe/board.yml deleted file mode 100644 index 5d80b878c0b30..0000000000000 --- a/boards/kws/pico_spe/board.yml +++ /dev/null @@ -1,6 +0,0 @@ -board: - name: pico_spe - full_name: Pico-SPE - vendor: kws - socs: - - name: rp2040 diff --git a/boards/kws/pico_spe/doc/img/pico_spe.webp b/boards/kws/pico_spe/doc/img/pico_spe.webp deleted file mode 100644 index 00e143500b49cb5e0710f780f6416ab5275b5276..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24890 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 P000000000000000flM%1 diff --git a/boards/kws/pico_spe/doc/index.rst b/boards/kws/pico_spe/doc/index.rst deleted file mode 100644 index f542cafa35e74..0000000000000 --- a/boards/kws/pico_spe/doc/index.rst +++ /dev/null @@ -1,285 +0,0 @@ -.. zephyr:board:: pico_spe - -Overview -******** - -The Pico-SPE is a small, low-cost, versatile boards from -KWS Computersysteme Gmbh. They are equipped with an RP2040 SoC, an on-board LED, -a USB connector, an SWD interface. The Pico-SPE additionally contains an -Microchip LAN8651 10Base-T1S module. The USB bootloader allows the -ability to flash without any adapter, in a drag-and-drop manner. -It is also possible to flash and debug the boards with their SWD interface, -using an external adapter. - -Hardware -******** -- Dual core Arm Cortex-M0+ processor running up to 133MHz -- 264KB on-chip SRAM -- 16MB on-board QSPI flash with XIP capabilities -- 16 GPIO pins -- 3 Analog inputs -- 2 UART peripherals -- 2 I2C controllers -- 16 PWM channels -- USB 1.1 controller (host/device) -- 8 Programmable I/O (PIO) for custom peripherals -- On-board LED -- 1 Watchdog timer peripheral -- Microchip LAN8651 10Base-T1S - -Supported Features -================== - -The ``pico_spe`` board target supports the following -hardware features: - -.. list-table:: - :header-rows: 1 - - * - Peripheral - - Kconfig option - - Devicetree compatible - * - NVIC - - N/A - - :dtcompatible:`arm,v6m-nvic` - * - UART - - :kconfig:option:`CONFIG_SERIAL` - - :dtcompatible:`raspberrypi,pico-uart` - * - GPIO - - :kconfig:option:`CONFIG_GPIO` - - :dtcompatible:`raspberrypi,pico-gpio` - * - ADC - - :kconfig:option:`CONFIG_ADC` - - :dtcompatible:`raspberrypi,pico-adc` - * - I2C - - :kconfig:option:`CONFIG_I2C` - - :dtcompatible:`snps,designware-i2c` - * - SPI - - :kconfig:option:`CONFIG_SPI` - - :dtcompatible:`raspberrypi,pico-spi` - * - USB Device - - :kconfig:option:`CONFIG_USB_DEVICE_STACK` - - :dtcompatible:`raspberrypi,pico-usbd` - * - HWINFO - - :kconfig:option:`CONFIG_HWINFO` - - N/A - * - Watchdog Timer (WDT) - - :kconfig:option:`CONFIG_WATCHDOG` - - :dtcompatible:`raspberrypi,pico-watchdog` - * - PWM - - :kconfig:option:`CONFIG_PWM` - - :dtcompatible:`raspberrypi,pico-pwm` - * - Flash - - :kconfig:option:`CONFIG_FLASH` - - :dtcompatible:`raspberrypi,pico-flash` - * - Clock controller - - :kconfig:option:`CONFIG_CLOCK_CONTROL` - - :dtcompatible:`raspberrypi,pico-clock-controller` - * - UART (PIO) - - :kconfig:option:`CONFIG_SERIAL` - - :dtcompatible:`raspberrypi,pico-uart-pio` - * - SPI (PIO) - - :kconfig:option:`CONFIG_SPI` - - :dtcompatible:`raspberrypi,pico-spi-pio` - * - LAN8651 Single Pair Ethernet - - :kconfig:option:`CONFIG_NETWORKING` - - :dtcompatible:`microchip,lan865x` - -Pin Mapping -=========== - -The peripherals of the RP2040 SoC can be routed to various pins on the board. -The configuration of these routes can be modified through DTS. Please refer to -the datasheet to see the possible routings for each peripheral. - -External pin mapping on the Pico-SPE is identical to the Pico, but note that internal -RP2040 GPIO lines 10, 11, 12, 13, 20, 21 are routed to the Microchip LAN8651 on the -Pico-SPE. - -Default Zephyr Peripheral Mapping: ----------------------------------- - -.. rst-class:: rst-columns - -- UART0_TX : P0 -- UART0_RX : P1 -- I2C0_SDA : P4 -- I2C0_SCL : P5 -- I2C1_SDA : P6 -- I2C1_SCL : P7 -- ADC_CH0 : P26 -- ADC_CH1 : P27 -- ADC_CH2 : P28 - -Programmable I/O (PIO) -********************** -The RP2040 SoC comes with two PIO periherals. These are two simple -co-processors that are designed for I/O operations. The PIOs run -a custom instruction set, generated from a custom assembly language. -PIO programs are assembled using :command:`pioasm`, a tool provided by Raspberry Pi. - -Zephyr does not (currently) assemble PIO programs. Rather, they should be -manually assembled and embedded in source code. An example of how this is done -can be found at :zephyr_file:`drivers/serial/uart_rpi_pico_pio.c`. - -Sample: SPI via PIO -==================== - -The :zephyr:code-sample:`bme280` sample includes a -demonstration of using the PIO SPI driver to communicate with an -environmental sensor. The PIO SPI driver supports using any -combination of GPIO pins for an SPI bus, as well as allowing up to -four independent SPI buses on a single board (using the two SPI -devices as well as both PIO devices). - -Programming and Debugging -************************* - -Flashing -======== - -Using SEGGER JLink ------------------- - -You can Flash the pico_spe with a SEGGER JLink debug probe as described in -:ref:`Building, Flashing and Debugging `. - -Here is an example of building and flashing the :zephyr:code-sample:`blinky` application. - -.. zephyr-app-commands:: - :zephyr-app: samples/basic/blinky - :board: pico_spe - :goals: build - -.. code-block:: bash - - west flash --runner jlink - -Using OpenOCD -------------- - -To use CMSIS-DAP, you must configure **udev**. - -Create a file in /etc/udev.rules.d with any name, and write the line below. - -.. code-block:: bash - - ATTRS{idVendor}=="2e8a", ATTRS{idProduct}=="000c", MODE="660", GROUP="plugdev", TAG+="uaccess" - -This example is valid for the case that the user joins to ``plugdev`` groups. - -The Pico-SPE has an SWD interface that can be used to program -and debug the on board RP2040. This interface can be utilized by OpenOCD. -To use it with the RP2040, OpenOCD version 0.12.0 or later is needed. - -If you are using a Debian based system (including RaspberryPi OS, Ubuntu. and more), -using the `pico_setup.sh`_ script is a convenient way to set up the forked version of OpenOCD. - -Depending on the interface used (such as JLink), you might need to -checkout to a branch that supports this interface, before proceeding. -Build and install OpenOCD as described in the README. - -Here is an example of building and flashing the :zephyr:code-sample:`blinky` application. - -.. zephyr-app-commands:: - :zephyr-app: samples/basic/blinky - :board: pico_spe - :goals: build flash - :gen-args: -DOPENOCD=/usr/local/bin/openocd -DOPENOCD_DEFAULT_PATH=/usr/local/share/openocd/scripts -DRPI_PICO_DEBUG_ADAPTER=cmsis-dap - -Set the environment variables **OPENOCD** to :file:`/usr/local/bin/openocd` -and **OPENOCD_DEFAULT_PATH** to :file:`/usr/local/share/openocd/scripts`. This should work -with the OpenOCD that was installed with the default configuration. -This configuration also works with an environment that is set up by the `pico_setup.sh`_ script. - -**RPI_PICO_DEBUG_ADAPTER** specifies what debug adapter is used for debugging. - -If **RPI_PICO_DEBUG_ADAPTER** was not assigned, ``cmsis-dap`` is used by default. -The other supported adapters are ``raspberrypi-swd``, ``jlink`` and ``blackmagicprobe``. -How to connect ``cmsis-dap`` and ``raspberrypi-swd`` is described in `Getting Started with Pico-SPE`_. -Any other SWD debug adapter maybe also work with this configuration. - -The value of **RPI_PICO_DEBUG_ADAPTER** is cached, so it can be omitted from -``west flash`` and ``west debug`` if it was previously set while running -``west build``. - -**RPI_PICO_DEBUG_ADAPTER** is used in an argument to OpenOCD as ``"source [find interface/${RPI_PICO_DEBUG_ADAPTER}.cfg]"``. -Thus, **RPI_PICO_DEBUG_ADAPTER** needs to be assigned the file name of the debug adapter. - -You can also flash the board with the following -command that directly calls OpenOCD (assuming a SEGGER JLink adapter is used): - -.. code-block:: console - - $ openocd -f interface/jlink.cfg -c 'transport select swd' -f target/rp2040.cfg -c "adapter speed 2000" -c 'targets rp2040.core0' -c 'program path/to/zephyr.elf verify reset exit' - -Using UF2 ---------- - -If you don't have an SWD adapter, you can flash the Pico-SPE with -a UF2 file. By default, building an app for this board will generate a -:file:`build/zephyr/zephyr.uf2` file. If the Pico is powered on with the ``BOOTSEL`` -button pressed, it will appear on the host as a mass storage device. The -UF2 file should be drag-and-dropped to the device, which will flash the Pico. - -Debugging -========= - -The SWD interface can also be used to debug the board. To achieve this, you can -either use SEGGER JLink or OpenOCD. - -Using SEGGER JLink ------------------- - -Use a SEGGER JLink debug probe and follow the instruction in -:ref:`Building, Flashing and Debugging`. - - -Using OpenOCD -------------- - -Install OpenOCD as described for flashing the board. - -Here is an example for debugging the :zephyr:code-sample:`blinky` application. - -.. zephyr-app-commands:: - :zephyr-app: samples/basic/blinky - :board: pico_spe - :maybe-skip-config: - :goals: debug - :gen-args: -DOPENOCD=/usr/local/bin/openocd -DOPENOCD_DEFAULT_PATH=/usr/local/share/openocd/scripts -DRPI_PICO_DEBUG_ADAPTER=raspberrypi-swd - -As with flashing, you can specify the debug adapter by specifying **RPI_PICO_DEBUG_ADAPTER** -at ``west build`` time. No needs to specify it at ``west debug`` time. - -You can also debug with OpenOCD and gdb launching from command-line. -Run the following command: - -.. code-block:: console - - $ openocd -f interface/jlink.cfg -c 'transport select swd' -f target/rp2040.cfg -c "adapter speed 2000" -c 'targets rp2040.core0' - -On another terminal, run: - -.. code-block:: console - - $ gdb-multiarch - -Inside gdb, run: - -.. code-block:: console - - (gdb) tar ext :3333 - (gdb) file path/to/zephyr.elf - -You can then start debugging the board. - -.. target-notes:: -.. _pico_setup.sh: - https://raw.githubusercontent.com/raspberrypi/pico-setup/master/pico_setup.sh - -.. _Getting Started with Pico-SPE: - https://kws-computer.de/go/pico-spe-getting-started - -.. _Pico-SPE Documentation: - https://kws-computer.de/go/pico-spe-datasheet diff --git a/boards/kws/pico_spe/pico_spe-pinctrl.dtsi b/boards/kws/pico_spe/pico_spe-pinctrl.dtsi deleted file mode 100644 index f07ab21b0d70b..0000000000000 --- a/boards/kws/pico_spe/pico_spe-pinctrl.dtsi +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright (c) 2024 KWS Computersysteme Gmbh - * SPDX-License-Identifier: Apache-2.0 - */ - -#include - -&pinctrl { - uart0_default: uart0_default { - group1 { - pinmux = ; - }; - group2 { - pinmux = ; - input-enable; - }; - }; - - i2c0_default: i2c0_default { - group1 { - pinmux = , ; - input-enable; - input-schmitt-enable; - }; - }; - - i2c1_default: i2c1_default { - group1 { - pinmux = , ; - input-enable; - input-schmitt-enable; - }; - }; - - spi0_default: spi0_default { - group1 { - pinmux = , , ; - }; - group2 { - pinmux = ; - input-enable; - }; - }; - - spi1_default: spi1_default { - group1 { - pinmux = , , ; - }; - group2 { - pinmux = ; - input-enable; - }; - }; - - pwm_ch4b_default: pwm_ch4b_default { - group1 { - pinmux = ; - }; - }; - - adc_default: adc_default { - group1 { - pinmux = , , , ; - input-enable; - }; - }; - - clocks_default: clocks_default { - }; -}; diff --git a/boards/kws/pico_spe/pico_spe.dts b/boards/kws/pico_spe/pico_spe.dts deleted file mode 100644 index 972f1e0cea43f..0000000000000 --- a/boards/kws/pico_spe/pico_spe.dts +++ /dev/null @@ -1,218 +0,0 @@ -/* - * Copyright (c) 2024 KWS Computersysteme Gmbh - * - * SPDX-License-Identifier: Apache-2.0 - */ - -/dts-v1/; - -#include - -#include -#include "pico_spe-pinctrl.dtsi" -#include - -#include - -#include - -/ { - chosen { - zephyr,sram = &sram0; - zephyr,flash = &flash0; - zephyr,flash-controller = &ssi; - zephyr,console = &uart0; - zephyr,shell-uart = &uart0; - zephyr,code-partition = &code_partition; - }; - - leds { - compatible = "gpio-leds"; - led0: led_0 { - gpios = <&gpio0 25 GPIO_ACTIVE_HIGH>; - label = "LED"; - }; - red1: red_p1 { - gpios = <&gpio0 2 GPIO_ACTIVE_HIGH>; - label = "RED_P1"; - }; - - yellow2: yel_p2 { - gpios = <&gpio0 3 GPIO_ACTIVE_HIGH>; - label = "YEL_P2"; - }; - - green3: gre_p3 { - gpios = <&gpio0 4 GPIO_ACTIVE_HIGH>; - label = "GRE_P3"; - }; - }; - - pwm_leds { - compatible = "pwm-leds"; - status = "disabled"; - pwm_led0: pwm_led_0 { - pwms = <&pwm 9 PWM_MSEC(20) PWM_POLARITY_NORMAL>; - label = "PWM_LED"; - }; - }; - - aliases { - led0 = &led0; - red = &red1; - yellow = &yellow2; - green = &green3; - pwm-led0 = &pwm_led0; - rtc = &rtc; - watchdog0 = &wdt0; - }; - - pico_header: connector { - compatible = "raspberrypi,pico-header"; - #gpio-cells = <2>; - gpio-map-mask = <0xffffffff 0xffffffc0>; - gpio-map-pass-thru = <0 0x3f>; - gpio-map = <0 0 &gpio0 0 0>, /* GP0 */ - <1 0 &gpio0 1 0>, /* GP1 */ - <2 0 &gpio0 2 0>, /* GP2 */ - <3 0 &gpio0 3 0>, /* GP3 */ - <4 0 &gpio0 4 0>, /* GP4 */ - <5 0 &gpio0 5 0>, /* GP5 */ - <6 0 &gpio0 6 0>, /* GP6 */ - <7 0 &gpio0 7 0>, /* GP7 */ - <8 0 &gpio0 8 0>, /* GP8 */ - <9 0 &gpio0 9 0>, /* GP9 */ - <10 0 &gpio0 10 0>, /* GP10 */ - <11 0 &gpio0 11 0>, /* GP11 */ - <12 0 &gpio0 12 0>, /* GP12 */ - <13 0 &gpio0 13 0>, /* GP13 */ - <14 0 &gpio0 14 0>, /* GP14 */ - <15 0 &gpio0 15 0>, /* GP15 */ - <16 0 &gpio0 16 0>, /* GP16 */ - <17 0 &gpio0 17 0>, /* GP17 */ - <18 0 &gpio0 18 0>, /* GP18 */ - <19 0 &gpio0 19 0>, /* GP19 */ - <20 0 &gpio0 20 0>, /* GP20 */ - <21 0 &gpio0 21 0>, /* GP21 */ - <22 0 &gpio0 22 0>, /* GP22 */ - <26 0 &gpio0 26 0>, /* GP26 */ - <27 0 &gpio0 27 0>, /* GP27 */ - <28 0 &gpio0 28 0>; /* GP28 */ - }; -}; - -&flash0 { - reg = <0x10000000 DT_SIZE_M(2)>; - - 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 2MB minus the 0x100 bytes taken by the bootloader. - */ - code_partition: partition@100 { - label = "code-partition"; - reg = <0x100 (DT_SIZE_M(2) - 0x100)>; - read-only; - }; - }; -}; - -&uart0 { - current-speed = <115200>; - status = "okay"; - pinctrl-0 = <&uart0_default>; - pinctrl-names = "default"; -}; - -&gpio0 { - status = "okay"; -}; - -&i2c0 { - clock-frequency = ; - status = "okay"; - pinctrl-0 = <&i2c0_default>; - pinctrl-names = "default"; -}; - -&i2c1 { - pinctrl-0 = <&i2c1_default>; - pinctrl-names = "default"; - status = "disabled"; - clock-frequency = ; -}; - -&spi1 { - clock-frequency = ; - status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-names = "default"; - cs-gpios = <&pico_header 13 GPIO_ACTIVE_LOW>; - - lan8651: lan865x@0 { - compatible = "microchip,lan865x"; - reg = <0x0>; - spi-max-frequency = ; - int-gpios = <&gpio0 21 (GPIO_ACTIVE_LOW)>; - rst-gpios = <&gpio0 20 GPIO_ACTIVE_LOW>; - status = "okay"; - - plca-enable; - plca-node-id = <1>; - plca-node-count = <8>; - plca-burst-count = <0x0>; - plca-burst-timer = <0x80>; - plca-to-timer = <0x20>; - - local-mac-address = [ CA 2F B7 10 23 75]; - }; -}; - -&timer { - status = "okay"; -}; - -&wdt0 { - status = "okay"; -}; - -&rtc { - clocks = <&clocks RPI_PICO_CLKID_CLK_RTC>; - status = "okay"; -}; - -&adc { - status = "okay"; - pinctrl-0 = <&adc_default>; - pinctrl-names = "default"; -}; - -zephyr_udc0: &usbd { - status = "okay"; -}; - -&pwm { - pinctrl-0 = <&pwm_ch4b_default>; - pinctrl-names = "default"; -}; - -&vreg { - regulator-always-on; - regulator-allowed-modes = ; -}; - -pico_spi: &spi1 {}; -pico_i2c0: &i2c0 {}; -pico_i2c1: &i2c1 {}; -pico_serial: &uart0 {}; diff --git a/boards/kws/pico_spe/pico_spe.yaml b/boards/kws/pico_spe/pico_spe.yaml deleted file mode 100644 index c0b383270f571..0000000000000 --- a/boards/kws/pico_spe/pico_spe.yaml +++ /dev/null @@ -1,23 +0,0 @@ -identifier: pico_spe -name: KWS Pico SinglePairEthernet -type: mcu -arch: arm -flash: 2048 -ram: 264 -toolchain: - - zephyr - - gnuarmemb - - xtools -supported: - - uart - - gpio - - adc - - i2c - - spi - - hwinfo - - watchdog - - pwm - - flash - - dma - - counter - - clock diff --git a/boards/kws/pico_spe/pico_spe_defconfig b/boards/kws/pico_spe/pico_spe_defconfig deleted file mode 100644 index df003531af9c8..0000000000000 --- a/boards/kws/pico_spe/pico_spe_defconfig +++ /dev/null @@ -1,11 +0,0 @@ -CONFIG_SYS_CLOCK_HW_CYCLES_PER_SEC=125000000 -CONFIG_SERIAL=y -CONFIG_CONSOLE=y -CONFIG_UART_CONSOLE=y -CONFIG_GPIO=y -CONFIG_USE_DT_CODE_PARTITION=y -CONFIG_BUILD_OUTPUT_UF2=y -CONFIG_BUILD_OUTPUT_HEX=y -CONFIG_UART_INTERRUPT_DRIVEN=y -CONFIG_RESET=y -CONFIG_CLOCK_CONTROL=y diff --git a/boards/kws/pico_spe/support/openocd.cfg b/boards/kws/pico_spe/support/openocd.cfg deleted file mode 100644 index 34ab592b1861d..0000000000000 --- a/boards/kws/pico_spe/support/openocd.cfg +++ /dev/null @@ -1,11 +0,0 @@ -# Copyright (c) 2022 Tokita, Hiroshi -# SPDX-License-Identifier: Apache-2.0 - -# Checking and set 'adapter speed'. -# Set the adaptor speed, if unset, and given as an argument. -proc set_adapter_speed_if_not_set { speed } { - puts "checking adapter speed..." - if { [catch {adapter speed} ret] } { - adapter speed $speed - } -} diff --git a/dts/bindings/vendor-prefixes.txt b/dts/bindings/vendor-prefixes.txt index b44db9518c9f4..5ad47d5969b67 100644 --- a/dts/bindings/vendor-prefixes.txt +++ b/dts/bindings/vendor-prefixes.txt @@ -356,7 +356,6 @@ kontron Kontron S&T AG kosagi Sutajio Ko-Usagi PTE Ltd. kvaser Kvaser kvg Kverneland Group -kws KWS Computersysteme Gmbh kyo Kyocera Corporation lacie LaCie laird Laird PLC diff --git a/tests/drivers/adc/adc_api/boards/pico_spe.overlay b/tests/drivers/adc/adc_api/boards/pico_spe.overlay deleted file mode 100644 index a2a8bc205dd1c..0000000000000 --- a/tests/drivers/adc/adc_api/boards/pico_spe.overlay +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright (c) 2024 KWS Computersysteme Gmbh - * - * SPDX-License-Identifier: Apache-2.0 - */ - -/ { - zephyr,user { - io-channels = <&adc 0>, <&adc 1>; - }; -}; - -&adc { - #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>; - }; -}; From 5551bc0918608e7ce8a4013dd2dce056f5f4566a Mon Sep 17 00:00:00 2001 From: Frank Bintakies Date: Fri, 6 Dec 2024 08:52:06 +0100 Subject: [PATCH 4/8] Revert "boards: pico_spe: add vendor" This reverts commit e8963196bb0438c046840463816319f369a7971a. --- boards/kws/index.rst | 10 ---------- 1 file changed, 10 deletions(-) delete mode 100644 boards/kws/index.rst diff --git a/boards/kws/index.rst b/boards/kws/index.rst deleted file mode 100644 index 0f8fc102b9457..0000000000000 --- a/boards/kws/index.rst +++ /dev/null @@ -1,10 +0,0 @@ -.. _boards-kws: - -KWS Computersysteme Gmbh -######################## - -.. toctree:: - :maxdepth: 1 - :glob: - - **/* From 216267fd4be3836212991313c5e80cbee9caba1a Mon Sep 17 00:00:00 2001 From: Frank Bintakies Date: Fri, 6 Dec 2024 08:54:17 +0100 Subject: [PATCH 5/8] boards: pico_spe: add vendor add of vendor Signed-off-by: Frank Bintakies --- dts/bindings/vendor-prefixes.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/dts/bindings/vendor-prefixes.txt b/dts/bindings/vendor-prefixes.txt index 5ad47d5969b67..b44db9518c9f4 100644 --- a/dts/bindings/vendor-prefixes.txt +++ b/dts/bindings/vendor-prefixes.txt @@ -356,6 +356,7 @@ kontron Kontron S&T AG kosagi Sutajio Ko-Usagi PTE Ltd. kvaser Kvaser kvg Kverneland Group +kws KWS Computersysteme Gmbh kyo Kyocera Corporation lacie LaCie laird Laird PLC From 5028574e7efa516cce4cff179d4690cf00aceb68 Mon Sep 17 00:00:00 2001 From: Frank Bintakies Date: Fri, 6 Dec 2024 08:55:32 +0100 Subject: [PATCH 6/8] boards: pico_spe: add support Add variant of rp2040 with SinglePairEthernet Signed-off-by: Frank Bintakies --- boards/kws/index.rst | 10 + boards/kws/pico_spe/Kconfig | 5 + boards/kws/pico_spe/Kconfig.defconfig | 34 +++ boards/kws/pico_spe/Kconfig.pico_spe | 5 + boards/kws/pico_spe/Kconfig:Zone.Identifier | 0 boards/kws/pico_spe/board.cmake | 36 +++ boards/kws/pico_spe/board.yml | 6 + boards/kws/pico_spe/doc/img/pico_spe.webp | Bin 0 -> 24890 bytes boards/kws/pico_spe/doc/index.rst | 285 ++++++++++++++++++++ boards/kws/pico_spe/pico_spe-pinctrl.dtsi | 67 +++++ boards/kws/pico_spe/pico_spe.dts | 218 +++++++++++++++ boards/kws/pico_spe/pico_spe.yaml | 23 ++ boards/kws/pico_spe/pico_spe_defconfig | 11 + boards/kws/pico_spe/support/openocd.cfg | 11 + 14 files changed, 711 insertions(+) create mode 100644 boards/kws/index.rst create mode 100644 boards/kws/pico_spe/Kconfig create mode 100644 boards/kws/pico_spe/Kconfig.defconfig create mode 100644 boards/kws/pico_spe/Kconfig.pico_spe create mode 100644 boards/kws/pico_spe/Kconfig:Zone.Identifier create mode 100644 boards/kws/pico_spe/board.cmake create mode 100644 boards/kws/pico_spe/board.yml create mode 100644 boards/kws/pico_spe/doc/img/pico_spe.webp create mode 100644 boards/kws/pico_spe/doc/index.rst create mode 100644 boards/kws/pico_spe/pico_spe-pinctrl.dtsi create mode 100644 boards/kws/pico_spe/pico_spe.dts create mode 100644 boards/kws/pico_spe/pico_spe.yaml create mode 100644 boards/kws/pico_spe/pico_spe_defconfig create mode 100644 boards/kws/pico_spe/support/openocd.cfg diff --git a/boards/kws/index.rst b/boards/kws/index.rst new file mode 100644 index 0000000000000..0f8fc102b9457 --- /dev/null +++ b/boards/kws/index.rst @@ -0,0 +1,10 @@ +.. _boards-kws: + +KWS Computersysteme Gmbh +######################## + +.. toctree:: + :maxdepth: 1 + :glob: + + **/* diff --git a/boards/kws/pico_spe/Kconfig b/boards/kws/pico_spe/Kconfig new file mode 100644 index 0000000000000..e1a877543e64a --- /dev/null +++ b/boards/kws/pico_spe/Kconfig @@ -0,0 +1,5 @@ +# Copyright (c) 2024 KWS Computersysteme Gmbh +# SPDX-License-Identifier: Apache-2.0 + +config BOARD_PICO_SPE + select RP2_FLASH_W25Q080 diff --git a/boards/kws/pico_spe/Kconfig.defconfig b/boards/kws/pico_spe/Kconfig.defconfig new file mode 100644 index 0000000000000..4f5d509016333 --- /dev/null +++ b/boards/kws/pico_spe/Kconfig.defconfig @@ -0,0 +1,34 @@ +# Copyright (c) 2024 KWS Computersysteme Gmbh +# SPDX-License-Identifier: Apache-2.0 + +if BOARD_PICO_SPE + +if I2C_DW + +config I2C_DW_CLOCK_SPEED + default 125 + +endif # I2C_DW + +config USB_SELF_POWERED + default n + +config PHY_INIT_PRIORITY + default 82 + depends on NET_L2_ETHERNET && ETH_DRIVER + +if NETWORKING + +config NET_L2_ETHERNET + default y + +if ETH_LAN865X + +config NET_IF_MAX_IPV4_COUNT + default 2 + +endif # ETH_LAN865X + +endif # NETWORKING + +endif # BOARD_PICO_SPE diff --git a/boards/kws/pico_spe/Kconfig.pico_spe b/boards/kws/pico_spe/Kconfig.pico_spe new file mode 100644 index 0000000000000..1ecb279b3f66e --- /dev/null +++ b/boards/kws/pico_spe/Kconfig.pico_spe @@ -0,0 +1,5 @@ +# Copyright (c) 2024 KWS Computersysteme Gmbh +# SPDX-License-Identifier: Apache-2.0 + +config BOARD_PICO_SPE + select SOC_RP2040 diff --git a/boards/kws/pico_spe/Kconfig:Zone.Identifier b/boards/kws/pico_spe/Kconfig:Zone.Identifier new file mode 100644 index 0000000000000..e69de29bb2d1d diff --git a/boards/kws/pico_spe/board.cmake b/boards/kws/pico_spe/board.cmake new file mode 100644 index 0000000000000..ff6f71a2c50af --- /dev/null +++ b/boards/kws/pico_spe/board.cmake @@ -0,0 +1,36 @@ +# SPDX-License-Identifier: Apache-2.0 + +# This configuration allows selecting what debug adapter debugging Pico-SPE +# by a command-line argument. +# It is mainly intended to support both the 'picoprobe' and 'raspberrypi-swd' +# adapter described in "Getting started with Raspberry Pi Pico". +# And any other SWD debug adapter might also be usable with this configuration. + +# Set RPI_PICO_DEBUG_ADAPTER to select debug adapter by command-line arguments. +# e.g.) west build -b pico_spe -- -DRPI_PICO_DEBUG_ADAPTER=raspberrypi-swd +# The value is treated as a part of an interface file name that +# the debugger's configuration file. +# The value must be the 'stem' part of the name of one of the files +# in the openocd interface configuration file. +# The setting is store to CMakeCache.txt. +if("${RPI_PICO_DEBUG_ADAPTER}" STREQUAL "") + set(RPI_PICO_DEBUG_ADAPTER "cmsis-dap") +endif() + +board_runner_args(openocd --cmd-pre-init "source [find interface/${RPI_PICO_DEBUG_ADAPTER}.cfg]") +board_runner_args(openocd --cmd-pre-init "transport select swd") +board_runner_args(openocd --cmd-pre-init "source [find target/rp2040.cfg]") + +# The adapter speed is expected to be set by interface configuration. +# But if not so, set 2000 to adapter speed. +board_runner_args(openocd --cmd-pre-init "set_adapter_speed_if_not_set 2000") + +board_runner_args(jlink "--device=RP2040_M0_0") +board_runner_args(uf2 "--board-id=RPI-RP2") +board_runner_args(pyocd "--target=rp2040") + +include(${ZEPHYR_BASE}/boards/common/openocd.board.cmake) +include(${ZEPHYR_BASE}/boards/common/jlink.board.cmake) +include(${ZEPHYR_BASE}/boards/common/uf2.board.cmake) +include(${ZEPHYR_BASE}/boards/common/blackmagicprobe.board.cmake) +include(${ZEPHYR_BASE}/boards/common/pyocd.board.cmake) \ No newline at end of file diff --git a/boards/kws/pico_spe/board.yml b/boards/kws/pico_spe/board.yml new file mode 100644 index 0000000000000..5d80b878c0b30 --- /dev/null +++ b/boards/kws/pico_spe/board.yml @@ -0,0 +1,6 @@ +board: + name: pico_spe + full_name: Pico-SPE + vendor: kws + socs: + - name: rp2040 diff --git a/boards/kws/pico_spe/doc/img/pico_spe.webp b/boards/kws/pico_spe/doc/img/pico_spe.webp new file mode 100644 index 0000000000000000000000000000000000000000..00e143500b49cb5e0710f780f6416ab5275b5276 GIT binary patch literal 24890 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 P000000000000000flM%1 literal 0 HcmV?d00001 diff --git a/boards/kws/pico_spe/doc/index.rst b/boards/kws/pico_spe/doc/index.rst new file mode 100644 index 0000000000000..f542cafa35e74 --- /dev/null +++ b/boards/kws/pico_spe/doc/index.rst @@ -0,0 +1,285 @@ +.. zephyr:board:: pico_spe + +Overview +******** + +The Pico-SPE is a small, low-cost, versatile boards from +KWS Computersysteme Gmbh. They are equipped with an RP2040 SoC, an on-board LED, +a USB connector, an SWD interface. The Pico-SPE additionally contains an +Microchip LAN8651 10Base-T1S module. The USB bootloader allows the +ability to flash without any adapter, in a drag-and-drop manner. +It is also possible to flash and debug the boards with their SWD interface, +using an external adapter. + +Hardware +******** +- Dual core Arm Cortex-M0+ processor running up to 133MHz +- 264KB on-chip SRAM +- 16MB on-board QSPI flash with XIP capabilities +- 16 GPIO pins +- 3 Analog inputs +- 2 UART peripherals +- 2 I2C controllers +- 16 PWM channels +- USB 1.1 controller (host/device) +- 8 Programmable I/O (PIO) for custom peripherals +- On-board LED +- 1 Watchdog timer peripheral +- Microchip LAN8651 10Base-T1S + +Supported Features +================== + +The ``pico_spe`` board target supports the following +hardware features: + +.. list-table:: + :header-rows: 1 + + * - Peripheral + - Kconfig option + - Devicetree compatible + * - NVIC + - N/A + - :dtcompatible:`arm,v6m-nvic` + * - UART + - :kconfig:option:`CONFIG_SERIAL` + - :dtcompatible:`raspberrypi,pico-uart` + * - GPIO + - :kconfig:option:`CONFIG_GPIO` + - :dtcompatible:`raspberrypi,pico-gpio` + * - ADC + - :kconfig:option:`CONFIG_ADC` + - :dtcompatible:`raspberrypi,pico-adc` + * - I2C + - :kconfig:option:`CONFIG_I2C` + - :dtcompatible:`snps,designware-i2c` + * - SPI + - :kconfig:option:`CONFIG_SPI` + - :dtcompatible:`raspberrypi,pico-spi` + * - USB Device + - :kconfig:option:`CONFIG_USB_DEVICE_STACK` + - :dtcompatible:`raspberrypi,pico-usbd` + * - HWINFO + - :kconfig:option:`CONFIG_HWINFO` + - N/A + * - Watchdog Timer (WDT) + - :kconfig:option:`CONFIG_WATCHDOG` + - :dtcompatible:`raspberrypi,pico-watchdog` + * - PWM + - :kconfig:option:`CONFIG_PWM` + - :dtcompatible:`raspberrypi,pico-pwm` + * - Flash + - :kconfig:option:`CONFIG_FLASH` + - :dtcompatible:`raspberrypi,pico-flash` + * - Clock controller + - :kconfig:option:`CONFIG_CLOCK_CONTROL` + - :dtcompatible:`raspberrypi,pico-clock-controller` + * - UART (PIO) + - :kconfig:option:`CONFIG_SERIAL` + - :dtcompatible:`raspberrypi,pico-uart-pio` + * - SPI (PIO) + - :kconfig:option:`CONFIG_SPI` + - :dtcompatible:`raspberrypi,pico-spi-pio` + * - LAN8651 Single Pair Ethernet + - :kconfig:option:`CONFIG_NETWORKING` + - :dtcompatible:`microchip,lan865x` + +Pin Mapping +=========== + +The peripherals of the RP2040 SoC can be routed to various pins on the board. +The configuration of these routes can be modified through DTS. Please refer to +the datasheet to see the possible routings for each peripheral. + +External pin mapping on the Pico-SPE is identical to the Pico, but note that internal +RP2040 GPIO lines 10, 11, 12, 13, 20, 21 are routed to the Microchip LAN8651 on the +Pico-SPE. + +Default Zephyr Peripheral Mapping: +---------------------------------- + +.. rst-class:: rst-columns + +- UART0_TX : P0 +- UART0_RX : P1 +- I2C0_SDA : P4 +- I2C0_SCL : P5 +- I2C1_SDA : P6 +- I2C1_SCL : P7 +- ADC_CH0 : P26 +- ADC_CH1 : P27 +- ADC_CH2 : P28 + +Programmable I/O (PIO) +********************** +The RP2040 SoC comes with two PIO periherals. These are two simple +co-processors that are designed for I/O operations. The PIOs run +a custom instruction set, generated from a custom assembly language. +PIO programs are assembled using :command:`pioasm`, a tool provided by Raspberry Pi. + +Zephyr does not (currently) assemble PIO programs. Rather, they should be +manually assembled and embedded in source code. An example of how this is done +can be found at :zephyr_file:`drivers/serial/uart_rpi_pico_pio.c`. + +Sample: SPI via PIO +==================== + +The :zephyr:code-sample:`bme280` sample includes a +demonstration of using the PIO SPI driver to communicate with an +environmental sensor. The PIO SPI driver supports using any +combination of GPIO pins for an SPI bus, as well as allowing up to +four independent SPI buses on a single board (using the two SPI +devices as well as both PIO devices). + +Programming and Debugging +************************* + +Flashing +======== + +Using SEGGER JLink +------------------ + +You can Flash the pico_spe with a SEGGER JLink debug probe as described in +:ref:`Building, Flashing and Debugging `. + +Here is an example of building and flashing the :zephyr:code-sample:`blinky` application. + +.. zephyr-app-commands:: + :zephyr-app: samples/basic/blinky + :board: pico_spe + :goals: build + +.. code-block:: bash + + west flash --runner jlink + +Using OpenOCD +------------- + +To use CMSIS-DAP, you must configure **udev**. + +Create a file in /etc/udev.rules.d with any name, and write the line below. + +.. code-block:: bash + + ATTRS{idVendor}=="2e8a", ATTRS{idProduct}=="000c", MODE="660", GROUP="plugdev", TAG+="uaccess" + +This example is valid for the case that the user joins to ``plugdev`` groups. + +The Pico-SPE has an SWD interface that can be used to program +and debug the on board RP2040. This interface can be utilized by OpenOCD. +To use it with the RP2040, OpenOCD version 0.12.0 or later is needed. + +If you are using a Debian based system (including RaspberryPi OS, Ubuntu. and more), +using the `pico_setup.sh`_ script is a convenient way to set up the forked version of OpenOCD. + +Depending on the interface used (such as JLink), you might need to +checkout to a branch that supports this interface, before proceeding. +Build and install OpenOCD as described in the README. + +Here is an example of building and flashing the :zephyr:code-sample:`blinky` application. + +.. zephyr-app-commands:: + :zephyr-app: samples/basic/blinky + :board: pico_spe + :goals: build flash + :gen-args: -DOPENOCD=/usr/local/bin/openocd -DOPENOCD_DEFAULT_PATH=/usr/local/share/openocd/scripts -DRPI_PICO_DEBUG_ADAPTER=cmsis-dap + +Set the environment variables **OPENOCD** to :file:`/usr/local/bin/openocd` +and **OPENOCD_DEFAULT_PATH** to :file:`/usr/local/share/openocd/scripts`. This should work +with the OpenOCD that was installed with the default configuration. +This configuration also works with an environment that is set up by the `pico_setup.sh`_ script. + +**RPI_PICO_DEBUG_ADAPTER** specifies what debug adapter is used for debugging. + +If **RPI_PICO_DEBUG_ADAPTER** was not assigned, ``cmsis-dap`` is used by default. +The other supported adapters are ``raspberrypi-swd``, ``jlink`` and ``blackmagicprobe``. +How to connect ``cmsis-dap`` and ``raspberrypi-swd`` is described in `Getting Started with Pico-SPE`_. +Any other SWD debug adapter maybe also work with this configuration. + +The value of **RPI_PICO_DEBUG_ADAPTER** is cached, so it can be omitted from +``west flash`` and ``west debug`` if it was previously set while running +``west build``. + +**RPI_PICO_DEBUG_ADAPTER** is used in an argument to OpenOCD as ``"source [find interface/${RPI_PICO_DEBUG_ADAPTER}.cfg]"``. +Thus, **RPI_PICO_DEBUG_ADAPTER** needs to be assigned the file name of the debug adapter. + +You can also flash the board with the following +command that directly calls OpenOCD (assuming a SEGGER JLink adapter is used): + +.. code-block:: console + + $ openocd -f interface/jlink.cfg -c 'transport select swd' -f target/rp2040.cfg -c "adapter speed 2000" -c 'targets rp2040.core0' -c 'program path/to/zephyr.elf verify reset exit' + +Using UF2 +--------- + +If you don't have an SWD adapter, you can flash the Pico-SPE with +a UF2 file. By default, building an app for this board will generate a +:file:`build/zephyr/zephyr.uf2` file. If the Pico is powered on with the ``BOOTSEL`` +button pressed, it will appear on the host as a mass storage device. The +UF2 file should be drag-and-dropped to the device, which will flash the Pico. + +Debugging +========= + +The SWD interface can also be used to debug the board. To achieve this, you can +either use SEGGER JLink or OpenOCD. + +Using SEGGER JLink +------------------ + +Use a SEGGER JLink debug probe and follow the instruction in +:ref:`Building, Flashing and Debugging`. + + +Using OpenOCD +------------- + +Install OpenOCD as described for flashing the board. + +Here is an example for debugging the :zephyr:code-sample:`blinky` application. + +.. zephyr-app-commands:: + :zephyr-app: samples/basic/blinky + :board: pico_spe + :maybe-skip-config: + :goals: debug + :gen-args: -DOPENOCD=/usr/local/bin/openocd -DOPENOCD_DEFAULT_PATH=/usr/local/share/openocd/scripts -DRPI_PICO_DEBUG_ADAPTER=raspberrypi-swd + +As with flashing, you can specify the debug adapter by specifying **RPI_PICO_DEBUG_ADAPTER** +at ``west build`` time. No needs to specify it at ``west debug`` time. + +You can also debug with OpenOCD and gdb launching from command-line. +Run the following command: + +.. code-block:: console + + $ openocd -f interface/jlink.cfg -c 'transport select swd' -f target/rp2040.cfg -c "adapter speed 2000" -c 'targets rp2040.core0' + +On another terminal, run: + +.. code-block:: console + + $ gdb-multiarch + +Inside gdb, run: + +.. code-block:: console + + (gdb) tar ext :3333 + (gdb) file path/to/zephyr.elf + +You can then start debugging the board. + +.. target-notes:: +.. _pico_setup.sh: + https://raw.githubusercontent.com/raspberrypi/pico-setup/master/pico_setup.sh + +.. _Getting Started with Pico-SPE: + https://kws-computer.de/go/pico-spe-getting-started + +.. _Pico-SPE Documentation: + https://kws-computer.de/go/pico-spe-datasheet diff --git a/boards/kws/pico_spe/pico_spe-pinctrl.dtsi b/boards/kws/pico_spe/pico_spe-pinctrl.dtsi new file mode 100644 index 0000000000000..972ef31bb7236 --- /dev/null +++ b/boards/kws/pico_spe/pico_spe-pinctrl.dtsi @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2024 KWS Computersysteme Gmbh + * SPDX-License-Identifier: Apache-2.0 + */ + +#include + +&pinctrl { + uart0_default: uart0_default { + group1 { + pinmux = ; + }; + group2 { + pinmux = ; + input-enable; + }; + }; + + i2c0_default: i2c0_default { + group1 { + pinmux = , ; + input-enable; + input-schmitt-enable; + }; + }; + + i2c1_default: i2c1_default { + group1 { + pinmux = , ; + input-enable; + input-schmitt-enable; + }; + }; + + spi0_default: spi0_default { + group1 { + pinmux = , , ; + }; + group2 { + pinmux = ; + input-enable; + }; + }; + + spi1_default: spi1_default { + group1 { + pinmux = , , ; + }; + group2 { + pinmux = ; + input-enable; + }; + }; + + pwm_ch4b_default: pwm_ch4b_default { + group1 { + pinmux = ; + }; + }; + + adc_default: adc_default { + group1 { + pinmux = , , , ; + input-enable; + }; + }; +}; diff --git a/boards/kws/pico_spe/pico_spe.dts b/boards/kws/pico_spe/pico_spe.dts new file mode 100644 index 0000000000000..972f1e0cea43f --- /dev/null +++ b/boards/kws/pico_spe/pico_spe.dts @@ -0,0 +1,218 @@ +/* + * Copyright (c) 2024 KWS Computersysteme Gmbh + * + * SPDX-License-Identifier: Apache-2.0 + */ + +/dts-v1/; + +#include + +#include +#include "pico_spe-pinctrl.dtsi" +#include + +#include + +#include + +/ { + chosen { + zephyr,sram = &sram0; + zephyr,flash = &flash0; + zephyr,flash-controller = &ssi; + zephyr,console = &uart0; + zephyr,shell-uart = &uart0; + zephyr,code-partition = &code_partition; + }; + + leds { + compatible = "gpio-leds"; + led0: led_0 { + gpios = <&gpio0 25 GPIO_ACTIVE_HIGH>; + label = "LED"; + }; + red1: red_p1 { + gpios = <&gpio0 2 GPIO_ACTIVE_HIGH>; + label = "RED_P1"; + }; + + yellow2: yel_p2 { + gpios = <&gpio0 3 GPIO_ACTIVE_HIGH>; + label = "YEL_P2"; + }; + + green3: gre_p3 { + gpios = <&gpio0 4 GPIO_ACTIVE_HIGH>; + label = "GRE_P3"; + }; + }; + + pwm_leds { + compatible = "pwm-leds"; + status = "disabled"; + pwm_led0: pwm_led_0 { + pwms = <&pwm 9 PWM_MSEC(20) PWM_POLARITY_NORMAL>; + label = "PWM_LED"; + }; + }; + + aliases { + led0 = &led0; + red = &red1; + yellow = &yellow2; + green = &green3; + pwm-led0 = &pwm_led0; + rtc = &rtc; + watchdog0 = &wdt0; + }; + + pico_header: connector { + compatible = "raspberrypi,pico-header"; + #gpio-cells = <2>; + gpio-map-mask = <0xffffffff 0xffffffc0>; + gpio-map-pass-thru = <0 0x3f>; + gpio-map = <0 0 &gpio0 0 0>, /* GP0 */ + <1 0 &gpio0 1 0>, /* GP1 */ + <2 0 &gpio0 2 0>, /* GP2 */ + <3 0 &gpio0 3 0>, /* GP3 */ + <4 0 &gpio0 4 0>, /* GP4 */ + <5 0 &gpio0 5 0>, /* GP5 */ + <6 0 &gpio0 6 0>, /* GP6 */ + <7 0 &gpio0 7 0>, /* GP7 */ + <8 0 &gpio0 8 0>, /* GP8 */ + <9 0 &gpio0 9 0>, /* GP9 */ + <10 0 &gpio0 10 0>, /* GP10 */ + <11 0 &gpio0 11 0>, /* GP11 */ + <12 0 &gpio0 12 0>, /* GP12 */ + <13 0 &gpio0 13 0>, /* GP13 */ + <14 0 &gpio0 14 0>, /* GP14 */ + <15 0 &gpio0 15 0>, /* GP15 */ + <16 0 &gpio0 16 0>, /* GP16 */ + <17 0 &gpio0 17 0>, /* GP17 */ + <18 0 &gpio0 18 0>, /* GP18 */ + <19 0 &gpio0 19 0>, /* GP19 */ + <20 0 &gpio0 20 0>, /* GP20 */ + <21 0 &gpio0 21 0>, /* GP21 */ + <22 0 &gpio0 22 0>, /* GP22 */ + <26 0 &gpio0 26 0>, /* GP26 */ + <27 0 &gpio0 27 0>, /* GP27 */ + <28 0 &gpio0 28 0>; /* GP28 */ + }; +}; + +&flash0 { + reg = <0x10000000 DT_SIZE_M(2)>; + + 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 2MB minus the 0x100 bytes taken by the bootloader. + */ + code_partition: partition@100 { + label = "code-partition"; + reg = <0x100 (DT_SIZE_M(2) - 0x100)>; + read-only; + }; + }; +}; + +&uart0 { + current-speed = <115200>; + status = "okay"; + pinctrl-0 = <&uart0_default>; + pinctrl-names = "default"; +}; + +&gpio0 { + status = "okay"; +}; + +&i2c0 { + clock-frequency = ; + status = "okay"; + pinctrl-0 = <&i2c0_default>; + pinctrl-names = "default"; +}; + +&i2c1 { + pinctrl-0 = <&i2c1_default>; + pinctrl-names = "default"; + status = "disabled"; + clock-frequency = ; +}; + +&spi1 { + clock-frequency = ; + status = "okay"; + pinctrl-0 = <&spi1_default>; + pinctrl-names = "default"; + cs-gpios = <&pico_header 13 GPIO_ACTIVE_LOW>; + + lan8651: lan865x@0 { + compatible = "microchip,lan865x"; + reg = <0x0>; + spi-max-frequency = ; + int-gpios = <&gpio0 21 (GPIO_ACTIVE_LOW)>; + rst-gpios = <&gpio0 20 GPIO_ACTIVE_LOW>; + status = "okay"; + + plca-enable; + plca-node-id = <1>; + plca-node-count = <8>; + plca-burst-count = <0x0>; + plca-burst-timer = <0x80>; + plca-to-timer = <0x20>; + + local-mac-address = [ CA 2F B7 10 23 75]; + }; +}; + +&timer { + status = "okay"; +}; + +&wdt0 { + status = "okay"; +}; + +&rtc { + clocks = <&clocks RPI_PICO_CLKID_CLK_RTC>; + status = "okay"; +}; + +&adc { + status = "okay"; + pinctrl-0 = <&adc_default>; + pinctrl-names = "default"; +}; + +zephyr_udc0: &usbd { + status = "okay"; +}; + +&pwm { + pinctrl-0 = <&pwm_ch4b_default>; + pinctrl-names = "default"; +}; + +&vreg { + regulator-always-on; + regulator-allowed-modes = ; +}; + +pico_spi: &spi1 {}; +pico_i2c0: &i2c0 {}; +pico_i2c1: &i2c1 {}; +pico_serial: &uart0 {}; diff --git a/boards/kws/pico_spe/pico_spe.yaml b/boards/kws/pico_spe/pico_spe.yaml new file mode 100644 index 0000000000000..c0b383270f571 --- /dev/null +++ b/boards/kws/pico_spe/pico_spe.yaml @@ -0,0 +1,23 @@ +identifier: pico_spe +name: KWS Pico SinglePairEthernet +type: mcu +arch: arm +flash: 2048 +ram: 264 +toolchain: + - zephyr + - gnuarmemb + - xtools +supported: + - uart + - gpio + - adc + - i2c + - spi + - hwinfo + - watchdog + - pwm + - flash + - dma + - counter + - clock diff --git a/boards/kws/pico_spe/pico_spe_defconfig b/boards/kws/pico_spe/pico_spe_defconfig new file mode 100644 index 0000000000000..df003531af9c8 --- /dev/null +++ b/boards/kws/pico_spe/pico_spe_defconfig @@ -0,0 +1,11 @@ +CONFIG_SYS_CLOCK_HW_CYCLES_PER_SEC=125000000 +CONFIG_SERIAL=y +CONFIG_CONSOLE=y +CONFIG_UART_CONSOLE=y +CONFIG_GPIO=y +CONFIG_USE_DT_CODE_PARTITION=y +CONFIG_BUILD_OUTPUT_UF2=y +CONFIG_BUILD_OUTPUT_HEX=y +CONFIG_UART_INTERRUPT_DRIVEN=y +CONFIG_RESET=y +CONFIG_CLOCK_CONTROL=y diff --git a/boards/kws/pico_spe/support/openocd.cfg b/boards/kws/pico_spe/support/openocd.cfg new file mode 100644 index 0000000000000..34ab592b1861d --- /dev/null +++ b/boards/kws/pico_spe/support/openocd.cfg @@ -0,0 +1,11 @@ +# Copyright (c) 2022 Tokita, Hiroshi +# SPDX-License-Identifier: Apache-2.0 + +# Checking and set 'adapter speed'. +# Set the adaptor speed, if unset, and given as an argument. +proc set_adapter_speed_if_not_set { speed } { + puts "checking adapter speed..." + if { [catch {adapter speed} ret] } { + adapter speed $speed + } +} From 0fa57c42b63d58d615195b2c569afc3c0af649e5 Mon Sep 17 00:00:00 2001 From: Frank Bintakies Date: Fri, 6 Dec 2024 08:56:04 +0100 Subject: [PATCH 7/8] boards: pico_spe: add adc test support add adc test support Signed-off-by: Frank Bintakies --- .../adc/adc_api/boards/pico_spe.overlay | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 tests/drivers/adc/adc_api/boards/pico_spe.overlay diff --git a/tests/drivers/adc/adc_api/boards/pico_spe.overlay b/tests/drivers/adc/adc_api/boards/pico_spe.overlay new file mode 100644 index 0000000000000..a2a8bc205dd1c --- /dev/null +++ b/tests/drivers/adc/adc_api/boards/pico_spe.overlay @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2024 KWS Computersysteme Gmbh + * + * SPDX-License-Identifier: Apache-2.0 + */ + +/ { + zephyr,user { + io-channels = <&adc 0>, <&adc 1>; + }; +}; + +&adc { + #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>; + }; +}; From 690b60db468d631caa9934939e32fa2bf3d98dc9 Mon Sep 17 00:00:00 2001 From: Frank Bintakies Date: Fri, 6 Dec 2024 08:59:55 +0100 Subject: [PATCH 8/8] remove of wrong file --- boards/kws/pico_spe/Kconfig:Zone.Identifier | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 boards/kws/pico_spe/Kconfig:Zone.Identifier diff --git a/boards/kws/pico_spe/Kconfig:Zone.Identifier b/boards/kws/pico_spe/Kconfig:Zone.Identifier deleted file mode 100644 index e69de29bb2d1d..0000000000000