📄 fsmc_nand.txt
字号:
DCD 0x40012000
AREA ||i.FSMC_NAND_ReadID||, CODE, READONLY, ALIGN=2
FSMC_NAND_ReadID PROC
;;;107 *******************************************************************************/
;;;108 void FSMC_NAND_ReadID(NAND_IDTypeDef* NAND_ID)
000000 4a08 LDR r2,|L5.36|
;;;109 {
;;;110 u32 data = 0;
;;;111
;;;112 /* Send Command to the command area */
;;;113 *(vu8 *)(Bank_NAND_ADDR | CMD_AREA) = 0x90;
000002 2190 MOVS r1,#0x90
000004 7011 STRB r1,[r2,#0]
;;;114 *(vu8 *)(Bank_NAND_ADDR | ADDR_AREA) = 0x00;
000006 4a08 LDR r2,|L5.40|
000008 2100 MOVS r1,#0
00000a 7011 STRB r1,[r2,#0]
;;;115
;;;116 /* Sequence to read ID from NAND flash */
;;;117 data = *(vu32 *)(Bank_NAND_ADDR | DATA_AREA);
00000c f04f41e0 MOV r1,#0x70000000
000010 6809 LDR r1,[r1,#0]
;;;118
;;;119 NAND_ID->Maker_ID = ADDR_1st_CYCLE (data);
000012 7001 STRB r1,[r0,#0]
;;;120 NAND_ID->Device_ID = ADDR_2nd_CYCLE (data);
000014 0a0a LSRS r2,r1,#8
000016 7042 STRB r2,[r0,#1]
;;;121 NAND_ID->Third_ID = ADDR_3rd_CYCLE (data);
000018 0c0a LSRS r2,r1,#16
00001a 7082 STRB r2,[r0,#2]
;;;122 NAND_ID->Fourth_ID = ADDR_4th_CYCLE (data);
00001c 0e09 LSRS r1,r1,#24
00001e 70c1 STRB r1,[r0,#3]
;;;123 }
000020 4770 BX lr
;;;124
ENDP
000022 0000 DCW 0x0000
|L5.36|
DCD 0x70010000
|L5.40|
DCD 0x70020000
AREA ||i.FSMC_NAND_ReadSmallPage||, CODE, READONLY, ALIGN=2
FSMC_NAND_ReadSmallPage PROC
;;;199 *******************************************************************************/
;;;200 u32 FSMC_NAND_ReadSmallPage(u8 *pBuffer, NAND_ADDRESS Address, u32 NumPageToRead)
000000 e92d43ff PUSH {r0-r9,lr}
;;;201 {
;;;202 u32 index = 0x00, numpageread = 0x00, addressstatus = NAND_VALID_ADDRESS;
000004 2400 MOVS r4,#0
000006 f44f7980 MOV r9,#0x100
00000a 4680 MOV r8,r0 ;201
00000c 461f MOV r7,r3 ;201
00000e 4625 MOV r5,r4
000010 464e MOV r6,r9
;;;203 u32 status = NAND_READY, size = 0x00;
;;;204
;;;205 while((NumPageToRead != 0x0) && (addressstatus == NAND_VALID_ADDRESS))
000012 e029 B |L6.104|
|L6.20|
;;;206 {
;;;207 /* Page Read command and page address */
;;;208 *(vu8 *)(Bank_NAND_ADDR | CMD_AREA) = NAND_CMD_AREA_A;
000014 4a19 LDR r2,|L6.124|
000016 2000 MOVS r0,#0
000018 7010 STRB r0,[r2,#0]
;;;209
;;;210 *(vu8 *)(Bank_NAND_ADDR | ADDR_AREA) = 0x00;
00001a 4919 LDR r1,|L6.128|
00001c 7008 STRB r0,[r1,#0]
;;;211 *(vu8 *)(Bank_NAND_ADDR | ADDR_AREA) = ADDR_1st_CYCLE(ROW_ADDRESS);
00001e f8bd0006 LDRH r0,[sp,#6]
000022 f8bd3004 LDRH r3,[sp,#4]
000026 eb002083 ADD r0,r0,r3,LSL #10
00002a f8bd3008 LDRH r3,[sp,#8]
00002e eb031040 ADD r0,r3,r0,LSL #5
000032 7008 STRB r0,[r1,#0]
;;;212 *(vu8 *)(Bank_NAND_ADDR | ADDR_AREA) = ADDR_2nd_CYCLE(ROW_ADDRESS);
000034 0a03 LSRS r3,r0,#8
000036 700b STRB r3,[r1,#0]
;;;213 *(vu8 *)(Bank_NAND_ADDR | ADDR_AREA) = ADDR_3rd_CYCLE(ROW_ADDRESS);
000038 0c00 LSRS r0,r0,#16
00003a 7008 STRB r0,[r1,#0]
;;;214
;;;215 *(vu8 *)(Bank_NAND_ADDR | CMD_AREA) = NAND_CMD_AREA_TRUE1;
00003c 2030 MOVS r0,#0x30
00003e 7010 STRB r0,[r2,#0]
;;;216
;;;217 /* Calculate the size */
;;;218 size = NAND_PAGE_SIZE + (NAND_PAGE_SIZE * numpageread);
000040 f44f7000 MOV r0,#0x200
000044 eb002245 ADD r2,r0,r5,LSL #9
;;;219
;;;220 /* Get Data into Buffer */
;;;221 for(; index < size; index++)
;;;222 {
;;;223 pBuffer[index]= *(vu8 *)(Bank_NAND_ADDR | DATA_AREA);
000048 f04f43e0 MOV r3,#0x70000000
00004c e004 B |L6.88|
|L6.78|
00004e 7818 LDRB r0,[r3,#0]
000050 1c66 ADDS r6,r4,#1 ;221
000052 f8080004 STRB r0,[r8,r4]
000056 4634 MOV r4,r6 ;221
|L6.88|
000058 4294 CMP r4,r2 ;221
00005a d3f8 BCC |L6.78|
;;;224 }
;;;225
;;;226 numpageread++;
00005c 1c6d ADDS r5,r5,#1
;;;227
;;;228 NumPageToRead--;
00005e 1e7f SUBS r7,r7,#1
;;;229
;;;230 /* Calculate page address */
;;;231 addressstatus = FSMC_NAND_AddressIncrement(&Address);
000060 a801 ADD r0,sp,#4
000062 f7fffffe BL FSMC_NAND_AddressIncrement
000066 4606 MOV r6,r0
|L6.104|
000068 b10f CBZ r7,|L6.110|
00006a 454e CMP r6,r9 ;205
00006c d0d2 BEQ |L6.20|
|L6.110|
;;;232 }
;;;233
;;;234 status = FSMC_NAND_GetStatus();
00006e f7fffffe BL FSMC_NAND_GetStatus
;;;235
;;;236 return (status | addressstatus);
000072 4330 ORRS r0,r0,r6
;;;237 }
000074 b004 ADD sp,sp,#0x10
000076 e8bd83f0 POP {r4-r9,pc}
;;;238
ENDP
00007a 0000 DCW 0x0000
|L6.124|
DCD 0x70010000
|L6.128|
DCD 0x70020000
AREA ||i.FSMC_NAND_ReadSpareArea||, CODE, READONLY, ALIGN=2
FSMC_NAND_ReadSpareArea PROC
;;;314 *******************************************************************************/
;;;315 u32 FSMC_NAND_ReadSpareArea(u8 *pBuffer, NAND_ADDRESS Address, u32 NumSpareAreaToRead)
000000 e92d43ff PUSH {r0-r9,lr}
;;;316 {
;;;317 u32 numsparearearead = 0x00, index = 0x00, addressstatus = NAND_VALID_ADDRESS;
000004 2500 MOVS r5,#0
000006 f44f7980 MOV r9,#0x100
00000a 4680 MOV r8,r0 ;316
00000c 461f MOV r7,r3 ;316
00000e 462c MOV r4,r5
000010 464e MOV r6,r9
;;;318 u32 status = NAND_READY, size = 0x00;
;;;319
;;;320 while((NumSpareAreaToRead != 0x0) && (addressstatus == NAND_VALID_ADDRESS))
000012 e029 B |L7.104|
|L7.20|
;;;321 {
;;;322 /* Page Read command and page address */
;;;323 *(vu8 *)(Bank_NAND_ADDR | CMD_AREA) = NAND_CMD_AREA_C;
000014 4a19 LDR r2,|L7.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,|L7.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 f8bd0006 LDRH r0,[sp,#6]
000024 f8bd3004 LDRH r3,[sp,#4]
000028 eb002083 ADD r0,r0,r3,LSL #10
00002c f8bd3008 LDRH r3,[sp,#8]
000030 eb031040 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 eb001205 ADD r2,r0,r5,LSL #4
;;;334
;;;335 /* Get Data into Buffer */
;;;336 for ( ;index < size; index++)
;;;337 {
;;;338 pBuffer[index] = *(vu8 *)(Bank_NAND_ADDR | DATA_AREA);
000048 f04f43e0 MOV r3,#0x70000000
00004c e004 B |L7.88|
|L7.78|
00004e 7818 LDRB r0,[r3,#0]
000050 1c66 ADDS r6,r4,#1 ;336
000052 f8080004 STRB r0,[r8,r4]
000056 4634 MOV r4,r6 ;336
|L7.88|
000058 4294 CMP r4,r2 ;336
00005a d3f8 BCC |L7.78|
;;;339 }
;;;340
;;;341 numsparearearead++;
00005c 1c6d ADDS r5,r5,#1
;;;342
;;;343 NumSpareAreaToRead--;
00005e 1e7f SUBS r7,r7,#1
;;;344
;;;345 /* Calculate page address */
;;;346 addressstatus = FSMC_NAND_AddressIncrement(&Address);
000060 a801 ADD r0,sp,#4
000062 f7fffffe BL FSMC_NAND_AddressIncrement
000066 4606 MOV r6,r0
|L7.104|
000068 b10f CBZ r7,|L7.110|
00006a 454e CMP r6,r9 ;320
00006c d0d2 BEQ |L7.20|
|L7.110|
;;;347 }
;;;348
;;;349 status = FSMC_NAND_GetStatus();
00006e f7fffffe BL FSMC_NAND_GetStatus
;;;350
;;;351 return (status | addressstatus);
000072 4330 ORRS r0,r0,r6
;;;352 }
000074 b004 ADD sp,sp,#0x10
000076 e8bd83f0 POP {r4-r9,pc}
;;;353
ENDP
00007a 0000 DCW 0x0000
|L7.124|
DCD 0x70010000
|L7.128|
DCD 0x70020000
AREA ||i.FSMC_NAND_ReadStatus||, CODE, READONLY, ALIGN=2
FSMC_NAND_ReadStatus PROC
;;;431 *******************************************************************************/
;;;432 u32 FSMC_NAND_ReadStatus(void)
000000 2000 MOVS r0,#0
;;;433 {
;;;434 u32 data = 0x00, status = NAND_BUSY;
;;;435
;;;436 /* Read status operation ------------------------------------ */
;;;437 *(vu8 *)(Bank_NAND_ADDR | CMD_AREA) = NAND_CMD_STATUS;
000002 4a06 LDR r2,|L8.28|
000004 2170 MOVS r1,#0x70
000006 7011 STRB r1,[r2,#0]
;;;438 data = *(vu8 *)(Bank_NAND_ADDR);
000008 0609 LSLS r1,r1,#24
00000a 7809 LDRB r1,[r1,#0]
;;;439
;;;440 if((data & NAND_ERROR) == NAND_ERROR)
00000c 07ca LSLS r2,r1,#31
00000e d001 BEQ |L8.20|
;;;441 {
;;;442 status = NAND_ERROR;
000010 2001 MOVS r0,#1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -