📄 k9d1g08.txt
字号:
0002b0 e3a00070 MOV r0,#0x70
0002b4 e51f112c LDR r1,|L1.400|
0002b8 e5810008 STR r0,[r1,#8]
;;;393
;;;394 for(i=0;i<3;i++); //twhr=60ns////??????
0002bc e3a04000 MOV r4,#0
|L1.704|
0002c0 e3540003 CMP r4,#3
0002c4 aa000001 BGE |L1.720|
0002c8 e2844001 ADD r4,r4,#1
0002cc eafffffb B |L1.704|
;;;395
;;;396 if (NF_RDDATA()&0x1) // Spare arrray write error
|L1.720|
0002d0 e51f0148 LDR r0,|L1.400|
0002d4 e5900010 LDR r0,[r0,#0x10]
0002d8 e3100001 TST r0,#1
0002dc 0a000007 BEQ |L1.768|
;;;397 {
;;;398 NF_nFCE_H();
0002e0 e51f0158 LDR r0,|L1.400|
0002e4 e5900004 LDR r0,[r0,#4]
0002e8 e3800080 ORR r0,r0,#0x80
0002ec e51f1164 LDR r1,|L1.400|
0002f0 e5810004 STR r0,[r1,#4]
;;;399 Uart_Printf("[Program error is occurred but ignored]\n");
0002f4 e28f0030 ADR r0,|L1.812|
0002f8 ebfffffe BL _printf
0002fc ea000004 B |L1.788|
;;;400 }
;;;401 else
;;;402 {
;;;403 NF_nFCE_H();
|L1.768|
000300 e51f0178 LDR r0,|L1.400|
000304 e5900004 LDR r0,[r0,#4]
000308 e3800080 ORR r0,r0,#0x80
00030c e51f1184 LDR r1,|L1.400|
000310 e5810004 STR r0,[r1,#4]
;;;404 }
;;;405
;;;406 Uart_Printf("[block #%d is marked as a bad block]\n",block);
|L1.788|
000314 e1a01006 MOV r1,r6
000318 e28f0038 ADR r0,|L1.856|
00031c ebfffffe BL _printf
;;;407 return 1;
000320 e3a00001 MOV r0,#1
;;;408 }
000324 e8bd8070 LDMFD sp!,{r4-r6,pc}
|L1.808|
000328 00000000 DCD ||.data$0||
|L1.812|
00032c 6f72505b DCB "[Pro"
000330 6d617267 DCB "gram"
000334 72726520 DCB " err"
000338 6920726f DCB "or i"
00033c 636f2073 DCB "s oc"
000340 72727563 DCB "curr"
000344 62206465 DCB "ed b"
000348 69207475 DCB "ut i"
00034c 726f6e67 DCB "gnor"
000350 0a5d6465 DCB "ed]\n"
000354 00000000 DCB "\0\0\0\0"
|L1.856|
000358 6f6c625b DCB "[blo"
00035c 23206b63 DCB "ck #"
000360 69206425 DCB "%d i"
000364 616d2073 DCB "s ma"
000368 64656b72 DCB "rked"
00036c 20736120 DCB " as "
000370 61622061 DCB "a ba"
000374 6c622064 DCB "d bl"
000378 5d6b636f DCB "ock]"
00037c 0000000a DCB "\n\0\0\0"
ENDP
NF_WritePage PROC
;;;492 static int NF_WritePage(U32 block,U32 page,U8 *buffer)
;;;493 {
000380 e92d43f8 STMFD sp!,{r3-r9,lr}
000384 e1a05000 MOV r5,r0
000388 e1a08001 MOV r8,r1
00038c e1a07002 MOV r7,r2
;;;494 int i;
;;;495 U32 blockPage=(block<<5)+page;
000390 e0886285 ADD r6,r8,r5,LSL #5
;;;496 U8 *bufPt=buffer;
000394 e1a09007 MOV r9,r7
;;;497
;;;498 // Port setting for SMC_WP
;;;499 rGPCON_L = (rGPCON_L & ~(0x3<<2))|(0x1<<2);
000398 e59f0294 LDR r0,|L1.1588|
00039c e5900008 LDR r0,[r0,#8]
0003a0 e3c0000c BIC r0,r0,#0xc
0003a4 e3800004 ORR r0,r0,#4
0003a8 e59f1284 LDR r1,|L1.1588|
0003ac e5810008 STR r0,[r1,#8]
;;;500 rGPDAT |=(1<<1);
0003b0 e1a00001 MOV r0,r1
0003b4 e590000c LDR r0,[r0,#0xc]
0003b8 e3800002 ORR r0,r0,#2
0003bc e581000c STR r0,[r1,#0xc]
;;;501
;;;502 NF_RSTECC(); // Initialize ECC
0003c0 e24107f0 SUB r0,r1,#0x3c00000
0003c4 e5900004 LDR r0,[r0,#4]
0003c8 e3800f40 ORR r0,r0,#0x100
0003cc e24117f0 SUB r1,r1,#0x3c00000
0003d0 e5810004 STR r0,[r1,#4]
;;;503
;;;504 NF_MECC_UnLock();
0003d4 e1a00001 MOV r0,r1
0003d8 e5900004 LDR r0,[r0,#4]
0003dc e3c00f80 BIC r0,r0,#0x200
0003e0 e5810004 STR r0,[r1,#4]
;;;505
;;;506 NF_CLRRnB();
0003e4 e1a00001 MOV r0,r1
0003e8 e590002c LDR r0,[r0,#0x2c]
0003ec e3800d80 ORR r0,r0,#0x2000
0003f0 e581002c STR r0,[r1,#0x2c]
;;;507 NF_nFCE_L();
0003f4 e1a00001 MOV r0,r1
0003f8 e5900004 LDR r0,[r0,#4]
0003fc e3c00080 BIC r0,r0,#0x80
000400 e5810004 STR r0,[r1,#4]
;;;508
;;;509
;;;510 NF_CMD(0x0);// for programming 'A' area
000404 e3a00000 MOV r0,#0
000408 e1c11000 BIC r1,r1,r0
00040c e5810008 STR r0,[r1,#8]
;;;511 NF_CMD(0x80); // Write 1st command
000410 e3a00080 MOV r0,#0x80
000414 e1c11000 BIC r1,r1,r0
000418 e5810008 STR r0,[r1,#8]
;;;512 NF_ADDR(0); // Column 0
00041c e3a00000 MOV r0,#0
000420 e1c11000 BIC r1,r1,r0
000424 e581000c STR r0,[r1,#0xc]
;;;513 NF_ADDR(blockPage&0xff); //
000428 e20600ff AND r0,r6,#0xff
00042c e581000c STR r0,[r1,#0xc]
;;;514 NF_ADDR((blockPage>>8)&0xff); // Block & page num.
000430 e1a00806 MOV r0,r6,LSL #16
000434 e1a00c20 MOV r0,r0,LSR #24
000438 e581000c STR r0,[r1,#0xc]
;;;515 NF_ADDR((blockPage>>16)&0xff); //
00043c e1a00406 MOV r0,r6,LSL #8
000440 e1a00c20 MOV r0,r0,LSR #24
000444 e581000c STR r0,[r1,#0xc]
;;;516
;;;517 #if 0
;;;518
;;;519 //data write into main data area
;;;520
;;;521 for(i=0;i<512;i++)
;;;522 {
;;;523 NF_WRDATA(*bufPt++);
;;;524 }
;;;525
;;;526
;;;527 #elif 1
;;;528 //DMA
;;;529
;;;530 // rINTMSK=~(BIT_DMA);
;;;531 // rINTSUBMSK=~(BIT_SUB_DMA0);
;;;532 rSUBSRCPND=BIT_SUB_DMA0;
000448 e3a00780 MOV r0,#0x2000000
00044c e24118a0 SUB r1,r1,#0xa00000
000450 e5810018 STR r0,[r1,#0x18]
;;;533
;;;534 rDISRC0=(unsigned)bufPt;
000454 e1a07009 MOV r7,r9
000458 e28005f9 ADD r0,r0,#0x3e400000
00045c e5809000 STR r9,[r0,#0]
;;;535 rDISRCC0=(0<<1)|(0<<0); //arc=AHB,src_addr=inc
000460 e3a00000 MOV r0,#0
000464 e2811980 ADD r1,r1,#0x200000
000468 e5810004 STR r0,[r1,#4]
;;;536 rDIDST0=0x40c00010; //NF_WRDATA()
00046c e51f02dc LDR r0,|L1.408|
000470 e0011000 AND r1,r1,r0
000474 e5810008 STR r0,[r1,#8]
;;;537 rDIDSTC0=(0<<1)|(1<<0); //dst=AHB,dst_addr=fix;
000478 e3a00001 MOV r0,#1
00047c e1c11000 BIC r1,r1,r0
000480 e581000c STR r0,[r1,#0xc]
;;;538 rDCON0=(1<<31)|(1<<30)|(1<<29)|(0<<28)|(1<<27)|(0<<23)|(1<<22)|(0<<20)|(512);
000484 e51f02f0 LDR r0,|L1.412|
000488 e0011000 AND r1,r1,r0
00048c e5810010 STR r0,[r1,#0x10]
;;;539 //Handshake,AHB,interrupt,(UNIT),whole,S/W,no_autoreload,Byte,count=512;
;;;540
;;;541 rDMASKTRIG0=(1<<1)|(1<<0);
000490 e3a00003 MOV r0,#3
000494 e1c11000 BIC r1,r1,r0
000498 e5810020 STR r0,[r1,#0x20]
;;;542
;;;543 // while(dmaDone==0);
;;;544
;;;545 // rINTSUBMSK=BIT_ALLMSK;
;;;546 // rINTMSK=BIT_ALLMSK;
;;;547
;;;548 while(!(rSUBSRCPND & BIT_SUB_DMA0));
00049c e1a00000 NOP
|L1.1184|
0004a0 e51f0314 LDR r0,|L1.404|
0004a4 e5900018 LDR r0,[r0,#0x18]
0004a8 e3100780 TST r0,#0x2000000
0004ac 0afffffb BEQ |L1.1184|
;;;549 rSUBSRCPND=BIT_SUB_DMA0;
0004b0 e3a00780 MOV r0,#0x2000000
0004b4 e51f1328 LDR r1,|L1.404|
0004b8 e5810018 STR r0,[r1,#0x18]
;;;550
;;;551 // while(!(rNF_STAT&(1<<10)));
;;;552
;;;553 #elif 0
;;;554 __WrPage512(bufPt);
;;;555 #endif
;;;556
;;;557 NF_MECC_Lock();
0004bc e28005fb ADD r0,r0,#0x3ec00000
0004c0 e5900004 LDR r0,[r0,#4]
0004c4 e3800f80 ORR r0,r0,#0x200
0004c8 e28118a0 ADD r1,r1,#0xa00000
0004cc e5810004 STR r0,[r1,#4]
;;;558
;;;559 #if ECC_CHECK
;;;560 //ECC generation from main area ECC status.
;;;561
;;;562 seBuf[0]=rNFMECC0&0xff;
0004d0 e1a00001 MOV r0,r1
0004d4 e5900038 LDR r0,[r0,#0x38]
0004d8 e51f11b8 LDR r1,|L1.808|
0004dc e5c10000 STRB r0,[r1,#0] ; seBuf
;;;563 seBuf[1]=(rNFMECC0>>8)&0xff;
0004e0 e51f0358 LDR r0,|L1.400|
0004e4 e5900038 LDR r0,[r0,#0x38]
0004e8 e1a00800 MOV r0,r0,LSL #16
0004ec e1a00c20 MOV r0,r0,LSR #24
0004f0 e51f11d0 LDR r1,|L1.808|
0004f4 e5c10001 STRB r0,[r1,#1] ; seBuf
;;;564 seBuf[2]=(rNFMECC0>>16)&0xff;
0004f8 e51f0370 LDR r0,|L1.400|
0004fc e5900038 LDR r0,[r0,#0x38]
000500 e1a00400 MOV r0,r0,LSL #8
000504 e1a00c20 MOV r0,r0,LSR #24
000508 e51f11e8 LDR r1,|L1.808|
00050c e5c10002 STRB r0,[r1,#2] ; seBuf
;;;565 seBuf[3]=(rNFMECC0>>24)&0xff;
000510 e51f0388 LDR r0,|L1.400|
000514 e5900038 LDR r0,[r0,#0x38]
000518 e1a00c20 MOV r0,r0,LSR #24
00051c e51f11fc LDR r1,|L1.808|
000520 e5c10003 STRB r0,[r1,#3] ; seBuf
;;;566 seBuf[5]=0xff; // Marking good block
000524 e3a000ff MOV r0,#0xff
000528 e51f1208 LDR r1,|L1.808|
00052c e5c10005 STRB r0,[r1,#5] ; seBuf
;;;567 /*
;;;568 // ECC generation from spare area ECC status.
;;;569 seBuf[?]=rNFSECC&0xff;
;;;570 seBuf[?]=(rNFSECC>>8)&0xff;
;;;571 seBuf[5]=0xff; // Marking good block
;;;572
;;;573 //write spare ECC into another spare area
;;;574 */
;;;575 //write ECC into spare area
;;;576 //write spare ECC into another spare area
;;;577
;;;578 for(i=0;i<16;i++)
000530 e3a04000 MOV r4,#0
|L1.1332|
000534 e3540010 CMP r4,#0x10
000538 aa000007 BGE |L1.1372|
00053c ea000001 B |L1.1352|
|L1.1344|
000540 e2844001 ADD r4,r4,#1
000544 eafffffa B |L1.1332|
;;;579 {
;;;580 NF_WRDATA(seBuf[i]);
|L1.1352|
000548 e51f0228 LDR r0,|L1.808|
00054c e7d00004 LDRB r0,[r0,r4]
000550 e51f13c8 LDR r1,|L1.400|
000554 e5810010 STR r0,[r1,#0x10]
;;;581 }
000558 eafffff8 B |L1.1344|
;;;582 #endif
;;;583
;;;584
;;;585 NF_CMD(0x10); // Write 2nd command
|L1.1372|
00055c e3a00010 MOV r0,#0x10
000560 e51f13d8 LDR r1,|L1.400|
000564 e5810008 STR r0,[r1,#8]
;;;586
;;;587 for(i=0;i<10;i++);
000568 e3a04000 MOV r4,#0
|L1.1388|
00056c e354000a CMP r4,#0xa
000570 aa000001 BGE |L1.1404|
000574 e2844001 ADD r4,r4,#1
000578 eafffffb B |L1.1388|
;;;588
;;;589 NF_TRANSRnB(); //wait tPROG 200~500us;
|L1.1404|
00057c e1a00000 NOP
|L1.1408|
000580 e51f03f8 LDR r0,|L1.400|
000584 e590002c LDR r0,[r0,#0x2c]
000588 e3100d80 TST r0,#0x2000
00058c 0afffffb BEQ |L1.1408|
;;;590
;;;591
;;;592 NF_CMD(0x70); // Read status command
000590 e3a00070 MOV r0,#0x70
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -