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

📄 fsmwritetask.c

📁 norflash的文件系统。 用于中低端手机开发的参考
💻 C
📖 第 1 页 / 共 5 页
字号:
						);

		if(ret != ERR_NONE)
			return ret;

		if (FsmGetMtxSem(MediaObjP->MapTblLock) != ERR_NONE)
		{
			return ERR_SYSTEM;
		}
		MediaObjP->Lsn2PsnP[lsn] = NewPsn;
		if (FsmReleaseMtxSem(MediaObjP->MapTblLock) != ERR_NONE)
		{
			return ERR_SYSTEM;
		}

		/* new sector state to updating */
		SectorHdr.Status = SECTOR_UPDATING;
		ret = DevWrite( DevP,
						(uint8 *)&SectorHdr.Status,
						NewSectorAddr + FIELD_OFFSET(FsmFlashSectorHdrT, Status), 
						FIELD_SIZE(FsmFlashSectorHdrT, Status)
						);

		if(ret != ERR_NONE)
			return ret;

		/* old sector state to deleting */
		SectorHdr.Status = SECTOR_DELETING;
		ret = DevWrite( DevP,
						(uint8 *)&SectorHdr.Status, 
						OldSectorAddr + FIELD_OFFSET(FsmFlashSectorHdrT, Status),
						FIELD_SIZE(FsmFlashSectorHdrT, Status)
						);	

		if(ret != ERR_NONE)
			return ret;

		/* new sector state to valid */
		SectorHdr.Status = SECTOR_VALID;
		ret = DevWrite( DevP,
						(uint8 *)&SectorHdr.Status, 
						NewSectorAddr + FIELD_OFFSET(FsmFlashSectorHdrT, Status), 
						FIELD_SIZE(FsmFlashSectorHdrT, Status)
						);

		if(ret != ERR_NONE)
			return ret;

		/* old sector state to invalid */
		SectorHdr.Status = SECTOR_INVALID;
		ret = DevWrite( DevP,
						(uint8 *)&SectorHdr.Status, 
						OldSectorAddr + FIELD_OFFSET(FsmFlashSectorHdrT, Status),
						FIELD_SIZE(FsmFlashSectorHdrT, Status)
						);	

		if(ret != ERR_NONE)
			return ret;

		BlkNum = (uint16)(OldPsn / MediaObjP->SectorsPerBlock);

		if (FsmGetMtxSem(MediaObjP->InfoLock) != ERR_NONE)
		{
			return ERR_SYSTEM;
		}
		MediaObjP->BlockInfoP[BlkNum].DirtySectors += 1;
		MediaObjP->BlockInfoP[BlkNum].UsedSectors -= 1;
		if (FsmReleaseMtxSem(MediaObjP->InfoLock) != ERR_NONE)
		{
			return ERR_SYSTEM;
		}
	}
	else
	{
		uint16		NewFreeInstIndex;

		/* address of the first Status field; */
		temp = OldSectorAddr + sizeof(FsmFlashSectorHdrT)		\
					+ FIELD_OFFSET(FsmMultiInstanceT, Status[0]);

		for (NewFreeInstIndex = InstIndex + 1;
				NewFreeInstIndex < Instances ; 
				NewFreeInstIndex++)
		{
			MultiInstStatus = 0;

			ret  =  DevRead( DevP, 
							 (uint8 *)&MultiInstStatus,
							 temp + NewFreeInstIndex * FIELD_SIZE(FsmMultiInstanceT, Status), 
							 FIELD_SIZE(FsmMultiInstanceT, Status)
							 );

			if(ret != ERR_NONE)
				return ret;

			if (MultiInstStatus == INSTANCE_EMPTY)
			{
				break;
			}
		}

		if (NewFreeInstIndex >= Instances)
		{
			goto Modify_Allocate_New;
		}


		MultiInstStatus = INSTANCE_WRITING;
		ret = DevWrite( DevP, 
						(uint8 *)&MultiInstStatus,
						OldSectorAddr + sizeof(FsmFlashSectorHdrT)		\
							+ FIELD_OFFSET(FsmMultiInstanceT, Status[0])		\
							+ NewFreeInstIndex * FIELD_SIZE(FsmMultiInstanceT, Status), 
						FIELD_SIZE(FsmMultiInstanceT, Status)
						);

		if(ret != ERR_NONE)
			return ret;

		NewWriteOffset = FIELD_SIZE(FsmMultiInstanceT, Length)		\
							+ Instances * FIELD_SIZE(FsmMultiInstanceT, Status)	\
							+ NewFreeInstIndex * len;

		OldWriteOffset = FIELD_SIZE(FsmMultiInstanceT, Length)		\
							+ Instances * FIELD_SIZE(FsmMultiInstanceT, Status)	\
							+ InstIndex * len;

		ret =  DevCopy( DevP,
						OldSectorAddr + sizeof(FsmFlashSectorHdrT) + NewWriteOffset,
						OldSectorAddr + sizeof(FsmFlashSectorHdrT) + OldWriteOffset,
						ItemP->offset
						);

		if(ret != ERR_NONE)
			return ret;

		NewWriteOffset += ItemP->offset;
		OldWriteOffset += ItemP->offset;

		ret = DevWrite( DevP, 
						(uint8 *)(ItemP + 1), 
						OldSectorAddr + sizeof(FsmFlashSectorHdrT) + NewWriteOffset,
						ItemP->length
						);

		if(ret != ERR_NONE)
			return ret;

		NewWriteOffset += ItemP->length;
		OldWriteOffset += ItemP->length;

		ret =  DevCopy( DevP,
						OldSectorAddr + sizeof(FsmFlashSectorHdrT) + NewWriteOffset, 
						OldSectorAddr + sizeof(FsmFlashSectorHdrT) + OldWriteOffset, 
						len - (ItemP->offset + ItemP->length)
						);

		if(ret != ERR_NONE)
			return ret;

		MultiInstStatus = INSTANCE_VALID;
		ret = DevWrite( DevP, 
						(uint8 *)&MultiInstStatus,
						OldSectorAddr + sizeof(FsmFlashSectorHdrT)			\
							+ FIELD_OFFSET(FsmMultiInstanceT, Status[0])		\
							+ NewFreeInstIndex * FIELD_SIZE(FsmMultiInstanceT, Status), 
						FIELD_SIZE(FsmMultiInstanceT, Status)
						);

		if(ret != ERR_NONE)
			return ret;

		MultiInstStatus = INSTANCE_INVALID;
		ret = DevWrite( DevP,
						(uint8 *)&MultiInstStatus,
						OldSectorAddr + sizeof(FsmFlashSectorHdrT)			\
							+ FIELD_OFFSET(FsmMultiInstanceT, Status[0])		\
							+ InstIndex * FIELD_SIZE(FsmMultiInstanceT, Status),
						FIELD_SIZE(FsmMultiInstanceT, Status)
						);

		if(ret != ERR_NONE)
			return ret;
	}

	return ERR_NONE;
}

static uint32 SingleInstanceCreate(
	FsmQueueItemT * ItemP,
	FsmDevObjHdrT * DevP,
	FsmDfsFileDescriptorT * FdP,
	char * NameP)
{
	uint32				ret;

	uint16				temp_uint16;

	uint32				len, FirstLsn;
	uint32				lsn, NextLsn, NewPsn;
	uint32				NewEntryAddr, NewSectorAddr;

	uint8 *				DataP = (uint8 *)(ItemP + 1);

	FsmFlashMediaT *	MediaObjP = (FsmFlashMediaT * )DevP->MediaObjP;

	DEV_WRITE_FUNCPTR	DevWrite = DevP->DevDrvP->FsmDevWrite;
	DEV_READ_FUNCPTR	DevRead = DevP->DevDrvP->FsmDevRead;

	ret = GetFreeEntry(ItemP, &NewEntryAddr);
	if (ret != ERR_NONE)
	{
		return ret;
	}

	ret = GetFreeLsn(DevP, &FirstLsn);
	if (ret != ERR_NONE)
	{
		return ret;
	}

	len = ItemP->length;

	for ( lsn = FirstLsn; len > 0; lsn = NextLsn)
	{
		ret = GetFreePsn(DevP, &NewPsn);
		if (ret != ERR_NONE)
		{
			return ret;
		}

		NewSectorAddr = DfsPsn2Addr(MediaObjP, NewPsn);

		/* sector state to writing */
		temp_uint16 = SECTOR_WRITING;
		ret = DevWrite( DevP, 
						(uint8 *)&temp_uint16,
						NewSectorAddr + FIELD_OFFSET(FsmFlashSectorHdrT, Status), 
						FIELD_SIZE(FsmFlashSectorHdrT, Status)
						);

		if(ret != ERR_NONE)
			return ret;

		if (len <= MediaObjP->SectorSize)
		{
			ret = DevWrite( DevP,
							DataP,
							NewSectorAddr + sizeof(FsmFlashSectorHdrT),
							len
							);

			if(ret != ERR_NONE)
				return ret;

			NextLsn = (uint32)(-1);
			len = 0;
		}
		else
		{
			ret = DevWrite( DevP, 
							DataP, 
							NewSectorAddr + sizeof(FsmFlashSectorHdrT),
							MediaObjP->SectorSize
							);

			if(ret != ERR_NONE)
				return ret;

			len -= MediaObjP->SectorSize;

			DataP = &DataP[MediaObjP->SectorSize];
		}

		temp_uint16 = SECTOR_TYPE_SID;
		ret = DevWrite( DevP, 
						(uint8 *)&temp_uint16, 
						NewSectorAddr + FIELD_OFFSET(FsmFlashSectorHdrT, Type),
						FIELD_SIZE(FsmFlashSectorHdrT, Type)
						);

		if(ret != ERR_NONE)
			return ret;

		ret = DevWrite( DevP,
						(uint8 *)&lsn, 
						NewSectorAddr + FIELD_OFFSET(FsmFlashSectorHdrT, Lsn),
						FIELD_SIZE(FsmFlashSectorHdrT, Lsn)
						);

		if(ret != ERR_NONE)
			return ret;

		if (FsmGetMtxSem(MediaObjP->MapTblLock) != ERR_NONE)
		{
			return ERR_SYSTEM;
		}
		/* Update the Map table,so the subsequent */
		/* call to GetFreeLsn will not return value of this lsn. */
		MediaObjP->Lsn2PsnP[lsn] = NewPsn;
		if (FsmReleaseMtxSem(MediaObjP->MapTblLock) != ERR_NONE)
		{
			return ERR_SYSTEM;
		}

		if (len != 0)
		{
			ret = GetFreeLsn(DevP, &NextLsn);
			if (ret != ERR_NONE)
			{
				return ret;
			}

			ret = DevWrite( DevP, 
							(uint8 *)&NextLsn, 
							NewSectorAddr + FIELD_OFFSET(FsmFlashSectorHdrT, NextLsn),
							FIELD_SIZE(FsmFlashSectorHdrT, NextLsn)
							);

			if(ret != ERR_NONE)
				return ret;
		}
	}

	for (lsn = FirstLsn; lsn != (uint32)(-1);)
	{
		NewPsn = DfsLsn2Psn(MediaObjP, lsn);
		NewSectorAddr = DfsPsn2Addr(MediaObjP, NewPsn);

		/* sector state to allocated */
		temp_uint16 = SECTOR_ALLOCATED;
		ret = DevWrite( DevP,
						(uint8 *)&temp_uint16,
						NewSectorAddr + FIELD_OFFSET(FsmFlashSectorHdrT, Status),
						FIELD_SIZE(FsmFlashSectorHdrT, Status)
						);

		if(ret != ERR_NONE)
			return ret;

		ret  =  DevRead( DevP,
						 (uint8 *)&lsn, 
						 NewSectorAddr + FIELD_OFFSET(FsmFlashSectorHdrT, NextLsn),
						 FIELD_SIZE(FsmFlashSectorHdrT, NextLsn)
						 );

		if(ret != ERR_NONE)
			return ret;
	}

	if (ItemP->type == QUEUE_FILE_DIR)
	{
		FsmFileDirEntryT	FileEntry;

		/* entry state to writing */
		temp_uint16 = ENTRY_WRITING;
		ret = DevWrite( DevP, 
						(uint8 *)&temp_uint16, 
						NewEntryAddr + FIELD_OFFSET(FsmFileDirEntryT, Status), 
						FIELD_SIZE(FsmFileDirEntryT, Status)
						);

		if(ret != ERR_NONE)
			return ret;

		FileEntry.Status   = ENTRY_WRITING;
		FileEntry.Type     = ENTRY_TYPE_FILE;
		FileEntry.Rfu      = 0xFF;
		FileEntry.Date     = FdP->CreateDate;
		FileEntry.Time     = FdP->CreateTime;
		FileEntry.Length   = ItemP->length;
		FileEntry.FirstLsn = FirstLsn;

		/* strcpy(FileEntry.FileName, NameP); */
		/* strncpy(FileEntry.FileName, NameP, FIELD_SIZE(FsmFileDirEntryT, FileName)); */

		len = strlen(NameP) + 1; /* include the terminating zero. */
		if(len > FIELD_SIZE(FsmFileDirEntryT, FileName))
			len = FIELD_SIZE(FsmFileDirEntryT, FileName);

		FsmMemoryMove((uint8 *)&FileEntry.FileName[0],
					  (uint8 *)NameP, 
					  len /*FIELD_SIZE(FsmFileDirEntryT, FileName)*/
					  );

		ret = DevWrite( DevP, 
						(uint8 *)&FileEntry,
						NewEntryAddr, 
						sizeof(FsmFileDirEntryT)
						);

		if(ret != ERR_NONE)
			return ret;

		/* entry state to allocated */
		temp_uint16 = ENTRY_ALLOCATED;
		ret = DevWrite( DevP,
						(uint8 *)&temp_uint16,
						NewEntryAddr + FIELD_OFFSET(FsmFileDirEntryT, Status),
						FIELD_SIZE(FsmFileDirEntryT, Status)
						);

		if(ret != ERR_NONE)
			return ret;
	}
	else
	{
		FsmItemDirEntryT	ItemEntry;

		/* entry state to writing */
		temp_uint16 = ENTRY_WRITING;
		ret = DevWrite( DevP,
						(uint8 *)&temp_uint16,
						NewEntryAddr + FIELD_OFFSET(FsmItemDirEntryT, Status),
						FIELD_SIZE(FsmItemDirEntryT, Status)
						);

		if(ret != ERR_NONE)
			return ret;

		ItemEntry.Status   = ENTRY_WRITING;
		ItemEntry.Type     = ENTRY_TYPE_ITEM;
		ItemEntry.ItemType = ItemP->ItemFd.Item.ItemType;
		ItemEntry.ItemId   = ItemP->ItemFd.Item.ItemId;
		ItemEntry.Method   = METHOD_SINGLE;
		ItemEntry.Length   = ItemP->length;
		ItemEntry.FirstLsn = FirstLsn;

		ret = DevWrite( DevP,
						(uint8 *)&ItemEntry, 
						NewEntryAddr,
						sizeof(FsmItemDirEntryT)
						);

		if(ret != ERR_NONE)
			return ret;

		/* entry state to allocated */
		temp_uint16 = ENTRY_ALLOCATED;
		ret = DevWrite( DevP,
						(uint8 *)&temp_uint16,
						NewEntryAddr + FIELD_OFFSET(FsmItemDirEntryT, Status),
						FIELD_SIZE(FsmItemDirEntryT, Status)
						);

		if(ret != ERR_NONE)
			return ret;
	}

	for (lsn = FirstLsn; lsn != (uint32)(-1);)
	{
		NewPsn = DfsLsn2Psn(MediaObjP, lsn);
		NewSectorAddr = DfsPsn2Addr(MediaObjP, NewPsn);

		/* sector state to valid */
		temp_uint16 = SECTOR_VALID;
		ret = DevWrite( DevP,
						(uint8 *)&temp_uint16,
						NewSectorAddr + FIELD_OFFSET(FsmFlashSectorHdrT, Status),
						FIELD_SIZE(FsmFlashSectorHdrT, Status)
						);

		if(ret != ERR_NONE)
			return ret;

		ret  =  DevRead( DevP,
						 (uint8 *)&lsn,
						 NewSectorAddr + FIELD_OFFSET(FsmFlashSectorHdrT, NextLsn),
						 FIELD_SIZE(FsmFlashSectorHdrT, NextLsn)
						 );

		if(ret != ERR_NONE)
			return ret;
	}

	/* entry state to valid */
	temp_uint16 = ENTRY_VALID;
	if (ItemP->type == QUEUE_FILE_DIR)
	{
		ret = DevWrite( DevP,
						(uint8 *)&temp_uint16,
						NewEntryAddr + FIELD_OFFSET(FsmFileDirEntryT, Status),
						FIELD_SIZE(FsmFileDirEntryT, Status)
						);

		if(ret != ERR_NONE)
			return ret;

		/* FirstLsn updating should be synchronized with FsmRead function. */
		if (FsmGetMtxSem(MediaObjP->MapTblLock) != ERR_NONE)
		{
			return ERR_SYSTEM;
		}
		FdP->FirstLsn = FirstLsn;
		if (FsmReleaseMtxSem(MediaObjP->MapTblLock) != ERR_NONE)
		{
			return ERR_SYSTEM;
		}
	}
	else
	{
		ret = DevWrite( DevP,
						(uint8 *)&temp_uint16,
						NewEntryAddr + FIELD_OFFSET(FsmItemDirEntryT, Status),
						FIELD_SIZE(FsmItemDirEntryT, Status)
						);

		if(ret != ERR_NONE)
			return ret;
	}
	
	return ERR_NONE;
}

static uint32 SingleInstanceModify(
	FsmQueueItemT * ItemP,
	FsmDevObjHdrT * DevP,
	FsmDfsFileDescriptorT * FdP
	)
{
	uint32				temp;
	FsmFlashSectorHdrT	SectorHdr;
	uint32				ret;
	uint16				BlkNum;
	uint32				lsn, NewPsn, OldPsn;
	uint32				NewSectorAddr, OldSectorAddr;
	uint32				OldEntryAddr;

	uint32				WriteOffset;
	uint32				WriteLen;
	uint32				RemainLen;

	uint8 *				DataP = (uint8 *)(ItemP + 1);

	FsmFlashMediaT *	MediaObjP = (FsmFlashMediaT * )DevP->MediaObjP;

	DEV_COPY_FUNCPTR	DevCopy = DevP->DevDrvP->FsmDevCopy;
	DEV_WRITE_FUNCPTR	DevWrite = DevP->DevDrvP->FsmDevWrite;
	DEV_READ_FUNCPTR	DevRead = DevP->DevDrvP->FsmDevRead;


	if (ItemP->type == QUEUE_FILE_DIR)
	{
		lsn = FdP->FirstLsn;
	}
	else
	{
		ret = GetValidEntry(ItemP, &OldEntryAddr);
		if (ret != ERR_NONE)
		{
			return ret;
		}

		ret  =  DevRead( DevP, 
						 (uint8 *)&lsn,
						 OldEntryAddr + FIELD_OFFSET(FsmItemDirEntryT, FirstLsn),
						 FIELD_SIZE(FsmItemDirEntryT, FirstLsn)
						 );

		if(ret != ERR_NONE)
			return ret;

⌨️ 快捷键说明

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