navienginebsp/ne1_tb/nandboot/coreldrasm.s
changeset 0 5de814552237
equal deleted inserted replaced
-1:000000000000 0:5de814552237
       
     1 ;
       
     2 ; Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
       
     3 ; All rights reserved.
       
     4 ; This component and the accompanying materials are made available
       
     5 ; under the terms of "Eclipse Public License v1.0"
       
     6 ; which accompanies this distribution, and is available
       
     7 ; at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 ;
       
     9 ; Initial Contributors:
       
    10 ; Nokia Corporation - initial contribution.
       
    11 ;
       
    12 ; Contributors:
       
    13 ;
       
    14 ; Description:  
       
    15 ; ne1_tb\nandboot\coreldrasm.s
       
    16 ;
       
    17 
       
    18 	INCLUDE armcpudefs.inc			; Constants used by the MMU code
       
    19 	INCLUDE nand_plat.inc			; NAND device specifics
       
    20 	INCLUDE naviengine.inc
       
    21 
       
    22 	EXPORT	BootEntry
       
    23 	EXPORT	GetRomTargetAddress
       
    24 	EXPORT	GetSMRIBTargetAddress
       
    25 	EXPORT	GetSMRTargetStartAddress
       
    26 	EXPORT  GetSMRTargetMaxAddress
       
    27 	EXPORT	clearRestartTimer
       
    28 	EXPORT 	RestartAuxiliaryCores
       
    29 	IF USE_MMU
       
    30 		IMPORT	setupMMU
       
    31 		EXPORT	GetPageTableBaseAddress
       
    32 		EXPORT	GetMemoryBankArrayBase
       
    33 		EXPORT	GetNumberOfMemoryBankAddresses
       
    34 	ELSE ; USE_MMU
       
    35 		; NOT using MMU
       
    36 		IMPORT	loadmain
       
    37 		EXPORT	bootos
       
    38 	ENDIF	; USE_MMU
       
    39 	
       
    40 	EXPORT	charout
       
    41 	EXPORT	WriteW
       
    42 
       
    43 ;******************************************************************************
       
    44 ; Constants
       
    45 
       
    46 KHwSDramAddr				EQU	0x80000000
       
    47 KSDramSizeDdr				EQU	0x10000000  ; 256 MBytes
       
    48 
       
    49 
       
    50 KSerial0PhysBase				EQU	0x18034000 ; // must be same number as in ne1_tb.s
       
    51 ;Serial Port Register Offsets
       
    52 Serial_DLL			EQU		0
       
    53 Serial_DLH			EQU		4
       
    54 Serial_LCR			EQU		0xc
       
    55 Serial_THR			EQU		0
       
    56 Serial_LSR			EQU		0x14
       
    57 
       
    58 ; KRomTargetAddress is the memory location where the core image will be
       
    59 ; placed in RAM.
       
    60 KRomTargetAddress				EQU	KHwSDramAddr	                    ; Base of RAM
       
    61 KSDramTopAddress                EQU KHwSDramAddr + KSDramSizeDdr        ; 0x90000000
       
    62 KSRTargetSize                   EQU 0x02000000                          ; 32 Mb
       
    63 KSRIBTargetAddress				EQU KSDramTopAddress - KSRTargetSize    ;0x8E000000 (Top of Ram - 0x02000000 (32 Mb))
       
    64 KSRIBTargetSize                 EQU 0x00001000                          ; 4 Kb
       
    65 KSRTargetStartAddress			EQU KSRIBTargetAddress + KSRIBTargetSize ; 0x8E001000 (+4Kb)
       
    66 KSRTargetMaxAddress             EQU KSDramTopAddress 
       
    67 
       
    68 ; define linker area for placement of .text section (LINKBASE)
       
    69 ; also use PRESERVE8 to indicate (to linker) stack 8B alignment
       
    70 
       
    71 	PRESERVE8
       
    72 	AREA	|Boot$$Code|, CODE, READONLY, ALIGN=6
       
    73 
       
    74 ;******************************************************************************
       
    75 ; Entry point for the Core Loader
       
    76 ; Note that this MUST be at the start of the image!!!
       
    77 ;******************************************************************************
       
    78 BootEntry
       
    79 
       
    80 	LDR		r13, =KCoreldrStackAddr		; C code needs a stack
       
    81 
       
    82 	bl PauseAuxiliaryCores
       
    83 
       
    84 	; This hardware reference platorm, NaviEngine, bootstraps the coreloader image from NAND and
       
    85 	; has just started executing. Most of the hardware setup, such as configuring RAM, has 
       
    86 	; already been done by the bootloader. For systems that boot directly from the coreloader 
       
    87 	; image most of the hardware setup will need to be done here as it won't have been done 
       
    88 	; in bootoader code.
       
    89 
       
    90 	BL		InitUart
       
    91 		
       
    92 	IF USE_MMU
       
    93 		
       
    94 		b		setupMMU
       
    95 
       
    96 ; Store the page tables after the coreloader on the next 128K boundary
       
    97 KCoreLdrPDEAddress			EQU ( ( _LINKBASE_ +0x00020000)) :AND: 0xfff20000
       
    98 
       
    99 ; Format of table is, for each mapping region
       
   100 ; virtual address, physical address, length of region (each these must be
       
   101 ; megabyte aligned) the PDEs created will be for 1MB sections and so will cover
       
   102 ; 1MB above the VA+length. 
       
   103 ;
       
   104 ; A table with more elements would look like this
       
   105 ; memoryTable DCD virtual_address1, physical_address1, length1
       
   106 ;             DCD virtual_address2, physical_address2, length2
       
   107 ;             DCD virtual_address3, physical_address3, length3
       
   108 ;
       
   109 memoryTable DCD KHwSDramAddr, KHwSDramAddr, KSDramSizeDdr; Map all SDRAM
       
   110 
       
   111 GetPageTableBaseAddress
       
   112 		LDR		r0,=KCoreLdrPDEAddress
       
   113 		__JUMP	lr
       
   114 
       
   115 GetMemoryBankArrayBase
       
   116 		ADRL	r0,memoryTable
       
   117 		__JUMP	lr
       
   118 
       
   119 GetNumberOfMemoryBankAddresses
       
   120 		MOV		r0,#1			; 1 row only
       
   121 		__JUMP	lr
       
   122 
       
   123 	ELSE	; USE_MMU
       
   124 	; NOT using MMU
       
   125 				
       
   126 		b		loadmain		; jump directly into the NAND core loader without setting up the MMU
       
   127 
       
   128 ; bootos symbol needs defining if NOT using the MMU code
       
   129 bootos
       
   130 
       
   131 	BL RestartAuxiliaryCores
       
   132 	MOV		pc, r0				; jump off to OS
       
   133 
       
   134 	ENDIF	; USE_MMU
       
   135 
       
   136 
       
   137 GetRomTargetAddress
       
   138 	ldr		r0, =KRomTargetAddress
       
   139 	__JUMP	lr
       
   140 	
       
   141 GetSMRIBTargetAddress
       
   142 	ldr		r0, =KSRIBTargetAddress
       
   143 	__JUMP	lr
       
   144 	
       
   145 GetSMRTargetStartAddress
       
   146 	ldr		r0, =KSRTargetStartAddress
       
   147 	__JUMP	lr
       
   148 	
       
   149 GetSMRTargetMaxAddress
       
   150     ldr     r0, =KSRTargetMaxAddress
       
   151 	__JUMP	lr    
       
   152 	
       
   153 ;******************************************************************************
       
   154 ;	writes character in r0 to the debug port
       
   155 ;******************************************************************************
       
   156 charout
       
   157 		STMFD	sp!, {r1,r2,lr}
       
   158 		LDR		r1, =KSerial0PhysBase
       
   159 
       
   160 		; wait for debug port to be ready for data
       
   161 1
       
   162 		LDR		r2, [r1, #Serial_LSR]
       
   163 		TST		r2, #0x20
       
   164 		BEQ		%BT1
       
   165 		
       
   166 		; output character to debug port
       
   167 		STR		r0, [r1, #Serial_THR]
       
   168 
       
   169 		LDMFD	sp!, {r1,r2,pc}
       
   170 	
       
   171 ;******************************************************************************
       
   172 ; Printf("%0x", r0) a word to the serial port (stack required)
       
   173 ;
       
   174 ; Enter with
       
   175 ;		r0 = word
       
   176 ;		debug port initialised
       
   177 ;
       
   178 ; Leave with
       
   179 ;		no registers changed
       
   180 ;******************************************************************************
       
   181 WriteW
       
   182 	STMFD	sp!, {r0-r4, lr}
       
   183 	MOV		r4, #28
       
   184 	MOV		r1, r0
       
   185 
       
   186 1	MOV		r0, r1, LSR r4
       
   187 	AND		r0, r0, #0x0000000F
       
   188 	CMP		r0, #9
       
   189 	ADDLE	r0, r0, #48
       
   190 	ADDGT	r0, r0, #55
       
   191 	BL		charout
       
   192 	SUBS	r4, r4, #4
       
   193 	BGE		%BT1
       
   194 
       
   195 	MOV		r0, #' '
       
   196 	BL		charout
       
   197 
       
   198 	LDMFD	sp!, {r0-r4, pc}
       
   199 	
       
   200 ;******************************************************************************
       
   201 ;	Prepares and starts a timer
       
   202 ;	Preserves all registers
       
   203 ; NOT SUPPORTED ON NAVIENGINE - SUPPLIED TO ALLOW COMPILE
       
   204 ;******************************************************************************
       
   205 clearRestartTimer
       
   206 	MOV     r0, lr
       
   207 	NOP
       
   208 	MOV		pc, r0
       
   209 
       
   210 ;******************************************************************************
       
   211 ; Initialise the serial port (stack required)
       
   212 ; This is derived from the NaviEngine bootstrap's debug uart initialisation code.
       
   213 ; Enter with :
       
   214 ;		none
       
   215 ; Leave with :
       
   216 ;		no registers changed
       
   217 ;******************************************************************************
       
   218 InitUart
       
   219 		MOV     r0, lr
       
   220 		LDR		r1, =KSerial0PhysBase
       
   221 
       
   222 		; set up debug port
       
   223 		MOV		r2, #0x83
       
   224 		STR		r2, [r1, #Serial_LCR]
       
   225 		MOV		r2, #KBaudRateDiv_default
       
   226 		STR		r2, [r1, #Serial_DLL]
       
   227 		MOV		r2, #0
       
   228 		STR		r2, [r1, #Serial_DLH]
       
   229 		MOV		r2, #0x03
       
   230 		STR		r2, [r1, #Serial_LCR]
       
   231 
       
   232 		MOV		pc, r0
       
   233 		
       
   234 	
       
   235 	
       
   236 
       
   237 
       
   238 ;***************************************************************************************
       
   239 ;	SMP code - PauseAuxiliaryCores
       
   240 ;	Expects lr and sp
       
   241 ;***************************************************************************************
       
   242 PauseAuxiliaryCores	
       
   243 	
       
   244 	
       
   245 	;	IF SMP
       
   246 
       
   247 		; Is this the boot processor ?
       
   248 		MRC		p15, 0, r0, c0, c0, 5
       
   249 		ANDS	r0, r0, #0x0f			; r0 = CPU number 0-3
       
   250 		BEQ		IsBootProcessor			; Branch out if CPU 0 (= boot processor)
       
   251 		mov 	r10, r0
       
   252 		; No - this is an AP
       
   253 
       
   254 		mov		r5, r13
       
   255 		add		r13, r13, r10, lsl #2  ; Move to stack var for this core
       
   256 		mov 	r3, #10
       
   257 
       
   258 1
       
   259 		ldr		r4, [r5]	; load message
       
   260 		teq		r3,r4		; is message r3?
       
   261 		streq	r3, [r13]	; 
       
   262 		addeq	r3, r3, #1
       
   263 		teq		r3, #13
       
   264 		beq		Signaled
       
   265 
       
   266 		nop
       
   267 		nop
       
   268 		nop
       
   269 		nop
       
   270 
       
   271 		B		%BA1
       
   272 
       
   273 Signaled
       
   274 
       
   275 		ldr		pc, =KRomTargetAddress
       
   276 
       
   277 IsBootProcessor
       
   278 	add r13, r13, #16	; reserve space on stack for signaling
       
   279 	mov	pc, lr
       
   280 
       
   281 
       
   282 
       
   283 ;***************************************************************************************
       
   284 ;	SMP code - RestartAuxiliaryCores
       
   285 ;	Expects lr, r0 - address to start cores at.
       
   286 ;   Corrupts r1-3
       
   287 ;***************************************************************************************
       
   288 
       
   289 
       
   290 RestartAuxiliaryCores
       
   291 
       
   292 ;KCoreldrStackAddr			EQU 0x8C0003FC
       
   293 
       
   294 
       
   295 		; This code wakes the other cores, causing them to run the image
       
   296 
       
   297 		LDR		r3, =KCoreldrStackAddr ; Find our origanal stack frame
       
   298 		mov		r2 , #10
       
   299 1
       
   300 		str		r2, [r3]				; send r2
       
   301 
       
   302 		ldr	r1,	[r3, #4]				; read from core 1
       
   303 		teq r1, r2							; has it recieved?
       
   304 		bne	%BA1
       
   305 
       
   306 		ldr	r1,	[r3, #8]				; read from core 2
       
   307 		teq r1, r2							; has it recieved?
       
   308 		bne	%BA1
       
   309 
       
   310 		ldr	r1,	[r3, #12]				; read from core 3
       
   311 		teq r1, r2							; has it recieved?
       
   312 		bne	%BA1
       
   313 
       
   314 		add	r2,r2, #1					; add 1 to our massage, and try agian
       
   315 		teq	r2, #13						; we repeat a few times, to make sure
       
   316 		bne %BA1
       
   317 
       
   318 		mov pc, lr
       
   319 
       
   320 	END