📄 task.c
字号:
/******************************************************************************
* Flash File System (ffs)
* Idea, design and coding by Mads Meisner-Jensen, mmj@ti.com
*
* FFS task. ONLY for target!
*
* $Id: task.c 1.48.1.1.1.24 Thu, 18 Dec 2003 10:50:52 +0100 tsj $
*
******************************************************************************/
#include "board.cfg"
#include "ffs/ffs.h"
#include "ffs/board/core.h"
#include "ffs/board/task.h"
#include "ffs/board/ffstrace.h"
#include "rvm/rvm_gen.h"
#include "rvm/rvm_use_id_list.h"
#include <string.h>
#include "swconfig.cfg"
/******************************************************************************
* Globals and function prototypes
******************************************************************************/
extern UINT8 pcm_init(void);
void ffs_task(void);
static effs_t ffs_init_status;
req_id_t request_id_last = 0;
T_OS_MB_ID ffs_mb_id;
UINT16 ffs_addr_id;
extern struct ffs_blocking_s;
OS_MUTEX ffs_write_mutex;
/******************************************************************************
* Target Platform Abstraction Functions
******************************************************************************/
req_id_t request_id_get(void)
{
extern uint32 int_disable(void);
extern void int_enable(uint32 tmp);
uint32 cprs;
// We disable interrupt to avoid any other tasks to get the same id.
cprs = int_disable();
request_id_last++;
if (request_id_last < 0)
request_id_last = 0;
int_enable(cprs);
return request_id_last;
}
void *target_malloc(unsigned int size)
{
char *buf;
#if (_RVF == 1)
if ((rvf_get_buf(ffs_mb_id, size, (T_RVF_BUFFER*) &buf)) == RVF_RED)
return 0;
else
return buf;
#else
return 0;
#endif
}
void target_free(void *buf)
{
int error;
#if (_RVF == 1)
if(buf != NULL)
{
if ((error = OS_FREE(buf)) != OS_OK)
ttw(ttr(TTrFatal, "target_free() %d (FAILED)" NL, error));
}
#endif
}
/******************************************************************************
* FFS Blocking Call Handling
******************************************************************************/
effs_t ffs_b_begin(struct ffs_blocking_s *fb, T_RVF_MUTEX *mutex, int *result)
{
effs_t error;
if ((error = rvf_initialize_mutex(mutex)) < 0)
return error;
if ((error = rvf_lock_mutex(mutex)) < 0) // This will succeed
return error;
fb->result = result;
fb->mutex = mutex;
return EFFS_OK;
}
effs_t ffs_b_end(T_RVF_MUTEX *mutex, int result)
{
effs_t error;
// Do not lock the mutex if the message send operation failed
if (result >= 0)
// This will block the task until the mutex has been released
if ((error = rvf_lock_mutex(mutex)) < 0)
return error;
if ((error = rvf_unlock_mutex(mutex)) < 0)
return error;
if ((error = rvf_delete_mutex(mutex)) < 0)
return error;
return EFFS_OK;
}
/******************************************************************************
* FFS Task
******************************************************************************/
/* The below access to the intenal Nucleus variable "TCD_Interrupt_Level" is
* a workaround for a known Nucleus BUG (see CQ SWI-FIX-17560) */
void ffs_main_init()
{
extern int TCD_Interrupt_Level;
int tmp_int_level;
ttr_init(TTrTask|TTrTest|TTrTestInfo);
//ttr_init(TTrTask|TTrTest|TTrTestInfo|TTrDrvErase|TTrDrvWrite|TTrTaskLow|TTrApi);
// ttr_init(TTrAll);
tmp_int_level = TCD_Interrupt_Level; // Backup Int level
TCD_Interrupt_Level = 0xC0; // The Interrups are not yet enabled...
ffs_init_status = ffs_initialize();
TCD_Interrupt_Level = tmp_int_level; // Restore Int level
pcm_init(); // We have to call pcm_init() before G23 starts.
}
void ffs_task_init(T_OS_MB_ID mbid, T_RVF_ADDR_ID addr_id)
{
int error;
ffs_mb_id = mbid;
ffs_addr_id = addr_id;
}
extern char ffs_initerror[5];
void ffs_task()
{
extern int etm_ffs_init(void);
#if (LINEAR_FILE_SYSTEM)
extern int etm_lfs_init(void);
#endif
struct ffs_req_s *request;
T_FFS_FILE_CNF *confirm_file;
T_FFS_STREAM_CNF *confirm_stream;
T_RVF_MUTEX *mutex_p;
int error, free_mail, os_error = OS_OK;
uint16 revision, manufacturer_id, device_id;
uint32 base;
fd_t fdi;
char *temp_path;
req_id_t temp_id;
OS_INIT_MUTEX(&ffs_write_mutex);
#if ((OP_WCP == 1) || (VIRTIO==1))
// Non formatted FFS should be formatted
// So we don't have to use PCTM to format it
if (fs.initerror == EFFS_NOFORMAT)
{
ffs_preformat_nb(0xDEAD, 0);
ffs_format_nb("/", 0x2BAD, 0);
}
ffs_InitRFCap();
ffs_InitSerialCfg();
#endif
//fangcj revised in 2006-09-19
if (fs.initerror == EFFS_NOFORMAT)
{
ffs_preformat_nb(0xDEAD, 0);
ffs_format_nb("/", 0x2BAD, 0);
}
//fangcj end
ttr(TTrTask, "ffs_init() %d" NL, ffs_init_status);
ffs_query(Q_FFS_REVISION, &revision);
ttr(TTrTask,"FFS revision: 0x%x" NL, revision);
ffs_query(Q_DEV_MANUFACTURER, &manufacturer_id);
ffs_query(Q_DEV_DEVICE, &device_id);
ffs_query(Q_DEV_DRIVER, &revision);
ttr(TTrTask,"FFS device, driver: 0x%02x, 0x%04x, %d" NL,
manufacturer_id, device_id, revision);
ffs_query(Q_DEV_BASE, &base);
ffs_query(Q_DEV_BLOCKS, &revision);
ttr(TTrTask,"FFS base, blocks: 0x%x, %d" NL, base, revision);
ffs_query(Q_FFS_FORMAT_READ, &manufacturer_id);
ffs_query(Q_FFS_FORMAT_WRITE, &device_id);
ttr(TTrTask,"FFS format read, write: 0x%x, 0x%x" NL NL,
manufacturer_id, device_id);
ttr(TTrFatal, "**___**ffs_initerror:0x%x, 0x%x, 0x%x, 0x%x, 0x%x" NL,
ffs_initerror[0], ffs_initerror[1], ffs_initerror[2], ffs_initerror[3], ffs_initerror[4]);
// If some blocks has been marked for reclaim, reclaim them now...
if (fs.initerror >= 0)
{
ttr(TTrFatal, "blocks_reclaim() start........");
blocks_reclaim();
ttr(TTrFatal, "blocks_reclaim() end.");
}
else
ttr(TTrFatal, "else: fs.initerror = %d", fs.initerror);
// If there exist any replacement inodes, run inode reclaim as this
// reclaim removes the replacement inodes and we only have space for a
// limited number of replacement inodes
if (fs.repi_table[0] != 0)
inodes_reclaim();
// We can only mkdir("pcm") *after* our mailbox has been allocated
// otherwise mkdir("pcm") will fail.
error = ffs_mkdir_nb("/pcm", 0);
// Register FFS and LFS to ETM database
error = etm_ffs_init();
#if (LINEAR_FILE_SYSTEM)
error = etm_lfs_init();
#endif
// ttr(TTrTask, "Start TFFS task" NL NL);
// rv_start_swe_and_check(TFFS_USE_ID, "TFFS"); // Note tested
while (1)
{
OS_MAIL_WAIT(OS_MAIL_EVENT_MASK);
request = (struct ffs_req_s *) OS_MAIL_READ();
ttw(ttr(TTrTaskLow, "ffs_task(%d):" NL, request->cmd));
switch (request->cmd) {
case WRITE: case SEEK: case CLOSE: case FTRUNC: case FDATASYNC:
ttw(ttr(TTrTaskLow, " fdi = %d" NL, request->fdi));
// Save a local copy of fdi because the task we call later can
// modify it and we have to use the fdi if a callback is used
fdi = (fd_t)request->fdi;
break;
default:
ttw(ttr(TTrTaskLow, " name = %s" NL, request->path));
break;
}
ttw(ttr(TTrTaskLow, " src = 0x%x" NL, request->src));
ttw(ttr(TTrTaskLow, " size = %d" NL, request->size));
if (tr_query(TTrTaskDelays))
OS_DELAY(5);
switch (request->cmd) {
case NOP: error = EFFS_OK; break;
case FILE_WRITE: error = task_file_write(request); break;
case SYMLINK: error = task_symlink(request); break;
case MKDIR: error = task_mkdir(request); break;
case REMOVE: error = task_remove(request); break;
case RENAME: error = task_rename(request); break;
case FCONTROL: error = task_fcontrol(request); break;
case PREFORMAT: error = task_preformat(request); break;
case FORMAT: error = task_format(request); break;
case OPEN: error = task_open(request); break;
case WRITE: error = task_write(request); break;
case SEEK: error = task_seek(request); break;
case CLOSE: error = task_close(request); break;
case TRUNC: error = task_trunc(request); break;
case FTRUNC: error = task_ftrunc(request); break;
case FDATASYNC: error = task_fdatasync(request); break;
#if (LINEAR_FILE_SYSTEM)
case LFS_OPEN: error = task_lfs_open(request); break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -