⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 nand_if.txt

📁 STM32F103ZET6+UCOSII+UCGUI源码
💻 TXT
📖 第 1 页 / 共 3 页
字号:
;;;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 + -