1、概述:
SC6600H平台建议选用NOR Flash + SRAM/pSRAM存储器配置方案的存储器配置方案。
2、NAND Flash的配置:
配置NandFlash包含两部分:
NandFlash的驱动配置;
NandFlash的分区设置。
3、NAND Flash驱动设置:
完成新NAND Flash驱动只需要配置一张表,即NandSpec.c中的astNandSpec[ ]。
表中的每一项都是LLDSpec的结构。LLDSpec结构定义如下:
typedef struct
{
UINT16 nMID;
UINT16 nDID;
UINT16 nSctsPerPg;
UINT16 nNumOfBlks;
UINT16 nNumOfPlane;
UINT16 nPgsPerBlk;
UINT16 nBlksInRsv;
UINT8 nBadPos;
UINT8 nLsnPos;
UINT8 nEccPos;
UINT8 nBWidth;
UINT8 nCycleDev;
UINT8 nAdvance;
} LLDSpec;
其中:
nMID和nDID是NAND Flash的Manufacture ID和Device ID,在NAND Spec.上可以查到。
nSctsPerPg为一个Page的Setor数,取值为1或4。当Pagesize为512字节时,nSctsPerPg为1;当Pagesize为2048字节时,nSctsPerPg为4。
nNumOfBlks是NAND Flash所含Block个数。
nNumOfPlane是NAND Flash所含Plane的个数。
nPgsPerBlk是每个Block下包含的Page个数。小Page NAND Flash中每个Block包含32个Page;大Page NandFlash中每个Block包含64个Page。
nBlksInRsv是用作Reservior区的Block个数。如果是小Page NAND Flash,每2048个Block就需要35个Block用作Reservior;如果是大Page NAND Flash,每1024个Block就需要20个Block用作Reservior。
nBadPos是初始化坏块标识的位置。
nLsnPos 是指在Spare区域中的位置(LSN Position)。从nLsnPos 开始到nLsnPos+2共3个字节被NAND Flash管理程序用来记录一些管理信息。
nEccPos是指ECC Byte存放在Spare区域中的位置。从nEccPos到nEccPos+2都是用来记录ECC值。
nBWidth表示NAND Flash的数据总线宽度。如果是8位的NAND,取值为0;如果是16位的NAND,取值为1。
nCycleDev是指在读写ANAND时用几个Address Cycle。现在支持3、4、5Cycle。
nAdvance按照NAND SPEC设成0或1。不同的Advance属性,其NAND Flash的Read命令格式是不同的。在拿到一款新的NAND Flash时,我们要看它的Read命令是用一个Cycle完成的还是需要两个Cycle。这些属性在NAND Flash的SPEC中都会有描述。
注意:
nBadPos、nLsnPos和nEccPos三个值不能存在相互重叠和覆盖的情况,否则NAND
里面的内容有可能全部乱掉。
4、NAND Flash分区管理:
在SC6600H平台上,NAND仅作为数据存储使用,整个NAND Flash除区域外,全部作为U-disk Partition,属于STL分区。U-disk Partition件系统SFS使用的分区。这个分区在程序运行过程中可读可写的。
5、各种内存池的大小与定义:
注意:
(1) 对于各种Pool 的大小定义,如果RTOS 库是debug 模式(定义了SCI_MEMORY_DEBUG),则用户的工程中也必须定义该宏,并且增加Pool的大小,来存储额外的debug信息。该宏在os_api.h 中定义。
(2) 字节堆和各种内存池的空间地址分配必须是32bites的对齐。
6、字节堆的大小定义:
#define BYTE_HEAP_SIZE (1700 * 1024) // 1.7Mbytes
7、大小为52bytes的内存池大小定义:
#ifndef SCI_MEMORY_DEBUG
#define BLOCK_52_SIZE 52
#else
#define BLOCK_52_SIZE (52 + sizeof(MEM_HEADER_T) ) //存储debug信息。
#endif
#define MAX_NUM_OF_52_POOLS 300 //总共300个
#definePOOL_52_SIZE (MAX_NUM_OF_52_POOLS*(BLOCK_52_SIZE+sizeof(void *)))
8、各种Pool的大小定义:
const uint32 block_52_size = BLOCK_52_SIZE;
const uint32 block_100_size = BLOCK_100_SIZE;
const uint32 block_300_size = BLOCK_300_SIZE;
const uint32 block_600_size = BLOCK_600_SIZE;
const uint32 block_1600_size = BLOCK_1600_SIZE;
const uint32 byte_heap_size = BYTE_HEAP_SIZE;
const uint32 pool_52_size = POOL_52_SIZE;
const uint32 pool_100_size = POOL_100_SIZE;
const uint32 pool_300_size = POOL_300_SIZE;
const uint32 pool_600_size = POOL_600_SIZE;
const uint32 pool_1600_size = POOL_1600_SIZE;
9、各种内存池的空间分配:
uint32 BYTE_HEAP_ADDR[ byte_head_size >> 2 ];
uint32 POOL_52_ADDR[ pool_52_size >> 2 ];
uint32 POOL_100_ADDR[ pool_100_size >> 2 ];
uint32 POOL_300_ADDR[ pool_300_size >> 2 ];
uint32 POOL_600_ADDR[ pool_600_size >> 2 ];
uint32 POOL_1600_ADDR[ pool_1600_size >> 2 ];