三十.内存初始化

1.内存的分类:

(1)SRAM静态RAM,访问速度更快,但是成本高。常用在存储容量不大,速度要求高的场合。比如CPU的垫脚石采用的是SRAM。
 
(2)DRAM动态:由很多电容组成,需要定期充电保持信息,即刷新,故访问速度慢。
1.1SDRAM:同步动态随机存储器(synchronous dynamic random access memory)
同步:他的工作(命令传送和数据传输)要以同步时钟为基准。
动态:不断刷新来保持信息。
随机:不是线性按照地址存放信息,而是指定任意地址存放数据。

1.2DDR(double data rate SDRAM)和DDR2:双倍速率同步动态随机存储器。基于SDRAM,不仅在时钟上升沿可以存储数据,在下降沿也可以,从而速度翻倍。
而DDR2则是在DDR的基础上再翻倍。

1.3;2440用的是SDRAM,6410用的是DDR,210用的是DDR2.

2.内存的内部结构

2.1表结构:内存的存储结构就像一张表格,每一个单元格都可以存放数
2.2L_BANK:逻辑块,每一张表称之为L_BANK。由于技术,成本等原因无法将所有的单元格做在同一张表格(L_BANK),所以一个内存通常分为多个L_BNAK,通常为4块。
2.3寻址信息:
(1)L_BANK片选信号
(2)行地址
(3)列地址

3.容量计算 = 4 (L_BANK数目)x 单元格数目 x单元格容量


4.2440内存初始化:
4.1:地址空间:
(1)地址线:2440对外提供27条地址线,只能访问128MB的外设空间。
(2)片选信号:8个片选信号,扩大可访问的外设空间到1GB。
(3)外设空间:有2440的datasheet知道他将1GB分成8部分,即8块,通过不同的片选信号来访问不同的块空间。其中内存从band6开始(0x30000000),有可能占用band7。
(4)存储器控制器:所谓对内存初始化,实质上是对CPU的存储器控制器进行初始化,由他对给出的地址进行分析转换得到片选信号和行列地址。而CPU和内部寄存器之间的访问则是通过CPU内部的32位总线进行的。

4.2:内存芯片连接
由于每个单元格的容量是16bit,即内存芯片的数据宽度是16bit,而CPU的数据宽度是32bit,为了避免浪费,就用两块内存芯片并联,使得每一次cpu对内存访问的时候可以一次性取出32bit的数据。分为高16bit和低16bit。
当然不可避免的要涉及到片选信号,L_BANK选择信号,行列地址信号。

4.3存储器控制器寄存器
设置13个寄存器,要查阅2440的datasheet以及内存的datasheet,然后看时序图,找出寄存器的某些位控制的参数所需要设置的值。最后要学会在汇编里用循环的方式来给寄存器赋值。

5.  理论上2440可以寻址4GB,总体上分为内部空间和外设空间。外设空间又分为8个bank,每个bank为128MB


6.6410也可以寻址4GB空间,但是6410把地址空间划分为三个部分,一个是保留区(高2GB),一个是外设区(256MB),一个是主存储区(1972MB)。
主存储区又分为五个部分

(1)boot镜像区:不匹配任意硬件外设,负责把相应的外设映射到该处。CPU上电后从这里取指运行。
(2)内部存储区:分两个部分:IROM和ISRAM,虽然理论上各有64MB,但是IROM实际有效的只有32KB,ISRAM有效的只有8KB
(3)静态存储区:类似于2440的外设区,分成6个bank,可以接NORFLASH,onenand等外设。
(4)保留区:256MB,不用
(5)动态存储区:就是用来连接内存的,所以6410的内存起始地址是0x50000000


7.6410的内存初始化要按顺序进行,2440不需要顺序。还要注意设置数据线和地址线的选择。以及检查是否已将ready信号写入寄存器。


8.代码实现:
@****************************
@File:mem.S
@
@Tiny6410内存初始化
@
@Author:小君君
@****************************


.text
.global mem_init

#define MEMCCMD		0x7e001004
#define P1REFRESH	0x7e001010
#define P1CASLAT	0x7e001014
#define MEM_SYS_CFG	0x7e00f120
#define P1MEMCFG	0x7e00100c
#define P1T_DQSS	0x7e001018
#define P1T_MRD		0x7e00101c
#define P1T_RAS		0x7e001020
#define P1T_RC		0x7e001024
#define P1T_RCD		0x7e001028
#define P1T_RFC		0x7e00102c
#define P1T_RP		0x7e001030
#define P1T_RRD		0x7e001034
#define P1T_WR		0x7e001038
#define P1T_WTR		0x7e00103c
#define P1T_XP		0x7e001040
#define P1T_XSR		0x7e001044
#define P1T_ESR		0x7e001048
#define P1MEMCFG2	0X7e00104c
#define P1_chip_0_cfg	0x7e001200

#define P1MEMSTAT	0x7e001000
#define P1MEMCCMD	0x7e001004
#define P1DIRECTCMD	0x7e001008

#define refresh_val 	(( 7800 / ( 1000000000/133000000 ) + 1 )) 	@刷新周期:(7.8us)/((1/HCLK)s)=(7.8*10^3)/(1/133*10^6)

mem_init:
	@0. 将data[31:26]设置为data pins
	ldr 	r0,	=MEM_SYS_CFG
	mov	r1,	#0x0
	str	r1,	[r0]
	
	
	@1. 使dramc进入"config"状态
	ldr	r0,	=P1MEMCCMD
	mov	r1,	#0x4
	str	r1,	[r0]
	
	
	@2. 设置timing parameter, chip configuration,id configuration registers
	
	@2.1 刷新周期
	ldr	r0,	=P1REFRESH
	ldr	r1,	=refresh_val
	str	r1,	[r0]
	
	@2.2 时间参数,下列设置全都是取了最小值
	ldr	r0,	=P1CASLAT	@CAS Latency:指的是内存存取数据所需的延迟时间,
					@简单的说,就是内存接到CPU的指令后的反应速度。
					@一般的参数值是2和3两种。K4X1G163PQ的芯片手册上CAS Latency=3 
	mov	r1,	#6		@下列设置均在sdram手册中可查询到	
	str	r1,	[r0]
	
	ldr	r0,	=P1T_DQSS
	mov	r1,	#0x1
	str	r1,	[r0]
	
	ldr	r0,	=P1T_MRD
	mov	r1,	#0x2
	str	r1,	[r0]
	
	ldr	r0,	=P1T_RAS
	ldr	r1,	=(( 42 / ( 1000000000/133000000 ) + 1 ))
	str	r1,	[r0]
	
	ldr	r0,	=P1T_RC
	ldr	r1,	=(( 60 / ( 1000000000/133000000 ) + 1 ))
	str	r1,	[r0]


#define trcd	(( 18 / ( 1000000000/133000000 ) + 1 ))
#define	trcd_val	((trcd | ((trcd-3)*8)))
	ldr	r0,	=P1T_RCD
	ldr	r1,	=trcd_val
	str	r1,	[r0]
	
#define trfc	(( 72 / ( 1000000000/133000000 ) + 1 ))
#define	trfc_val	((trfc | ((trfc-3)*32)))
	ldr	r0,	=P1T_RFC
	ldr	r1,	=trfc_val
	str	r1,	[r0]
	
#define trp	(( 18 / ( 1000000000/133000000 ) + 1 ))
#define	trp_val	((trp | ((trp-3)*8)))
	ldr	r0,	=P1T_RP
	ldr	r1,	=trp_val
	str	r1,	[r0]
	

	ldr	r0,	=P1T_RRD
	ldr 	r1,	=(( 12 / ( 1000000000/133000000 ) + 1 ))
	str	r1,	[r0]
	
	ldr	r0,	=P1T_WR
	ldr 	r1,	=(( 12 / ( 1000000000/133000000 ) + 1 ))
	str	r1,	[r0]
	
	
	ldr	r0,	=P1T_WTR
	mov 	r1,	#0x1
	str	r1,	[r0]
	
	ldr	r0,	=P1T_XP
	mov 	r1,	#0x1
	str	r1,	[r0]
	
	ldr	r0,	=P1T_XSR
	ldr 	r1,	=(( 120 / ( 1000000000/133000000 ) + 1 ))
	str	r1,	[r0]
	
	ldr	r0,	=P1T_ESR
	ldr 	r1,	=(( 120 / ( 1000000000/133000000 ) + 1 ))
	str	r1,	[r0]


		
	@2.3 chip configuration
@****************************
@结合DDR的手册3. Address configuration这个部分
@1.column address(10):A0~A9列地址P1MEMCFG[2:0]=0x2
@2.row address(14):A0~A13,行地址P1MEMCFG[5:3]=0x3
@3.A10/AP 设置自动预充电地址P1MEMCFG[6]=0x0
@4.Burst Length (2, 4, 8, 16)设置内存突发长度P1MEMCFG[17:15]=0x2
@****************************

	ldr	r0,	=P1MEMCFG
	ldr	r1,	=0x0001001a
	str	r1,	[r0]
	
	
	
	
@****************************
@
@1.Sets the level for the cke outputs after reset. 设置reset以后的cke引脚的输出电平P1MEMCFG2[3],一般设置为0,P1MEMCFG2[0:2]用默认的
@所以P1MEMCFG2[3:0] = 0x5
@2.设置存储长度。6410是32位机器,所以就是01了P1MEMCFG2[7:6]=0x1
@3.设置DDR类型,6410用的是Mobile DDR SDRAMP1MEMCFG2[10:8]=0x3
@4.Read delay设置读取延时,针对
@用01 = Read delay 1 cycle (usually for DDR SDRAM and mobile DDR SDRAM)DDRP1MEMCFG2[12:11]=0x1

@****************************
	ldr	r0,	=P1MEMCFG2
	ldr	r1,	=0x00000B45
	str	r1,	[r0]
	
	
@****************************
@设置芯片(片选)	
@1.设定地址组织格式Bank-Row-Column organization。P1_chip_0_cfg[16]=0x1
@2.设定AXI_chip_base。因为6410的DDR从0x50000000开始,所以AXI_chip_base是0x50.P1_chip_0_cfg[15:8]=0x50
@3.设定AXI_chip_mask。要想让AXI_chip_mask和AXI_addr[31:24]按位与以后与AXI_chip_base相等,所以AXI_chip_mask选择0XF0.P1_chip_0_cfg[7:0]=0xF0
@****************************	

	
	ldr	r0,	=P1_chip_0_cfg
	ldr	r1,	=0x000150F0
	str	r1,	[r0]


	
	@3. 初始化sdram
	
	@NOP
	ldr	r0,	=P1DIRECTCMD
	ldr	r1,	=0xc0000
	str	r1,	[r0]
	
	@precharge
	ldr	r0,	=P1DIRECTCMD
	ldr	r1,	=0x000
	str	r1,	[r0]
	
	@auto refresh
	ldr	r0,	=P1DIRECTCMD
	ldr	r1,	=0x40000
	str	r1,	[r0]
	
	@auto refresh
	ldr	r0,	=P1DIRECTCMD
	ldr	r1,	=0x40000
	str	r1,	[r0]
	
	@auto refresh
	ldr	r0,	=P1DIRECTCMD
	ldr	r1,	=0xa0000
	str	r1,	[r0]
	
	@auto refresh
	ldr	r0,	=P1DIRECTCMD
	ldr	r1,	=0x80032
	str	r1,	[r0]
	
	
	@4. 使dramc进入"ready"状态
	
	ldr	r0,	=P1MEMCCMD
	mov 	r1, 	#0x0
    	str 	r1, 	[r0]
	@5. 等待dramc进入"ready"状态
wait_for_ready:
    
	ldr 	r0, 	=P1MEMSTAT 
	ldr 	r1, 	[r0]
	mov 	r2, 	#0x3
	and r1, r1, r2
	cmp 	r1, 	#0x1
	bne 	wait_for_ready
	nop	
	
	mov	pc,	lr


9.210的地址空间

DDR2可以占用1.5GB的空间,从0x20000000开始。0地址处也是映射区,不和硬件连接。芯片级联构成32位的数据宽度。
210有两个内存控制器,一个最大控制512,一个是1G。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值