Files
banban/ql-kernel/threadx/common/include/lfs_cache.h
T

1111 lines
73 KiB
C

#ifndef LFS_CACHE_H
#define LFS_CACHE_H
/*====*====*====*====*====*====*====*====*====*====*====*====*====*====*====*
lfs_cache.h
GENERAL DESCRIPTION
This file is for nor flash handware attaction layer.
EXTERNALIZED FUNCTIONS
INITIALIZATION AND SEQUENCING REQUIREMENTS
Copyright (c) 2011 by Marvell, Incorporated. All Rights Reserved.
*====*====*====*====*====*====*====*====*====*====*====*====*====*====*====*
*===========================================================================
EDIT HISTORY FOR MODULE
This section contains comments describing changes made to the module.
Notice that changes are listed in reverse chronological order.
when who what, where, why
-------- ------ ----------------------------------------------------------
12/23/07 zhoujin Created module
===========================================================================*/
/*===========================================================================
INCLUDE FILES FOR MODULE
===========================================================================*/
#include "UART.h"
#include "lfs.h"
#include "lfs_trace.h"
/*===========================================================================
LOCAL MACRO
===========================================================================*/
/* CRANE QSPI base address.*/
#define CRANE_QSPI_BASE_ADDRESS 0x80000000
#ifdef QUEC_NVM_IN_EXT_FLASH
/* CRANE SPI base address.*/
#define CRANE_SPI_BASE_ADDRESS 0x90000000
#endif
/* Invalid LFS block number.*/
#define LFS_INVALID_NUMBER 0xFACEBABE
/* LFS queue ID */
#define LFS_QUEQUE_ID 0xABBACDDC
/* LFS queue guard */
#define LFS_QUEQUE_GUARD 0x68686868
/* LFS unlink ID */
#define LFS_QUNLINK_ID 0xABBA0000
/* LFS unlink guard */
#define LFS_QUNLINK_GUARD 0x68680000
/* LFS Write back to Flash flag */
#define LFS_WRITE_BACK_TO_FALSH 0x1
/* LFS cache task stack size */
#define LFS_TASK_STACK_SIZE 2048
/* LFS Max cache count */
#define LFS_CACHE_CNT 50
/* Array Size */
#define ARR_SIZE(a) (sizeof((a))/sizeof((a[0])))
#if (defined(CRANEL_4MRAM) || defined(LTEONLY_8M8M) || defined(LTEGSM_THIN))
//#define LFS_USE_CACHE
/* LFS cache task priority */
#define LFS_TASK_PRIORITY 41
#else
/* LFS cache task priority */
#define LFS_TASK_PRIORITY 250
#endif
/*===========================================================================
EXTERN DEFINITIONS AND DECLARATIONS FOR MODULE
===========================================================================*/
/* LFS block information */
typedef struct lfsBlockInfo
{
UINT32 FlashBlockSize;
UINT32 LfsStartAddress;
UINT32 LfsEndAddress;
UINT32 LfsStartBlock;
UINT32 LfsEndBlock;
} lfsBlockInfo;
/* LFS block bit map */
typedef struct lfsBlkMapType
{
BOOL Alloc;
UINT32 LfsGrpCnt;
UINT32 *LfsBlkTbl;
UINT32 GrpOfst;
UINT32 BitOfst;
} lfsBlkMapType;
/* LFS Message queue */
typedef struct lfsMsgQ
{
UINT32 id;
UINT32 block;
UINT8 *cache;
UINT32 dirty;
struct lfsMsgQ *next;
struct lfsMsgQ *prev;
UINT32 cnt;
UINT32 guard;
} lfsMsgQ;
/*===========================================================================
INTERNAL FUNCTION DECLARATIONS
===========================================================================*/
/*************************************************************************/
/* */
/* FUNCTION */
/* */
/* GetLfsBlkInfo */
/* */
/* DESCRIPTION */
/* */
/* The function Get LFS Block info. */
/* */
/* CALLED BY */
/* */
/* Application */
/* */
/* CALLS */
/* */
/* Application The application function */
/* */
/* INPUTS */
/* */
/* None N/A */
/* */
/* OUTPUTS */
/* */
/* None N/A */
/* */
/*************************************************************************/
lfsBlockInfo *GetLfsBlkInfo(int partition);
/*************************************************************************/
/* */
/* FUNCTION */
/* */
/* GetLfsBlockMapInfo */
/* */
/* DESCRIPTION */
/* */
/* The function Get LFS Block Map infomation. */
/* */
/* CALLED BY */
/* */
/* Application */
/* */
/* CALLS */
/* */
/* Application The application function */
/* */
/* INPUTS */
/* */
/* None N/A */
/* */
/* OUTPUTS */
/* */
/* None N/A */
/* */
/*************************************************************************/
lfsBlkMapType *GetLfsBlockMapInfo(int partition);
/*************************************************************************/
/* */
/* FUNCTION */
/* */
/* lfs_cache_init */
/* */
/* DESCRIPTION */
/* */
/* The function initialize LFS cache. */
/* */
/* CALLED BY */
/* */
/* Application */
/* */
/* CALLS */
/* */
/* Application The application function */
/* */
/* INPUTS */
/* */
/* None N/A */
/* */
/* OUTPUTS */
/* */
/* None N/A */
/* */
/*************************************************************************/
void lfs_cache_init(int partition);
/*************************************************************************/
/* */
/* FUNCTION */
/* */
/* lfs_erase_all */
/* */
/* DESCRIPTION */
/* */
/* The function erase all LFS flash region. */
/* */
/* CALLED BY */
/* */
/* Application */
/* */
/* CALLS */
/* */
/* Application The application function */
/* */
/* INPUTS */
/* */
/* None N/A */
/* */
/* OUTPUTS */
/* */
/* None N/A */
/* */
/*************************************************************************/
void lfs_erase_all(void);
/*************************************************************************/
/* */
/* FUNCTION */
/* */
/* lfs_write_back */
/* */
/* DESCRIPTION */
/* */
/* The function set write back flag. */
/* */
/* CALLED BY */
/* */
/* Application */
/* */
/* CALLS */
/* */
/* Application The application function */
/* */
/* INPUTS */
/* */
/* None N/A */
/* */
/* OUTPUTS */
/* */
/* None N/A */
/* */
/*************************************************************************/
void lfs_write_back(int partition);
/*************************************************************************/
/* */
/* FUNCTION */
/* */
/* lfs_erase_block */
/* */
/* DESCRIPTION */
/* */
/* The function erase LFS block. */
/* */
/* CALLED BY */
/* */
/* Application */
/* */
/* CALLS */
/* */
/* Application The application function */
/* */
/* INPUTS */
/* */
/* None N/A */
/* */
/* OUTPUTS */
/* */
/* None N/A */
/* */
/*************************************************************************/
void lfs_erase_block(UINT32 block);
/*************************************************************************/
/* */
/* FUNCTION */
/* */
/* lfs_erase_partition */
/* */
/* DESCRIPTION */
/* */
/* The function erase all LFS partition. */
/* */
/* CALLED BY */
/* */
/* Application */
/* */
/* CALLS */
/* */
/* Application The application function */
/* */
/* INPUTS */
/* */
/* None N/A */
/* */
/* OUTPUTS */
/* */
/* None N/A */
/* */
/*************************************************************************/
void lfs_erase_partition(void);
/*************************************************************************/
/* */
/* FUNCTION */
/* */
/* lfs_alloc_block_cache */
/* */
/* DESCRIPTION */
/* */
/* The function alloc LFS cache memory. */
/* */
/* CALLED BY */
/* */
/* Application */
/* */
/* CALLS */
/* */
/* Application The application function */
/* */
/* INPUTS */
/* */
/* None N/A */
/* */
/* OUTPUTS */
/* */
/* None N/A */
/* */
/*************************************************************************/
lfsMsgQ * lfs_alloc_block_cache(UINT32 blocknum, int partition);
/*************************************************************************/
/* */
/* FUNCTION */
/* */
/* lfs_get_block_cache */
/* */
/* DESCRIPTION */
/* */
/* The function Go through all the entries and check if the block */
/* is cached or not. If cached, Return the cached buffer. */
/* */
/* CALLED BY */
/* */
/* Application */
/* */
/* CALLS */
/* */
/* Application The application function */
/* */
/* INPUTS */
/* */
/* None N/A */
/* */
/* OUTPUTS */
/* */
/* None N/A */
/* */
/*************************************************************************/
lfsMsgQ * lfs_get_block_cache(UINT32 blocknum, int partition);
/*************************************************************************/
/* */
/* FUNCTION */
/* */
/* lfs_read_block_to_buf */
/* */
/* DESCRIPTION */
/* */
/* The function read the block data from flash to cached buffer. */
/* */
/* CALLED BY */
/* */
/* Application */
/* */
/* CALLS */
/* */
/* Application The application function */
/* */
/* INPUTS */
/* */
/* None N/A */
/* */
/* OUTPUTS */
/* */
/* None N/A */
/* */
/*************************************************************************/
lfsMsgQ * lfs_read_block_to_buf(UINT32 blocknum, int partition);
/*************************************************************************/
/* */
/* FUNCTION */
/* */
/* lfs_write_back */
/* */
/* DESCRIPTION */
/* */
/* The function write cached buffer back to flash. */
/* */
/* CALLED BY */
/* */
/* Application */
/* */
/* CALLS */
/* */
/* Application The application function */
/* */
/* INPUTS */
/* */
/* None N/A */
/* */
/* OUTPUTS */
/* */
/* None N/A */
/* */
/*************************************************************************/
BOOL lfs_write_back_to_flash(BOOL lock, BOOL all);
/*************************************************************************/
/* */
/* FUNCTION */
/* */
/* lfs_flash_cache_read */
/* */
/* DESCRIPTION */
/* */
/* The function do cache read operation. */
/* */
/* CALLED BY */
/* */
/* Application */
/* */
/* CALLS */
/* */
/* Application The application function */
/* */
/* INPUTS */
/* */
/* None N/A */
/* */
/* OUTPUTS */
/* */
/* None N/A */
/* */
/*************************************************************************/
BOOL lfs_flash_cache_read(UINT32 flashaddress, UINT8 *Buf, UINT32 size, int partition);
/*************************************************************************/
/* */
/* FUNCTION */
/* */
/* lfs_flash_cache_write */
/* */
/* DESCRIPTION */
/* */
/* The function do cache write operation. */
/* */
/* CALLED BY */
/* */
/* Application */
/* */
/* CALLS */
/* */
/* Application The application function */
/* */
/* INPUTS */
/* */
/* None N/A */
/* */
/* OUTPUTS */
/* */
/* None N/A */
/* */
/*************************************************************************/
BOOL lfs_flash_cache_write(UINT32 flashaddress, UINT8 *Buf, UINT32 size, int partition);
/*************************************************************************/
/* */
/* FUNCTION */
/* */
/* lfs_cache_task */
/* */
/* DESCRIPTION */
/* */
/* The task write lfs cached buffer back to flash. */
/* */
/* CALLED BY */
/* */
/* Application */
/* */
/* CALLS */
/* */
/* Application The application function */
/* */
/* INPUTS */
/* */
/* None N/A */
/* */
/* OUTPUTS */
/* */
/* None N/A */
/* */
/*************************************************************************/
void lfs_cache_task(void *argv);
/*************************************************************************/
/* */
/* FUNCTION */
/* */
/* lfs_cache_task_suspend */
/* */
/* DESCRIPTION */
/* */
/* The function do lfs cache task suspend operation. */
/* */
/* CALLED BY */
/* */
/* Application */
/* */
/* CALLS */
/* */
/* Application The application function */
/* */
/* INPUTS */
/* */
/* None N/A */
/* */
/* OUTPUTS */
/* */
/* None N/A */
/* */
/*************************************************************************/
void lfs_cache_task_suspend(void);
/*************************************************************************/
/* */
/* FUNCTION */
/* */
/* lfs_cache_task_resume */
/* */
/* DESCRIPTION */
/* */
/* The function do lfs cache task resume operation. */
/* */
/* CALLED BY */
/* */
/* Application */
/* */
/* CALLS */
/* */
/* Application The application function */
/* */
/* INPUTS */
/* */
/* None N/A */
/* */
/* OUTPUTS */
/* */
/* None N/A */
/* */
/*************************************************************************/
void lfs_cache_task_resume(void);
/*************************************************************************/
/* */
/* FUNCTION */
/* */
/* LfsMsgQValid */
/* */
/* DESCRIPTION */
/* */
/* The function check the validity of LFS queque and return */
/* the status. */
/* */
/* CALLED BY */
/* */
/* Application */
/* */
/* CALLS */
/* */
/* Application The application function */
/* */
/* INPUTS */
/* */
/* mvUsbNetQ usb net response queue */
/* */
/* OUTPUTS */
/* */
/* TRUE Valid resonse queue */
/* FALSE Invalid resonse queue */
/* */
/*************************************************************************/
BOOL LfsMsgQValid(lfsMsgQ *queue);
/*************************************************************************/
/* */
/* FUNCTION */
/* */
/* LfsCacheLock */
/* */
/* DESCRIPTION */
/* */
/* The function do lfs cache lock. */
/* */
/* CALLED BY */
/* */
/* Application */
/* */
/* CALLS */
/* */
/* Application The application function */
/* */
/* INPUTS */
/* */
/* None N/A */
/* */
/* OUTPUTS */
/* */
/* None N/A */
/* */
/*************************************************************************/
void LfsCacheLock(int partition);
/*************************************************************************/
/* */
/* FUNCTION */
/* */
/* LfsCacheUnlock */
/* */
/* DESCRIPTION */
/* */
/* The function do lfs cache unlock. */
/* */
/* CALLED BY */
/* */
/* Application */
/* */
/* CALLS */
/* */
/* Application The application function */
/* */
/* INPUTS */
/* */
/* None N/A */
/* */
/* OUTPUTS */
/* */
/* None N/A */
/* */
/*************************************************************************/
void LfsCacheUnlock(int partition);
/*************************************************************************/
/* */
/* FUNCTION */
/* */
/* LfsMsgQInit */
/* */
/* DESCRIPTION */
/* */
/* This function initializes lfs queue. It should be called */
/* on behalf of a queue prior to using the queue. */
/* */
/* CALLED BY */
/* */
/* Application */
/* */
/* CALLS */
/* */
/* Application The application function */
/* */
/* INPUTS */
/* */
/* mvUsbNetQ Response head pointer */
/* */
/* OUTPUTS */
/* */
/* None N/A */
/* */
/*************************************************************************/
void LfsMsgQInit(lfsMsgQ *hdr);
/*************************************************************************/
/* */
/* FUNCTION */
/* */
/* LfsMsgQPut */
/* */
/* DESCRIPTION */
/* */
/* This function places a data block at the tail of a lfs queue on */
/* behalf of a queue prior to using the queue. */
/* */
/* CALLED BY */
/* */
/* Application */
/* */
/* CALLS */
/* */
/* Application The application function */
/* */
/* INPUTS */
/* */
/* hdr The queue head pointer */
/* pRspQ The queue pointer */
/* len the data length */
/* */
/* OUTPUTS */
/* */
/* None N/A */
/* */
/*************************************************************************/
void LfsMsgQPut(lfsMsgQ *hdr, lfsMsgQ *queue);
/*************************************************************************/
/* */
/* FUNCTION */
/* */
/* LfsMsgQGet */
/* */
/* DESCRIPTION */
/* */
/* This function removes the data block at head of a queue and */
/* returns a pointer to the data block. If the queue is empty, then */
/* a NULL pointer is returned. queue on behalf of a queue prior to */
/* using the queue. */
/* */
/* CALLED BY */
/* */
/* Application */
/* */
/* CALLS */
/* */
/* Application The application function */
/* */
/* INPUTS */
/* */
/* hdr The queue head pointer */
/* */
/* OUTPUTS */
/* */
/* pRspQ The returned queue pointer */
/* */
/*************************************************************************/
lfsMsgQ *LfsMsgQGet(lfsMsgQ *hdr);
/*************************************************************************/
/* */
/* FUNCTION */
/* */
/* LfsMsgQRemove */
/* */
/* DESCRIPTION */
/* */
/* This function removes the data block at head of a queue and */
/* returns a pointer to the data block. If the queue is empty, then */
/* a NULL pointer is returned. queue on behalf of a queue prior to */
/* using the queue. */
/* */
/* CALLED BY */
/* */
/* Application */
/* */
/* CALLS */
/* */
/* Application The application function */
/* */
/* INPUTS */
/* */
/* hdr The queue head pointer */
/* */
/* OUTPUTS */
/* */
/* pRspQ The returned queue pointer */
/* */
/*************************************************************************/
void LfsMsgQRemove(lfsMsgQ *hdr, lfsMsgQ *queue);
/*************************************************************************/
/* */
/* FUNCTION */
/* */
/* LfsGetMsgQCnt */
/* */
/* DESCRIPTION */
/* */
/* This function Get the LFS queque count. */
/* */
/* CALLED BY */
/* */
/* Application */
/* */
/* CALLS */
/* */
/* Application The application function */
/* */
/* INPUTS */
/* */
/* mvUsbNetQ Response head pointer */
/* */
/* OUTPUTS */
/* */
/* None N/A */
/* */
/*************************************************************************/
UINT32 LfsGetMsgQCnt(int partition);
/*************************************************************************/
/* */
/* FUNCTION */
/* */
/* Lfs_set_block_flag */
/* */
/* DESCRIPTION */
/* */
/* The function set/clear block erase flag. */
/* */
/* CALLED BY */
/* */
/* Application */
/* */
/* CALLS */
/* */
/* Application The application function */
/* */
/* INPUTS */
/* */
/* None N/A */
/* */
/* OUTPUTS */
/* */
/* None N/A */
/* */
/*************************************************************************/
void Lfs_set_block_flag(UINT32 block, BOOL alloc, int partition);
/*************************************************************************/
/* */
/* FUNCTION */
/* */
/* Lfs_block_preerase */
/* */
/* DESCRIPTION */
/* */
/* The function pre-erase lfs block. */
/* */
/* CALLED BY */
/* */
/* Application */
/* */
/* CALLS */
/* */
/* Application The application function */
/* */
/* INPUTS */
/* */
/* None N/A */
/* */
/* OUTPUTS */
/* */
/* None N/A */
/* */
/*************************************************************************/
void Lfs_block_preerase(void);
/*************************************************************************/
/* */
/* FUNCTION */
/* */
/* LfsMutexInit */
/* */
/* DESCRIPTION */
/* */
/* The function initialize lfs mutex. */
/* */
/* CALLED BY */
/* */
/* Application */
/* */
/* CALLS */
/* */
/* Application The application function */
/* */
/* INPUTS */
/* */
/* None N/A */
/* */
/* OUTPUTS */
/* */
/* None N/A */
/* */
/*************************************************************************/
void LfsMutexInit(int partition);
/*************************************************************************/
/* */
/* FUNCTION */
/* */
/* LfsMutexLock */
/* */
/* DESCRIPTION */
/* */
/* The function do lfs mutex lock. */
/* */
/* CALLED BY */
/* */
/* Application */
/* */
/* CALLS */
/* */
/* Application The application function */
/* */
/* INPUTS */
/* */
/* None N/A */
/* */
/* OUTPUTS */
/* */
/* None N/A */
/* */
/*************************************************************************/
void LfsMutexLock(BOOL lock, int partition);
/*************************************************************************/
/* */
/* FUNCTION */
/* */
/* LfsMutexUnlock */
/* */
/* DESCRIPTION */
/* */
/* The function do lfs mutex unlock. */
/* */
/* CALLED BY */
/* */
/* Application */
/* */
/* CALLS */
/* */
/* Application The application function */
/* */
/* INPUTS */
/* */
/* None N/A */
/* */
/* OUTPUTS */
/* */
/* None N/A */
/* */
/*************************************************************************/
void LfsMutexUnlock(BOOL lock, int partition);
/*************************************************************************/
/* */
/* FUNCTION */
/* */
/* Lfs_record_corrupted_files */
/* */
/* DESCRIPTION */
/* */
/* The function record corrupted files and add it into file queue. */
/* */
/* CALLED BY */
/* */
/* Application */
/* */
/* CALLS */
/* */
/* Application The application function */
/* */
/* INPUTS */
/* */
/* None N/A */
/* */
/* OUTPUTS */
/* */
/* None N/A */
/* */
/*************************************************************************/
void Lfs_record_corrupted_files(lfs_t *lfs, lfs_mdir_t *dir, UINT16 id,
int (*cb)(lfs_t *, lfs_mdir_t *, uint16_t, struct lfs_info *));
/*************************************************************************/
/* */
/* FUNCTION */
/* */
/* lfs_remove_corrupted_files */
/* */
/* DESCRIPTION */
/* */
/* The function precheck corrupted files and delete. */
/* */
/* CALLED BY */
/* */
/* Application */
/* */
/* CALLS */
/* */
/* Application The application function */
/* */
/* INPUTS */
/* */
/* None N/A */
/* */
/* OUTPUTS */
/* */
/* None N/A */
/* */
/*************************************************************************/
void lfs_remove_corrupted_files(lfs_t *lfs);
/*************************************************************************/
/* */
/* FUNCTION */
/* */
/* lfs_write_back_to_partition */
/* */
/* DESCRIPTION */
/* */
/* The function write cached buffer back to partition. */
/* */
/* CALLED BY */
/* */
/* Application */
/* */
/* CALLS */
/* */
/* Application The application function */
/* */
/* INPUTS */
/* */
/* None N/A */
/* */
/* OUTPUTS */
/* */
/* None N/A */
/* */
/*************************************************************************/
BOOL lfs_write_back_to_partition(BOOL lock, BOOL all, int partition);
/*************************************************************************/
/* */
/* FUNCTION */
/* */
/* LfsMutexLockALL */
/* */
/* DESCRIPTION */
/* */
/* The function do lfs mutex lock & FDI lock. */
/* */
/* CALLED BY */
/* */
/* Application */
/* */
/* CALLS */
/* */
/* Application The application function */
/* */
/* INPUTS */
/* */
/* None N/A */
/* */
/* OUTPUTS */
/* */
/* None N/A */
/* */
/*************************************************************************/
void LfsMutexLockALL(void);
#endif /* LFS_CACHE_H */