This is an automated email from the ASF dual-hosted git repository.

acassis pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git


The following commit(s) were added to refs/heads/master by this push:
     new 2477914ea62 board/arm/rp2040: implement "board_boot_image" for 
bootloader support
2477914ea62 is described below

commit 2477914ea62b6baf1f7dcc4950ea28f689fbe919
Author: Lars Kruse <de...@sumpfralle.de>
AuthorDate: Fri Sep 12 17:33:48 2025 +0200

    board/arm/rp2040: implement "board_boot_image" for bootloader support
    
    This function is required by the bootloaders (nxboot and mcuboot).
    
    Signed-off-by: Lars Kruse <de...@sumpfralle.de>
---
 boards/arm/rp2040/common/src/Make.defs           |   4 +
 boards/arm/rp2040/common/src/rp2040_boot_image.c | 166 +++++++++++++++++++++++
 2 files changed, 170 insertions(+)

diff --git a/boards/arm/rp2040/common/src/Make.defs 
b/boards/arm/rp2040/common/src/Make.defs
index 187e9aa1028..202a2a95abf 100644
--- a/boards/arm/rp2040/common/src/Make.defs
+++ b/boards/arm/rp2040/common/src/Make.defs
@@ -29,6 +29,10 @@ ifeq ($(CONFIG_BOARDCTL_RESET),y)
 CSRCS += rp2040_reset.c
 endif
 
+ifeq ($(CONFIG_BOARDCTL_BOOT_IMAGE),y)
+CSRCS += rp2040_boot_image.c
+endif
+
 ifeq ($(CONFIG_SPI),y)
 CSRCS += rp2040_spi.c
 endif
diff --git a/boards/arm/rp2040/common/src/rp2040_boot_image.c 
b/boards/arm/rp2040/common/src/rp2040_boot_image.c
new file mode 100644
index 00000000000..a716078fc2d
--- /dev/null
+++ b/boards/arm/rp2040/common/src/rp2040_boot_image.c
@@ -0,0 +1,166 @@
+/****************************************************************************
+ * boards/arm/rp2040/common/src/rp2040_boot_image.c
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.  The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+
+#include <debug.h>
+#include <stdio.h>
+#include <fcntl.h>
+
+#include <sys/boardctl.h>
+#include <nuttx/irq.h>
+#include <arch/barriers.h>
+
+#include "nvic.h"
+#include "arm_internal.h"
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Private Types
+ ****************************************************************************/
+
+/* This structure represents the first two entries on NVIC vector table */
+
+struct arm_vector_table
+{
+  uint32_t spr;   /* Stack pointer on reset */
+  uint32_t reset; /* Pointer to reset exception handler */
+};
+
+/****************************************************************************
+ * Private Function Prototypes
+ ****************************************************************************/
+
+static void cleanup_arm_nvic(void);
+static void systick_disable(void);
+
+/****************************************************************************
+ * Private Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name:  cleanup_arm_nvic
+ *
+ * Description:
+ *   Acknowledge and disable all interrupts in NVIC
+ *
+ * Input Parameters:
+ *   None
+ *
+ *  Returned Value:
+ *    None
+ *
+ ****************************************************************************/
+
+static void cleanup_arm_nvic(void)
+{
+  /* Allow any pending interrupts to be recognized */
+
+  UP_ISB();
+  up_irq_disable();
+
+  /* Disable all interrupts */
+
+  putreg32(0xffffffff, ARMV6M_NVIC_ICER);
+
+  /* Clear all pending interrupts */
+
+  putreg32(0xffffffff, ARMV6M_NVIC_ICPR);
+}
+
+/****************************************************************************
+ * Name:  systick_disable
+ *
+ * Description:
+ *   Disable the SysTick system timer
+ *
+ * Input Parameters:
+ *   None
+ *
+ *  Returned Value:
+ *    None
+ *
+ ****************************************************************************/
+
+static void systick_disable(void)
+{
+  putreg32(0, ARMV6M_SYSTICK_CSR);
+  putreg32(SYSTICK_RVR_MASK, ARMV6M_SYSTICK_RVR);
+  putreg32(0, ARMV6M_SYSTICK_CVR);
+}
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: board_boot_image
+ *
+ * Description:
+ *   This entry point is called by bootloader to jump to application image.
+ *
+ ****************************************************************************/
+
+int board_boot_image(const char *path, uint32_t hdr_size)
+{
+  static struct arm_vector_table vt;
+  struct file file;
+  ssize_t bytes;
+  int ret;
+
+  ret = file_open(&file, path, O_RDONLY | O_CLOEXEC);
+  if (ret < 0)
+    {
+      syslog(LOG_ERR, "Failed to open %s with: %d", path, ret);
+      return ret;
+    }
+
+  bytes = file_pread(&file, &vt, sizeof(vt), hdr_size);
+  if (bytes != sizeof(vt))
+    {
+      syslog(LOG_ERR, "Failed to read ARM vector table: %d", bytes);
+      return bytes < 0 ? bytes : -1;
+    }
+
+  systick_disable();
+
+  cleanup_arm_nvic();
+
+  /* Set main and process stack pointers */
+
+  __asm__ __volatile__(
+                       "\tmsr msp, %0\n"
+                       "\tmsr control, %1\n"
+                       "\tisb\n"
+                       "\tmov pc, %2\n"
+                       :
+                       : "r" (vt.spr), "r" (0), "r" (vt.reset));
+
+  return 0;
+}

Reply via email to