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

📄 sm.lst

📁 Falsh 读写的demo
💻 LST
📖 第 1 页 / 共 4 页
字号:
 957   3                  SmMarkInvalidBlock(NewDestBlock);
 958   3                  continue;
 959   3              }
 960   2              break;
 961   2          }
 962   1          return Status;
 963   1      }
 964          
 965          //----------------------------------------------------------------------------
 966          // Description:
 967          //   Pad one blank page with block address
 968          //----------------------------------------------------------------------------
 969          STATUS  SmPadPage (BYTE p)
 970          {
 971   1          STATUS  Status;
 972   1          UINT32  Page = ((UINT32)SmDestBlock << SmPage2BlockShift) + p;
 973   1      
 974   1          while (true)
 975   1          {
 976   2              SmNeedSetExtra  = true;                        // SmLog2PhyBlock May Destroy Redundant Area Data
 977   2      
 978   2              SmSetBlockExtra(SmSrcBlockLog);
 979   2      
 980   2      // Just Write Redundant Area
 981   2              SmSetFlashAddr(Page);
C51 COMPILER V7.50   SM                                                                    04/17/2007 10:39:20 PAGE 17  

 982   2              SmFlashCmd(FLASH_PAD);
 983   2      
 984   2              Status      = SmParseStatus(SmReadStatus());
 985   2              if (Status == STATUS_SUCCESS)
 986   2              {
 987   3                  break;
 988   3              }
 989   2              else if (Status == STATUS_FLASH_ERROR)
 990   2              {
 991   3                  Status  = SmRepairBlock();
 992   3                  if (Status != STATUS_SUCCESS)
 993   3                  {
 994   4                      return Status;
 995   4                  }
 996   3              }
 997   2              else
 998   2              {
 999   3                  return Status;
1000   3              }
1001   2          }
1002   1          return STATUS_SUCCESS;
1003   1      }
1004          
1005          //----------------------------------------------------------------------------
1006          // Description:
1007          //   Flush one block to the FLASH
1008          //----------------------------------------------------------------------------
1009          STATUS  SmFlushBlock (void)
1010          {
1011   1          STATUS  Status;
1012   1          BYTE    i;
1013   1      
1014   1          if (SmDestBlock == FREE_BLOCK)
1015   1          {
1016   2              return STATUS_SUCCESS;
1017   2          }
1018   1      
1019   1          if (SmSrcBlock != FREE_BLOCK)
1020   1          {
1021   2              while (true)
1022   2              {
1023   3                  Status  = SmCopyBlock(SmSrcBlock, SmDestBlock, COPY_DIRTY);
1024   3                  if (Status == STATUS_SUCCESS)
1025   3                  {
1026   4                      break;
1027   4                  }
1028   3                  else if (Status == STATUS_FLASH_ERROR)
1029   3                  {
1030   4                      Status  = SmRepairBlock();             // Save Destination Block and New Destination Block
1031   4                      if (Status != STATUS_SUCCESS)
1032   4                      {
1033   5                          return Status;
1034   5                      }
1035   4                  }
1036   3                  else
1037   3                  {
1038   4                      return Status;
1039   4                  }
1040   3              }
1041   2              SmFreeBlock(SmSrcBlock);
1042   2              SmSrcBlock  = FREE_BLOCK;
1043   2          }
C51 COMPILER V7.50   SM                                                                    04/17/2007 10:39:20 PAGE 18  

1044   1          else
1045   1          {
1046   2              if (!SmCleanPage[0])
1047   2              {
1048   3                  SmPadPage(0);
1049   3              }
1050   2              if (!SmCleanPage[SmBlockPageMask])
1051   2              {
1052   3                  SmPadPage(SmBlockPageMask);
1053   3              }
1054   2          }
1055   1      
1056   1          SmDestBlock = FREE_BLOCK;
1057   1          for (i = 0; i < MAX_PAGES_PER_BLOCK; i++)
1058   1          {
1059   2              SmCleanPage[i] = false;
1060   2          }
1061   1          SmFlushTimer    = 0;
1062   1          SmFlushFlag     = false;
1063   1          SmJustWrite     = false;
1064   1      
1065   1          return STATUS_SUCCESS;
1066   1      }
1067          
1068          //----------------------------------------------------------------------------
1069          // Description:
1070          //   Read one sector of data from the Smart Media device
1071          //----------------------------------------------------------------------------
1072          STATUS  SmReadSector (void)
1073          {
1074   1          STATUS  Status;
1075   1          UINT32  PhyPageAddr;
1076   1          UINT16  LogBlock, LogBlockSeg, TargetPhyBlock;
1077   1      
1078   1          if (SmMediaStatus != STATUS_SUCCESS)
1079   1          {
1080   2              return SmMediaStatus;
1081   2          }
1082   1      
1083   1          if (SmJustWrite)
1084   1          {
1085   2              SmFlushBlock();
1086   2          }
1087   1      
1088   1          LogBlock        = SectorStart >> SmPage2BlockShift;
1089   1          LogBlockSeg     = LogBlock + SmLog2TabAddrGap(LogBlock);
1090   1          TargetPhyBlock  = SmLog2PhyBlock(LogBlockSeg);
1091   1      
1092   1          PageIndex       = (BYTE)SectorStart & SmBlockPageMask;
1093   1          PhyPageAddr     = ((UINT32)TargetPhyBlock << SmPage2BlockShift) + PageIndex;
1094   1      
1095   1      // Need Any Code for TargetPhyBlock == FREE_BLOCK
1096   1          Status          = SmReadPage(PhyPageAddr);
1097   1      
1098   1          return Status;
1099   1      }
1100          
1101          //----------------------------------------------------------------------------
1102          // Description:
1103          //   Write one sector of data to the Smart Media device
1104          //----------------------------------------------------------------------------
1105          STATUS  SmWriteSector (void)
C51 COMPILER V7.50   SM                                                                    04/17/2007 10:39:20 PAGE 19  

1106          {
1107   1          UINT32  PhyPageAddr;
1108   1          BYTE    Segment;
1109   1          UINT16  LogBlock, LogBlockSeg, TargetPhyBlock;
1110   1          STATUS  Status;
1111   1      
1112   1          if (SmMediaStatus != STATUS_SUCCESS)
1113   1          {
1114   2              return SmMediaStatus;
1115   2          }
1116   1      
1117   1          LogBlock        = SectorStart >> SmPage2BlockShift;
1118   1          LogBlockSeg     = LogBlock + SmLog2TabAddrGap(LogBlock);
1119   1          TargetPhyBlock  = SmLog2PhyBlock(LogBlockSeg);     // Make New Mapping Table
1120   1      
1121   1          PageIndex       = (BYTE)SectorStart & SmBlockPageMask;
1122   1          Segment         = LogBlockSeg >> SmBlock2SegShift;
1123   1                                                             // Save New Logical Segment
1124   1      
1125   1          if ((TargetPhyBlock != SmDestBlock) ||
1126   1              (TargetPhyBlock == FREE_BLOCK) ||
1127   1              (SmCleanPage[PageIndex]))
1128   1      // Note, SmDestBlock Must Have A Physical Block, So TargetPhyBlock == FREE_BLOCK Must Exist
1129   1      // Allocate A Block in New Segment
1130   1          {
1131   2              Status  = SmFlushBlock();
1132   2              if (Status != STATUS_SUCCESS)
1133   2              {
1134   3                  return Status;
1135   3              }
1136   2      
1137   2              SmSrcBlockLog   = LogBlockSeg;                 // Update New Logical Segment and Block
1138   2      
1139   2              SmSrcBlock      = TargetPhyBlock;              // Update New Source Block
1140   2      
1141   2              TargetPhyBlock  = SmAllocateBlock(Segment);    // Allocate A Block in New Segment
1142   2              if (TargetPhyBlock == FREE_BLOCK)
1143   2              {
1144   3                  return STATUS_NO_BLOCK;
1145   3              }
1146   2              SmDestBlock     = TargetPhyBlock;              // Update New Destination Block
1147   2      
1148   2              SmUpdateBlockTab(SmSrcBlockLog, SmDestBlock);
1149   2                                                             // Update New Mapping Table
1150   2          }
1151   1      
1152   1          PhyPageAddr     = ((UINT32)TargetPhyBlock << SmPage2BlockShift) + PageIndex;
1153   1      
1154   1          SmFlushTimer    = 0;
1155   1          SmFlushFlag     = false;
1156   1      
1157   1          SmNeedSetExtra  = true;
1158   1      
1159   1          Status          = SmWritePage(PhyPageAddr);
1160   1      
1161   1          return STATUS_SUCCESS;
1162   1      }
1163          
1164          //----------------------------------------------------------------------------
1165          // Description:
1166          //   Get the index of FLASH chip type
1167          //----------------------------------------------------------------------------
C51 COMPILER V7.50   SM                                                                    04/17/2007 10:39:20 PAGE 20  

1168          BYTE  SmGetFlashTypeIndex (BYTE Id)
1169          {
1170   1          BYTE    i = 0;
1171   1      
1172   1          while (SmDeviceTab[i].DeviceId != 0x00)
1173   1          {
1174   2              if (Id == SmDeviceTab[i].DeviceId)
1175   2              {
1176   3                  return i;
1177   3              }
1178   2              i++;
1179   2          }
1180   1          return 0xff;
1181   1      }
1182          
1183          //----------------------------------------------------------------------------
1184          // Description:
1185          //   Read system information of SmartMedia
1186          //----------------------------------------------------------------------------
1187          STATUS  SmReadFlashInfo (void)
1188          {
1189   1          BYTE    Id;
1190   1          UINT16  i;
1191   1      
1192   1                                                             // Read Device ID and get system information
1193   1          Id  = SmReadId();
1194   1      
1195   1          SmDeviceIndex   = SmGetFlashTypeIndex(Id);
1196   1          if (SmDeviceIndex == 0xff)
1197   1          {
1198   2              return STATUS_NO_MEDIA;
1199   2          }
1200   1      
1201   1          for (i = 0; i < MAX_PAGES_PER_BLOCK; i++)
1202   1          {
1203   2              SmCleanPage[i]      = false;
1204   2          }
1205   1      
1206   1          SmPage2BlockShift       = SmDeviceTab[SmDeviceIndex].PagesShift;
1207   1          SmBlocksPerChipShift    = SmDeviceTab[SmDeviceIndex].BlocksShift;
1208   1          SmPagesPerChipShift     = SmBlocksPerChipShift + SmPage2BlockShift;
1209   1          SmAvailableBlocks       = SmDeviceTab[SmDeviceIndex].AvailableBlocks * SmMaxChipsPerDevice;
1210   1      
1211   1          SmPagesPerBlock         = 1 << SmPage2BlockShift;
1212   1          SmBlockPageMask         = SmPagesPerBlock - 1;
1213   1          SmChipPageMask          = ((UINT32)1 << SmPagesPerChipShift) - 1;
1214   1      
1215   1          for (i = 0; i < SM_MAX_SEGMENTS_PER_DEVICE; i++)
1216   1          {
1217   2              SmFreeBlockPtr[i]   = 0;
1218   2          }
1219   1      
1220   1          SmSrcBlock              = FREE_BLOCK;
1221   1          SmDestBlock             = FREE_BLOCK;
1222   1      #ifdef  SM_FAST
                  SmBlockTabSeg           = 0xFF;
              #endif
1225   1      
1226   1      #ifdef  ERASE_ALL
                  SmEraseAll();
              #endif
1229   1      
C51 COMPILER V7.50   SM                                                                    04/17/2007 10:39:20 PAGE 21  

1230   1          SmReadBlockTab(0);
1231   1      
1232   1          SmAvailableBlocks       = SmAvailableBlocks;       // We don't need config data block
1233   1          SmAvailableSectors      = ((UINT32)SmAvailableBlocks << SmPage2BlockShift) - 1;
1234   1          SmDeviceLastPage        = ((UINT32)1 << SmPagesPerChipShift) * SmMaxChipsPerDevice - 1;
1235   1      
1236   1          return STATUS_SUCCESS;
1237   1      }
1238          
1239          //----------------------------------------------------------------------------
1240          // Description:
1241          //
1242          //----------------------------------------------------------------------------
1243          void  SmMediaChange (void)
1244          {
1245   1          if (SmMediaStatus == STATUS_NO_MEDIA)
1246   1          {
1247   2              SmMediaStatus   = SmReadFlashInfo();
1248   2          }
1249   1          else
1250   1          {
1251   2              SmAvailableSectors  = 0;
1252   2              SmMediaStatus       = STATUS_NO_MEDIA;
1253   2          }
1254   1      }
1255          
1256          //----------------------------------------------------------------------------
1257          // Description:
1258          //
1259          //----------------------------------------------------------------------------
1260          void  SmInit (void)
1261          {
1262   1          SmMediaChange();
1263   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   4100    ----
   CONSTANT SIZE    =     36    ----
   XDATA SIZE       =   2595     104
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----    ----
   IDATA SIZE       =     14    ----
   BIT SIZE         =   ----       2
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

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