Keyboard firmwares for Atmel AVR and Cortex-M
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

ch-bootloader-jump.patch 3.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. diff --git a/os/common/ports/ARMCMx/compilers/GCC/crt0_v6m.s b/os/common/ports/ARMCMx/compilers/GCC/crt0_v6m.s
  2. index 51a79bb..42d07bd 100644
  3. --- a/os/common/ports/ARMCMx/compilers/GCC/crt0_v6m.s
  4. +++ b/os/common/ports/ARMCMx/compilers/GCC/crt0_v6m.s
  5. @@ -105,6 +105,13 @@
  6. #define CRT0_CALL_DESTRUCTORS TRUE
  7. #endif
  8. +/**
  9. + * @brief Magic number for jumping to bootloader.
  10. + */
  11. +#if !defined(MAGIC_BOOTLOADER_NUMBER) || defined(__DOXYGEN__)
  12. +#define MAGIC_BOOTLOADER_NUMBER 0xDEADBEEF
  13. +#endif
  14. +
  15. /*===========================================================================*/
  16. /* Code section. */
  17. /*===========================================================================*/
  18. @@ -124,6 +131,17 @@
  19. .thumb_func
  20. .global Reset_Handler
  21. Reset_Handler:
  22. +
  23. +#ifdef STM32_BOOTLOADER_ADDRESS
  24. + /* jump to bootloader code */
  25. + ldr r0, =__ram0_end__-4
  26. + ldr r1, =MAGIC_BOOTLOADER_NUMBER
  27. + ldr r2, [r0, #0]
  28. + str r0, [r0, #0] /* erase stored magic */
  29. + cmp r2, r1
  30. + beq Bootloader_Jump
  31. +#endif /* STM32_BOOTLOADER_ADDRESS */
  32. +
  33. /* Interrupts are globally masked initially.*/
  34. cpsid i
  35. @@ -242,6 +260,21 @@ endfiniloop:
  36. ldr r1, =__default_exit
  37. bx r1
  38. +#ifdef STM32_BOOTLOADER_ADDRESS
  39. +/*
  40. + * Jump-to-bootloader function.
  41. + */
  42. +
  43. + .align 2
  44. + .thumb_func
  45. +Bootloader_Jump:
  46. + ldr r0, =STM32_BOOTLOADER_ADDRESS
  47. + ldr r1, [r0, #0]
  48. + mov sp, r1
  49. + ldr r0, [r0, #4]
  50. + bx r0
  51. +#endif /* STM32_BOOTLOADER_ADDRESS */
  52. +
  53. #endif
  54. /** @} */
  55. diff --git a/os/common/ports/ARMCMx/compilers/GCC/crt0_v7m.s b/os/common/ports/ARMCMx/compilers/GCC/crt0_v7m.s
  56. index 4812a29..dca9f88 100644
  57. --- a/os/common/ports/ARMCMx/compilers/GCC/crt0_v7m.s
  58. +++ b/os/common/ports/ARMCMx/compilers/GCC/crt0_v7m.s
  59. @@ -140,6 +140,13 @@
  60. #define CRT0_CPACR_INIT 0x00F00000
  61. #endif
  62. +/**
  63. + * @brief Magic number for jumping to bootloader.
  64. + */
  65. +#if !defined(MAGIC_BOOTLOADER_NUMBER) || defined(__DOXYGEN__)
  66. +#define MAGIC_BOOTLOADER_NUMBER 0xDEADBEEF
  67. +#endif
  68. +
  69. /*===========================================================================*/
  70. /* Code section. */
  71. /*===========================================================================*/
  72. @@ -164,6 +171,17 @@
  73. .thumb_func
  74. .global Reset_Handler
  75. Reset_Handler:
  76. +
  77. +#ifdef STM32_BOOTLOADER_ADDRESS
  78. + /* jump to bootloader code */
  79. + ldr r0, =__ram0_end__-4
  80. + ldr r1, =MAGIC_BOOTLOADER_NUMBER
  81. + ldr r2, [r0, #0]
  82. + str r0, [r0, #0] /* erase stored magic */
  83. + cmp r2, r1
  84. + beq Bootloader_Jump
  85. +#endif /* STM32_BOOTLOADER_ADDRESS */
  86. +
  87. /* Interrupts are globally masked initially.*/
  88. cpsid i
  89. @@ -305,6 +323,21 @@ endfiniloop:
  90. /* Branching to the defined exit handler.*/
  91. b __default_exit
  92. +#ifdef STM32_BOOTLOADER_ADDRESS
  93. +/*
  94. + * Jump-to-bootloader function.
  95. + */
  96. +
  97. + .align 2
  98. + .thumb_func
  99. +Bootloader_Jump:
  100. + ldr r0, =STM32_BOOTLOADER_ADDRESS
  101. + ldr r1, [r0, #0]
  102. + mov sp, r1
  103. + ldr r0, [r0, #4]
  104. + bx r0
  105. +#endif /* STM32_BOOTLOADER_ADDRESS */
  106. +
  107. #endif /* !defined(__DOXYGEN__) */
  108. /** @} */