Color Oled(SSD1331) connect to STMicroelectronics Nucleo-F466

Dependencies:   ssd1331

Committer:
kadonotakashi
Date:
Thu Oct 11 02:27:46 2018 +0000
Revision:
3:f3764f852aa8
Parent:
0:8fdf9a60065b
Nucreo 446 + SSD1331 test version;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kadonotakashi 0:8fdf9a60065b 1 /******************************************************************************
kadonotakashi 0:8fdf9a60065b 2 * @file tz_context.c
kadonotakashi 0:8fdf9a60065b 3 * @brief Context Management for Armv8-M TrustZone - Sample implementation
kadonotakashi 0:8fdf9a60065b 4 * @version V1.1.1
kadonotakashi 0:8fdf9a60065b 5 * @date 10. January 2018
kadonotakashi 0:8fdf9a60065b 6 ******************************************************************************/
kadonotakashi 0:8fdf9a60065b 7 /*
kadonotakashi 0:8fdf9a60065b 8 * Copyright (c) 2016-2018 Arm Limited. All rights reserved.
kadonotakashi 0:8fdf9a60065b 9 *
kadonotakashi 0:8fdf9a60065b 10 * SPDX-License-Identifier: Apache-2.0
kadonotakashi 0:8fdf9a60065b 11 *
kadonotakashi 0:8fdf9a60065b 12 * Licensed under the Apache License, Version 2.0 (the License); you may
kadonotakashi 0:8fdf9a60065b 13 * not use this file except in compliance with the License.
kadonotakashi 0:8fdf9a60065b 14 * You may obtain a copy of the License at
kadonotakashi 0:8fdf9a60065b 15 *
kadonotakashi 0:8fdf9a60065b 16 * www.apache.org/licenses/LICENSE-2.0
kadonotakashi 0:8fdf9a60065b 17 *
kadonotakashi 0:8fdf9a60065b 18 * Unless required by applicable law or agreed to in writing, software
kadonotakashi 0:8fdf9a60065b 19 * distributed under the License is distributed on an AS IS BASIS, WITHOUT
kadonotakashi 0:8fdf9a60065b 20 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
kadonotakashi 0:8fdf9a60065b 21 * See the License for the specific language governing permissions and
kadonotakashi 0:8fdf9a60065b 22 * limitations under the License.
kadonotakashi 0:8fdf9a60065b 23 */
kadonotakashi 0:8fdf9a60065b 24
kadonotakashi 0:8fdf9a60065b 25 #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
kadonotakashi 0:8fdf9a60065b 26
kadonotakashi 0:8fdf9a60065b 27 #include "RTE_Components.h"
kadonotakashi 0:8fdf9a60065b 28 #include CMSIS_device_header
kadonotakashi 0:8fdf9a60065b 29 #include "tz_context.h"
kadonotakashi 0:8fdf9a60065b 30
kadonotakashi 0:8fdf9a60065b 31 /// Number of process slots (threads may call secure library code)
kadonotakashi 0:8fdf9a60065b 32 #ifndef TZ_PROCESS_STACK_SLOTS
kadonotakashi 0:8fdf9a60065b 33 #define TZ_PROCESS_STACK_SLOTS 8U
kadonotakashi 0:8fdf9a60065b 34 #endif
kadonotakashi 0:8fdf9a60065b 35
kadonotakashi 0:8fdf9a60065b 36 /// Stack size of the secure library code
kadonotakashi 0:8fdf9a60065b 37 #ifndef TZ_PROCESS_STACK_SIZE
kadonotakashi 0:8fdf9a60065b 38 #define TZ_PROCESS_STACK_SIZE 256U
kadonotakashi 0:8fdf9a60065b 39 #endif
kadonotakashi 0:8fdf9a60065b 40
kadonotakashi 0:8fdf9a60065b 41 typedef struct {
kadonotakashi 0:8fdf9a60065b 42 uint32_t sp_top; // stack space top
kadonotakashi 0:8fdf9a60065b 43 uint32_t sp_limit; // stack space limit
kadonotakashi 0:8fdf9a60065b 44 uint32_t sp; // current stack pointer
kadonotakashi 0:8fdf9a60065b 45 } stack_info_t;
kadonotakashi 0:8fdf9a60065b 46
kadonotakashi 0:8fdf9a60065b 47 static stack_info_t ProcessStackInfo [TZ_PROCESS_STACK_SLOTS];
kadonotakashi 0:8fdf9a60065b 48 static uint64_t ProcessStackMemory[TZ_PROCESS_STACK_SLOTS][TZ_PROCESS_STACK_SIZE/8U];
kadonotakashi 0:8fdf9a60065b 49 static uint32_t ProcessStackFreeSlot = 0xFFFFFFFFU;
kadonotakashi 0:8fdf9a60065b 50
kadonotakashi 0:8fdf9a60065b 51
kadonotakashi 0:8fdf9a60065b 52 /// Initialize secure context memory system
kadonotakashi 0:8fdf9a60065b 53 /// \return execution status (1: success, 0: error)
kadonotakashi 0:8fdf9a60065b 54 __attribute__((cmse_nonsecure_entry))
kadonotakashi 0:8fdf9a60065b 55 uint32_t TZ_InitContextSystem_S (void) {
kadonotakashi 0:8fdf9a60065b 56 uint32_t n;
kadonotakashi 0:8fdf9a60065b 57
kadonotakashi 0:8fdf9a60065b 58 if (__get_IPSR() == 0U) {
kadonotakashi 0:8fdf9a60065b 59 return 0U; // Thread Mode
kadonotakashi 0:8fdf9a60065b 60 }
kadonotakashi 0:8fdf9a60065b 61
kadonotakashi 0:8fdf9a60065b 62 for (n = 0U; n < TZ_PROCESS_STACK_SLOTS; n++) {
kadonotakashi 0:8fdf9a60065b 63 ProcessStackInfo[n].sp = 0U;
kadonotakashi 0:8fdf9a60065b 64 ProcessStackInfo[n].sp_limit = (uint32_t)&ProcessStackMemory[n];
kadonotakashi 0:8fdf9a60065b 65 ProcessStackInfo[n].sp_top = (uint32_t)&ProcessStackMemory[n] + TZ_PROCESS_STACK_SIZE;
kadonotakashi 0:8fdf9a60065b 66 *((uint32_t *)ProcessStackMemory[n]) = n + 1U;
kadonotakashi 0:8fdf9a60065b 67 }
kadonotakashi 0:8fdf9a60065b 68 *((uint32_t *)ProcessStackMemory[--n]) = 0xFFFFFFFFU;
kadonotakashi 0:8fdf9a60065b 69
kadonotakashi 0:8fdf9a60065b 70 ProcessStackFreeSlot = 0U;
kadonotakashi 0:8fdf9a60065b 71
kadonotakashi 0:8fdf9a60065b 72 // Default process stack pointer and stack limit
kadonotakashi 0:8fdf9a60065b 73 __set_PSPLIM((uint32_t)ProcessStackMemory);
kadonotakashi 0:8fdf9a60065b 74 __set_PSP ((uint32_t)ProcessStackMemory);
kadonotakashi 0:8fdf9a60065b 75
kadonotakashi 0:8fdf9a60065b 76 // Privileged Thread Mode using PSP
kadonotakashi 0:8fdf9a60065b 77 __set_CONTROL(0x02U);
kadonotakashi 0:8fdf9a60065b 78
kadonotakashi 0:8fdf9a60065b 79 return 1U; // Success
kadonotakashi 0:8fdf9a60065b 80 }
kadonotakashi 0:8fdf9a60065b 81
kadonotakashi 0:8fdf9a60065b 82
kadonotakashi 0:8fdf9a60065b 83 /// Allocate context memory for calling secure software modules in TrustZone
kadonotakashi 0:8fdf9a60065b 84 /// \param[in] module identifies software modules called from non-secure mode
kadonotakashi 0:8fdf9a60065b 85 /// \return value != 0 id TrustZone memory slot identifier
kadonotakashi 0:8fdf9a60065b 86 /// \return value 0 no memory available or internal error
kadonotakashi 0:8fdf9a60065b 87 __attribute__((cmse_nonsecure_entry))
kadonotakashi 0:8fdf9a60065b 88 TZ_MemoryId_t TZ_AllocModuleContext_S (TZ_ModuleId_t module) {
kadonotakashi 0:8fdf9a60065b 89 uint32_t slot;
kadonotakashi 0:8fdf9a60065b 90
kadonotakashi 0:8fdf9a60065b 91 (void)module; // Ignore (fixed Stack size)
kadonotakashi 0:8fdf9a60065b 92
kadonotakashi 0:8fdf9a60065b 93 if (__get_IPSR() == 0U) {
kadonotakashi 0:8fdf9a60065b 94 return 0U; // Thread Mode
kadonotakashi 0:8fdf9a60065b 95 }
kadonotakashi 0:8fdf9a60065b 96
kadonotakashi 0:8fdf9a60065b 97 if (ProcessStackFreeSlot == 0xFFFFFFFFU) {
kadonotakashi 0:8fdf9a60065b 98 return 0U; // No slot available
kadonotakashi 0:8fdf9a60065b 99 }
kadonotakashi 0:8fdf9a60065b 100
kadonotakashi 0:8fdf9a60065b 101 slot = ProcessStackFreeSlot;
kadonotakashi 0:8fdf9a60065b 102 ProcessStackFreeSlot = *((uint32_t *)ProcessStackMemory[slot]);
kadonotakashi 0:8fdf9a60065b 103
kadonotakashi 0:8fdf9a60065b 104 ProcessStackInfo[slot].sp = ProcessStackInfo[slot].sp_top;
kadonotakashi 0:8fdf9a60065b 105
kadonotakashi 0:8fdf9a60065b 106 return (slot + 1U);
kadonotakashi 0:8fdf9a60065b 107 }
kadonotakashi 0:8fdf9a60065b 108
kadonotakashi 0:8fdf9a60065b 109
kadonotakashi 0:8fdf9a60065b 110 /// Free context memory that was previously allocated with \ref TZ_AllocModuleContext_S
kadonotakashi 0:8fdf9a60065b 111 /// \param[in] id TrustZone memory slot identifier
kadonotakashi 0:8fdf9a60065b 112 /// \return execution status (1: success, 0: error)
kadonotakashi 0:8fdf9a60065b 113 __attribute__((cmse_nonsecure_entry))
kadonotakashi 0:8fdf9a60065b 114 uint32_t TZ_FreeModuleContext_S (TZ_MemoryId_t id) {
kadonotakashi 0:8fdf9a60065b 115 uint32_t slot;
kadonotakashi 0:8fdf9a60065b 116
kadonotakashi 0:8fdf9a60065b 117 if (__get_IPSR() == 0U) {
kadonotakashi 0:8fdf9a60065b 118 return 0U; // Thread Mode
kadonotakashi 0:8fdf9a60065b 119 }
kadonotakashi 0:8fdf9a60065b 120
kadonotakashi 0:8fdf9a60065b 121 if ((id == 0U) || (id > TZ_PROCESS_STACK_SLOTS)) {
kadonotakashi 0:8fdf9a60065b 122 return 0U; // Invalid ID
kadonotakashi 0:8fdf9a60065b 123 }
kadonotakashi 0:8fdf9a60065b 124
kadonotakashi 0:8fdf9a60065b 125 slot = id - 1U;
kadonotakashi 0:8fdf9a60065b 126
kadonotakashi 0:8fdf9a60065b 127 if (ProcessStackInfo[slot].sp == 0U) {
kadonotakashi 0:8fdf9a60065b 128 return 0U; // Inactive slot
kadonotakashi 0:8fdf9a60065b 129 }
kadonotakashi 0:8fdf9a60065b 130 ProcessStackInfo[slot].sp = 0U;
kadonotakashi 0:8fdf9a60065b 131
kadonotakashi 0:8fdf9a60065b 132 *((uint32_t *)ProcessStackMemory[slot]) = ProcessStackFreeSlot;
kadonotakashi 0:8fdf9a60065b 133 ProcessStackFreeSlot = slot;
kadonotakashi 0:8fdf9a60065b 134
kadonotakashi 0:8fdf9a60065b 135 return 1U; // Success
kadonotakashi 0:8fdf9a60065b 136 }
kadonotakashi 0:8fdf9a60065b 137
kadonotakashi 0:8fdf9a60065b 138
kadonotakashi 0:8fdf9a60065b 139 /// Load secure context (called on RTOS thread context switch)
kadonotakashi 0:8fdf9a60065b 140 /// \param[in] id TrustZone memory slot identifier
kadonotakashi 0:8fdf9a60065b 141 /// \return execution status (1: success, 0: error)
kadonotakashi 0:8fdf9a60065b 142 __attribute__((cmse_nonsecure_entry))
kadonotakashi 0:8fdf9a60065b 143 uint32_t TZ_LoadContext_S (TZ_MemoryId_t id) {
kadonotakashi 0:8fdf9a60065b 144 uint32_t slot;
kadonotakashi 0:8fdf9a60065b 145
kadonotakashi 0:8fdf9a60065b 146 if ((__get_IPSR() == 0U) || ((__get_CONTROL() & 2U) == 0U)) {
kadonotakashi 0:8fdf9a60065b 147 return 0U; // Thread Mode or using Main Stack for threads
kadonotakashi 0:8fdf9a60065b 148 }
kadonotakashi 0:8fdf9a60065b 149
kadonotakashi 0:8fdf9a60065b 150 if ((id == 0U) || (id > TZ_PROCESS_STACK_SLOTS)) {
kadonotakashi 0:8fdf9a60065b 151 return 0U; // Invalid ID
kadonotakashi 0:8fdf9a60065b 152 }
kadonotakashi 0:8fdf9a60065b 153
kadonotakashi 0:8fdf9a60065b 154 slot = id - 1U;
kadonotakashi 0:8fdf9a60065b 155
kadonotakashi 0:8fdf9a60065b 156 if (ProcessStackInfo[slot].sp == 0U) {
kadonotakashi 0:8fdf9a60065b 157 return 0U; // Inactive slot
kadonotakashi 0:8fdf9a60065b 158 }
kadonotakashi 0:8fdf9a60065b 159
kadonotakashi 0:8fdf9a60065b 160 // Setup process stack pointer and stack limit
kadonotakashi 0:8fdf9a60065b 161 __set_PSPLIM(ProcessStackInfo[slot].sp_limit);
kadonotakashi 0:8fdf9a60065b 162 __set_PSP (ProcessStackInfo[slot].sp);
kadonotakashi 0:8fdf9a60065b 163
kadonotakashi 0:8fdf9a60065b 164 return 1U; // Success
kadonotakashi 0:8fdf9a60065b 165 }
kadonotakashi 0:8fdf9a60065b 166
kadonotakashi 0:8fdf9a60065b 167
kadonotakashi 0:8fdf9a60065b 168 /// Store secure context (called on RTOS thread context switch)
kadonotakashi 0:8fdf9a60065b 169 /// \param[in] id TrustZone memory slot identifier
kadonotakashi 0:8fdf9a60065b 170 /// \return execution status (1: success, 0: error)
kadonotakashi 0:8fdf9a60065b 171 __attribute__((cmse_nonsecure_entry))
kadonotakashi 0:8fdf9a60065b 172 uint32_t TZ_StoreContext_S (TZ_MemoryId_t id) {
kadonotakashi 0:8fdf9a60065b 173 uint32_t slot;
kadonotakashi 0:8fdf9a60065b 174 uint32_t sp;
kadonotakashi 0:8fdf9a60065b 175
kadonotakashi 0:8fdf9a60065b 176 if ((__get_IPSR() == 0U) || ((__get_CONTROL() & 2U) == 0U)) {
kadonotakashi 0:8fdf9a60065b 177 return 0U; // Thread Mode or using Main Stack for threads
kadonotakashi 0:8fdf9a60065b 178 }
kadonotakashi 0:8fdf9a60065b 179
kadonotakashi 0:8fdf9a60065b 180 if ((id == 0U) || (id > TZ_PROCESS_STACK_SLOTS)) {
kadonotakashi 0:8fdf9a60065b 181 return 0U; // Invalid ID
kadonotakashi 0:8fdf9a60065b 182 }
kadonotakashi 0:8fdf9a60065b 183
kadonotakashi 0:8fdf9a60065b 184 slot = id - 1U;
kadonotakashi 0:8fdf9a60065b 185
kadonotakashi 0:8fdf9a60065b 186 if (ProcessStackInfo[slot].sp == 0U) {
kadonotakashi 0:8fdf9a60065b 187 return 0U; // Inactive slot
kadonotakashi 0:8fdf9a60065b 188 }
kadonotakashi 0:8fdf9a60065b 189
kadonotakashi 0:8fdf9a60065b 190 sp = __get_PSP();
kadonotakashi 0:8fdf9a60065b 191 if ((sp < ProcessStackInfo[slot].sp_limit) ||
kadonotakashi 0:8fdf9a60065b 192 (sp > ProcessStackInfo[slot].sp_top)) {
kadonotakashi 0:8fdf9a60065b 193 return 0U; // SP out of range
kadonotakashi 0:8fdf9a60065b 194 }
kadonotakashi 0:8fdf9a60065b 195 ProcessStackInfo[slot].sp = sp;
kadonotakashi 0:8fdf9a60065b 196
kadonotakashi 0:8fdf9a60065b 197 // Default process stack pointer and stack limit
kadonotakashi 0:8fdf9a60065b 198 __set_PSPLIM((uint32_t)ProcessStackMemory);
kadonotakashi 0:8fdf9a60065b 199 __set_PSP ((uint32_t)ProcessStackMemory);
kadonotakashi 0:8fdf9a60065b 200
kadonotakashi 0:8fdf9a60065b 201 return 1U; // Success
kadonotakashi 0:8fdf9a60065b 202 }
kadonotakashi 0:8fdf9a60065b 203 #endif