From 9d91411beb762f19984c57d7ddb2ace5f913b6d7 Mon Sep 17 00:00:00 2001 From: Stanley Huang Date: Wed, 23 Apr 2025 09:54:31 +0800 Subject: [PATCH] boards: raytac: Add support for raytac_mdbt50q_cx_40_dongle Add support for Raytac's new TYPE-C dongle. Signed-off-by: Stanley Huang --- .../mdbt50q_cx_40_dongle/CMakeLists.txt | 4 + boards/raytac/mdbt50q_cx_40_dongle/Kconfig | 16 + .../mdbt50q_cx_40_dongle/Kconfig.defconfig | 27 ++ .../Kconfig.raytac_mdbt50q_cx_40_dongle | 8 + boards/raytac/mdbt50q_cx_40_dongle/board.c | 46 +++ .../raytac/mdbt50q_cx_40_dongle/board.cmake | 9 + boards/raytac/mdbt50q_cx_40_dongle/board.yml | 6 + .../doc/img/MDBT50Q-CX-40.webp | Bin 0 -> 8452 bytes ...aytac_mdbt50q_cx_40_dongle_button_led.webp | Bin 0 -> 14928 bytes .../raytac/mdbt50q_cx_40_dongle/doc/index.rst | 334 ++++++++++++++++++ .../mdbt50q_cx_40_dongle/fstab-debugger.dtsi | 38 ++ .../mdbt50q_cx_40_dongle/fstab-stock.dtsi | 47 +++ .../mdbt50q_cx_40_dongle/pre_dt_board.cmake | 7 + ...mdbt50q_cx_40_dongle_nrf52840-pinctrl.dtsi | 46 +++ .../raytac_mdbt50q_cx_40_dongle_nrf52840.dts | 133 +++++++ .../raytac_mdbt50q_cx_40_dongle_nrf52840.yaml | 23 ++ ...ac_mdbt50q_cx_40_dongle_nrf52840_defconfig | 16 + 17 files changed, 760 insertions(+) create mode 100644 boards/raytac/mdbt50q_cx_40_dongle/CMakeLists.txt create mode 100644 boards/raytac/mdbt50q_cx_40_dongle/Kconfig create mode 100644 boards/raytac/mdbt50q_cx_40_dongle/Kconfig.defconfig create mode 100644 boards/raytac/mdbt50q_cx_40_dongle/Kconfig.raytac_mdbt50q_cx_40_dongle create mode 100644 boards/raytac/mdbt50q_cx_40_dongle/board.c create mode 100644 boards/raytac/mdbt50q_cx_40_dongle/board.cmake create mode 100644 boards/raytac/mdbt50q_cx_40_dongle/board.yml create mode 100644 boards/raytac/mdbt50q_cx_40_dongle/doc/img/MDBT50Q-CX-40.webp create mode 100644 boards/raytac/mdbt50q_cx_40_dongle/doc/img/raytac_mdbt50q_cx_40_dongle_button_led.webp create mode 100644 boards/raytac/mdbt50q_cx_40_dongle/doc/index.rst create mode 100644 boards/raytac/mdbt50q_cx_40_dongle/fstab-debugger.dtsi create mode 100644 boards/raytac/mdbt50q_cx_40_dongle/fstab-stock.dtsi create mode 100644 boards/raytac/mdbt50q_cx_40_dongle/pre_dt_board.cmake create mode 100644 boards/raytac/mdbt50q_cx_40_dongle/raytac_mdbt50q_cx_40_dongle_nrf52840-pinctrl.dtsi create mode 100644 boards/raytac/mdbt50q_cx_40_dongle/raytac_mdbt50q_cx_40_dongle_nrf52840.dts create mode 100644 boards/raytac/mdbt50q_cx_40_dongle/raytac_mdbt50q_cx_40_dongle_nrf52840.yaml create mode 100644 boards/raytac/mdbt50q_cx_40_dongle/raytac_mdbt50q_cx_40_dongle_nrf52840_defconfig diff --git a/boards/raytac/mdbt50q_cx_40_dongle/CMakeLists.txt b/boards/raytac/mdbt50q_cx_40_dongle/CMakeLists.txt new file mode 100644 index 000000000000..218a0602483a --- /dev/null +++ b/boards/raytac/mdbt50q_cx_40_dongle/CMakeLists.txt @@ -0,0 +1,4 @@ +# SPDX-License-Identifier: Apache-2.0 + +zephyr_library() +zephyr_library_sources(board.c) diff --git a/boards/raytac/mdbt50q_cx_40_dongle/Kconfig b/boards/raytac/mdbt50q_cx_40_dongle/Kconfig new file mode 100644 index 000000000000..36da7f834a60 --- /dev/null +++ b/boards/raytac/mdbt50q_cx_40_dongle/Kconfig @@ -0,0 +1,16 @@ +# Raytac MDBT50Q-CX Dongle NRF52840 board configuration +# +# Copyright (c) 2018-2023 Nordic Semiconductor ASA +# Copyright (c) 2025 Raytac Corporation. +# SPDX-License-Identifier: Apache-2.0 + +if BOARD_RAYTAC_MDBT50Q_CX_40_DONGLE + +config BOARD_HAS_NRF5_BOOTLOADER + bool "Board has nRF5 bootloader" + default y + help + If selected, applications are linked so that they can be loaded by Nordic + nRF5 bootloader. + +endif # BOARD_RAYTAC_MDBT50Q_CX_40_DONGLE diff --git a/boards/raytac/mdbt50q_cx_40_dongle/Kconfig.defconfig b/boards/raytac/mdbt50q_cx_40_dongle/Kconfig.defconfig new file mode 100644 index 000000000000..ddfe9b77256e --- /dev/null +++ b/boards/raytac/mdbt50q_cx_40_dongle/Kconfig.defconfig @@ -0,0 +1,27 @@ +# Raytac MDBT50Q-CX-40 Dongle NRF52840 board configuration +# +# Copyright (c) 2018-2023 Nordic Semiconductor ASA +# Copyright (c) 2025 Raytac Corporation +# SPDX-License-Identifier: Apache-2.0 + +if BOARD_RAYTAC_MDBT50Q_CX_40_DONGLE + +# To let the nRF5 bootloader load an application, the application +# must be linked after Nordic MBR, that is factory-programmed on the board. + +# Nordic nRF5 bootloader exists outside of the partitions specified in the +# DTS file, so we manually override FLASH_LOAD_OFFSET to link the application +# correctly, after Nordic MBR. + +# When building MCUBoot, MCUBoot itself will select USE_DT_CODE_PARTITION +# which will make it link into the correct partition specified in DTS file, +# the offset is applied here so that the full partition size can be used when +# the bootloader Kconfig option has been disabled. + +config FLASH_LOAD_OFFSET + default 0x1000 + depends on BOARD_HAS_NRF5_BOOTLOADER && (MCUBOOT || !USE_DT_CODE_PARTITION) + +source "boards/common/usb/Kconfig.cdc_acm_serial.defconfig" + +endif # BOARD_RAYTAC_MDBT50Q_CX_40_DONGLE diff --git a/boards/raytac/mdbt50q_cx_40_dongle/Kconfig.raytac_mdbt50q_cx_40_dongle b/boards/raytac/mdbt50q_cx_40_dongle/Kconfig.raytac_mdbt50q_cx_40_dongle new file mode 100644 index 000000000000..416aa75a1b51 --- /dev/null +++ b/boards/raytac/mdbt50q_cx_40_dongle/Kconfig.raytac_mdbt50q_cx_40_dongle @@ -0,0 +1,8 @@ +# Raytac MDBT50Q-CX-40 Dongle nRF52840 board configuration +# +# Copyright (c) 2018 Nordic Semiconductor ASA +# Copyright (c) 2025 Raytac Corporation +# SPDX-License-Identifier: Apache-2.0 + +config BOARD_RAYTAC_MDBT50Q_CX_40_DONGLE + select SOC_NRF52840_QIAA diff --git a/boards/raytac/mdbt50q_cx_40_dongle/board.c b/boards/raytac/mdbt50q_cx_40_dongle/board.c new file mode 100644 index 000000000000..8e2ea3a6020e --- /dev/null +++ b/boards/raytac/mdbt50q_cx_40_dongle/board.c @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2018 Nordic Semiconductor ASA. + * Copyright (c) 2025 Raytac Corporation. + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include + +static int board_raytac_mdbt50q_cx_40_dongle_nrf52840_init(void) +{ + + /* if the nrf52840dongle_nrf52840 board is powered from USB + * (high voltage mode), GPIO output voltage is set to 1.8 volts by + * default and that is not enough to turn the green and blue LEDs on. + * Increase GPIO voltage to 3.0 volts. + */ + if ((nrf_power_mainregstatus_get(NRF_POWER) == + NRF_POWER_MAINREGSTATUS_HIGH) && + ((NRF_UICR->REGOUT0 & UICR_REGOUT0_VOUT_Msk) == + (UICR_REGOUT0_VOUT_DEFAULT << UICR_REGOUT0_VOUT_Pos))) { + + NRF_NVMC->CONFIG = NVMC_CONFIG_WEN_Wen << NVMC_CONFIG_WEN_Pos; + while (NRF_NVMC->READY == NVMC_READY_READY_Busy) { + ; + } + + NRF_UICR->REGOUT0 = + (NRF_UICR->REGOUT0 & ~((uint32_t)UICR_REGOUT0_VOUT_Msk)) | + (UICR_REGOUT0_VOUT_3V0 << UICR_REGOUT0_VOUT_Pos); + + NRF_NVMC->CONFIG = NVMC_CONFIG_WEN_Ren << NVMC_CONFIG_WEN_Pos; + while (NRF_NVMC->READY == NVMC_READY_READY_Busy) { + ; + } + + /* a reset is required for changes to take effect */ + NVIC_SystemReset(); + } + + return 0; +} + +SYS_INIT(board_raytac_mdbt50q_cx_40_dongle_nrf52840_init, PRE_KERNEL_1, + CONFIG_KERNEL_INIT_PRIORITY_DEFAULT); diff --git a/boards/raytac/mdbt50q_cx_40_dongle/board.cmake b/boards/raytac/mdbt50q_cx_40_dongle/board.cmake new file mode 100644 index 000000000000..b052a8936bf3 --- /dev/null +++ b/boards/raytac/mdbt50q_cx_40_dongle/board.cmake @@ -0,0 +1,9 @@ +# Copyright (c) 2018-2023 Nordic Semiconductor ASA +# SPDX-License-Identifier: Apache-2.0 + +board_runner_args(jlink "--device=nrf52840_xxaa" "--speed=4000") +board_runner_args(pyocd "--target=nrf52840" "--frequency=4000000") +include(${ZEPHYR_BASE}/boards/common/nrfutil.board.cmake) +include(${ZEPHYR_BASE}/boards/common/nrfjprog.board.cmake) +include(${ZEPHYR_BASE}/boards/common/jlink.board.cmake) +include(${ZEPHYR_BASE}/boards/common/pyocd.board.cmake) diff --git a/boards/raytac/mdbt50q_cx_40_dongle/board.yml b/boards/raytac/mdbt50q_cx_40_dongle/board.yml new file mode 100644 index 000000000000..7d320d72e92e --- /dev/null +++ b/boards/raytac/mdbt50q_cx_40_dongle/board.yml @@ -0,0 +1,6 @@ +board: + name: raytac_mdbt50q_cx_40_dongle + full_name: MDBT50Q-CX-40 Dongle + vendor: raytac + socs: + - name: nrf52840 diff --git a/boards/raytac/mdbt50q_cx_40_dongle/doc/img/MDBT50Q-CX-40.webp b/boards/raytac/mdbt50q_cx_40_dongle/doc/img/MDBT50Q-CX-40.webp new file mode 100644 index 0000000000000000000000000000000000000000..4bc0abb90b7357cd45e380e9674419716eba43b9 GIT binary patch literal 8452 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 + +These instructions use the :ref:`west ` tool and assume you are in the +root directory of your :term:`west installation`. + +Option 1: Using the Built-In Bootloader Only +-------------------------------------------- + +The board is factory-programmed with Open bootloader from Nordic's nRF5 +SDK. With this option, you'll use Nordic's `nrfutil`_ program to create +firmware packages supported by this bootloader and flash them to the +device. Make sure ``nrfutil`` is installed before proceeding. + +#. Hold the button and plug it into the USB socket in the bootloader. + + The push button is on the far side of the board from the USB connector. Note + that the button does not face up. You will have to push it from the outside + in, towards the USB connector: + + .. image:: img/raytac_mdbt50q_cx_40_dongle_button_led.webp + :alt: Location of the user button and LED. + + The red LED should start a fade pattern, signalling the bootloader is + running. + +#. Compile a Zephyr application; we'll use :zephyr:code-sample:`blinky`. + + .. zephyr-app-commands:: + :app: zephyr/samples/basic/blinky + :board: raytac_mdbt50q_cx_40_dongle/nrf52840 + :goals: build + +#. Package the application for the bootloader using ``nrfutil``: + + .. code-block:: console + + nrfutil nrf5sdk-tools pkg generate \ + --hw-version 52 \ + --sd-req=0x00 \ + --application build/zephyr/zephyr.hex \ + --application-version 1 \ + blinky.zip + +#. Flash it onto the board. Note :file:`/dev/ttyACM0` is for Linux; it will be + something like ``COMx`` on Windows, and something else on macOS. + + .. code-block:: console + + nrfutil nrf5sdk-tools dfu usb-serial -pkg blinky.zip -p /dev/ttyACM0 + + When this command exits, observe the green LED on the board blinking, + instead of the red LED used by the bootloader. + +For more information, see `Nordic Semiconductor USB DFU`_. + +Option 2: Using MCUboot in Serial Recovery Mode +----------------------------------------------- + +It is also possible to use the MCUboot bootloader with this board to flash +Zephyr applications. You need to do some one-time set-up to build and flash +MCUboot on your board. From that point on, you can build and flash other Zephyr +applications using MCUboot's serial recovery mode. This process does not +overwrite the built-in Nordic bootloader, so you can always go back to using +Option 1 later. + +Install `nrfutil`_ and `mcumgr`_ first, and make sure MCUboot's ``imgtool`` is +available for signing your binary for MCUboot as described on :ref:`west-sign`. + +Next, do the **one-time setup** to flash MCUboot. We'll assume you've cloned +the `MCUboot`_ repository into the directory ``mcuboot``, and that it is next +to the zephyr repository on your computer. + +#. Reset the board into the Nordic bootloader as described above. + +#. Compile MCUboot as a Zephyr application. + + .. zephyr-app-commands:: + :app: mcuboot/boot/zephyr + :board: raytac_mdbt50q_cx_40_dongle/nrf52840 + :build-dir: mcuboot + :goals: build + +#. Package the application for the bootloader using ``nrfutil``: + + .. code-block:: console + + nrfutil nrf5sdk-tools pkg generate \ + --hw-version 52 \ + --sd-req=0x00 \ + --application build/mcuboot/zephyr/zephyr.hex \ + --application-version 1 \ + mcuboot.zip + +#. Flash it onto the board. Note :file:`/dev/ttyACM0` is for Linux; it will be + something like ``COMx`` on Windows, and something else on macOS. + + .. code-block:: console + + nrfutil nrf5sdk-tools dfu usb-serial -pkg mcuboot.zip -p /dev/ttyACM0 + +You can now flash a Zephyr application to the board using MCUboot's serial +recovery mode. We'll use the :zephyr:code-sample:`smp-svr` sample since it's ready to be +compiled for chain-loading by MCUboot (and itself supports firmware updates +over Bluetooth). + +#. Boot into MCUboot serial recovery mode by plugging the board in with the SW1 + button pressed down. See above for a picture showing where SW1 is. + + A serial port will enumerate on your board. On Windows, "MCUBOOT" should + appear under "Other Devices" in the Device Manager (in addition to the usual + ``COMx`` device). On Linux, something like + :file:`/dev/serial/by-id/usb-ZEPHYR_MCUBOOT_0.01-if00` should be created. + + If no serial port appears, try plugging it in again, making sure SW1 is + pressed. If it still doesn't appear, retry the one-time MCUboot setup. + +#. Compile ``smp_svr``. + + .. zephyr-app-commands:: + :app: zephyr/samples/subsys/mgmt/mcumgr/smp_svr + :board: raytac_mdbt50q_cx_40_dongle/nrf52840 + :build-dir: smp_svr + :goals: build + +#. Sign ``smp_svr`` for chain-loading by MCUboot. + + .. code-block:: console + + west sign -t imgtool --bin --no-hex -d build/smp_svr \ + -B smp_svr.signed.bin -- --key mcuboot/root-rsa-2048.pem + +#. Flash the application to the MCUboot serial port using ``mcumgr``: + + .. code-block:: console + + mcumgr --conntype=serial --connstring='dev=/dev/ttyACM0,baud=115200' \ + image upload -e smp_svr.signed.bin + +#. Reset the device: + + .. code-block:: console + + mcumgr --conntype=serial --connstring='dev=/dev/ttyACM0,baud=115200' reset + +You should now be able to scan for Bluetooth devices using a smartphone or +computer. The device you just flashed will be listed with ``Zephyr`` in its +name. + +.. note:: + + This board supports building other Zephyr applications for flashing with + MCUboot in this way also. Just make sure :kconfig:option:`CONFIG_BOOTLOADER_MCUBOOT` + is set when building your application. For example, to compile blinky for + loading by MCUboot, use this: + + .. zephyr-app-commands:: + :app: zephyr/samples/basic/blinky + :board: raytac_mdbt50q_cx_40_dongle/nrf52840 + :build-dir: blinky + :goals: build + :gen-args: -DCONFIG_BOOTLOADER_MCUBOOT=y + + You can then sign and flash it using the steps above. + +Option 3: Using an External Debug Probe +--------------------------------------- + +If you have one, you can also use an external :ref:`debug probe ` +to flash and debug Zephyr applications, but you need to solder an SWD header +onto the back side of the board. + +For Segger J-Link debug probes, follow the instructions in the +:ref:`nordic_segger` page to install and configure all the necessary +software. Further information can be found in :ref:`nordic_segger_flashing`. + +Locate the DTS file: :``boards/raytac/raytac_mdbt50q_cx_40_dongle_nrf52840.dts``. +This file requires a small modification to use a different partition table. +Edit the include directive to include "fstab-debugger" instead of "fstab-stock". + +In addition, the Kconfig file in the same directory must be modified by setting +``BOARD_HAS_NRF5_BOOTLOADER`` to be default ``n``, otherwise the code will be +flashed with an offset. + +Then build and flash applications as usual (see :ref:`build_an_application` and +:ref:`application_run` for more details). + +Here is an example for the :zephyr:code-sample:`blinky` application. + +.. zephyr-app-commands:: + :zephyr-app: samples/basic/blinky + :board: raytac_mdbt50q_cx_40_dongle/nrf52840 + :goals: build flash + +Observe the LED on the board blinking. + +Debugging +========= + +The ``raytac_mdbt50q_cx_40_dongle/nrf52840`` board does not have an on-board J-Link debug IC +as some nRF5x development boards, however, instructions from the +:ref:`nordic_segger` page also apply to this board, with the additional step +of connecting an external debugger. + +Testing the LEDs and buttons on the Raytac MDBT50Q-CX-40 Dongle +*************************************************************** + +There are 2 samples that allow you to test that the buttons (switches) and LEDs on +the board are working properly with Zephyr: + +* :zephyr:code-sample:`blinky` + +You can build and program the examples to make sure Zephyr is running correctly +on your board. + + +References +********** + +.. target-notes:: + +.. _Raytac MDBT50Q-CX-40 Dongle website: + https://www.raytac.com/product/ins.php?index_id=156 +.. _Raytac MDBT50Q-CX-40 Dongle Spec: https://www.raytac.com/download/index.php?index_id=72 +.. _Raytac MDBT50Q-CX-40 Dongle Hardware description: https://www.raytac.com/product/ins.php?index_id=156 +.. _Nordic Semiconductor USB DFU: + https://docs.nordicsemi.com/bundle/sdk_nrf5_v17.1.0/page/sdk_app_serial_dfu_bootloader.html +.. _nrfutil: + https://www.nordicsemi.com/Products/Development-tools/nrf-util +.. _MCUboot: + https://github.com/JuulLabs-OSS/mcuboot +.. _mcumgr: + https://github.com/apache/mynewt-mcumgr-cli diff --git a/boards/raytac/mdbt50q_cx_40_dongle/fstab-debugger.dtsi b/boards/raytac/mdbt50q_cx_40_dongle/fstab-debugger.dtsi new file mode 100644 index 000000000000..dd3d12403c6e --- /dev/null +++ b/boards/raytac/mdbt50q_cx_40_dongle/fstab-debugger.dtsi @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2019 Nordic Semiconductor ASA + * + * SPDX-License-Identifier: Apache-2.0 + */ + +/* Flash partition table without support for Nordic nRF5 bootloader */ + +&flash0 { + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; + + /* The size of this partition ensures that MCUBoot can be built + * with an RTT console, CDC ACM support, and w/o optimizations. + */ + boot_partition: partition@0 { + label = "mcuboot"; + reg = <0x00000000 0x00012000>; + }; + + slot0_partition: partition@12000 { + label = "image-0"; + reg = <0x00012000 0x00075000>; + }; + + slot1_partition: partition@87000 { + label = "image-1"; + reg = <0x00087000 0x00075000>; + }; + + storage_partition: partition@fc000 { + label = "storage"; + reg = <0x000fc000 0x00004000>; + }; + }; +}; diff --git a/boards/raytac/mdbt50q_cx_40_dongle/fstab-stock.dtsi b/boards/raytac/mdbt50q_cx_40_dongle/fstab-stock.dtsi new file mode 100644 index 000000000000..7c16ea6ab8a3 --- /dev/null +++ b/boards/raytac/mdbt50q_cx_40_dongle/fstab-stock.dtsi @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2018-2023 Nordic Semiconductor ASA + * Copyright (c) 2025 Raytac Corporation. + * + * SPDX-License-Identifier: Apache-2.0 + */ + +/* Flash partition table compatible with Nordic nRF5 bootloader */ + +&flash0 { + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; + + /* MCUboot placed after Nordic MBR (this is set with the FLASH_LOAD_OFFSET + * Kconfig value when BOARD_HAS_NRF5_BOOTLOADER is enabled), otherwise MCUboot + * will be placed at 0x0. The size of this partition ensures that MCUBoot can + * be built with CDC ACM support and w/o optimizations. + */ + boot_partition: partition@0 { + label = "mcuboot"; + reg = <0x00000000 0x00010000>; + }; + + slot0_partition: partition@10000 { + label = "image-0"; + reg = <0x00010000 0x00066000>; + }; + + slot1_partition: partition@76000 { + label = "image-1"; + reg = <0x00076000 0x00066000>; + }; + + storage_partition: partition@dc000 { + label = "storage"; + reg = <0x000f0000 0x00004000>; + }; + + /* Nordic nRF5 bootloader <0xf4000 0xa000> + * + * In addition, the last and second last flash pages + * are used by the nRF5 bootloader and MBR to store settings. + */ + }; +}; diff --git a/boards/raytac/mdbt50q_cx_40_dongle/pre_dt_board.cmake b/boards/raytac/mdbt50q_cx_40_dongle/pre_dt_board.cmake new file mode 100644 index 000000000000..3369c21d3af5 --- /dev/null +++ b/boards/raytac/mdbt50q_cx_40_dongle/pre_dt_board.cmake @@ -0,0 +1,7 @@ +# Copyright (c) 2022 Nordic Semiconductor +# SPDX-License-Identifier: Apache-2.0 + +# Suppress "unique_unit_address_if_enabled" to handle the following overlaps: +# - power@40000000 & clock@40000000 & bprot@40000000 +# - acl@4001e000 & flash-controller@4001e000 +list(APPEND EXTRA_DTC_FLAGS "-Wno-unique_unit_address_if_enabled") diff --git a/boards/raytac/mdbt50q_cx_40_dongle/raytac_mdbt50q_cx_40_dongle_nrf52840-pinctrl.dtsi b/boards/raytac/mdbt50q_cx_40_dongle/raytac_mdbt50q_cx_40_dongle_nrf52840-pinctrl.dtsi new file mode 100644 index 000000000000..ecf992611e54 --- /dev/null +++ b/boards/raytac/mdbt50q_cx_40_dongle/raytac_mdbt50q_cx_40_dongle_nrf52840-pinctrl.dtsi @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2018-2023 Nordic Semiconductor ASA + * Copyright (c) 2025 Raytac Corporation. + * SPDX-License-Identifier: Apache-2.0 + */ + +&pinctrl { + uart0_default: uart0_default { + group1 { + psels = , + ; + }; + + group2 { + psels = , + ; + bias-pull-up; + }; + }; + + uart0_sleep: uart0_sleep { + group1 { + psels = , + , + , + ; + low-power-enable; + }; + }; + + pwm0_default: pwm0_default { + group1 { + psels = , + ; + nordic,invert; + }; + }; + + pwm0_sleep: pwm0_sleep { + group1 { + psels = , + ; + low-power-enable; + }; + }; +}; diff --git a/boards/raytac/mdbt50q_cx_40_dongle/raytac_mdbt50q_cx_40_dongle_nrf52840.dts b/boards/raytac/mdbt50q_cx_40_dongle/raytac_mdbt50q_cx_40_dongle_nrf52840.dts new file mode 100644 index 000000000000..5033b663707e --- /dev/null +++ b/boards/raytac/mdbt50q_cx_40_dongle/raytac_mdbt50q_cx_40_dongle_nrf52840.dts @@ -0,0 +1,133 @@ +/* + * Copyright (c) 2018-2023 Nordic Semiconductor ASA + * Copyright (c) 2017 Linaro Limited + * Copyright (c) 2025 Raytac Corporation. + * SPDX-License-Identifier: Apache-2.0 + */ + +/dts-v1/; +#include +#include "raytac_mdbt50q_cx_40_dongle_nrf52840-pinctrl.dtsi" +#include +/ { + model = "raytac_mdbt50q_cx_40_dongle_nrf52840"; + compatible = "raytac,raytac-mdbt50q-cx-40-dongle-nrf52840"; + + chosen { + zephyr,sram = &sram0; + zephyr,flash = &flash0; + zephyr,code-partition = &slot0_partition; + zephyr,ieee802154 = &ieee802154; + }; + + leds { + compatible = "gpio-leds"; + + led0_d1: led_0 { + gpios = <&gpio0 6 GPIO_ACTIVE_LOW>; + label = "LED D1"; + }; + + led1_d2: led_1 { + gpios = <&gpio0 8 GPIO_ACTIVE_LOW>; + label = "LED D2"; + }; + }; + + pwmleds { + compatible = "pwm-leds"; + + d1_pwm_led: pwm_led_0 { + pwms = <&pwm0 0 PWM_MSEC(20) PWM_POLARITY_INVERTED>; + }; + + d2_pwm_led: pwm_led_1 { + pwms = <&pwm0 1 PWM_MSEC(20) PWM_POLARITY_INVERTED>; + }; + }; + + buttons { + compatible = "gpio-keys"; + + button0: button_0 { + gpios = <&gpio1 6 (GPIO_PULL_UP | GPIO_ACTIVE_LOW)>; + label = "Push button switch 0"; + zephyr,code = ; + }; + }; + + /* These aliases are provided for compatibility with samples */ + aliases { + sw0 = &button0; + led0 = &led0_d1; + led1 = &led1_d2; + led0-green = &led0_d1; + led1-red = &led1_d2; + pwm-led0 = &d1_pwm_led; + pwm-led1 = &d2_pwm_led; + red-pwm-led = &d2_pwm_led; + green-pwm-led = &d1_pwm_led; + mcuboot-button0 = &button0; + mcuboot-led0 = &led0_d1; + watchdog0 = &wdt0; + }; +}; + +®0 { + status = "disabled"; +}; + +®1 { + regulator-initial-mode = <0>; +}; + +&gpiote { + status = "okay"; +}; + +&uicr { + nfct-pins-as-gpios; + gpio-as-nreset; +}; + +&gpio0 { + status = "okay"; +}; + +&gpio1 { + status = "okay"; +}; + +&uart0 { + compatible = "nordic,nrf-uarte"; + status = "okay"; + current-speed = <115200>; + pinctrl-0 = <&uart0_default>; + pinctrl-1 = <&uart0_sleep>; + pinctrl-names = "default", "sleep"; +}; + +&pwm0 { + status = "okay"; + pinctrl-0 = <&pwm0_default>; + pinctrl-1 = <&pwm0_sleep>; + pinctrl-names = "default", "sleep"; +}; + +&ieee802154 { + status = "okay"; +}; + +/* Include flash partition table. + * Two partition tables are available: + * fstab-stock -compatible with Nordic nRF5 bootloader, default + * fstab-debugger -to use an external debugger, w/o the nRF5 bootloader + */ +#include "fstab-stock.dtsi" + +zephyr_udc0: &usbd { + compatible = "nordic,nrf-usbd"; + status = "okay"; +}; + +#include <../boards/common/usb/cdc_acm_serial.dtsi> diff --git a/boards/raytac/mdbt50q_cx_40_dongle/raytac_mdbt50q_cx_40_dongle_nrf52840.yaml b/boards/raytac/mdbt50q_cx_40_dongle/raytac_mdbt50q_cx_40_dongle_nrf52840.yaml new file mode 100644 index 000000000000..90e1c1cde510 --- /dev/null +++ b/boards/raytac/mdbt50q_cx_40_dongle/raytac_mdbt50q_cx_40_dongle_nrf52840.yaml @@ -0,0 +1,23 @@ +# Copyright (c) 2018-2023 Nordic Semiconductor ASA +# Copyright (c) 2025 Raytac Corporation. +# SPDX-License-Identifier: Apache-2.0 + +identifier: raytac_mdbt50q_cx_40_dongle/nrf52840 +name: Raytac MDBT50Q-CX-40 Dongle +type: mcu +arch: arm +ram: 256 +flash: 1024 +toolchain: + - zephyr + - gnuarmemb +supported: + - usb_device + - usb_cdc + - ble + - pwm + - watchdog + - counter + - netif:openthread + - gpio +vendor: raytac diff --git a/boards/raytac/mdbt50q_cx_40_dongle/raytac_mdbt50q_cx_40_dongle_nrf52840_defconfig b/boards/raytac/mdbt50q_cx_40_dongle/raytac_mdbt50q_cx_40_dongle_nrf52840_defconfig new file mode 100644 index 000000000000..d0b5322cfeb4 --- /dev/null +++ b/boards/raytac/mdbt50q_cx_40_dongle/raytac_mdbt50q_cx_40_dongle_nrf52840_defconfig @@ -0,0 +1,16 @@ +# SPDX-License-Identifier: Apache-2.0 + +# Enable MPU +CONFIG_ARM_MPU=y + +# Enable hardware stack protection +CONFIG_HW_STACK_PROTECTION=y + +# Enable GPIO +CONFIG_GPIO=y + +# Board Kconfig.defconfig enables USB CDC ACM and should disable USB remote +# wakeup by default. It needs to be disabled here, because the USB nrfx +# driver always overwrites option from Kconfig mentioned above with the +# imply from CONFIG_USB_NRFX. +CONFIG_USB_DEVICE_REMOTE_WAKEUP=n