📄 nand_if.txt
字号:
;;;168 }
;;;169 /* Clean up and Update the LUT */
;;;170 NAND_Write_Cleanup();
000108 f7fffffe BL NAND_Write_Cleanup
;;;171 Write_State = WRITE_IDLE;
00010c 702f STRB r7,[r5,#0]
;;;172 return NAND_OK;
00010e e02a B |L8.358|
|L8.272|
;;;173 }
;;;174
;;;175 /* write next page */
;;;176 FSMC_NAND_WriteSmallPage( (u8 *)Writebuff , fAddress, PAGE_TO_WRITE);
;;;177 Written_Pages++;
;;;178 if (Written_Pages == SCSI_BlkLen)
000110 e017 B |L8.322|
|L8.274|
;;;179 {
;;;180 Write_State = WRITE_IDLE;
;;;181 NAND_Write_Cleanup();
;;;182 Written_Pages = 0;
;;;183 }
;;;184
;;;185 }
;;;186 else
;;;187 {/* UNUSED BLOCK */
;;;188 wAddress.Block = phBlock & 0x3FF;
;;;189 /* check if it is the last page in prev block */
;;;190 if (wAddress.Page == (NAND_BLOCK_SIZE - 1))
000112 88b0 LDRH r0,[r6,#4] ; wAddress
;;;191 {
;;;192 /* write Last page */
;;;193 FSMC_NAND_WriteSmallPage( (u8 *)Writebuff , wAddress, PAGE_TO_WRITE);
000114 4915 LDR r1,|L8.364|
000116 281f CMP r0,#0x1f ;190
000118 f04f0206 MOV r2,#6
00011c d111 BNE |L8.322|
|L8.286|
00011e 4668 MOV r0,sp
000120 f7fffffe BL __aeabi_memcpy
000124 e9dd1200 LDRD r1,r2,[sp,#0]
000128 4643 MOV r3,r8
00012a 4650 MOV r0,r10
00012c f7fffffe BL FSMC_NAND_WriteSmallPage
;;;194 Written_Pages++;
000130 88a8 LDRH r0,[r5,#4] ; Written_Pages
000132 1c40 ADDS r0,r0,#1
000134 b280 UXTH r0,r0
000136 80a8 STRH r0,[r5,#4]
;;;195 if (Written_Pages == SCSI_BlkLen)
000138 6821 LDR r1,[r4,#0] ; SCSI_BlkLen
00013a 4288 CMP r0,r1
00013c d1e4 BNE |L8.264|
;;;196 {
;;;197 Written_Pages = 0;
00013e 80af STRH r7,[r5,#4]
000140 e7e2 B |L8.264|
|L8.322|
;;;198 }
;;;199
;;;200 /* Clean up and Update the LUT */
;;;201 NAND_Write_Cleanup();
;;;202 Write_State = WRITE_IDLE;
;;;203
;;;204
;;;205
;;;206 return NAND_OK;
;;;207 }
;;;208 /* write next page in same block */
;;;209 FSMC_NAND_WriteSmallPage( (u8 *)Writebuff , wAddress, PAGE_TO_WRITE);
000142 4668 MOV r0,sp
000144 f7fffffe BL __aeabi_memcpy
000148 e9dd1200 LDRD r1,r2,[sp,#0]
00014c 4643 MOV r3,r8
00014e 4650 MOV r0,r10
000150 f7fffffe BL FSMC_NAND_WriteSmallPage
;;;210 Written_Pages++;
000154 88a8 LDRH r0,[r5,#4] ; Written_Pages
000156 1c40 ADDS r0,r0,#1
000158 b280 UXTH r0,r0
00015a 80a8 STRH r0,[r5,#4]
;;;211 if (Written_Pages == SCSI_BlkLen)
00015c 6821 LDR r1,[r4,#0] ; SCSI_BlkLen
00015e 4288 CMP r0,r1
000160 d101 BNE |L8.358|
;;;212 {
;;;213 Write_State = WRITE_IDLE;
000162 702f STRB r7,[r5,#0]
;;;214 NAND_Write_Cleanup();
;;;215 Written_Pages = 0;
000164 e796 B |L8.148|
|L8.358|
;;;216 }
;;;217 }
;;;218 }
;;;219 return NAND_OK;
000166 2000 MOVS r0,#0
;;;220 }
000168 e8bd87fc POP {r2-r10,pc}
;;;221
ENDP
|L8.364|
DCD ||.data||+0xc
|L8.368|
DCD ||.bss||
|L8.372|
DCD SCSI_BlkLen
AREA ||i.NAND_Write_Cleanup||, CODE, READONLY, ALIGN=2
NAND_Write_Cleanup PROC
;;;389 *******************************************************************************/
;;;390 static u16 NAND_Write_Cleanup (void)
000000 e92d47f0 PUSH {r4-r10,lr}
;;;391 {
;;;392 u16 tempSpareArea [8];
;;;393 u16 Page_Back;
;;;394
;;;395 if ( Block_State == OLD_BLOCK )
000004 4840 LDR r0,|L9.264|
000006 2400 MOVS r4,#0
000008 7841 LDRB r1,[r0,#1] ; Block_State
00000a b08a SUB sp,sp,#0x28 ;391
;;;396 {
;;;397 /* precopy old first pages */
;;;398 if (Initial_Page != 0)
;;;399 {
;;;400 Page_Back = wAddress.Page;
;;;401 fAddress.Page = wAddress.Page = 0;
;;;402 NAND_Copy (wAddress, fAddress, Initial_Page);
;;;403 wAddress.Page = Page_Back ;
;;;404 }
;;;405
;;;406 /* postcopy remaining pages */
;;;407 if ((NAND_BLOCK_SIZE - (wAddress.Page + 1)) != 0)
;;;408 {
;;;409 FSMC_NAND_AddressIncrement(&wAddress);
;;;410 fAddress.Page = wAddress.Page;
;;;411 NAND_Copy (wAddress, fAddress, NAND_BLOCK_SIZE - wAddress.Page);
;;;412 }
;;;413
;;;414 /* assign logical address to new block */
;;;415 tempSpareArea [0] = LogAddress | USED_BLOCK ;
;;;416 tempSpareArea [1] = 0xFFFF;
00000c f64f7aff MOV r10,#0xffff
000010 f100050c ADD r5,r0,#0xc ;400
000014 2900 CMP r1,#0 ;395
000016 d15f BNE |L9.216|
000018 4681 MOV r9,r0 ;398
00001a 8940 LDRH r0,[r0,#0xa] ;398 ; Initial_Page
00001c 1dae ADDS r6,r5,#6 ;401
00001e ea5f0800 MOVS r8,r0 ;398
000022 d013 BEQ |L9.76|
000024 88af LDRH r7,[r5,#4] ;400 ; wAddress
000026 80ac STRH r4,[r5,#4] ;401
000028 80b4 STRH r4,[r6,#4] ;401
00002a 2206 MOVS r2,#6 ;402
00002c 1da9 ADDS r1,r5,#6 ;402
00002e a804 ADD r0,sp,#0x10 ;402
000030 f7fffffe BL __aeabi_memcpy
000034 2206 MOVS r2,#6 ;402
000036 4629 MOV r1,r5 ;402
000038 a802 ADD r0,sp,#8 ;402
00003a f7fffffe BL __aeabi_memcpy
00003e f8cd8000 STR r8,[sp,#0] ;402
000042 a802 ADD r0,sp,#8 ;402
000044 c80f LDM r0,{r0-r3} ;402
000046 f7fffffe BL NAND_Copy
00004a 80af STRH r7,[r5,#4] ;403
|L9.76|
00004c 88a8 LDRH r0,[r5,#4] ;407 ; wAddress
00004e 281f CMP r0,#0x1f ;407
000050 d019 BEQ |L9.134|
000052 482d LDR r0,|L9.264|
000054 300c ADDS r0,r0,#0xc ;409
000056 f7fffffe BL FSMC_NAND_AddressIncrement
00005a 492b LDR r1,|L9.264|
00005c 88af LDRH r7,[r5,#4] ;410 ; wAddress
00005e 80b7 STRH r7,[r6,#4] ;410
000060 2206 MOVS r2,#6 ;411
000062 3112 ADDS r1,r1,#0x12 ;411
000064 a804 ADD r0,sp,#0x10 ;411
000066 f7fffffe BL __aeabi_memcpy
00006a 4927 LDR r1,|L9.264|
00006c 2206 MOVS r2,#6 ;411
00006e 310c ADDS r1,r1,#0xc ;411
000070 a802 ADD r0,sp,#8 ;411
000072 f7fffffe BL __aeabi_memcpy
000076 f1c70020 RSB r0,r7,#0x20 ;411
00007a b283 UXTH r3,r0 ;411
00007c 9300 STR r3,[sp,#0] ;411
00007e a802 ADD r0,sp,#8 ;411
000080 c80f LDM r0,{r0-r3} ;411
000082 f7fffffe BL NAND_Copy
|L9.134|
000086 f8b90008 LDRH r0,[r9,#8] ;415 ; LogAddress
;;;417 tempSpareArea [2] = 0xFFFF;
;;;418
;;;419 fAddress.Page = 0x00;
;;;420 FSMC_NAND_WriteSpareArea( (u8 *)tempSpareArea , fAddress , 1);
00008a 491f LDR r1,|L9.264|
00008c f4404000 ORR r0,r0,#0x8000 ;415
000090 f8ad0018 STRH r0,[sp,#0x18] ;415
000094 f8ada01a STRH r10,[sp,#0x1a] ;416
000098 f8ada01c STRH r10,[sp,#0x1c] ;417
00009c 80b4 STRH r4,[r6,#4] ;419
00009e 2206 MOVS r2,#6
0000a0 3112 ADDS r1,r1,#0x12
0000a2 a804 ADD r0,sp,#0x10
0000a4 f7fffffe BL __aeabi_memcpy
0000a8 e9dd1204 LDRD r1,r2,[sp,#0x10]
0000ac 2301 MOVS r3,#1
0000ae a806 ADD r0,sp,#0x18
0000b0 f7fffffe BL FSMC_NAND_WriteSpareArea
;;;421
;;;422 /* erase old block */
;;;423 FSMC_NAND_EraseBlock(wAddress);
0000b4 4914 LDR r1,|L9.264|
0000b6 2206 MOVS r2,#6
0000b8 310c ADDS r1,r1,#0xc
0000ba a804 ADD r0,sp,#0x10
0000bc f7fffffe BL __aeabi_memcpy
0000c0 e9dd0104 LDRD r0,r1,[sp,#0x10]
0000c4 f7fffffe BL FSMC_NAND_EraseBlock
|L9.200|
;;;424 NAND_CleanLUT(wAddress.Zone);
;;;425 }
;;;426 else
;;;427 {/* unused block case */
;;;428 /* assign logical address to the new used block */
;;;429 tempSpareArea [0] = LogAddress | USED_BLOCK ;
;;;430 tempSpareArea [1] = 0xFFFF;
;;;431 tempSpareArea [2] = 0xFFFF;
;;;432
;;;433 wAddress.Page = 0x00;
;;;434 FSMC_NAND_WriteSpareArea((u8 *)tempSpareArea , wAddress, 1);
;;;435 NAND_CleanLUT(wAddress.Zone);
0000c8 8828 LDRH r0,[r5,#0] ; wAddress
0000ca b2c0 UXTB r0,r0
0000cc f7fffffe BL NAND_BuildLUT
;;;436 }
;;;437 return NAND_OK;
0000d0 2000 MOVS r0,#0
;;;438 }
0000d2 b00a ADD sp,sp,#0x28
0000d4 e8bd87f0 POP {r4-r10,pc}
|L9.216|
0000d8 8900 LDRH r0,[r0,#8] ;429 ; LogAddress
0000da 490b LDR r1,|L9.264|
0000dc f4404000 ORR r0,r0,#0x8000 ;429
0000e0 f8ad0018 STRH r0,[sp,#0x18] ;429
0000e4 f8ada01a STRH r10,[sp,#0x1a] ;430
0000e8 f8ada01c STRH r10,[sp,#0x1c] ;431
0000ec 80ac STRH r4,[r5,#4] ;433
0000ee 2206 MOVS r2,#6 ;434
0000f0 310c ADDS r1,r1,#0xc ;434
0000f2 a804 ADD r0,sp,#0x10 ;434
0000f4 f7fffffe BL __aeabi_memcpy
0000f8 e9dd1204 LDRD r1,r2,[sp,#0x10] ;434
0000fc 2301 MOVS r3,#1 ;434
0000fe a806 ADD r0,sp,#0x18 ;434
000100 f7fffffe BL FSMC_NAND_WriteSpareArea
000104 e7e0 B |L9.200|
;;;439
ENDP
000106 0000 DCW 0x0000
|L9.264|
DCD ||.data||
AREA ||i.ReadSpareArea||, CODE, READONLY, ALIGN=1
ReadSpareArea PROC
;;;322 *******************************************************************************/
;;;323 SPARE_AREA ReadSpareArea (u32 address)
000000 b510 PUSH {r4,lr}
;;;324 {
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 f7fffffe BL NAND_ConvertPhyAddress
;;;329 FSMC_NAND_ReadSpareArea(Buffer , address_s, 1) ;
00000c e9dd1200 LDRD r1,r2,[sp,#0]
000010 2301 MOVS r3,#1
000012 a802 ADD r0,sp,#8
000014 f7fffffe BL FSMC_NAND_ReadSpareArea
;;;330
;;;331 t = *(SPARE_AREA *)Buffer;
000018 e9dd0102 LDRD r0,r1,[sp,#8]
;;;332
;;;333 return t;
00001c e9cd0106 STRD r0,r1,[sp,#0x18]
000020 2206 MOVS r2,#6
000022 a906 ADD r1,sp,#0x18
000024 4620 MOV r0,r4
000026 f7fffffe BL __aeabi_memcpy
;;;334 }
00002a b008 ADD sp,sp,#0x20
00002c bd10 POP {r4,pc}
;;;335
ENDP
AREA ||.bss||, DATA, NOINIT, ALIGN=1
LUT
% 2048
AREA ||.data||, DATA, ALIGN=1
Write_State
000000 00 DCB 0x00
Block_State
000001 00 DCB 0x00
CurrentZone
000002 0000 DCW 0x0000
Written_Pages
000004 0000 DCW 0x0000
phBlock
000006 0000 DCB 0x00,0x00
LogAddress
000008 0000 DCB 0x00,0x00
Initial_Page
00000a 0000 DCB 0x00,0x00
wAddress
DCDU 0x00000000
000010 0000 DCB 0x00,0x00
fAddress
DCDU 0x00000000
000016 0000 DCB 0x00,0x00
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -