📄 fsmc_nand.txt
字号:
;;;264 *(vu8 *)(Bank_NAND_ADDR | CMD_AREA) = NAND_CMD_WRITE0;
000020 2080 MOVS r0,#0x80
000022 f88bf88b STRB r0,[r11,#0]
;;;265
;;;266 *(vu8 *)(Bank_NAND_ADDR | ADDR_AREA) = 0x00;
000026 491c LDR r1,|L8.152|
000028 2000 MOVS r0,#0
00002a 7008 STRB r0,[r1,#0]
;;;267 *(vu8 *)(Bank_NAND_ADDR | ADDR_AREA) = ADDR_1st_CYCLE(ROW_ADDRESS);
00002c f8bdf8bd LDRH r0,[sp,#6]
000030 f8bdf8bd LDRH r2,[sp,#4]
000034 eb00eb00 ADD r0,r0,r2,LSL #10
000038 f8bdf8bd LDRH r2,[sp,#8]
00003c eb02eb02 ADD r0,r2,r0,LSL #5
000040 7008 STRB r0,[r1,#0]
;;;268 *(vu8 *)(Bank_NAND_ADDR | ADDR_AREA) = ADDR_2nd_CYCLE(ROW_ADDRESS);
000042 0a02 LSRS r2,r0,#8
000044 700a STRB r2,[r1,#0]
;;;269 *(vu8 *)(Bank_NAND_ADDR | ADDR_AREA) = ADDR_3rd_CYCLE(ROW_ADDRESS);
000046 0c00 LSRS r0,r0,#16
000048 7008 STRB r0,[r1,#0]
;;;270
;;;271 /* Calculate the size */
;;;272 size = NAND_SPARE_AREA_SIZE + (NAND_SPARE_AREA_SIZE * numsparesreawritten);
00004a 2110 MOVS r1,#0x10
00004c eb01eb01 ADD r0,r1,r6,LSL #4
000050 f04ff04f MOV r2,#0x70000000
000054 e004 B |L8.96|
;;;273
;;;274 /* Write the data */
;;;275 for(; index < size; index++)
;;;276 {
;;;277 *(vu8 *)(Bank_NAND_ADDR | DATA_AREA) = pBuffer[index];
000056 bf00 NOP
|L8.88|
000058 f819f819 LDRB r3,[r9,r4]
00005c 7013 STRB r3,[r2,#0]
00005e 1c64 ADDS r4,r4,#1 ;275
|L8.96|
000060 4284 CMP r4,r0 ;275
000062 d3f9 BCC |L8.88|
;;;278 }
;;;279
;;;280 *(vu8 *)(Bank_NAND_ADDR | CMD_AREA) = NAND_CMD_WRITE_TRUE1;
000064 f88bf88b STRB r1,[r11,#0]
;;;281
;;;282 /* Check status for successful operation */
;;;283 status = FSMC_NAND_GetStatus();
000068 f7fff7ff BL FSMC_NAND_GetStatus
00006c 4605 MOV r5,r0
;;;284
;;;285 if(status == NAND_READY)
00006e 2840 CMP r0,#0x40
000070 d105 BNE |L8.126|
;;;286 {
;;;287 numsparesreawritten++;
000072 1c76 ADDS r6,r6,#1
;;;288
;;;289 NumSpareAreaTowrite--;
000074 1e7f SUBS r7,r7,#1
;;;290
;;;291 /* Calculate Next page Address */
;;;292 addressstatus = FSMC_NAND_AddressIncrement(&Address);
000076 a801 ADD r0,sp,#4
000078 f7fff7ff BL FSMC_NAND_AddressIncrement
00007c 4680 MOV r8,r0
|L8.126|
00007e b11f CBZ r7,|L8.136|
000080 45d0 CMP r8,r10 ;260
000082 d101 BNE |L8.136|
000084 2d40 CMP r5,#0x40 ;260
000086 d0c8 BEQ |L8.26|
|L8.136|
;;;293 }
;;;294 }
;;;295
;;;296 return (status | addressstatus);
000088 ea45ea45 ORR r0,r5,r8
;;;297 }
00008c b004 ADD sp,sp,#0x10
00008e e8bde8bd POP {r4-r11,pc}
;;;298
ENDP
000092 0000 DCW 0x0000
|L8.148|
000094 70010000 DCD 0x70010000
|L8.152|
000098 70020000 DCD 0x70020000
AREA ||i.FSMC_NAND_ReadSpareArea||, CODE, READONLY, ALIGN=2
FSMC_NAND_ReadSpareArea PROC
;;;315 u32 FSMC_NAND_ReadSpareArea(u8 *pBuffer, NAND_ADDRESS Address, u32 NumSpareAreaToRead)
;;;316 {
000000 e92de92d PUSH {r0-r9,lr}
;;;317 u32 numsparearearead = 0x00, index = 0x00, addressstatus = NAND_VALID_ADDRESS;
000004 2500 MOVS r5,#0
000006 f44ff44f MOV r9,#0x100
00000a 4680 MOV r8,r0 ;316
00000c 461e MOV r6,r3 ;316
00000e 462c MOV r4,r5
000010 464f MOV r7,r9
;;;318 u32 status = NAND_READY, size = 0x00;
;;;319
;;;320 while((NumSpareAreaToRead != 0x0) && (addressstatus == NAND_VALID_ADDRESS))
000012 e029 B |L9.104|
|L9.20|
;;;321 {
;;;322 /* Page Read command and page address */
;;;323 *(vu8 *)(Bank_NAND_ADDR | CMD_AREA) = NAND_CMD_AREA_C;
000014 4a19 LDR r2,|L9.124|
000016 2050 MOVS r0,#0x50
000018 7010 STRB r0,[r2,#0]
;;;324
;;;325 *(vu8 *)(Bank_NAND_ADDR | ADDR_AREA) = 0x00;
00001a 4919 LDR r1,|L9.128|
00001c 2000 MOVS r0,#0
00001e 7008 STRB r0,[r1,#0]
;;;326 *(vu8 *)(Bank_NAND_ADDR | ADDR_AREA) = ADDR_1st_CYCLE(ROW_ADDRESS);
000020 f8bdf8bd LDRH r0,[sp,#6]
000024 f8bdf8bd LDRH r3,[sp,#4]
000028 eb00eb00 ADD r0,r0,r3,LSL #10
00002c f8bdf8bd LDRH r3,[sp,#8]
000030 eb03eb03 ADD r0,r3,r0,LSL #5
000034 7008 STRB r0,[r1,#0]
;;;327 *(vu8 *)(Bank_NAND_ADDR | ADDR_AREA) = ADDR_2nd_CYCLE(ROW_ADDRESS);
000036 0a03 LSRS r3,r0,#8
000038 700b STRB r3,[r1,#0]
;;;328 *(vu8 *)(Bank_NAND_ADDR | ADDR_AREA) = ADDR_3rd_CYCLE(ROW_ADDRESS);
00003a 0c00 LSRS r0,r0,#16
00003c 7008 STRB r0,[r1,#0]
;;;329
;;;330 *(vu8 *)(Bank_NAND_ADDR | CMD_AREA) = NAND_CMD_AREA_TRUE1;
00003e 2030 MOVS r0,#0x30
000040 7010 STRB r0,[r2,#0]
;;;331
;;;332 /* Data Read */
;;;333 size = NAND_SPARE_AREA_SIZE + (NAND_SPARE_AREA_SIZE * numsparearearead);
000042 2010 MOVS r0,#0x10
000044 eb00eb00 ADD r1,r0,r5,LSL #4
000048 f04ff04f MOV r2,#0x70000000
00004c e004 B |L9.88|
|L9.78|
;;;334
;;;335 /* Get Data into Buffer */
;;;336 for ( ;index < size; index++)
;;;337 {
;;;338 pBuffer[index] = *(vu8 *)(Bank_NAND_ADDR | DATA_AREA);
00004e 7813 LDRB r3,[r2,#0]
000050 1c60 ADDS r0,r4,#1 ;336
000052 f808f808 STRB r3,[r8,r4]
000056 4604 MOV r4,r0 ;336
|L9.88|
000058 428c CMP r4,r1 ;336
00005a d3f8 BCC |L9.78|
;;;339 }
;;;340
;;;341 numsparearearead++;
00005c 1c6d ADDS r5,r5,#1
;;;342
;;;343 NumSpareAreaToRead--;
00005e 1e76 SUBS r6,r6,#1
;;;344
;;;345 /* Calculate page address */
;;;346 addressstatus = FSMC_NAND_AddressIncrement(&Address);
000060 a801 ADD r0,sp,#4
000062 f7fff7ff BL FSMC_NAND_AddressIncrement
000066 4607 MOV r7,r0
|L9.104|
000068 b10e CBZ r6,|L9.110|
00006a 454f CMP r7,r9 ;320
00006c d0d2 BEQ |L9.20|
|L9.110|
;;;347 }
;;;348
;;;349 status = FSMC_NAND_GetStatus();
00006e f7fff7ff BL FSMC_NAND_GetStatus
;;;350
;;;351 return (status | addressstatus);
000072 4338 ORRS r0,r0,r7
;;;352 }
000074 b004 ADD sp,sp,#0x10
000076 e8bde8bd POP {r4-r9,pc}
;;;353
ENDP
00007a 0000 DCW 0x0000
|L9.124|
00007c 70010000 DCD 0x70010000
|L9.128|
000080 70020000 DCD 0x70020000
AREA ||i.FSMC_NAND_EraseBlock||, CODE, READONLY, ALIGN=2
FSMC_NAND_EraseBlock PROC
;;;364 u32 FSMC_NAND_EraseBlock(NAND_ADDRESS Address)
;;;365 {
000000 b403 PUSH {r0,r1}
;;;366 *(vu8 *)(Bank_NAND_ADDR | CMD_AREA) = NAND_CMD_ERASE0;
000002 4a0c LDR r2,|L10.52|
000004 2060 MOVS r0,#0x60
000006 7010 STRB r0,[r2,#0]
;;;367
;;;368 *(vu8 *)(Bank_NAND_ADDR | ADDR_AREA) = ADDR_1st_CYCLE(ROW_ADDRESS);
000008 f8bdf8bd LDRH r0,[sp,#2]
00000c f8bdf8bd LDRH r1,[sp,#0]
000010 eb00eb00 ADD r0,r0,r1,LSL #10
000014 f8bdf8bd LDRH r1,[sp,#4]
000018 eb01eb01 ADD r0,r1,r0,LSL #5
00001c 4906 LDR r1,|L10.56|
00001e 7008 STRB r0,[r1,#0]
;;;369 *(vu8 *)(Bank_NAND_ADDR | ADDR_AREA) = ADDR_2nd_CYCLE(ROW_ADDRESS);
000020 0a03 LSRS r3,r0,#8
000022 700b STRB r3,[r1,#0]
;;;370 *(vu8 *)(Bank_NAND_ADDR | ADDR_AREA) = ADDR_3rd_CYCLE(ROW_ADDRESS);
000024 0c00 LSRS r0,r0,#16
000026 7008 STRB r0,[r1,#0]
;;;371
;;;372 *(vu8 *)(Bank_NAND_ADDR | CMD_AREA) = NAND_CMD_ERASE1;
000028 20d0 MOVS r0,#0xd0
00002a 7010 STRB r0,[r2,#0]
;;;373
;;;374 return (FSMC_NAND_GetStatus());
00002c b002 ADD sp,sp,#8
00002e f7fff7ff B.W FSMC_NAND_GetStatus
;;;375 }
;;;376
ENDP
000032 0000 DCW 0x0000
|L10.52|
000034 70010000 DCD 0x70010000
|L10.56|
000038 70020000 DCD 0x70020000
AREA ||i.FSMC_NAND_Reset||, CODE, READONLY, ALIGN=2
FSMC_NAND_Reset PROC
;;;385 {
;;;386 *(vu8 *)(Bank_NAND_ADDR | CMD_AREA) = NAND_CMD_RESET;
000000 4902 LDR r1,|L11.12|
000002 20ff MOVS r0,#0xff
000004 7008 STRB r0,[r1,#0]
;;;387
;;;388 return (NAND_READY);
000006 2040 MOVS r0,#0x40
;;;389 }
000008 4770 BX lr
;;;390
ENDP
00000a 0000 DCW 0x0000
|L11.12|
00000c 70010000 DCD 0x70010000
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -