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

📄 ffstask.c

📁 norflash的文件系统。 用于中低端手机开发的参考
💻 C
📖 第 1 页 / 共 2 页
字号:
			IOP_MAILBOX_ETS, 
			IOP_CP_FFS_FILE_DELETE_ETS,
            (void *)RspMsgP, 
            sizeof(FfsFileDeleteRspMsgT)
            );
}

static void FFS_Sidb_Read_Item(SidbReadMsgT *RxMsgP)
{
	uint32					status;
	long					msgsize;
	uint32					fill_size;
	uint32					read_size;
	uint16					type = RxMsgP->type;
	uint16					id = RxMsgP->id;
	uint32					offset = RxMsgP->Offset;
	uint32					length = RxMsgP->Length;
	uint8 *					data;
	SidbReadRspMsgT *		RspMsgP;


	msgsize = sizeof(SidbReadRspMsgT) + RxMsgP->Length;
	/* Allocate a msg buffer for response message */
	RspMsgP = (SidbReadRspMsgT *) ExeMsgBufferGet(msgsize);
	RspMsgP->Length = 0;

	data = (uint8 *)&RspMsgP->Data[0];
	read_size = FsmDataItemRead(type, id, offset, data, length);

	if (read_size == length)
	{
		RspMsgP->Status = NU_SUCCESS;
		RspMsgP->Length = read_size;
	}
	else
	{
		status = FsmDataItemGetError();
		if(status == ERR_NONE)
		{
			fill_size = length - read_size;
			memset(((uint8 *)data) + read_size, 0x0, fill_size);
			RspMsgP->Status = NU_SUCCESS;
			RspMsgP->Length = read_size;
		}
		else
		{
			RspMsgP->Status = status;
		}
	}


	/* Send result back to sender of message */
	ExeMsgSend(EXE_IOP_ID, IOP_MAILBOX_ETS, IOP_CP_FFS_SIDB_READ_ETS,
              (void *)RspMsgP, msgsize);
}

static void FFS_Sidb_Write_Item(SidbWriteMsgT *RxMsgP)
{
	uint32					write_len;
	uint16					type = RxMsgP->type;
	uint16					id = RxMsgP->id;
	uint32					offset = RxMsgP->Offset;
	uint32					length = RxMsgP->Length;
	uint8 *					data = (uint8 *)&RxMsgP->Data[0];
	SidbWriteRspMsgT *		RspMsgP;


	/* Allocate a msg buffer for response message */
	RspMsgP = (SidbWriteRspMsgT *) ExeMsgBufferGet(sizeof(SidbWriteRspMsgT));

	write_len = FsmDataItemWrite(type, id, offset, data, length);

	if(write_len == (uint32)length)
	{
		RspMsgP->Status = NU_SUCCESS;
	}
	else
	{
		RspMsgP->Status = ERR_WRITE;
	}

	/* Send result back to sender of message */
	ExeMsgSend(EXE_IOP_ID, IOP_MAILBOX_ETS, IOP_CP_FFS_SIDB_WRITE_ETS,
              (void *)RspMsgP, sizeof(SidbWriteRspMsgT));
}

static void FFS_Sidb_Delete_Item(SidbDeleteMsgT *RxMsgP)
{
	uint32					status;
	uint16					type = RxMsgP->type;
	uint16					id = RxMsgP->id;
	SidbDeleteRspMsgT *		RspMsgP;

	/* Allocate a msg buffer for response message */
	RspMsgP = (SidbDeleteRspMsgT *) ExeMsgBufferGet(sizeof(SidbDeleteRspMsgT));

	status = FsmDataItemDelete(type, id);

	if(status == ERR_NONE)
	{
		RspMsgP->Status = NU_SUCCESS;
	}
	else
	{
		RspMsgP->Status = status;
	}

	/* Send result back to sender of message */
	ExeMsgSend(EXE_IOP_ID, IOP_MAILBOX_ETS, IOP_CP_FFS_SIDB_DELETE_ETS,
              (void *)RspMsgP, sizeof(SidbDeleteRspMsgT));
}

static void FFS_Sidb_List_Item(SidbListMsgT *RxMsgP)
{
	uint32			fd;
	FsmItemInfoT	ItemInfo;
	uint32			status;
	
	SidbListRspMsgT *RspMsgP;

	MonPrintf("\n In data item list");

	fd = FsmDataItemFindFirst(RxMsgP->type, RxMsgP->id, &ItemInfo);

	if(fd != INVALID_FILE_HANDLE)
	{
		while(1)
		{
			/* Allocate a msg buffer for response message */
			RspMsgP = (SidbListRspMsgT *) ExeMsgBufferGet(sizeof(SidbListRspMsgT));

			RspMsgP->type = ItemInfo.ItemType;
			RspMsgP->id = ItemInfo.ItemId;
			RspMsgP->length = ItemInfo.ItemLength;
			RspMsgP->method = ItemInfo.Method;

			/* Send result back to sender of message */
			ExeMsgSend(EXE_IOP_ID, IOP_MAILBOX_ETS, IOP_CP_FFS_SIDB_LIST_ETS,
					  (void *)RspMsgP, sizeof(SidbListRspMsgT));

			status = FsmDataItemFindNext(fd, &ItemInfo);
			if(status != ERR_NONE)
			{
				FsmDataItemFindClose(fd);
				break;
			}
		}
	}
	else
	{
		/* Allocate a msg buffer for response message */
		RspMsgP = (SidbListRspMsgT *) ExeMsgBufferGet(sizeof(SidbListRspMsgT));

		RspMsgP->type = -1;
		RspMsgP->id = -1;
		RspMsgP->length = -1;
		RspMsgP->method = -1;

		/* Send result back to sender of message */
		ExeMsgSend(EXE_IOP_ID, IOP_MAILBOX_ETS, IOP_CP_FFS_SIDB_LIST_ETS,
				  (void *)RspMsgP, sizeof(SidbListRspMsgT));
	}

}

static void FFS_File_Mkdir(FfsFileMkdirMsgT *RxMsgP)
{
	FfsFileMkdirRspMsgT *	RspMsgP;
	char *					NameP = (char *)RxMsgP->FileName;

	/* Allocate a msg buffer for response message */
	RspMsgP = (FfsFileMkdirRspMsgT *) ExeMsgBufferGet(sizeof(FfsFileMkdirRspMsgT));

	/* Delete the file */
	NameP[MAX_FILE_NAME_LENGTH] = 0;
	RspMsgP->Status = FsmMakeDir(NameP);
	
	if (RspMsgP->Status == 0)
	{
		MonPrintf("\nMake directory OK!\n");
	}
	else
	{
		MonPrintf("\nMake directory FAILURE! %d\n", RspMsgP->Status);
	}

	/* Send result back to sender of message */
	ExeMsgSend(
			EXE_IOP_ID, 
			IOP_MAILBOX_ETS, 
			IOP_CP_FFS_FILE_MKDIR_ETS,
            (void *)RspMsgP, 
            sizeof(FfsFileMkdirRspMsgT)
            );
}

static void FFS_File_Rmdir(FfsFileRmdirMsgT *RxMsgP)
{
	FfsFileRmdirRspMsgT *	RspMsgP;
	char *					NameP = (char *)RxMsgP->FileName;

	/* Allocate a msg buffer for response message */
	RspMsgP = (FfsFileRmdirRspMsgT *) ExeMsgBufferGet(sizeof(FfsFileRmdirRspMsgT));

	NameP[MAX_FILE_NAME_LENGTH] = 0;
	RspMsgP->Status = FsmRemoveDir(NameP);
	
	if (RspMsgP->Status == 0)
	{
		MonPrintf("\nRemove directory OK!\n");
	}
	else
	{
		MonPrintf("\nRemove directory FAILURE! %d\n", RspMsgP->Status);
	}

	/* Send result back to sender of message */
	ExeMsgSend(
			EXE_IOP_ID, 
			IOP_MAILBOX_ETS, 
			IOP_CP_FFS_FILE_RMDIR_ETS,
            (void *)RspMsgP, 
            sizeof(FfsFileRmdirRspMsgT)
            );
}

static void FFS_File_Rename(FfsFileRenameMsgT *RxMsgP)
{
	FfsFileRenameRspMsgT *	RspMsgP;
	char *					OldNameP = (char *)RxMsgP->OldName;
	char *					NewNameP = (char *)RxMsgP->NewName;

	/* Allocate a msg buffer for response message */
	RspMsgP = (FfsFileRenameRspMsgT *) ExeMsgBufferGet(sizeof(FfsFileRenameRspMsgT));

	OldNameP[MAX_FILE_NAME_LENGTH] = 0;
	NewNameP[MAX_FILE_NAME_LENGTH] = 0;

	RspMsgP->Status = FsmRename(OldNameP, NewNameP);
	if (RspMsgP->Status == 0)
	{
		MonPrintf("\nFile rename OK!\n");
	}
	else
	{
		MonPrintf("\nFile rename FAILURE! %d\n", RspMsgP->Status);
	}

	/* Send result back to sender of message */
	ExeMsgSend(
			EXE_IOP_ID, 
			IOP_MAILBOX_ETS, 
			IOP_CP_FFS_FILE_RENAME_ETS,
            (void *)RspMsgP, 
            sizeof(FfsFileRenameRspMsgT)
            );
}

static void FFS_File_Truncate(FfsFileTruncateMsgT * RxMsgP)
{
	uint32						fd;
	FfsFileTruncateRspMsgT *	RspMsgP;

	/* Allocate a msg buffer for response message */
	RspMsgP = (FfsFileTruncateRspMsgT *) ExeMsgBufferGet(sizeof(FfsFileTruncateRspMsgT));

	RxMsgP->FileName[MAX_FILE_NAME_LENGTH] = 0;
	fd = FsmOpen((char *)RxMsgP->FileName, FSM_OPEN_EXISTING | FSM_OPEN_WRITE | FSM_OPEN_READ);
	if (fd == INVALID_FILE_HANDLE)
	{
		RspMsgP->Status = FFS_READ_ACTIVE;
		MonPrintf("\nFile open FAILURE!\n");
	}
	else
	{
		RspMsgP->Status = FsmTruncate(fd, RxMsgP->Length);
		if (RspMsgP->Status != 0)
		{
			MonPrintf("\nTruncate file FAILURE! %d\n", RspMsgP->Status);
		}	
		
		FsmClose(fd);
	}

	/* Send response message back to sender of message */
	ExeMsgSend(
			EXE_IOP_ID, 
			IOP_MAILBOX_ETS, 
			IOP_CP_FFS_FILE_TRUNCATE_ETS,
			(void *)RspMsgP,
			sizeof(FfsFileTruncateRspMsgT)
			);
}

static void FFS_File_Find(FfsFileFindMsgT * RxMsgP)
{
	int						count;
	uint32					status;
	FsmFileInfoT  			info;
	HENUM					hnum;
	FfsFileFindRspMsgT *	RspMsgP;
	char * 					NameP = (char *)RxMsgP->FileName;

	MonPrintf("\n list directory contents! \n");

	NameP[MAX_FILE_NAME_LENGTH] = 0;
	hnum = FsmFindFirstFile(NameP, &info);
	if (hnum != NULL)
	{
		for ( count = 0; ; count++)
		{
			/* Allocate a msg buffer for response message */
			RspMsgP = (FfsFileFindRspMsgT *) ExeMsgBufferGet(sizeof(FfsFileFindRspMsgT));
			sprintf(
					(char *)RspMsgP->FileEntry, 
					"%04d : %s  %-4dBytes", 
					count, 
					info.FileName, 
					(int)info.FileLength
					);
	
			/* Send response message back to sender of message */
			ExeMsgSend(
					EXE_IOP_ID, 
					IOP_MAILBOX_ETS, 
					IOP_CP_FFS_FILE_FIND_ETS,
					(void *)RspMsgP, 
					sizeof(FfsFileFindRspMsgT)
					);
	
			status = FsmFindNextFile(hnum, &info);
			if (status != 0)
			{
				FsmFindClose(hnum);
				break;
			}
		}
	}
	else
	{
		/* Let user know what is going on */
		RspMsgP = (FfsFileFindRspMsgT *)ExeMsgBufferGet(sizeof(FfsFileFindRspMsgT));
		sprintf(RspMsgP->FileEntry, "** Fsm dfs error %d", hnum);
		RspMsgP->FileEntry[MAX_FILE_NAME_LENGTH] = 0;
	
		ExeMsgSend(
				EXE_IOP_ID, 
				IOP_MAILBOX_ETS, 
				IOP_CP_FFS_FILE_FIND_ETS,
				(void *)RspMsgP, 
				sizeof(FfsFileFindRspMsgT)
				);
	}
}

static void FFS_Format()
{
	FfsFormatRspMsgT *	RspMsgP;
	FsmFormatArgumentT	FormatArg;

	MonPrintf("\n Ffs format! \n");

	RspMsgP = (FfsFormatRspMsgT *) ExeMsgBufferGet(sizeof(FfsFormatRspMsgT));

	FormatArg.mode = FSM_FORMAT_DEV;
	FormatArg.Param.DevArg.FsP = &FsmDfsDrv;
	FormatArg.Param.DevArg.DevP = (FsmDevObjHdrT *)&FlashDev;

	FsmStarting = TRUE;
	RspMsgP->Status = FsmFormat(&FormatArg);
	FsmStarting = FALSE;

	ExeMsgSend(
			EXE_IOP_ID, 
			IOP_MAILBOX_ETS, 
			IOP_CP_FFS_FORMAT_ETS,
        	(void *)RspMsgP, 
        	sizeof(FfsFormatRspMsgT)
        	);		
}

static void FFS_Get_Free_Space(FfsGetFreeSpaceMsgT * RxMsgP)
{
	uint32						totalspace;
	uint32						availablespace;
	uint32						freespace;
	FfsGetFreeSpaceRspMsgT *	RspMsgP;
	char * 						NameP = (char *)RxMsgP->VolumeName;

	MonPrintf("\n get free space! \n");

	/* Allocate a msg buffer for response message */
	RspMsgP = (FfsGetFreeSpaceRspMsgT *) ExeMsgBufferGet(sizeof(FfsGetFreeSpaceRspMsgT));

	NameP[MAX_FILE_NAME_LENGTH] = 0;
	RspMsgP->Status = FsmGetFreeSpace(
							NameP, 
							&totalspace,
							&availablespace, 
							&freespace
							);
							
	RspMsgP->totalspace = totalspace;
	RspMsgP->availablespace = availablespace;
	RspMsgP->freespace = freespace;

	/* Send response message back to sender of message */
	ExeMsgSend(
			EXE_IOP_ID, 
			IOP_MAILBOX_ETS, 
			IOP_CP_FFS_GET_FREE_SPACE_ETS,
			(void *)RspMsgP, 
			sizeof(FfsGetFreeSpaceRspMsgT)
			);
}

/*****************************************************************************
* $Log: ffstask.c $
* Revision 1.11  2004/03/17 12:53:05  zgy
* modify ffs format call. 
* Revision 1.10  2004/02/19 11:12:08  zgy
* add fsm get free space support.
* Revision 1.9  2004/02/03 09:26:14  zgy
* include ffsapi.h
* Revision 1.8  2004/02/02 10:31:39  zgy
* replace naming fdi with ffs.
* Revision 1.7  2004/01/19 13:20:34  zgy
* Fix ffs_format function bug.
* Revision 1.6  2004/01/18 10:49:08  zgy
* add fsm format support.
* Revision 1.5  2003/11/26 16:59:22  zgy
* Revision 1.4  2003/11/25 16:14:39  zgy
* modify data item interface function.
* Revision 1.3  2003/11/25 13:54:45  zgy
* Add some interface function.
* Revision 1.2  2003/11/24 09:35:58  May
* Add VOLUME_PATH to file and dir path
* Revision 1.1  2003/11/07 19:00:07  xuhua
* Initial revision
* Revision 1.1  2003/10/21 16:05:00  hanxiao99
* Initial revision
* Revision 1.1  2003/10/08 14:44:01  hanxiao99
* Initial revision
* Revision 1.1  2003/09/03 15:06:41  hanxiao99
* Initial revision
* Revision 1.1  2003/07/31 05:22:38  javese
* Initial revision
* Revision 1.4  2003/04/09 20:08:21  vtc
* Revision 1.3  2003/03/17 19:19:29  vtc
* support sidb read/write for ets --- jingsong jin
* Revision 1.2  2002/11/22 11:29:58  wavis
* Remove includes for FMM and FILE.
* Remove call to FFS_fileinit, now done in kfs_lsi.c.
* Revision 1.1  2002/11/19 14:16:49  wavis
* Initial revision
*****************************************************************************/

⌨️ 快捷键说明

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