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

📄 sm.lst

📁 Falsh 读写的demo
💻 LST
📖 第 1 页 / 共 4 页
字号:
 636   3                  return FREE_BLOCK;
 637   3              }
 638   2              else
 639   2              {
 640   3                  Addr    = A2;
 641   3              }
 642   2          }
 643   1          else
 644   1          {
 645   2              return ERROR_BLOCK;
 646   2          }
 647   1      
 648   1          Addr    >>= 1;
 649   1          Addr     &= SmBlockSegMask;
 650   1      
 651   1          return Addr;
 652   1      }
 653          
 654          //----------------------------------------------------------------------------
 655          // Description:
 656          //   Read and verify the block address
 657          //----------------------------------------------------------------------------
 658          UINT16  SmReadBlockAddr (UINT16 Block)
 659          {
 660   1          UINT16  Addr1, Addr2;
 661   1          UINT32  Page;
 662   1          BYTE    RetryCount;
 663   1      
 664   1          Page    = (UINT32)Block << SmPage2BlockShift;      // Block to Page Address
 665   1      
 666   1          for (RetryCount = 0; RetryCount < 3; RetryCount++)
 667   1          {
 668   2                                                             // Read Segment LBA from the first page in the phys
             -ical block
 669   2              SmSetFlashAddr(Page);
 670   2      
 671   2              if (SmFlashCmd(FLASH_READ_EX) != STATUS_SUCCESS)
 672   2                  continue;
C51 COMPILER V7.50   SM                                                                    04/17/2007 10:39:20 PAGE 12  

 673   2      
 674   2              if (SpareArea[BLOCK_STS] != VALID_BLOCK)
 675   2                  continue;
 676   2      
 677   2              Addr1   = SmGetAddr();
 678   2      
 679   2                                                             // Read Segment LBA from the last page in the physi
             -cal block
 680   2              SmSetFlashAddr(Page + SmBlockPageMask);
 681   2      
 682   2              if (SmFlashCmd(FLASH_READ_EX) != STATUS_SUCCESS)
 683   2                  continue;
 684   2      
 685   2              if (SpareArea[BLOCK_STS] != VALID_BLOCK)
 686   2                  continue;
 687   2      
 688   2              Addr2   = SmGetAddr();
 689   2      
 690   2              if ((Addr1 == Addr2) && (Addr1 != ERROR_BLOCK))
 691   2              {
 692   3                  return Addr1;
 693   3              }
 694   2          }
 695   1      
 696   1          if (SmEraseBlock(Block) == STATUS_SUCCESS)         // If Erase Pass return FREE_BLOCK
 697   1          {
 698   2              return FREE_BLOCK;
 699   2          }
 700   1      
 701   1          return ERROR_BLOCK;                                // If Erase Fail return ERROR_BLOCK
 702   1      }
 703          
 704          //----------------------------------------------------------------------------
 705          // Description:
 706          //   Allocate one free block
 707          //----------------------------------------------------------------------------
 708          UINT16  SmAllocateBlock (BYTE Segment)
 709          {
 710   1          UINT16  FreePtr = SmFreeBlockPtr[Segment];
 711   1          UINT16  i = FreePtr, Next;
 712   1          UINT16  FreeTabAddr;
 713   1          BYTE    FreeBitMask;
 714   1      
 715   1      #ifdef  SM_FAST
                  UINT16  TabSegmentBase = Segment ? TabSegment1Base : 0;
              
                  if (Segment == 0)
                  {
                      SegmentBase = 0;
                  }
                  else
                  {
                      if (Segment != SmBlockTabSeg)
                      {
                          SmReadBlockTab(Segment);
                      }
                      else
                      {
                          SmSetSegmentBase(Segment);
                      }
                  }
              #else
C51 COMPILER V7.50   SM                                                                    04/17/2007 10:39:20 PAGE 13  

 734   1          if (Segment != SmBlockTabSeg)                      // Must have
 735   1          {
 736   2              SmReadBlockTab(Segment);
 737   2          }
 738   1      #endif
 739   1      
 740   1          do
 741   1          {
 742   2              Next        = i + 1;
 743   2              if (Next == SegmentTop)
 744   2              {
 745   3                  Next        = 0;
 746   3              }
 747   2      
 748   2      #ifdef  SM_FAST
                      FreeTabAddr = (TabSegmentBase + (i & SmBlockSegMask)) >> 3;
              #else
 751   2              FreeTabAddr = (i & SmBlockSegMask) >> 3;
 752   2      #endif
 753   2              FreeBitMask = (BYTE)1 << (i & 0x07);
 754   2      
 755   2              if (SmFreeTab[FreeTabAddr] & FreeBitMask)
 756   2              {
 757   3                  SmFreeBlockPtr[Segment] = Next;
 758   3                  SmFreeTab[FreeTabAddr] &= ~FreeBitMask;
 759   3                  return (SegmentBase + (i * PLANE_NUMBER));
 760   3              }
 761   2              i           = Next;
 762   2          } while (i != FreePtr);
 763   1      
 764   1          return FREE_BLOCK;
 765   1      }
 766          
 767          //----------------------------------------------------------------------------
 768          // Description:
 769          //   Free one block
 770          //----------------------------------------------------------------------------
 771          void  SmFreeBlock (UINT16 Block)
 772          {
 773   1          BYTE    Segment = SmSrcBlockLog >> SmBlock2SegShift;
 774   1          UINT16  FreeTabAddr;
 775   1          STATUS  Status;
 776   1          UINT16  i;
 777   1      #ifdef  SM_FAST
                  UINT16  TabSegmentBase;
              #endif
 780   1      
 781   1      // Need Any Code for CIS Block
 782   1      
 783   1          Status  = SmEraseBlock(Block);
 784   1          if (Status == STATUS_SUCCESS)
 785   1          {
 786   2      #ifdef  SM_FAST
                      if (Segment == 0)
                      {
                          TabSegmentBase  = 0;
                          i               = Block / PLANE_NUMBER;
                      }
                      else
                      {
                          if (Segment != SmBlockTabSeg)
                          {
C51 COMPILER V7.50   SM                                                                    04/17/2007 10:39:20 PAGE 14  

                              return;
                          }
                          TabSegmentBase  = TabSegment1Base;
                          i               = (Block - SegmentBase) / PLANE_NUMBER;
                      }
                      FreeTabAddr             = (TabSegmentBase + (i & SmBlockSegMask)) >> 3;
                      SmFreeTab[FreeTabAddr] |= (BYTE)1 << (i & 0x07);
              #else
 804   2              if (Segment != SmBlockTabSeg)
 805   2              {
 806   3                  return;
 807   3              }
 808   2              i           = (Block - SegmentBase) / PLANE_NUMBER;
 809   2              FreeTabAddr             = (i & SmBlockSegMask) >> 3;
 810   2              SmFreeTab[FreeTabAddr] |= (BYTE)1 << (i & 0x07);
 811   2      #endif
 812   2          }
 813   1      }
 814          
 815          //----------------------------------------------------------------------------
 816          // Description:
 817          //   Gather the block address table from the FLASH header areas
 818          //----------------------------------------------------------------------------
 819          void  SmReadBlockTab (BYTE Segment)
 820          {
 821   1          UINT16  StartBlock, BlockAddr, TableAddr, FreeTabAddr;
 822   1          UINT16  i, j;
 823   1      
 824   1      #ifdef  SM_FAST
                  UINT16  TabSegmentBase = Segment ? TabSegment1Base : 0;
              #endif
 827   1      
 828   1          SmSetSegmentBase(Segment);
 829   1      
 830   1      #ifdef  SM_FAST
                  memset(SmBlockTab + TabSegmentBase, 0xff, sizeof(UINT16) << SmBlock2SegShift);
                  memset(SmFreeTab + (TabSegmentBase >> 3), 0x00, SmBlocksPerSeg >> 3);
              #else
 834   1          memset(SmBlockTab, 0xff, sizeof(UINT16) << SmBlock2SegShift);
 835   1          memset(SmFreeTab, 0x00, SmBlocksPerSeg >> 3);
 836   1      #endif
 837   1      
 838   1          StartBlock  = 0;
 839   1          i           = StartBlock;                          // Relative Block Address
 840   1          j           = SegmentBase + (StartBlock * PLANE_NUMBER);
 841   1                                                             // Search the FLASH for block addresses
 842   1          for (; i < SmBlocksPerSeg; i++, j += PLANE_NUMBER)
 843   1          {
 844   2              BlockAddr   = SmReadBlockAddr(j);
 845   2      
 846   2              if (BlockAddr == ERROR_BLOCK)
 847   2              {
 848   3                  continue;
 849   3              }
 850   2      
 851   2              if (BlockAddr == FREE_BLOCK)
 852   2              {
 853   3      #ifdef  SM_FAST
                          FreeTabAddr = (TabSegmentBase + i) >> 3;
              #else
 856   3                  FreeTabAddr = i >> 3;
 857   3      #endif
C51 COMPILER V7.50   SM                                                                    04/17/2007 10:39:20 PAGE 15  

 858   3                  SmFreeTab[FreeTabAddr] |= (BYTE)1 << (i & 0x07);
 859   3                  continue;
 860   3              }
 861   2      
 862   2      #ifdef  SM_FAST
                      TableAddr   = TabSegmentBase + BlockAddr;
              #else
 865   2              TableAddr   = BlockAddr;
 866   2      #endif
 867   2              if (SmBlockTab[TableAddr] == FREE_BLOCK)
 868   2              {
 869   3                  SmBlockTab[TableAddr]   = j;
 870   3              }
 871   2              else
 872   2              {
 873   3                  if (SmEraseBlock(j) == STATUS_SUCCESS)
 874   3                  {
 875   4      #ifdef  SM_FAST
                              FreeTabAddr = (TabSegmentBase + i) >> 3;
              #else
 878   4                      FreeTabAddr = i >> 3;
 879   4      #endif
 880   4                      SmFreeTab[FreeTabAddr] |= (BYTE)1 << (i & 0x07);
 881   4                  }
 882   3              }
 883   2          }
 884   1      
 885   1      #ifdef  SM_FAST
                  if (Segment != 0)
              #endif
 888   1          {
 889   2              SmBlockTabSeg = Segment;
 890   2          }
 891   1      }
 892          
 893          //----------------------------------------------------------------------------
 894          // Description:
 895          //   Copy one block to another block
 896          //----------------------------------------------------------------------------
 897          STATUS  SmCopyBlock (UINT16 SrcBlock, UINT16 DestBlock, TCOPY_MODE Mode)
 898          {
 899   1          UINT32  SrcPage = (UINT32)SrcBlock << SmPage2BlockShift;
 900   1          UINT32  DestPage = (UINT32)DestBlock << SmPage2BlockShift;
 901   1          BYTE    i;
 902   1      
 903   1          for (i = 0; i < SmPagesPerBlock; i++)
 904   1          {
 905   2              if ((Mode == COPY_ALL) ||
 906   2                  ((Mode == COPY_DIRTY) && !SmCleanPage[i]) ||
 907   2                  ((Mode == COPY_CLEAN) && SmCleanPage[i]))
 908   2              {
 909   3                  SmSetFlashAddr(SrcPage + i);
 910   3                  if (SmFlashCmd(FLASH_CP) != STATUS_SUCCESS)
 911   3                  {
 912   4                      return STATUS_FLASH_ERROR;
 913   4                  }
 914   3      
 915   3                  SmSetFlashAddr(DestPage + i);
 916   3                  if (SmFlashCmd(FLASH_CP_PROG) != STATUS_SUCCESS)
 917   3                  {
 918   4                      return STATUS_FLASH_ERROR;
 919   4                  }
C51 COMPILER V7.50   SM                                                                    04/17/2007 10:39:20 PAGE 16  

 920   3      
 921   3                  if (SmReadStatus() & 0x01)
 922   3                  {
 923   4                      return STATUS_FLASH_ERROR;
 924   4                  }
 925   3              }
 926   2          }
 927   1          return STATUS_SUCCESS;
 928   1      }
 929          
 930          //----------------------------------------------------------------------------
 931          // Description:
 932          //   Error handling
 933          //----------------------------------------------------------------------------
 934          STATUS  SmRepairBlock (void)
 935          {
 936   1          BYTE    Segment = SmSrcBlockLog >> SmBlock2SegShift;
 937   1          UINT16  NewDestBlock;
 938   1          STATUS  Status;
 939   1      
 940   1          while (true)
 941   1          {
 942   2              NewDestBlock    = SmAllocateBlock(Segment);
 943   2              if (NewDestBlock == FREE_BLOCK)
 944   2              {
 945   3                  return STATUS_NO_BLOCK;
 946   3              }
 947   2      
 948   2              Status          = SmCopyBlock(SmDestBlock, NewDestBlock, COPY_CLEAN);
 949   2              if (Status == STATUS_SUCCESS)
 950   2              {
 951   3                  SmMarkInvalidBlock(SmDestBlock);
 952   3                  SmDestBlock = NewDestBlock;
 953   3                  SmUpdateBlockTab(SmSrcBlockLog, SmDestBlock);
 954   3              }
 955   2              else if (Status == STATUS_FLASH_ERROR)
 956   2              {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -