📄 nand_if.txt
字号:
; generated by ARM/Thumb C/C++ Compiler with , RVCT3.1 [Build 934] for uVision
; commandline ArmCC [--split_sections --debug -c --asm --interleave -o.\Obj\nand_if.o --depend=.\Obj\nand_if.d --device=DARMSTM --apcs=interwork -O3 -I..\..\include -I..\..\..\FWLib\library\inc -I..\..\..\USBLib\library\inc -I..\..\SRAM -I"D:\Program Files\MDK KEIL\ARM\INC\ST\STM32F10x" -D__MICROLIB --omf_browse=.\Obj\nand_if.crf ..\..\source\nand_if.c]
THUMB
AREA ||i.NAND_ConvertPhyAddress||, CODE, READONLY, ALIGN=1
NAND_ConvertPhyAddress PROC
;;;447 static NAND_ADDRESS NAND_ConvertPhyAddress (u32 Address)
;;;448 {
000000 b51c PUSH {r2-r4,lr}
;;;449 NAND_ADDRESS Address_t;
;;;450
;;;451 Address_t.Page = Address & (NAND_BLOCK_SIZE - 1);
000002 f001f001 AND r2,r1,#0x1f
;;;452 Address_t.Block = Address / NAND_BLOCK_SIZE;
000006 0949 LSRS r1,r1,#5
000008 f8adf8ad STRH r1,[sp,#2]
00000c f8adf8ad STRH r2,[sp,#4] ;451
;;;453 Address_t.Zone = 0;
000010 2100 MOVS r1,#0
000012 f8adf8ad STRH r1,[sp,#0]
000016 f44ff44f MOV r2,#0x400
00001a e008 B |L1.46|
|L1.28|
;;;454
;;;455 while (Address_t.Block >= MAX_PHY_BLOCKS_PER_ZONE)
;;;456 {
;;;457 Address_t.Block -= MAX_PHY_BLOCKS_PER_ZONE;
00001c f5a1f5a1 SUB r1,r1,#0x400
000020 f8adf8ad STRH r1,[sp,#2]
;;;458 Address_t.Zone++;
000024 f8bdf8bd LDRH r1,[sp,#0]
000028 1c49 ADDS r1,r1,#1
00002a f8adf8ad STRH r1,[sp,#0]
|L1.46|
00002e f8bdf8bd LDRH r1,[sp,#2] ;455
000032 4291 CMP r1,r2 ;455
000034 d2f2 BCS |L1.28|
;;;459 }
;;;460 return Address_t;
000036 2206 MOVS r2,#6
000038 4669 MOV r1,sp
00003a f7fff7ff BL __aeabi_memcpy
;;;461 }
00003e bd1c POP {r2-r4,pc}
;;;462
ENDP
AREA ||i.ReadSpareArea||, CODE, READONLY, ALIGN=1
ReadSpareArea PROC
;;;323 SPARE_AREA ReadSpareArea (u32 address)
;;;324 {
000000 b510 PUSH {r4,lr}
000002 b088 SUB sp,sp,#0x20
000004 4604 MOV r4,r0
;;;325 SPARE_AREA t;
;;;326 u8 Buffer[16];
;;;327 NAND_ADDRESS address_s;
;;;328 address_s = NAND_ConvertPhyAddress(address);
000006 4668 MOV r0,sp
000008 f7fff7ff BL NAND_ConvertPhyAddress
;;;329 FSMC_NAND_ReadSpareArea(Buffer , address_s, 1) ;
00000c e9dde9dd LDRD r1,r2,[sp,#0]
000010 2301 MOVS r3,#1
000012 a802 ADD r0,sp,#8
000014 f7fff7ff BL FSMC_NAND_ReadSpareArea
;;;330
;;;331 t = *(SPARE_AREA *)Buffer;
000018 e9dde9dd LDRD r0,r1,[sp,#8]
;;;332
;;;333 return t;
00001c e9cde9cd STRD r0,r1,[sp,#0x18]
000020 2206 MOVS r2,#6
000022 a906 ADD r1,sp,#0x18
000024 4620 MOV r0,r4
000026 f7fff7ff BL __aeabi_memcpy
;;;334 }
00002a b008 ADD sp,sp,#0x20
00002c bd10 POP {r4,pc}
;;;335
ENDP
AREA ||i.NAND_BuildLUT||, CODE, READONLY, ALIGN=2
NAND_BuildLUT PROC
;;;471 static u16 NAND_BuildLUT (u8 ZoneNbr)
;;;472 {
000000 e92de92d PUSH {r2-r8,lr}
000004 4680 MOV r8,r0
;;;473
;;;474 u16 pBadBlock, pCurrentBlock, pFreeBlock;
;;;475 SPARE_AREA SpareArea;
;;;476 /*****************************************************************************
;;;477 1st step : Init.
;;;478 *****************************************************************************/
;;;479 /*Init the LUT (assume all blocks free) */
;;;480 for (pCurrentBlock = 0 ; pCurrentBlock < MAX_PHY_BLOCKS_PER_ZONE ; pCurrentBlock++)
000006 2000 MOVS r0,#0
000008 f44ff44f MOV r1,#0x1000
00000c 4e31 LDR r6,|L3.212|
00000e 108f ASRS r7,r1,#2
|L3.16|
;;;481 {
;;;482 LUT[pCurrentBlock] = FREE_BLOCK; /* 12th bit is set to 1 */
000010 f826f826 STRH r1,[r6,r0,LSL #1]
000014 1c40 ADDS r0,r0,#1 ;480
000016 b280 UXTH r0,r0 ;480
000018 42b8 CMP r0,r7 ;480
00001a d3f9 BCC |L3.16|
;;;483 }
;;;484
;;;485 /* Init Pointers */
;;;486 pBadBlock = MAX_PHY_BLOCKS_PER_ZONE - 1;
00001c f240f240 MOV r5,#0x3ff
;;;487 pCurrentBlock = 0;
000020 2400 MOVS r4,#0
|L3.34|
;;;488
;;;489 /*****************************************************************************
;;;490 2nd step : locate used and bad blocks
;;;491 *****************************************************************************/
;;;492
;;;493 while (pCurrentBlock < MAX_PHY_BLOCKS_PER_ZONE)
;;;494 {
;;;495
;;;496 SpareArea = ReadSpareArea(pCurrentBlock * NAND_BLOCK_SIZE + (ZoneNbr * NAND_BLOCK_SIZE * MAX_PHY_BLOCKS_PER_ZONE));
000022 0160 LSLS r0,r4,#5
000024 eb00eb00 ADD r1,r0,r8,LSL #15
000028 4668 MOV r0,sp
00002a f7fff7ff BL ReadSpareArea
;;;497
;;;498 if ((SpareArea.DataStatus == 0) || (SpareArea.BlockStatus == 0))
00002e f8bdf8bd LDRH r0,[sp,#2]
000032 b110 CBZ r0,|L3.58|
000034 f8bdf8bd LDRH r0,[sp,#4]
000038 b9a0 CBNZ r0,|L3.100|
|L3.58|
;;;499 {
;;;500
;;;501 LUT[pBadBlock--] |= pCurrentBlock | (u16)BAD_BLOCK ;
00003a f836f836 LDRH r0,[r6,r5,LSL #1]
00003e f444f444 ORR r1,r4,#0x2000
000042 4308 ORRS r0,r0,r1
000044 f826f826 STRH r0,[r6,r5,LSL #1]
;;;502 LUT[pCurrentBlock] &= (u16)~FREE_BLOCK;
000048 f836f836 LDRH r0,[r6,r4,LSL #1]
00004c 1e6d SUBS r5,r5,#1 ;501
00004e b2ad UXTH r5,r5 ;501
000050 f420f420 BIC r0,r0,#0x1000
000054 f826f826 STRH r0,[r6,r4,LSL #1]
;;;503 if (pBadBlock == MAX_LOG_BLOCKS_PER_ZONE)
000058 f5b5f5b5 CMP r5,#0x3e8
00005c d117 BNE |L3.142|
;;;504 {
;;;505 return NAND_FAIL;
00005e 2001 MOVS r0,#1
|L3.96|
;;;506 }
;;;507 }
;;;508 else if (SpareArea.LogicalIndex != 0xFFFF)
;;;509 {
;;;510
;;;511 LUT[SpareArea.LogicalIndex & 0x3FF] |= pCurrentBlock | VALID_BLOCK | USED_BLOCK;
;;;512 LUT[pCurrentBlock] &= (u16)( ~FREE_BLOCK);
;;;513 }
;;;514 pCurrentBlock++ ;
;;;515 }
;;;516
;;;517 /*****************************************************************************
;;;518 3rd step : locate Free Blocks by scanning the LUT already built partially
;;;519 *****************************************************************************/
;;;520 pFreeBlock = 0;
;;;521 for (pCurrentBlock = 0 ; pCurrentBlock < MAX_PHY_BLOCKS_PER_ZONE ; pCurrentBlock++ )
;;;522 {
;;;523
;;;524 if ( !(LUT[pCurrentBlock]& USED_BLOCK))
;;;525 {
;;;526 do
;;;527 {
;;;528 if (LUT[pFreeBlock] & FREE_BLOCK)
;;;529 {
;;;530
;;;531 LUT [pCurrentBlock] |= pFreeBlock;
;;;532 LUT [pFreeBlock] &= ~FREE_BLOCK;
;;;533 break;
;;;534 }
;;;535 pFreeBlock++;
;;;536 }
;;;537 while ( pFreeBlock < MAX_PHY_BLOCKS_PER_ZONE );
;;;538 }
;;;539 }
;;;540 return NAND_OK;
;;;541 }
000060 e8bde8bd POP {r2-r8,pc}
|L3.100|
000064 f8bdf8bd LDRH r0,[sp,#0] ;508
000068 f5a0f5a0 SUB r1,r0,#0xff00 ;508
00006c 39ff SUBS r1,r1,#0xff ;508
00006e d00e BEQ |L3.142|
000070 f3c0f3c0 UBFX r0,r0,#0,#10 ;511
000074 f836f836 LDRH r1,[r6,r0,LSL #1] ;511
000078 f444f444 ORR r2,r4,#0xc000 ;511
00007c 4311 ORRS r1,r1,r2 ;511
00007e f826f826 STRH r1,[r6,r0,LSL #1] ;511
000082 f836f836 LDRH r0,[r6,r4,LSL #1] ;512
000086 f420f420 BIC r0,r0,#0x1000 ;512
00008a f826f826 STRH r0,[r6,r4,LSL #1] ;512
|L3.142|
00008e 1c64 ADDS r4,r4,#1 ;514
000090 b2a4 UXTH r4,r4 ;514
000092 42bc CMP r4,r7 ;493
000094 d3c5 BCC |L3.34|
000096 2000 MOVS r0,#0 ;520
000098 ea4fea4f MOV.W r1,r0 ;521
|L3.156|
00009c f836f836 LDRH r2,[r6,r1,LSL #1] ;524
0000a0 0413 LSLS r3,r2,#16 ;524
0000a2 d411 BMI |L3.200|
|L3.164|
0000a4 f836f836 LDRH r3,[r6,r0,LSL #1] ;528
0000a8 04db LSLS r3,r3,#19 ;528
0000aa d509 BPL |L3.192|
0000ac 4302 ORRS r2,r2,r0 ;531
0000ae f826f826 STRH r2,[r6,r1,LSL #1] ;531
0000b2 f836f836 LDRH r2,[r6,r0,LSL #1] ;532
0000b6 f422f422 BIC r2,r2,#0x1000 ;532
0000ba f826f826 STRH r2,[r6,r0,LSL #1] ;532
0000be e003 B |L3.200|
|L3.192|
0000c0 1c40 ADDS r0,r0,#1 ;535
0000c2 b280 UXTH r0,r0 ;535
0000c4 42b8 CMP r0,r7 ;537
0000c6 d3ed BCC |L3.164|
|L3.200|
0000c8 1c49 ADDS r1,r1,#1 ;521
0000ca b289 UXTH r1,r1 ;521
0000cc 42b9 CMP r1,r7 ;521
0000ce d3e5 BCC |L3.156|
0000d0 2000 MOVS r0,#0 ;540
0000d2 e7c5 B |L3.96|
;;;542
ENDP
|L3.212|
0000d4 00000000 DCD ||.bss||
AREA ||i.NAND_Init||, CODE, READONLY, ALIGN=2
NAND_Init PROC
;;;55 u16 NAND_Init(void)
;;;56 {
000000 b510 PUSH {r4,lr}
;;;57 u16 Status = NAND_OK;
;;;58
;;;59 FSMC_NAND_Init();
000002 f7fff7ff BL FSMC_NAND_Init
;;;60 Status = NAND_BuildLUT(0);
000006 2000 MOVS r0,#0
000008 f7fff7ff BL NAND_BuildLUT
;;;61 Write_State = WRITE_IDLE;
00000c 4a01 LDR r2,|L4.20|
00000e 2100 MOVS r1,#0
000010 7011 STRB r1,[r2,#0] ; Write_State
;;;62 return Status;
;;;63 }
000012 bd10 POP {r4,pc}
;;;64
ENDP
|L4.20|
000014 00000000 DCD ||.data||
AREA ||i.NAND_Copy||, CODE, READONLY, ALIGN=1
NAND_Copy PROC
;;;343 static u16 NAND_Copy (NAND_ADDRESS Address_Src, NAND_ADDRESS Address_Dest, u16 PageToCopy)
;;;344 {
000000 b51f PUSH {r0-r4,lr}
000002 f5adf5ad SUB sp,sp,#0x200
000006 9c86 LDR r4,[sp,#0x218]
000008 e013 B |L5.50|
|L5.10|
;;;345 u8 Copybuff[512];
;;;346 for ( ; PageToCopy > 0 ; PageToCopy-- )
;;;347 {
;;;348 FSMC_NAND_ReadSmallPage ((u8 *)Copybuff, Address_Src , 1 );
00000a 2301 MOVS r3,#1
00000c 4668 MOV r0,sp
00000e 9a81 LDR r2,[sp,#0x204]
000010 9980 LDR r1,[sp,#0x200]
000012 f7fff7ff BL FSMC_NAND_ReadSmallPage
;;;349 FSMC_NAND_WriteSmallPage ((u8 *)Copybuff, Address_Dest, 1);
000016 2301 MOVS r3,#1
000018 4668 MOV r0,sp
00001a 9a83 LDR r2,[sp,#0x20c]
00001c 9982 LDR r1,[sp,#0x208]
00001e f7fff7ff BL FSMC_NAND_WriteSmallPage
;;;350 FSMC_NAND_AddressIncrement(&Address_Src);
000022 a880 ADD r0,sp,#0x200
000024 f7fff7ff BL FSMC_NAND_AddressIncrement
;;;351 FSMC_NAND_AddressIncrement(&Address_Dest);
000028 a882 ADD r0,sp,#0x208
00002a f7fff7ff BL FSMC_NAND_AddressIncrement
00002e 1e64 SUBS r4,r4,#1 ;346
000030 b2a4 UXTH r4,r4 ;346
|L5.50|
000032 2c00 CMP r4,#0 ;346
000034 d1e9 BNE |L5.10|
;;;352 }
;;;353
;;;354 return NAND_OK;
000036 2000 MOVS r0,#0
;;;355 }
000038 f50df50d ADD sp,sp,#0x210
00003c bd10 POP {r4,pc}
;;;356
ENDP
AREA ||i.NAND_Write_Cleanup||, CODE, READONLY, ALIGN=2
NAND_Write_Cleanup PROC
;;;390 static u16 NAND_Write_Cleanup (void)
;;;391 {
000000 e92de92d PUSH {r4-r10,lr}
;;;392 u16 tempSpareArea [8];
;;;393 u16 Page_Back;
;;;394
;;;395 if ( Block_State == OLD_BLOCK )
000004 f8dff8df LDR r9,|L6.268|
000008 2400 MOVS r4,#0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -