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

📄 hfrk_start_nand.s

📁 Bootload 程序
💻 S
字号:
#include "hfrk.h".texthfrk_cp_nand_to_sdram:    mov r3, lr    bl nand_boot_beg    mov pc, r3/*****************************************************************************/#define NFCONF 0x4e000000nand_boot_beg:    mov r2, lr    mov r5, #NFCONF    ldr r0, =(1<<15)|(1<<12)|(1<<11)|(7<<8)|(7<<4)|(7)    str r0, [r5]    bl  ReadNandID    mov r6, #0    ldr r0, =0xec73    cmp r5, r0    beq _R6_EQ_ZERO    ldr r0, =0xec75    cmp r5, r0    beq _R6_EQ_ZERO    mov r6, #1_R6_EQ_ZERO:                             /* 1 */    bl  ReadNandStatus    mov r8, #0    ldr r9, =RAM_HIGH_ADDR               /**********************/_BACK_TO_CHECK:                          /* 2 */    ands    r0, r8, #0x1f    bne     _IGNORE_CHECK_BAD_BLK    mov     r0, r8    bl      CheckBadBlk    cmp     r0, #0    addne   r8, r8, #32    bne     _IGONRE_READ_NAND_PAGE_IGNORE_CHECK_BAD_BLK:                   /* 3 */    mov r0, r8    mov r1, r9    bl  ReadNandPage    add r9, r9, #512    add r8, r8, #1_IGONRE_READ_NAND_PAGE:                  /* 4 */    cmp r8, #256    bcc _BACK_TO_CHECK    mov r5, #NFCONF                      /* DsNandFlash */    ldr r0, [r5]    and r0, r0, #~0x8000    str r0, [r5]    ldr pc, =copy_proc_beg/*****************************************************************************//* in the current method, the init_ram will be called in core */copy_proc_beg:    mov pc, r2/*****************************************************************************/ReadNandID:    mov      r7,#NFCONF    ldr      r0,[r7,#0]     /* NFChipEn(); */    bic      r0,r0,#0x800    str      r0,[r7,#0]    mov      r0,#0x90       /* WrNFCmd(RdIDCMD); */    strb     r0,[r7,#4]    mov      r4,#0          /* WrNFAddr(0); */    strb     r4,[r7,#8]_WAIT_FOR_BUSY_STATUS:      /* while (NFIsBusy()); */    ldr      r0,[r7,#0x10]    tst      r0,#1    beq      _WAIT_FOR_BUSY_STATUS    ldrb     r0,[r7,#0xc]   /* id  = RdNFDat() << 8; */    mov      r0,r0,lsl #8    ldrb     r1,[r7,#0xc]   /* id |= RdNFDat(); */    orr      r5,r1,r0    ldr      r0,[r7,#0]     /* NFChipDs(); */    orr      r0,r0,#0x800    str      r0,[r7,#0]    mov      pc,lrReadNandStatus:    mov      r7,#NFCONF    ldr      r0,[r7,#0]     /* NFChipEn(); */    bic      r0,r0,#0x800    str      r0,[r7,#0]    mov      r0,#0x70       /* WrNFCmd(QUERYCMD); */    strb     r0,[r7,#4]    ldrb     r1,[r7,#0xc]   /* r1 = RdNFDat(); */    ldr      r0,[r7,#0]     /* NFChipDs(); */    orr      r0,r0,#0x800    str      r0,[r7,#0]    mov      pc,lrWaitNandBusy:    mov      r0,#0x70       /* WrNFCmd(QUERYCMD); */    mov      r1,#NFCONF    strb     r0,[r1,#4]_WAIT_FOR_BUSY_STATUS_1:    /* while(!(RdNFDat() & 0x40)); */    ldrb     r0,[r1,#0xc]    tst      r0,#0x40    beq      _WAIT_FOR_BUSY_STATUS_1    mov      r0,#0          /* WrNFCmd(READCMD0); */    strb     r0,[r1,#4]    mov      pc,lrCheckBadBlk:    mov     r7, lr    mov     r5, #NFCONF    bic     r0, r0, #0x1f   /* addr &= ~0x1f; */    ldr      r1,[r5,#0]     /* NFChipEn(); */    bic      r1,r1,#0x800    str      r1,[r5,#0]    mov      r1,#0x50       /* WrNFCmd(READCMD2) */    strb     r1,[r5,#4]    mov     r1, #6    strb     r1,[r5,#8]     /* WrNFAddr(6); */    strb     r0,[r5,#8]     /* WrNFAddr(addr); */    mov      r1,r0,lsr #8   /* WrNFAddr(addr>>8) */    strb     r1,[r5,#8]    cmp      r6,#0          /* if (NandAddr) */    movne    r0,r0,lsr #16  /* WrNFAddr(addr >> 16); */    strneb   r0,[r5,#8]    bl      WaitNandBusy    /* WaitNFBusy(); */    ldrb    r0, [r5,#0xc]   /* RdNFDat(); */    sub     r0, r0, #0xff    mov      r1,#0          /* WrNFCmd(READCMD0) */    strb     r1,[r5,#4]    ldr      r1,[r5,#0]     /* NFChipDs(); */    orr      r1,r1,#0x800    str      r1,[r5,#0]    mov     pc, r7ReadNandPage:    mov      r7,lr    mov      r4,r1    mov      r5,#NFCONF    ldr      r1,[r5,#0]     /* NFChipEn(); */    bic      r1,r1,#0x800    str      r1,[r5,#0]    mov      r1,#0          /* WrNFCmd(READCMD0); */    strb     r1,[r5,#4]    strb     r1,[r5,#8]     /* WrNFAddr(0); */    strb     r0,[r5,#8]     /* WrNFAddr(addr); */    mov      r1,r0,lsr #8   /* WrNFAddr(addr >> 8) */    strb     r1,[r5,#8]    cmp      r6,#0          /* if (NandAddr) */    movne    r0,r0,lsr #16  /* WrNFAddr(addr >> 16); */    strneb   r0,[r5,#8]    ldr      r0,[r5,#0]     /* InitEcc(); */    orr      r0,r0,#0x1000    str      r0,[r5,#0]    bl       WaitNandBusy   /* WaitNFBusy(); */    mov      r0,#0          /* for(i = 0; i < 512; i++) */_COPY_DATA_LOOP:    ldrb     r1,[r5,#0xc]   /* buf[i] = RdNFDat(); */    strb     r1,[r4,r0]    add      r0,r0,#1    bic      r0,r0,#0x10000    cmp      r0,#0x200    bcc      _COPY_DATA_LOOP    ldr      r0,[r5,#0]     /* NFChipDs(); */    orr      r0,r0,#0x800    str      r0,[r5,#0]    mov      pc,r7

⌨️ 快捷键说明

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