⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 startup.s

📁 CIRRUS 93XX系列windows mobile 6.0 BSP
💻 S
字号:
;**********************************************************************
;                                                                      
; Filename: startup.s
;                                                                      
; Description: Initialization before the MMU gets turned.  This is
;              the first code that gets executed.
;
; THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
; ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
; THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
; PARTICULAR PURPOSE.
;
; Use of this source code is subject to the terms of the Cirrus end-user
; license agreement (EULA) under which you licensed this SOFTWARE PRODUCT.
; If you did not accept the terms of the EULA, you are not authorized to 
; use this source code. For a copy of the EULA, please see the 
; EULA.RTF on your install media.
;
; Copyright(c) Cirrus Logic Corporation 2002, All Rights Reserved                       
;                                                                      
;**********************************************************************

    OPT 2   ; disable listing
    INCLUDE kxarm.h
    INCLUDE memorymap.inc
    OPT 1   ; reenable listing
    OPT 128 ; disable listing of macro expansions

;
; ASync bus mode, little endian, MMU disabled
;
CP15R1Init              EQU         0xC0001078           
CLKSET1DEFAULT          EQU         0x000398e7

EBOOT_RUN_FLAG			EQU		 0x00001234

REG_LED_ADDRESS        EQU         0x80840020
;
; Static memory settings.
;
SMCBCR_IDCY_MASK        EQU         0x0000000F
SMCBCR_IDCY_SHIFT       EQU         0
SMCBCR_WST1_MASK        EQU         0x000003E0
SMCBCR_WST1_SHIFT       EQU         5
SMCBCR_RBLE             EQU         0x00000400
SMCBCR_WST2_MASK        EQU         0x0000F800
SMCBCR_WST2_SHIFT       EQU         11
SMCBCR_WPERR            EQU         0x02000000
SMCBCR_WP               EQU         0x04000000
SMCBCR_PME              EQU         0x08000000
SMCBCR_MASK             EQU         0x30000000
SMCBCR_MW_8BIT          EQU         0x00000000
SMCBCR_MW_16BIT         EQU         0x10000000
SMCBCR_MW_32BIT         EQU         0x20000000
SMCBCR_EBIBRKDIS        EQU         0x40000000

ROMHDR_dllfirst         EQU         0x8
ROMHDR_dlllast          EQU         0xC
ROMHDR_physfirst        EQU         0x10
ROMHDR_physlast         EQU         0x14

REG_SCRATCH_REG0        EQU               0x80930040

           IF EP93XX_SDRAM_WIDTH = 16
ROM_OFFSET  EQU 0xDFF40000
           ELSE
ROM_OFFSET  EQU 0XDFD40000
			ENDIF


                IMPORT          KernelStart
                IMPORT          OEMAddressTable
                IMPORT          SysconSetup
                IMPORT          SdramCfg
                IMPORT          pTOC


;**********************************************************************
;  StartUp routine to initialize the processor.
;**********************************************************************
                STARTUPTEXT
StartString 
				DCB             "CRUS", 0 

                LEAF_ENTRY      StartUp

;
;  Kill watch dog timer. Before any thing else.
;
;                ldr             r0, =0x80940000
;                ldr             r1, =0xAA55
;                str             r1, [r0]

;
; ensure SVC32 mode with IRQ and FIQ disabled
;
                mov             r0, #0xd3
                msr             cpsr_c, r0
;
; Turn off the MMU
;
                ldr             r0, =CP15R1Init
                mcr            p15, 0, r0, c1, c0, 0
                nop
                nop

;
; If we loaded through eboot, SDRAM is already configured. 
; Check the CLKSET1 register to see if it has been modified.
;

                ldr             r0, =REG_SCRATCH_REG0 
                ldr             r1, [r0]
                ldr             r0, =EBOOT_RUN_FLAG
                cmp             r0, r1
                beq             DontConfigureSDRAM

;                
;
; Configure SDRAM
;
                bl              SdramCfg

DontConfigureSDRAM



;
; If we want an image that copies from flash to ram use the following.
;

;
; Configure the flash chips

				IF  EP93XX_FLASH_TYPE = "FLASH_TYPE_J3"
				
                  ldr             r0, =(  (4:SHL:SMCBCR_WST2_SHIFT)  :or: \
                                          (15:SHL:SMCBCR_WST1_SHIFT) )
                ELSE
                  ldr             r0, =((31:SHL:SMCBCR_WST2_SHIFT)  :or: \
                                      (31:SHL:SMCBCR_WST1_SHIFT) )
                ENDIF  

               IF  EP93XX_FLASH_WIDTH =16
                     ldr          r1,      =SMCBCR_MW_16BIT
               ELSE
                     ldr          r1,      =SMCBCR_MW_32BIT
               ENDIF
                
                ldr           r2,  =((1 :and:SMCBCR_IDCY_MASK)  :or: \
                                      SMCBCR_WP                  :or: \
                                      SMCBCR_PME                 :or: \
                                      SMCBCR_RBLE)
                                      
                                      
                orr            r0, r0, r1
                orr            r0, r0, r2
                ldr             r1, =REG_FLASH_CONFIG
                str             r0, [r1]
                nop

                IF              COPY_FLASH_TO_RAM
               
                bl                CopyCodeToRam
                                
                ENDIF

;
; create a temporary stack below kernel memory from config.bib
;

ExecuteFromRam
               ldr          r0, =EP93XX_SDRAM_PHY_ADDR
               add        r0, r0, #0x00040000 ;sp is set to the buffer of EDBG.
               mov       sp, r0 

               bl           SysconSetup

;
; clear out magic words for memory and heap
; (r0) = physical address of OEMAddressTable
;
;
; Calculate the physical address of the table.
;
; r0 - Virtual address of OEMAddressTable
; r1 - Physical Address of Startup
; r2 - Virtual Address of Startup
;
; r0 = r0 - r2 + r1 = Physical address of OEMAddressTable 
;            
                ldr             r0,=OEMAddressTable
                adr            r1,StartUp
                ldr             r2,=StartUp
                add             r0, r0, r1
                sub             r0, r0, r2


                bl              KernelStart
;
; KernelStart should never return:
;
    
                b               .



;;***********************************************************************************
;;CopyCodeToRam function starts
;;***********************************************************************************

                IF              COPY_FLASH_TO_RAM
                

                LEAF_ENTRY      CopyCodeToRam

;
; Get the address of the table of contents and adjust for the flash address.
;
                ldr             r0, =pTOC 
                ldr             r3,  =ROM_OFFSET
                
                add           r0, r0, r3
                ldr             r4, [r0]
                add           r4, r4, r3
;
; Get the dll first and dll last address.  
; r1  = Destiniation = dllfirst 
; r11 = length       = dlllast - dllfirst 
;
                ldr             r1, [r4, #ROMHDR_dllfirst]
                ldr             r11, [r4, #ROMHDR_dlllast]

;
; Make sure that r1 and r11 are on a 0x20 boundary.
;
                ldr             r2, =0x07FFFFE0
                ldr             r0, =EP93XX_SDRAM_PHY_ADDR
                and            r1, r1, r2
                orr             r1, r1, r0

                and             r11, r11, r2  
                add             r11, r11, #0x20
                orr             r11, r11, r0

;*************************************************************************
; Copy routine.
; 
; r0  = Source
; r1  = Destination
;r10 = The last address of first piece of SDRAM.
; r11 = End Address Address of Destination
; r12 = LED counter
; r13 = LED address.
;
;*************************************************************************

;Get the end address of first piece of SDRAM from OEMAddressTable.
                ldr             r9,=OEMAddressTable
                ldr             r8, =ROM_OFFSET
                add           r9, r9,r8
                ldr             r2, [r9, #8] ; r2 is the size of first piece of SDRAM in M bytes.
                cmp          r2,#64
                BHS         GreatThan64M
                
                ldr             r10, [r9, #0x4];the physical address of first piece of SDRAM
                ldr             r2, [r9, #0x8] ;the size of first piece of SDRAM
                mov          r2, r2, LSL #20 ;change the size from xxM to xxxxx BYTES
                add           r10, r10, r2       ;then, r10 is the last physical address of first piece of SDRAM.
                
                b               SecondSDRAMEnd
GreatThan64M
                ldr             r2,=EP93XX_SDRAM_PHY_ADDR
                add           r10,r2,#0x4000000
                
SecondSDRAMEnd

;Initialize LED state;;

                ldr             r13, =REG_LED_ADDRESS
                ldr             r2,  [r13]
                and            r2, r2, #0xFFFFFFFC
                orr             r2, r2, #1
                str              r2,  [r13]
                
                ldr             r12, =0x3FFFF

                ldr             r0,  =EP93XX_FLASH_PHY_ADDR

NKCopyLoop      
                 ldmia           r0!, {r2-r9}
                 stmia           r1!, {r2-r9}

NK8MegTest      
                cmp             r1, r10
                bne             NKLedTest

                ldr             r9,=OEMAddressTable
                ldr             r8, =ROM_OFFSET
                add           r9, r9,r8
                ldr             r1, [r9, #0x10]; set destination address to the second piece of SDRAM.

    	        sub			r11, r11, r10
		        add			r11, r11, r1

NKLedTest
                ands            r2, r0, r12
                beq             ToggleLED

NKCopyTest
                cmp             r1, r11
                bne             NKCopyLoop
                
                ldr             r0, =EP93XX_SDRAM_PHY_ADDR
                ldr             r2, =ExecuteFromRam
                and             r2, r2, #0x00FFFFFF
                orr             r2, r2, r0
                mov             pc, r2
                

ToggleLED
                ldr             r2, [r13]
                eor             r2, r2, #3
                str             r2, [r13]
                b               NKCopyTest
                
               mov pc, lr
               
               ENDIF

; End of initialization code & data
                TEXTAREA

                END

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -