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

📄 task.c

📁 MMI层OBJ不能完全编译
💻 C
📖 第 1 页 / 共 2 页
字号:
/******************************************************************************
 * 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 + -