主题 : NK.BIN加载问题 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 34238
精华: 0
发帖: 27
金钱: 135 两
威望: 27 点
贡献值: 0 点
综合积分: 54 分
注册时间: 2010-12-13
最后登录: 2017-09-13
楼主  发表于: 2011-09-15 11:19

 NK.BIN加载问题

我用mini6410的板,256MB DDRAM,因为有些特殊需要我想用自己的boot程序,所以写了个简单的boot程序,硬件设置是从SD卡启动,boot程序用IAR编译,编译好的程序用WinHex工具根据芯片说明烧写到SD卡的特定扇区,我现在已经可以从SD卡启动boot程序了,并使用了FATFS文件系统,可以访问SD的文件,我试着把SD卡上NK.BIN根据文件格式解压到0x50100000的地方,并运行,但是没有板任何反应,我是把每个段的数据放到每个段开始的地址并计算校验和,如果校验出错会提示,但是解压NK数据没有校验出错,用superboot就可以加载相同的NK.BIN并正常运行,我想请教下解压NK.BIN除了把每个段解压到相应的地址外还要做什么额外的处理吗或者是初始化,并且我在boot程序启动时把低128MB DDRAM全部清了零,128MB RAM我读写校验过是没问题的,我的boot是在高128MB的RAM里面跑很正常,应该内存工作正常

以下我是我的NK.BIN解压程序

typedef struct {
    uint8 filehead[7];  //{"B000FF"}
    uint32 lmageStrat;
    uint32 lmageLength;
}NK_BIN_FILE;

typedef struct {
    uint32 StartAddr;
    uint32 Length;
    uint32 ChkSum;
}NK_BIN_RECORD;


/*读NK.BIN文件的段,start_addr是读取到结束段时返回运行地址*/
int32 Read_NK_record(uint32 rec_count,uint32 *start_addr)
{
    NK_BIN_RECORD nk_record;
    uint8 *p;
    uint32 loop,ChkSum;
    uint32 len;
    int32 ret;
    FRESULT res;

    
    res = f_read(&fsrc,dsip_buf,12,&len);
    if(res!=FR_OK){
        ret = -1;
        return ret;
    }
    nk_record.StartAddr = Char2Int32(dsip_buf,0);
    nk_record.Length    = Char2Int32(dsip_buf,4);
    nk_record.ChkSum    = Char2Int32(dsip_buf,8);
   // CLIOutputString("record:%d addr:0x%x len:0x%x Chk:0x%x\r\n",rec_count,nk_record.StartAddr,nk_record.Length,nk_record.ChkSum);
    *start_addr = 0;    
    if((nk_record.StartAddr==0)&&(nk_record.ChkSum==0)){ //读到结束段了
        ret = -2;
        *start_addr = nk_record.Length-0x30000000;   虚拟地址转换到物理地址
        return ret;
    }
    if((nk_record.StartAddr>=0x80100000)&&((nk_record.StartAddr+nk_record.Length)<=0x84000000)){
        p = (uint8 *)(nk_record.StartAddr-0x30000000);
        res = f_read(&fsrc,p,nk_record.Length,&len);
        
        if(res!=FR_OK){
            CLIOutputString("NK.bin read error!\r\n");
            ret = -1;
            return ret;
        }
        ChkSum = 0;
        p = (uint8 *)(nk_record.StartAddr-0x30000000);
        for(loop=0;loop<len;loop++){
            ChkSum+=*p++;
        }
        if(ChkSum!=nk_record.ChkSum){
            CLIOutputString("NK.bin record:%d check error!\r\n",rec_count);
            CLIOutputString("Error Addr:%x %x %x\r\n",nk_record.StartAddr,nk_record.ChkSum,ChkSum);
            ret = -1;
            return ret;
        }
        return len;
    }
    else{
        CLIOutputString("NK.bin Address out of range!\r\n");
        ret = -1;
        return ret;
    }
}


int32 Load_NK_bin(int32 ShowProgress)
{
    FRESULT res;
    int32 ret;
    uint32 len,record_count,run_addr;
    NK_BIN_FILE nk_file;
    
    
    res = f_open(&fsrc,"0:/systemboot/NK.bin",FA_READ);
    if(res!=FR_OK){
        CLIOutputString("Not open NK.bin!\r\n");
        ret = -1;
        return ret;
    }
    f_lseek(&fsrc,0);
      
    /*读取文件nk.bin头*/
    res = f_read(&fsrc,nk_file.filehead,7,&len);
    if(res!=FR_OK){
        ret = -1;
        f_close(&fsrc);
        return ret;
    }
    if(memcmp((const char *)nk_file.filehead,"B000FF",6)>0){
        ret = -1;
        f_close(&fsrc);
        CLIOutputString("File type error!\r\n");
        return ret;
    }
    res = f_read(&fsrc,dsip_buf,8,&len);
    if(res!=FR_OK){
        ret = -1;
        f_close(&fsrc);
        return ret;
    }
    nk_file.lmageStrat =  Char2Int32(dsip_buf,0);
    nk_file.lmageLength = Char2Int32(dsip_buf,4);
    CLIOutputString("NK.bin StartAddr=%x Length=%x\r\n",nk_file.lmageStrat,nk_file.lmageLength);
    record_count = 0;
    while(1){
        ret = Read_NK_record(record_count++,&run_addr);
        if(ret==-1){
            f_close(&fsrc);
            return ret;
        }
        if(ret==-2){
            f_close(&fsrc);
            CLIOutputString("Run addr:0x%x.....\r\n",run_addr);
            jmp_pc(run_addr);  //跳转到运行地址运行NK
            return ret;
        }
    }
}
级别: 新手上路
UID: 34238
精华: 0
发帖: 27
金钱: 135 两
威望: 27 点
贡献值: 0 点
综合积分: 54 分
注册时间: 2010-12-13
最后登录: 2017-09-13
1楼  发表于: 2011-09-15 11:21

 这个我boot的程序的启动代码

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; Part one of the system initialization code,
;; contains low-level
;; initialization.
;;
;; Copyright 2007 IAR Systems. All rights reserved.
;;
;; $Revision: 29252 $
;;

#include "s3c6410.h"
#include "s3c6410_config.h"
#include "movi.h"

        MODULE  ?cstartup

        ;; Forward declaration of sections.
        SECTION IRQ_STACK:DATA:NOROOT(3)
        SECTION FIQ_STACK:DATA:NOROOT(3)
        SECTION CSTACK:DATA:NOROOT(3)
        SECTION SVC_STACK:DATA:NOROOT(3)
        SECTION UND_STACK:DATA:NOROOT(3)
        SECTION ABT_STACK:DATA:NOROOT(3)
;
; The module in this file are included in the libraries, and may be
; replaced by any user-defined modules that define the PUBLIC symbol
; __iar_program_start or a user defined start symbol.
;
; To override the cstartup defined in the library, simply add your
; modified version to the workbench project.

        SECTION .intvec:CODE:NOROOT(2)

        PUBLIC  __vector
        PUBLIC  __iar_program_start
        PUBLIC  jmp_pc
        
        EXTERN  Undefined_Handler
        EXTERN  SWI_Handler
        EXTERN  Prefetch_Handler
        EXTERN  Abort_Handler
        EXTERN  IRQ_Handler
        EXTERN  FIQ_Handler
        EXTERN  movi_bl2_copy

        ARM

__iar_init$$done:               ; The vector table is not needed
                                ; until after copy initialization is done
      
__vector:
        ; All default exception handlers (except reset) are
        ; defined as weak symbol definitions.
        ; If a handler is defined by the application it will take precedence.
        b       __iar_program_start           ; Reset
        LDR     PC,Undefined_Addr       ; Undefined instructions
        LDR     PC,SWI_Addr             ; Software interrupt (SWI/SVC)
        LDR     PC,Prefetch_Addr        ; Prefetch abort
        LDR     PC,Abort_Addr           ; Data abort
        DCD     0                       ; RESERVED
        LDR     PC,IRQ_Addr             ; IRQ
        LDR     PC,FIQ_Addr             ; FIQ

        DATA

Undefined_Addr: DCD   Undefined_Handler
SWI_Addr:       DCD   SWI_Handler
Prefetch_Addr:  DCD   Prefetch_Handler
Abort_Addr:     DCD   Abort_Handler
IRQ_Addr:       DCD   IRQ_Handler
FIQ_Addr:       DCD   FIQ_Handler


; --------------------------------------------------
; ?cstartup -- low-level system initialization code.
;
; After a reset execution starts here, the mode is ARM, supervisor
; with interrupts disabled.
;



        

        PUBLIC  ?cstartup        
        EXTERN  ?main
;;       REQUIRE __vector

                
  ;;      SECTION .program_start_section:CODE:NOROOT(2)
  ;;       ARM
__iar_program_start:        
?cstartup:

;
; Add initialization needed before setup of stackpointers here.
;

;
; Initialize the stack pointers.
; The pattern below can be used for any of the exception stacks:
; FIQ, IRQ, SVC, ABT, UND, SYS.
; The USR mode uses the same stack as SYS.
; The stack segments must be defined in the linker command file,
; and be declared above.
;


; --------------------
; Mode, correspords to bits 0-5 in CPSR

MODE_MSK DEFINE 0x1F            ; Bit mask for mode bits in CPSR

USR_MODE DEFINE 0x10            ; User mode
FIQ_MODE DEFINE 0x11            ; Fast Interrupt Request mode
IRQ_MODE DEFINE 0x12            ; Interrupt Request mode
SVC_MODE DEFINE 0x13            ; Supervisor mode
ABT_MODE DEFINE 0x17            ; Abort mode
UND_MODE DEFINE 0x1B            ; Undefined Instruction mode
SYS_MODE DEFINE 0x1F            ; System mode


                        
cpu_init_crit:
        ;; 清除V4 数据和指令缓存
        MOV     r0, #0
        MCR     p15, 0, r0, c7, c7, 0   ; flush v3/v4 cache
        MCR     p15, 0, r0, c8, c7, 0   ; flush v4 TLB
        
        ;; 禁止mmu和caches
        MRC     p15, 0, r0, c1, c0, 0
        BIC     r0, r0, #0x00002300     ;clear bits 13, 9:8 (--V- --RS)
        BIC     r0, r0, #0x00000087     ;clear bits 7, 2:0 (B--- -CAM)
        ORR     r0, r0, #0x00000002     ;set bit 2
        ORR     r0, r0, #0x00001000     ;set bit 12使能I CACHE
        MCR     p15, 0, r0, c1, c0, 0
        
        ;;重映射外设地址
        ldr     r0,=0x70000000
        orr     r0,r0,#0x13
        mcr     p15,0,r0,c15,c2,4  ;映射到0x70000000-0x7fffffff范围

;--------------------------------------------------
;            Disable Watchdog
;--------------------------------------------------        
        
    ldr        r0, =0x7e004000        ;0x7e004000
    mov        r1, #0
    str        r1, [r0]
        
;--------------------------------------------------
;         Interrupt Disable
;--------------------------------------------------
    ldr  r0, = 0x71200014 ; vic0 clear
    ldr  r1, = 0xFFFFFFFF
    str  r1, [r0]

    ldr  r0, = 0x71300014 ; vic0 clear
    ldr  r1, = 0xFFFFFFFF
    str  r1, [r0]
;--------------------------------------------------
;         Set Clock Out Pad to clock out APLL CLK
;--------------------------------------------------
        ldr r0, = 0x7f0080a0
        ldr r1, [r0]
        ;;orr r1, r1, #0x30000000
        str r1, [r0]

        ldr r0, =0x7f0080a8
        ldr r1, [r0]
        bic r1, r1, #0x03000000
        str r1, [r0]

        ldr r0, =0x7e00f02c
        mov r1, #0x10000
        str r1, [r0]
;----------------------------------------------------------
;   Set the mem1drvcon to raise drive strength
;----------------------------------------------------------

        ldr        r0, =0x7F0081D4
;        ldr        r1, =0xFFFFFFFF
        ldr        r1, =0x55555555
        str        r1, [r0]
      
;----------------------------------------------------------
;       设置到同步模式
;----------------------------------------------------------
        
system_clock_init:
    ldr    r0, =ELFIN_CLOCK_POWER_BASE    ;;0x7e00f000      
        ldr    r1, [r0, #OTHERS_OFFSET]
        mov    r2, #0x40
        orr    r1, r1, r2
        str    r1, [r0, #OTHERS_OFFSET]
    
        nop
        nop
        nop
        nop
        nop
    
        ldr    r2, =0x80
        orr    r1, r1, r2
        str    r1, [r0, #OTHERS_OFFSET]

check_syncack:
        ldr    r1, [r0, #OTHERS_OFFSET]
        ldr    r2, =0xf00
        and    r1, r1, r2
        cmp    r1, #0xf00
        bne    check_syncack

;--------------------------------------------------------------------------------------------
;        把时钟切换到12MHz输入
;--------------------------------------------------------------------------------------------
        ldr        r0, =ELFIN_CLOCK_POWER_BASE
        ldr        r1, [r0,#CLK_SRC_OFFSET]
        bic        r1, r1, #0x7            
        str        r1, [r0,#CLK_SRC_OFFSET]

        
;--------------------------------------------------------------------------------------------
;        Set System Clock Divider
;--------------------------------------------------------------------------------------------
        ldr       r1, [r0, #CLK_DIV0_OFFSET]    /*Set Clock Divider设置时钟分频比*/
        bic     r1, r1, #0x30000
        bic     r1, r1, #0xff00
        bic     r1, r1, #0xff
        ldr     r2, =CLK_DIV0_VAL
        orr     r1, r1, r2
        str     r1, [r0, #CLK_DIV0_OFFSET]
        
;--------------------------------------------------------------------------------------------
;        准备修改PLL,PLL需要一个锁定期间,当输入频率为改变或频分(乘法)值
;        改变。 PLL_LOCK寄存器指定该锁定期,这是对PLL的时钟源为基础。在此期间,输出将被屏蔽为0。
;--------------------------------------------------------------------------------------------
        mov    r1, #0xff00
        orr    r1, r1, #0xff
        str    r1, [r0, #APLL_LOCK_OFFSET]
        str    r1, [r0, #MPLL_LOCK_OFFSET]
        str    r1, [r0, #EPLL_LOCK_OFFSET]
        
;--------------------------------------------------------------------------------------------        
;          CLKUART(=66.5Mhz) = CLKUART_input(532/2=266Mhz) / (UART_RATIO(3)+1) */
;          CLKUART(=50Mhz) = CLKUART_input(400/2=200Mhz) / (UART_RATIO(3)+1) */
;          Now, When you use UART CLK SRC by EXT_UCLK1, We support 532MHz & 400MHz value */
;--------------------------------------------------------------------------------------------        
        ldr     r1, =APLL_VAL
        str     r1, [r0, #APLL_CON_OFFSET]
        ldr     r1, =MPLL_VAL
        str     r1, [r0, #MPLL_CON_OFFSET]
        ldr     r1, =EPLL_VAL
        str     r1, [r0, #EPLL_CON0_OFFSET]
        ldr     r1, =EPLL_KDIV
        str     r1, [r0, #EPLL_CON1_OFFSET]
        
        
        ldr    r1, [r0, #CLK_SRC_OFFSET]        /* APLL, MPLL, EPLL select to Fout把时钟切换到3个PLL输出 */
        orr    r1, r1, #0x7
        str    r1, [r0, #CLK_SRC_OFFSET]
        
;----------------------------------------------------------
;        延时一段时间等待时钟稳定
;----------------------------------------------------------
        mov    r1, #0x10000
clk_loop:    
        subs    r1, r1, #1                    
    bne    clk_loop
        nop
        nop
;------------------------------------
;    Expand Memory Port 1 to x32
;------------------------------------

        ldr        r0, =0x7e00f120
        ldr        r1, [r0]
        bic        r1, r1, #0x80            ; ADDR_EXPAND to "0"
        str        r1, [r0]

;------------------------------------
;    CKE_INIT Configuration
;------------------------------------

        ldr        r0, =0x7F008880        ; SPCONSLP
        ldr        r1, [r0]
        orr        r1, r1, #0x10            ; SPCONSLP[4] = 1
        str        r1, [r0]
        
                

        bl  uart_asm_init         ;;初始化UART
        nop
        bl  mem_ctrl_asm_init     ;;初始化DDRAM
        nop
        nop
;----------------------------------------------------------        
        ;;set the cpu to SVC32 mode
        mrs     r0, cpsr                ; Original PSR value
        
        BIC     r0, r0, #MODE_MSK       ; Clear the mode bits
        ORR     r0, r0, #IRQ_MODE       ; Set IRQ mode bits
        MSR     cpsr_c, r0              ; Change the mode
        LDR     sp, =SFE(IRQ_STACK)     ; End of IRQ_STACK
        BIC     sp,sp,#0x7              ; Make sure SP is 8 aligned

        ;; Set up the fast interrupt stack pointer.

        BIC     r0, r0, #MODE_MSK       ; Clear the mode bits
        ORR     r0, r0, #FIQ_MODE       ; Set FIR mode bits
        MSR     cpsr_c, r0              ; Change the mode
        LDR     sp, =SFE(FIQ_STACK)     ; End of FIQ_STACK
        BIC     sp,sp,#0x7              ; Make sure SP is 8 aligned

        ;; Set up the normal stack pointer.

        BIC     r0 ,r0, #MODE_MSK       ; Clear the mode bits
        ORR     r0 ,r0, #UND_MODE       ; Set System mode bits
        MSR     cpsr_c, r0              ; Change the mode
        LDR     sp, =SFE(UND_STACK)     ; End of UND_STACK
        BIC     sp,sp,#0x7              ; Make sure SP is 8 aligned
        
        BIC     r0 ,r0, #MODE_MSK       ; Clear the mode bits
        ORR     r0 ,r0, #ABT_MODE       ; Set System mode bits
        MSR     cpsr_c, r0              ; Change the mode
        LDR     sp, =SFE(ABT_STACK)        ; End of CSTACK
        BIC     sp,sp,#0x7              ; Make sure SP is 8 aligned
        
        BIC     r0 ,r0, #MODE_MSK       ; Clear the mode bits
        ORR     r0 ,r0, #SYS_MODE       ; Set System mode bits
        MSR     cpsr_c, r0              ; Change the mode
        LDR     sp, =SFE(CSTACK)        ; End of CSTACK
        BIC     sp,sp,#0x7              ; Make sure SP is 8 aligned
        
        mrs        r0, cpsr
    bic      r0, r0, #0x3f
    orr        r0, r0, #0xd3
    msr        cpsr_c, r0
        ldr     sp, = SFE(SVC_STACK);
        bic     sp,sp,#0x7
;----------------------------------------      
        nop
        nop
        ldr     r0,=0x0000FFFF
        bic     r1,pc,r0
        ldr     r2,=TEXT_BASE
        bic     r2, r2, r0
        cmp     r1, r2
        beq     after_copy
;---------------------------------------------
;          Clear DRAM
;---------------------------------------------
        nop
        nop
        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, = 0x50000000  ;Start address (Physical 0x5000.0000)
        ldr r9, = 0x08000000   ;128MB of RAM
        
DDRAM_CLEAR_LOOP:
        stmia r0!, {r1-r8}
        subs r9, r9, #32
        bne DDRAM_CLEAR_LOOP
        nop
        nop
;-----------------------------------------------        
        bl      movi_bl2_copy
        ldr     pc,=TEXT_BASE
after_copy:
      
; Continue to ?main for C-level initialization.

        LDR     r0, =?main
        BX      r0

led_test:
        /*led test state*/
        ldr     r0,=ELFIN_GPIO_BASE
        ldr     r1,=0x11110000
        str     r1,[r0,#GPKCON0_OFFSET]
        ldr     r1,=0x0
        str     r1,[r0,#GPKPUD_OFFSET]
        str     r2,[r0,#GPKDAT_OFFSET]
        mov    pc, lr
/*
* uart_asm_init: Initialize UART in asm mode, 115200bps fixed.
* void uart_asm_init(void)
*/
    
jmp_pc:
      mov     r1, #0
      MCR     p15, 0, r1, c7, c7, 0   ; flush v3/v4 cache
      MCR     p15, 0, r1, c8, c7, 0   ; flush v4 TLB
      mov     pc,r0
      
uart_asm_init:
    /* set GPIO to enable UART */
    ;; GPIO setting for UART
    ldr    r0, =ELFIN_GPIO_BASE
    ldr    r1, =0x220022
    str       r1, [r0, #GPACON_OFFSET]

    ldr    r0, =ELFIN_CLOCK_POWER_BASE    ;;0x7e00f000
    ldr        r1, [r0,#CLK_SRC_OFFSET]
    orr        r1, r1, #0x2000          
    str        r1, [r0,#CLK_SRC_OFFSET]

    ldr r1, [r0,#CLK_DIV2_OFFSET]
    bic r1, r1,#0xF0000
    orr r1, r1,#0x30000
    str r1, [r0,#CLK_DIV2_OFFSET]
    
    ldr    r0, =ELFIN_UART_CONSOLE_BASE        ;;0x7F005000
    mov    r1, #0x0
    str    r1, [r0, #UFCON_OFFSET]
    str    r1, [r0, #UMCON_OFFSET]

    mov    r1, #0x3                    ;;was 0.
    str    r1, [r0, #ULCON_OFFSET]

    ldr    r1, =0xe45            /* UARTCLK SRC = 11 => EXT_UCLK1*/
    str    r1, [r0, #UCON_OFFSET]
    ldr    r1, =0x11
    str    r1, [r0, #UBRDIV_OFFSET]

    ldr    r1, =0x0

    str    r1, [r0, #UDIVSLOT_OFFSET]

    //ldr    r1, =0x30303030
    //str    r1, [r0, #UTXH_OFFSET]        ;;'O'

    mov    pc, lr

    
mem_ctrl_asm_init:
            
        ldr    r0, =ELFIN_DMC1_BASE          ;;DMC1 base address 0x7e001000
    
        ldr    r1, =0x04
        str    r1, [r0, #INDEX_DMC_MEMC_CMD]
    
        ldr    r1, =DMC_DDR_REFRESH_PRD
        str    r1, [r0, #INDEX_DMC_REFRESH_PRD]
    
        ldr    r1, =DMC_DDR_CAS_LATENCY
        str    r1, [r0, #INDEX_DMC_CAS_LATENCY]
    
        ldr    r1, =DMC_DDR_t_DQSS
        str    r1, [r0, #INDEX_DMC_T_DQSS]
    
        ldr    r1, =DMC_DDR_t_MRD
        str    r1, [r0, #INDEX_DMC_T_MRD]
    
        ldr    r1, =DMC_DDR_t_RAS
        str    r1, [r0, #INDEX_DMC_T_RAS]
    
        ldr    r1, =DMC_DDR_t_RC
        str    r1, [r0, #INDEX_DMC_T_RC]
    
        ldr    r1, =DMC_DDR_t_RCD
        ldr    r2, =DMC_DDR_schedule_RCD
        orr    r1, r1, r2
        str    r1, [r0, #INDEX_DMC_T_RCD]
    
        ldr    r1, =DMC_DDR_t_RFC
        ldr    r2, =DMC_DDR_schedule_RFC
        orr    r1, r1, r2
        str    r1, [r0, #INDEX_DMC_T_RFC]
    
        ldr    r1, =DMC_DDR_t_RP
        ldr    r2, =DMC_DDR_schedule_RP
        orr    r1, r1, r2
        str    r1, [r0, #INDEX_DMC_T_RP]
    
        ldr    r1, =DMC_DDR_t_RRD
        str    r1, [r0, #INDEX_DMC_T_RRD]
    
        ldr    r1, =DMC_DDR_t_WR
        str    r1, [r0, #INDEX_DMC_T_WR]
    
        ldr    r1, =DMC_DDR_t_WTR
        str    r1, [r0, #INDEX_DMC_T_WTR]
    
        ldr    r1, =DMC_DDR_t_XP
        str    r1, [r0, #INDEX_DMC_T_XP]
    
        ldr    r1, =DMC_DDR_t_XSR
        str    r1, [r0, #INDEX_DMC_T_XSR]
    
        ldr    r1, =DMC_DDR_t_ESR
        str    r1, [r0, #INDEX_DMC_T_ESR]
    
        ldr    r1, =DMC1_MEM_CFG
        str    r1, [r0, #INDEX_DMC_MEMORY_CFG]
    
        ldr    r1, =DMC1_MEM_CFG2
        str    r1, [r0, #INDEX_DMC_MEMORY_CFG2]
    
        ldr    r1, =DMC1_CHIP0_CFG
        str    r1, [r0, #INDEX_DMC_CHIP_0_CFG]
    
        ldr    r1, =DMC_DDR_32_CFG
        str    r1, [r0, #INDEX_DMC_USER_CONFIG]
    
        ;;DMC0 DDR Chip 0 configuration direct command reg
        ldr    r1, =DMC_NOP0
        str    r1, [r0, #INDEX_DMC_DIRECT_CMD]
    
        ;;Precharge All
        ldr    r1, =DMC_PA0
        str    r1, [r0, #INDEX_DMC_DIRECT_CMD]
    
        ;;Auto Refresh    2 time
        ldr    r1, =DMC_AR0
        str    r1, [r0, #INDEX_DMC_DIRECT_CMD]
        str    r1, [r0, #INDEX_DMC_DIRECT_CMD]
    
        ;;MRS
        ldr    r1, =DMC_mDDR_EMR0
        str    r1, [r0, #INDEX_DMC_DIRECT_CMD]
    
        ;;Mode Reg
        ldr    r1, =DMC_mDDR_MR0
        str    r1, [r0, #INDEX_DMC_DIRECT_CMD]
    
    #ifdef CONFIG_SMDK6410_X5A
        ldr    r1, =DMC1_CHIP1_CFG
        str    r1, [r0, #INDEX_DMC_CHIP_1_CFG]
    
        ;;DMC0 DDR Chip 0 configuration direct command reg
        ldr    r1, =DMC_NOP1
        str    r1, [r0, #INDEX_DMC_DIRECT_CMD]
    
        ;;Precharge All
        ldr    r1, =DMC_PA1
        str    r1, [r0, #INDEX_DMC_DIRECT_CMD]
    
        ;;Auto Refresh    2 time
        ldr    r1, =DMC_AR1
        str    r1, [r0, #INDEX_DMC_DIRECT_CMD]
        str    r1, [r0, #INDEX_DMC_DIRECT_CMD]
    
        ;;MRS
        ldr    r1, =DMC_mDDR_EMR1
        str    r1, [r0, #INDEX_DMC_DIRECT_CMD]
    
        ;;Mode Reg
        ldr    r1, =DMC_mDDR_MR1
        str    r1, [r0, #INDEX_DMC_DIRECT_CMD]
    #endif
    
        ;;Enable DMC1
        mov    r1, #0x0
        str    r1, [r0, #INDEX_DMC_MEMC_CMD]
    
    check_dmc1_ready:
        ldr    r1, [r0, #INDEX_DMC_MEMC_STATUS]
        mov    r2, #0x3
        and    r1, r1, r2
        cmp    r1, #0x1
        bne    check_dmc1_ready
        nop
        nop
        mov    pc, lr
        nop
        b .
级别: 新手上路
UID: 34238
精华: 0
发帖: 27
金钱: 135 两
威望: 27 点
贡献值: 0 点
综合积分: 54 分
注册时间: 2010-12-13
最后登录: 2017-09-13
2楼  发表于: 2011-09-15 11:22
是不是我遗忘了那些初始化的地方导致不能运行,我的boot运行在5ff000000-60000000这个范围
级别: 新手上路
UID: 34238
精华: 0
发帖: 27
金钱: 135 两
威望: 27 点
贡献值: 0 点
综合积分: 54 分
注册时间: 2010-12-13
最后登录: 2017-09-13
3楼  发表于: 2011-09-17 11:47
我跟踪程序发现又是老问题,把options.h文件的设置为 #define KITL_NONE就可以启动了,设置为#define KITL_SERIAL_UART0死活都启动不了,串口也没有信息,没办法了,点灯测试了,通过点灯发现程序已经运行到这里了Startup.s

add r0, pc,#g_oalAddressTable - (.+8)
bl KernelStart

在debug。c文件里面的OEMInitDebugSerial()里面再点灯就不行了,说明没有运行到这里来,还没有找到问题,估计是出在这段,还要查查,另外那个ARGS的区域需不需要我boot程序初始化呀,是不是这里有影响
级别: 新手上路
UID: 34238
精华: 0
发帖: 27
金钱: 135 两
威望: 27 点
贡献值: 0 点
综合积分: 54 分
注册时间: 2010-12-13
最后登录: 2017-09-13
4楼  发表于: 2011-09-17 16:18
可以确定是NK.BIN文件问题不大,用superboot加载这个NK.BIN可以,我自己解压NK.BIN不带信息输出的也可以运行,就是不能运行带信息输出的NK.BIN文件,这个问题比较奇怪,一种可能是这个BSP程序内部做特殊处理,也就是superboot在某内存地址写了标志,当定义了#define KITL_SERIAL_UART0等,就判断这个标志,如果没写标志就不运行,二种可能是我boot程序硬件没有初始化好,奇怪的是解压NK.BIN不带信息输出的也可以运行,一点问题没有,说明硬件初始化问题不大。而且我怀疑NK.BIN解压有问题,我直接加载NK.NB0文件,也是出现了相同的问题,加载NK.nb0不带信息输出的也可以运行,带信息输出的也是不可以,我试着跟踪了下,加载带信息输出的镜像时跳转到镜像的运行地址可以运行,跟踪到 bl KernelStart  都正常,下面跟不下去了,是CE PRIVATE文件不知道怎么跟踪了,那位大侠知道,请指教下,看看能不能排个地雷出来,谢谢!