/* Copyright 2017 Colin T.A. Gray * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "test_common.hpp" using testing::_; using testing::Return; class ActionLayer : public TestFixture {}; // TEST_F(ActionLayer, LayerStateDBG) { // layer_state_set(0); // } // TEST_F(ActionLayer, LayerStateSet) { // layer_state_set(0); // EXPECT_EQ(layer_state, 0); // layer_state_set(0b001100); // EXPECT_EQ(layer_state, 0b001100); // } // TEST_F(ActionLayer, LayerStateIs) { // layer_state_set(0); // EXPECT_EQ(layer_state_is(0), true); // EXPECT_EQ(layer_state_is(1), true); // layer_state_set(1); // EXPECT_EQ(layer_state_is(0), true); // EXPECT_EQ(layer_state_is(1), true); // layer_state_set(2); // EXPECT_EQ(layer_state_is(0), false); // EXPECT_EQ(layer_state_is(1), false); // EXPECT_EQ(layer_state_is(2), true); // } TEST_F(ActionLayer, LayerStateCmp) { uint32_t prev_layer; prev_layer = 0; EXPECT_EQ(layer_state_cmp(prev_layer, 0), true); EXPECT_EQ(layer_state_cmp(prev_layer, 1), false); prev_layer = 1; EXPECT_EQ(layer_state_cmp(prev_layer, 0), true); EXPECT_EQ(layer_state_cmp(prev_layer, 1), false); prev_layer = 2; EXPECT_EQ(layer_state_cmp(prev_layer, 0), false); EXPECT_EQ(layer_state_cmp(prev_layer, 1), true); EXPECT_EQ(layer_state_cmp(prev_layer, 2), false); } // TEST_F(ActionLayer, LayerClear) { // layer_clear(); // EXPECT_EQ(layer_state, 0); // } // TEST_F(ActionLayer, LayerMove) { // layer_move(0); // EXPECT_EQ(layer_state, 1); // layer_move(3); // EXPECT_EQ(layer_state, 0b1000); // } // TEST_F(ActionLayer, LayerOn) { // layer_clear(); // layer_on(1); // layer_on(3); // layer_on(3); // EXPECT_EQ(layer_state, 0b1010); // } // TEST_F(ActionLayer, LayerOff) { // layer_clear(); // layer_on(1); // layer_on(3); // layer_off(3); // layer_off(2); // EXPECT_EQ(layer_state, 0b1000); // } lass='path'>path: root/tmk_core/tool/chibios/ch-bootloader-jump.patch
blob: c6eb2405c982a07c200edefcbda68410b662481e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
diff --git a/os/common/ports/ARMCMx/compilers/GCC/crt0_v6m.s b/os/common/ports/ARMCMx/compilers/GCC/crt0_v6m.s
index 51a79bb..42d07bd 100644
--- a/os/common/ports/ARMCMx/compilers/GCC/crt0_v6m.s
+++ b/os/common/ports/ARMCMx/compilers/GCC/crt0_v6m.s
@@ -105,6 +105,13 @@
 #define CRT0_CALL_DESTRUCTORS               TRUE
 #endif
 
+/**
+ * @brief   Magic number for jumping to bootloader.
+ */
+#if !defined(MAGIC_BOOTLOADER_NUMBER) || defined(__DOXYGEN__)
+#define MAGIC_BOOTLOADER_NUMBER 0xDEADBEEF
+#endif
+
 /*===========================================================================*/
 /* Code section.                                                             */
 /*===========================================================================*/
@@ -124,6 +131,17 @@
                 .thumb_func
                 .global Reset_Handler
 Reset_Handler:
+
+#ifdef STM32_BOOTLOADER_ADDRESS
+                /* jump to bootloader code */
+                ldr        r0, =__ram0_end__-4
+                ldr        r1, =MAGIC_BOOTLOADER_NUMBER
+                ldr        r2, [r0, #0]
+                str        r0, [r0, #0] /* erase stored magic */
+                cmp        r2, r1
+                beq        Bootloader_Jump
+#endif /* STM32_BOOTLOADER_ADDRESS */
+
                 /* Interrupts are globally masked initially.*/
                 cpsid   i
 
@@ -242,6 +260,21 @@ endfiniloop:
                 ldr     r1, =__default_exit
                 bx      r1
 
+#ifdef STM32_BOOTLOADER_ADDRESS
+/*
+ * Jump-to-bootloader function.
+ */
+
+                .align  2
+                .thumb_func
+Bootloader_Jump:
+                ldr     r0, =STM32_BOOTLOADER_ADDRESS
+                ldr     r1, [r0, #0]
+                mov     sp, r1
+                ldr     r0, [r0, #4]
+                bx      r0
+#endif /* STM32_BOOTLOADER_ADDRESS */
+
 #endif
 
 /** @} */
diff --git a/os/common/ports/ARMCMx/compilers/GCC/crt0_v7m.s b/os/common/ports/ARMCMx/compilers/GCC/crt0_v7m.s
index 4812a29..dca9f88 100644
--- a/os/common/ports/ARMCMx/compilers/GCC/crt0_v7m.s
+++ b/os/common/ports/ARMCMx/compilers/GCC/crt0_v7m.s
@@ -140,6 +140,13 @@
 #define CRT0_CPACR_INIT                     0x00F00000
 #endif
 
+/**
+ * @brief   Magic number for jumping to bootloader.
+ */
+#if !defined(MAGIC_BOOTLOADER_NUMBER) || defined(__DOXYGEN__)
+#define MAGIC_BOOTLOADER_NUMBER 0xDEADBEEF
+#endif
+
 /*===========================================================================*/
 /* Code section.                                                             */
 /*===========================================================================*/
@@ -164,6 +171,17 @@
                 .thumb_func
                 .global Reset_Handler
 Reset_Handler:
+
+#ifdef STM32_BOOTLOADER_ADDRESS
+                /* jump to bootloader code */
+                ldr        r0, =__ram0_end__-4
+                ldr        r1, =MAGIC_BOOTLOADER_NUMBER
+                ldr        r2, [r0, #0]
+                str        r0, [r0, #0] /* erase stored magic */
+                cmp        r2, r1
+                beq        Bootloader_Jump
+#endif /* STM32_BOOTLOADER_ADDRESS */
+
                 /* Interrupts are globally masked initially.*/
                 cpsid   i
 
@@ -305,6 +323,21 @@ endfiniloop:
                 /* Branching to the defined exit handler.*/
                 b       __default_exit
 
+#ifdef STM32_BOOTLOADER_ADDRESS
+/*
+ * Jump-to-bootloader function.
+ */
+
+                .align  2
+                .thumb_func
+Bootloader_Jump:
+                ldr     r0, =STM32_BOOTLOADER_ADDRESS
+                ldr     r1, [r0, #0]
+                mov     sp, r1
+                ldr     r0, [r0, #4]
+                bx      r0
+#endif /* STM32_BOOTLOADER_ADDRESS */
+
 #endif /* !defined(__DOXYGEN__) */
 
 /** @} */