--- /dev/null
+;*******************************************************************************\r
+; DISCLAIMER\r
+; This software is supplied by Renesas Electronics Corporation and is only\r
+; intended for use with Renesas products. No other uses are authorized. This\r
+; software is owned by Renesas Electronics Corporation and is protected under\r
+; all applicable laws, including copyright laws.\r
+; THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING\r
+; THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT\r
+; LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE\r
+; AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED.\r
+; TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS\r
+; ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE\r
+; FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR\r
+; ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE\r
+; BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.\r
+; Renesas reserves the right, without notice, to make changes to this software\r
+; and to discontinue the availability of this software. By using this software,\r
+; you agree to the additional terms and conditions found by accessing the\r
+; following link:\r
+; http://www.renesas.com/disclaimer\r
+;\r
+; Copyright (C) 2014 Renesas Electronics Corporation. All rights reserved.\r
+;******************************************************************************\r
+;*******************************************************************************\r
+; System Name : RZ/T1 Init program\r
+; File Name : loader_init.asm\r
+; Version : 0.1\r
+; Device : R7S9100xx\r
+; Abstract : Loader program 1\r
+; Tool-Chain : IAR Embedded Workbench Ver.7.20\r
+; OS : not use\r
+; H/W Platform : Renesas Starter Kit for RZ/T1(Preliminary)\r
+; Description : Description interrupt service routine of RZ/T1\r
+; Limitation : none\r
+;******************************************************************************\r
+;*******************************************************************************\r
+; History : DD.MM.YYYY Version Description\r
+; : First Release\r
+;******************************************************************************\r
+\r
+ SECTION IRQ_STACK:DATA:NOROOT(3)\r
+ SECTION FIQ_STACK:DATA:NOROOT(3)\r
+ SECTION SVC_STACK:DATA:NOROOT(3)\r
+ SECTION ABT_STACK:DATA:NOROOT(3)\r
+ SECTION UND_STACK:DATA:NOROOT(3)\r
+ SECTION CSTACK:DATA:NOROOT(3)\r
+ \r
+ SECTION LDR_DATA_RBLOCK:DATA:ROOT(2)\r
+ SECTION LDR_DATA_WBLOCK:DATA:ROOT(2)\r
+\r
+ SECTION M3_PRG_RBLOCK:DATA:ROOT(2)\r
+ SECTION M3_PRG_WBLOCK:DATA:ROOT(2)\r
+\r
+; This program is allocated to section "d_ldr_prg" \r
+ SECTION d_ldr_prg:CODE:ROOT(2)\r
+ \r
+ ARM\r
+ \r
+ PUBLIC loader_init1\r
+ PUBLIC set_low_vec\r
+ PUBLIC cache_init\r
+ PUBLIC mpu_init\r
+ IMPORT loader_init2\r
+\r
+ \r
+;***********************************************************************\r
+; Function Name : loader_init1\r
+; Description : Initialize sysytem by loader program\r
+; Arguments : none\r
+; Return Value : none\r
+;***********************************************************************\r
+loader_init1:\r
+ \r
+stack_init:\r
+ ; Stack setting \r
+ cps #17 ; FIQ mode\r
+ ldr sp, =SFE(FIQ_STACK)\r
+ cps #18 ; IRQ mode\r
+ ldr sp, =SFE(IRQ_STACK)\r
+ cps #23 ; Abort mode\r
+ ldr sp, =SFE(ABT_STACK)\r
+ cps #27 ; Undef mode\r
+ ldr sp, =SFE(UND_STACK)\r
+ cps #31 ; System mode\r
+ ldr sp, =SFE(CSTACK)\r
+ cps #19 ; SVC mode\r
+ ldr sp, =SFE(SVC_STACK)\r
+ \r
+vfp_init: \r
+ ; Initialize VFP setting\r
+ mrc p15, #0, r0, c1, c0, #2 ; Enables cp10 and cp11 accessing\r
+ orr r0, r0, #0xF00000\r
+ mcr p15, #0, r0, c1, c0, #2\r
+ isb ; Ensuring Context-changing\r
+ \r
+ mov r0, #0x40000000 ; Enables VFP operation\r
+ vmsr fpexc, r0\r
+ \r
+data_init: \r
+ ; Initialize variables has initialized value of loader_init2.\r
+ ; Variables has no initialized value already be initialized to zero \r
+ ; in boot sequence(Clear ATCM and BTCM).\r
+ ldr r0, =SFB(LDR_DATA_RBLOCK)\r
+ ldr r1, =SFB(LDR_DATA_WBLOCK)\r
+ ldr r2, =SIZEOF(LDR_DATA_WBLOCK)\r
+ cmp r2, #0\r
+#ifdef DUAL_CORE\r
+ beq m3_init\r
+#else\r
+ beq jump_loader_init2\r
+#endif\r
+ \r
+copy_to_LDR_DATA:\r
+ ldrb r3, [r0], #1\r
+ strb r3, [r1], #1\r
+ subs r2, r2, #1\r
+ bne copy_to_LDR_DATA \r
+ dsb ; Ensuring data-changing\r
+\r
+#ifdef DUAL_CORE\r
+\r
+m3_init:\r
+ ; Initialize image for Cortex-M3 core\r
+ ldr r0, =SFB(M3_PRG_RBLOCK)\r
+ ldr r1, =SFB(M3_PRG_WBLOCK)\r
+ ldr r2, =SIZEOF(M3_PRG_WBLOCK)\r
+ cmp r2, #0\r
+ beq jump_loader_init2\r
+ \r
+copy_to_M3_PRG:\r
+ ldrb r3, [r0], #1\r
+ strb r3, [r1], #1\r
+ subs r2, r2, #1\r
+ bne copy_to_M3_PRG \r
+ dsb ; Ensuring data-changing\r
+\r
+#endif\r
+\r
+ ; Jump to loader_init2\r
+jump_loader_init2:\r
+ ldr r0, =loader_init2\r
+ bx r0\r
+\r
+;***********************************************************************\r
+; Function Name : cache_init\r
+; Description : Initialize I1, D1 cache and MPU settings\r
+; Arguments : none\r
+; Return Value : none\r
+;***********************************************************************\r
+\r
+;*******************************************************************************\r
+; Macro definitions\r
+;*******************************************************************************\r
+\r
+SCTLR_BR: dcd 0x00020000\r
+SCTLR_M: dcd 0x00000001\r
+SCTLR_I_C: dcd 0x00001004\r
+ \r
+DRBAR_REGION_0: dcd 0x04000000 ; Base address = 0400_0000h\r
+DRACR_REGION_0: dcd 0x0000030C ; R/W(full), Normal, Non-cache, share\r
+DRSR_REGION_0: dcd 0x00000025 ; Size 512KB, MPU enable\r
+\r
+DRBAR_REGION_1: dcd 0x10000000 ; Base address = 1000_0000h \r
+DRACR_REGION_1: dcd 0x0000030C ; R/W(full), Normal, Non-cache, share\r
+DRSR_REGION_1: dcd 0x00000033 ; Size 64MB, MPU enable \r
+\r
+DRBAR_REGION_2: dcd 0x20000000 ; Base address = 2000_0000h \r
+DRACR_REGION_2: dcd 0x0000030C ; R/W(full), Normal, Non-cache, share\r
+DRSR_REGION_2: dcd 0x00000025 ; Size 512KB, MPU enable\r
+\r
+DRBAR_REGION_3: dcd 0x22000000 ; Base address = 2200_0000h \r
+DRACR_REGION_3: dcd 0x00000307 ; R/W(full), Normal, Write-back no allocate, share\r
+DRSR_REGION_3: dcd 0x00000033 ; Size 64MB, MPU enable \r
+\r
+DRBAR_REGION_4: dcd 0x30000000 ; Base address = 3000_0000h \r
+DRACR_REGION_4: dcd 0x0000030F ; R/W(full), Normal, Write-back write allocate, share \r
+DRSR_REGION_4: dcd 0x00000033 ; Size 64MB, MPU enable \r
+\r
+DRBAR_REGION_5: dcd 0x40000000 ; Base address = 4000_0000h \r
+DRACR_REGION_5: dcd 0x0000030F ; R/W(full), Normal, Write-back write allocate, share \r
+DRSR_REGION_5: dcd 0x00000035 ; Size 128MB, MPU enable \r
+ \r
+DRBAR_REGION_6: dcd 0x48000000 ; Base address = 4800_0000h \r
+DRACR_REGION_6: dcd 0x0000030F ; R/W(full), Normal, Write-back write allocate, share \r
+DRSR_REGION_6: dcd 0x00000035 ; Size 128MB, MPU enable \r
+\r
+DRBAR_REGION_7: dcd 0x50000000 ; Base address = 5000_0000h \r
+DRACR_REGION_7: dcd 0x00001305 ; R/W(full), XN, Device, share \r
+DRSR_REGION_7: dcd 0x00000035 ; Size 128MB, MPU enable \r
+\r
+DRBAR_REGION_8: dcd 0x60000000 ; Base address = 6000_0000h\r
+DRACR_REGION_8: dcd 0x0000030C ; R/W(full), Normal, Non-cache, share \r
+DRSR_REGION_8: dcd 0x00000035 ; Size 128MB, MPU enable \r
+\r
+DRBAR_REGION_9: dcd 0x68000000 ; Base address = 6800_0000h \r
+DRACR_REGION_9: dcd 0x0000030C ; R/W(full), Normal, Non-cache, share \r
+DRSR_REGION_9: dcd 0x00000035 ; Size 128MB, MPU enable \r
+ \r
+DRBAR_REGION_10: dcd 0x70000000 ; Base address = 7000_0000h \r
+DRACR_REGION_10: dcd 0x00001305 ; R/W(full), XN, Device, share \r
+DRSR_REGION_10: dcd 0x00000035 ; Size 128MB, MPU enable \r
+\r
+DRBAR_REGION_11: dcd 0x80000000 ; Base address = 8000_0000h \r
+DRACR_REGION_11: dcd 0x00001305 ; R/W(full), XN, Device, share \r
+DRSR_REGION_11: dcd 0x0000003D ; Size 2GB, MPU enable \r
+\r
+cache_init:\r
+ push {lr}\r
+\r
+cache_invalidate:\r
+ ; Invalidate the I1, D1 cache \r
+ mov r0, #0\r
+ mcr p15, #0, r0, c7, c5, #0 ; Invalidate all Instruction Caches (Write-value is Ignored)\r
+ isb ; Ensuring Context-changing\r
+ mcr p15, #0, r0, c15, c5, #0 ; Invalidate all Data Caches (Write-value is Ignored)\r
+ isb ; Ensuring Context-changing\r
+ \r
+ ; Adopt default memory map as background map.\r
+ ldr r0, SCTLR_BR ; Set SCTLR.BR bit to 1\r
+ mrc p15, 0, r1, c1, c0, 0 \r
+ orr r1, r1, r0\r
+ dsb\r
+ mcr p15, 0, r1, c1, c0, 0 \r
+ isb ; Ensuring Context-changing\r
+ \r
+ ; Initialize MPU settings (region 0 to 11)\r
+ ; Define region 0\r
+ mov r0, #0\r
+ ldr r1, DRBAR_REGION_0\r
+ ldr r2, DRACR_REGION_0\r
+ ldr r3, DRSR_REGION_0\r
+ bl mpu_init\r
+\r
+ ; Define region 1\r
+ mov r0, #1\r
+ ldr r1, DRBAR_REGION_1\r
+ ldr r2, DRACR_REGION_1\r
+ ldr r3, DRSR_REGION_1\r
+ bl mpu_init\r
+\r
+ ; Define region 2\r
+ mov r0, #2\r
+ ldr r1, DRBAR_REGION_2\r
+ ldr r2, DRACR_REGION_2\r
+ ldr r3, DRSR_REGION_2\r
+ bl mpu_init\r
+\r
+ ; Define region 3\r
+ mov r0, #3\r
+ ldr r1, DRBAR_REGION_3\r
+ ldr r2, DRACR_REGION_3\r
+ ldr r3, DRSR_REGION_3\r
+ bl mpu_init\r
+\r
+ ; Define region 4\r
+ mov r0, #4\r
+ ldr r1, DRBAR_REGION_4\r
+ ldr r2, DRACR_REGION_4\r
+ ldr r3, DRSR_REGION_4\r
+ bl mpu_init\r
+\r
+ ; Define region 5\r
+ mov r0, #5\r
+ ldr r1, DRBAR_REGION_5\r
+ ldr r2, DRACR_REGION_5\r
+ ldr r3, DRSR_REGION_5\r
+ bl mpu_init\r
+\r
+ ; Define region 6\r
+ mov r0, #6\r
+ ldr r1, DRBAR_REGION_6\r
+ ldr r2, DRACR_REGION_6\r
+ ldr r3, DRSR_REGION_6\r
+ bl mpu_init\r
+\r
+ ; Define region 7\r
+ mov r0, #7\r
+ ldr r1, DRBAR_REGION_7\r
+ ldr r2, DRACR_REGION_7\r
+ ldr r3, DRSR_REGION_7\r
+ bl mpu_init\r
+\r
+ ; Define region 8\r
+ mov r0, #8\r
+ ldr r1, DRBAR_REGION_8\r
+ ldr r2, DRACR_REGION_8\r
+ ldr r3, DRSR_REGION_8\r
+ bl mpu_init\r
+\r
+ ; Define region 9\r
+ mov r0, #9\r
+ ldr r1, DRBAR_REGION_9\r
+ ldr r2, DRACR_REGION_9\r
+ ldr r3, DRSR_REGION_9\r
+ bl mpu_init\r
+\r
+ ; Define region 10\r
+ mov r0, #10\r
+ ldr r1, DRBAR_REGION_10\r
+ ldr r2, DRACR_REGION_10\r
+ ldr r3, DRSR_REGION_10\r
+ bl mpu_init\r
+\r
+ ; Define region 11\r
+ mov r0, #11\r
+ ldr r1, DRBAR_REGION_11\r
+ ldr r2, DRACR_REGION_11\r
+ ldr r3, DRSR_REGION_11\r
+ bl mpu_init\r
+ \r
+ ; Enables MPU operation\r
+ ldr r0, SCTLR_M ; Set SCTLR.M bit to 1\r
+ mrc p15, 0, r1, c1, c0, 0 \r
+ orr r1, r1, r0\r
+ dsb\r
+ mcr p15, 0, r1, c1, c0, 0 \r
+ isb ; Ensuring Context-changing\r
+ \r
+ ; Enables I1,D1 cache operation\r
+ ldr r0, SCTLR_I_C ; Set SCTLR.I and C bit to 1\r
+ mrc p15, 0, r1, c1, c0, 0 \r
+ orr r1, r1, r0\r
+ dsb\r
+ mcr p15, 0, r1, c1, c0, 0 \r
+ isb ; Ensuring Context-changing\r
+\r
+ pop {pc}\r
+ bx lr\r
+\r
+;***********************************************************************\r
+; Function Name : mpu_init\r
+; Description : Initialize MPU settings\r
+; Arguments : none\r
+; Return Value : none\r
+;***********************************************************************\r
+mpu_init:\r
+ ; RGNR(MPU Memory Region Number Register)\r
+ mcr p15, #0, r0, c6, c2, #0\r
+ isb ; Ensuring Context-changing\r
+ \r
+ ; DRBAR(Data Region Base Address Register)\r
+ mcr p15, #0, r1, c6, c1, #0\r
+ isb ; Ensuring Context-changing\r
+\r
+ ; DRACR(Data Region Access Control Register)\r
+ mcr p15, #0, r2, c6, c1, #4\r
+ isb ; Ensuring Context-changing\r
+\r
+ ; DRSR(Data Region Size and Enable Register)\r
+ mcr p15, #0, r3, c6, c1, #2\r
+ isb ; Ensuring Context-changing\r
+ \r
+ bx lr\r
+\r
+\r
+;***********************************************************************\r
+; Function Name : set_low_vec\r
+; Description : Initialize sysytem by loader program\r
+; Arguments : none\r
+; Return Value : none\r
+;***********************************************************************\r
+set_low_vec:\r
+ mrc p15, 0, r0, c1, c0, 0 ; Set SCTLR.V bit to 1 (low-vector)\r
+ and r0, r0, #0xFFFFDFFF\r
+ mcr p15, 0, r0, c1, c0, 0\r
+ isb ; Ensuring Context-changing\r
+ \r
+ bx lr \r
+\r
+ END \r
+; End of File \r