天嵌 ARM开发社区

 找回密码
 注册
查看: 5110|回复: 15

GPIO初始化状态配置

[复制链接]
荆棘鸟 发表于 2012-11-27 11:08:18 | 显示全部楼层 |阅读模式
TQ2440运行Wince6.0过程中,LED灯会呈现3中状态。第一时间段,Led2~4亮,Led1闪1下让后熄掉,第二时间段,Led全熄掉,第三时间段Led3~4亮。请问通过如何配置,启动过程中Led的状态啊?
embedsky_lhh 发表于 2012-11-27 11:52:49 | 显示全部楼层
你在不同的驱动中加就行了,还有把系统时间片的那个灯给关掉
亚瑟王 发表于 2012-11-27 11:53:27 | 显示全部楼层
亲,根据你实际的需要分别修改stepldr的startup.S、eboot的startup.S和NK的startup.S
 楼主| 荆棘鸟 发表于 2012-11-27 11:57:46 | 显示全部楼层
我是希望配置led在开机过程中的状态
 楼主| 荆棘鸟 发表于 2012-11-27 11:58:43 | 显示全部楼层
主要是希望整个wince6.0启动过程中,led灯都不亮
 楼主| 荆棘鸟 发表于 2012-11-27 12:07:13 | 显示全部楼层
通过VS2005吗 怎么修改 能具体一点吗
embedsky_lhh 发表于 2012-11-27 14:08:59 | 显示全部楼层
荆棘鸟 发表于 2012-11-27 12:07
通过VS2005吗 怎么修改 能具体一点吗

整个过程都不亮你需要重新编译NK,EBoot,Stepldr等,首先先看手册将平台开发环境搭建,然后看手册的编译那部分,把他们编译出来,然后修改源码,再编译,
 楼主| 荆棘鸟 发表于 2012-11-27 14:22:44 | 显示全部楼层
EBoot,Stepldr找到了  但是NK  没找到
亚瑟王 发表于 2012-11-27 14:36:58 | 显示全部楼层
荆棘鸟 发表于 2012-11-27 14:22
EBoot,Stepldr找到了  但是NK  没找到

整个BSP包编译出来就是NK。
在BSP包的Src\OAL\OALLIB目录下的startup.s就是NK的开始运行的代码。
 楼主| 荆棘鸟 发表于 2012-11-28 07:17:19 | 显示全部楼层
重新搭建也是一样的,这3个项是BSP里面的内容,
 楼主| 荆棘鸟 发表于 2012-11-28 07:37:37 | 显示全部楼层
打开Startup.s里面的格式也看的不是很懂。我想应该要修改的应该是GPB5~8相应的参数吧,一看 里面很迷糊
 楼主| 荆棘鸟 发表于 2012-11-28 07:40:14 | 显示全部楼层
Eboot->startup里面的内容:
;
; Copyright (c) Microsoft Corporation.  All rights reserved.
;
;
; Use of this source code is subject to the terms of the Microsoft 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 LICENSE.RTF on your
; install media.
;


                INCLUDE kxarm.h
                INCLUDE armmacros.s
                INCLUDE eboot_s3c2440a.inc

;-------------------------------------------------------------------------------

MemoryMap       EQU     0x2a4
BANK_SIZE       EQU     0x00100000      ; 1MB per bank in MemoryMap array
BANK_SHIFT      EQU     20


;   Define RAM space for the Page Tables:
;
PHYBASE                        EQU     0x30000000      ; physical start
PTs                        EQU     0x30010000      ; 1st level page table address (PHYBASE + 0x10000)
                                                ; save room for interrupt vectors.

;Start address of each stacks,
_STACK_BASEADDRESS        EQU        0x33ff8000  
_MMUTT_STARTADDRESS        EQU        0x33ff8000  
_ISR_STARTADDRESS        EQU        0x33ffff00
; Pre-defined constants.
;
USERMODE                EQU         0x10
FIQMODE                        EQU         0x11
IRQMODE                        EQU         0x12
SVCMODE                        EQU         0x13
ABORTMODE                EQU         0x17
UNDEFMODE                EQU         0x1b
MODEMASK                EQU         0x1f
NOINT                        EQU         0xc0

; Stack locations.
;
SVCStack                EQU        (_STACK_BASEADDRESS-0x2800)        ; 0x33ff5800 ~
UserStack                EQU        (_STACK_BASEADDRESS-0x3800)        ; 0x33ff4800 ~
UndefStack                EQU        (_STACK_BASEADDRESS-0x2400)        ; 0x33ff5c00 ~
AbortStack                EQU        (_STACK_BASEADDRESS-0x2000)        ; 0x33ff6000 ~
IRQStack                EQU        (_STACK_BASEADDRESS-0x1000)        ; 0x33ff7000 ~
FIQStack                EQU        (_STACK_BASEADDRESS-0x0)        ; 0x33ff8000 ~
;virtual address
VirtualSVCStack                EQU        (0x83ff5800)                        ; 0x83ff5800 ~
VirtualUserStack        EQU        (0x83ff4800)                        ; 0x83ff4800 ~
virtualUndefStack        EQU        (0x83ff5c00)                        ; 0x83ff5c00 ~
VirtualAbortStack        EQU        (0x83ff6000)                        ; 0x83ff6000 ~
VirtualIRQStack                EQU        (0x83ff7000)                        ; 0x83ff7000 ~
VirtualFIQStack                EQU        (0x83ff8000)                        ; 0x83ff8000 ~
;-------------------------------------------------------------------------------

        TEXTAREA

        IMPORT  main

; Set up the MMU and Dcache for bootloader.
;
; This routine will initialize the first-level page table based up the contents
; of the MemoryMap array and enable the MMU and caches.
;
; Copy the image to RAM if it's not already running there.
;
; Include Files



; Defines

;------------------------------------------------------------------------------
; BUGBUG - ?

PLLVAL      EQU     (((0x5C << 12) + (0x1 << 4) + 0x1))                ; 2440A  400MHz, input 12MHz

;------------------------------------------------------------------------------
; Cache Configuration

DCACHE_LINES_PER_SET_BITS        EQU     (6)
DCACHE_LINES_PER_SET                EQU     (64)
DCACHE_NUM_SETS                        EQU     (8)
DCACHE_SET_INDEX_BIT                EQU     (32 - DCACHE_LINES_PER_SET_BITS)
DCACHE_LINE_SIZE                EQU     (32)



; External Variables

; External Functions

; Global Variables

; Local Variables

; Local Functions

;-------------------------------------------------------------------------------
;   Function: Startup
;
;   Main entry point for CPU initialization.
;

        STARTUPTEXT
        LEAF_ENTRY      StartUp

        ; Jump over power-off code.
        b       ResetHandler

ResetHandler

        ; Make sure that TLB & cache are consistent
        mov     r0, #0
        mcr     p15, 0, r0, c8, c7, 0                ; flush both TLB
        mcr     p15, 0, r0, c7, c5, 0                ; invalidate instruction cache
        mcr     p15, 0, r0, c7, c6, 0                ; invalidate data cache
       
        ldr     r0, = GPBCON
        ldr     r1, = 0x055555      
        str     r1, [r0]

        ldr     r0, = WTCON                        ; disable watch dog
        ldr     r1, = 0x0         
        str     r1, [r0]

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

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

        ldr     r0, = INTMOD
        mov     r1, #0x0                        ; set all interrupt as IRQ
        str     r1, [r0]

        ldr     r0, = CLKDIVN
        ldr     r1, = 0x7                        ; 0x0 = 1:1:1,  0x1 = 1:1:2, 0x2 = 1:2:2,  0x3 = 1:2:4,
;        ldr     r1, = 0x5                        ; 0x0 = 1:1:1,  0x1 = 1:1:2, 0x2 = 1:2:2,  0x3 = 1:2:4,
                                                ; 0x7 = 1:3:6,  0x8 = 1:4:4
        str     r1, [r0]

;        ands    r1, r1, #0xe                        ; set AsyncBusMode
        ; MMU_SetAsyncBusMode FCLK:HCLK= 1:2
;        ands        r1, r1, #0x2
;        beq     %F10

        mrc     p15, 0, r0, c1, c0, 0
        orr     r0, r0, #R1_nF:OR:R1_iA
        mcr     p15, 0, r0, c1, c0, 0
;10

        ldr     r0, = LOCKTIME                        ; To reduce PLL lock time, adjust the LOCKTIME register.
        ldr     r1, = 0xffffff
        str     r1, [r0]
   
        ldr        r0, = CAMDIVN
        ldr        r1, = 0
        str        r1, [r0]

        ldr     r0, = MPLLCON                        ; Configure MPLL
                                                ; Fin=12MHz, Fout=400MHz
        ldr     r1, = PLLVAL
        str     r1, [r0]

        ldr     r0, = UPLLCON                                        ; Fin=12MHz, Fout=48MHz
;        ldr     r1, = ((0x3c << 12) + (0x4 << 4) + 0x2)                ; 16Mhz
        ldr     r1, = ((0x38 << 12) + (0x2 << 4) + 0x2)          ; 12Mhz
        str     r1, [r0]

        mov     r0, #0x2000
20   
        subs    r0, r0, #1
        bne     %B20

;------------------------------------------------------------------------------
;   Add for Power Management

        ldr     r1, =GSTATUS2                        ; Determine Booting Mode
        ldr     r10, [r1]

;------------------------------------------------------------------------------
;   Add for Power Management

        tst     r10, #0x2
        beq     BringUpWinCE                        ; Normal Mode Booting

;------------------------------------------------------------------------------
;   Add for Power Management ?

BringUpWinCE

;------------------------------------------------------------------------------
;   Initialize memory controller


        add     r0, pc, #MEMCTRLTAB - (. + 8)
        ldr     r1, = BWSCON                        ; BWSCON Address
        add     r2, r0, #52                        ; End address of MEMCTRLTAB
40      ldr     r3, [r0], #4   
        str     r3, [r1], #4   
        cmp     r2, r0      
        bne     %B40
   
        ldr     r0, = GPFDAT
        mov     r1, #0x60
        str     r1, [r0]

;------------------------------------------------------------------------------
;   Copy boot loader to memory

        ands    r9, pc, #0xFF000000                ; see if we are in flash or in ram
        bne     %f20                                ; go ahead if we are already in ram

        ; This is the loop that perform copying.
        ldr     r0, = 0x38000                        ; offset into the RAM
        add     r0, r0, #PHYBASE                ; add physical base
        mov     r1, r0                                ; (r1) copy destination
        ldr     r2, =0x0                        ; (r2) flash started at physical address 0
        ldr     r3, =0x10000                        ; counter (0x40000/4)
10      ldr     r4, [r2], #4
        str     r4, [r1], #4
        subs    r3, r3, #1
        bne     %b10

        ; Restart from the RAM position after copying.
        mov pc, r0
        nop
        nop
        nop

        ; Shouldn't get here.
        b       .

        INCLUDE oemaddrtab_cfg.inc


        ; Compute physical address of the OEMAddressTable.
20      add     r11, pc, #g_oalAddressTable - (. + 8)
        ldr     r10, =PTs                        ; (r10) = 1st level page table


        ; Setup 1st level page table (using section descriptor)     
        ; Fill in first level page table entries to create "un-mapped" regions
        ; from the contents of the MemoryMap array.
        ;
        ;   (r10) = 1st level page table
        ;   (r11) = ptr to MemoryMap array

        add     r10, r10, #0x2000                ; (r10) = ptr to 1st PTE for "unmapped space"
        mov     r0, #0x0E                        ; (r0) = PTE for 0: 1MB cachable bufferable
        orr     r0, r0, #0x400                        ; set kernel r/w permission
 楼主| 荆棘鸟 发表于 2012-11-28 07:40:46 | 显示全部楼层
25      mov     r1, r11                                ; (r1) = ptr to MemoryMap array

       
30      ldr     r2, [r1], #4                        ; (r2) = virtual address to map Bank at
        ldr     r3, [r1], #4                        ; (r3) = physical address to map from
        ldr     r4, [r1], #4                        ; (r4) = num MB to map

        cmp     r4, #0                                ; End of table?
        beq     %f40

        ldr     r5, =0x1FF00000
        and     r2, r2, r5                        ; VA needs 512MB, 1MB aligned.               

        ldr     r5, =0xFFF00000
        and     r3, r3, r5                        ; PA needs 4GB, 1MB aligned.

        add     r2, r10, r2, LSR #18
        add     r0, r0, r3                        ; (r0) = PTE for next physical page

35      str     r0, [r2], #4
        add     r0, r0, #0x00100000                ; (r0) = PTE for next physical page
        sub     r4, r4, #1                        ; Decrement number of MB left
        cmp     r4, #0
        bne     %b35                                ; Map next MB

        bic     r0, r0, #0xF0000000                ; Clear Section Base Address Field
        bic     r0, r0, #0x0FF00000                ; Clear Section Base Address Field
        b       %b30                                ; Get next element
       
40      tst     r0, #8
        bic     r0, r0, #0x0C                        ; clear cachable & bufferable bits in PTE
        add     r10, r10, #0x0800                ; (r10) = ptr to 1st PTE for "unmapped uncached space"
        bne     %b25                                ; go setup PTEs for uncached space
        sub     r10, r10, #0x3000                ; (r10) = restore address of 1st level page table

        ; Setup mmu to map (VA == 0) to (PA == 0x30000000).
        ldr     r0, =PTs                        ; PTE entry for VA = 0
        ldr     r1, =0x3000040E                        ; uncache/unbuffer/rw, PA base == 0x30000000
        str     r1, [r0]

        ; uncached area.
        add     r0, r0, #0x0800                        ; PTE entry for VA = 0x0200.0000 , uncached     
        ldr     r1, =0x30000402                        ; uncache/unbuffer/rw, base == 0x30000000
        str     r1, [r0]
       
        ; Comment:
        ; The following loop is to direct map RAM VA == PA. i.e.
        ;   VA == 0x30XXXXXX => PA == 0x30XXXXXX for S3C2400
        ; Fill in 8 entries to have a direct mapping for DRAM
        ;
        ldr     r10, =PTs                        ; restore address of 1st level page table
        ldr     r0,  =PHYBASE

        add     r10, r10, #(0x3000 / 4)                ; (r10) = ptr to 1st PTE for 0x30000000

        add     r0, r0, #0x1E                        ; 1MB cachable bufferable
        orr     r0, r0, #0x400                        ; set kernel r/w permission
        mov     r1, #0
        mov     r3, #64

45      mov     r2, r1                                ; (r2) = virtual address to map Bank at
        cmp     r2, #0x20000000:SHR:BANK_SHIFT
        add     r2, r10, r2, LSL #BANK_SHIFT-18
        strlo   r0, [r2]
        add     r0, r0, #0x00100000                ; (r0) = PTE for next physical page
        subs    r3, r3, #1
        add     r1, r1, #1
        bgt     %b45

        ldr     r10, =PTs                        ; (r10) = restore address of 1st level page table

        ; The page tables and exception vectors are setup.
        ; Initialize the MMU and turn it on.
        mov     r1, #1
        mcr     p15, 0, r1, c3, c0, 0                ; setup access to domain 0
        mcr     p15, 0, r10, c2, c0, 0

        mcr     p15, 0, r0, c8, c7, 0                ; flush I+D TLBs
        mov     r1, #0x0071                        ; Enable: MMU
        and        r1, r1, #0xC0000000                ; [31:30] AsyncBusMode Enable, [12] ICache Disable(UMON set enable)
        orr        r1, r1, #0x0079                        ; [0] Enable MMU, [6:3] Reserved 1111
        orr     r1, r1, #0x4000                        ; Round-Robind Cache Replacement Policy
        orr        r1, r1, #0x1000                        ; Enable ICache (with MMU On)

;        orr     r1, r1, #0x0004                        ; Enable the cache
        mcr     p15, 0, r1, c1, c0, 0
        ; Make AsyncBusMode
        mrc        p15, 0, r0, c1, c0, 0
        orr        r0, r0, #R1_nF:OR:R1_iA
        mcr        p15, 0, r0, c1, c0, 0


        ldr     r0, =VirtualStart

        cmp     r0, #0                                ; make sure no stall on "mov pc,r0" below
        mov     pc, r0                                ;  & jump to new virtual address
        nop

        ; MMU & caches now enabled.
        ;   (r10) = physcial address of 1st level page table
        ;

VirtualStart

        mov     sp, #0x80000000
        add     sp, sp, #0x30000                ; arbitrary initial super-page stack pointer

        mrs     r0,cpsr
        bic     r0,r0,#MODEMASK

        orr     r1,r0,#UNDEFMODE|NOINT
        msr     cpsr_cxsf,r1                ; UndefMode
        ldr     sp,=virtualUndefStack

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

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

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

        mrs        r0, cpsr
        bic        r0, r0, #MODEMASK|NOINT
        orr        r1, r0, #SVCMODE
        msr        cpsr_cxsf, r1                        ; SVCMode.
        ldr     sp, =VirtualSVCStack
        b        main

        ENTRY_END

        LTORG

;------------------------------------------------------------------------------
; Memory Controller Configuration
;
;   The below defines are used in the MEMCTRLTAB table
;   defined below to iniatialize the memory controller's
;   register bank.
;
; SDRAM refresh control register configuration

REFEN                EQU     (0x1)                ; Refresh enable
TREFMD                EQU     (0x0)                ; CBR(CAS before RAS)/Auto refresh
Trp                EQU     (0x1)                ; 3clk
Trc                EQU     (0x3)                ; 7clk
Tchr                EQU     (0x2)                ; 3clk
REFCNT                EQU     (0x4f4)                ; period=7.8125us, HCLK=100Mhz, (2048+1-7.8125*100)

; Bank Control
;
; Bus width and wait status control

B1_BWSCON   EQU     (DW32)
B2_BWSCON   EQU     (DW16)
B3_BWSCON   EQU     (DW16 + WAIT + UBLB)
B4_BWSCON   EQU     (DW16)
B5_BWSCON   EQU     (DW16)
B6_BWSCON   EQU     (DW32)
B7_BWSCON   EQU     (DW32)

; Bank 0

B0_Tacs     EQU     (0x0)    ; 0clk
B0_Tcos     EQU     (0x0)    ; 0clk
B0_Tacc     EQU     (0x7)    ; 14clk
B0_Tcoh     EQU     (0x0)    ; 0clk
B0_Tah      EQU     (0x0)    ; 0clk
B0_Tacp     EQU     (0x0)   
B0_PMC      EQU     (0x0)    ; normal

; Bank 1

B1_Tacs     EQU     (0x0)    ; 0clk
B1_Tcos     EQU     (0x0)    ; 0clk
B1_Tacc     EQU     (0x7)    ; 14clk
B1_Tcoh     EQU     (0x0)    ; 0clk
B1_Tah      EQU     (0x0)    ; 0clk
B1_Tacp     EQU     (0x0)   
B1_PMC      EQU     (0x0)    ; normal

; Bank 2

B2_Tacs     EQU     (0x0)    ; 0clk
B2_Tcos     EQU     (0x0)    ; 0clk
B2_Tacc     EQU     (0x7)    ; 14clk
B2_Tcoh     EQU     (0x0)    ; 0clk
B2_Tah      EQU     (0x0)    ; 0clk
B2_Tacp     EQU     (0x0)     
B2_PMC      EQU     (0x0)    ; normal

; Bank 3

B3_Tacs     EQU     (0x0)    ; 0clk
B3_Tcos     EQU     (0x0)    ; 0clk
B3_Tacc     EQU     (0x7)    ; 14clk
B3_Tcoh     EQU     (0x0)    ; 0clk
B3_Tah      EQU     (0x0)    ; 0clk
B3_Tacp     EQU     (0x0)   
B3_PMC      EQU     (0x0)    ; normal

; Bank 4

B4_Tacs     EQU     (0x0)    ; 0clk
B4_Tcos     EQU     (0x0)    ; 0clk
B4_Tacc     EQU     (0x7)    ; 14clk
B4_Tcoh     EQU     (0x0)    ; 0clk
B4_Tah      EQU     (0x0)    ; 0clk
B4_Tacp     EQU     (0x0)   
B4_PMC      EQU     (0x0)    ; normal

; Bank 5

B5_Tacs     EQU     (0x0)    ; 0clk
B5_Tcos     EQU     (0x0)    ; 0clk
B5_Tacc     EQU     (0x7)    ; 14clk
B5_Tcoh     EQU     (0x0)    ; 0clk
B5_Tah      EQU     (0x0)    ; 0clk
B5_Tacp     EQU     (0x0)   
B5_PMC      EQU     (0x0)    ; normal

; Bank 6

B6_MT       EQU     (0x3)    ; SDRAM
B6_Trcd     EQU     (0x1)    ; 3clk
B6_SCAN     EQU     (0x1)    ; 9bit

; Bank 7
;
; Note - there is no memory connected to Bank 7

B7_MT       EQU     (0x3)    ; SDRAM
B7_Trcd     EQU     (0x1)    ; 3clk
B7_SCAN     EQU     (0x1)    ; 9bit


;------------------------------------------------------------------------------
;   Memory Controller Configuration Data Table
;
;   This data block is loaded into the memory controller's
;   registers to configure the platform memory.
;

MEMCTRLTAB DATA
        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))        ; BANKCON0
        DCD ((B1_Tacs<<13)+(B1_Tcos<<11)+(B1_Tacc<<8)+(B1_Tcoh<<6)+(B1_Tah<<4)+(B1_Tacp<<2)+(B1_PMC))        ; BANKCON1
        DCD ((B2_Tacs<<13)+(B2_Tcos<<11)+(B2_Tacc<<8)+(B2_Tcoh<<6)+(B2_Tah<<4)+(B2_Tacp<<2)+(B2_PMC))        ; BANKCON2
        DCD ((B3_Tacs<<13)+(B3_Tcos<<11)+(B3_Tacc<<8)+(B3_Tcoh<<6)+(B3_Tah<<4)+(B3_Tacp<<2)+(B3_PMC))        ; BANKCON3
        DCD ((B4_Tacs<<13)+(B4_Tcos<<11)+(B4_Tacc<<8)+(B4_Tcoh<<6)+(B4_Tah<<4)+(B4_Tacp<<2)+(B4_PMC))        ; BANKCON4
        DCD ((B5_Tacs<<13)+(B5_Tcos<<11)+(B5_Tacc<<8)+(B5_Tcoh<<6)+(B5_Tah<<4)+(B5_Tacp<<2)+(B5_PMC))        ; BANKCON5
        DCD ((B6_MT<<15)+(B6_Trcd<<2)+(B6_SCAN))                                                        ; BANKCON6
        DCD ((B7_MT<<15)+(B7_Trcd<<2)+(B7_SCAN))                                                        ; BANKCON7
        DCD ((REFEN<<23)+(TREFMD<<22)+(Trp<<20)+(Trc<<18)+(Tchr<<16)+REFCNT)                                ; REFRESH 100MHz
        DCD 0x32                                                                                        ; BANKSIZE
        DCD 0x30                                                                                        ; MRSRB6
        DCD 0x30                                                                                        ; MRSRB7

        END

;-------------------------------------------------------------------------------
 楼主| 荆棘鸟 发表于 2012-11-28 07:42:34 | 显示全部楼层
Stepldr->Startup.s里面的内容:

   
    OPT 2

    INCLUDE kxarm.h
    INCLUDE option.inc
    INCLUDE s2440addr.inc
    INCLUDE memcfg.inc

    OPT 1
    OPT 128
   
; Pre-defined constants.
;
USERMODE    EQU         0x10
FIQMODE     EQU         0x11
IRQMODE     EQU         0x12
SVCMODE     EQU         0x13
ABORTMODE   EQU         0x17
UNDEFMODE   EQU         0x1b
MODEMASK    EQU         0x1f
NOINT       EQU         0xc0

; Stack locations.
;
SVCStack        EQU        (_STACK_BASEADDRESS-0x2800)        ; 0x33ff5800 ~
UserStack        EQU        (_STACK_BASEADDRESS-0x3800)        ; 0x33ff4800 ~
UndefStack        EQU        (_STACK_BASEADDRESS-0x2400)        ; 0x33ff5c00 ~
AbortStack        EQU        (_STACK_BASEADDRESS-0x2000)        ; 0x33ff6000 ~
IRQStack        EQU        (_STACK_BASEADDRESS-0x1000)        ; 0x33ff7000 ~
FIQStack        EQU        (_STACK_BASEADDRESS-0x0)        ; 0x33ff8000 ~

;------------------------------------------------------------------------------
; Sleep state constants
;
; Location of sleep data

; BUGBUG - this needs to be declared as a local var.

SLEEPDATA_BASE_PHYSICAL         EQU     0x30028000
WORD_SIZE                                                EQU                0x4
; Sleep State memory locations

SleepState_Data_Start           EQU     (0)
SleepState_WakeAddr             EQU     (SleepState_Data_Start  + 0)
SleepState_MMUCTL               EQU     (SleepState_WakeAddr    + WORD_SIZE)
SleepState_MMUTTB               EQU     (SleepState_MMUCTL      + WORD_SIZE)
SleepState_MMUDOMAIN            EQU     (SleepState_MMUTTB      + WORD_SIZE)
SleepState_SVC_SP               EQU     (SleepState_MMUDOMAIN   + WORD_SIZE)
SleepState_SVC_SPSR             EQU     (SleepState_SVC_SP      + WORD_SIZE)
SleepState_FIQ_SPSR             EQU     (SleepState_SVC_SPSR    + WORD_SIZE)
SleepState_FIQ_R8               EQU     (SleepState_FIQ_SPSR    + WORD_SIZE)
SleepState_FIQ_R9               EQU     (SleepState_FIQ_R8      + WORD_SIZE)
SleepState_FIQ_R10              EQU     (SleepState_FIQ_R9      + WORD_SIZE)
SleepState_FIQ_R11              EQU     (SleepState_FIQ_R10     + WORD_SIZE)
SleepState_FIQ_R12              EQU     (SleepState_FIQ_R11     + WORD_SIZE)
SleepState_FIQ_SP               EQU     (SleepState_FIQ_R12     + WORD_SIZE)
SleepState_FIQ_LR               EQU     (SleepState_FIQ_SP      + WORD_SIZE)
SleepState_ABT_SPSR             EQU     (SleepState_FIQ_LR      + WORD_SIZE)
SleepState_ABT_SP               EQU     (SleepState_ABT_SPSR    + WORD_SIZE)
SleepState_ABT_LR               EQU     (SleepState_ABT_SP      + WORD_SIZE)
SleepState_IRQ_SPSR             EQU     (SleepState_ABT_LR      + WORD_SIZE)
SleepState_IRQ_SP               EQU     (SleepState_IRQ_SPSR    + WORD_SIZE)
SleepState_IRQ_LR               EQU     (SleepState_IRQ_SP      + WORD_SIZE)
SleepState_UND_SPSR             EQU     (SleepState_IRQ_LR      + WORD_SIZE)
SleepState_UND_SP               EQU     (SleepState_UND_SPSR    + WORD_SIZE)
SleepState_UND_LR               EQU     (SleepState_UND_SP      + WORD_SIZE)
SleepState_SYS_SP               EQU     (SleepState_UND_LR      + WORD_SIZE)
SleepState_SYS_LR               EQU     (SleepState_SYS_SP      + WORD_SIZE)
SleepState_Data_End             EQU     (SleepState_SYS_LR      + WORD_SIZE)

SLEEPDATA_SIZE                  EQU     (SleepState_Data_End - SleepState_Data_Start) / 4


        IMPORT main    ; C entrypoint for Steppingstone loader.

        EXPORT MMU_EnableICache
        EXPORT MMU_SetAsyncBusMode
  
    STARTUPTEXT
    LEAF_ENTRY StartUp
   
    b        ResetHandler  
    b        .
    b        .
    b        .               
    b        .               
    b        .               
    b        .                       
    b        .
                   
PowerOffCPU
        str                r1, [r0]                ; Enable SDRAM self-refresh
        str                r3, [r2]                ; MISCCR Setting
        str                r5, [r4]                ; Power Off !!
        b                 .

    ; Resume handler code.
    ;
WAKEUP_POWER_OFF
    ; Release SCLKn after wake-up from the POWER_OFF mode.
    ldr                r1, =MISCCR
    ldr                r0, [r1]
    bic                r0, r0, #(7<<17) ; SCLK0:0->SCLK, SCLK1:0->SCLK, SCKE:L->H.
    str                r0, [r1]

    ; Set up the memory control registers.
    ;
    add                r0, pc, #SMRDATA - (. + 8)
    ldr                r1, =BWSCON             ; BWSCON Address.
    add                r2, r0, #52             ; End address of SMRDATA.
3      
    ldr                r3, [r0], #4   
    str                r3, [r1], #4   
    cmp                r2, r0               
    bne                %B3

        mov     r0, #0x2000
4
        subs    r0, r0, #1
        bne     %B4

;------------------------------------------------------------------------------
;   Recover Process : Starting Point
;
;   1. Checksum Calculation saved Data
        ldr     r5, =SLEEPDATA_BASE_PHYSICAL    ; pointer to physical address of reserved Sleep mode info data structure
        mov     r3, r5                          ; pointer for checksum calculation
        ldr     r2, =0x0
        ldr     r0, =(SLEEPDATA_SIZE-1)             ; get size of data structure to do checksum on
50       
        ldr     r1, [r3], #4                    ; pointer to SLEEPDATA
        and     r1, r1, #0x1
        mov     r1, r1, ROR #31
        add     r2, r2, r1
        subs    r0, r0, #1                      ; dec the count
        bne     %b50                            ; loop till done   

        ldr     r0,=GSTATUS3
        ldr     r3, [r0]                        ; get the Sleep data checksum from the Power Manager Scratch pad register
        cmp     r2, r3                          ; compare to what we saved before going to sleep
        bne     BringUpWinCE                    ; bad news - do a cold boot
   
;   2. MMU Enable
        ldr     r10, [r5, #SleepState_MMUDOMAIN] ; load the MMU domain access info
        ldr     r9,  [r5, #SleepState_MMUTTB]    ; load the MMU TTB info
        ldr     r8,  [r5, #SleepState_MMUCTL]    ; load the MMU control info
        ldr     r7,  [r5, #SleepState_WakeAddr ] ; load the LR address
        nop         
        nop
        nop
        nop
        nop

; if software reset
        mov     r1, #0
        teq     r1, r7
        bne     %f60
        b              BringUpWinCE

; wakeup routine
60        mcr     p15, 0, r10, c3, c0, 0          ; setup access to domain 0
        mcr     p15, 0, r9,  c2, c0, 0          ; PT address
        mcr     p15, 0, r0,  c8, c7, 0          ; flush I+D TLBs
        mcr     p15, 0, r8,  c1, c0, 0          ; restore MMU control

;   3. Jump to Kernel Image's fw.s (Awake_address)
        mov     pc, r7                          ;  jump to new VA (back up Power management stack)
        nop

BringUpWinCE
        ; bad news, data lose, bring up wince again
        mov         r0, #2
        ldr                r1, =GSTATUS2
        str                r0, [r1]
       
  LTORG   
       
;-----------------------------------
; Steppingstone loader entry point.
;-----------------------------------
ResetHandler
    ldr                r0, =WTCON       ; disable the watchdog timer.
    ldr                r1, =0x0         
    str                r1, [r0]

    ldr                r0, =INTMSK      ; mask all first-level interrupts.
    ldr                r1, =0xffffffff
    str                r1, [r0]

    ldr                r0, =INTSUBMSK   ; mask all second-level interrupts.
    ldr                r1, =0x7fff
    str                r1, [r0]

    ; CLKDIVN
    ldr         r0,=CLKDIVN
    ldr         r1,=0x7     ; 0x0 = 1:1:1  ,  0x1 = 1:1:2        , 0x2 = 1:2:2  ,  0x3 = 1:2:4,  0x4 = 1:4:4,  0x5 = 1:4:8, 0x6 = 1:3:3, 0x7 = 1:3:6
;    ldr         r1,=0x5     ; 0x0 = 1:1:1  ,  0x1 = 1:1:2        , 0x2 = 1:2:2  ,  0x3 = 1:2:4,  0x4 = 1:4:4,  0x5 = 1:4:8, 0x6 = 1:3:3, 0x7 = 1:3:6
    str         r1,[r0]

        ; BATT_FLT
    ldr                r1, =MISCCR
    ldr                r0, [r1]
    bic                r0, r0, #(7<<20)
    orr                r0, r0, #(4<<20)
    str                r0, [r1]

    ; MMU_SetAsyncBusMode FCLK:HCLK= 1:2
;    ands         r1, r1, #0x2
;    beq         %F5
;    bl                MMU_SetAsyncBusMode
;5
   ; Make AsyncBusMode
        mrc                p15, 0, r0, c1, c0, 0
        orr                r0, r0, #R1_nF:OR:R1_iA
        mcr                p15, 0, r0, c1, c0, 0


; TODO: to reduce PLL lock time, adjust the LOCKTIME register.
    ldr                r0, =LOCKTIME
    ldr                r1, =0xffffff
    str                r1, [r0]
  
    ; Configure the clock PLL.
    ;      
          [ PLL_ON_START
       
        ldr                r0, =UPLLCON         
    ldr                r1, =((U_MDIV<<12)+(U_PDIV<<4)+U_SDIV)  ; Fin=12MHz, Fout=48MHz.
    str                r1, [r0]

        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop

    ldr                r0, =MPLLCON         
    ldr                r1, =((M_MDIV<<12)+(M_PDIV<<4)+M_SDIV)  ; Fin=12MHz, Fout=400MHz.
    str                r1, [r0]

    mov     r0, #0x2000
10   
    subs    r0, r0, #1
    bne     %B10
        ]

    ; Are we waking up from a suspended state?
    ;
    ldr                r1, =GSTATUS2
    ldr                r0, [r1]
    tst                r0, #0x2
    ; Yes?  Then go to the resume handler code...
    bne                WAKEUP_POWER_OFF

    ; Set up the memory control registers.
    ;
    add     r0, pc, #SMRDATA - (. + 8)
    ldr                r1, =BWSCON             ; BWSCON Address.
    add                r2, r0, #52             ; End address of SMRDATA.
15      
    ldr                r3, [r0], #4   
    str                r3, [r1], #4   
    cmp                r2, r0               
    bne                %B15
        
    ; Turn on all LEDs.
    ;
    ldr                r0, =GPBCON
    ldr                r1, =0x015400
    str                r1, [r0]
    ldr                r0, =GPBUP
    ldr                r1, =0x7ff
    str                r1, [r0]
    ldr                r0, =GPBDAT
    ldr                r1, =0x0
    str                r1, [r0]
  
    ; If this is a cold boot or a warm reset, clear RAM because the RAM filesystem may be
    ; bad.  If this is a software reboot (triggered by the watchdog timer), don't clear RAM.
    ;
    ldr                r1, =GSTATUS2   ; Determine why we're in the startup code.
    ldr                r10, [r1]       ;
    str          r10, [r1]       ; Clear GPSTATUS2.
    tst                r10, #0x4       ; Watchdog (software) reboot?  Skip code that clears RAM.
    bne                %F40
 楼主| 荆棘鸟 发表于 2012-11-28 07:43:05 | 显示全部楼层
   
    ; Clear RAM.
    ;
;    mov         r1,#0
;    mov         r2,#0
;    mov         r3,#0
;    mov         r4,#0
;    mov         r5,#0
;    mov         r6,#0
;    mov         r7,#0
;    mov         r8,#0
       
;    ldr                r0,=0x30000000   ; Start address (physical 0x3000.0000).
;    ldr                r9,=0x04000000   ; 64MB of RAM.
;20
;    stmia        r0!, {r1-r8}
;    subs        r9, r9, #32
;    bne                %B20

        ; The page tables and exception vectors are setup.
        ; Initialize the MMU and turn it on.
        mov     r1, #1
        mcr     p15, 0, r1, c3, c0, 0   ; setup access to domain 0
        mcr     p15, 0, r10, c2, c0, 0

        mcr     p15, 0, r0, c8, c7, 0   ; flush I+D TLBs
;        mov     r1, #0x0071             ; Enable: MMU
        mrc        p15, 0, r1, c1, c0, 0
        and        r1, r1, #0xC0000000        ; [31:30] AsyncBusMode Enable, [12] ICache Disable(UMON set enable)
        orr        r1, r1, #0x0079                ; [0] Enable MMU, [6:3] Reserved 1111
        orr        r1, r1, #0x4000                ; Round-Robind Cache Replacement Policy
        orr        r1, r1, #0x1000                ; Enable ICache (with MMU On)
        orr     r1, r1, #0x0004         ; Enable the cache

    ; Initialize stacks.
    ;
30
    mrs                r0, cpsr
    bic                r0, r0, #MODEMASK|NOINT
    orr                r1, r0, #SVCMODE
    msr                cpsr_cxsf, r1                  ; SVCMode.
    ldr                sp, =SVCStack
       
    ; Jump to main C routine.
    ;
    bl                main

40
    ldr                r4, =0x200000
    add                r4, r4, #0x30000000
    mov                pc, r4
    b .


;    b led_loop

led_loop

        ldr         r0, =GPBCON
        ldr        r1, =0x15400
        str         r1, [r0]

        ldr         r0, =GPBDAT
        ldr        r1, =0x1E0
        str         r1, [r0]
       
        ldr        r0, =0x100000
100        subs         r0, r0, #1
        bne        %B100
       
        ldr         r0, =GPBDAT
        ldr        r1, =0x00
        str         r1, [r0]

        ldr        r0, =0x100000
200        subs         r0, r0, #1
        bne        %B200

        b led_loop

        LTORG

SMRDATA DATA
    ; 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 ((REFEN<<23)+(TREFMD<<22)+(Trp<<20)+(Trc<<18)+(Tchr<<16)+REFCNT)                            ;100MHz
   
    DCD 0x32     ; SCLK power saving mode, BANKSIZE 128M/128M, 4-burst.

    DCD 0x30            ; MRSR6 CL=3clk.
    DCD 0x30            ; MRSR7.

;------------------------------------
; 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)

; void MMU_EnableICache(void);
;
    LEAF_ENTRY MMU_EnableICache       
   
    mrc         p15, 0, r0, c1, c0, 0
    orr         r0, r0, #R1_I
    mcr         p15, 0, r0, c1, c0, 0
    mov         pc, lr

; void MMU_SetAsyncBusMode(void);
; FCLK:HCLK= 1:2
;
    LEAF_ENTRY MMU_SetAsyncBusMode
    mrc         p15, 0, r0, c1, c0, 0
    orr         r0, r0, #R1_nF:OR:R1_iA
    mcr         p15, 0, r0, c1, c0, 0
    mov         pc, lr


; NAND code...
;
A410_BASE_ADDR        EQU        0x2000000

;;;        MACRO
;;;        LDR4STR1 $src,$tmp1,$tmp2       
;;;        ldrb        $tmp1,[$src]
;;;        ldrb        $tmp2,[$src]
;;;        orr                $tmp1,$tmp1,$tmp2,LSL #8
;;;        ldrb        $tmp2,[$src]
;;;        orr                $tmp1,$tmp1,$tmp2,LSL #16
;;;        ldrb        $tmp2,[$src]
;;;        orr                $tmp1,$tmp1,$tmp2,LSL #24
;;;        MEND

        EXPORT        __RdPagedata
__RdPagedata
        ;input:a1(r0)=pPage
        stmfd        sp!,{r1-r11}

        ldr        r1,=0x4e000010  ;NFDATA
        mov        r2,#0x200
10       
        ldr         r4,[r1]
        ldr         r5,[r1]
        ldr         r6,[r1]
        ldr         r7,[r1]
        ldr         r8,[r1]
        ldr         r9,[r1]
        ldr         r10,[r1]
        ldr         r11,[r1]
        stmia                r0!,{r4-r11}
        subs                r2,r2,#32
        bne                        %B10

        ldmfd                sp!,{r1-r11}
        mov                        pc,lr


    END

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

i.MX8系列ARM cortex A53 M4 工控板上一条 /1 下一条

Archiver|手机版|小黑屋|天嵌 嵌入式开发社区 ( 粤ICP备11094220号 )

GMT+8, 2024-5-7 17:01 , Processed in 1.015625 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表