• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2020 The Pigweed Authors
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License"); you may not
4 // use this file except in compliance with the License. You may obtain a copy of
5 // the License at
6 //
7 //     https://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11 // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12 // License for the specific language governing permissions and limitations under
13 // the License.
14 
15 #include "pw_boot_armv7m/boot.h"
16 
17 #include "pw_malloc/malloc.h"
18 #include "pw_preprocessor/compiler.h"
19 #include "pw_sys_io_baremetal_stm32f429/init.h"
20 
21 // Note that constexpr is used inside of this function instead of using a static
22 // constexpr or declaring it outside of this function in an anonymous namespace,
23 // because constexpr makes it available for the compiler to evaluate during
24 // copmile time but does NOT require it to be evaluated at compile team and we
25 // have to be incredibly careful that this does not end up in the .data section.
pw_boot_PreStaticMemoryInit()26 void pw_boot_PreStaticMemoryInit() {
27   // TODO(pwbug/17): Optionally enable Replace when Pigweed config system is
28   // added.
29 #if PW_ARMV7M_ENABLE_FPU
30   // Enable FPU if built using hardware FPU instructions.
31   // CPCAR mask that enables FPU. (ARMv7-M Section B3.2.20)
32   constexpr uint32_t kFpuEnableMask = (0xFu << 20);
33 
34   // Memory mapped register to enable FPU. (ARMv7-M Section B3.2.2, Table B3-4)
35   volatile uint32_t& arm_v7m_cpacr =
36       *reinterpret_cast<volatile uint32_t*>(0xE000ED88u);
37   arm_v7m_cpacr |= kFpuEnableMask;
38 
39   // Ensure the FPU configuration is committed and enabled before continuing and
40   // potentially executing any FPU instructions, however rare that may be during
41   // startup.
42   asm volatile(
43       " dsb \n"
44       " isb \n"
45       // clang-format off
46       : /*output=*/
47       : /*input=*/
48       : /*clobbers=*/"memory"
49       // clang-format on
50   );
51 #endif  // PW_ARMV7M_ENABLE_FPU
52 }
53 
pw_boot_PreStaticConstructorInit()54 void pw_boot_PreStaticConstructorInit() {
55 #if PW_MALLOC_ACTIVE
56   pw_MallocInit();
57 #endif  // PW_MALLOC_ACTIVE
58 }
59 
pw_boot_PreMainInit()60 void pw_boot_PreMainInit() { pw_sys_io_Init(); }
61 
pw_boot_PostMain()62 PW_NO_RETURN void pw_boot_PostMain() {
63   // In case main() returns, just sit here until the device is reset.
64   while (true) {
65   }
66   PW_UNREACHABLE;
67 }
68