Mini2440之uboot移植之实践NOR FLASH支持(二)

在上一节中,不知道你有没有注意到,以NOR方式启动u-boot后,运行有一行信息:

输出Flash信息这一部分代码是位于board_init_r阶段,执行initr_flash()函数的输出结果。

我们开发板上搭载了型号为S29AL016D70TF102的2MB大小的NOR FLASH,这里输出NOR FALSH大小为0字节,很明显没有能正确识别 2M的NOR FLASH了。

这一节我们将会介绍u-boot如何支持我们的NOR FLASH,这样我们后续就可以通过命令行对NOR FALSH进行读写操作。

一、Mini2440 NOR FLASH介绍

在之前的裸机开发中,我们没有介绍NOR FLASH的裸机程序,如果直接动手修改u-boot程序使其支持NOR FALSH,你可能会很懵逼,这里我们先补充一下NOR FLASH的基础知识。

NOR FLASH存储器接口标准包含CFI和JEDEC:

  • CFI为公共Flash接口(Common Flash Interface),CFI是一个公开的标准的从Flash Memory器件中读取数据的接口。它可以使系统软件查询已安装的Flash Memory器件的各种参数,包括器件阵列结构参数、电气和时间参数以及器件支持的功能等。利用CFI可以不用修改系统软件 就可以用新型的和改进的产品代替旧版本的产品。例如:如果新型的Flash Memory的擦除时间只有旧版本的一半,系统软件只要通过CFI读取新器件的擦除时间等参数,修改一下定时器的时间参数即可。
  • JEDEC是由生产厂商们制定的国际性协议,主要为 计算机 内存制定。JEDEC用来帮助程序读取Flash的制造商ID和设备ID,以确定Flash的大小和算法,如果芯片不支持CFI,就需使用JEDEC了。工业标准的内存通常指的是符合JEDEC标准的一组内存。

老式的NOR FLASH一般是JEDEC规范,其一般只包含识别 ID、擦除芯片、烧写数据的命令。要想知道其容量大小等信息,就需要先读出其芯片id,根据芯片id匹配uboot中drivers/mtd/jedec_flash.c里的的jedec_table数组,来确定NOR FLASH的哥哥参数(名称、容量、位宽)等,比较麻烦。另外如果内核jedec_table数组中事先没有对应芯片id的信息,还需要先在该数组中添加。

目前的NOR FLASH一般都支持CFI规范,其除了提供识别 ID、擦除芯片、烧写数据的命令之后,还提供了进入CFI模式的命令,进入CFI模式后就可以通过读取相应地址的数据获取芯片属性信息,如容量、电压等信息。 进入CFI模式(使用CFI Query命令)。

1.1 S29AL016D70TF102

Mini2440开发板就是将2M的NOR FLASH(型号S29AL016D70TF102)焊接在了Bank0上,S29AL016D70TF102这款芯片具有以下性质:

  • 灵活的扇区架构:
    • 一个 16 KB、两个 8 KB、一个 32 KB 和三十一个64 KB 扇区(字节模式);
    • — 1 个 8 Kword、2 个 4 Kword、1 个 16 Kword 和 31 Kword 扇区(字模式);
  • Top or bottom boot block configurations available;
  • 扇区保护特性:
    • A hardware method of locking a sector to prevent any program or erase operations within that sector.
    • Sectors can be locked in-system(通过NOR FLASH命令寄存器控制) or via programming equipment(编程器,需要高电压8.5V~12.5V).
    • Temporary Sector Unprotect feature allows code changes in previously locked sectors.
  • 与 JEDEC 标准的兼容性;
  • CFI(通用闪存接口)兼容;
  • 擦除挂起/擦除恢复;
  • 容量2MB;

Spansion 标准产品有多种封装和操作范围。 芯片型号(有效组合)由下面的元素组成,可以看出S29AL016D70TF102型号的参数MODEL NUMBER为02,bottom boot sector device。

S29AL016D70TF102支持8位和16位两种模式,具体选择哪种模式取决于芯片BYTE引脚信号;这里我们Mini2440采用的是16位模式,S3C2440的A1~A22连接NOR FLASH的A0~A21。需要错位连接的原因是:S3C2440处理器的每个地址对应的是一个BYTE的数据单元,而16位模式下,NOR FLASH的每个地址对应的是一个HALF-WORD(16-BIT)的数据单元。为了保持匹配,所以必须错位连接。这样,从S3C2440处理器发送出来的地址信号的最低位A0对16位Flash来说就被屏蔽掉了。

补充说明:

  • 一般来说,ARM处理器内部要设置相应的寄存器,告诉处理器外部扩展的Flash的位宽(8-BIT/16-BIT/32-BIT)。这样,处理器才知道在访问的时候如何从FLASH正确的读取数据;
  • 有些ARM处理器内部可以设置地址的错位。对于支持软件选择地址错位的处理器,在连接16-BIT FLASH的时候,硬件上可以不需要把地址线错位。
  • 如果处理器支持内部设置地址错位,在实际访问的时候,送出的地址实际上是在MCU内部做了错位处理,其作用是等效于硬件连接上的错位的。
1.2 指令集

Legend:

  • X = Don’t care
  • RA = Address of the memory location to be read.
  • RD = Data read from location RA during read operation.
  • PA = Address of the memory location to be programmed. Addresses latch on the falling edge of the WE# or CE# pulse, whichever happens later.
  • PD = Data to be programmed at location PA. Data latches on the rising edge of WE# or CE# pulse, whichever happens first.
  • SA = Address of the sector to be verified (in autoselect mode) or erased. Address bits A19–A12 uniquely select any sector.

Note:

  • 1. See Table 1 for description of bus operations.
  • 2. All values are in hexadecimal.
  • 3. Except for the read cycle and the fourth cycle of the autoselect command sequence, all bus cycles are write cycles.
  • 4. Data bits DQ15–DQ8 are don’t cares for unlock and command cycles.
  • 5. Address bits A19–A11 are don’t cares for unlock and command cycles, unless SA or PA required.
  • 6. No unlock or command cycles required when reading array data.
  • 7. The Reset command is required to return to reading array data when device is in the autoselect mode, or if DQ5 goes high (while the device is providing status data).
  • 8. The fourth cycle of the autoselect command sequence is a read cycle.
  • 9. The data is 00h for an unprotected sector and 01h for a protected sector. See “Autoselect Command Sequence” for more information.
  • 10. Command is valid when device is ready to read array data or when device is in autoselect mode.
  • 11. The Unlock Bypass command is required prior to the Unlock Bypass Program command.
  • 12. The Unlock Bypass Reset command is required to return to reading array data when the device is in the unlock bypass mode. F0 is also acceptable.
  • 13. The system may read and program in non-erasing sectors, or enter the autoselect mode, when in the Erase Suspend mode. The Erase Suspend command is valid only during a sector erase operation.
  • 14. The Erase Resume command is valid only during the Erase Suspend mode.

以Autoselect Command Sequence为例,当采用 16 位位宽时,先向地址“555”处写入“AA”,再向地址“2AA”处写 入“55”,接着向地址“555”处写入“90” ,最后从 0 地址“X00”处可以读到“01”。 周期“First”和“Second”是“解锁”,周期“Third”是发出命令。 需要注意的是,以地址"555"为例,每个地址对应的数据长度为2个字节,对应8位位宽地址555<<1=AAA。

以读取厂家ID为例,编写代码时序如下:

  • 解锁:向地址AAAH(555<<1)写入AAH,向地址554(2AA<<1)写入55H;
  • 命令:向地址AAAH(555<<1)写入90H;
  • 读地址0x00得到厂家ID;

由于Mini2440的A1接到NOR FLASH的A0,所以2440发出(555<<1),NOR FLASH才能收到“555”这个地址;同理,只要是2440发出的地址都需要在NOR FLASH的地址基础上<<1。

注意:

  • 这里有一点需要注意的是,在解锁和命令总线周期地址A19~A11是被忽略的,所以地址555与5555等价,2AA与2AAA是等价的,因为A0~A10位是一致的。

关于如何对NOR FLASH进行读写、擦除,我就简单说一下:

  • 读:NOR FLASH上电后处于数据读取状态(Reading Array Data)。此状态可以进行正常的读,这和读取SDRAM/SRAM/ROM一样。(要是不一样的话,芯片上电后如何从NOR FLASH中读取启动代码)。需要注意的是进入自动选择(Autoselect Command)模式后需要发送复位命令才能回到数据读取状态(Reading Array Data)。
  • 擦除:在完成信息获取后一般就要擦除数据。NOR FLASH支持扇区擦除(Sector Erase)和整片擦除(Chip Erase),这2种模式都有对应的命令序列,在完成擦除命令后会自动返回到数据读取(Reading Array Data)状态,在返回前可查询编程的状态。
  • 编程(写):完成擦除后就需要对芯片进行写入操作也就是编程,这就需要进入编程(Program)状态。在完成编程命令后会自动返回到数据读取(Reading Array Data)状态,在返回前可查询编程的状态,注意:编程前一定要先擦除。因为编程只能将'1'改写为'0',通过擦写可以将数据全部擦写为'1'。如果绕过解锁模式Unlock Bypass,编程只需要两个周期,而不是4个周期。
1.3 裸机程序

这里就不展示裸机程序了,有兴趣的可以参考mini2440硬件篇之Nor Flash

二、NOR FLASH支持

2.1 宏定义

在include/configs/smdk2440.h文件有NOR FLASH相关的定义,如下:

#define PHYS_FLASH_1        0x00000000 /* Flash Bank #0 */

#define CONFIG_SYS_FLASH_BASE    PHYS_FLASH_1    // NOR FLASH物理基地址


/*-----------------------------------------------------------------------
 * FLASH and environment organization
 */

#define CONFIG_SYS_FLASH_CFI
#define CONFIG_FLASH_CFI_DRIVER
#define CONFIG_FLASH_CFI_LEGACY
#define CONFIG_SYS_FLASH_LEGACY_512Kx16    // jedec_table数组支持哪些容量大小的芯片 这里表示芯片大小为512kb,位宽为16 我们可以忽略这个
#define CONFIG_FLASH_SHOW_PROGRESS    45

#define CONFIG_SYS_MAX_FLASH_BANKS    1     // NOR FLASH芯片数量                        
#define CONFIG_SYS_FLASH_BANKS_LIST     { CONFIG_SYS_FLASH_BASE }
#define CONFIG_SYS_MAX_FLASH_SECT    (19)   // NOR FLASH最大扇区数量
2.2 分析启动信息

在u-boot以NOR方式启动时,如果我们想打印更加详细的信息,可以在include/configs/smdk2440.h中加入如下宏,重新编译,下载运行,则可以打印更多调试相关信息:

#define DEBUG

这里信息比较多,我就不截图了:

Flash: fwc addr 00000000 cmd f0 00f0 16bit x 16 bit  # 复位命令 地址0x00写入0xFO
fwc addr 0000aaaa cmd aa 00aa 16bit x 16 bit         # 地址0xaaaa写入0xaa      
fwc addr 00005554 cmd 55 0055 16bit x 16 bit         # 地址0x5554写入55  
fwc addr 0000aaaa cmd 90 0090 16bit x 16 bit         # 地址0xaaaa写入0x90
fwc addr 00000000 cmd f0 00f0 16bit x 16 bit         # 复位命令 
JEDEC PROBE: ID 1 2249 0                              
fwc addr 00000000 cmd ff 00ff 16bit x 16 bit
fwc addr 00000000 cmd 90 0090 16bit x 16 bit
fwc addr 00000000 cmd ff 00ff 16bit x 16 bit
JEDEC PROBE: ID be ea00 0
0
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Graceful_scenery

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值