Commit f32e6865 authored by Maciej Baczmanski's avatar Maciej Baczmanski Committed by David Leach
Browse files

net: openthread: implement `otPlatResetToBootloader`



This commit implements `otPlatResetToBootloader` in two ways:

- trigger reset to bootloader using boot mode retention API
- trigger reset to bootloader by triggering GPIO pin (applicable
for nRF52840 Dongle)

Signed-off-by: default avatarMaciej Baczmanski <maciej.baczmanski@nordicsemi.no>
parent c2f0a7a5
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -10,6 +10,7 @@ description: |
      compatible = "openthread,config";
      diag-gpios = <&gpio0 0  GPIO_ACTIVE_HIGH>,
                   <&gpio1 0  GPIO_ACTIVE_LOW>;
      bootloader-gpios = <&gpio0 1 GPIO_ACTIVE_HIGH>;
    };
  };

@@ -21,3 +22,9 @@ properties:
    description: |
      This enables access to diagnostic GPIO pins. Each field consists of
      GPIO pin's configuration: controller's phandle, pin number and configuration flags.

  bootloader-gpios:
    type: phandle-array
    description: |
      This enables resetting to bootloader by triggering given GPIO pin. Property represents
      chosen GPIO pin's configuration: controller's phandle, pin number and configuration flags.
+1 −0
Original line number Diff line number Diff line
@@ -99,6 +99,7 @@ kconfig_to_ot_option(CONFIG_OPENTHREAD_NETDATA_PUBLISHER OT_NETDATA_PUBLISHER "E
kconfig_to_ot_option(CONFIG_OPENTHREAD_OPERATIONAL_DATASET_AUTO_INIT OT_OPERATIONAL_DATASET_AUTO_INIT "Enable operational dataset auto init")
kconfig_to_ot_option(CONFIG_OPENTHREAD_OTNS OT_OTNS "Enable OTNS support")
kconfig_to_ot_option(CONFIG_OPENTHREAD_PING_SENDER OT_PING_SENDER "Enable ping sender support")
kconfig_to_ot_option(CONFIG_OPENTHREAD_PLATFORM_BOOTLOADER_MODE OT_PLATFORM_BOOTLOADER_MODE "Enable platform bootloader mode support")
kconfig_to_ot_option(CONFIG_OPENTHREAD_PLATFORM_KEY_REF OT_PLATFORM_KEY_REF "Enable platform key reference support")
kconfig_to_ot_option(CONFIG_OPENTHREAD_PLATFORM_NETIF OT_PLATFORM_NETIF "Enable platform netif support")
kconfig_to_ot_option(CONFIG_OPENTHREAD_PLATFORM_UDP OT_PLATFORM_UDP "Enable platform UDP support")
+21 −2
Original line number Diff line number Diff line
@@ -17,7 +17,7 @@ config OPENTHREAD_THREAD_VERSION_1_3
	bool "Version 1.3"
config OPENTHREAD_THREAD_VERSION_1_3_1
	bool "Version 1.3.1"
endchoice
endchoice # OPENTHREAD_STACK_VERSION

config OPENTHREAD_THREAD_VERSION
	string
@@ -255,6 +255,25 @@ config OPENTHREAD_PLATFORM_KEY_REF
	  Enable usage of cryptographic key references instead of literal keys.
	  This requires a crypto backend library that supports key references.

choice OPENTHREAD_PLATFORM_BOOTLOADER_MODE_CHOICE
	prompt "Platform bootloader mode configuration"
	optional

config OPENTHREAD_PLATFORM_BOOTLOADER_MODE_RETENTION
	bool "Bootloader mode support with boot mode retention API"
	depends on RETENTION_BOOT_MODE && REBOOT
	select OPENTHREAD_PLATFORM_BOOTLOADER_MODE

config OPENTHREAD_PLATFORM_BOOTLOADER_MODE_GPIO
	bool "Bootloader mode support with GPIO pin trigger"
	select OPENTHREAD_PLATFORM_BOOTLOADER_MODE
endchoice # OPENTHREAD_PLATFORM_BOOTLOADER_MODE

config OPENTHREAD_PLATFORM_BOOTLOADER_MODE
	bool
	help
	  Platform bootloader mode support

config OPENTHREAD_PLATFORM_NETIF
	bool "Platform netif support"

@@ -276,7 +295,7 @@ config OPENTHREAD_POWER_SUPPLY_EXTERNAL_STABLE

config OPENTHREAD_POWER_SUPPLY_EXTERNAL_UNSTABLE
	bool "OT_POWER_SUPPLY_EXTERNAL_UNSTABLE"
endchoice
endchoice # OPENTHREAD_POWER_SUPPLY_CHOICE

config OPENTHREAD_POWER_SUPPLY
	string
+66 −0
Original line number Diff line number Diff line
@@ -9,6 +9,24 @@
#include <openthread/instance.h>
#include <openthread/platform/misc.h>

#if defined(CONFIG_OPENTHREAD_PLATFORM_BOOTLOADER_MODE_RETENTION)

#include <zephyr/retention/bootmode.h>

#elif defined(CONFIG_OPENTHREAD_PLATFORM_BOOTLOADER_MODE_GPIO)

BUILD_ASSERT(DT_HAS_COMPAT_STATUS_OKAY(openthread_config),
	"`openthread,config` compatible node not found");
BUILD_ASSERT(DT_NODE_HAS_PROP(DT_COMPAT_GET_ANY_STATUS_OKAY(openthread_config), bootloader_gpios),
	"`bootloader-gpios` property missing from `openthread,config` compatible node");

#include <zephyr/drivers/gpio.h>

static const struct gpio_dt_spec bootloader_gpio =
	GPIO_DT_SPEC_GET(DT_COMPAT_GET_ANY_STATUS_OKAY(openthread_config),
			 bootloader_gpios);
#endif

#include "platform-zephyr.h"

void otPlatReset(otInstance *aInstance)
@@ -19,6 +37,54 @@ void otPlatReset(otInstance *aInstance)
	sys_reboot(SYS_REBOOT_WARM);
}

#if defined(CONFIG_OPENTHREAD_PLATFORM_BOOTLOADER_MODE)
otError otPlatResetToBootloader(otInstance *aInstance)
{
	OT_UNUSED_VARIABLE(aInstance);

#if defined(CONFIG_OPENTHREAD_PLATFORM_BOOTLOADER_MODE_RETENTION)
	if (bootmode_set(BOOT_MODE_TYPE_BOOTLOADER)) {
		return OT_ERROR_NOT_CAPABLE;
	}
	sys_reboot(SYS_REBOOT_WARM);

#elif defined(CONFIG_OPENTHREAD_PLATFORM_BOOTLOADER_MODE_GPIO)
	/*
	 * To enable resetting to bootloader by triggering gpio pin,
	 * select `CONFIG_OPENTHREAD_PLATFORM_BOOTLOADER_MODE_GPIO=y`,
	 * and in Devicetree create `openthread` node in `/options/` path with
	 * `compatible = "openthread,config"` property and `bootloader-gpios` property,
	 * which should represent GPIO pin's configuration,
	 * containing controller phandle, pin number and pin flags. e.g:
	 *
	 * options {
	 *	openthread {
	 *		compatible = "openthread,config";
	 *		bootloader-gpios = <&gpio0 0 GPIO_ACTIVE_HIGH>;
	 *	};
	 * };
	 *
	 * Note: in below implementation, chosen GPIO pin is configured as output
	 * and initialized to active state (logical value ‘1’).
	 * Configuring pin flags in `bootloader-gpios` allows to choose
	 * if pin should be active in high or in low state.
	 */

	if (!gpio_is_ready_dt(&bootloader_gpio)) {
		return OT_ERROR_NOT_CAPABLE;
	}
	gpio_pin_configure_dt(&bootloader_gpio, GPIO_OUTPUT_ACTIVE);

#endif

	/*
	 * Return OT_ERROR_NOT_CAPABLE if resetting has been unsuccessful (invalid configuration or
	 * triggering reset had no effect)
	 */
	return OT_ERROR_NOT_CAPABLE;
}
#endif /* defined(CONFIG_OPENTHREAD_PLATFORM_BOOTLOADER_MODE) */

otPlatResetReason otPlatGetResetReason(otInstance *aInstance)
{
	ARG_UNUSED(aInstance);