fwxsc1.s

来自「PXA255 WINCE 4.2 BSP ,该BSP是商用的。」· S 代码 · 共 830 行 · 第 1/2 页

S
830
字号

    INCLUDE kxarm.h
    INCLUDE oalintra.inc
    INCLUDE XSC1.inc
    INCLUDE XSC1bd.inc
    INCLUDE fwXsc1.inc    
;    INCLUDE sa11x1.inc

EBOOT_PARTITION_PHY_BASE        EQU     SDRAM_PHY_EBOOT_PARTITION
EBOOT_PARTITION_VIR_C_BASE      EQU     SDRAM_VIR_C_EBOOT_PARTITION


CLOCK_200MHz EQU 0x100
CLOCK_300MHz EQU 0x180
CLOCK_400MHz EQU 0x200

CLOCK_CPU_SPEED EQU CLOCK_200MHz	; set core clock to 200/300/400 MHz
CLOCK_CPU_TURBO	EQU	0		; 0/1 switch to turbo mode clock

GPIO_GPSR0_VAL EQU 0xffffffff  ; GPIO pin output set registers
GPIO_GPSR1_VAL EQU 0xffffffff
GPIO_GPSR2_VAL EQU 0xffffffff

GPIO_GPCR0_VAL EQU 0x08022080  ; GPIO pin output clear registers
GPIO_GPCR1_VAL EQU 0x00000000
GPIO_GPCR2_VAL EQU 0x00000000

GPIO_GPDR0_VAL EQU 0xc00220d8  ; GPIO pin direction registers
GPIO_GPDR1_VAL EQU 0xfcffab82
GPIO_GPDR2_VAL EQU 0x0000ffff

GPIO_GAFR0_L_VAL EQU 0x00000000  ; GPIO alternate function registers
GPIO_GAFR0_U_VAL EQU 0xa5000010
GPIO_GAFR1_L_VAL EQU 0x599a9550
GPIO_GAFR1_U_VAL EQU 0xaaa5aaaa
GPIO_GAFR2_L_VAL EQU 0xaaaaaaaa
GPIO_GAFR2_U_VAL EQU 0x00000000

MEM_MSC0_VAL EQU 0x2ef15af0		; static memory controller
MEM_MSC1_VAL EQU 0x32cc32cc
MEM_MSC2_VAL EQU 0x3ff43ff4

PCMCIA_MECR_VAL EQU 0x00000000	; pcmcia memory controller
PCMCIA_MCMEM0_VAL EQU 0x00010504
PCMCIA_MCMEM1_VAL EQU 0x00010504
PCMCIA_MCATT0_VAL EQU 0x00010504
PCMCIA_MCATT1_VAL EQU 0x00010504
PCMCIA_MCIO0_VAL EQU 0x00004715
PCMCIA_MCIO1_VAL EQU 0x00004715

	OPT   1

	IF :LNOT: :DEF: ETHBOOT     ; see eboot\fwp2.s
		IMPORT KernelStart
	ELSE
		IMPORT main
	ENDIF

	STARTUPTEXT
	LEAF_ENTRY StartUp

	; exception table should be at address 0x0
reset
	b reset_handler
undef_inst
	b undef_inst		; undefined instruction
soft_int
	b soft_int			; software interupt
pfetch_abort
	b pfetch_abort		; abort prefetch
data_abort
	b data_abort		; abort data
not_used
	b not_used			; not used
irq_int
	b irq_int			; interupt request IRQ
fiq_int
	b fiq_int			; fast interupt request FIQ


	LTORG ; time-critical path
    ALIGN 32

UART_CTRL_BASE EQU 0x40100000

putc_ttys0
	ldr r1, =(UART_CTRL_BASE+0x14)
	ldr r1, [r1]
	tst r1, #0x40
	beq putc_ttys0

	and r1, r0, #0xff
	ldr r0, =UART_CTRL_BASE
	str r1, [r0]
	mov pc, lr

	; initialize SDRAM memory controler

MEMORY_CTRL_MDCNFG EQU 0x00
MEMORY_CTRL_MDREFR EQU 0x04
MEMORY_CTRL_MDMRS EQU 0x40

SLF_REFRESH EQU 0x400000
HALF_MEMCLK EQU 0x0a4000
MEMCLK_RUN EQU 0x52000
MEMCLK_ENABLE EQU 0x9000

	; r0 = memory size, r1 = memory ctrl base

sdram_init
	ldr     r2, =(0x3800000 | SLF_REFRESH)
	ldr	r3, =0x0fff

	orr	r3, r3, r2
	str     r3, [r1, #MEMORY_CTRL_MDREFR]

	cmp	r0, #0x2000000
	orrgt	r2, r2, #0x30	; 64MB SDRAM
	orrle	r2, r2, #0x60	; 32MB SDRAM

	str     r2, [r1, #MEMORY_CTRL_MDREFR]	; set data refresh rate

	orr     r2, r2, #MEMCLK_RUN
	str     r2, [r1, #MEMORY_CTRL_MDREFR]	; set memclk free running

	bic	r2, r2, #SLF_REFRESH
	str     r2, [r1, #MEMORY_CTRL_MDREFR]   ; clear self refresh

	orr	r2, r2, #MEMCLK_ENABLE
	str     r2, [r1, #MEMORY_CTRL_MDREFR]   ; enable memclk

PART_ENABLE EQU 0x3

ROWADDR_12b EQU 0x20	; 32MB SDRAM on board
ROWADDR_13b EQU 0x40	; 64MB SDRAM on board

CAS2_RAS5_RC8 EQU 0x100	; 50MHz memclk
CAS3_RAS7_RC10 EQU 0x200	; 100MHz memclk
CAS3_RAS7_RC11 EQU 0x300

SA1111_MODE EQU 0x1000	; necessary for 64MB mode

	ldr	r2, =(0x888 | CAS3_RAS7_RC10)

	cmp     r0, #0x2000000
	orrgt   r2, r2, #ROWADDR_13b	 ; 64MB SDRAM
	orrgt   r2, r2, #SA1111_MODE
	orrle	r2, r2, #ROWADDR_12b	 ; 32MB SDRAM

	str     r2, [r1, #MEMORY_CTRL_MDCNFG]

	mov	r3, #0x400	; delay to wait for memory
delay
	nop
	nop
	subs	r3, r3, #1
	bne	delay
	nop
	nop
	nop

	orr	r2, r2, #PART_ENABLE
	str     r2, [r1, #MEMORY_CTRL_MDCNFG]

	ldr	r2, =0x220022
	str     r2, [r1, #MEMORY_CTRL_MDMRS]

	mov     pc, lr

try2wakeup		; if good sleep database, only  returns if special case

	; do checksum on the sleepdata

    ldr     r3, =(SLEEPDATA_BASE_PHYSICAL)
    ldr     r0, =(SLEEP_CHECKSUM_SEED)
    ldr     r2, =(SLEEPDATA_SIZE-1)
32
    ldr     r1, [r3], #4
    add     r0, r0, r1
    mov     r0, r0, ROR #31
    subs    r2, r2, #1
    bne     %b32
    
    ; checksum in r0, compare to cpsr

    ldr     r2, =PSPR_BASE_PHYSICAL
    ldr     r1, [r2]

    cmp     r0, r1
    bne     bad_checksum

    ldr    r3, =(SLEEPDATA_BASE_PHYSICAL+SleepState_SLEEP_TYPE)
    ldr    r1, [r3]
    cmp    r1, #SLEEP_TYPE_SOFT_RESET
    beq    soft_reset 

	; restore from sleep

    ldr r3, =(SLEEPDATA_BASE_PHYSICAL)

    ldr	r11, [r3, #SleepState_MMU_DOMAIN]   ; load the MMU domain access info
    ldr r9,  [r3, #SleepState_MMU_TTB]      ; load the MMU TTB info 
    ldr r8,  [r3, #SleepState_MMU_CTL]      ; load the MMU control info 
    ldr r7,  [r3, #SleepState_MMU_AUXCTL ]  ; 
    ldr r6,  [r3, #SleepState_PID ] ; 
    ldr r5,  [r3, #SleepState_AwakeAddr ]   ; load the lr address
    nop         
    nop
    nop
    nop
    nop

    mcr p15, 0, r11, c3, c0, 0      ; setup access to domain 0
    mcr p15, 0, r9,  c2, c0, 0      ; TTB address
    mcr p15, 0, r0,  c8, c7, 0      ; Invalidate I+D TLBs
    mcr p15, 0, r8,  c1, c0, 0      ; restore MMU control
    mcr p15, 0, r7,  c1, c1, 0      ; restore MMU Aux control
    mcr p15, 0, r6, c13, c0, 0      ; restore PID

    mov pc, r5		; jump to new virtual address

soft_reset
    orr    r10, r10, #RCSR_GPIO_RESET
    mov    r1, #0
    str    r1, [r3]

bad_checksum

    bic r10, r10, #RCSR_SLEEP_RESET
	mov  pc, lr

reset_handler

	ldr	r0, =0x2001
	mcr	p15,0,r0,c15,c1,0	; allow access to all coprocesors
	nop
	nop
	nop

	mov	r0, #0x78
	mcr	p15,0,r0,c1,c0,0	; disable MMU, caches, write buffer
	nop
	nop
	nop

	mov	r0, #0
	mcr	p15,0,r0,c8,c7,0	; flush v4 TLB
	mcr	p15,0,r0,c7,c7,0	; flush v3/v4 caches
	mcr	p15,0,r0,c7,c10,4	; flush write buffer
	nop
	nop
	nop

	mvn	r0, #0
	mcr	p15,0,r0,c3,c0,0	; grant access to all domains

	; read and init reset cause bits

	ldr     r0,  =RCSR_BASE_PHYSICAL
	ldr     r10, [r0]

	; extract the reset cause bits
	;
	mov     r2,  #RCSR_ALL
	and     r10,  r10,  r2		; r10 holds the conditioned reset reason

	; clear the reset cause bits
	str     r2,  [r0]

	; read and store pssr
	ldr     r0,  =PSSR_BASE_PHYSICAL
	ldr     r12, [r0]

	; extract the reset cause bits
	mov     r2,  #PSSR_VALID_MASK
	and     r12,  r12,  r2
	mov     r12,  r12,  lsl #16
	orr     r10,  r10,  r12			; r10 now has rcsr in lower half and pssr in upper

	; initialize GPIO registers

GPIO_BASE EQU 0x40e00000
GPIO_GPDR0 EQU 0x0c
GPIO_GPSR0 EQU 0x18
GPIO_GPCR0 EQU 0x24
GPIO_GAFR0_L EQU 0x54

	ldr	r0, =(GPIO_BASE | GPIO_GPSR0)
	ldr	r1, =GPIO_GPSR0_VAL
	str	r1, [r0],#4
	ldr	r1, =GPIO_GPSR1_VAL
	str	r1, [r0],#4
	ldr	r1, =GPIO_GPSR2_VAL
	str	r1, [r0]

	ldr	r0, =(GPIO_BASE | GPIO_GPCR0)
	ldr	r1, =GPIO_GPCR0_VAL
	str	r1, [r0],#4
	ldr	r1, =GPIO_GPCR1_VAL
	str	r1, [r0],#4
	ldr	r1, =GPIO_GPCR2_VAL
	str	r1, [r0]

	ldr	r0, =(GPIO_BASE | GPIO_GPDR0)
	ldr	r1, =GPIO_GPDR0_VAL
	str	r1, [r0],#4
	ldr	r1, =GPIO_GPDR1_VAL
	str	r1, [r0],#4
	ldr	r1, =GPIO_GPDR2_VAL
	str	r1, [r0]

	ldr	r0, =(GPIO_BASE | GPIO_GAFR0_L)
	ldr	r1, =GPIO_GAFR0_L_VAL
	str	r1, [r0],#4
	ldr	r1, =GPIO_GAFR0_U_VAL
	str	r1, [r0],#4
	ldr	r1, =GPIO_GAFR1_L_VAL
	str	r1, [r0],#4
	ldr	r1, =GPIO_GAFR1_U_VAL
	str	r1, [r0],#4
	ldr	r1, =GPIO_GAFR2_L_VAL
	str	r1, [r0],#4
	ldr	r1, =GPIO_GAFR2_U_VAL
	str	r1, [r0]

PWR_CTRL_BASE EQU 0x40f00000
PWR_CTRL_PSSR EQU 0x4
PWR_PSSR_VAL EQU 0x30

	ldr     r2, =(PWR_CTRL_BASE | PWR_CTRL_PSSR)
	ldr     r3, =PWR_PSSR_VAL
	str     r3, [r2]

	; initialize pxa250 interupt controler

INTERUPT_CTRL_BASE EQU 0x40d00000
INTERUPT_CTRL_ICMR EQU 0x04

	ldr	r1, =(INTERUPT_CTRL_BASE | INTERUPT_CTRL_ICMR)
	mov	r2, #0
	str	r2, [r1]

    IF :LNOT: :DEF: ETHBOOT
    IF _FLASH != "1"
        b initperif
    ENDIF
    ENDIF

	; change core clock frequency

CLOCK_BASE EQU 0x41300000
CLOCK_CCCR EQU 0x0
CLOCK_CKEN EQU 0x4

	ldr	r1, =CLOCK_BASE

	mov	r2, #0
	str	r2, [r1, #CLOCK_CKEN]	; disable clocks

	mov	r2, #0x41
	orr	r2, r2, #CLOCK_CPU_SPEED	; set core clock (L:27,M:2)
	str	r2, [r1, #CLOCK_CCCR]

	mov	r1, #(0x2 | CLOCK_CPU_TURBO)
	mcr	p14,0,r1,c6,c0,0	; enter frequency change sequence


	; initialize pxa250 memory controler

MEMORY_CTRL_BASE EQU 0x48000000

	ldr     r1, =MEMORY_CTRL_BASE

	; initialize static memory controler

	ldr	r2, =MEM_MSC0_VAL
	str	r2, [r1, #MSC0_OFFSET]
	ldr	r2, [r1, #MSC0_OFFSET]

	ldr	r2, =MEM_MSC1_VAL
	str	r2, [r1, #MSC1_OFFSET]
	ldr	r2, [r1, #MSC1_OFFSET]

	ldr	r2, =MEM_MSC2_VAL
	str	r2, [r1, #MSC2_OFFSET]
	ldr	r2, [r1, #MSC2_OFFSET]

	; initialize pcmcia memory controler

	ldr     r2, =PCMCIA_MECR_VAL
	str     r2, [r1, #MECR_OFFSET]

	ldr     r2, =PCMCIA_MCMEM0_VAL
	str     r2, [r1, #MCMEM0_OFFSET]

	ldr     r2, =PCMCIA_MCMEM1_VAL
	str     r2, [r1, #MCMEM1_OFFSET]

	ldr     r2, =PCMCIA_MCATT0_VAL
	str     r2, [r1, #MCATT0_OFFSET]

	ldr     r2, =PCMCIA_MCATT1_VAL
	str     r2, [r1, #MCATT1_OFFSET]

	ldr     r2, =PCMCIA_MCIO0_VAL
	str     r2, [r1, #MCIO0_OFFSET]

	ldr     r2, =PCMCIA_MCIO1_VAL
	str     r2, [r1, #MCIO1_OFFSET]

	; initialize SDRAM memory controler

	ldr	r0, =0x4000000	; init SDRAM as 64MB
	bl	sdram_init

⌨️ 快捷键说明

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