分类: LINUX
2012-01-30 14:37:44
知识点介绍:
S3C2440中共有8个bank每个bank的地址空间为128MB,总共1GB。bank0数据位宽是由硬件选择,其他可由设置相应寄存器来改变。bank0-bank5支持外接ROM和SRAM,bank6和bank7还支持SDRAM(即开发板上的内存),且bank6和bank7的地址空间大小是可变的。
S3C2440对外引出27根地址线ADDR0-ADDR26,访问空间128MB。同时还引出nGCS0-nGCS7,对应bank0-bank7,当访问相应bank时。相应的nGCSx输出低电平选中外设。地址分布图如下。
Steppingstone是cpu内部的RAM有4KB。当cpu上电时硬件选择了从Nand flash启动则,硬件上则会将Nand flash中前4KB的数据复制到Steppingstone中,起始地址为0。
使用SDRAM:
SDRAM需要连接到bank6或者bank7。开发板上使用的SDRAM是HY57V561620,此SDRAM由4个逻辑Bank(L-bank)组成,每个bank有4M,数据宽度是16位。所以其容量为4*4MB*2B=32MB。开发板有两块SDRAM。数据宽度32位,则容量为64MB。连接如图:
因为板上SDRAM总容量为64MB,所以地址线用到26根。最末尾两位 LADDR24和LADDR25连接SDRAM的BA0和BA1,用来选择SDRAM的逻辑bank。因为是32位数据宽度低两位LADDR0和LADDR1没有使用。SDRAM的片选信号nSCS连接到cpu的nGCS6:nSCS0上所以使用的是Bank6。
SDRAM的访问步骤大致如下:
1.cpu发出片选信号nSCS有效,SDRAM被选中。
2.LADDR24和LADDR25,选中SDRAM中的L-bank。
3.对被选中的芯片进行行列寻址。
4.找到的存储单元的数据传输到数据总线上。
这些操作都是在设置好相应的寄存器,在访问内存时,cpu自动操作的。 cpu可以根据设置在寄存器中的列地址位数和内存大小等信息,自动分出L-bank,行,列地址,并按相应的时序发送到SDRAM。
寄存器介绍:
存储控制器共有13个寄存器,bank0-bank5只需设置BWSCON和BANKCONx。bank6和bank7外接SDRAM时还需设置其他寄存器,下面是各个寄存器的介绍。
BWSCON(Bus width & Wait CONtrol register) 位宽和等待寄存器。此寄存器设置每个bank的位宽,其中每4位控制一个bank。根据数据手册其中每4位中
DWx:占两位 设置bankx的位宽,00对应8位 01对应16位 10对应32位
WSx:占一位 是否使用WAIT信号,一般为0不使用
STx:占一位 是否启用SDRAM数据掩码引脚 SDRAM此位为0
其中比较特殊的是bank0,它的位宽是由硬件引脚OM0,OM1决定的。
BANKCONx(BANK CONtrol register) 。在8个bank中bank6和bank7可以接SDRAM所以BANKCON6和BANKCON7与0-5不同。0-5中主要控制外接设备的访问时序。而6和7多出了,
MT:用于设置此BANK是外接存储器类型。SRAM/ROM为00,SDRAM为11
Trcd:RAS到CAS的延时
SCAN:SDRAM的列地址数,00为8位 01为9位 10为10位,
REFRESH (refresh control register) 刷新控制寄存器,其中REFEN 0为禁止刷新功能,1为开启刷新功能。TREFMD 刷新模式,Trp预充电时间,Tsrc半行周期。剩下0-10位是刷新计数器,计算公式为2^11+1-SDRAM时钟频率(MHz)*SDRAM刷新周期(us).2440开发板在未使用PLL时,时钟频率等于晶振频率12MHz,计算得出等于1955. 整个寄存器则在本开发板中为0x008C07A3
BANKSIZE bank大小寄存器,其中BURST_EN 0为禁止突发传送 1为支持突发传输。SCKE_EN使能掉电模式与否,SCLK_EN仅在访问SDRAM期间发出SCLK信号。BK76MAP设置BANK6/7大小。010为128MB 001为64MB。本例为0xb1。
MRSRBx(SDRAM mode register set rgister)x为6和7。能设置的只有CL[6:4]CAS等待时间。整个寄存器设置为0x30
实验代码简介:
代码说明:其中比较重要的知识点是,相对跳转和绝对地址跳转。即所谓哪些的将会是位置无关代码哪些是位置相关代码。b,bl,等跳转是位置无关代码,而像ldr这样的指令或者伪指令,则是位置有关的。在连接程序时指定-Ttext,可以指定运行时地址。(类似选项还有-Tdata,-Tbss。这和在windows下ADS编译器中的分散加载文件等类似。)。连接命令如下
本例中的反汇编代码如下:
需要注意的是第一条指令 bl 30000010看似像是绝对跳转,但其实是相对跳转,它实际执行是基于PC然后加上指令中的偏移量,所以是位置无关的。而ldr pc, =jump_to_main这句的反汇编ldr pc, [pc, #144]则是在基于当前PC值加上144,即300000a4处取得值给pc,实现跳转。而300000a4处存的值是依赖于编译时-Ttext选项的。