历史上的今天
返回首页

历史上的今天

今天是:2024年12月22日(星期日)

2020年12月22日 | tq210 内存配置

2020-12-22 来源:eefocus

S5PV210有两个独立的DRAM控制器,分别是DMC0和DMC1,其中,DMC0最大支持512MByte,DMC1最大支持1GByte,而DMC0和DMC1又同时支持两个片选CS0和CS1。S5PV210的内存模块相比2440和6410来讲要更加复杂一些,要想正确的配置S5PV210的内存,应该仔细阅读芯片手册相关部分,在配置参数时也应该适当的阅读下内存芯片的手册。这部分的寄存器和配置过程比较复杂(但是不难),我只简单的讲一下我配置时遇到的问题。


一 接线原理

我的开发板是TQ210,开发板上有8片128M*8bits的内存芯片,从原理图上可以看到,其中4片并联接在DMC0上,另外四片并联在DMC1上,这里我只贴出一个链接方式,因为8片都是一样的,只是前四片跟后四片挂载的位置不同。


我们可以注意到,TQ210是将四片K4T1G084QQ的地址线并联,将数据线串联,这样正好是32位数据。另外,我们还可以看到K4T1G084QQ只接了14根地址线,这是因为K4T1G084QQ有14根行地址,10根列地址,这14根线是复用的。但是K4T1G084QQ有8个bank,而DMC只有两根bank线,为此,S5PV210给出了以下几个解决方案:

根据注释3,我们可以看到当S5PV210挂载8bank内存时CS1复用为BANK2,这中状态下S5PV210相当于只有一根片选引脚CS0,这样就可以理解了,我们从这里也可以知道配置num_chip参数时可以设置为1(经测试设置为2也可以,不过MEMCONFIG1的配置没有意思,因为8bank时只有CS0而没有CS1)。对于8banks且15根行地址的内存芯片也有一套解决方案,所以,一定要注意下面的注释,我当时配置时阅读手册就不够仔细,没有看下面的注释,结果卡了我一上午,没有弄明白内存芯片的接线原理,甚至认为开发板接线接错了。


二 地址映射

S5PV210的DMC跟6410和2440的DMC有个重要区别,S5PV210可以控制内存地址映射,DMC0的地址空间为0x2000,0000~0x3fff,ffff,DMC1的地址空间为0x4000,0000~0x7fff,ffff,DMC可以通过配置寄存器来使内存芯片映射到其内存段内的适当位置。这个配置在MEMCONFIG寄存器中,这个地址映射让我纠结了很长一段时间,最后还是查资料看明白的。


如果设置chip_base为0x20:

(1)我们挂载的内存为128M,那么这个chip_mask应该设置为0xF8

(2)我们挂载256M内存时,chip_mask应该设置为0xF0

(3)我们挂载512M时,chip_mask应该设置为0xE0

(4)我们挂载1GB内存时,chip_mask就应该设置为0xC0。


以DMC0为例,当DMC0接收到来自AXI的0x2000,0000~0x3fff,ffff内的地址时,会作如下处理:

(1)将AXI地址的高8位与chip_mask相与得到结果,记为X。

(2)将X分别与MEMCONFIG0和MEMCONFIG1的chip_base相比较,如果相等,则打开相应的片选。


假如挂载的内存为128M,且CS0和CS1上分别挂了一片,那么128M=128*1024*1024=0x8000000,则128M内存的偏移范围应该是0x0000,0000~0x07ff,ffff,高位剩余5位,那么,我们把MEMCONFIG0的chip_base设置为0x20,chip_mask设置为0xF8,为了保持内存连续,则需要将MEMCONFIG1的chip_base设置为0x28,chip_mask设置为0xF8,当AXI发来的地址为0x23xx,xxxx时,0x23&0xF8得到0x20,所以,会打开片选CS0,当AXI发来的地址为0x28xx,xxxx时,0x28&0xF8得到0x28,所以,会打开片选CS1,依此类推。


特别的,当载在的内存芯片为8bank(8bank内存芯片一般为14/15行地址,10列地址,即容量一般为512M或者1G)时,由于CS1为bank2引脚,为了保持CS0时钟处于片选状态,对于512M内存来讲需要将chip_mask设置为0xE0,这是因为512M=512*1024*1024=0x2000,0000,也就是说,512M内存的偏移应该为0x0000,0000~0x1fff,ffff,所以高位剩余3位,即0xE0,当然了,如果内存为1G=1024*1024*1024=0x4000,0000,即偏移为0x0000,0000~0x3fff,ffff,高位剩余2为,故设置chip_mask为0xC0。这样,就会计算偏移这两个值了。


三 配置流程

内存芯片的配置比较复杂,好在芯片手册上给出了常用内存类型的初始化序列,TQ210的内存是DDR2的,可以按照如下顺序进行初始化:


1. To provide stable power for controller and memory device, the controller must assert and hold CKE to a logic low level. Then apply stable clock. Note: XDDR2SEL should be High level to hold CKE to low.   

2. Set the PhyControl0.ctrl_start_point and PhyControl0.ctrl_inc  bit-fields to correct value according to clock frequency. Set the PhyControl0.ctrl_dll_on bit-field to ‘1’ to turn on the PHY DLL.   

3. DQS Cleaning: Set the PhyControl1.ctrl_shiftc  and PhyControl1.ctrl_offsetc bit-fields to correct value according to clock frequency and memory tAC parameters.   

4. Set the PhyControl0.ctrl_start bit-field to ‘1’.     

5. Set the ConControl. At this moment, an auto refresh counter should be off.     

6. Set the MemControl. At this moment, all power down modes should be off.   

7. Set the MemConfig0  register. If there are two external memo ry chips, set the MemConfig1 register.   

8. Set the PrechConfig  and PwrdnConfig registers.   

9. Set the TimingAref,  TimingRow,  TimingData and TimingPower registers according to memory AC parameters.   

10. If QoS scheme is required, set the QosControl0~15 and QosConfig0~15 registers.   

11. Wait for the PhyStatus0.ctrl_locked  bit-fields to change to ‘1’. Check whether PHY DLL is locked.   

12. PHY DLL compensates the changes of delay amount caused by Process, Voltage and Temperature (PVT) variation during memory operation. Therefore, PHY DLL  should not be off for reliable operation. It can be off except runs at low frequency. If off mode is used, set the PhyControl0.ctrl_force  bit-field to correct value according to the PhyStatus0.ctrl_lock_value[9:2] bit-field to fix delay amount. Clear the PhyControl0.ctrl_dll_on bit-field to turn off PHY DLL.   

13. Confirm whether stable clock is  issued minimum 200us after power on   

14. Issue a NOP command using the DirectCmd register to assert and to hold CKE to a logic high level  

15. Wait for minimum 400ns.   

16. Issue a PALL command using the DirectCmd register.   

17. Issue an  EMRS2 command using the DirectCmd register to program the operating parameters.   

18. Issue an  EMRS3 command using the DirectCmd register to program the operating parameters.   

19. Issue an  EMRS  command using the DirectCmd register to enable the memory DLLs.   

20. Issue a MRS command using the DirectCmd register to reset the memory DLL.   

21. Issue a PALL command using the DirectCmd register.   

22. Issue two Auto Refresh commands using the  DirectCmd register.   

23. Issue a MRS command using the DirectCmd register to program the operating parameters without resetting the memory DLL.   

24. Wait for minimum 200 clock cycles.   

25. Issue an  EMRS  command using the DirectCmd register to program the  operating parameters. If OCD calibration is not used, issue an EMRS  command to set OCD Calibration Default. After that, issue an  EMRS command to exit OCD Calibration Mode  and to program the operating parameters.   

26. If there are two external memory chips, perform steps 14~25 for chip1 memory device.   

27. Set the ConControl to turn on an auto refresh counter. 28. If power down modes is required, set the  MemControl registers.


上面就是手册上给出的DDR2型内存芯片的初始化序列,但是单纯的根据上面的步骤配置可能有些困难,这时,我们可以参考u-boot的内存初始化代码来初始化内存,最后你会发现u-boot的操作顺序跟上面是完全一致的。


四 内存初始化代码

我将我配置内存的代码上传到CSDN的下载空间,如果需要的话可以去我资源里下载,是C语言版的。


五 遗留问题

配置好内存的代码烧写到Nand运行是正常的,但是用USB方式启动时不正常,目前还没有找到原因,如果有朋友解决了或者有其他问题请留言相告,在这里先说声谢谢。


现在找到原因了,原来S5PV210的USB启动过程跟Nand启动方式不一样,S5PV210以USB方式启动时会先将三星提供的一个固件程序下载到0xd0020010处运行,然后,再将用户代码下载0x23e00000处运行,也就是说,固件程序完成了内存的初始化,因为我们的代码位于0x23e00000处。而我们的代码中再次配置内存时会重置内存,下载到内存中的代码也就丢失了,所以程序执行到内存初始化函数就会挂掉。


为了证明上面的假设,我在代码中加上一段程序,该程序将内存的中代码拷贝到iram的16K以后的位置上(直接拷贝到0xd0020000处有问题,我是拷贝到了0xd0024000处,现在还不知道什么原因),然后将代码跳转到IRAM中,如果代码可以正常运行就可以证明内存初始化部分正常,实验结果是肯定的,下面总结下:

S5PV210以USB方式启动时用户代码是下载到内存中的(0x23e00000处),要使代码以USB方式启动时正常运行,应该注意以下两点:

(1)如果是位置相关的代码,连接地址应该链接到0x23e00000,如果是位置无关码,可以随便指定连接地址。
(2)用户代码需要检验自己运行时的位置,如果运行在内存中则需跳过内存初始化,根据需要决定是否需要代码重定位。

推荐阅读

史海拾趣

Elpaq公司的发展小趣事
Diodes公司的发展小趣事

在竞争激烈的电子行业中,合作共赢是企业发展的重要途径。Diodes公司始终坚持合作共赢的理念,与众多上下游企业建立了紧密的合作关系。例如,在供应链方面,Diodes与多家原材料供应商建立了长期稳定的合作关系,确保原材料的稳定供应和质量保障;在销售方面,Diodes与多家分销商建立了战略合作伙伴关系,共同开拓市场、推广产品。这些合作关系不仅为Diodes带来了更多的商业机会和市场份额,也促进了整个产业链的健康发展。

Amaze Electronics Pte Ltd公司的发展小趣事

为了支撑公司的持续发展,Amaze Electronics高度重视人才培养。公司建立了完善的培训体系,为员工提供丰富的培训资源和学习机会。同时,公司还积极引进优秀人才,为研发团队注入新的活力。这些举措使得公司的研发团队不断壮大,为公司的技术创新和业务发展提供了有力保障。

Acmelux Taiwan Inc公司的发展小趣事

Acmelux Taiwan Inc公司深知人才是企业发展的根本。因此,公司高度重视人才培养和团队建设。通过设立完善的培训体系、提供广阔的发展平台以及实施激励机制,Acmelux吸引了大批优秀人才的加入。这些人才在公司的发展过程中发挥了重要作用,为公司创造了巨大的价值。同时,公司还注重团队建设,通过定期的团建活动、培训等方式,增强员工的凝聚力和向心力,为公司的发展提供了有力的保障。

ELANTEC (Renesas )公司的发展小趣事

近年来,随着全球半导体市场的不断变化和技术的快速发展,Renesas也面临着一些挑战。为了应对这些挑战并保持竞争力,Renesas开始进行战略转型和结构调整。公司加强了与客户的合作和沟通,深入了解市场需求和趋势;同时,Renesas还加大了对新技术和新产品的研发投入,不断提升自身的技术实力和创新能力。此外,Renesas还注重人才培养和引进,打造了一支高素质、专业化的团队。这些措施的实施使Renesas在应对挑战和转型过程中取得了积极的成效。

Eurofarad公司的发展小趣事

随着Eurofarad产品质量的不断提高和市场份额的逐步扩大,公司开始积极拓展国际市场。Eurofarad的产品已经广泛应用于航空航天、国防、医疗、铁路、石油勘探等领域,赢得了全球客户的信赖和好评。同时,Eurofarad还与国际知名企业建立了紧密的合作关系,共同推动电子行业的发展。

问答坊 | AI 解惑

应用定时器中断实例技术

如何应用定时器实现中断呢?具体的操作步骤有呢些?应该注意什么问题?下面由工程师讲解一个应用定时器中断的实例: 现要求编制一段程序,使P1.0端口线上输出周期为2ms的方波脉冲。设单片机晶振频率 Fosc=6MHZ. 1、方法:利用定时器T0作1ms定 ...…

查看全部问答>

求助:用C51系列的单片机模拟一个非标准的SPI接口的从机?

大家知道有什么办法么?怎么才能及时的响应主机clk信号的,就是用单片机对主机的响应返回一定的值?我暂时想到用单片机C51来模拟,不知道大家在这方面有什么建议?不胜感激~~~~~~~…

查看全部问答>

寻LED显示屏供应商(不知贴在这边合适不合适)

有朋友最近想做LED广告屏,让帮忙找找有没有合适的供应商。 有意向的可以留下联系方式和公司产品介绍相关链接,谢谢~…

查看全部问答>

急救:WM5注册表问题,在线等!!

我用EVC4写的程序 可以修改WM5的注册表 就是Today下面的 用我写的程序修改后 用EVC自带的注册表编辑器查看显示修改是正确地 但是 只要一重启 就还原了 不知道这个问题怎么解决 谢谢了 ps 最好不要用破解注册表这种办法…

查看全部问答>

请教:为什么程序可以单步运行,但不能快速运行

各位大侠:我写了一个简单的关于字符串转换为无符号长整形秒数的程序。因为EVC不支持mktime()和localtime()等函数, 我自己写了一个。目前此程序单步执行可以,但是如果直接run,在模拟器上就会看到The application has performed an Illegal Opera ...…

查看全部问答>

超低价380元-基于最新ARM内核Cortex-M3之STM32评估板

     深圳市英蓓特信息技术有限公司*与德国KEIL公司合作,在市场第一时间推出Embest STM32评估板。该开发套件主控芯片采用意法半导体*之STM32F103RB芯片*。此芯片采用ARM公司最新的Cortex-M3内核*。   ...…

查看全部问答>

51DIY-LC测量小工具 后传

如你所知,和所有 电视剧或者小说 的后传一样。往往都比之前难看或者恶心。很遗憾地说,这个LC测量小工具 后传 也如此。当然了,在这里,发这个 昨日黄花,并不是无聊,只是一种 自我激励 ,同时也希望听到一些 专业意见 或者 记录一下 这个 过程— ...…

查看全部问答>

超声波测距 cx20106 接收信号一直出错

用的就是网上常用的电路 可是接收的信号不确定而且都不正确 求教用过cx20106的大侠帮忙一下  谢谢了  我是用105电容接一个5欧的电阻    5脚是220K电阻  接收头到cx20106这个我画图时太水了 用的是跳线(单面板) 而 ...…

查看全部问答>

管理员还有wstt进来交待

在一个帖子中我纠结要不要买25元的LaunchPad回来拆元件 现在想到一个办法 论坛好像计划过要搞什么MSP430DIY活动的,看来涉及面窄了点,估计要开展下去不易。不过我已经被你们忽悠住一下了,起码我还多花了时间在那个文档模版里添加文字图片介绍我 ...…

查看全部问答>

MSP430跟手机通信,你能想到什么办法?

大家有没有想过这样一个问题,用MSP430和我们的智能机通信,你能想到什么办法呢? 全双工的、半双工的、单工的都可以,当然双工最好啦! 你能想到什么样的办法呢?…

查看全部问答>