📄 fsmc_nand.txt
字号:
000010 1e5b SUBS r3,r3,#1
|L5.18|
000012 2840 CMP r0,#0x40
000014 d002 BEQ |L5.28|
000016 2b00 CMP r3,#0
000018 d1f8 BNE |L5.12|
00001a e001 B |L5.32|
|L5.28|
00001c 2b00 CMP r3,#0
00001e d101 BNE |L5.36|
|L5.32|
000020 f44ff44f MOV r0,#0x400
|L5.36|
000024 bd00 POP {pc}
ENDP
AREA ||i.FSMC_NAND_WriteSmallPage||, CODE, READONLY, ALIGN=2
FSMC_NAND_WriteSmallPage PROC
;;;140 u32 FSMC_NAND_WriteSmallPage(u8 *pBuffer, NAND_ADDRESS Address, u32 NumPageToWrite)
;;;141 {
000000 e92de92d PUSH {r0-r11,lr}
;;;142 u32 index = 0x00, numpagewritten = 0x00, addressstatus = NAND_VALID_ADDRESS;
000004 2400 MOVS r4,#0
000006 f44ff44f MOV r10,#0x100
00000a 4681 MOV r9,r0 ;141
00000c 461f MOV r7,r3 ;141
00000e 4626 MOV r6,r4
000010 46d0 MOV r8,r10
;;;143 u32 status = NAND_READY, size = 0x00;
000012 2540 MOVS r5,#0x40
000014 f8dff8df LDR r11,|L6.148|
;;;144
;;;145 while((NumPageToWrite != 0x00) && (addressstatus == NAND_VALID_ADDRESS) && (status == NAND_READY))
000018 e032 B |L6.128|
|L6.26|
;;;146 {
;;;147 /* Page write command and address */
;;;148 *(vu8 *)(Bank_NAND_ADDR | CMD_AREA) = NAND_CMD_AREA_A;
00001a 2000 MOVS r0,#0
00001c f88bf88b STRB r0,[r11,#0]
;;;149 *(vu8 *)(Bank_NAND_ADDR | CMD_AREA) = NAND_CMD_WRITE0;
000020 2180 MOVS r1,#0x80
000022 f88bf88b STRB r1,[r11,#0]
;;;150
;;;151 *(vu8 *)(Bank_NAND_ADDR | ADDR_AREA) = 0x00;
000026 491c LDR r1,|L6.152|
000028 7008 STRB r0,[r1,#0]
;;;152 *(vu8 *)(Bank_NAND_ADDR | ADDR_AREA) = ADDR_1st_CYCLE(ROW_ADDRESS);
00002a f8bdf8bd LDRH r0,[sp,#6]
00002e f8bdf8bd LDRH r2,[sp,#4]
000032 eb00eb00 ADD r0,r0,r2,LSL #10
000036 f8bdf8bd LDRH r2,[sp,#8]
00003a eb02eb02 ADD r0,r2,r0,LSL #5
00003e 7008 STRB r0,[r1,#0]
;;;153 *(vu8 *)(Bank_NAND_ADDR | ADDR_AREA) = ADDR_2nd_CYCLE(ROW_ADDRESS);
000040 0a02 LSRS r2,r0,#8
000042 700a STRB r2,[r1,#0]
;;;154 *(vu8 *)(Bank_NAND_ADDR | ADDR_AREA) = ADDR_3rd_CYCLE(ROW_ADDRESS);
000044 0c00 LSRS r0,r0,#16
000046 7008 STRB r0,[r1,#0]
;;;155
;;;156 /* Calculate the size */
;;;157 size = NAND_PAGE_SIZE + (NAND_PAGE_SIZE * numpagewritten);
000048 f44ff44f MOV r0,#0x200
00004c eb00eb00 ADD r1,r0,r6,LSL #9
000050 f04ff04f MOV r0,#0x70000000
000054 e004 B |L6.96|
;;;158
;;;159 /* Write data */
;;;160 for(; index < size; index++)
;;;161 {
;;;162 *(vu8 *)(Bank_NAND_ADDR | DATA_AREA) = pBuffer[index];
000056 bf00 NOP
|L6.88|
000058 f819f819 LDRB r2,[r9,r4]
00005c 7002 STRB r2,[r0,#0]
00005e 1c64 ADDS r4,r4,#1 ;160
|L6.96|
000060 428c CMP r4,r1 ;160
000062 d3f9 BCC |L6.88|
;;;163 }
;;;164
;;;165 *(vu8 *)(Bank_NAND_ADDR | CMD_AREA) = NAND_CMD_WRITE_TRUE1;
000064 2010 MOVS r0,#0x10
000066 f88bf88b STRB r0,[r11,#0]
;;;166
;;;167 /* Check status for successful operation */
;;;168 status = FSMC_NAND_GetStatus();
00006a f7fff7ff BL FSMC_NAND_GetStatus
00006e 4605 MOV r5,r0
;;;169
;;;170 if(status == NAND_READY)
000070 2840 CMP r0,#0x40
000072 d105 BNE |L6.128|
;;;171 {
;;;172 numpagewritten++;
000074 1c76 ADDS r6,r6,#1
;;;173
;;;174 NumPageToWrite--;
000076 1e7f SUBS r7,r7,#1
;;;175
;;;176 /* Calculate Next small page Address */
;;;177 addressstatus = FSMC_NAND_AddressIncrement(&Address);
000078 a801 ADD r0,sp,#4
00007a f7fff7ff BL FSMC_NAND_AddressIncrement
00007e 4680 MOV r8,r0
|L6.128|
000080 b11f CBZ r7,|L6.138|
000082 45d0 CMP r8,r10 ;145
000084 d101 BNE |L6.138|
000086 2d40 CMP r5,#0x40 ;145
000088 d0c7 BEQ |L6.26|
|L6.138|
;;;178 }
;;;179 }
;;;180
;;;181 return (status | addressstatus);
00008a ea45ea45 ORR r0,r5,r8
;;;182 }
00008e b004 ADD sp,sp,#0x10
000090 e8bde8bd POP {r4-r11,pc}
;;;183
ENDP
|L6.148|
000094 70010000 DCD 0x70010000
|L6.152|
000098 70020000 DCD 0x70020000
AREA ||i.FSMC_NAND_ReadSmallPage||, CODE, READONLY, ALIGN=2
FSMC_NAND_ReadSmallPage PROC
;;;200 u32 FSMC_NAND_ReadSmallPage(u8 *pBuffer, NAND_ADDRESS Address, u32 NumPageToRead)
;;;201 {
000000 e92de92d PUSH {r0-r9,lr}
;;;202 u32 index = 0x00, numpageread = 0x00, addressstatus = NAND_VALID_ADDRESS;
000004 2400 MOVS r4,#0
000006 f44ff44f MOV r9,#0x100
00000a 4680 MOV r8,r0 ;201
00000c 461e MOV r6,r3 ;201
00000e 4625 MOV r5,r4
000010 464f MOV r7,r9
;;;203 u32 status = NAND_READY, size = 0x00;
;;;204
;;;205 while((NumPageToRead != 0x0) && (addressstatus == NAND_VALID_ADDRESS))
000012 e029 B |L7.104|
|L7.20|
;;;206 {
;;;207 /* Page Read command and page address */
;;;208 *(vu8 *)(Bank_NAND_ADDR | CMD_AREA) = NAND_CMD_AREA_A;
000014 4a19 LDR r2,|L7.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,|L7.128|
00001c 7008 STRB r0,[r1,#0]
;;;211 *(vu8 *)(Bank_NAND_ADDR | ADDR_AREA) = ADDR_1st_CYCLE(ROW_ADDRESS);
00001e f8bdf8bd LDRH r0,[sp,#6]
000022 f8bdf8bd LDRH r3,[sp,#4]
000026 eb00eb00 ADD r0,r0,r3,LSL #10
00002a f8bdf8bd LDRH r3,[sp,#8]
00002e eb03eb03 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 f44ff44f MOV r0,#0x200
000044 eb00eb00 ADD r1,r0,r5,LSL #9
000048 f04ff04f MOV r2,#0x70000000
00004c e004 B |L7.88|
|L7.78|
;;;219
;;;220 /* Get Data into Buffer */
;;;221 for(; index < size; index++)
;;;222 {
;;;223 pBuffer[index]= *(vu8 *)(Bank_NAND_ADDR | DATA_AREA);
00004e 7813 LDRB r3,[r2,#0]
000050 1c60 ADDS r0,r4,#1 ;221
000052 f808f808 STRB r3,[r8,r4]
000056 4604 MOV r4,r0 ;221
|L7.88|
000058 428c CMP r4,r1 ;221
00005a d3f8 BCC |L7.78|
;;;224 }
;;;225
;;;226 numpageread++;
00005c 1c6d ADDS r5,r5,#1
;;;227
;;;228 NumPageToRead--;
00005e 1e76 SUBS r6,r6,#1
;;;229
;;;230 /* Calculate page address */
;;;231 addressstatus = FSMC_NAND_AddressIncrement(&Address);
000060 a801 ADD r0,sp,#4
000062 f7fff7ff BL FSMC_NAND_AddressIncrement
000066 4607 MOV r7,r0
|L7.104|
000068 b10e CBZ r6,|L7.110|
00006a 454f CMP r7,r9 ;205
00006c d0d2 BEQ |L7.20|
|L7.110|
;;;232 }
;;;233
;;;234 status = FSMC_NAND_GetStatus();
00006e f7fff7ff BL FSMC_NAND_GetStatus
;;;235
;;;236 return (status | addressstatus);
000072 4338 ORRS r0,r0,r7
;;;237 }
000074 b004 ADD sp,sp,#0x10
000076 e8bde8bd POP {r4-r9,pc}
;;;238
ENDP
00007a 0000 DCW 0x0000
|L7.124|
00007c 70010000 DCD 0x70010000
|L7.128|
000080 70020000 DCD 0x70020000
AREA ||i.FSMC_NAND_WriteSpareArea||, CODE, READONLY, ALIGN=2
FSMC_NAND_WriteSpareArea PROC
;;;255 u32 FSMC_NAND_WriteSpareArea(u8 *pBuffer, NAND_ADDRESS Address, u32 NumSpareAreaTowrite)
;;;256 {
000000 e92de92d PUSH {r0-r11,lr}
;;;257 u32 index = 0x00, numsparesreawritten = 0x00, addressstatus = NAND_VALID_ADDRESS;
000004 2400 MOVS r4,#0
000006 f44ff44f MOV r10,#0x100
00000a 4681 MOV r9,r0 ;256
00000c 461f MOV r7,r3 ;256
00000e 4626 MOV r6,r4
000010 46d0 MOV r8,r10
;;;258 u32 status = NAND_READY, size = 0x00;
000012 2540 MOVS r5,#0x40
000014 f8dff8df LDR r11,|L8.148|
;;;259
;;;260 while((NumSpareAreaTowrite != 0x00) && (addressstatus == NAND_VALID_ADDRESS) && (status == NAND_READY))
000018 e031 B |L8.126|
|L8.26|
;;;261 {
;;;262 /* Page write Spare area command and address */
;;;263 *(vu8 *)(Bank_NAND_ADDR | CMD_AREA) = NAND_CMD_AREA_C;
00001a 2050 MOVS r0,#0x50
00001c f88bf88b STRB r0,[r11,#0]
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -