📄 sm.lst
字号:
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 + -