From 54abd997de30f74414735848b6c26cefcd207c8d Mon Sep 17 00:00:00 2001 From: David Sidrane Date: Tue, 12 Jan 2021 14:43:43 -0800 Subject: [PATCH] canbootloader:Update to use NuttX --- platforms/nuttx/CMakeLists.txt | 8 +- .../nuttx/src/canbootloader/CMakeLists.txt | 1 + .../src/canbootloader/common/nuttx_stubs.c | 224 ++++++++++++++++++ .../nuttx/src/canbootloader/sched/timer.c | 4 +- 4 files changed, 233 insertions(+), 4 deletions(-) create mode 100644 platforms/nuttx/src/canbootloader/common/nuttx_stubs.c diff --git a/platforms/nuttx/CMakeLists.txt b/platforms/nuttx/CMakeLists.txt index 25687dace5..960ebf0f97 100644 --- a/platforms/nuttx/CMakeLists.txt +++ b/platforms/nuttx/CMakeLists.txt @@ -69,7 +69,12 @@ elseif("${PX4_BOARD_LABEL}" STREQUAL "canbootloader") ) target_link_libraries(px4 PRIVATE - -Wl,-wrap,sched_process_timer -Wl,-wrap,nx_sem_post -Wl,-wrap,nx_sem_wait + -Wl,-wrap,nxsched_process_timer + -Wl,-wrap,nxsem_post + -Wl,-wrap,nxsem_wait + -Wl,-wrap,arm_svcall + -Wl,-wrap,nx_start + -Wl,-wrap,exit ) else() if(NOT "${PX4_BOARD_LINKER_PREFIX}" STREQUAL "") @@ -119,7 +124,6 @@ target_link_libraries(px4 PRIVATE -fno-exceptions -fno-rtti - -Wl,--script=${PX4_BINARY_DIR_CYG}/NuttX/nuttx-config/scripts/${SCRIPT_PREFIX}script.ld -Wl,-Map=${PX4_CONFIG}.map -Wl,--warn-common diff --git a/platforms/nuttx/src/canbootloader/CMakeLists.txt b/platforms/nuttx/src/canbootloader/CMakeLists.txt index 4752d50214..6c35042e7c 100644 --- a/platforms/nuttx/src/canbootloader/CMakeLists.txt +++ b/platforms/nuttx/src/canbootloader/CMakeLists.txt @@ -35,6 +35,7 @@ px4_add_library(canbootloader arch/stm32/board_identity.c arch/stm32/drivers/can/driver.c common/boot_app_shared.c + common/nuttx_stubs.c fs/flash.c protocol/uavcan.c sched/timer.c diff --git a/platforms/nuttx/src/canbootloader/common/nuttx_stubs.c b/platforms/nuttx/src/canbootloader/common/nuttx_stubs.c new file mode 100644 index 0000000000..897bca8718 --- /dev/null +++ b/platforms/nuttx/src/canbootloader/common/nuttx_stubs.c @@ -0,0 +1,224 @@ +/**************************************************************************** + * + * Copyright (c) 2017-2021 PX4 Development Team. All rights reserved. + * Author: David Sidrane + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name PX4 nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include +#include "nuttx/arch.h" +#include "arm_internal.h" + + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +/**************************************************************************** + * Private Types + ****************************************************************************/ + +/**************************************************************************** + * Private Function Prototypes + ****************************************************************************/ + +/**************************************************************************** + * Private Data + ****************************************************************************/ + +/**************************************************************************** + * Public Data + ****************************************************************************/ + +/**************************************************************************** + * Private Functions + ****************************************************************************/ + +/**************************************************************************** + * Public Functions + ****************************************************************************/ +__EXPORT int __wrap_nxsem_wait(void *sem); +__EXPORT int __wrap_nxsem_post(void *sem); + +int main(int argc, char **argv); +/**************************************************************************** + * Name: nxsem_wait and nxsem_post + * + * Description: + * These functions hijacks by the way of a compile time wrapper the systems + * sem_wait and sem_post functions. + * + ****************************************************************************/ + +int __wrap_nxsem_wait(void *sem) +{ + return 0; +} + +int __wrap_nxsem_post(void *sem) +{ + return 0; +} + +/**************************************************************************** + * Public Functions + ****************************************************************************/ +void timer_init(void); +int __wrap_arm_svcall(int irq, FAR void *context); +__EXPORT void __wrap_exit(int status); + + +/**************************************************************************** + * Name: os_start + * + * Description: + * This function hijacks the entry point of the OS. Normally called by the + * statup code for a given architecture + * + ****************************************************************************/ +#ifdef CONFIG_STACK_COLORATION +inline static void irq_stack_collor(void *pv, unsigned int nwords) +{ +#ifdef CONFIG_ARCH_INTERRUPTSTACK + /* Set the Interrupt stack to the stack coloration value then jump to + * os_start(). We take extreme care here because were currently + * executing on this stack. + * + * We want to avoid sneak stack access generated by the compiler. + */ + + __asm__ __volatile__ + ( + "\tmov r0, %[addr]\n" /* R0 = Address */ + "\tmovs r1, %[nwords]\n" /* R1 = nbyts*/ + "\tbeq 2f\n" /* (should not happen) */ + + "\tbic r0, r0, #3\n" /* R0 = Aligned stackptr */ + "\tmovw r2, #0xbeef\n" /* R2 = STACK_COLOR = 0xdeadbeef */ + "\tmovt r2, #0xdead\n" + + "1:\n" /* Top of the loop */ + "\tsub r1, r1, #1\n" /* R1 nwords-- */ + "\tcmp r1, #0\n" /* Check (nwords == 0) */ + "\tstr r2, [r0], #4\n" /* Save stack color word, increment stackptr */ + "\tbne 1b\n" /* Bottom of the loop */ + + "2:\n" + : + : [addr]"r"(pv), [nwords]"r"(nwords) /* Address*/ + : /* No clobbers */ + + ); +#endif +} +#endif + +void __wrap_nx_start(void) +{ +#ifdef CONFIG_STACK_COLORATION + /* Color the irq stack */ + irq_stack_collor((void *)&g_intstackalloc, CONFIG_ARCH_INTERRUPTSTACK / sizeof(uint32_t)); +#endif + + /* Initialize the timer software subsystem */ + timer_init(); + + /* Initialize the interrupt subsystem */ + up_irqinitialize(); + + +#if !defined(CONFIG_SUPPRESS_INTERRUPTS) && !defined(CONFIG_SUPPRESS_TIMER_INTS) && \ + !defined(CONFIG_SYSTEMTICK_EXTCLK) + /* Initialize the OS's timer subsystem */ + up_timer_initialize(); +#endif + + /* Keep the compiler happy for a no return function */ + while (1) { + main(0, 0); + } +} + +/**************************************************************************** + * Name: malloc + * + * Description: + * This function hijacks the OS's malloc and provides no allocation + * + ****************************************************************************/ + +FAR void *malloc(size_t size) +{ + return NULL; +} + +/**************************************************************************** + * Name: malloc + * + * Description: + * This function hijacks the systems exit + * + ****************************************************************************/ +void __wrap_exit(int status) +{ + while (1); +} + +/**************************************************************************** + * Name: sched_ufree + * + * Description: + * This function hijacks the systems sched_ufree that my be called during + * exception processing. + * + ****************************************************************************/ + +void sched_ufree(FAR void *address) +{ + +} + +/**************************************************************************** + * Name: up_svcall + * + * Description: + * This function hijacks by the way of a compile time wrapper the systems + * up_svcall + * + ****************************************************************************/ + +int __wrap_arm_svcall(int irq, FAR void *context) +{ + return 0; +} diff --git a/platforms/nuttx/src/canbootloader/sched/timer.c b/platforms/nuttx/src/canbootloader/sched/timer.c index 626a4bcc6f..0d01f4cdf2 100644 --- a/platforms/nuttx/src/canbootloader/sched/timer.c +++ b/platforms/nuttx/src/canbootloader/sched/timer.c @@ -81,7 +81,7 @@ const bl_timer_cb_t null_cb = { 0, 0 }; * the sceduler's sched_process_timer and service it here. Thus replacing * the NuttX scheduler with are timer driven scheduling. */ -void __wrap_sched_process_timer(void); +void __wrap_nxsched_process_timer(void); /**************************************************************************** * Name: timer_tic @@ -120,7 +120,7 @@ time_ms_t timer_tic(void) * None * ****************************************************************************/ -__EXPORT void __wrap_sched_process_timer(void) +__EXPORT void __wrap_nxsched_process_timer(void) { //PROBE(1, true); //PROBE(1, false);