From b754ecbe686ff8f622d658f6a5768c9ef1d89995 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A1szl=C3=B3=20Monda?= Date: Fri, 13 Oct 2017 21:39:17 +0200 Subject: [PATCH] Replicate the wormhole in the bootloader and make it jump to the application if it's open and the enumeration mode is anything but EnumerationMode_Bootloader. --- src/bootloader/src/bl_main.c | 3 +- src/bootloader/src/wormhole.c | 3 ++ src/bootloader/wormhole.h | 32 +++++++++++++++++++ .../kds/freedom_bootloader/.project | 10 ++++++ .../MK22FN512xxx12_application_0x0000.ld | 14 +++++++- 5 files changed, 60 insertions(+), 2 deletions(-) create mode 100644 src/bootloader/src/wormhole.c create mode 100644 src/bootloader/wormhole.h diff --git a/src/bootloader/src/bl_main.c b/src/bootloader/src/bl_main.c index 53d17a4..d4b5c49 100644 --- a/src/bootloader/src/bl_main.c +++ b/src/bootloader/src/bl_main.c @@ -44,6 +44,7 @@ #include "property/property.h" #include "utilities/vector_table_info.h" #include "utilities/fsl_rtos_abstraction.h" +#include "bootloader/wormhole.h" #if BL_FEATURE_CRC_CHECK #include "bootloader/bl_app_crc_check.h" #endif @@ -321,7 +322,7 @@ static peripheral_descriptor_t const *get_active_peripheral(void) { if (is_direct_boot()) { - if (RCM->SRS0 & RCM_SRS0_POR_MASK) { + if (RCM->SRS0 & RCM_SRS0_POR_MASK || (IS_WORMHOLE_OPEN && Wormhole.enumerationMode != EnumerationMode_Bootloader)) { jump_to_application(applicationAddress, stackPointer); } } diff --git a/src/bootloader/src/wormhole.c b/src/bootloader/src/wormhole.c new file mode 100644 index 0000000..cdd5865 --- /dev/null +++ b/src/bootloader/src/wormhole.c @@ -0,0 +1,3 @@ +#include "bootloader/wormhole.h" + +wormhole_t __attribute__ ((used, section (".noinit"))) Wormhole; diff --git a/src/bootloader/wormhole.h b/src/bootloader/wormhole.h new file mode 100644 index 0000000..c7e33aa --- /dev/null +++ b/src/bootloader/wormhole.h @@ -0,0 +1,32 @@ +#ifndef __WORMHOLE_H__ +#define __WORMHOLE_H__ + +// Includes: + + #include + +// Macros: + + #define WORMHOLE_MAGIC_NUMBER 0x3b04cd9e94521f9a + #define IS_WORMHOLE_OPEN (Wormhole.magicNumber == WORMHOLE_MAGIC_NUMBER) + +// Typedefs: + + typedef enum { + EnumerationMode_Bootloader, + EnumerationMode_BusPal, + EnumerationMode_NormalKeyboard, + EnumerationMode_CompatibleKeyboard, + } enumeration_mode_t; + + typedef struct { + uint64_t magicNumber; + uint8_t enumerationMode; + uint16_t timeoutMs; + } wormhole_t; + +// Variables: + + extern wormhole_t __attribute__ ((section (".noinit"))) Wormhole; + +#endif diff --git a/targets/MK22F51212/kds/freedom_bootloader/.project b/targets/MK22F51212/kds/freedom_bootloader/.project index 3152778..b8b3d2a 100644 --- a/targets/MK22F51212/kds/freedom_bootloader/.project +++ b/targets/MK22F51212/kds/freedom_bootloader/.project @@ -215,6 +215,11 @@ 2 virtual:/virtual + + src/bootloader/wormhole.h + 1 + PARENT-4-PROJECT_LOC/src/bootloader/wormhole.h + src/crc/crc16.h 1 @@ -445,6 +450,11 @@ 1 PARENT-4-PROJECT_LOC/src/bootloader/src/usb_hid_msc_peripheral_interface.c + + src/bootloader/src/wormhole.c + 1 + PARENT-4-PROJECT_LOC/src/bootloader/src/wormhole.c + src/crc/src/crc16.c 1 diff --git a/targets/common/linker/kds/MK22F51212/MK22FN512xxx12_application_0x0000.ld b/targets/common/linker/kds/MK22F51212/MK22FN512xxx12_application_0x0000.ld index ee42a79..2e28180 100644 --- a/targets/common/linker/kds/MK22F51212/MK22FN512xxx12_application_0x0000.ld +++ b/targets/common/linker/kds/MK22F51212/MK22FN512xxx12_application_0x0000.ld @@ -61,7 +61,8 @@ MEMORY m_interrupts (RX) : ORIGIN = 0x00000000, LENGTH = 0x00000400 m_flash_config (RX) : ORIGIN = 0x00000400, LENGTH = 0x00000010 m_text (RX) : ORIGIN = 0x00000410, LENGTH = 0x0007FBF0 - m_data (RW) : ORIGIN = 0x1FFF0000, LENGTH = 0x00020000 + m_data (RW) : ORIGIN = 0x1FFF0000, LENGTH = 0x0001FF00 + m_noinit (RW) : ORIGIN = 0x2000FF00, LENGTH = 0x00000100 } /* Define output sections */ @@ -255,5 +256,16 @@ SECTIONS .ARM.attributes 0 : { *(.ARM.attributes) } ASSERT(__StackLimit >= __HeapLimit, "region m_data_2 overflowed with stack and heap") + + .noinit (NOLOAD): + { + . = ALIGN(4); + _noinit = .; + + *(.noinit .noinit.*) + + . = ALIGN(4) ; + _end_noinit = .; + } > m_noinit }