mbed official / mbed-dev

Dependents:   Nucleo_Hello_Encoder BLE_iBeaconScan AM1805_DEMO DISCO-F429ZI_ExportTemplate1 ... more

Committer:
Anna Bridge
Date:
Wed Jan 17 15:23:54 2018 +0000
Revision:
180:96ed750bd169
Parent:
177:d650f5d4c87a
Child:
182:a56a73fd2a6f
mbed-dev libray. Release version 158

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AnnaBridge 167:e84263d55307 1 /*
AnnaBridge 167:e84263d55307 2 * Copyright (c) 2013-2016 Realtek Semiconductor Corp.
AnnaBridge 167:e84263d55307 3 *
AnnaBridge 167:e84263d55307 4 * Licensed under the Apache License, Version 2.0 (the "License");
AnnaBridge 167:e84263d55307 5 * you may not use this file except in compliance with the License.
AnnaBridge 167:e84263d55307 6 * You may obtain a copy of the License at
AnnaBridge 167:e84263d55307 7 *
AnnaBridge 167:e84263d55307 8 * http://www.apache.org/licenses/LICENSE-2.0
AnnaBridge 167:e84263d55307 9 *
AnnaBridge 167:e84263d55307 10 * Unless required by applicable law or agreed to in writing, software
AnnaBridge 167:e84263d55307 11 * distributed under the License is distributed on an "AS IS" BASIS,
AnnaBridge 167:e84263d55307 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
AnnaBridge 167:e84263d55307 13 * See the License for the specific language governing permissions and
AnnaBridge 167:e84263d55307 14 * limitations under the License.
AnnaBridge 167:e84263d55307 15 */
AnnaBridge 167:e84263d55307 16 #include "rtl8195a.h"
AnnaBridge 173:e131a1973e81 17
AnnaBridge 173:e131a1973e81 18 #if defined(__CC_ARM) || \
AnnaBridge 173:e131a1973e81 19 (defined (__ARMCC_VERSION) && __ARMCC_VERSION >= 6010050)
AnnaBridge 167:e84263d55307 20
AnnaBridge 173:e131a1973e81 21 extern uint8_t Image$$RW_IRAM2$$ZI$$Base[];
AnnaBridge 173:e131a1973e81 22 extern uint8_t Image$$RW_IRAM2$$ZI$$Limit[];
AnnaBridge 173:e131a1973e81 23 extern uint8_t Image$$TCM_OVERLAY$$ZI$$Base[];
AnnaBridge 173:e131a1973e81 24 extern uint8_t Image$$TCM_OVERLAY$$ZI$$Limit[];
AnnaBridge 173:e131a1973e81 25 extern uint8_t Image$$RW_DRAM2$$ZI$$Base[];
AnnaBridge 173:e131a1973e81 26 extern uint8_t Image$$RW_DRAM2$$ZI$$Limit[];
AnnaBridge 173:e131a1973e81 27 #define __bss_sram_start__ Image$$RW_IRAM2$$ZI$$Base
AnnaBridge 173:e131a1973e81 28 #define __bss_sram_end__ Image$$RW_IRAM2$$ZI$$Limit
AnnaBridge 173:e131a1973e81 29 #define __bss_dtcm_start__ Image$$TCM_OVERLAY$$ZI$$Base
AnnaBridge 173:e131a1973e81 30 #define __bss_dtcm_end__ Image$$TCM_OVERLAY$$ZI$$Limit
AnnaBridge 173:e131a1973e81 31 #define __bss_dram_start__ Image$$RW_DRAM2$$ZI$$Base
AnnaBridge 173:e131a1973e81 32 #define __bss_dram_end__ Image$$RW_DRAM2$$ZI$$Limit
AnnaBridge 173:e131a1973e81 33
AnnaBridge 173:e131a1973e81 34 #elif defined (__ICCARM__)
AnnaBridge 173:e131a1973e81 35
AnnaBridge 177:d650f5d4c87a 36 #pragma section=".bss.sram"
AnnaBridge 177:d650f5d4c87a 37 #pragma section=".bss.dtcm"
AnnaBridge 177:d650f5d4c87a 38 #pragma section=".bss.dram"
AnnaBridge 167:e84263d55307 39
AnnaBridge 177:d650f5d4c87a 40 uint8_t *__bss_sram_start__;
AnnaBridge 177:d650f5d4c87a 41 uint8_t *__bss_sram_end__;
AnnaBridge 177:d650f5d4c87a 42 uint8_t *__bss_dtcm_start__;
AnnaBridge 177:d650f5d4c87a 43 uint8_t *__bss_dtcm_end__;
AnnaBridge 177:d650f5d4c87a 44 uint8_t *__bss_dram_start__;
AnnaBridge 177:d650f5d4c87a 45 uint8_t *__bss_dram_end__;
AnnaBridge 167:e84263d55307 46
AnnaBridge 167:e84263d55307 47 void __iar_data_init_app(void)
AnnaBridge 167:e84263d55307 48 {
AnnaBridge 177:d650f5d4c87a 49 __bss_sram_start__ = (uint8_t *)__section_begin(".bss.sram");
AnnaBridge 177:d650f5d4c87a 50 __bss_sram_end__ = (uint8_t *)__section_end(".bss.sram");
AnnaBridge 177:d650f5d4c87a 51 __bss_dtcm_start__ = (uint8_t *)__section_begin(".bss.dtcm");
AnnaBridge 177:d650f5d4c87a 52 __bss_dtcm_end__ = (uint8_t *)__section_end(".bss.dtcm");
AnnaBridge 177:d650f5d4c87a 53 __bss_dram_start__ = (uint8_t *)__section_begin(".bss.dram");
AnnaBridge 177:d650f5d4c87a 54 __bss_dram_end__ = (uint8_t *)__section_end(".bss.dram");
AnnaBridge 167:e84263d55307 55 }
AnnaBridge 173:e131a1973e81 56
AnnaBridge 167:e84263d55307 57 #else
AnnaBridge 173:e131a1973e81 58
AnnaBridge 173:e131a1973e81 59 extern uint8_t __bss_sram_start__[];
AnnaBridge 173:e131a1973e81 60 extern uint8_t __bss_sram_end__[];
AnnaBridge 173:e131a1973e81 61 extern uint8_t __bss_dtcm_start__[];
AnnaBridge 173:e131a1973e81 62 extern uint8_t __bss_dtcm_end__[];
AnnaBridge 173:e131a1973e81 63 extern uint8_t __bss_dram_start__[];
AnnaBridge 173:e131a1973e81 64 extern uint8_t __bss_dram_end__[];
AnnaBridge 173:e131a1973e81 65
AnnaBridge 167:e84263d55307 66 #endif
AnnaBridge 167:e84263d55307 67
AnnaBridge 167:e84263d55307 68 extern VECTOR_Func NewVectorTable[];
AnnaBridge 167:e84263d55307 69 extern void SystemCoreClockUpdate(void);
AnnaBridge 167:e84263d55307 70 extern void PLAT_Start(void);
AnnaBridge 167:e84263d55307 71 extern void PLAT_Main(void);
AnnaBridge 173:e131a1973e81 72
AnnaBridge 173:e131a1973e81 73 IMAGE2_START_RAM_FUN_SECTION
AnnaBridge 173:e131a1973e81 74 const RAM_START_FUNCTION gImage2EntryFun0 = {
AnnaBridge 167:e84263d55307 75 PLAT_Start
AnnaBridge 167:e84263d55307 76 };
AnnaBridge 167:e84263d55307 77
AnnaBridge 173:e131a1973e81 78 IMAGE2_VALID_PATTEN_SECTION
AnnaBridge 173:e131a1973e81 79 const uint8_t IMAGE2_SIGNATURE[20] = {
AnnaBridge 167:e84263d55307 80 'R', 'T', 'K', 'W', 'i', 'n', 0x0, 0xff,
AnnaBridge 167:e84263d55307 81 (FW_VERSION&0xff), ((FW_VERSION >> 8)&0xff),
AnnaBridge 167:e84263d55307 82 (FW_SUBVERSION&0xff), ((FW_SUBVERSION >> 8)&0xff),
AnnaBridge 167:e84263d55307 83 (FW_CHIP_ID&0xff), ((FW_CHIP_ID >> 8)&0xff),
AnnaBridge 167:e84263d55307 84 (FW_CHIP_VER),
AnnaBridge 167:e84263d55307 85 (FW_BUS_TYPE),
AnnaBridge 167:e84263d55307 86 (FW_INFO_RSV1),
AnnaBridge 167:e84263d55307 87 (FW_INFO_RSV2),
AnnaBridge 167:e84263d55307 88 (FW_INFO_RSV3),
AnnaBridge 167:e84263d55307 89 (FW_INFO_RSV4)
AnnaBridge 167:e84263d55307 90 };
AnnaBridge 167:e84263d55307 91
AnnaBridge 167:e84263d55307 92 void TRAP_NMIHandler(void)
AnnaBridge 167:e84263d55307 93 {
AnnaBridge 167:e84263d55307 94 #ifdef CONFIG_WDG_NORMAL
AnnaBridge 167:e84263d55307 95 uint32_t val;
AnnaBridge 167:e84263d55307 96 WDG_REG *ctl;
AnnaBridge 167:e84263d55307 97
AnnaBridge 167:e84263d55307 98 // Check if this NMI is triggered by Watchdog Timer
AnnaBridge 167:e84263d55307 99 val = __RTK_READ32(VENDOR_REG_BASE, 0);
AnnaBridge 167:e84263d55307 100 ctl = (WDG_REG*) &val;
AnnaBridge 167:e84263d55307 101 if (ctl->WdgToISR) {
AnnaBridge 167:e84263d55307 102 INTR_WatchdogHandler();
AnnaBridge 167:e84263d55307 103 }
AnnaBridge 167:e84263d55307 104 #endif
AnnaBridge 167:e84263d55307 105 }
AnnaBridge 167:e84263d55307 106
AnnaBridge 173:e131a1973e81 107 #if defined (__ICCARM__)
AnnaBridge 167:e84263d55307 108 void __TRAP_HardFaultHandler_Patch(uint32_t addr)
AnnaBridge 167:e84263d55307 109 {
AnnaBridge 167:e84263d55307 110 uint32_t cfsr;
AnnaBridge 167:e84263d55307 111 uint32_t bfar;
AnnaBridge 167:e84263d55307 112
AnnaBridge 167:e84263d55307 113 uint32_t stackpc;
AnnaBridge 167:e84263d55307 114 uint16_t asmcode;
AnnaBridge 167:e84263d55307 115
AnnaBridge 167:e84263d55307 116 cfsr = HAL_READ32(0xE000ED28, 0x0);
AnnaBridge 167:e84263d55307 117
AnnaBridge 167:e84263d55307 118 // Violation to memory access protection
AnnaBridge 167:e84263d55307 119 if (cfsr & 0x82) {
AnnaBridge 167:e84263d55307 120
AnnaBridge 167:e84263d55307 121 bfar = HAL_READ32(0xE000ED38, 0x0);
AnnaBridge 167:e84263d55307 122
AnnaBridge 167:e84263d55307 123 // invalid access to wifi register, usually happened in LPS 32K or IPS
AnnaBridge 167:e84263d55307 124 if (bfar >= WIFI_REG_BASE && bfar < WIFI_REG_BASE + 0x40000) {
AnnaBridge 167:e84263d55307 125
AnnaBridge 167:e84263d55307 126 //__BKPT(0);
AnnaBridge 167:e84263d55307 127
AnnaBridge 167:e84263d55307 128 /* Get the MemManage fault PC, and step to next command.
AnnaBridge 167:e84263d55307 129 * Otherwise it will keep hitting MemMange Fault on the same assembly code.
AnnaBridge 167:e84263d55307 130 *
AnnaBridge 167:e84263d55307 131 * To step to next command, we need parse the assembly code to check if
AnnaBridge 173:e131a1973e81 132 * it is 16-bit or 32-bit command.
AnnaBridge 167:e84263d55307 133 * Ref: ARM Architecture Reference Manual (ARMv7-A and ARMv7-R edition),
AnnaBridge 173:e131a1973e81 134 * Chapter A6 - Thumb Instruction Set Encoding
AnnaBridge 167:e84263d55307 135 *
AnnaBridge 167:e84263d55307 136 * However, the fault assembly code (Ex. LDR or ADR) is not actually executed,
AnnaBridge 167:e84263d55307 137 * So the register value is un-predictable.
AnnaBridge 167:e84263d55307 138 **/
AnnaBridge 167:e84263d55307 139 stackpc = HAL_READ32(addr, 0x18);
AnnaBridge 167:e84263d55307 140 asmcode = HAL_READ16(stackpc, 0);
AnnaBridge 167:e84263d55307 141 if ((asmcode & 0xF800) > 0xE000) {
AnnaBridge 167:e84263d55307 142 // 32-bit instruction, (opcode[15:11] = 0b11111, 0b11110, 0b11101)
AnnaBridge 167:e84263d55307 143 HAL_WRITE32(addr, 0x18, stackpc + 4);
AnnaBridge 167:e84263d55307 144 } else {
AnnaBridge 167:e84263d55307 145 // 16-bit instruction
AnnaBridge 167:e84263d55307 146 HAL_WRITE32(addr, 0x18, stackpc + 2);
AnnaBridge 167:e84263d55307 147 }
AnnaBridge 167:e84263d55307 148
AnnaBridge 167:e84263d55307 149 // clear Hard Fault Status Register
AnnaBridge 167:e84263d55307 150 HAL_WRITE32(0xE000ED2C, 0x0, HAL_READ32(0xE000ED2C, 0x0));
AnnaBridge 167:e84263d55307 151 return;
AnnaBridge 167:e84263d55307 152 }
AnnaBridge 167:e84263d55307 153 }
AnnaBridge 167:e84263d55307 154
AnnaBridge 167:e84263d55307 155 __TRAP_HardFaultHandler(addr);
AnnaBridge 167:e84263d55307 156 }
AnnaBridge 167:e84263d55307 157
AnnaBridge 167:e84263d55307 158 void TRAP_HardFaultHandler_Patch(void)
AnnaBridge 167:e84263d55307 159 {
AnnaBridge 167:e84263d55307 160 __asm("TST LR, #4 \n"
AnnaBridge 167:e84263d55307 161 "ITE EQ \n"
AnnaBridge 167:e84263d55307 162 "MRSEQ R0, MSP \n"
AnnaBridge 167:e84263d55307 163 "MRSNE R0, PSP \n"
AnnaBridge 167:e84263d55307 164 "B __TRAP_HardFaultHandler_Patch ");
AnnaBridge 167:e84263d55307 165 }
AnnaBridge 167:e84263d55307 166 #endif
AnnaBridge 167:e84263d55307 167
AnnaBridge 173:e131a1973e81 168 extern _LONG_CALL_ void * __rtl_memset_v1_00(void * m , int c , size_t n);
AnnaBridge 173:e131a1973e81 169 // Image2 Entry Function
AnnaBridge 174:b96e65c34a4d 170 void PLAT_Init(void)
AnnaBridge 167:e84263d55307 171 {
AnnaBridge 167:e84263d55307 172 uint32_t val;
AnnaBridge 167:e84263d55307 173
AnnaBridge 174:b96e65c34a4d 174 // Overwrite vector table
AnnaBridge 174:b96e65c34a4d 175 NewVectorTable[2] = (VECTOR_Func) TRAP_NMIHandler;
AnnaBridge 174:b96e65c34a4d 176 #if defined ( __ICCARM__ )
AnnaBridge 174:b96e65c34a4d 177 NewVectorTable[3] = (VECTOR_Func) TRAP_HardFaultHandler_Patch;
AnnaBridge 173:e131a1973e81 178 #endif
AnnaBridge 173:e131a1973e81 179
AnnaBridge 173:e131a1973e81 180 // Clear RAM BSS
AnnaBridge 173:e131a1973e81 181 #if defined (__ICCARM__)
AnnaBridge 174:b96e65c34a4d 182 __iar_data_init_app();
AnnaBridge 177:d650f5d4c87a 183 #endif
AnnaBridge 173:e131a1973e81 184 __rtl_memset_v1_00((void *)__bss_sram_start__, 0, __bss_sram_end__ - __bss_sram_start__);
AnnaBridge 173:e131a1973e81 185 __rtl_memset_v1_00((void *)__bss_dtcm_start__, 0, __bss_dtcm_end__ - __bss_dtcm_start__);
AnnaBridge 173:e131a1973e81 186 __rtl_memset_v1_00((void *)__bss_dram_start__, 0, __bss_dram_end__ - __bss_dram_start__);
AnnaBridge 173:e131a1973e81 187
AnnaBridge 173:e131a1973e81 188 extern HAL_TIMER_OP_EXT HalTimerOpExt;
AnnaBridge 173:e131a1973e81 189 __rtl_memset_v1_00((void *)&HalTimerOpExt, 0, sizeof(HalTimerOpExt));
AnnaBridge 173:e131a1973e81 190 __rtl_memset_v1_00((void *)&HalTimerOp, 0, sizeof(HalTimerOp));
AnnaBridge 173:e131a1973e81 191
AnnaBridge 173:e131a1973e81 192 HalTimerOpInit_Patch(&HalTimerOp);
AnnaBridge 173:e131a1973e81 193 SystemCoreClockUpdate();
AnnaBridge 173:e131a1973e81 194
AnnaBridge 173:e131a1973e81 195 // Set SPS lower voltage
AnnaBridge 167:e84263d55307 196 val = __RTK_CTRL_READ32(REG_SYS_EFUSE_SYSCFG0);
AnnaBridge 167:e84263d55307 197 val &= 0xf0ffffff;
AnnaBridge 167:e84263d55307 198 val |= 0x6000000;
AnnaBridge 167:e84263d55307 199 __RTK_CTRL_WRITE32(REG_SYS_EFUSE_SYSCFG0, val);
AnnaBridge 173:e131a1973e81 200
AnnaBridge 173:e131a1973e81 201 // xtal buffer driving current
AnnaBridge 167:e84263d55307 202 val = __RTK_CTRL_READ32(REG_SYS_XTAL_CTRL1);
AnnaBridge 167:e84263d55307 203 val &= ~(BIT_MASK_SYS_XTAL_DRV_RF1 << BIT_SHIFT_SYS_XTAL_DRV_RF1);
AnnaBridge 167:e84263d55307 204 val |= BIT_SYS_XTAL_DRV_RF1(1);
AnnaBridge 167:e84263d55307 205 __RTK_CTRL_WRITE32(REG_SYS_XTAL_CTRL1, val);
AnnaBridge 167:e84263d55307 206
AnnaBridge 173:e131a1973e81 207 // Initialize SPIC, then disable it for power saving.
AnnaBridge 173:e131a1973e81 208 if ((HAL_PERI_ON_READ32(REG_SOC_FUNC_EN) & BIT_SOC_FLASH_EN) != 0) {
AnnaBridge 173:e131a1973e81 209 SpicNVMCalLoadAll();
AnnaBridge 173:e131a1973e81 210 SpicReadIDRtl8195A();
AnnaBridge 173:e131a1973e81 211 SpicDisableRtl8195A();
AnnaBridge 173:e131a1973e81 212 }
AnnaBridge 167:e84263d55307 213
AnnaBridge 167:e84263d55307 214 #ifdef CONFIG_TIMER_MODULE
AnnaBridge 173:e131a1973e81 215 Calibration32k();
AnnaBridge 167:e84263d55307 216 #endif
AnnaBridge 167:e84263d55307 217
AnnaBridge 167:e84263d55307 218 #ifndef CONFIG_SDIO_DEVICE_EN
AnnaBridge 167:e84263d55307 219 SDIO_DEV_Disable();
AnnaBridge 167:e84263d55307 220 #endif
AnnaBridge 167:e84263d55307 221
AnnaBridge 167:e84263d55307 222 // Enter App start function
AnnaBridge 167:e84263d55307 223 PLAT_Main();
AnnaBridge 167:e84263d55307 224 }
AnnaBridge 167:e84263d55307 225
AnnaBridge 167:e84263d55307 226 extern void SVC_Handler(void);
AnnaBridge 167:e84263d55307 227 extern void PendSV_Handler(void);
AnnaBridge 167:e84263d55307 228 extern void SysTick_Handler(void);
AnnaBridge 167:e84263d55307 229
AnnaBridge 173:e131a1973e81 230 // The Main App entry point
AnnaBridge 167:e84263d55307 231 #if defined (__CC_ARM)
AnnaBridge 167:e84263d55307 232 __asm void ARM_PLAT_Main(void)
AnnaBridge 167:e84263d55307 233 {
AnnaBridge 173:e131a1973e81 234 IMPORT SystemInit
AnnaBridge 173:e131a1973e81 235 IMPORT __main
AnnaBridge 173:e131a1973e81 236 BL SystemInit
AnnaBridge 173:e131a1973e81 237 BL __main
AnnaBridge 173:e131a1973e81 238 }
AnnaBridge 173:e131a1973e81 239 #elif defined (__ICCARM__)
AnnaBridge 173:e131a1973e81 240 extern void __iar_program_start(void);
AnnaBridge 173:e131a1973e81 241
AnnaBridge 173:e131a1973e81 242 void IAR_PLAT_Main(void)
AnnaBridge 173:e131a1973e81 243 {
AnnaBridge 173:e131a1973e81 244 SystemInit();
AnnaBridge 173:e131a1973e81 245 __iar_program_start();
AnnaBridge 167:e84263d55307 246 }
AnnaBridge 167:e84263d55307 247 #endif
AnnaBridge 167:e84263d55307 248
AnnaBridge 167:e84263d55307 249 void PLAT_Main(void)
AnnaBridge 167:e84263d55307 250 {
AnnaBridge 167:e84263d55307 251 TRAP_Init((void *)SVC_Handler, (void *)PendSV_Handler, (void *)SysTick_Handler);
AnnaBridge 167:e84263d55307 252
AnnaBridge 173:e131a1973e81 253 #if defined (__CC_ARM)
AnnaBridge 173:e131a1973e81 254 ARM_PLAT_Main();
AnnaBridge 173:e131a1973e81 255 #elif defined (__ICCARM__)
AnnaBridge 173:e131a1973e81 256 IAR_PLAT_Main();
AnnaBridge 173:e131a1973e81 257 #else
AnnaBridge 173:e131a1973e81 258 __asm ("ldr r0, =SystemInit \n"
AnnaBridge 167:e84263d55307 259 "blx r0 \n"
AnnaBridge 174:b96e65c34a4d 260 #if defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050)
AnnaBridge 174:b96e65c34a4d 261 "ldr r0, =__main \n"
AnnaBridge 174:b96e65c34a4d 262 #else
AnnaBridge 167:e84263d55307 263 "ldr r0, =_start \n"
AnnaBridge 174:b96e65c34a4d 264 #endif
AnnaBridge 167:e84263d55307 265 "bx r0 \n"
AnnaBridge 167:e84263d55307 266 );
AnnaBridge 167:e84263d55307 267 #endif
AnnaBridge 173:e131a1973e81 268
AnnaBridge 167:e84263d55307 269 // Never reached
AnnaBridge 173:e131a1973e81 270 for (;;);
AnnaBridge 167:e84263d55307 271 }