📄 hfrk_start_nand.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 + -