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

2011年(1)

2009年(1)

2008年(16)

我的朋友

分类:

2008-11-18 09:46:20

学习写NOR驱动,必须了解两方面的知识:1.burnflash的原理;2.NORdatasheet

NOR的驱动,各种型号差不多,用我们的代码提供好的函数就可以。

NOR的驱动,各种型号有所差别,一般的分为关闭写保护、写使能、擦除、写数据等。

表现不同的地方也就是写使能、擦除、写数据等方式的不同。这些差别在NORdatasheet中都有说明。所以仔细阅读datasheet是关键。

给新型号的NOR添加驱动程序分两步,NOR的初始化和写NOR的驱动

下面以EN25B16AT26DF161为例分别说明添加NOR驱动的步骤:

 

一、在结构体类型NOR_VENDOR_ID 中添加所要写驱动NORvendoID,红色字体所示

typedef enum

{

    ESMT_F25L16A,

    EON_EN25P32,

    EON_EN25B16,

    MX_25L1605A,

    EON_EN25F16,

    EON_EN25B32,

    SST_25VF016B,

    MX_25L3235D,

    MX_25L1635D,

WIN_W25X16A,

ATML_AT26DF161,

    UNKNOW_VENDOR = 0xFFFF

}NOR_VENDOR_ID;

 

二、在相应的datasheet中分别查找EN25B16AT26DF161manufatureID deviceID,添加到数组nor_support_vendo[]

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}

{0x1F, 0X4600, “ATML_AT26DF161”, AT26DF161 }

};

 

三、 查找datasheet,在函数InitNorFlash(void)中添加EN25B16AT26DF161bytesPerPagepagesPerSectorbytesPerSectorsectorsPerBlocktotalBlocks的信息。

但是这里要特别注意,配置这几个值时有时不要照搬datasheet的值,否则会出错误。比如配置AT26DF161的信息时,datasheet上明明写的是Sixteen 128-Kbyte Physical Sectors,然后按照datasheettotalBlocks配成16,这样的话,bytesPerSector就得为128*1024(因为总大小为2M)。按照这样配置的话,升级时就会发现升级不成功,问题出在哪呢?看过burnflash那部份代码就会找到问题所在。bytesPerSectorNOR擦除的地址增量,系统擦除指令设置成的是D8h,查看AT26DF161datasheet,可以找到在此指令下AT26DF161的擦除单位为64K。这样问题就来了,实际擦除单位是64K,每次擦除64K后,地址跳转bytesPerSecto128K),然后再接着擦除64K。这样就会造成没128K中有64K没有被擦除到。所以要把bytesPerSector设置成64*1024,这样totalBlocks就得为32了。因此,配置

这些信息时,要根据实际情况灵活配置。

 

四、写驱动

函数FTSPI_Write void* psrc, MMP_UINT addr,  MMP_INT size) 是写驱动的核心,其实要改动的地方就在此函数处。

NOR的顺序为:写使能,关闭写保护,擦除,写使能,写数据,最后取消写使能。

阅读EN25B16datasheet,发现EN25B16Two 4-Kbyte, one 8-Kbyte, one 16-Kbyte,one 32-Kbyte, and thirty one 64-Kbyte sectors 。而擦除指令D8h 表示 EN25B16是按Sector擦除的,既擦除单位分别为4K,8K,16K,32K64K。所以在设bytesPerSector时,对于不同大小的sector要分别设定。而写NOR是每次写32个字节,所以写数据时不用特别设定。

阅读(975) | 评论(0) | 转发(0) |
0

上一篇:升级PKG文档原理

下一篇:ISP相关Info

给主人留下些什么吧!~~