From 886505e4cb930855ea572e652df763c3d999a238 Mon Sep 17 00:00:00 2001 From: Ryan Erickson Date: Fri, 9 Sep 2022 08:55:08 -0500 Subject: [PATCH 1/9] boards: Add MG100 Add Laird Connectivity MG100 board. Signed-off-by: Ryan Erickson --- boards/arm/mg100/Kconfig | 8 + boards/arm/mg100/Kconfig.board | 6 + boards/arm/mg100/Kconfig.defconfig | 24 +++ boards/arm/mg100/board.cmake | 8 + boards/arm/mg100/doc/img/mg100.jpg | Bin 0 -> 66873 bytes boards/arm/mg100/doc/index.rst | 249 ++++++++++++++++++++++++++++ boards/arm/mg100/mg100-pinctrl.dtsi | 101 +++++++++++ boards/arm/mg100/mg100.dts | 217 ++++++++++++++++++++++++ boards/arm/mg100/mg100.yaml | 20 +++ boards/arm/mg100/mg100_defconfig | 28 ++++ boards/arm/mg100/pre_dt_board.cmake | 7 + 11 files changed, 668 insertions(+) create mode 100644 boards/arm/mg100/Kconfig create mode 100644 boards/arm/mg100/Kconfig.board create mode 100644 boards/arm/mg100/Kconfig.defconfig create mode 100644 boards/arm/mg100/board.cmake create mode 100644 boards/arm/mg100/doc/img/mg100.jpg create mode 100644 boards/arm/mg100/doc/index.rst create mode 100644 boards/arm/mg100/mg100-pinctrl.dtsi create mode 100644 boards/arm/mg100/mg100.dts create mode 100644 boards/arm/mg100/mg100.yaml create mode 100644 boards/arm/mg100/mg100_defconfig create mode 100644 boards/arm/mg100/pre_dt_board.cmake diff --git a/boards/arm/mg100/Kconfig b/boards/arm/mg100/Kconfig new file mode 100644 index 0000000000000..b2058e28c9591 --- /dev/null +++ b/boards/arm/mg100/Kconfig @@ -0,0 +1,8 @@ +# Copyright (c) 2022 Laird Connectivity +# SPDX-License-Identifier: Apache-2.0 + +config BOARD_ENABLE_DCDC + bool "DCDC mode" + select SOC_DCDC_NRF52X + default y + depends on BOARD_MG100 diff --git a/boards/arm/mg100/Kconfig.board b/boards/arm/mg100/Kconfig.board new file mode 100644 index 0000000000000..59779d555c5ee --- /dev/null +++ b/boards/arm/mg100/Kconfig.board @@ -0,0 +1,6 @@ +# Copyright (c) 2022 Laird Connectivity +# SPDX-License-Identifier: Apache-2.0 + +config BOARD_MG100 + bool "MG100" + depends on SOC_NRF52840_QIAA diff --git a/boards/arm/mg100/Kconfig.defconfig b/boards/arm/mg100/Kconfig.defconfig new file mode 100644 index 0000000000000..74160f93bf56f --- /dev/null +++ b/boards/arm/mg100/Kconfig.defconfig @@ -0,0 +1,24 @@ +# Copyright (c) 2022 Laird Connectivity +# SPDX-License-Identifier: Apache-2.0 + +if BOARD_MG100 + +config BOARD + default "mg100" + +config MODEM + default NETWORKING + +config MODEM_HL7800 + default NETWORKING + +config NORDIC_QSPI_NOR + default BOOTLOADER_MCUBOOT + +config NORDIC_QSPI_NOR_FLASH_LAYOUT_PAGE_SIZE + default 4096 if NORDIC_QSPI_NOR + +config BT_CTLR + default BT + +endif # BOARD_MG100 diff --git a/boards/arm/mg100/board.cmake b/boards/arm/mg100/board.cmake new file mode 100644 index 0000000000000..790ab533b4a46 --- /dev/null +++ b/boards/arm/mg100/board.cmake @@ -0,0 +1,8 @@ +# Copyright (c) 2022 Laird Connectivity +# 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/nrfjprog.board.cmake) +include(${ZEPHYR_BASE}/boards/common/jlink.board.cmake) +include(${ZEPHYR_BASE}/boards/common/pyocd.board.cmake) diff --git a/boards/arm/mg100/doc/img/mg100.jpg b/boards/arm/mg100/doc/img/mg100.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5bdd8d5eea57c45bc55d65590c53ef7818e55c60 GIT binary patch literal 66873 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 z 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 -b 115200 + +Replace :code:`` with the port where the board MG100 +can be found. For example, under Linux, :code:`/dev/ttyUSB0`. + +Then build and flash the application in the usual way. + +.. zephyr-app-commands:: + :zephyr-app: samples/hello_world + :board: mg100 + :goals: build flash + +Debugging +========= + +Refer to the :ref:`nordic_segger` page to learn about debugging Nordic boards with a +Segger IC. + +Software +******** + +MG100 Out-of-Box Demo Software +============================== +The MG100 ships with an out of the box software demo. +Check out the `BLE Gateway OOB Demo`_ source code and documentation. + +Testing Bluetooth on the MG100 +============================== +Many of the Bluetooth examples will work on the MG100. +Try them out: + +* :ref:`ble_peripheral` +* :ref:`bluetooth-eddystone-sample` +* :ref:`bluetooth-ibeacon-sample` + +Testing the LEDs and buttons in the MG100 +==================================================== + +There are 2 samples that allow you to test that the buttons (switches) and LEDs on +the board are working properly with Zephyr: + +.. code-block:: console + + samples/basic/blinky + samples/basic/button + +You can build and flash the examples to make sure Zephyr is running correctly on +your board. The button and LED definitions can be found in +:zephyr_file:`boards/arm/mg100/mg100.dts`. + +References +********** + +.. target-notes:: + +.. _MG100 website: https://www.lairdconnect.com/iot-devices/iot-gateways/sentrius-mg100-gateway-lte-mnb-iot-and-bluetooth-5 +.. _nRF52840 Product Specification: https://infocenter.nordicsemi.com/pdf/nRF52840_PS_v1.1.pdf +.. _Sierra Wireless HL7800: https://source.sierrawireless.com/devices/hl-series/hl7800/#sthash.641qTTwA.dpbs +.. _J-Link Software and documentation pack: https://www.segger.com/jlink-software.html +.. _BLE Gateway OOB Demo: https://github.com/LairdCP/Pinnacle-100-Firmware-Manifest +.. _Macronix MX25R6435F datasheet: https://www.macronix.com/Lists/Datasheet/Attachments/7913/MX25R6435F,%20Wide%20Range,%2064Mb,%20v1.5.pdf +.. _Laird Connectivity USB-SWD Programming Kit: https://www.lairdconnect.com/wireless-modules/programming-kits/usb-swd-programming-kit +.. _Memfault Platform: https://docs.memfault.com/docs/mcu/pinnacle-100-guide +.. _nRF52840: https://www.nordicsemi.com/products/nrf52840 diff --git a/boards/arm/mg100/mg100-pinctrl.dtsi b/boards/arm/mg100/mg100-pinctrl.dtsi new file mode 100644 index 0000000000000..44151191cbde5 --- /dev/null +++ b/boards/arm/mg100/mg100-pinctrl.dtsi @@ -0,0 +1,101 @@ +/* + * Copyright (c) 2022 Nordic Semiconductor + * Copyright (c) 2022 Laird Connectivity + * SPDX-License-Identifier: Apache-2.0 + */ + +&pinctrl { + uart0_default: uart0_default { + group1 { + psels = , + , + , + ; + }; + }; + + uart0_sleep: uart0_sleep { + group1 { + psels = , + , + , + ; + low-power-enable; + }; + }; + + uart1_default: uart1_default { + group1 { + psels = , + , + , + ; + }; + }; + + uart1_sleep: uart1_sleep { + group1 { + psels = , + , + , + ; + low-power-enable; + }; + }; + + i2c0_default: i2c0_default { + group1 { + psels = , + ; + }; + }; + + i2c0_sleep: i2c0_sleep { + group1 { + psels = , + ; + low-power-enable; + }; + }; + + spi2_default: spi2_default { + group1 { + psels = , + , + ; + }; + }; + + spi2_sleep: spi2_sleep { + group1 { + psels = , + , + ; + low-power-enable; + }; + }; + + qspi_default: qspi_default { + group1 { + psels = , + , + , + , + , + ; + }; + }; + + qspi_sleep: qspi_sleep { + group1 { + psels = , + , + , + , + , + ; + low-power-enable; + }; + }; + +}; diff --git a/boards/arm/mg100/mg100.dts b/boards/arm/mg100/mg100.dts new file mode 100644 index 0000000000000..16e4c4a9fb6ee --- /dev/null +++ b/boards/arm/mg100/mg100.dts @@ -0,0 +1,217 @@ +/* + * Copyright (c) 2022 Laird Connectivity + * + * SPDX-License-Identifier: Apache-2.0 + */ + +/dts-v1/; +#include +#include "mg100-pinctrl.dtsi" + +/ { + model = "MG100"; + compatible = "lairdconnect,mg100"; + + chosen { + zephyr,console = &uart0; + zephyr,shell-uart = &uart0; + zephyr,uart-mcumgr = &uart0; + zephyr,bt-mon-uart = &uart0; + zephyr,sram = &sram0; + zephyr,flash = &flash0; + zephyr,code-partition = &slot0_partition; + zephyr,ieee802154 = &ieee802154; + }; + + leds { + compatible = "gpio-leds"; + led1: led_1 { + gpios = <&gpio1 7 GPIO_ACTIVE_HIGH>; + label = "Red LED"; + }; + led2: led_2 { + gpios = <&gpio1 6 GPIO_ACTIVE_HIGH>; + label = "Blue LED"; + }; + led3: led_3 { + gpios = <&gpio1 5 GPIO_ACTIVE_HIGH>; + label = "Green LED"; + }; + }; + + buttons { + compatible = "gpio-keys"; + button1: button_1 { + gpios = <&gpio0 3 (GPIO_PULL_UP | GPIO_ACTIVE_LOW)>; + label = "Push button switch"; + }; + }; + + /* These aliases are provided for compatibility with samples */ + aliases { + led0 = &led1; + led1 = &led2; + led2 = &led3; + sw0 = &button1; + mcuboot-button0 = &button1; + mcuboot-led0 = &led1; + watchdog0 = &wdt0; + }; +}; + +&adc { + status = "okay"; +}; + +&gpiote { + status = "okay"; +}; + +&gpio0 { + status = "okay"; +}; + +&gpio1 { + status = "okay"; +}; + +&uart0 { + compatible = "nordic,nrf-uart"; + status = "okay"; + current-speed = <115200>; + pinctrl-0 = <&uart0_default>; + pinctrl-1 = <&uart0_sleep>; + pinctrl-names = "default", "sleep"; +}; + +&uart1 { + compatible = "nordic,nrf-uarte"; + status = "okay"; + current-speed = <115200>; + hw-flow-control; + pinctrl-0 = <&uart1_default>; + pinctrl-1 = <&uart1_sleep>; + pinctrl-names = "default", "sleep"; + hl7800 { + compatible = "swir,hl7800"; + status = "okay"; + mdm-reset-gpios = <&gpio1 15 (GPIO_OPEN_DRAIN | GPIO_ACTIVE_LOW)>; + mdm-wake-gpios = <&gpio1 13 (GPIO_OPEN_SOURCE | GPIO_ACTIVE_HIGH)>; + mdm-pwr-on-gpios = <&gpio1 2 (GPIO_OPEN_DRAIN | GPIO_ACTIVE_LOW)>; + mdm-fast-shutd-gpios = <&gpio1 14 (GPIO_OPEN_DRAIN | GPIO_ACTIVE_LOW)>; + mdm-vgpio-gpios = <&gpio1 11 0>; + mdm-uart-dsr-gpios = <&gpio0 25 0>; + mdm-uart-cts-gpios = <&gpio0 15 0>; + mdm-gpio6-gpios = <&gpio1 12 0>; + }; +}; + +&i2c0 { + compatible = "nordic,nrf-twim"; + status = "okay"; + + pinctrl-0 = <&i2c0_default>; + pinctrl-1 = <&i2c0_sleep>; + pinctrl-names = "default", "sleep"; + lis2dh@19 { + compatible = "st,lis3dh", "st,lis2dh"; + status = "okay"; + reg = <0x19>; + irq-gpios = <&gpio0 28 GPIO_ACTIVE_HIGH>; + anym-on-int1; + }; +}; + +&spi2 { + compatible = "nordic,nrf-spim"; + status = "okay"; + pinctrl-0 = <&spi2_default>; + pinctrl-1 = <&spi2_sleep>; + pinctrl-names = "default", "sleep"; + cs-gpios = <&gpio0 29 GPIO_ACTIVE_LOW>; + sdhc0: sdhc@0 { + compatible = "zephyr,mmc-spi-slot"; + reg = <0>; + spi-max-frequency = <8000000>; + }; +}; + +&qspi { + status = "okay"; + pinctrl-0 = <&qspi_default>; + pinctrl-1 = <&qspi_sleep>; + pinctrl-names = "default", "sleep"; + mx25r64: mx25r6435f@0 { + compatible = "nordic,qspi-nor"; + reg = <0>; + writeoc = "pp4io"; + readoc = "read4io"; + sck-frequency = <8000000>; + jedec-id = [ c2 28 17 ]; + size = <67108864>; + has-dpd; + t-enter-dpd = <10000>; + t-exit-dpd = <35000>; + }; +}; + +&ieee802154 { + status = "okay"; +}; + +&flash0 { + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; + + /* 96K */ + boot_partition: partition@0 { + label = "mcuboot"; + reg = <0x00000000 0x00018000>; + }; + /* 896K */ + slot0_partition: partition@18000 { + label = "image-0"; + reg = <0x00018000 0x000E0000>; + }; + + /* + * The flash starting at 0x000f8000 and ending at + * 0x000fffff is reserved for use by the application. + */ + + /* + * Storage partition will be used by FCB/NVS + * if enabled. 32K + */ + storage_partition: partition@f8000 { + label = "storage"; + reg = <0x000f8000 0x00008000>; + }; + }; +}; + +&mx25r64 { + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; + + /* 896K */ + slot1_partition: partition@0 { + label = "image-1"; + reg = <0x00000000 0x000E0000>; + }; + /* 128K */ + scratch_partition: partition@E0000 { + label = "image-scratch"; + reg = <0x000E0000 0x00020000>; + }; + /* 7MB */ + lfs_partition: partition@100000 { + label = "lfs_storage"; + reg = <0x00100000 0x00700000>; + }; + }; +}; diff --git a/boards/arm/mg100/mg100.yaml b/boards/arm/mg100/mg100.yaml new file mode 100644 index 0000000000000..adeb9e91121b7 --- /dev/null +++ b/boards/arm/mg100/mg100.yaml @@ -0,0 +1,20 @@ +identifier: mg100 +name: mg100 +type: mcu +arch: arm +ram: 256 +flash: 1024 +toolchain: + - zephyr + - gnuarmemb + - xtools +supported: + - adc + - ble + - counter + - gpio + - i2c + - pwm + - spi + - watchdog + - netif:modem diff --git a/boards/arm/mg100/mg100_defconfig b/boards/arm/mg100/mg100_defconfig new file mode 100644 index 0000000000000..93f55f3d0a482 --- /dev/null +++ b/boards/arm/mg100/mg100_defconfig @@ -0,0 +1,28 @@ +# Copyright (c) 2022 Laird Connectivity +# SPDX-License-Identifier: Apache-2.0 + +CONFIG_SOC_SERIES_NRF52X=y +CONFIG_SOC_NRF52840_QIAA=y +CONFIG_BOARD_MG100=y + +# Enable MPU +CONFIG_ARM_MPU=y + +# Enable GPIO +CONFIG_GPIO=y + +# Enable uart driver +CONFIG_SERIAL=y + +# Enable console +CONFIG_CONSOLE=y +CONFIG_UART_CONSOLE=y + +# Additional board options +CONFIG_GPIO_AS_PINRESET=y + +# 32KHz clock source +CONFIG_CLOCK_CONTROL_NRF_K32SRC_XTAL=y +CONFIG_CLOCK_CONTROL_NRF_K32SRC_150PPM=y + +CONFIG_PINCTRL=y diff --git a/boards/arm/mg100/pre_dt_board.cmake b/boards/arm/mg100/pre_dt_board.cmake new file mode 100644 index 0000000000000..3369c21d3af5b --- /dev/null +++ b/boards/arm/mg100/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") From 565f88c70e9ec797fb63a05aeaf7b764a587760a Mon Sep 17 00:00:00 2001 From: Ryan Erickson Date: Tue, 6 Sep 2022 22:11:41 -0500 Subject: [PATCH 2/9] CODEOWNERS: add MG100 board owner Add myself. Signed-off-by: Ryan Erickson --- CODEOWNERS | 1 + 1 file changed, 1 insertion(+) diff --git a/CODEOWNERS b/CODEOWNERS index dc6e4f9dfddeb..169311ea4048c 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -119,6 +119,7 @@ /boards/arm/legend/ @mbittan @simonguinot /boards/arm/lpcxpresso*/ @mmahadevan108 @dleach02 /boards/arm/lpcxpresso*/doc/ @dleach02 @MeganHansen +/boards/arm/mg100/ @rerickson1 /boards/arm/mimx8mm_evk/ @Mani-Sadhasivam /boards/arm/mimxrt*/ @mmahadevan108 @dleach02 /boards/arm/mimxrt*/doc/ @dleach02 @MeganHansen From 45d3eba25c077c1d804265a81f8fdea6cd1b4c8f Mon Sep 17 00:00:00 2001 From: Ryan Erickson Date: Tue, 6 Sep 2022 22:12:56 -0500 Subject: [PATCH 3/9] MAINTAINERS: Add MG100 board to Laird Connectivity Platforms Add the MG100 board as a Laird Connectivity platform Signed-off-by: Ryan Erickson --- MAINTAINERS.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/MAINTAINERS.yml b/MAINTAINERS.yml index d62cd11c1bc7b..68965d33d04e8 100644 --- a/MAINTAINERS.yml +++ b/MAINTAINERS.yml @@ -1264,6 +1264,7 @@ Laird Connectivity platforms: - boards/arm/bt510/ - boards/arm/bt610/ - boards/arm/pinnacle_100_dvk/ + - boards/arm/mg100/ labels: - "platform: Laird Connectivity" From 44fb92a5a9cc6e2d52818034c470329c06a3b823 Mon Sep 17 00:00:00 2001 From: Ryan Erickson Date: Fri, 9 Sep 2022 08:55:27 -0500 Subject: [PATCH 4/9] samples: net: lwm2m_client: Add support for MG100 board Add support to build sample for MG100 board. Signed-off-by: Ryan Erickson --- samples/net/lwm2m_client/sample.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/samples/net/lwm2m_client/sample.yaml b/samples/net/lwm2m_client/sample.yaml index 629a7fe316e37..076dbd09ca79b 100644 --- a/samples/net/lwm2m_client/sample.yaml +++ b/samples/net/lwm2m_client/sample.yaml @@ -5,7 +5,7 @@ tests: sample.net.lwm2m_client: harness: net depends_on: netif - platform_allow: qemu_x86 frdm_k64f pinnacle_100_dvk + platform_allow: qemu_x86 frdm_k64f pinnacle_100_dvk mg100 tags: net lwm2m sample.net.lwm2m_client.all_objects: harness: net @@ -26,7 +26,7 @@ tests: harness: net depends_on: netif extra_args: OVERLAY_CONFIG=overlay-dtls.conf - platform_allow: qemu_x86 frdm_k64f pinnacle_100_dvk + platform_allow: qemu_x86 frdm_k64f pinnacle_100_dvk mg100 tags: net lwm2m sample.net.lwm2m_client.bt: harness: net From 763de14b5d086d917ee5d7778deece008d1d9a97 Mon Sep 17 00:00:00 2001 From: Ryan Erickson Date: Fri, 9 Sep 2022 08:59:20 -0500 Subject: [PATCH 5/9] samples: net: mqtt_publisher: Add support for MG100 board Add support to build the sample for the MG100 board. Signed-off-by: Ryan Erickson --- samples/net/mqtt_publisher/sample.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/net/mqtt_publisher/sample.yaml b/samples/net/mqtt_publisher/sample.yaml index 70cbeee461299..8ff7826961291 100644 --- a/samples/net/mqtt_publisher/sample.yaml +++ b/samples/net/mqtt_publisher/sample.yaml @@ -6,7 +6,7 @@ common: tags: net mqtt tests: sample.net.mqtt_publisher: - platform_allow: frdm_k64f qemu_x86 pinnacle_100_dvk + platform_allow: frdm_k64f qemu_x86 pinnacle_100_dvk mg100 sample.net.mqtt_publisher.userspace: platform_allow: frdm_k64f qemu_x86 extra_args: CONFIG_USERSPACE=y From 39da56ccbfadd69e396d542bb1e35c9945d9efce Mon Sep 17 00:00:00 2001 From: Ryan Erickson Date: Fri, 9 Sep 2022 08:55:40 -0500 Subject: [PATCH 6/9] samples: mcumgr: smp_svr: Add support for MG100 board Add support to build the sample for the MG100 board. Signed-off-by: Ryan Erickson --- samples/subsys/mgmt/mcumgr/smp_svr/sample.yaml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/samples/subsys/mgmt/mcumgr/smp_svr/sample.yaml b/samples/subsys/mgmt/mcumgr/smp_svr/sample.yaml index 2f0a577cbe66f..5b5c472e9db8e 100644 --- a/samples/subsys/mgmt/mcumgr/smp_svr/sample.yaml +++ b/samples/subsys/mgmt/mcumgr/smp_svr/sample.yaml @@ -7,7 +7,7 @@ common: tests: sample.mcumgr.smp_svr.bt: extra_args: OVERLAY_CONFIG="overlay-bt.conf" - platform_allow: nrf52dk_nrf52832 nrf52840dk_nrf52840 pinnacle_100_dvk + platform_allow: nrf52dk_nrf52832 nrf52840dk_nrf52840 pinnacle_100_dvk mg100 integration_platforms: - nrf52dk_nrf52832 - nrf52840dk_nrf52840 @@ -27,28 +27,28 @@ tests: - nrf5340dk_nrf5340_cpuapp sample.mcumgr.smp_svr.serial: extra_args: OVERLAY_CONFIG="overlay-serial.conf" - platform_allow: nrf52840dk_nrf52840 pinnacle_100_dvk + platform_allow: nrf52840dk_nrf52840 pinnacle_100_dvk mg100 integration_platforms: - nrf52840dk_nrf52840 sample.mcumgr.smp_svr.serial: extra_args: OVERLAY_CONFIG="overlay-serial-console.conf" - platform_allow: nrf52840dk_nrf52840 pinnacle_100_dvk + platform_allow: nrf52840dk_nrf52840 pinnacle_100_dvk mg100 integration_platforms: - nrf52840dk_nrf52840 sample.mcumgr.smp_svr.shell: extra_args: OVERLAY_CONFIG="overlay-shell.conf" - platform_allow: nrf52840dk_nrf52840 mimxrt1060_evk mimxrt1064_evk pinnacle_100_dvk + platform_allow: nrf52840dk_nrf52840 mimxrt1060_evk mimxrt1064_evk pinnacle_100_dvk mg100 integration_platforms: - nrf52840dk_nrf52840 - mimxrt1060_evk - mimxrt1064_evk sample.mcumgr.smp_svr.shell_mgmt: extra_args: OVERLAY_CONFIG="overlay-shell-mgmt.conf" - platform_allow: nrf52840dk_nrf52840 pinnacle_100_dvk + platform_allow: nrf52840dk_nrf52840 pinnacle_100_dvk mg100 integration_platforms: - nrf52840dk_nrf52840 sample.mcumgr.smp_svr.fs: extra_args: OVERLAY_CONFIG="overlay-fs.conf" - platform_allow: nrf52840dk_nrf52840 pinnacle_100_dvk + platform_allow: nrf52840dk_nrf52840 pinnacle_100_dvk mg100 integration_platforms: - nrf52840dk_nrf52840 From 93509385a6a4f65b8017a8b183a4d918314b83b8 Mon Sep 17 00:00:00 2001 From: Ryan Erickson Date: Tue, 6 Sep 2022 22:28:05 -0500 Subject: [PATCH 7/9] tests: modem: build_all: Add MG100 board exclusions Add MG100 board to test exclusions where necessary. Signed-off-by: Ryan Erickson --- tests/drivers/build_all/modem/testcase.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/drivers/build_all/modem/testcase.yaml b/tests/drivers/build_all/modem/testcase.yaml index 85fec28608030..08a9027d80de3 100644 --- a/tests/drivers/build_all/modem/testcase.yaml +++ b/tests/drivers/build_all/modem/testcase.yaml @@ -9,13 +9,13 @@ tests: min_flash: 115 drivers.modem.ublox_sara.build: extra_args: CONF_FILE=modem_ublox_sara.conf - platform_exclude: serpente pinnacle_100_dvk litex_vexriscv ip_k66f + platform_exclude: serpente pinnacle_100_dvk litex_vexriscv ip_k66f mg100 drivers.modem.simcom_sim7080.build: extra_args: CONF_FILE=modem_simcom_sim7080.conf - platform_exclude: serpente pinnacle_100_dvk litex_vexriscv ip_k66f + platform_exclude: serpente pinnacle_100_dvk litex_vexriscv ip_k66f mg100 drivers.modem.quectel_bg9x.build: extra_args: CONF_FILE=modem_quectel_bg9x.conf - platform_exclude: serpente pinnacle_100_dvk litex_vexriscv ip_k66f + platform_exclude: serpente pinnacle_100_dvk litex_vexriscv ip_k66f mg100 min_ram: 36 drivers.modem.gsm.build: extra_args: CONF_FILE=modem_gsm.conf From 8b247f9bb316ede727632096c9d5549812e5fc17 Mon Sep 17 00:00:00 2001 From: Ryan Erickson Date: Wed, 7 Sep 2022 08:53:16 -0500 Subject: [PATCH 8/9] tests: ADC API: Add support for MG100 board MG100 board added to ADC API tests. Signed-off-by: Ryan Erickson --- tests/drivers/adc/adc_api/src/test_adc.c | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/drivers/adc/adc_api/src/test_adc.c b/tests/drivers/adc/adc_api/src/test_adc.c index f1e05c5ab5ebb..a6b75bfc74537 100644 --- a/tests/drivers/adc/adc_api/src/test_adc.c +++ b/tests/drivers/adc/adc_api/src/test_adc.c @@ -51,6 +51,7 @@ defined(CONFIG_BOARD_RUUVI_RUUVITAG) || \ defined(CONFIG_BOARD_BT510) || \ defined(CONFIG_BOARD_PINNACLE_100_DVK) || \ + defined(CONFIG_BOARD_MG100) || \ defined(CONFIG_BOARD_ARDUINO_NANO_33_BLE) || \ defined(CONFIG_BOARD_ARDUINO_NANO_33_BLE_SENSE) || \ defined(CONFIG_BOARD_UBX_BMD300EVAL_NRF52832) || \ From 20a5c8e9fa4788953226d018edcb195d0951da7b Mon Sep 17 00:00:00 2001 From: Ryan Erickson Date: Mon, 12 Sep 2022 09:42:53 -0500 Subject: [PATCH 9/9] tests: net: bridge: exclude mg100 and pinnacle_100_dvk mg100 and pinnacle_100_dvk require IPv4 and/or IPv6 networking. Signed-off-by: Ryan Erickson --- tests/net/bridge/testcase.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/net/bridge/testcase.yaml b/tests/net/bridge/testcase.yaml index 178e5020d09c1..86f8b58dbc9f4 100644 --- a/tests/net/bridge/testcase.yaml +++ b/tests/net/bridge/testcase.yaml @@ -7,6 +7,7 @@ tests: extra_configs: - CONFIG_NET_IPV4=n - CONFIG_NET_IPV6=n + platform_exclude: mg100 pinnacle_100_dvk net.eth_bridge.ip: extra_configs: - CONFIG_NET_IPV4=y