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

📄 2440init.s

📁 阳初ucosII ADS1.2程序带VGA显示
💻 S
字号:
;=========================================
;
;=========================================

        GET Option.inc
        GET memcfg.inc
        GET 2440addr.inc
;====================================
; MMU Cache/TLB/etc on/off functions
;====================================
R1_I    EQU     (1<<12)
R1_C    EQU     (1<<2)
R1_A    EQU     (1<<1)
R1_M    EQU     (1)
R1_iA   EQU     (1<<31)
R1_nF   EQU     (1<<30)

BIT_SELFREFRESH EQU     (1<<22)


;Pre-defined constants
USERMODE    EQU         0x10
FIQMODE     EQU         0x11
IRQMODE     EQU         0x12
SVCMODE     EQU         0x53
ABORTMODE   EQU         0x17
UNDEFMODE   EQU         0x1b
MODEMASK    EQU         0x1f
NOINT       EQU         0xc0


;The location of stacks
UserStack   EQU (_STACK_BASEADDRESS-0x5000)
SVCStack    EQU (_STACK_BASEADDRESS-0x4000)
UndefStack  EQU (_STACK_BASEADDRESS-0x3000)
AbortStack  EQU (_STACK_BASEADDRESS-0x2000)
IRQStack    EQU (_STACK_BASEADDRESS-0x1000)
FIQStack    EQU (_STACK_BASEADDRESS-0x0)


            MACRO
$HandlerLabel HANDLER $HandleLabel

$HandlerLabel
        sub     sp,sp,#4        ;decrement sp(to store jump address)
        stmfd   sp!,{r0}        ;PUSH the work register to stack(lr does't push because it return to original address)
        ldr     r0,=$HandleLabel;load the address of HandleXXX to r0
        ldr     r0,[r0]         ;load the contents(service routine start address) of HandleXXX
        str     r0,[sp,#4]      ;store the contents(ISR) of HandleXXX to stack
        ldmfd   sp!,{r0,pc}     ;POP the work register and pc(jump to ISR)
        MEND

        IMPORT  |Image$$RO$$Base|   ; Base of ROM code
        IMPORT  |Image$$RO$$Limit|  ; End of ROM code (=start of ROM data)
        IMPORT  |Image$$RW$$Base|   ; Base of RAM to initialise
        IMPORT  |Image$$RW$$Limit|  ; End of RAM to initialise
        IMPORT  |Image$$ZI$$Base|   ; Base and limit of area
        IMPORT  |Image$$ZI$$Limit|  ; to zero initialise

        IMPORT  Main            ; The main entry of mon program
        IMPORT  __C_Inits       ;
        ;IMPORT  nand_init
        IMPORT  nand_read_ll

        AREA    Init,CODE,READONLY

        ENTRY
        EXPORT  ImageEntryPoint
ImageEntryPoint
        b       ResetHandler
        b       HandlerUndef    ;handler for Undefined mode
        b       HandlerSWI          ;handler for SWI interrupt
        b       HandlerPabort   ;handler for PAbort
        b       HandlerDabort   ;handler for DAbort
        b       Auto_Reset      ;reserved
        b       HandlerIRQ          ;handler for IRQ interrupt
        b       HandlerFIQ          ;handler for FIQ interrupt


;HandlerIRQ      HANDLER HandleIRQ
HandlerIRQ
        sub     sp,sp,#4       ;reserved for PC
        stmfd   sp!,{r8-r9}

        ldr     r9,=INTOFFSET
        ldr     r9,[r9]
        ldr     r8,=HandleEINT0
        add     r8,r8,r9,lsl #2
        ldr     r8,[r8]
        str     r8,[sp,#8]
        ldmfd   sp!,{r8-r9,pc}

HandlerFIQ      HANDLER HandleFIQ
HandlerUndef    HANDLER HandleUndef
HandlerSWI      HANDLER HandleSWI
HandlerDabort   HANDLER HandleDabort
HandlerPabort   HANDLER HandlePabort
        EXPORT Auto_Reset
Auto_Reset
        ldr     r0,=WTCON       ;watch dog disable
        ldr     r1,=0x8021
        str     r1,[r0]
        b   .
    LTORG

        EXPORT SWI_UNF_Def
        EXPORT IRQ_FIQ_PABT_Def
        EXPORT DABT_Def
SWI_UNF_Def
    movs    pc,lr

IRQ_FIQ_PABT_Def
    subs    pc,lr,#4

DABT_Def
    subs    pc,lr,#8

;=======
; ENTRY
;=======
ResetHandler
        ldr     r0,=WTCON       ;watch dog disable
        mov     r1,#0x0
        str     r1,[r0]

        ldr     r0,=INTMSK
        ldr     r1,=0xffffffff      ;all interrupt disable
        str     r1,[r0]

        ldr     r0,=SRCPND
        str     r1,[r0]

        ldr     r0,=INTPND
        str     r1,[r0]

        ldr     r0,=INTSUBMSK
        ldr     r1,=0x7fff                      ;all sub interrupt disable, 2002/04/10
        str     r1,[r0]

        ;ldr    r0,=SUBSRCPND
        ;str    r1,[r0]


        ;To reduce PLL lock time, adjust the LOCKTIME register.
        ;ldr     r0,=LOCKTIME
        ;ldr     r1,=0xffffff
        ;str     r1,[r0]
        mov	r1, #CLK_CTL_BASE
	    ldr	r2, clock_locktime
	    str	r2, [r1, #oLOCKTIME]

        mov	r1, #CLK_CTL_BASE
	    ldr	r2, clkdivn_value
	    str	r2, [r1, #oCLKDIVN]

	    mrc	p15, 0, r1, c1, c0, 0		; read ctrl register
	    orr	r1, r1, #0xc0000000		; Asynchronous
	    mcr	p15, 0, r1, c1, c0, 0		; write ctrl register

	    mov	r1, #CLK_CTL_BASE
	    ldr	r2, mpll_value			; clock default
	    ;ldr r2, mpll_value_USER			; clock user set
	    str	r2, [r1, #oMPLLCON]

        ;Set memory control registers
        adr r0,SMRDATA
        ldr r1,=BWSCON      ;BWSCON Address
        add r2, r0, #52     ;End address of SMRDATA
0
        ldr r3, [r0], #4
        str r3, [r1], #4
        cmp r0, r2
        bcc %B0

        ;Initialize stacks
        bl      InitStacks

; InitUART
    	; set GPIO for UART
    	mov	r1, #GPIO_CTL_BASE
    	add	r1, r1, #oGPIO_H
    	ldr	r2, gpio_con_uart
    	str	r2, [r1, #oGPIO_CON]
    	ldr	r2, gpio_up_uart
    	str	r2, [r1, #oGPIO_UP]

    	ldr	r1, SerBase
    	mov	r2, #0x0
    	str	r2, [r1, #oUFCON]
    	str	r2, [r1, #oUMCON]
    	mov	r2, #0x3
    	str	r2, [r1, #oULCON]
    	ldr	r2, =0x245
    	str	r2, [r1, #oUCON]
UART_BRD    EQU ((UART_PCLK / (UART_BAUD_RATE*16)) - 1)
    	mov	r2, #UART_BRD
    	str	r2, [r1, #oUBRDIV]

    	mov	r3, #100
1	    subs	r3, r3, #0x1
	    bne	%B1

        ;bl      nand_init
        ; reset NAND
;nand_init
    	mov	r1, #NAND_CTL_BASE
    	ldr	r2, =( (7<<12)|(7<<8)|(7<<4)|(0<<0) )
    	str	r2, [r1, #oNFCONF]
    	ldr	r2, [r1, #oNFCONF]
    
    	ldr	r2, =( (1<<4)|(0<<1)|(1<<0) ) ; Active low CE Control 
    	str	r2, [r1, #oNFCONT]
    	ldr	r2, [r1, #oNFCONT]
    
    	ldr	r2, =(0x6)		; RnB Clear
    	str	r2, [r1, #oNFSTAT]
    	ldr	r2, [r1, #oNFSTAT]
    	
    	mov	r2, #0xff		; RESET command
    	strb	r2, [r1, #oNFCMD]
    	mov	r3, #0			; wait 
1	    add	r3, r3, #0x1
    	cmp	r3, #0xa
    	blt	%B1
2	    ldr	r2, [r1, #oNFSTAT]	; wait ready
    	tst	r2, #0x4
    	beq	%B2
    
    	ldr	r2, [r1, #oNFCONT]
    	orr	r2, r2, #0x2		; Flash Memory Chip Disable
    	str	r2, [r1, #oNFCONT]
    	

	    ;Copy ROM code to SDRAM
	    adr     r0, ImageEntryPoint
	    
	    ldr     r2, =|Image$$RW$$Base|  ; and RAM copy
        ldr     r3, =|Image$$ZI$$Base|
        sub     r2,r3,r2
        ldr     r3, =|Image$$RO$$Limit|
        ldr	    r1, =|Image$$RO$$Base| ; Get pointer to ROM data
	    add     r2,r2,r3

	    cmp     r0,#0
	    bne     %F0
	    
	    ldr     r3,=BWSCON
	    ldr     r3,[r3]
	    ands    r3,r3,#0x06
	    bne     %F1

	    ; boot from NAND flash
        mov     r0,r1
        sub     r2,r2,r1
        mov     r1,#0
        ldr     lr, =On_The_Ram
        b       nand_read_ll

        ; boot from NOR flash
0
	    cmp     r0,r1
	    beq     %F2
1
        cmp     r1, r2      ; Copy init data
        ldrcc   r3, [r0], #4    ;--> LDRCC r2, [r0] + ADD r0, r0, #4
        strcc   r3, [r1], #4    ;--> STRCC r2, [r1] + ADD r1, r1, #4
        bcc     %B1
2
        ldr     pc,=On_The_Ram

On_The_Ram
        ;Copy and paste RW data/zero initialized data
        ldr     r0, =|Image$$RO$$Limit| ; Get pointer to ROM data
        ldr     r1, =|Image$$RW$$Base|  ; and RAM copy
        ldr     r3, =|Image$$ZI$$Base|

        ;Zero init base => top of initialised data
        cmp     r0, r1      ; Check that they are different
        beq     %F2
1       
        cmp     r1, r3      ; Copy init data
        ldrcc   r2, [r0], #4    ;--> LDRCC r2, [r0] + ADD r0, r0, #4         
        strcc   r2, [r1], #4    ;--> STRCC r2, [r1] + ADD r1, r1, #4
        bcc     %B1
2
        ldr     r1, =|Image$$ZI$$Limit| ; Top of zero init segment
        mov     r2, #0
3
        cmp     r3, r1      ; Zero init
        strcc   r2, [r3], #4
        bcc     %B3


        adrl    r0, BootNand
        adrl    r1, BootNor
        ldr     r3,=BWSCON
	    ldr     r3,[r3]
	    ands    r3,r3,#0x06
	    movne   r0,r1
	    bl      PrintStr
	    
	    adr     r0,Say_Hello
        bl      PrintStr

        bl              __C_Inits
        ;sub     lr,pc,#8
        ;ldr     pc,=Main
        bl      Main        ;Don't use main() because ......
        b       Auto_Reset

;function initializing stacks
InitStacks
        ;Don't use DRAM,such as stmfd,ldmfd......
        ;SVCstack is initialized before
        ;Under toolkit ver 2.5, 'msr cpsr,r1' can be used instead of 'msr cpsr_cxsf,r1'
        mrs r0,cpsr
        bic r0,r0,#MODEMASK
        orr r1,r0,#UNDEFMODE|NOINT
        msr cpsr_cxsf,r1        ;UndefMode
        ldr sp,=UndefStack

        orr r1,r0,#ABORTMODE|NOINT
        msr cpsr_cxsf,r1        ;AbortMode
        ldr sp,=AbortStack

        orr r1,r0,#IRQMODE|NOINT
        msr cpsr_cxsf,r1        ;IRQMode
        ldr sp,=IRQStack

        orr r1,r0,#FIQMODE|NOINT
        msr cpsr_cxsf,r1        ;FIQMode
        ldr sp,=FIQStack

        bic r0,r0,#MODEMASK|NOINT
        orr r1,r0,#SVCMODE
        msr cpsr_cxsf,r1        ;SVCMode
        ldr sp,=SVCStack

        ;USER mode has not be initialized.
        mov pc,lr
        ;The LR register won't be valid if the current mode is not SVC mode.

        EXPORT PrintChar
PrintChar
        mov     r1, #UART0_CTL_BASE
1
        ldr     r2, [r1, #oUTRSTAT]
        ;and     r2, r2, #UTRSTAT_TX_EMPTY
        tst     r2, #UTRSTAT_TX_EMPTY
        beq     %B1
        str     r0, [r1, #oUTXHL]
        mov     pc, lr

PrintStr
        stmfd	sp!, {r4, lr}

	    movs	r4, r0
	    ldmeqfd	sp!, {r4, pc}
1
	    ldrb r0, [r4], #1
	    cmp r0, #0
	    ldmeqfd	sp!, {r4, pc}

	    bl PrintChar
	    b   %B1

; PrintHexNibble : prints the least-significant nibble in R0 as a
; hex digit
PrintHexNibble
    	adr	r2, HEX_TO_ASCII_TABLE
    	and	r0, r0, #0xF
    	ldr	r0, [r2, r0]	; convert to ascii
    	b	PrintChar

; PrintHexWord : prints the 4 bytes in R0 as 8 hex ascii characters
;   followed by a newline
PrintHexWord
    	stmfd	sp!, {r4, lr}
    	mov	r4, r0
    	mov	r0, r4, LSR #28
    	bl	PrintHexNibble
    	mov	r0, r4, LSR #24
    	bl	PrintHexNibble
    	mov	r0, r4, LSR #20
    	bl	PrintHexNibble
    	mov	r0, r4, LSR #16
    	bl	PrintHexNibble
    	mov	r0, r4, LSR #12
    	bl	PrintHexNibble
    	mov	r0, r4, LSR #8
    	bl	PrintHexNibble
    	mov	r0, r4, LSR #4
    	bl	PrintHexNibble
	    mov	r0, r4
	    bl	PrintHexNibble

	    mov	r0, #'\r'
	    bl	PrintChar

	    mov	r0, #'\n'
	    bl	PrintChar
	    ldmfd	sp!, {r4, pc}

        ALIGN   4
HEX_TO_ASCII_TABLE
	    DCB	"0123456789ABCDEF"

Say_Hello
        DCB "Welcome to uCOS-II World.\r\n",0
BootNand
        DCB "boot from NAND flash\r\n",0
BootNor
        DCB "boot from NOR flash\r\n",0
        


        ALIGN   4
SMRDATA
; Memory configuration should be optimized for best performance
; The following parameter is not optimized.
; Memory access cycle parameter strategy
; 1) The memory settings is  safe parameters even at HCLK=75Mhz.
; 2) SDRAM refresh period is for HCLK=75Mhz.

        DCD (0+(B1_BWSCON<<4)+(B2_BWSCON<<8)+(B3_BWSCON<<12)+(B4_BWSCON<<16)+(B5_BWSCON<<20)+(B6_BWSCON<<24)+(B7_BWSCON<<28))
        DCD ((B0_Tacs<<13)+(B0_Tcos<<11)+(B0_Tacc<<8)+(B0_Tcoh<<6)+(B0_Tah<<4)+(B0_Tacp<<2)+(B0_PMC))   ;GCS0
        DCD ((B1_Tacs<<13)+(B1_Tcos<<11)+(B1_Tacc<<8)+(B1_Tcoh<<6)+(B1_Tah<<4)+(B1_Tacp<<2)+(B1_PMC))   ;GCS1
        DCD ((B2_Tacs<<13)+(B2_Tcos<<11)+(B2_Tacc<<8)+(B2_Tcoh<<6)+(B2_Tah<<4)+(B2_Tacp<<2)+(B2_PMC))   ;GCS2
        DCD ((B3_Tacs<<13)+(B3_Tcos<<11)+(B3_Tacc<<8)+(B3_Tcoh<<6)+(B3_Tah<<4)+(B3_Tacp<<2)+(B3_PMC))   ;GCS3
        DCD ((B4_Tacs<<13)+(B4_Tcos<<11)+(B4_Tacc<<8)+(B4_Tcoh<<6)+(B4_Tah<<4)+(B4_Tacp<<2)+(B4_PMC))   ;GCS4
        DCD ((B5_Tacs<<13)+(B5_Tcos<<11)+(B5_Tacc<<8)+(B5_Tcoh<<6)+(B5_Tah<<4)+(B5_Tacp<<2)+(B5_PMC))   ;GCS5
        DCD ((B6_MT<<15)+(B6_Trcd<<2)+(B6_SCAN))    ;GCS6
        DCD ((B7_MT<<15)+(B7_Trcd<<2)+(B7_SCAN))    ;GCS7
        DCD (0x008e04eb) ;DCD ((REFEN<<23)+(TREFMD<<22)+(Trp<<20)+(Trc<<18)+(Tchr<<16)+REFCNT)

            DCD 0xB2            ;SCLK power saving mode, BANKSIZE 128M/128M

       DCD 0x20            ;MRSR6 CL=2clk
       DCD 0x20            ;MRSR7

; Processor clock values
        ALIGN   4
clock_locktime
	    DCD	vLOCKTIME
mpll_value
	    DCD	(M_MDIV<<12)+(M_PDIV<<4)+(M_SDIV)

clkdivn_value
	    DCD	vCLKDIVN

; initial values for serial
;uart_ulcon
;	    DCD	vULCON
;uart_ucon
;	    DCD	vUCON
;uart_ufcon
;	    DCD	vUFCON
;uart_umcon
;	    DCD	vUMCON
SerBase
	    DCD UART0_CTL_BASE
; inital values for GPIO
gpio_con_uart
	    DCD	vGPHCON
gpio_up_uart
	    DCD	vGPHUP

        AREA RamData, DATA, READWRITE

        ^   _INT_VIC_STARTADDRESS
HandleReset 	#   4
HandleUndef 	#   4
HandleSWI   	#   4
HandlePabort    #   4
HandleDabort    #   4
HandleReserved  #   4
HandleIRQ   	#   4
HandleFIQ   	#   4

;Don't use the label 'IntVectorTable',
;The value of IntVectorTable is different with the address you think it may be.
;IntVectorTable
HandleEINT0     #   4
HandleEINT1     #   4
HandleEINT2     #   4
HandleEINT3     #   4
HandleEINT4_7   #   4
HandleEINT8_23  #   4
HandleRSV6      #   4
HandleBATFLT    #   4
HandleTICK      #   4
HandleWDT       #   4
HandleTIMER0    #   4
HandleTIMER1    #   4
HandleTIMER2    #   4
HandleTIMER3    #   4
HandleTIMER4    #   4
HandleUART2     #   4
HandleLCD       #   4
HandleDMA0      #   4
HandleDMA1      #   4
HandleDMA2      #   4
HandleDMA3      #   4
HandleMMC       #   4
HandleSPI0      #   4
HandleUART1     #   4
HandleRSV24     #   4
HandleUSBD      #   4
HandleUSBH      #   4
HandleIIC       #   4
HandleUART0     #   4
HandleSPI1      #   4
HandleRTC       #   4
HandleADC       #   4

        END

⌨️ 快捷键说明

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