分类:
2008-11-18 09:43:06
一、简单流程
NorInitial 转到state_spalsh 是 否 获取文件大小、头指针及偏移量等信息 检测PKG文档是否存在 升级ROM档和DATA
二、详细说明每一步
1.NOR的初始化
因为NOR的型号有很多,所以要使整套软件支持不同型号的NOR,首先必须初始化不同型号的NOR。主要初始化如下信息:bytesPerPage、pagesPerSector、bytesPerSector、sectorsPerBlock以及totalBlocks。实际上用到的信息只有bytesPerPage和bytesPerSector。bytesPerPage是page编程单位,bytesPerSector是擦除单位。这些信息在后面的升级NOR的过程中会用到。
在对不同型号的NOR初始化之前,系统要识别NOR型号。那么系统是如何识别不同型号的NOR呢,系统是通过调用函数Nor_ReadID(),获取NOR的ID。然后根据ID号,查找相应ID号的NOR的datasheet,配置bytesPerPage、pagesPerSector、bytesPerSector、sectorsPerBlock以及totalBlocks的值,这样就完成了NOR的初始化。
下面说明获取ID的原理:
(1) 数据结构定义
ID是从事先定义好的结构体中获得的。
三种ID:manufatureID、 deviceID 及vendorID。其中manufatureID和deviceID是保存在NOR寄存器中的值,manufatureID为一个字节数值,deviceID为两个字节数值。vendorID为我们自己添加的NOR的型号。这三种ID在下面的结构体类型NOR_VENDOR_CONTEXT
中定义。
结构体类型NOR_VENDOR_CONTEXT如下定义:
typedef struct
{
MMP_UINT8 manufatureID;
MMP_UINT16 deviceID;
MMP_UINT8 *deviceName;
NOR_VENDOR_ID vendorID;
}NOR_VENDOR_CONTEXT
其中枚举类型NOR_VENDOR_ID如下定义:
typedef enum
{
ESMT_F
EON_EN25P32,
EON_EN25B16,
MX_
EON_EN
EON_EN25B32,
SST_25VF016B,
MX_
MX_
WIN_W25X
UNKNOW_VENDOR = 0xFFFF
}NOR_VENDOR_ID;
NOR_VENDOR_ID中包含了系统所要支持的NOR的vendorID。
用NOR_VENDOR_CONTEXT定义一个结构体数组nor_support_vendor[],如下:
NOR_VENDOR_CONTEXT nor_support_vendor[] = {
{0x
{0x
{0x
{0xC2, 0x2015, "MX__
{0x
{0x
{0xBF, 0x2541, "SST_25VF016B", SST_25VF016B},
{0xC2, 0x5E16, "MX__
{0xC2, 0x2415, "MX__
{0xEF, 0x3015, "WIN__W25X
};
该数组中包含系统所要支持型号NOR的所有ID和deviceName 。其中manufatureID、 deviceID 及deviceName在Datasheet中可以查询到。
(2) 获取ID的过程
系统通过SPI的SI线发送读ID的指令至NOR,然后通过SO线读取数据,首先读到的第一个字节是manufatureID,紧随其后的两个字节为deviceID。之后将得到的manufatureID 与nor_support_vendor[i]数组中的manufatureID相比较,若两者相等,按照相同方式继续比较deviceID,若两者的deviceID也相等,则nor_support_vendor[i]. vendorID就是所要获取的ID,这样ID就得到了。
2. 获取PKG文件信息
PKG文件的内容会随着编译方式不同而改变,为方便说明,下面以NOR-NAND-NAND为例说明。打开PKG文档,内容如下:
文件头header内容为SMEDIA02,占文件起始8个字节,此信息用于确认PKG文件是否正确。之后的4个字节内容为romType,用于判断ROM档的类型,当romType值为0时,ROM档为nor boot;当romType值为1时,ROM档为nand boot。显然这里是nor boot类型。
接下来的4字节内容为ROM档的大小(romSize)。之后从地址0x0010h开始至0x14B51Fh
为ROM档数据。
3. 升级PKG文档
升级其实就是一个读写的过程,包括升级ROM档和DATA。
(1)升级ROM档(NOR-NAND-NAND)
ROM档升级到NOR中去,所以romType值为0。
如上图所示,升级ROM档的过程:系统在升级ROM档时,先将SD卡中的PKG文档从ROM档数据开始,每次以64Kbytes为单位读入SDRAM的buffer0,然后再将SDRAM中这64Kbytes数据写入NOR中,写完之后,再将NOR中所写的64Kbytes数据读入SDRAM的buffer1,将buffer0 与buffer1做比较,看写NOR是否正确。之后依次循环读写以及校正64KbytesROM档数据,直至ROM档数据被读写校正完毕。当然最后一次读写及校正的ROM档数据remainder小于等于64Kbytes。
值得注意的是,写NOR之前,系统默认要先擦除NOR。所谓擦除就是向NOR写1。不同型号的NOR擦除方式也不一样,分为4-Kbyte Block Erase、32-Kbyte Block Erase、64-Kbyte Block Erase及Sector Erase等。
而向NOR写64K的数据是这样的:每次命令写32个字节,所有要发送64K/32次命令才能写完64K的数据
(2)升级DATA(NOR-NAND-NAND)
a. 升级private data
从0x14b520h地址开始的内容为要升级的DATA,前4个字节为dataType,表示private data升级到NAND 还是NOR中。当其值为1时,表示NAND作private disk;当其值为0时,表示NOR作private disk。这里dataType为1,表示表示NAND作private disk。接下来的4个字节为diskAddress=0。之后的4字节为diskSize。diskSize后面的4字节为fileCount,表示private的文件个数,从表中可以看出文件数为35个。
接下来从地址0x14b530h开始的12个字节为第一个文件acc.codecs的信息,依次为namelength、filename 及dataSize。
升级private data实际上就是将这35个文件从PKG文档中读入SDRAM,然后写入NAND中private区去。下面以第一个文件acc.codecs为例说明升级private data的原理和过程。
namelength *filename datasize *pFliedata . . .
系统首先会分配如上空间,分别用于存储35个文件的文件名长度、文件名地址、文件大小以及数据起始地址。然后是升级第一个文件acc.codecs。升级文件acc.codecs和升级ROM档原理上其实差不多,只不过写NAND是通过函数fwrite(),而写NOR是通过函数norwrite()。
a. 升级public data
升级public data和升级升级private data原理类似,不同的是升级空间是NAND的public区。