展讯平台驱动学习心得(三) —存储器的配置

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 ];

 

 

你可能感兴趣的:([28]手机/话机平台)