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