Skip to content

Commit ae8d8ca

Browse files
tung7970adbridge
authored andcommitted
rtl8195am - adjust memory layout and enable fota support
1. Rearrange SDRAM and SRAM layout. Move timing critical code to SRAM, and the rest to SDRAM. 2. Add bootloader that's capable of FOTA over mbed cloud. Signed-off-by: Tony Wu <[email protected]>
1 parent 05a0c4f commit ae8d8ca

File tree

8 files changed

+1322
-970
lines changed

8 files changed

+1322
-970
lines changed

targets/TARGET_Realtek/TARGET_AMEBA/TARGET_RTL8195A/device/TOOLCHAIN_GCC_ARM/rtl8195a.ld

Lines changed: 60 additions & 704 deletions
Large diffs are not rendered by default.

targets/TARGET_Realtek/TARGET_AMEBA/TARGET_RTL8195A/device/TOOLCHAIN_GCC_ARM/rtl8195a_rom.h

Lines changed: 759 additions & 0 deletions
Large diffs are not rendered by default.

targets/TARGET_Realtek/TARGET_AMEBA/TARGET_RTL8195A/device/rtl8195a_init.c

Lines changed: 102 additions & 118 deletions
Original file line numberDiff line numberDiff line change
@@ -14,26 +14,30 @@
1414
* limitations under the License.
1515
*/
1616
#include "rtl8195a.h"
17-
#include "system_8195a.h"
18-
#if defined ( __CC_ARM ) /* ARM Compiler 4/5 */
17+
18+
#if defined(__CC_ARM)
19+
#include "cmsis_armcc.h"
20+
#elif defined(__GNUC__)
21+
#include "cmsis_gcc.h"
22+
#else
23+
#include <cmsis_iar.h>
24+
#endif
25+
26+
27+
#if defined(__CC_ARM) || \
28+
(defined (__ARMCC_VERSION) && __ARMCC_VERSION >= 6010050)
29+
30+
extern uint32_t Image$$ARM_LIB_STACK$$ZI$$Limit;
1931
extern uint8_t Image$$RW_IRAM1$$ZI$$Base[];
20-
#define __bss_start__ Image$$RW_IRAM1$$ZI$$Base
2132
extern uint8_t Image$$RW_IRAM1$$ZI$$Limit[];
22-
#define __bss_end__ Image$$RW_IRAM1$$ZI$$Limit
23-
#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) /* ARM Compiler 6 */
24-
extern uint8_t Image$$RW_IRAM1$$ZI$$Base[];
2533
#define __bss_start__ Image$$RW_IRAM1$$ZI$$Base
26-
extern uint8_t Image$$RW_IRAM1$$ZI$$Limit[];
27-
#define __bss_end__ Image$$RW_IRAM1$$ZI$$Limit
34+
#define __bss_end__ Image$$RW_IRAM1$$ZI$$Limit
35+
36+
#elif defined (__ICCARM__)
2837

29-
#elif defined ( __ICCARM__ )
3038
#pragma section=".ram.bss"
31-
#pragma section=".rom.bss"
32-
#pragma section=".ram.start.table"
33-
#pragma section=".ram_image1.bss"
34-
#pragma section=".image2.start.table1"
35-
#pragma section=".image2.start.table2"
3639

40+
extern uint32_t CSTACK$$Limit;
3741
uint8_t *__bss_start__;
3842
uint8_t *__bss_end__;
3943

@@ -42,30 +46,29 @@ void __iar_data_init_app(void)
4246
__bss_start__ = (uint8_t *)__section_begin(".ram.bss");
4347
__bss_end__ = (uint8_t *)__section_end(".ram.bss");
4448
}
49+
4550
#else
46-
extern uint8_t __bss_start__[];
47-
extern uint8_t __bss_end__[];
48-
extern uint8_t __image1_bss_start__[];
49-
extern uint8_t __image1_bss_end__[];
50-
extern uint8_t __image2_entry_func__[];
51-
extern uint8_t __image2_validate_code__[];
51+
52+
extern uint32_t __StackTop;
53+
extern uint8_t __bss_sram1_start__[];
54+
extern uint8_t __bss_sram1_end__[];
55+
extern uint8_t __bss_sram2_start__[];
56+
extern uint8_t __bss_sram2_end__[];
57+
5258
#endif
5359

5460
extern VECTOR_Func NewVectorTable[];
5561
extern void SystemCoreClockUpdate(void);
5662
extern void PLAT_Start(void);
5763
extern void PLAT_Main(void);
58-
extern HAL_TIMER_OP HalTimerOp;
59-
60-
IMAGE2_START_RAM_FUN_SECTION const RAM_START_FUNCTION gImage2EntryFun0 = {
61-
PLAT_Start
62-
};
6364

64-
IMAGE1_VALID_PATTEN_SECTION const uint8_t RAM_IMG1_VALID_PATTEN[] = {
65-
0x23, 0x79, 0x16, 0x88, 0xff, 0xff, 0xff, 0xff
65+
IMAGE2_START_RAM_FUN_SECTION
66+
const RAM_START_FUNCTION gImage2EntryFun0 = {
67+
PLAT_Start
6668
};
6769

68-
IMAGE2_VALID_PATTEN_SECTION const uint8_t RAM_IMG2_VALID_PATTEN[20] = {
70+
IMAGE2_VALID_PATTEN_SECTION
71+
const uint8_t IMAGE2_SIGNATURE[20] = {
6972
'R', 'T', 'K', 'W', 'i', 'n', 0x0, 0xff,
7073
(FW_VERSION&0xff), ((FW_VERSION >> 8)&0xff),
7174
(FW_SUBVERSION&0xff), ((FW_SUBVERSION >> 8)&0xff),
@@ -93,7 +96,7 @@ void TRAP_NMIHandler(void)
9396
#endif
9497
}
9598

96-
#if defined ( __ICCARM__ )
99+
#if defined (__ICCARM__)
97100
void __TRAP_HardFaultHandler_Patch(uint32_t addr)
98101
{
99102
uint32_t cfsr;
@@ -102,15 +105,15 @@ void __TRAP_HardFaultHandler_Patch(uint32_t addr)
102105
uint32_t stackpc;
103106
uint16_t asmcode;
104107

105-
cfsr = HAL_READ32(0xE000ED28, 0x0);
108+
cfsr = __HAL_READ32(0xE000ED28, 0x0);
106109

107110
// Violation to memory access protection
108111
if (cfsr & 0x82) {
109112

110-
bfar = HAL_READ32(0xE000ED38, 0x0);
113+
bfar = __HAL_READ32(0xE000ED38, 0x0);
111114

112115
// invalid access to wifi register, usually happened in LPS 32K or IPS
113-
if (bfar >= WIFI_REG_BASE && bfar < WIFI_REG_BASE + 0x40000) {
116+
if (bfar >= WLAN_BASE && bfar < WLAN_BASE + 0x40000) {
114117

115118
//__BKPT(0);
116119

@@ -125,18 +128,18 @@ void __TRAP_HardFaultHandler_Patch(uint32_t addr)
125128
* However, the fault assembly code (Ex. LDR or ADR) is not actually executed,
126129
* So the register value is un-predictable.
127130
**/
128-
stackpc = HAL_READ32(addr, 0x18);
129-
asmcode = HAL_READ16(stackpc, 0);
131+
stackpc = __HAL_READ32(addr, 0x18);
132+
asmcode = __HAL_READ16(stackpc, 0);
130133
if ((asmcode & 0xF800) > 0xE000) {
131134
// 32-bit instruction, (opcode[15:11] = 0b11111, 0b11110, 0b11101)
132-
HAL_WRITE32(addr, 0x18, stackpc + 4);
135+
__HAL_WRITE32(addr, 0x18, stackpc + 4);
133136
} else {
134137
// 16-bit instruction
135-
HAL_WRITE32(addr, 0x18, stackpc + 2);
138+
__HAL_WRITE32(addr, 0x18, stackpc + 2);
136139
}
137140

138141
// clear Hard Fault Status Register
139-
HAL_WRITE32(0xE000ED2C, 0x0, HAL_READ32(0xE000ED2C, 0x0));
142+
__HAL_WRITE32(0xE000ED2C, 0x0, __HAL_READ32(0xE000ED2C, 0x0));
140143
return;
141144
}
142145
}
@@ -155,8 +158,11 @@ void TRAP_HardFaultHandler_Patch(void)
155158
#endif
156159

157160
// Override original Interrupt Vector Table
158-
INFRA_START_SECTION void TRAP_OverrideTable(uint32_t stackp)
161+
void TRAP_OverrideTable(uint32_t stackp)
159162
{
163+
// Set MSP
164+
__set_MSP(stackp);
165+
160166
// Override NMI Handler
161167
NewVectorTable[2] = (VECTOR_Func) TRAP_NMIHandler;
162168

@@ -165,85 +171,59 @@ INFRA_START_SECTION void TRAP_OverrideTable(uint32_t stackp)
165171
#endif
166172
}
167173

168-
INFRA_START_SECTION void PLAT_Init(void)
174+
// Image2 Entry Function
175+
void PLAT_Start(void)
169176
{
170177
uint32_t val;
171178

172-
//Set SPS lower voltage
173-
val = __RTK_CTRL_READ32(REG_SYS_EFUSE_SYSCFG0);
174-
val &= 0xf0ffffff;
175-
val |= 0x6000000;
176-
__RTK_CTRL_WRITE32(REG_SYS_EFUSE_SYSCFG0, val);
177-
178-
//xtal buffer driving current
179-
val = __RTK_CTRL_READ32(REG_SYS_XTAL_CTRL1);
180-
val &= ~(BIT_MASK_SYS_XTAL_DRV_RF1 << BIT_SHIFT_SYS_XTAL_DRV_RF1);
181-
val |= BIT_SYS_XTAL_DRV_RF1(1);
182-
__RTK_CTRL_WRITE32(REG_SYS_XTAL_CTRL1, val);
183-
}
184-
185-
//3 Image 2
186-
extern _LONG_CALL_ void * __rtl_memset_v1_00(void * m , int c , size_t n);
187-
188-
//extern uint32_t mbed_stack_isr_start;
189-
//extern uint32_t mbed_stack_isr_size;
190-
INFRA_START_SECTION void PLAT_Start(void)
191-
{
192-
u8 isFlashEn;
193-
#if defined ( __ICCARM__ )
179+
#if defined (__ICCARM__)
194180
__iar_data_init_app();
195181
#endif
182+
196183
// Clear RAM BSS
197-
__rtl_memset_v1_00((void *)__bss_start__, 0, __bss_end__ - __bss_start__);
184+
#ifdef __GNUC__
185+
__memset((void *)__bss_sram1_start__, 0, __bss_sram1_end__ - __bss_sram1_start__);
186+
__memset((void *)__bss_sram2_start__, 0, __bss_sram2_end__ - __bss_sram2_start__);
187+
#else
188+
__memset((void *)__bss_start__, 0, __bss_end__ - __bss_start__);
189+
#endif
198190

191+
#if defined (__CC_ARM)
192+
TRAP_OverrideTable((uint32_t)&Image$$ARM_LIB_STACK$$ZI$$Limit);
193+
#elif defined (__ICCARM__)
194+
TRAP_OverrideTable((uint32_t)&CSTACK$$Limit);
195+
#elif defined (__GNUC__)
196+
TRAP_OverrideTable((uint32_t)&__StackTop);
197+
#else
199198
TRAP_OverrideTable(0x1FFFFFFC);
200-
/* add by Ian --for mbed isr stack address setting */
201-
__set_MSP(0x1fffffbc);
202-
203-
204-
#ifdef CONFIG_SPIC_MODULE
205-
if ((HAL_PERI_ON_READ32(REG_SOC_FUNC_EN) & BIT_SOC_FLASH_EN) != 0) {
206-
isFlashEn = 1;
207-
} else {
208-
isFlashEn = 0;
209-
}
210199
#endif
211200

212-
#ifdef CONFIG_TIMER_MODULE
213201
HalTimerOpInit_Patch(&HalTimerOp);
214-
#endif
215-
216-
//DBG_8195A("===== Enter Image 2 ====\n");
217-
218-
219202
SystemCoreClockUpdate();
220203

221-
if (isFlashEn) {
222-
#if CONFIG_SPIC_EN && SPIC_CALIBRATION_IN_NVM
223-
SpicNVMCalLoadAll();
224-
#endif
225-
SpicReadIDRtl8195A();
226-
// turn off SPIC for power saving
227-
SpicDisableRtl8195A();
228-
}
204+
// Set SPS lower voltage
205+
val = __RTK_CTRL_READ32(REG_SYS_EFUSE_SYSCFG0);
206+
val &= 0xf0ffffff;
207+
val |= 0x6000000;
208+
__RTK_CTRL_WRITE32(REG_SYS_EFUSE_SYSCFG0, val);
209+
210+
// xtal buffer driving current
211+
val = __RTK_CTRL_READ32(REG_SYS_XTAL_CTRL1);
212+
val &= ~(BIT_MASK_SYS_XTAL_DRV_RF1 << BIT_SHIFT_SYS_XTAL_DRV_RF1);
213+
val |= BIT_SYS_XTAL_DRV_RF1(1);
214+
__RTK_CTRL_WRITE32(REG_SYS_XTAL_CTRL1, val);
229215

216+
// Initialize SPIC, then disable it for power saving.
217+
if ((HAL_PERI_ON_READ32(REG_SOC_FUNC_EN) & BIT_SOC_FLASH_EN) != 0) {
218+
SpicNVMCalLoadAll();
219+
SpicReadIDRtl8195A();
220+
SpicDisableRtl8195A();
221+
}
230222

231-
PLAT_Init();
232223
#ifdef CONFIG_TIMER_MODULE
233-
Calibration32k();
234-
235-
#ifdef CONFIG_WDG
236-
#ifdef CONFIG_WDG_TEST
237-
WDGInit();
238-
#endif //CONFIG_WDG_TEST
239-
#endif //CONFIG_WDG
240-
#endif //CONFIG_TIMER_MODULE
241-
242-
#ifdef CONFIG_SOC_PS_MODULE
243-
//InitSoCPM();
244-
#endif
245-
/* GPIOA_7 does not pull high at power on. It causes SDIO Device
246-
* hardware to enable automatically and occupy GPIOA[7:0] */
224+
Calibration32k();
225+
#endif
226+
247227
#ifndef CONFIG_SDIO_DEVICE_EN
248228
SDIO_DEV_Disable();
249229
#endif
@@ -256,37 +236,41 @@ extern void SVC_Handler(void);
256236
extern void PendSV_Handler(void);
257237
extern void SysTick_Handler(void);
258238

239+
// The Main App entry point
259240
#if defined (__CC_ARM)
260241
__asm void ARM_PLAT_Main(void)
261242
{
262-
IMPORT SystemInit
263-
IMPORT __main
264-
BL SystemInit
265-
BL __main
243+
IMPORT SystemInit
244+
IMPORT __main
245+
BL SystemInit
246+
BL __main
247+
}
248+
#elif defined (__ICCARM__)
249+
extern void __iar_program_start(void);
250+
251+
void IAR_PLAT_Main(void)
252+
{
253+
SystemInit();
254+
__iar_program_start();
266255
}
267256
#endif
268257

269-
extern void __iar_program_start( void );
270-
// The Main App entry point
271258
void PLAT_Main(void)
272259
{
273260
TRAP_Init((void *)SVC_Handler, (void *)PendSV_Handler, (void *)SysTick_Handler);
274261

275-
#if defined (__ICCARM__)
276-
//IAR_PLAT_Main();
277-
SystemInit();
278-
__iar_program_start();
279-
#elif defined (__CC_ARM)
280-
ARM_PLAT_Main();
281-
282-
#elif defined (__GNUC__)
283-
__asm (
284-
"ldr r0, =SystemInit \n"
262+
#if defined (__CC_ARM)
263+
ARM_PLAT_Main();
264+
#elif defined (__ICCARM__)
265+
IAR_PLAT_Main();
266+
#else
267+
__asm ("ldr r0, =SystemInit \n"
285268
"blx r0 \n"
286269
"ldr r0, =_start \n"
287270
"bx r0 \n"
288271
);
289272
#endif
273+
290274
// Never reached
291-
for(;;);
275+
for (;;);
292276
}

0 commit comments

Comments
 (0)