内存大小自动识别总结

内存大小自动识别总结

DDR 接口与结构

  • column
  • row
  • bank

可以把DDR想象成excel文件,bank为工作表,cloumn为工作表的列,row为工作表的行,一个excel文件有多个工作表,即多个bank.

具体讲解可参考如下链接,不再赘述。
[link]DDR3详解(http://blog.csdn.net/njuitjf/article/details/18360741)
[link]专家详解:内存工作原理及发展(http://memory.zol.com.cn/47/474952.html)

自动识别算法

自动识别算法并不是通用的,需要根据具体的情况具体分析

  • 两种内存间的差异(bank, row, column)
  • 内存控制对内存地址的解析

自动识别的思路是:假设内存的大小,通过读写内存的方式来证明假设。如果证明假设是错误的,则修改DDR控制器的参数;如果证明假设是正确的,则不需修改参数,直接继续执行。

K4T51163QQ(64M DDR2) 与 (K4T1G164QG)128M DDR2 的自动识别

硬件已经保证了PIN-PIN兼容,通过查看数据手册,发现:128M内存比64M内存多了一根bank线。

型号 容量 bank row column
K4T51163QQ 32M x 16bit BA0 ~ BA1 A0 ~ A12 A0 ~ A9
K4T1G164QG 64M x 16bit BA0 ~ BA2 A0 ~ A12 A0 ~ A9

即当PCB内存为K4T51163QQ时,BA2是NC的;当PCB内存为K4T1G164QG时,BA2连接内存BA2。

查看MCS5300x CPU用户手册,发现这款MIPS-CPU的DDR控制器支持配置内存地址解码方式。即可配置bank, row, column在内存地址中的位置,并且默认为row, bank,cloumn的模式。

image


我们来分析一下按照目前这种默认的地址解析模式,如何去自动识别到底焊接的是哪一种内存。
假设内存大小为128M, 则我们需要配置bank线数为3。这时候,PCB的内存为128M和64M会发生一个很有趣的现象。
image


当内存为64M时,从IO的角度来看,选中BA2与不选中BA2没有任何差别;从内存地址的角度来看,bit12 有效无效没有任何差别。也就是说当内存实际大小为64M时,1111111111111(b) 和 0111111111111(b) 所指向的物理内存是同一个位置。所以第一个4K * 16bit(8KB)和第二个4K * 16bit(8KB)内存是一个镜像关系。以此类推,一共有32M/4K 个这样的镜像关系,共128MB。
所以,我们具体算法为:在第一个4K * 16bit(8KB)的某一个offset(例如0x1)处写入0x1234, 然后去第二个4K * 16bit(8KB)同样的offset处读取,如果数据一致,则证明是镜像关系;为了排除第二个4K * 16bit(8KB)同样的offset处存在巧合,再在第二个4K * 16bit(8KB)的offset处写入0x55aa, 然后去第一个4K * 16bit(8KB)的offset处读取,如果数据仍一致,则能充分证明是镜像关系,即内存为64M。
我们不能假设内存为64M, 因为128M内存按照64M去寻址,不会出现任何异常。

可自己思考两个小问题:

  • 前面我们提到一个内存地址解析方式可配置的问题。假如我们把内存地址构成方式改为bank, row, column,又如何去自动识别呢?
  • 如果两种内存的差异不是在bank数上,而是在行地址数上,又如何自动识别呢?

无论是bank数的差异,还是行地址数的差异,它们自动识别的思路是一致的

DDR控制器的配置

可以通过以下步骤重新配置DDR控制器

  1. 将控制器设置为暂停(Paused)状态。
  2. 检测状态寄存器,直到确认控制器进入暂停(Paused)状态。
  3. 将控制器设置为配置(Config)状态。
  4. 检测状态寄存器,直到确认控制器进入配置(Config)状态。
  5. 修改相关寄存器。
  6. 将控制器设置为启动(Go)状态。
  7. 检测状态寄存器,直到确认控制器进入启动(Go)状态。

自动识别算法的软件实现

我们需要在boot中进行自动识别,那么代码加在什么位置呢?
我们在识别内存大小之后可能需要重新配置DDR控制器,所以,识别内存大小的代码不能运行在DDR中,识别代码应该放在boot自拷贝到内存之前,即SPL中初始化内存控制器的代码之后

VxWorks的boot与U-boot,不同CPU架构的U-boot,SPL初始化内存控制器的代码所在文件也不同,具体问题再具体分析。

参考资料

[link]关于u-boot for MINI6410自动识别内存大小的原理 (http://blog.chinaunix.net/uid-20543672-id-167786.html/)

你可能感兴趣的:(bsp)