📄 k9d1g08.txt
字号:
000594 e51f140c LDR r1,|L1.400|
000598 e5810008 STR r0,[r1,#8]
;;;593
;;;594 for(i=0;i<3;i++);
00059c e3a04000 MOV r4,#0
|L1.1440|
0005a0 e3540003 CMP r4,#3
0005a4 aa000001 BGE |L1.1456|
0005a8 e2844001 ADD r4,r4,#1
0005ac eafffffb B |L1.1440|
;;;595
;;;596
;;;597 if (NF_RDDATA()&0x1) // Page write error
|L1.1456|
0005b0 e51f0428 LDR r0,|L1.400|
0005b4 e5900010 LDR r0,[r0,#0x10]
0005b8 e3100001 TST r0,#1
0005bc 0a000010 BEQ |L1.1540|
;;;598 {
;;;599 NF_nFCE_H();
0005c0 e51f0438 LDR r0,|L1.400|
0005c4 e5900004 LDR r0,[r0,#4]
0005c8 e3800080 ORR r0,r0,#0x80
0005cc e51f1444 LDR r1,|L1.400|
0005d0 e5810004 STR r0,[r1,#4]
;;;600 Uart_Printf("[PROGRAM_ERROR:block#=%d]\n",block);
0005d4 e1a01005 MOV r1,r5
0005d8 e28f0058 ADR r0,|L1.1592|
0005dc ebfffffe BL _printf
;;;601 NF_MarkBadBlock(block);
0005e0 e1a00005 MOV r0,r5
0005e4 ebfffffe BL NF_MarkBadBlock
;;;602 rGPCON_L = (rGPCON_L & ~(0x3<<2))|(0x3<<2);
0005e8 e59f0044 LDR r0,|L1.1588|
0005ec e5900008 LDR r0,[r0,#8]
0005f0 e380000c ORR r0,r0,#0xc
0005f4 e59f1038 LDR r1,|L1.1588|
0005f8 e5810008 STR r0,[r1,#8]
;;;603 return 0;
0005fc e3a00000 MOV r0,#0
;;;604 }
;;;605 else
;;;606 {
;;;607
;;;608 NF_nFCE_H();
;;;609 // Uart_Printf("[PROGRAM_OK:block#=%d]\n",block);
;;;610 rGPCON_L = (rGPCON_L & ~(0x3<<2))|(0x3<<2);
;;;611 return 1;
;;;612 }
;;;613 }
|L1.1536|
000600 e8bd83f8 LDMFD sp!,{r3-r9,pc}
|L1.1540|
000604 e51f047c LDR r0,|L1.400| ;608
000608 e5900004 LDR r0,[r0,#4] ;608
00060c e3800080 ORR r0,r0,#0x80 ;608
000610 e51f1488 LDR r1,|L1.400| ;608
000614 e5810004 STR r0,[r1,#4] ;608
000618 e28107f0 ADD r0,r1,#0x3c00000 ;610
00061c e5900008 LDR r0,[r0,#8] ;610
000620 e380000c ORR r0,r0,#0xc ;610
000624 e28117f0 ADD r1,r1,#0x3c00000 ;610
000628 e5810008 STR r0,[r1,#8] ;610
00062c e3a00001 MOV r0,#1 ;611
000630 eafffff2 B |L1.1536| ;611
|L1.1588|
000634 44800000 DCD 0x44800000 ;611
|L1.1592|
000638 4f52505b DCB "[PRO" ;611
00063c 4d415247 DCB "GRAM" ;611
000640 5252455f DCB "_ERR" ;611
000644 623a524f DCB "OR:b" ;611
000648 6b636f6c DCB "lock" ;611
00064c 64253d23 DCB "#=%d" ;611
000650 00000a5d DCB "]\n\0\0" ;611
ENDP
NF_EraseBlock PROC
;;;310 static int NF_EraseBlock(U32 block)
;;;311 {
000654 e92d4070 STMFD sp!,{r4-r6,lr}
000658 e1a04000 MOV r4,r0
;;;312 U32 blockPage;
;;;313 int i;
;;;314
;;;315 // Port setting for SMC_WP
;;;316 rGPCON_L = (rGPCON_L & ~(0x3<<2))|(0x1<<2);
00065c e51f0030 LDR r0,|L1.1588|
000660 e5900008 LDR r0,[r0,#8]
000664 e3c0000c BIC r0,r0,#0xc
000668 e3800004 ORR r0,r0,#4
00066c e51f1040 LDR r1,|L1.1588|
000670 e5810008 STR r0,[r1,#8]
;;;317 rGPDAT |=(1<<1);
000674 e1a00001 MOV r0,r1
000678 e590000c LDR r0,[r0,#0xc]
00067c e3800002 ORR r0,r0,#2
000680 e581000c STR r0,[r1,#0xc]
;;;318
;;;319
;;;320 blockPage=(block<<5);
000684 e1a05284 MOV r5,r4,LSL #5
;;;321
;;;322 NF_nFCE_L();
000688 e24107f0 SUB r0,r1,#0x3c00000
00068c e5900004 LDR r0,[r0,#4]
000690 e3c00080 BIC r0,r0,#0x80
000694 e24117f0 SUB r1,r1,#0x3c00000
000698 e5810004 STR r0,[r1,#4]
;;;323
;;;324 NF_CMD(0x60); // Erase one block 1st command
00069c e3a00060 MOV r0,#0x60
0006a0 e1c11000 BIC r1,r1,r0
0006a4 e5810008 STR r0,[r1,#8]
;;;325
;;;326 NF_ADDR(blockPage&0xff); // Page number=0
0006a8 e20500ff AND r0,r5,#0xff
0006ac e581000c STR r0,[r1,#0xc]
;;;327 NF_ADDR((blockPage>>8)&0xff);
0006b0 e1a00805 MOV r0,r5,LSL #16
0006b4 e1a00c20 MOV r0,r0,LSR #24
0006b8 e581000c STR r0,[r1,#0xc]
;;;328 NF_ADDR((blockPage>>16)&0xff);
0006bc e1a00405 MOV r0,r5,LSL #8
0006c0 e1a00c20 MOV r0,r0,LSR #24
0006c4 e581000c STR r0,[r1,#0xc]
;;;329
;;;330 NF_CLRRnB();
0006c8 e1a00001 MOV r0,r1
0006cc e590002c LDR r0,[r0,#0x2c]
0006d0 e3800d80 ORR r0,r0,#0x2000
0006d4 e581002c STR r0,[r1,#0x2c]
;;;331 NF_CMD(0xd0); // Erase one blcok 2nd command
0006d8 e3a000d0 MOV r0,#0xd0
0006dc e1c11000 BIC r1,r1,r0
0006e0 e5810008 STR r0,[r1,#8]
;;;332 for(i=0;i<10;i++); //wait tWB(100ns)//??????
0006e4 e3a06000 MOV r6,#0
|L1.1768|
0006e8 e356000a CMP r6,#0xa
0006ec aa000001 BGE |L1.1784|
0006f0 e2866001 ADD r6,r6,#1
0006f4 eafffffb B |L1.1768|
;;;333 NF_TRANSRnB(); // Wait tBERS max 3ms.
|L1.1784|
0006f8 e1a00000 NOP
|L1.1788|
0006fc e51f0574 LDR r0,|L1.400|
000700 e590002c LDR r0,[r0,#0x2c]
000704 e3100d80 TST r0,#0x2000
000708 0afffffb BEQ |L1.1788|
;;;334 NF_CMD(0x70); // Read status command
00070c e3a00070 MOV r0,#0x70
000710 e51f1588 LDR r1,|L1.400|
000714 e5810008 STR r0,[r1,#8]
;;;335
;;;336
;;;337 if (NF_RDDATA()&0x1) // Erase error
000718 e1c10000 BIC r0,r1,r0
00071c e5900010 LDR r0,[r0,#0x10]
000720 e3100001 TST r0,#1
000724 0a00000f BEQ |L1.1896|
;;;338 {
;;;339 NF_nFCE_H();
000728 e1a00001 MOV r0,r1
00072c e5900004 LDR r0,[r0,#4]
000730 e3800080 ORR r0,r0,#0x80
000734 e5810004 STR r0,[r1,#4]
;;;340 Uart_Printf("[ERASE_ERROR:block#=%d]\n",block);
000738 e1a01004 MOV r1,r4
00073c e28f0054 ADR r0,|L1.1944|
000740 ebfffffe BL _printf
;;;341 NF_MarkBadBlock(block);
000744 e1a00004 MOV r0,r4
000748 ebfffffe BL NF_MarkBadBlock
;;;342 rGPCON_L = (rGPCON_L & ~(0x3<<2))|(0x3<<2);
00074c e51f0120 LDR r0,|L1.1588|
000750 e5900008 LDR r0,[r0,#8]
000754 e380000c ORR r0,r0,#0xc
000758 e51f112c LDR r1,|L1.1588|
00075c e5810008 STR r0,[r1,#8]
;;;343 return 0;
000760 e3a00000 MOV r0,#0
;;;344 }
;;;345 else
;;;346 {
;;;347 NF_nFCE_H();
;;;348 rGPCON_L = (rGPCON_L & ~(0x3<<2))|(0x3<<2);
;;;349 return 1;
;;;350 }
;;;351
;;;352 }
|L1.1892|
000764 e8bd8070 LDMFD sp!,{r4-r6,pc}
|L1.1896|
000768 e51f05e0 LDR r0,|L1.400| ;347
00076c e5900004 LDR r0,[r0,#4] ;347
000770 e3800080 ORR r0,r0,#0x80 ;347
000774 e51f15ec LDR r1,|L1.400| ;347
000778 e5810004 STR r0,[r1,#4] ;347
00077c e28107f0 ADD r0,r1,#0x3c00000 ;348
000780 e5900008 LDR r0,[r0,#8] ;348
000784 e380000c ORR r0,r0,#0xc ;348
000788 e28117f0 ADD r1,r1,#0x3c00000 ;348
00078c e5810008 STR r0,[r1,#8] ;348
000790 e3a00001 MOV r0,#1 ;349
000794 eafffff2 B |L1.1892| ;349
|L1.1944|
000798 4152455b DCB "[ERA" ;349
00079c 455f4553 DCB "SE_E" ;349
0007a0 524f5252 DCB "RROR" ;349
0007a4 6f6c623a DCB ":blo" ;349
0007a8 3d236b63 DCB "ck#=" ;349
0007ac 0a5d6425 DCB "%d]\n" ;349
0007b0 00000000 DCB "\0\0\0\0" ;349
ENDP
NF_IsBadBlock PROC
;;;274 static int NF_IsBadBlock(U32 block)
;;;275 {
0007b4 e92d40f8 STMFD sp!,{r3-r7,lr}
0007b8 e1a06000 MOV r6,r0
;;;276 int i;
;;;277 unsigned int blockPage;
;;;278 U8 data;
;;;279
;;;280 blockPage=(block<<5); // For 2'nd cycle I/O[7:5]
0007bc e1a05286 MOV r5,r6,LSL #5
;;;281
;;;282 // NF_RSTECC(); // Reset ECC
;;;283 NF_CLRRnB();
0007c0 e51f0638 LDR r0,|L1.400|
0007c4 e590002c LDR r0,[r0,#0x2c]
0007c8 e3800d80 ORR r0,r0,#0x2000
0007cc e51f1644 LDR r1,|L1.400|
0007d0 e581002c STR r0,[r1,#0x2c]
;;;284 NF_nFCE_L();
0007d4 e1a00001 MOV r0,r1
0007d8 e5900004 LDR r0,[r0,#4]
0007dc e3c00080 BIC r0,r0,#0x80
0007e0 e5810004 STR r0,[r1,#4]
;;;285 NF_CMD(0x50); // Spare array read command
0007e4 e3a00050 MOV r0,#0x50
0007e8 e1c11000 BIC r1,r1,r0
0007ec e5810008 STR r0,[r1,#8]
;;;286 NF_ADDR(517&0xf); // Read the mark of bad block in spare array(M addr=5)
0007f0 e3a00005 MOV r0,#5
0007f4 e1c11000 BIC r1,r1,r0
0007f8 e581000c STR r0,[r1,#0xc]
;;;287 NF_ADDR(blockPage&0xff); // The mark of bad block is in 0 page
0007fc e20500ff AND r0,r5,#0xff
000800 e581000c STR r0,[r1,#0xc]
;;;288 NF_ADDR((blockPage>>8)&0xff); // For block number A[24:17]
000804 e1a00805 MOV r0,r5,LSL #16
000808 e1a00c20 MOV r0,r0,LSR #24
00080c e581000c STR r0,[r1,#0xc]
;;;289 NF_ADDR((blockPage>>16)&0xff); // For block number A[25]
000810 e1a00405 MOV r0,r5,LSL #8
000814 e1a00c20 MOV r0,r0,LSR #24
000818 e581000c STR r0,[r1,#0xc]
;;;290
;;;291 for(i=0;i<10;i++); // wait tWB(100ns) //?????
00081c e3a04000 MOV r4,#0
|L1.2080|
000820 e354000a CMP r4,#0xa
000824 aa000001 BGE |L1.2096|
000828 e2844001 ADD r4,r4,#1
00082c eafffffb B |L1.2080|
;;;292
;;;293 NF_TRANSRnB(); // Wait tR(max 12us)
|L1.2096|
000830 e1a00000 NOP
|L1.2100|
000834 e51f06ac LDR r0,|L1.400|
000838 e590002c LDR r0,[r0,#0x2c]
00083c e3100d80 TST r0,#0x2000
000840 0afffffb BEQ |L1.2100|
;;;294
;;;295 data=NF_RDDATA();
000844 e51f06bc LDR r0,|L1.400|
000848 e5900010 LDR r0,[r0,#0x10]
00084c e20070ff AND r7,r0,#0xff
;;;296
;;;297 NF_nFCE_H();
000850 e51f06c8 LDR r0,|L1.400|
000854 e5900004 LDR r0,[r0,#4]
000858 e3800080 ORR r0,r0,#0x80
00085c e51f16d4 LDR r1,|L1.400|
000860 e5810004 STR r0,[r1,#4]
;;;298
;;;299 if(data!=0xff)
000864 e35700ff CMP r7,#0xff
000868 0a000005 BEQ |L1.2180|
;;;300 {
;;;301 Uart_Printf("[block %d has been marked as a bad block(%x)]\n",block,data);
00086c e1a02007 MOV r2,r7
000870 e1a01006 MOV r1,r6
000874 e28f0010 ADR r0,|L1.2188|
000878 ebfffffe BL _printf
;;;302 return 1;
00087c e3a00001 MOV r0,#1
;;;303 }
;;;304 else
;;;305 {
;;;306 return 0;
;;;307 }
;;;308 }
|L1.2176|
000880 e8bd80f8 LDMFD sp!,{r3-r7,pc}
|L1.2180|
000884 e3a00000 MOV r0,#0 ;306
000888 eafffffc B |L1.2176| ;306
|L1.2188|
00088c 6f6c625b DCB "[blo" ;306
000890 25206b63 DCB "ck %" ;306
000894 61682064 DCB "d ha" ;306
000898 65622073 DCB "s be" ;306
00089c 6d206e65 DCB "en m" ;306
0008a0 656b7261 DCB "arke" ;306
0008a4 73612064 DCB "d as" ;306
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -