Chinaunix首页 | 论坛 | 博客
  • 博客访问: 40793
  • 博文数量: 18
  • 博客积分: 1400
  • 博客等级: 上尉
  • 技术积分: 200
  • 用 户 组: 普通用户
  • 注册时间: 2008-10-05 10:27
文章分类
文章存档

2011年(1)

2009年(1)

2008年(16)

我的朋友

分类:

2008-11-18 09:43:06

一、简单流程

 

NorInitial

转到state_spalsh

获取文件大小、头指针及偏移量等信息

检测PKG文档是否存在

升级ROM档和DATA

二、详细说明每一步

1.NOR的初始化

因为NOR的型号有很多,所以要使整套软件支持不同型号的NOR,首先必须初始化不同型号的NOR。主要初始化如下信息:bytesPerPagepagesPerSectorbytesPerSectorsectorsPerBlock以及totalBlocks。实际上用到的信息只有bytesPerPagebytesPerSectorbytesPerPagepage编程单位,bytesPerSector是擦除单位。这些信息在后面的升级NOR的过程中会用到。

    在对不同型号的NOR初始化之前,系统要识别NOR型号。那么系统是如何识别不同型号的NOR呢,系统是通过调用函数Nor_ReadID(),获取NORID。然后根据ID号,查找相应ID号的NORdatasheet,配置bytesPerPagepagesPerSectorbytesPerSectorsectorsPerBlock以及totalBlocks的值,这样就完成了NOR的初始化。

下面说明获取ID的原理:

(1)       数据结构定义

ID是从事先定义好的结构体中获得的。

三种IDmanufatureID deviceID vendorID。其中manufatureIDdeviceID是保存在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_F25L16A,

    EON_EN25P32,

    EON_EN25B16,

    MX_25L1605A,

    EON_EN25F16,

    EON_EN25B32,

    SST_25VF016B,

    MX_25L3235D,

    MX_25L1635D,

    WIN_W25X16A,

    UNKNOW_VENDOR = 0xFFFF

}NOR_VENDOR_ID;

NOR_VENDOR_ID中包含了系统所要支持的NORvendorID

 

NOR_VENDOR_CONTEXT定义一个结构体数组nor_support_vendor[],如下:

NOR_VENDOR_CONTEXT nor_support_vendor[] = {

    {0x8C, 0x2015, "ESMT_F25L16PA", ESMT_F25L16A},

    {0x1C, 0x2016, "EON__EN25P32", EON_EN25P32},

    {0x1C, 0x2015, "EON__EN25B16", EON_EN25B16},

    {0xC2, 0x2015, "MX__25L1605A", MX_25L1605A},

    {0x1C, 0x3115, "EON__EN25F16", EON_EN25F16},

    {0x1C, 0x2016, "EON__EN25B32", EON_EN25B32},

    {0xBF, 0x2541, "SST_25VF016B", SST_25VF016B},

    {0xC2, 0x5E16, "MX__25L3235D", MX_25L3235D},

    {0xC2, 0x2415, "MX__25L1635D", MX_25L1635D},

    {0xEF, 0x3015, "WIN__W25X16A", WIN_W25X16A}

};

该数组中包含系统所要支持型号NOR的所有IDdeviceName   。其中manufatureID deviceID deviceNameDatasheet中可以查询到。

 

(2)       获取ID的过程

系统通过SPISI线发送读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为单位读入SDRAMbuffer0,然后再将SDRAM中这64Kbytes数据写入NOR中,写完之后,再将NOR中所写的64Kbytes数据读入SDRAMbuffer1,将buffer0 buffer1做比较,看写NOR是否正确。之后依次循环读写以及校正64KbytesROM档数据,直至ROM档数据被读写校正完毕。当然最后一次读写及校正的ROM档数据remainder小于等于64Kbytes

值得注意的是,写NOR之前,系统默认要先擦除NOR。所谓擦除就是向NOR1。不同型号的NOR擦除方式也不一样,分为4-Kbyte Block Erase32-Kbyte Block Erase64-Kbyte Block EraseSector Erase等。

而向NOR64K的数据是这样的:每次命令写32个字节,所有要发送64K/32次命令才能写完64K的数据

 

2)升级DATA(NOR-NAND-NAND)

a. 升级private data

0x14b520h地址开始的内容为要升级的DATA,前4个字节为dataType,表示private data升级到NAND 还是NOR中。当其值为1时,表示NANDprivate disk;当其值为0时,表示NORprivate disk。这里dataType1,表示表示NANDprivate disk。接下来的4个字节为diskAddress=0。之后的4字节为diskSizediskSize后面的4字节为fileCount,表示private的文件个数,从表中可以看出文件数为35个。

接下来从地址0x14b530h开始的12个字节为第一个文件acc.codecs的信息,依次为namelengthfilename dataSize

升级private data实际上就是将这35个文件从PKG文档中读入SDRAM,然后写入NANDprivate区去。下面以第一个文件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原理类似,不同的是升级空间是NANDpublic区。

 

阅读(1089) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~