📄 nand.txt
字号:
000568 e92d4010 STMFD sp!,{r4,lr}
;;;223 U32 block=0;
00056c e3a04000 MOV r4,#0
;;;224
;;;225 Uart_Printf("SMC(K9S1208V0M) NAND Block erase\n");
000570 e28f004c ADR r0,|L1.1476|
000574 ebfffffe BL Uart_Printf
;;;226
;;;227 if((Read_Status()&0x80)==0) {
000578 ebfffffe BL Read_Status
00057c e3100080 TST r0,#0x80
000580 1a000002 BNE |L1.1424|
;;;228 Uart_Printf("Write protected.\n");
000584 e28f005c ADR r0,|L1.1512|
000588 ebfffffe BL Uart_Printf
;;;229 return;
;;;230 }
;;;231
;;;232 Uart_Printf("Block # to erase: ");
;;;233 block = Uart_GetIntNum();
;;;234
;;;235 // NF8_Init();
;;;236
;;;237 if(NF8_EraseBlock(block)==FAIL) return;
;;;238
;;;239 Uart_Printf("%d-block erased.\n", block);
;;;240
;;;241 }
|L1.1420|
00058c e8bd8010 LDMFD sp!,{r4,pc}
|L1.1424|
000590 e28f0064 ADR r0,|L1.1532| ;232
000594 ebfffffe BL Uart_Printf ;232
000598 ebfffffe BL Uart_GetIntNum ;233
00059c e1a04000 MOV r4,r0 ;233
0005a0 e1a00004 MOV r0,r4 ;237
0005a4 ebfffffe BL NF8_EraseBlock ;237
0005a8 e3500000 CMP r0,#0 ;237
0005ac 1a000000 BNE |L1.1460| ;237
0005b0 eafffff5 B |L1.1420| ;237
|L1.1460|
0005b4 e1a01004 MOV r1,r4 ;239
0005b8 e28f0050 ADR r0,|L1.1552| ;239
0005bc ebfffffe BL Uart_Printf ;239
0005c0 eafffff1 B |L1.1420|
|L1.1476|
0005c4 28434d53 DCB "SMC("
0005c8 3153394b DCB "K9S1"
0005cc 56383032 DCB "208V"
0005d0 20294d30 DCB "0M) "
0005d4 444e414e DCB "NAND"
0005d8 6f6c4220 DCB " Blo"
0005dc 65206b63 DCB "ck e"
0005e0 65736172 DCB "rase"
0005e4 0000000a DCB "\n\0\0\0"
|L1.1512|
0005e8 74697257 DCB "Writ"
0005ec 72702065 DCB "e pr"
0005f0 6365746f DCB "otec"
0005f4 2e646574 DCB "ted."
0005f8 0000000a DCB "\n\0\0\0"
|L1.1532|
0005fc 636f6c42 DCB "Bloc"
000600 2023206b DCB "k # "
000604 65206f74 DCB "to e"
000608 65736172 DCB "rase"
00060c 0000203a DCB ": \0\0"
|L1.1552|
000610 622d6425 DCB "%d-b"
000614 6b636f6c DCB "lock"
000618 61726520 DCB " era"
00061c 2e646573 DCB "sed."
000620 0000000a DCB "\n\0\0\0"
ENDP
NF8_ReadPage PROC
;;;718 static int NF8_ReadPage(U32 block,U32 page,U8 *buffer)
;;;719 {
000624 e92d47f0 STMFD sp!,{r4-r10,lr}
000628 e1a07000 MOV r7,r0
00062c e1a08001 MOV r8,r1
000630 e1a09002 MOV r9,r2
;;;720 int i;
;;;721 unsigned int blockPage;
;;;722 U32 Mecc, Secc;
;;;723 U8 *bufPt=buffer;
000634 e1a0a009 MOV r10,r9
;;;724 U8 se[16], ecc0, ecc1, ecc2, ecc3,a,b,c,d,e;
;;;725
;;;726 blockPage=(block<<5)+page;
000638 e0886287 ADD r6,r8,r7,LSL #5
;;;727 NF_RSTECC(); // Initialize ECC
00063c e3a0044e MOV r0,#0x4e000000
000640 e5900004 LDR r0,[r0,#4]
000644 e3800010 ORR r0,r0,#0x10
000648 e3a0144e MOV r1,#0x4e000000
00064c e5810004 STR r0,[r1,#4]
;;;728 NF_MECC_UnLock();
000650 e3a0044e MOV r0,#0x4e000000
000654 e5900004 LDR r0,[r0,#4]
000658 e3c00020 BIC r0,r0,#0x20
00065c e3a0144e MOV r1,#0x4e000000
000660 e5810004 STR r0,[r1,#4]
;;;729
;;;730 NF_nFCE_L();
000664 e3a0044e MOV r0,#0x4e000000
000668 e5900004 LDR r0,[r0,#4]
00066c e3c00002 BIC r0,r0,#2
000670 e3a0144e MOV r1,#0x4e000000
000674 e5810004 STR r0,[r1,#4]
;;;731
;;;732 NF_CLEAR_RB();
000678 e3a0044e MOV r0,#0x4e000000
00067c e5900020 LDR r0,[r0,#0x20]
000680 e3800004 ORR r0,r0,#4
000684 e3a0144e MOV r1,#0x4e000000
000688 e5810020 STR r0,[r1,#0x20]
;;;733 NF_CMD(0x00); // Read command
00068c e3a00000 MOV r0,#0
000690 e3a0144e MOV r1,#0x4e000000
000694 e5810008 STR r0,[r1,#8]
;;;734 NF_ADDR(0); // Column = 0
000698 e3a00000 MOV r0,#0
00069c e3a0144e MOV r1,#0x4e000000
0006a0 e581000c STR r0,[r1,#0xc]
;;;735 NF_ADDR(blockPage&0xff); //
0006a4 e20600ff AND r0,r6,#0xff
0006a8 e3a0144e MOV r1,#0x4e000000
0006ac e581000c STR r0,[r1,#0xc]
;;;736 NF_ADDR((blockPage>>8)&0xff); // Block & Page num.
0006b0 e1a00806 MOV r0,r6,LSL #16
0006b4 e1a00c20 MOV r0,r0,LSR #24
0006b8 e3a0144e MOV r1,#0x4e000000
0006bc e581000c STR r0,[r1,#0xc]
;;;737 NF_ADDR((blockPage>>16)&0xff); //
0006c0 e1a00406 MOV r0,r6,LSL #8
0006c4 e1a00c20 MOV r0,r0,LSR #24
0006c8 e3a0144e MOV r1,#0x4e000000
0006cc e581000c STR r0,[r1,#0xc]
;;;738 NF_DETECT_RB();
0006d0 e1a00000 NOP
|L1.1748|
0006d4 e3a0044e MOV r0,#0x4e000000
0006d8 e5900020 LDR r0,[r0,#0x20]
0006dc e3100004 TST r0,#4
0006e0 0afffffb BEQ |L1.1748|
;;;739
;;;740
;;;741 #if TRANS_MODE==C_LANG
;;;742 for(i=0;i<512;i++) {
;;;743 *bufPt++=NF_RDDATA8(); // Read one page
;;;744 }
;;;745 #elif TRANS_MODE==DMA
;;;746 // Nand to memory dma setting
;;;747 rSRCPND=BIT_DMA0; // Init DMA src pending.
0006e4 e3a00b80 MOV r0,#0x20000
0006e8 e3a0144a MOV r1,#0x4a000000
0006ec e5810000 STR r0,[r1,#0]
;;;748 rDISRC0=NFDATA; // Nand flash data register
0006f0 e59f01a0 LDR r0,|L1.2200|
0006f4 e3a0144b MOV r1,#0x4b000000
0006f8 e5810000 STR r0,[r1,#0]
;;;749 rDISRCC0=(0<<1) | (1<<0); //arc=AHB,src_addr=fix
0006fc e3a00001 MOV r0,#1
000700 e3a0144b MOV r1,#0x4b000000
000704 e5810004 STR r0,[r1,#4]
;;;750 rDIDST0=(unsigned)bufPt;
000708 e3a0044b MOV r0,#0x4b000000
00070c e580a008 STR r10,[r0,#8]
;;;751 rDIDSTC0=(0<<1) | (0<<0); //dst=AHB,dst_addr=inc;
000710 e3a00000 MOV r0,#0
000714 e3a0144b MOV r1,#0x4b000000
000718 e581000c STR r0,[r1,#0xc]
;;;752 rDCON0=(1<<31)|(1<<30)|(1<<29)|(1<<28)|(1<<27)|(0<<23)|(1<<22)|(2<<20)|(512/4/4);
00071c e59f0178 LDR r0,|L1.2204|
000720 e3a0144b MOV r1,#0x4b000000
000724 e5810010 STR r0,[r1,#0x10]
;;;753 //Handshake,AHB,interrupt,(4-burst),whole,S/W,no_autoreload,word,count=128;
;;;754
;;;755 // DMA on and start.
;;;756 rDMASKTRIG0=(1<<1)|(1<<0);
000728 e3a00003 MOV r0,#3
00072c e3a0144b MOV r1,#0x4b000000
000730 e5810020 STR r0,[r1,#0x20]
;;;757
;;;758 while(!(rSRCPND & BIT_DMA0)); // Wait until Dma transfer is done.
000734 e1a00000 NOP
|L1.1848|
000738 e3a0044a MOV r0,#0x4a000000
00073c e5900000 LDR r0,[r0,#0]
000740 e3100b80 TST r0,#0x20000
000744 0afffffb BEQ |L1.1848|
;;;759
;;;760 rSRCPND=BIT_DMA0;
000748 e3a00b80 MOV r0,#0x20000
00074c e3a0144a MOV r1,#0x4a000000
000750 e5810000 STR r0,[r1,#0]
;;;761
;;;762 #elif TRANS_MODE==ASM
;;;763 __RdPage512(bufPt);
;;;764 #endif
;;;765
;;;766 /*
;;;767 NF_MECC_Lock();
;;;768
;;;769 rNFMECCD0=NF_RDDATA();
;;;770
;;;771 NF_nFCE_H();
;;;772
;;;773 if ((rNFESTAT0&0x3) == 0x0) return OK;
;;;774 else return FAIL;
;;;775 */
;;;776
;;;777 NF_MECC_Lock();
000754 e3a0044e MOV r0,#0x4e000000
000758 e5900004 LDR r0,[r0,#4]
00075c e3800020 ORR r0,r0,#0x20
000760 e3a0144e MOV r1,#0x4e000000
000764 e5810004 STR r0,[r1,#4]
;;;778
;;;779 NF_SECC_UnLock();
000768 e3a0044e MOV r0,#0x4e000000
00076c e5900004 LDR r0,[r0,#4]
000770 e3c00040 BIC r0,r0,#0x40
000774 e3a0144e MOV r1,#0x4e000000
000778 e5810004 STR r0,[r1,#4]
;;;780 Mecc=NF_RDDATA();
00077c e3a0044e MOV r0,#0x4e000000
000780 e5904010 LDR r4,[r0,#0x10]
;;;781 rNFMECCD0=((Mecc&0xff00)<<8)|(Mecc&0xff);
000784 e20400ff AND r0,r4,#0xff
000788 e2041cff AND r1,r4,#0xff00
00078c e1800401 ORR r0,r0,r1,LSL #8
000790 e3a0144e MOV r1,#0x4e000000
000794 e5810014 STR r0,[r1,#0x14]
;;;782 rNFMECCD1=((Mecc&0xff000000)>>8)|((Mecc&0xff0000)>>16);
000798 e3c408ff BIC r0,r4,#0xff0000
00079c e3c00cff BIC r0,r0,#0xff00
0007a0 e1a00420 MOV r0,r0,LSR #8
0007a4 e1a01404 MOV r1,r4,LSL #8
0007a8 e1800c21 ORR r0,r0,r1,LSR #24
0007ac e3a0144e MOV r1,#0x4e000000
0007b0 e5810018 STR r0,[r1,#0x18]
;;;783
;;;784 NF_SECC_Lock();
0007b4 e3a0044e MOV r0,#0x4e000000
0007b8 e5900004 LDR r0,[r0,#4]
0007bc e3800040 ORR r0,r0,#0x40
0007c0 e3a0144e MOV r1,#0x4e000000
0007c4 e5810004 STR r0,[r1,#4]
;;;785 NF8_Spare_Data[0]=Mecc&0xff;
0007c8 e59f00d0 LDR r0,|L1.2208|
0007cc e5c04000 STRB r4,[r0,#0] ; NF8_Spare_Data
;;;786 NF8_Spare_Data[1]=(Mecc&0xff00)>>8;
0007d0 e1a00804 MOV r0,r4,LSL #16
0007d4 e1a00c20 MOV r0,r0,LSR #24
0007d8 e59f10c0 LDR r1,|L1.2208|
0007dc e5c10001 STRB r0,[r1,#1] ; NF8_Spare_Data
;;;787 NF8_Spare_Data[2]=(Mecc&0xff0000)>>16;
0007e0 e1a00404 MOV r0,r4,LSL #8
0007e4 e1a00c20 MOV r0,r0,LSR #24
0007e8 e59f10b0 LDR r1,|L1.2208|
0007ec e5c10002 STRB r0,[r1,#2] ; NF8_Spare_Data
;;;788 NF8_Spare_Data[3]=(Mecc&0xff000000)>>24;
0007f0 e1a00c24 MOV r0,r4,LSR #24
0007f4 e59f10a4 LDR r1,|L1.2208|
0007f8 e5c10003 STRB r0,[r1,#3] ; NF8_Spare_Data
;;;789 NF_RDDATA(); // read 4~7
0007fc e3a0044e MOV r0,#0x4e000000
000800 e5900010 LDR r0,[r0,#0x10]
;;;790 Secc=NF_RDDATA();
000804 e3a0044e MOV r0,#0x4e000000
000808 e5905010 LDR r5,[r0,#0x10]
;;;791 rNFSECCD=((Secc&0xff00)<<8)|(Secc&0xff);
00080c e20500ff AND r0,r5,#0xff
000810 e2051cff AND r1,r5,#0xff00
000814 e1800401 ORR r0,r0,r1,LSL #8
000818 e3a0144e MOV r1,#0x4e000000
00081c e581001c STR r0,[r1,#0x1c]
;;;792 NF8_Spare_Data[8]=Secc&0xff;
000820 e59f0078 LDR r0,|L1.2208|
000824 e5c05008 STRB r5,[r0,#8] ; NF8_Spare_Data
;;;793 NF8_Spare_Data[9]=(Secc&0xff00)>>8;
000828 e1a00805 MOV r0,r5,LSL #16
00082c e1a00c20 MOV r0,r0,LSR #24
000830 e59f1068 LDR r1,|L1.2208|
000834 e5c10009 STRB r0,[r1,#9] ; NF8_Spare_Data
;;;794 NF8_Spare_Data[10]=(Secc&0xff0000)>>16;
000838 e1a00405 MOV r0,r5,LSL #8
00083c e1a00c20 MOV r0,r0,LSR #24
000840 e59f1058 LDR r1,|L1.2208|
000844 e5c1000a STRB r0,[r1,#0xa] ; NF8_Spare_Data
;;;795 NF8_Spare_Data[11]=(Secc&0xff000000)>>24;
000848 e1a00c25 MOV r0,r5,LSR #24
00084c e59f104c LDR r1,|L1.2208|
000850 e5c1000b STRB r0,[r1,#0xb] ; NF8_Spare_Data
;;;796 NF_nFCE_H();
000854 e3a0044e MOV r0,#0x4e000000
000858 e5900004 LDR r0,[r0,#4]
00085c e3800002 ORR r0,r0,#2
000860 e3a0144e MOV r1,#0x4e000000
000864 e5810004 STR r0,[r1,#4]
;;;797
;;;798 if ((rNFESTAT0&0xf) == 0x0){
000868 e3a0044e MOV r0,#0x4e000000
00086c e5900024 LDR r0,[r0,#0x24]
000870 e310000f TST r0,#0xf
000874 1a000003 BNE |L1.2184|
;;;799 Uart_Printf("ECC OK!\n");
000878 e28f0024 ADR r0,|L1.2212|
00087c ebfffffe BL Uart_Printf
;;;800 return OK;
000880 e3a00001 MOV r0,#1
;;;801 }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -