📄 ffstask.c
字号:
/****************************************************************************
FILE NAME: ffstask.c
DESCRIPTION:
This file contains the source code for the File System Interface (FFS) task.
Copyright (c) 2001 LSI Logic. All rights reserved. LSI Confidential information.
Copyright (c) 2002, VIA Technologies, Inc.
*****************************************************************************/
#include "nucleus.h"
#include "sysdefs.h"
#include "syscust.h"
#include "monids.h"
#include "exeapi.h"
#include "iopapi.h"
#include "monapi.h"
#include "ffsapi.h"
#include "ffserrs.h"
#include "fsmapi.h"
#include "fsmdataitem.h"
#include "sidbapi.h"
#include "fsmflash.h"
extern FsmFlashDevT FlashDev;
extern FsmFsDrvT FsmDfsDrv;
extern volatile uint8 FsmStarting;
/*
#undef PACKED
#ifndef OTTS
#define PACKED __packed
#else
#define PACKED
#endif*/
/*---------------------------------------------------------------
* Define typdefs used in this file
*----------------------------------------------------------------*/
/*---------------------------------------------------------------
* Declare function prototypes for local routines in this file
*----------------------------------------------------------------*/
static void Init_FFS (void);
static void FFS_File_Read (FfsFileReadMsgT *RxMsgP);
static void FFS_File_Write (FfsFileWriteMsgT *RxMsgP);
static void FFS_File_Delete (FfsFileDeleteMsgT *RxMsgP);
static void FFS_Sidb_Read_Item(SidbReadMsgT *RxMsgP);
static void FFS_Sidb_Write_Item(SidbWriteMsgT *RxMsgP);
static void FFS_Sidb_Delete_Item(SidbDeleteMsgT *RxMsgP);
static void FFS_Sidb_List_Item(SidbListMsgT *RxMsgP);
static void FFS_File_Mkdir(FfsFileMkdirMsgT *RxMsgP);
static void FFS_File_Rmdir(FfsFileRmdirMsgT *RxMsgP);
static void FFS_File_Rename(FfsFileRenameMsgT *RxMsgP);
static void FFS_File_Truncate(FfsFileTruncateMsgT *RxMsgP);
static void FFS_File_Find(FfsFileFindMsgT * RxMsgP);
static void FFS_Format(void);
static void FFS_Get_Free_Space(FfsGetFreeSpaceMsgT * RxMsgP);
/*---------------------------------------------------------------
* Declare global data for this file
*----------------------------------------------------------------*/
int FfsInitOK = 0;
/*****************************************************************************
FUNCTION NAME: FfsTask
DESCRIPTION:
This routine is the FFS task. It processes messages in its mailbox.
PARAMETERS:
None
RETURNED VALUES:
None
*****************************************************************************/
void FfsTask (uint32 argc, void *argv)
{
ExeEventWaitT EvtStatus;
bool MsgStatus;
uint32 MsgId, MsgSize;
void *MsgDataP;
/* Initialize the FSI unit */
Init_FFS ();
/*if(FfsInitOK != 1)
return;*/
while(TRUE)
{
/* Wait on mail message in SW mailbox */
EvtStatus = ExeEventWait(EXE_FFS_ID, (bool) EXE_SIGNAL_TRUE,
EXE_MESSAGE_TRUE, EXE_TIMEOUT_FALSE);
/* Check if message in mailbox */
if (EvtStatus & EXE_MESSAGE_TYPE)
{
/* Set up a while loop to process ALL msgs in FSI mailbox */
while (ExeMsgCheck(EXE_FFS_ID, FFS_MAILBOX))
{
/* Read command message */
MsgStatus = ExeMsgRead(EXE_FFS_ID, FFS_MAILBOX, &MsgId,
&MsgDataP, &MsgSize);
/* If message received process it */
if (MsgStatus)
{
switch(MsgId)
{
/* File commands */
case FFS_FILE_READ_MSG:
FFS_File_Read((FfsFileReadMsgT *)MsgDataP);
break;
case FFS_FILE_WRITE_MSG:
FFS_File_Write((FfsFileWriteMsgT *)MsgDataP);
break;
case FFS_FILE_DELETE_MSG:
FFS_File_Delete((FfsFileDeleteMsgT *)MsgDataP);
break;
case SIDB_READ_ITEM_MSG:
FFS_Sidb_Read_Item((SidbReadMsgT *)MsgDataP);
break;
case SIDB_WRITE_ITEM_MSG:
FFS_Sidb_Write_Item((SidbWriteMsgT *)MsgDataP);
break;
case SIDB_DELETE_ITEM_MSG:
FFS_Sidb_Delete_Item((SidbDeleteMsgT *)MsgDataP);
break;
case SIDB_LIST_MSG:
FFS_Sidb_List_Item((SidbListMsgT *)MsgDataP);
break;
case FFS_FILE_MKDIR_MSG:
FFS_File_Mkdir((FfsFileMkdirMsgT *)MsgDataP);
break;
case FFS_FILE_RMDIR_MSG:
FFS_File_Rmdir((FfsFileRmdirMsgT *)MsgDataP);
break;
case FFS_FILE_RENAME_MSG:
FFS_File_Rename((FfsFileRenameMsgT *)MsgDataP);
break;
case FFS_FILE_TRUNCATE_MSG:
FFS_File_Truncate((FfsFileTruncateMsgT *)MsgDataP);
break;
case FFS_FILE_FIND_MSG:
FFS_File_Find((FfsFileFindMsgT *)MsgDataP);
break;
case FFS_FORMAT_MSG:
FFS_Format();
break;
case FFS_GET_FREE_SPACE_MSG:
FFS_Get_Free_Space((FfsGetFreeSpaceMsgT *)MsgDataP);
break;
default:
MonFault(MON_FFS_FAULT_UNIT, FFS_MSG_ID_ERR, MsgId,
MON_CONTINUE);
break;
}
/* Deallocate memory from command message */
if (MsgDataP != NULL)
ExeMsgBufferFree(MsgDataP);
}
}
}
}
}
/*****************************************************************************
FUNCTION NAME: Init_FFS
DESCRIPTION:
This routine initializes the FSI task.
PARAMETERS:
None
RETURNED VALUES:
None
*****************************************************************************/
static void Init_FFS (void)
{
ExeEventWaitT EvtStatus;
FfsInitOK = 0;
/* Wait for Startup Signal before completing initialization */
while(TRUE)
{
/* Wait on startup event */
EvtStatus = ExeEventWait(EXE_FFS_ID, (bool) EXE_SIGNAL_TRUE,
EXE_MESSAGE_FALSE, EXE_TIMEOUT_FALSE);
/* Check if Startup Event has occurred */
if ((EvtStatus & EXE_SIGNAL_TYPE) && (EvtStatus & FFS_STARTUP_SIGNAL))
break;
}
#if 0 /* This is now done in KFS */
if(FFS_fileinit(FALSE) == 0)
{
FfsInitOK = 1;
MonPrintf("\nFFS file system initialize OK!\n");
}
else
{
FfsInitOK = 2;
MonPrintf("\nFFS file system initialize FAILURE! %d\n", FfsInitOK);
}
#endif
}
/*****************************************************************************
FUNCTION NAME: FFS_File_Read
DESCRIPTION:
Process FILE READ command. This routine sets up for a file read by opening
the file and performing any required initialization. This command is followed
by a sequence of Block_Read commands, and must end with a File_Read_Done command.
PARAMETERS:
FsiFileReadMsgT * - Pointer to File Read message
RETURNED VALUES:
None
*****************************************************************************/
static void FFS_File_Read(FfsFileReadMsgT *RxMsgP)
{
uint32 status;
uint32 fd;
uint32 size;
long msgsize = sizeof(FfsFileReadRspMsgT) + 500;
FfsFileReadRspMsgT * RspMsgP;
/* Allocate a msg buffer for response message */
RspMsgP = (FfsFileReadRspMsgT *) ExeMsgBufferGet(msgsize);
RspMsgP->Length = 0;
/* Open file for read */
RxMsgP->FileName[MAX_FILE_NAME_LENGTH] = 0;
fd = FsmOpen((char *)RxMsgP->FileName, FSM_OPEN_EXISTING | FSM_OPEN_READ);
if (fd == INVALID_FILE_HANDLE)
{
RspMsgP->Status = FFS_READ_ACTIVE;
MonPrintf("\nFile open FAILURE!\n");
}
else
{
status = FsmSeek(fd, 0, FSM_FILE_END);
if (status != 0)
{
RspMsgP->Status = FFS_READ_ACTIVE;
MonPrintf("\nseek file error!\n");
}
size = (uint32)FsmTell(fd);
if (size > 500)
{
MonPrintf("File size = %d", (int)size);
size = 500;
}
status = FsmSeek(fd, 0, FSM_FILE_BEGIN);
if (status != 0)
{
RspMsgP->Status = FFS_READ_ACTIVE;
MonPrintf("\nseek file error!\n");
}
status = FsmRead(fd, (uint8 *)&RspMsgP->Data[0], size);
if (status == size)
{
RspMsgP->Length = (UINT16)status;
RspMsgP->Status = NU_SUCCESS;
MonPrintf("\nFile read OK!\n");
}
else
{
RspMsgP->Status = FFS_READ_ACTIVE;
MonPrintf("\nFile read failure!\n");
}
FsmClose(fd);
}
/* Send response message back to sender of message */
ExeMsgSend(
EXE_IOP_ID,
IOP_MAILBOX_ETS,
IOP_CP_FFS_FILE_READ_ETS,
(void *)RspMsgP,
msgsize
);
}
/*****************************************************************************
FUNCTION NAME: FFS_File_Write
DESCRIPTION:
Process FILE WRITE command. This routine prepares to write the specified
file to the flash device. The file is opened and the block write parameters
are set up. It is expected that this command be followed with a sequence
of Block_Write commands, and then a File_Write_Done command to close the file.
PARAMETERS:
FsiFileWriteMsgT * - Pointer to File Write message
RETURNED VALUES:
None
*****************************************************************************/
static void FFS_File_Write(FfsFileWriteMsgT *RxMsgP)
{
uint32 status;
uint32 fd;
char * NameP = (char *)RxMsgP->FileName;
FfsFileWriteRspMsgT * RspMsgP;
/* Allocate a msg buffer for response message */
RspMsgP = (FfsFileWriteRspMsgT *)ExeMsgBufferGet(sizeof(FfsFileWriteRspMsgT));
/* Open based on user flags */
NameP[MAX_FILE_NAME_LENGTH] = 0;
if (RxMsgP->OverWriteOK)
{
fd = FsmOpen(NameP, FSM_CREATE_ALWAYS | FSM_OPEN_WRITE | FSM_OPEN_READ);
}
else
{
fd = FsmOpen(NameP, FSM_OPEN_ALWAYS | FSM_OPEN_WRITE | FSM_OPEN_READ);
}
if (fd == INVALID_FILE_HANDLE)
{
RspMsgP->Status = FFS_READ_ACTIVE;
MonPrintf("\nFile open FAILURE!\n");
}
else
{
status = FsmSeek(fd, 0, FSM_FILE_BEGIN);
if (status != 0)
{
RspMsgP->Status = FFS_READ_ACTIVE;
MonPrintf("\nseek file error!\n");
}
status = FsmWrite(fd, (uint8 *)&RxMsgP->Data[0], RxMsgP->Length);
MonPrintf("\nWrite %d bytes into file.\n", status);
FsmClose(fd);
RspMsgP->Status = NU_SUCCESS;
}
/* Send response message back to sender of message */
ExeMsgSend(
EXE_IOP_ID,
IOP_MAILBOX_ETS,
IOP_CP_FFS_FILE_WRITE_ETS,
(void *)RspMsgP,
sizeof(FfsFileWriteRspMsgT)
);
}
/*****************************************************************************
FUNCTION NAME: FFS_File_Delete
DESCRIPTION:
Process FILE DELETE command. This routine deletes the specified file
from the flash device.
PARAMETERS:
FsiFileDeleteMsgT * - Pointer to File Delete message
RETURNED VALUES:
None
*****************************************************************************/
static void FFS_File_Delete(FfsFileDeleteMsgT *RxMsgP)
{
FfsFileDeleteRspMsgT * RspMsgP;
char * NameP = (char *)RxMsgP->FileName;
/* Allocate a msg buffer for response message */
RspMsgP = (FfsFileDeleteRspMsgT *) ExeMsgBufferGet(sizeof(FfsFileDeleteRspMsgT));
/* Delete the file */
NameP[MAX_FILE_NAME_LENGTH] = 0;
RspMsgP->Status = FsmRemove(NameP);
if (RspMsgP->Status == 0)
{
MonPrintf("\nFile delete OK!\n");
}
else
{
MonPrintf("\nFile delete FAILURE! %d\n", RspMsgP->Status);
}
/* Send result back to sender of message */
ExeMsgSend(
EXE_IOP_ID,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -