📄 uffs_device.h
字号:
/** * \file uffs_device.h * \brief uffs file system device structures definition * \author Ricky Zheng */#ifndef UFFS_DEVICE_H#define UFFS_DEVICE_H#include "uffs/uffs_types.h"
#include "uffs/uffs_config.h"#include "uffs/uffs_buf.h"#include "uffs/uffs_blockInfo.h"#include "uffs/ubuffer.h"#include "uffs/uffs_tree.h"
#include "uffs/uffs_mem.h"#ifdef __cplusplusextern "C"{#endif/************************* uffs device *************************//** * \struct uffs_FlashOpsSt * \brief flash specific operations */struct uffs_FlashOpsSt { URET (*LoadPageSpare)(uffs_Device *dev, int block, int page, uffs_Tags *tag); URET (*WritePageSpare)(uffs_Device *dev, int block, int page, uffs_Tags *tag); URET (*MakePageValid)(uffs_Device *dev, int block, int page, uffs_Tags *tag); int (*GetEccSize)(uffs_Device *dev); void (*MakeEcc)(uffs_Device *dev, void *data, void *ecc); int (*EccCollect)(uffs_Device *dev, void *data, void *read_ecc, const void *test_ecc); UBOOL (*IsBlockBad)(uffs_Device *dev, uffs_blockInfo *bc); URET (*MakeBadBlockMark)(uffs_Device *dev, int block);};/** * \struct uffs_FlashClassSt * \brief Flash class descriptor */struct uffs_FlashClassSt { const char *className; int maker; int *id_list; struct uffs_FlashOpsSt *flash;};/** * \struct uffs_DeviceOpsSt * \brief flash phycical operations, should be implement in each flash types */struct uffs_DeviceOpsSt { URET (*Reset)(uffs_Device *dev); UBOOL (*IsBlockBad)(uffs_Device *dev, u32 block); URET (*EraseBlock)(uffs_Device *dev, u32 block); URET (*WritePage)(uffs_Device *dev, u32 block, u32 pageNum, const u8 *page, const u8 *spare); URET (*WritePageData)(uffs_Device *dev, u32 block, u32 pageNum, const u8 *page, int ofs, int len); URET (*WritePageSpare)(uffs_Device *dev, u32 block, u32 pageNum, const u8 *spare, int ofs, int len); URET (*ReadPage)(uffs_Device *dev, u32 block, u32 pageNum, u8 *page, u8 *spare); URET (*ReadPageData)(uffs_Device *dev, u32 block, u32 pageNum, u8 *page, int ofs, int len); URET (*ReadPageSpare)(uffs_Device *dev, u32 block, u32 pageNum, u8 *spare, int ofs, int len);};/** UFFS device type: uffs_DeviceSt.dev_type */#define UFFS_DEV_NULL 0#define UFFS_DEV_NAND 1#define UFFS_DEV_SM 2#define UFFS_DEV_RAM 3#define UFFS_DEV_ROM 4#define UFFS_DEV_EMU 5/** * \struct uffs_storageAttrSt * \brief uffs device storage attribute, provide by nand specific file */struct uffs_storageAttrSt { u32 dev_type; //!< device type int maker; //!< flash maker int id; //!< chip id, or device id u32 total_blocks; //!< total blocks in this chip u32 block_data_size; //!< block data size (= page_data_size * pages_per_block) u16 page_data_size; //!< page data size (physical page data size, e.g. 512) u16 spare_size; //!< page spare size (physical page spare size, e.g. 16) u16 pages_per_block; //!< pages per block};/** * \struct uffs_blockInfoCacheSt * \brief block information structure, used to manager block information caches */struct uffs_blockInfoCacheSt { uffs_blockInfo *head; //!< buffer head of block info(spares) uffs_blockInfo *tail; int maxBlockCached; //!< maximun block info buffers void *internalBufHead; //!< internal buffer head, used for release whole buffer};/** * \struct uffs_partitionSt * \brief partition basic information */struct uffs_partitionSt { u16 start; //!< start block number of partition u16 end; //!< end block number of partiton};/** * \struct uffs_lockSt * \brief lock stuffs */struct uffs_lockSt { u32 sem; u32 task_id;};/** * \struct uffs_pageBufsSt */struct uffs_pageBufsSt { uffs_Buf *bufHead; uffs_Buf *bufTail; uffs_Buf *dirty; int maxBuf; int maxDirtyBuf; int dirtyCount; void *pool;};/** * \struct uffs_commInfoSt * \brief common data for device, should be initialized at early * \note it is allowed that pgSize is smaller than physical page size, but normally they are the same */struct uffs_commInfoSt { u32 pgDataSize; //!< page data size u32 eccSize; //!< ecc size u32 pgSize; //!< page size = page data size + ecc size};struct uffs_newBadBlockSt { u16 block; //!< bad block, FIX ME to process more than one bad block};/** statistic of flash read/write/erase activities */typedef struct { int blockEraseCount; int pageWriteCount; int pageReadCount; int spareWriteCount; int spareReadCount;} uffs_stat;
/** * \struct uffs_DeviceSt * \brief The core data structure of UFFS, all information needed by manipulate UFFS object * \note one partition corresponding one uffs device. */struct uffs_DeviceSt { URET (*Init)(uffs_Device *dev); //!< low level initialization URET (*Release)(uffs_Device *dev); //!< low level release void *private; //!< private data for device struct uffs_storageAttrSt attr; //!< storage attribute struct uffs_partitionSt par; //!< partition information struct uffs_FlashOpsSt *flash; //!< flash specific operations struct uffs_DeviceOpsSt *ops; //!< NAND device operations struct uffs_blockInfoCacheSt bc; //!< block info cache struct uffs_lockSt lock; //!< lock data structure struct uffs_pageBufsSt buf; //!< page buffers struct uffs_commInfoSt com; //!< common information struct uffs_treeSt tree; //!< tree list of block struct uffs_newBadBlockSt bad; //!< new bad block uffs_stat st; //!< statistic counter
struct uffs_memAllocatorSt *mem; //!< uffs native memory allocator u32 refCount; //!< device reference count};URET uffs_DeviceInitLock(uffs_Device *dev);URET uffs_DeviceLock(uffs_Device *dev);URET uffs_DeviceUnLock(uffs_Device *dev);uffs_Device * uffs_GetDevice(const char *mountPoint);
const char * uffs_GetDeviceMountPoint(uffs_Device *dev);void uffs_PutDevice(uffs_Device *dev);#ifdef __cplusplus}#endif#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -