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