DDR和FLASH物料调试指南

2020/09/03 LINUX 共 6157 字,约 18 分钟

DDR和FLASH物料调试指南

目录

1. 介绍

本文主要介绍DDR2/3以及FLASH的物料调试。

1.1. 适用人员

开发人员应该具备以下技能:

  • 熟悉C语言
  • 熟悉Linux Device Driver开发

1.2. 开发环境

  • 可以正常编译通过的Siflower SDK环境 该环境的搭建请参考快速入门

2. DDR物料调试

以ddr2_a3r12e40dbf型号为例

2.1. 创建文件,配置参数

  1. 拿到板子,可根据与cpu连线最多来找出ddr芯片,查看芯片上的型号,以本次调试的ddr为例
    Zentel ———-厂商  A3R12E40DBF ——–型号  -AH ——–具体的型号

  2. 与ddr型号(A3R12E40DBF)对应的文档,在文档中可找到其具体型号(A3R12E40DBF-AH),并可知其最大频率为1066Mbps

  3. 进入目录~/uboot/bare_spl/ddr,新建一个以当前ddr型号命名的.c文件,参考当前目录下的其他ddr配置文件中的参数,根据所给说明文档对参数值进行修改,把该ddr支持的所有频率及其对应的参数都进行添加或修改。根据文档修改ddr2_a3r12e40dbf.c中频率对应的有关参数(以1066Mbps为例)。

根据文档中的参数表配置1066M和800M频率相关的参数,具体如下所示。

2.2. 修改Makefile

在~/uboot/bare_spl/ddr/Makefile文件中添加obj-$(a3r12e40dbf) += ddr2_a3r12e40dbf.c

2.3. 注意事项

1、在开始调试之前,应先检查用于调试物料的板子有无问题,如能否正常启动、正常烧录镜像、频繁插拔电源有无问题等。 2、ddr的bank有4个、8个或未来会有16个及以上等,因此其值要根据文档来进行修改,本次调试的型号ddr->bank = 4。 3、ddr新物料调试时,主要先看型号及其支持的最高频率,将不超过最高频率的都进行支持,配置相关参数。 4、烧录镜像至板子,首先看系统能否正常启动,其次测试软重启和拔电重启能否正常进行,最后再进行ddr压力测试。

2.4. 部分参数说明

CL:是内存读写前列地址控制器的潜伏时间(CAS Latency),以时钟为单位。这个参数很重要,内存条上一般都有这个参数标记。较低的CAS周期能减少内存潜伏周期以提高内存的工作效率。因此只要能够稳定运行操作系统,我们尽量将此参数调低,反之,若内存运行不稳定,可以将此参数调大,以提高内存稳定性。

tRCD:是行寻址至列寻址延迟(RAS to CAS Delay),CAS(Column Address Strobe)和RAS(Row Address Strobe)共同决定了内存寻址。RAS(数据请求后首先被激发)和CAS(RAS完成后被激发)并不是连续的,存在着延迟。然而,这个参数对系统性能的影响并不大,因为程序存储数据到内存中是一个持续的过程。在同个程序中一般都会在同一行中寻址,这种情况下就不存在行寻址到列寻址的延迟了。

tRP:是行预充电时间(RAS Precharge Time),即内存从一个行访问结束到重新开始的间隔时间。简单而言,在依次经历过tRAS,然后RAS(Row Address Strobe)、tRCD和CAS(Column Address Strobe)之后,需要结束当前的状态然后开始新的循环,即再从tRAS开始,tRP的参数值越小则表示在不同行切换的速度越快。

tRAS:是行有效至行预充电时间(Active to Precharge Delay),指从收到一个请求后到初始化RAS(Row Address Strobe)真正开始接受数据的间隔时间。这个参数看上去似乎很重要,其实不然。内存访问是一个动态的过程,有时内存非常繁忙,但也有相对空闲的时候,虽然内存访问是连续不断的。tRAS命令是访问新数据的过程(例如打开一个新的程序),但发生的不多。

tRC:是SDRAM行周期时间(Row Cycle Time),它是包括行单元预充电到激活在内的整个过程所需要的最小的时钟周期数。其计算公式是:tRC(row cycle time ) = tRAS(minimum row active time) +tRP( row precharge time)。如果tRC的时间过长,会因在完成整个时钟周期后激活新的地址而等待无谓的延时,降低性能。如果该值设置过小,在被激活的行单元被充分充电之前,新的周期就可以被初始化,在这种情况下,仍会导致数据丢失和损坏。

tWR:是写恢复延时(Write Recovery Time)。该值说明在一个激活的bank中完成有效的写操作及预充电前,必须等待多少个时钟周期。这段必须的时钟周期用来确保在预充电发生前,写缓冲中的数据可以被写进内存单元中。

tRFC:是SDRAM行刷新周期时间(Row Refresh Cycle Time),它是行单元刷新所需要的时钟周期数。该值也表示向相同的bank中的另一个行单元两次发送刷新指令(REF指令)之间的时间间隔,它比tRC的值要高一些。

tCCD:是CAS#-to-CAS#命令之间的时延,读命令之间的时间间隔。如果要输出数据连续读命令之间的间隔是BL/2 个周期,因为命令是单速率而数据是双速率,如果突发数据速率是8,那读(写)数据输出只需要4个时钟周期。突发(Burst)是指在同一行中相邻的存储单元连续进行数据传输的方式,连续传输所涉及到存储单元(列)的数量就是突发长度(Burst Lengths,简称BL)。

tRRD:是行单元到行单元的延时(Row to Row Delay)。该值也表示向相同的bDDR物料调试指南ank中的同一个行单元两次发送激活指令(即:REF指令)之间的时间间隔。

tWTR:是读到写延时(Write to Read Delay)。它设定向DDR内存模块中的同一个单元中,在最后一次有效的写操作和下一次读操作之间必须等待的时钟周期。

3. FLASH物料调试

3.1. uboot中修改

物料型号在const struct spi_flash_params spi_flash_params_table[]={}中查看,没有则添加

代码路径:uboot代码:drivers/mtd/spi/sf_params.c

3.2. linux kernel修改

  1. 物料型号在static const struct spi_device_id spi_nor_ids[]={}中查看,没有则添加

    代码路径:linux kernel的代码: drivers/mtd/spi-nor/spi-nor.c

  2. 物料型号在static const struct spi_device_id m25p_ids[]={}中查看,没有则添加

    代码路径:linux kernel代码: drivers/mtd/devices/m25p80.c

    3.3. 新添FLASH物料

    如果驱动中查看没有该型号,则需要添加,上述三处都要添加同一型号,添加时仿照所在代码文件中的其他型号的形式. 通过查看对应宏的定义了解每个参数的意义,并在flshd的文档中查找对应信息。型号的匹配主要是根据jedec_id进行,jedec_id的值由0xef0000+DeviceID,该DeviceID由9F返回,文档中的信息如下:

The JEDEC assigned Manufacturer ID byte for Winbond (EFh) and two Device ID bytes, Memory Type (ID15-ID8) and Capacity (ID7-ID0) are then shifted out on the falling edge of CLK with most significant bit (MSB) first as shown in Figure 43a.

jedec_id

在上面的文档中我们可以知道flash型号为W25Q128的device id为0x4018, 那么其jedec id就应该为0xef0000 + 0x4018 = 0xef4018 代码中对于LFASH相关信息的宏定义如下:

#define INFO(_jedec_id, _ext_id, _sector_size, _n_sectors, _flags)      \

          ((kernel_ulong_t)&(struct flash_info) {                         \

                 .jedec_id = (_jedec_id),                                \

                 .ext_id = (_ext_id),                                    \

                 .sector_size = (_sector_size),                          \

                .n_sectors = (_n_sectors),                              \

                 .page_size = 256,                                      

                 .flags = (_flags),                                      \

          })

查看宏的定义可知每个参数的意义

{ “w25q128”, INFO(0xef4018, 0, 64 * 1024, 256, SECT_4K) }

#4. DDR和FLASH压力测试
##4.1 DDR压力测试
在openwrt镜像文件编译时,make menuconfig 选中 PACKAGE_memtester。
烧录更新完成后,在串口中输入以下命令开始DDR压力测试:
> cd /bin/
sh memtester-multi.sh -c 4 -m 16 -t 72h &

(其中,-m 后的参数需要通过free查看剩余空间大小后决定,且该参数应为4的整数倍 -t 后为压力测试测试时间参数)

测试日志检测:
在板子的 /tmp/memtester-log-xxxx 路径下有4个.log文件,查看其中是否有fail,均无则结果正常。

##4.2 FLASH压力测试   将对应flash压力测试脚本 storage_test.sh 复制到对应目录下(/package/base-files/files/bin/)编译镜像文件更新镜像文件。   1. 首先进入测试脚本对应目录,eg,测试脚本放置在/bin目录下,使用cd命令到/bin目录: >cd  /bin
  1. 执行指令: 

    sh storage_test.sh storage_test start /src /dst 200 spi &

测试指令传入参数描述:

参数描述
storage_test表征测试项
start表示开始进行flash测试
/src和/dst表示两个测试文件目录,该目录在测试中由脚本自动生成
200表示测试搬运文件大小限制,单位为KB
spi表示测试存储对象为flash设备

注:
1)测试搬运文件大小可以依据板子正常运行起来之后剩余空间计算来选择:
在命令行输入:df -h查看板子flash剩余空间大小(/overlayfs:/overlay Available大小)
Flash测试文件搬运测试时,由于需要进行文件拷贝操作,所以支持的最大单文件为剩余大小的一半。上述指令中第四个传入参数可以传入小于该最大单文件大小数值。
2)如果不小心由于误操作出现flash塞满,无法正常创建文件的情况,请重新烧录镜像文件,重新测试。

  1. log检查:

    sh storage_test.sh storage_test check

注:check参数表示检查测试结果是否存在问题。

  1. 结束测试:

    sh storage_test.sh storage_test stop

注:stop参数表示结束测试。

5. 目前支持的ddr和flash型号

部分型号没有spec,且目前板子上未使用,不能完全确认支持,便没有记录在列表中;参照spec和代码对ddr和flash进行整理统计的支持列表如下,且会保持更新:

5.1. DDR支持列表

类型厂商型号容量备注
DDR2EtronTech钰创EM68B16CWQH-25H512Mb 32Mb x 16bit 
DDR2ZentelA3R12E40DBF512Mb 32Mb x 16bit 
DDR2Nanya/Elixir易胜N2TU51216DG-AC512Mb 32Mb x 16bit 
DDR2NanyaNT5TU32M16EG-AC512Mb 32Mb x 16bit 
DDR2Samsung三星K4T51163QQ-BCF7512Mb 32Mb x 16bit 
DDR2补丁PME809416D512Mb 32Mb x 16bit 
DDR2CTECT54V321601A512Mb 32Mb x 16bit 
DDR2ESMTM14D5121632A512Mb 32Mb x 16bit 
DDR2ESMTM14D5121632A-2.5BG2A512Mb 32Mb x 16bit 
DDR2MicronMT47H64M16  

5.2. Flash支持列表

类型厂商型号容量备注
NorflashBoya博亚BY25Q128AS16MB 
NorflashBoya博亚BY25Q128ASSIG16MB 
NorflashBoya博亚BY25Q64AS8MB 
NorflashBoya博亚BY25Q32BS4MB 
NorflashESMTEN25QH128AS16MB 
NorflashESMTEN25QH128AP-104HIP16MB 
NorflashESMTEN25QH128A-104HIP2T16MB 
NorflashHuahong华虹BH25Q32BS4MB 
NorflashHuahong华虹BH25Q32BS4MB 
NorflashHuahong华虹BH25Q64BS8MB 
NorflashHuahong华虹BH25Q128AS16MB 
NorflashDosiliconDS25Q64M8MB停 产
NorflashDosiliconFM25Q64A-1AIA48MB 
NorflashDosiliconDS25Q4AM16MB停 产
NorflashDosiliconFM25M4AA-1AIB416MB 
NorflashwinbondW25Q128FW16MB 
NorflashwinbondW25q128JVSIQ16MB 
NorflashwinbondW25q128JVSQ16MB 
NorflashGigadeviceGD25Q64C8MB 
NorflashGigaDeviceGD25Q127CSIGR16MB 
Norflash芯天下XT25F32B-S4MB 
Norflash芯天下XT25F64B-S8MB 
NorflashXMCXM25QH32B-XMC32M4MB 
NorflashXMCXM25QH64AHJ-XMC64M8MB 
NorflashMxic宏旺MX25L25645GZ2I-08G8MB 
NorflashZbit SemiconductorZB25VQ64A8MB 
NandflashwinbondW25N01GVZEIG128MB 
NandflashwinbondW23N01GV2E2G5PG128MB 
NandflashwinbondW25N01GVxxxG/T/R128MB 
NandflashMxic宏旺MX35LF1GE4AB128MB 

文档信息

Search

    Table of Contents