配色: 字号:
MTK之Flash
2012-08-06 | 阅:  转:  |  分享 
  
Flash的型号定义在custom/system/CUSTOMER_bb/Custom_memorydevice.h



例如:



#defineMEMORY_DEVICE_TYPE???NOR_RAM_MCP



#defineCS0_PART_NUMBER??????K5L6331CAA



#defineCS1_PART_NUMBER??????K5L6331CAA



注意需要将make/CUSTOMER_PROJECT.mak中的SYSGEN设为TRUE



分析从NORFlash启动,Flash的宏定义:



一、TheFS(filesystem)regioninformationonNORFLASH!



()#defineNOR_BOOTING_NOR_FS_FIRST_DRIVE_SECTORS???512



文件系统被分为系统盘和用户盘,系统盘存储NV文件和MMS相关文件,对用户不可见,用户盘用户连上电脑就可以看到。在(i)中定义用户盘的大小为,单位为512Bytes,因此可以知道用户盘实际大小为512512=262144(Bytes)。这个值可以在build\CUSTOMER\log中的ckSysDrv.log查看到,如下:



FSFirstDriveSize??262144



解释:以上提到的大小单位之所以为512Bytes,是由Flash结构划分决定的。一块Flash分为若干block,每个block分为如干sector,每个sector又分为若干columnaddress。此处1sector正好是512Bytes。NorFlash读取以字节,NandFlash则是以page。



(NANDFlash结构与读写分析,http://blog.ednchina.com/walnutcy/147306/Message.aspx)



注意:MUSTNOTassignas?(TOTAL_FS_SIZE-SIZE_OF_SYSTEM_DRIVE),becausesystemwillkeepsomespacesfordiskmanagement.



?



二、ForNOR-XIPconfiguration,if



?1."SYSTEMDRIVEONNAND"or



?2."SYSTEMDRIVEONNOR"andFOTA"UPDATEPACKAGEONNAND"



?#defineNOR_BOOTING_NAND_FS_BASE_ADDRESS??????????0x00000000



Ⅱ?#defineNOR_BOOTING_NAND_FS_SIZE?????????????????????0x08000000



Ⅲ?#defineNOR_BOOTING_NAND_FS_FIRST_DRIVE_SECTORS???220000



解释:



?StartaddressofFSregiononNAND-flash



Ⅱ?TotalFSsizeonNAND-flashdisk



Ⅲ?用户盘大小



分析从NANDFlash启动各项值同NORFlash。



在tools/MemoryDeviceList/MemoryDeviceList_SinceXXX.xls中定义了一些Flash型号的相关参数,(并不是所有的都有这些参数)以FlashK5L6331CAA?BBMT6223为例.

1Word=2Bytes=16Bits

1block=32page(sector)



1page=512bytes(datafield)+16bytes(oob)



①custom/system/CUSTOMER_bb/custom_EMI.h



1)#defineEMI_GENERAL_CONTROL?????????0xeeeefb80



2)constkal_uint32??EMI_SettingOnCS[4]=



{



??0x44c94324,//flash的设置



??0x44c94404,//RAM的设置



??0,



??0



};



custom/system/CUSTOMER_bb/Flash_opt.h



Table:DEVICEBANKDIVISIONS









Bank

NumbeofBlocks

BlockSize



0

8

4Kwords



15

32Kwords



1

48

32Kwords



2

48

32Kwords



3

15

32Kwords



8

4Kwords

?



注:该表来自K5L6331CAA的datasheet。



1)#defineCONFIG_FOTA_NOR_BLOCK_DEF\



??{0x0,0x2000},\??????????????????????????//起始地址,大小



??{0x10000,0x10000},\



??{0x7F0000,0x2000},



?



2)#defineCONFIG_FOTA_NOR_BANK_DEF\



??{0x100000,1},\



??{0x300000,2},\



??{0x100000,1},??//FS的最大值



NORFlash被分为4个bank(从Flansh的datasheet可以知道K5L6331CAA分为4个bank,共有142个block),最后一个bank存储文件系统。ROM的大小可以计算得到:



0x1000001+0x3000002+0x1000001=0x800000,即为8MB.



另外我们可以看到除1),2)之外还有一个定义,如下:



#defineCONFIG_FOTA_NOR_REGION_DEF\



??{0x2000,8},\



??{0x10000,126},\



??{0x2000,8},



说明:CONFIG_FOTA_NOR_BLOCK_DEF中定义了Flash每个bank中每个block的大小及每个bank的起始地址。可以看到第一个bank中每block的大小为0x2000即8192Bytes=4096Words,地址从0x0开始,这个定义就是datasheet中的Bank0大小为4Kwords。在CONFIG_FOTA_NOR_REGION_DEF根据芯片对block的划分定义了各种类型block的个数,即头尾各有8个大小为0x2000的block,中间为126个大小为0x10000的block。其他的bank中block的划分类似。所有这些都是根据硬件也就是芯片结构的划分相对应的。



custom/system/CUSTOMER_bb/Custom_flash.c



FLASH_REGIONINFO_VAR_MODIFIERFlashRegionInfoRegionInfo[]=



{



??{0x10000,15},



??{0x2000,8},



??EndRegionInfo/Don''tmodifythisline/



};



?



这个定义了存储FS的bank的block大小和个数,



总大小=0x1000015+0x20008=1048576=1MB.



前提:在NORFlash中启动



文件中还定义文件系统的大小,Flash配置如果是从XLS读出的话,应该是根据其中的数据得到的。



#ifndefNOR_BOOTING_NOR_FS_SIZE????//在Custom_memorydevice.h中



?#defineNOR_ALLOCATED_FAT_SPACE???(0x00100000)



#else



?#defineNOR_ALLOCATED_FAT_SPACE?(NOR_BOOTING_NOR_FS_SIZE)



#endif



剩下存储代码的ROM大小



#ifndefNOR_BOOTING_NOR_FS_BASE_ADDRESS??//在Custom_memorydevice.h中



?#define?????NOR_FLASH_BASE_ADDRESS????(0x00700000)



#else



??#defineNOR_FLASH_BASE_ADDRESS(NOR_BOOTING_NOR_FS_BASE_ADDRESS)



#endif



?



注:Custom_flash.c这个文件的生成可以看emiGenV2.pl。



FOTA(FirmwareOverTheAirUpdates)



?



计算MTK中程序占用的ROM及RAM



在build下面一个.lis文件



TotalROSize(Code+ROData)//romsizeTotalRWSize(RWData+ZIData)//ramsize



TotalROMSize(Code+ROData+RWData)



解释:



RO是程序中的指令和常量RW是程序中的已初始化变量ZI是程序中的未初始化的变量



献花(0)
+1
(本文系小云蔡首藏)