📄 nand_if.txt
字号:
;;;131 wAddress.Block = phBlock & 0x3FF;
0000b4 f3c1f3c1 UBFX r0,r1,#0,#10
0000b8 8078 STRH r0,[r7,#2] ; wAddress
;;;132 FSMC_NAND_WriteSmallPage( (u8 *)Writebuff , wAddress, PAGE_TO_WRITE);
0000ba 2206 MOVS r2,#6
0000bc 492d LDR r1,|L8.372|
0000be 4668 MOV r0,sp
0000c0 f7fff7ff BL __aeabi_memcpy
0000c4 e9dde9dd LDRD r1,r2,[sp,#0]
0000c8 4643 MOV r3,r8
0000ca 4650 MOV r0,r10
0000cc f7fff7ff BL FSMC_NAND_WriteSmallPage
;;;133
;;;134 Written_Pages++;
0000d0 88b0 LDRH r0,[r6,#4] ; Written_Pages
0000d2 1c40 ADDS r0,r0,#1
0000d4 b280 UXTH r0,r0
0000d6 80b0 STRH r0,[r6,#4] ; Written_Pages
;;;135 if (Written_Pages == SCSI_BlkLen)
0000d8 6821 LDR r1,[r4,#0] ; SCSI_BlkLen
0000da 4288 CMP r0,r1
0000dc d1e5 BNE |L8.170|
;;;136 {
;;;137 Written_Pages = 0;
0000de 80b5 STRH r5,[r6,#4] ; Written_Pages
;;;138 NAND_Write_Cleanup();
;;;139 return NAND_OK;
0000e0 e7e0 B |L8.164|
|L8.226|
;;;140 }
;;;141 else
;;;142 {
;;;143 Write_State = WRITE_ONGOING;
;;;144 return NAND_OK;
;;;145 }
;;;146 }
;;;147 }
;;;148 /* WRITE state */
;;;149 /***************/
;;;150 if ( Write_State == WRITE_ONGOING)
0000e2 2904 CMP r1,#4
0000e4 d142 BNE |L8.364|
;;;151 {/* Idle state */
;;;152 if (phBlock & USED_BLOCK)
0000e6 88f1 LDRH r1,[r6,#6] ; phBlock
0000e8 040a LSLS r2,r1,#16
0000ea d512 BPL |L8.274|
;;;153 { /* USED BLOCK */
;;;154
;;;155 wAddress.Block = phBlock & 0x3FF;
0000ec f3c1f3c1 UBFX r1,r1,#0,#10
0000f0 8079 STRH r1,[r7,#2] ; wAddress
;;;156 Block_State = OLD_BLOCK;
0000f2 7075 STRB r5,[r6,#1] ; Block_State
;;;157 fAddress.Page = wAddress.Page;
0000f4 88b9 LDRH r1,[r7,#4] ; wAddress
0000f6 8081 STRH r1,[r0,#4] ; fAddress
;;;158
;;;159 /* check if next pages are in next block */
;;;160 if (wAddress.Page == (NAND_BLOCK_SIZE - 1))
0000f8 291f CMP r1,#0x1f
;;;161 {
;;;162 /* write Last page */
;;;163 FSMC_NAND_WriteSmallPage( (u8 *)Writebuff , fAddress, PAGE_TO_WRITE);
0000fa 491e LDR r1,|L8.372|
0000fc f04ff04f MOV r2,#6
000100 f101f101 ADD r1,r1,#6
000104 d104 BNE |L8.272|
;;;164 Written_Pages++;
;;;165 if (Written_Pages == SCSI_BlkLen)
000106 e00d B |L8.292|
|L8.264|
;;;166 {
;;;167 Written_Pages = 0;
;;;168 }
;;;169 /* Clean up and Update the LUT */
;;;170 NAND_Write_Cleanup();
000108 f7fff7ff BL NAND_Write_Cleanup
;;;171 Write_State = WRITE_IDLE;
00010c 7035 STRB r5,[r6,#0] ; Write_State
;;;172 return NAND_OK;
00010e e02d B |L8.364|
|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 e01a B |L8.328|
|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;
000112 f3c1f3c1 UBFX r0,r1,#0,#10
000116 8078 STRH r0,[r7,#2] ; wAddress
;;;189 /* check if it is the last page in prev block */
;;;190 if (wAddress.Page == (NAND_BLOCK_SIZE - 1))
000118 88b8 LDRH r0,[r7,#4] ; wAddress
;;;191 {
;;;192 /* write Last page */
;;;193 FSMC_NAND_WriteSmallPage( (u8 *)Writebuff , wAddress, PAGE_TO_WRITE);
00011a 4916 LDR r1,|L8.372|
00011c 281f CMP r0,#0x1f ;190
00011e f04ff04f MOV r2,#6
000122 d111 BNE |L8.328|
|L8.292|
000124 4668 MOV r0,sp
000126 f7fff7ff BL __aeabi_memcpy
00012a e9dde9dd LDRD r1,r2,[sp,#0]
00012e 4643 MOV r3,r8
000130 4650 MOV r0,r10
000132 f7fff7ff BL FSMC_NAND_WriteSmallPage
;;;194 Written_Pages++;
000136 88b0 LDRH r0,[r6,#4] ; Written_Pages
000138 1c40 ADDS r0,r0,#1
00013a b280 UXTH r0,r0
00013c 80b0 STRH r0,[r6,#4] ; Written_Pages
;;;195 if (Written_Pages == SCSI_BlkLen)
00013e 6821 LDR r1,[r4,#0] ; SCSI_BlkLen
000140 4288 CMP r0,r1
000142 d1e1 BNE |L8.264|
;;;196 {
;;;197 Written_Pages = 0;
000144 80b5 STRH r5,[r6,#4] ; Written_Pages
000146 e7df B |L8.264|
|L8.328|
;;;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);
000148 4668 MOV r0,sp
00014a f7fff7ff BL __aeabi_memcpy
00014e e9dde9dd LDRD r1,r2,[sp,#0]
000152 4643 MOV r3,r8
000154 4650 MOV r0,r10
000156 f7fff7ff BL FSMC_NAND_WriteSmallPage
;;;210 Written_Pages++;
00015a 88b0 LDRH r0,[r6,#4] ; Written_Pages
00015c 1c40 ADDS r0,r0,#1
00015e b280 UXTH r0,r0
000160 80b0 STRH r0,[r6,#4] ; Written_Pages
;;;211 if (Written_Pages == SCSI_BlkLen)
000162 6821 LDR r1,[r4,#0] ; SCSI_BlkLen
000164 4288 CMP r0,r1
000166 d101 BNE |L8.364|
;;;212 {
;;;213 Write_State = WRITE_IDLE;
000168 7035 STRB r5,[r6,#0] ; Write_State
;;;214 NAND_Write_Cleanup();
;;;215 Written_Pages = 0;
00016a e793 B |L8.148|
|L8.364|
;;;216 }
;;;217 }
;;;218 }
;;;219 return NAND_OK;
00016c 2000 MOVS r0,#0
;;;220 }
00016e e8bde8bd POP {r2-r10,pc}
;;;221
ENDP
000172 0000 DCW 0x0000
|L8.372|
000174 0000000c DCD ||.data||+0xc
|L8.376|
000178 00000000 DCD ||.bss||
|L8.380|
00017c 00000000 DCD SCSI_BlkLen
AREA ||i.NAND_Read||, CODE, READONLY, ALIGN=2
NAND_Read PROC
;;;229 u16 NAND_Read(u32 Memory_Offset, u32 *Readbuff, u16 Transfer_Length)
;;;230 {
000000 b57c PUSH {r2-r6,lr}
000002 460c MOV r4,r1
;;;231 NAND_ADDRESS phAddress;
;;;232
;;;233 phAddress = NAND_GetAddress(Memory_Offset / 512);
000004 0a41 LSRS r1,r0,#9
000006 4615 MOV r5,r2 ;230
000008 4668 MOV r0,sp
00000a f7fff7ff BL NAND_GetAddress
;;;234
;;;235 if (phAddress.Zone != CurrentZone)
00000e 4910 LDR r1,|L9.80|
000010 f8bdf8bd LDRH r0,[sp,#0]
000014 884a LDRH r2,[r1,#2] ; CurrentZone
000016 4290 CMP r0,r2
000018 d004 BEQ |L9.36|
;;;236 {
;;;237 CurrentZone = phAddress.Zone;
00001a 8048 STRH r0,[r1,#2] ; CurrentZone
;;;238 NAND_BuildLUT(CurrentZone);
00001c b280 UXTH r0,r0
00001e b2c0 UXTB r0,r0
000020 f7fff7ff BL NAND_BuildLUT
|L9.36|
;;;239 }
;;;240
;;;241 if (LUT [phAddress.Block] & BAD_BLOCK)
000024 f8bdf8bd LDRH r1,[sp,#2]
000028 480a LDR r0,|L9.84|
00002a f830f830 LDRH r0,[r0,r1,LSL #1]
00002e 0481 LSLS r1,r0,#18
000030 d501 BPL |L9.54|
;;;242 {
;;;243 return NAND_FAIL;
000032 2001 MOVS r0,#1
;;;244 }
;;;245 else
;;;246 {
;;;247 phAddress.Block = LUT [phAddress.Block] & ~ (USED_BLOCK | VALID_BLOCK);
;;;248 FSMC_NAND_ReadSmallPage ( (u8 *)Readbuff , phAddress, Transfer_Length / 512);
;;;249 }
;;;250 return NAND_OK;
;;;251 }
000034 bd7c POP {r2-r6,pc}
|L9.54|
000036 f420f420 BIC r0,r0,#0xc000 ;247
00003a f8adf8ad STRH r0,[sp,#2] ;247
00003e e9dde9dd LDRD r1,r2,[sp,#0] ;248
000042 0a6b LSRS r3,r5,#9 ;248
000044 4620 MOV r0,r4 ;248
000046 f7fff7ff BL FSMC_NAND_ReadSmallPage
00004a 2000 MOVS r0,#0 ;250
00004c bd7c POP {r2-r6,pc}
;;;252
ENDP
00004e 0000 DCW 0x0000
|L9.80|
000050 00000000 DCD ||.data||
|L9.84|
000054 00000000 DCD ||.bss||
AREA ||i.NAND_Format||, CODE, READONLY, ALIGN=1
NAND_Format PROC
;;;364 u16 NAND_Format (void)
;;;365 {
000000 b57f PUSH {r0-r6,lr}
;;;366 NAND_ADDRESS phAddress;
;;;367 SPARE_AREA SpareArea;
;;;368 u32 BlockIndex;
;;;369
;;;370 for (BlockIndex = 0 ; BlockIndex < NAND_ZONE_SIZE * NAND_MAX_ZONE; BlockIndex++)
000002 2400 MOVS r4,#0
000004 f44ff44f MOV r6,#0x1000
|L10.8|
;;;371 {
;;;372 phAddress = NAND_ConvertPhyAddress(BlockIndex * NAND_BLOCK_SIZE );
000008 0165 LSLS r5,r4,#5
00000a 4629 MOV r1,r5
00000c a802 ADD r0,sp,#8
00000e f7fff7ff BL NAND_ConvertPhyAddress
000012 4629 MOV r1,r5
;;;373 SpareArea = ReadSpareArea(BlockIndex * NAND_BLOCK_SIZE);
000014 4668 MOV r0,sp
000016 f7fff7ff BL ReadSpareArea
;;;374
;;;375 if((SpareArea.DataStatus != 0)||(SpareArea.BlockStatus != 0)){
00001a f8bdf8bd LDRH r0,[sp,#2]
00001e b910 CBNZ r0,|L10.38|
000020 f8bdf8bd LDRH r0,[sp,#4]
000024 b118 CBZ r0,|L10.46|
|L10.38|
;;;376 FSMC_NAND_EraseBlock (phAddress);
000026 e9dde9dd LDRD r0,r1,[sp,#8]
00002a f7fff7ff BL FSMC_NAND_EraseBlock
|L10.46|
00002e 1c64 ADDS r4,r4,#1 ;370
000030 42b4 CMP r4,r6 ;370
000032 d3e9 BCC |L10.8|
;;;377 }
;;;378 }
;;;379 NAND_BuildLUT(0);
000034 2000 MOVS r0,#0
000036 f7fff7ff BL NAND_BuildLUT
;;;380 return NAND_OK;
00003a 2000 MOVS r0,#0
;;;381 }
00003c b004 ADD sp,sp,#0x10
00003e bd70 POP {r4-r6,pc}
;;;382
ENDP
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
00000c 00000000 DCDU 0x00000000
000010 0000 DCB 0x00,0x00
fAddress
000012 00000000 DCDU 0x00000000
000016 0000 DCB 0x00,0x00
AREA ||.bss||, DATA, NOINIT, ALIGN=1
LUT
% 2048
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -