📄 nand.txt
字号:
000b94 e5810004 STR r0,[r1,#4]
;;;707 Uart_Printf("[Program error is occurred but ignored]\n");
000b98 e28f0030 ADR r0,|L1.3024|
000b9c ebfffffe BL Uart_Printf
000ba0 ea000004 B |L1.3000|
;;;708 }
;;;709 else
;;;710 {
;;;711 NF_nFCE_H();
|L1.2980|
000ba4 e3a0044e MOV r0,#0x4e000000
000ba8 e5900004 LDR r0,[r0,#4]
000bac e3800002 ORR r0,r0,#2
000bb0 e3a0144e MOV r1,#0x4e000000
000bb4 e5810004 STR r0,[r1,#4]
;;;712 }
;;;713
;;;714 Uart_Printf("[block #%d is marked as a bad block]\n",block);
|L1.3000|
000bb8 e1a01006 MOV r1,r6
000bbc e28f0038 ADR r0,|L1.3068|
000bc0 ebfffffe BL Uart_Printf
;;;715 return OK;
000bc4 e3a00001 MOV r0,#1
;;;716 }
000bc8 e8bd8070 LDMFD sp!,{r4-r6,pc}
|L1.3020|
000bcc 00000000 DCD ||.data$0||
|L1.3024|
000bd0 6f72505b DCB "[Pro"
000bd4 6d617267 DCB "gram"
000bd8 72726520 DCB " err"
000bdc 6920726f DCB "or i"
000be0 636f2073 DCB "s oc"
000be4 72727563 DCB "curr"
000be8 62206465 DCB "ed b"
000bec 69207475 DCB "ut i"
000bf0 726f6e67 DCB "gnor"
000bf4 0a5d6465 DCB "ed]\n"
000bf8 00000000 DCB "\0\0\0\0"
|L1.3068|
000bfc 6f6c625b DCB "[blo"
000c00 23206b63 DCB "ck #"
000c04 69206425 DCB "%d i"
000c08 616d2073 DCB "s ma"
000c0c 64656b72 DCB "rked"
000c10 20736120 DCB " as "
000c14 61622061 DCB "a ba"
000c18 6c622064 DCB "d bl"
000c1c 5d6b636f DCB "ock]"
000c20 0000000a DCB "\n\0\0\0"
ENDP
NF8_WritePage PROC
;;;811 static int NF8_WritePage(U32 block,U32 page,U8 *buffer)
;;;812 {
000c24 e92d4ff8 STMFD sp!,{r3-r11,lr}
000c28 e1a06000 MOV r6,r0
000c2c e1a0a001 MOV r10,r1
000c30 e1a09002 MOV r9,r2
;;;813 int i;
;;;814 U32 blockPage, Mecc, Secc;
;;;815 U8 *bufPt=buffer;
000c34 e1a0b009 MOV r11,r9
;;;816
;;;817 NFConDone=0;
000c38 e3a00000 MOV r0,#0
000c3c e51f18a8 LDR r1,|L1.924|
000c40 e5810000 STR r0,[r1,#0] ; NFConDone
;;;818 rNFCONT|=(1<<9);
000c44 e3a0044e MOV r0,#0x4e000000
000c48 e5900004 LDR r0,[r0,#4]
000c4c e3800f80 ORR r0,r0,#0x200
000c50 e3a0144e MOV r1,#0x4e000000
000c54 e5810004 STR r0,[r1,#4]
;;;819 rNFCONT|=(1<<10);
000c58 e3a0044e MOV r0,#0x4e000000
000c5c e5900004 LDR r0,[r0,#4]
000c60 e3800e40 ORR r0,r0,#0x400
000c64 e3a0144e MOV r1,#0x4e000000
000c68 e5810004 STR r0,[r1,#4]
;;;820 pISR_NFCON= (unsigned)NFCon_Int;
000c6c e51f0730 LDR r0,|L1.1348|
000c70 e51f1730 LDR r1,|L1.1352|
000c74 e5810f80 STR r0,[r1,#0xf80]
;;;821 rSRCPND=BIT_NFCON;
000c78 e3a00740 MOV r0,#0x1000000
000c7c e3a0144a MOV r1,#0x4a000000
000c80 e5810000 STR r0,[r1,#0]
;;;822 rINTMSK=~(BIT_NFCON);
000c84 e3e00740 MVN r0,#0x1000000
000c88 e3a0144a MOV r1,#0x4a000000
000c8c e5810008 STR r0,[r1,#8]
;;;823
;;;824 NF_RSTECC(); // Initialize ECC
000c90 e3a0044e MOV r0,#0x4e000000
000c94 e5900004 LDR r0,[r0,#4]
000c98 e3800010 ORR r0,r0,#0x10
000c9c e3a0144e MOV r1,#0x4e000000
000ca0 e5810004 STR r0,[r1,#4]
;;;825 NF_MECC_UnLock();
000ca4 e3a0044e MOV r0,#0x4e000000
000ca8 e5900004 LDR r0,[r0,#4]
000cac e3c00020 BIC r0,r0,#0x20
000cb0 e3a0144e MOV r1,#0x4e000000
000cb4 e5810004 STR r0,[r1,#4]
;;;826 blockPage=(block<<5)+page;
000cb8 e08a7286 ADD r7,r10,r6,LSL #5
;;;827
;;;828 NF_nFCE_L();
000cbc e3a0044e MOV r0,#0x4e000000
000cc0 e5900004 LDR r0,[r0,#4]
000cc4 e3c00002 BIC r0,r0,#2
000cc8 e3a0144e MOV r1,#0x4e000000
000ccc e5810004 STR r0,[r1,#4]
;;;829 NF_CMD(0x0);//??????
000cd0 e3a00000 MOV r0,#0
000cd4 e3a0144e MOV r1,#0x4e000000
000cd8 e5810008 STR r0,[r1,#8]
;;;830 NF_CMD(0x80); // Write 1st command
000cdc e3a00080 MOV r0,#0x80
000ce0 e3a0144e MOV r1,#0x4e000000
000ce4 e5810008 STR r0,[r1,#8]
;;;831 NF_ADDR(0); // Column 0
000ce8 e3a00000 MOV r0,#0
000cec e3a0144e MOV r1,#0x4e000000
000cf0 e581000c STR r0,[r1,#0xc]
;;;832 NF_ADDR(blockPage&0xff); //
000cf4 e20700ff AND r0,r7,#0xff
000cf8 e3a0144e MOV r1,#0x4e000000
000cfc e581000c STR r0,[r1,#0xc]
;;;833 NF_ADDR((blockPage>>8)&0xff); // Block & page num.
000d00 e1a00807 MOV r0,r7,LSL #16
000d04 e1a00c20 MOV r0,r0,LSR #24
000d08 e3a0144e MOV r1,#0x4e000000
000d0c e581000c STR r0,[r1,#0xc]
;;;834 NF_ADDR((blockPage>>16)&0xff); //
000d10 e1a00407 MOV r0,r7,LSL #8
000d14 e1a00c20 MOV r0,r0,LSR #24
000d18 e3a0144e MOV r1,#0x4e000000
000d1c e581000c STR r0,[r1,#0xc]
;;;835
;;;836
;;;837 #if TRANS_MODE==C_LANG
;;;838
;;;839 for(i=0;i<512;i++) {
;;;840 NF_WRDATA8(*bufPt++); // Write one page to NFM from buffer
;;;841 }
;;;842 #elif TRANS_MODE==DMA
;;;843
;;;844 // Memory to Nand dma setting
;;;845 rSRCPND=BIT_DMA0; // Init DMA src pending.
000d20 e3a00b80 MOV r0,#0x20000
000d24 e3a0144a MOV r1,#0x4a000000
000d28 e5810000 STR r0,[r1,#0]
;;;846 rDISRC0=(unsigned)bufPt; // Nand flash data register
000d2c e1a0900b MOV r9,r11
000d30 e3a0044b MOV r0,#0x4b000000
000d34 e580b000 STR r11,[r0,#0]
;;;847 rDISRCC0=(0<<1) | (0<<0); //arc=AHB,src_addr=inc
000d38 e3a00000 MOV r0,#0
000d3c e3a0144b MOV r1,#0x4b000000
000d40 e5810004 STR r0,[r1,#4]
;;;848 rDIDST0=NFDATA;
000d44 e51f04b4 LDR r0,|L1.2200|
000d48 e3a0144b MOV r1,#0x4b000000
000d4c e5810008 STR r0,[r1,#8]
;;;849 rDIDSTC0=(0<<1) | (1<<0); //dst=AHB,dst_addr=fix;
000d50 e3a00001 MOV r0,#1
000d54 e3a0144b MOV r1,#0x4b000000
000d58 e581000c STR r0,[r1,#0xc]
;;;850 rDCON0=(1<<31)|(1<<30)|(1<<29)|(0<<28)|(1<<27)|(0<<23)|(1<<22)|(2<<20)|(512/4);
000d5c e59f023c LDR r0,|L1.4000|
000d60 e3a0144b MOV r1,#0x4b000000
000d64 e5810010 STR r0,[r1,#0x10]
;;;851 // only unit transfer in writing!!!!
;;;852 //Handshake,AHB,interrupt,(unit),whole,S/W,no_autoreload,word,count=128;
;;;853
;;;854 // DMA on and start.
;;;855 rDMASKTRIG0=(1<<1)|(1<<0);
000d68 e3a00003 MOV r0,#3
000d6c e3a0144b MOV r1,#0x4b000000
000d70 e5810020 STR r0,[r1,#0x20]
;;;856
;;;857 while(!(rSRCPND & BIT_DMA0)); // Wait until Dma transfer is done.
000d74 e1a00000 NOP
|L1.3448|
000d78 e3a0044a MOV r0,#0x4a000000
000d7c e5900000 LDR r0,[r0,#0]
000d80 e3100b80 TST r0,#0x20000
000d84 0afffffb BEQ |L1.3448|
;;;858 rSRCPND=BIT_DMA0;
000d88 e3a00b80 MOV r0,#0x20000
000d8c e3a0144a MOV r1,#0x4a000000
000d90 e5810000 STR r0,[r1,#0]
;;;859 #endif
;;;860 /*
;;;861 NF_MECC_Lock();
;;;862 // Get ECC data.
;;;863 // Spare data for 8bit
;;;864 // byte 0 1 2 3 4 5
;;;865 // ecc [0] [1] [2] [3] x [Bad marking]
;;;866 Mecc = rNFMECC0;
;;;867 se8Buf[0]=(U8)(Mecc&0xff);
;;;868 se8Buf[1]=(U8)((Mecc>>8) & 0xff);
;;;869 se8Buf[2]=(U8)((Mecc>>16) & 0xff);
;;;870 se8Buf[3]=(U8)((Mecc>>24) & 0xff);
;;;871 se8Buf[5]=0xffff; // Marking good block
;;;872
;;;873 //Write extra data(ECC, bad marking)
;;;874 for(i=0;i<16;i++) {
;;;875 NF_WRDATA8(se8Buf[i]); // Write spare array(ECC and Mark)
;;;876 NF8_Spare_Data[i]=se8Buf[i];
;;;877 }
;;;878
;;;879 NF_CLEAR_RB();
;;;880 NF_CMD(0x10); // Write 2nd command
;;;881 NF_DETECT_RB();
;;;882
;;;883 NF_CMD(0x70); // Read status command
;;;884
;;;885 for(i=0;i<3;i++); //twhr=60ns
;;;886
;;;887 if (NF_RDDATA()&0x1) {// Page write error
;;;888
;;;889 Uart_Printf("[PROGRAM_ERROR:block#=%d]\n",block);
;;;890 NF8_MarkBadBlock(block);
;;;891 NF_nFCE_H();
;;;892 return FAIL;
;;;893 } else {
;;;894 NF_nFCE_H();
;;;895 return OK;
;;;896
;;;897 }
;;;898 */
;;;899
;;;900 NF_MECC_Lock();
000d94 e3a0044e MOV r0,#0x4e000000
000d98 e5900004 LDR r0,[r0,#4]
000d9c e3800020 ORR r0,r0,#0x20
000da0 e3a0144e MOV r1,#0x4e000000
000da4 e5810004 STR r0,[r1,#4]
;;;901 // Get ECC data.
;;;902 // Spare data for 8bit
;;;903 // byte 0 1 2 3 4 5 6 7 8 9
;;;904 // ecc [0] [1] [2] [3] x [Bad marking] SECC0 SECC1
;;;905 Mecc = rNFMECC0;
000da8 e3a0044e MOV r0,#0x4e000000
000dac e590502c LDR r5,[r0,#0x2c]
;;;906 se8Buf[0]=(U8)(Mecc&0xff);
000db0 e51f01ec LDR r0,|L1.3020|
000db4 e5c05000 STRB r5,[r0,#0] ; se8Buf
;;;907 se8Buf[1]=(U8)((Mecc>>8) & 0xff);
000db8 e1a00805 MOV r0,r5,LSL #16
000dbc e1a00c20 MOV r0,r0,LSR #24
000dc0 e51f11fc LDR r1,|L1.3020|
000dc4 e5c10001 STRB r0,[r1,#1] ; se8Buf
;;;908 se8Buf[2]=(U8)((Mecc>>16) & 0xff);
000dc8 e1a00405 MOV r0,r5,LSL #8
000dcc e1a00c20 MOV r0,r0,LSR #24
000dd0 e51f120c LDR r1,|L1.3020|
000dd4 e5c10002 STRB r0,[r1,#2] ; se8Buf
;;;909 se8Buf[3]=(U8)((Mecc>>24) & 0xff);
000dd8 e1a00c25 MOV r0,r5,LSR #24
000ddc e51f1218 LDR r1,|L1.3020|
000de0 e5c10003 STRB r0,[r1,#3] ; se8Buf
;;;910 se8Buf[5]=0xff; // Marking good block
000de4 e3a000ff MOV r0,#0xff
000de8 e51f1224 LDR r1,|L1.3020|
000dec e5c10005 STRB r0,[r1,#5] ; se8Buf
;;;911
;;;912 NF_SECC_UnLock();
000df0 e3a0044e MOV r0,#0x4e000000
000df4 e5900004 LDR r0,[r0,#4]
000df8 e3c00040 BIC r0,r0,#0x40
000dfc e3a0144e MOV r1,#0x4e000000
000e00 e5810004 STR r0,[r1,#4]
;;;913 //Write extra data(ECC, bad marking)
;;;914 for(i=0;i<4;i++) {
000e04 e3a04000 MOV r4,#0
|L1.3592|
000e08 e3540004 CMP r4,#4
000e0c aa00000b BGE |L1.3648|
000e10 ea000001 B |L1.3612|
|L1.3604|
000e14 e2844001 ADD r4,r4,#1
000e18 eafffffa B |L1.3592|
;;;915 NF_WRDATA8(se8Buf[i]); // Write spare array(Main ECC)
|L1.3612|
000e1c e51f0258 LDR r0,|L1.3020|
000e20 e7d00004 LDRB r0,[r0,r4]
000e24 e3a0144e MOV r1,#0x4e000000
000e28 e5c10010 STRB r0,[r1,#0x10]
;;;916 NF8_Spare_Data[i]=se8Buf[i];
000e2c e51f0268 LDR r0,|L1.3020|
000e30 e7d00004 LDRB r0,[r0,r4]
000e34 e51f159c LDR r1,|L1.2208|
000e38 e7c10004 STRB r0,[r1,r4]
;;;917 }
000e3c eafffff4 B |L1.3604|
;;;918 NF_SECC_Lock();
|L1.3648|
000e40 e3a0044e MOV r0,#0x4e000000
000e44 e5900004 LDR r0,[r0,#4]
000e48 e3800040 ORR r0,r0,#0x40
000e4c e3a0144e MOV r1,#0x4e000000
000e50 e5810004 STR r0,[r1,#4]
;;;919 Secc=rNFSECC;
000e54 e3a0044e MOV r0,#0x4e000000
000e58 e5908034 LDR r8,[r0,#0x34]
;;;920 s
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -