嵌入式linux第六章
寄存器地址范围0x48000000~0x5FFFFFFF
BANK 6(0X30000000)连接sdram时,cup提供了一组用于sdram的信号:
sdram时钟有效信号scke;
sdram时钟信号sclk0/sclk1
数据掩码信号dmq0/1/2/3
sdram片选信号nscs0(与ngcs6是同一引脚的两个功能)
sdram行地址选通脉冲信号nsras
sdram列地址选通脉冲信号nscas
写允许信号nwe(不专用于sdram)
2^13*2^9=4MB
一个内存单元2字节B,4个l-bank
两块sdram芯片
所以tq2440
sdram=4MB*2B*4*2=64MB
所以对sdram的访问可以分为如下:
1.cpu片选信号nscs0有效,选中sdram芯片
2.sdram确定l-bank,tq2440通过laddar24、26来确定l-bank;在通过nsras读行地址和nscas读列地址,tq2440用两块32mb,16位的sdram来和cpu32为数据线连接。
存储控制器的寄存器使用方法
存储寄存器共13个,bank0~bank5只需设置BWSCON和bankconx(x=0~5)
BANK6~BANK7外接sdram时,除BWSCON和BANKCONx还要设置REFRESH/BANKSIZE/MRSRB6/MRSRB7寄存器
BUS
WIDTH&WAIT CONTROL REGISTER
BWSCON
STx:启动/禁止SDRAM的数据掩码引脚。对于sdram 此位为0;对于sram此位为1
WSx:是否使用存储器的WAIT信号,通常设为0
DWx:使用两位来设置相应BANK的位宽,00对应8位,01对应16为,10对应32位,11表示保留
BANK0没有st0和ws0,DW0([2:1])只读————由硬件跳线决定:01表示16位,10表示32位,bank0只支持16、32两种位宽
BANKCONx(0~5)
0~5一般设置为0x0700;用于设置访问外设时序!需要再看
BANKCON6~BANKCON7
MT[16:15]:
00=ROM OR SRAM
;[14:0]设置同bankcon0~5
10、01=RESERVED
11=SDRAM;[3:2] RAS TO
CAS DELAY : 00=2CLOCK
01=3 10=4
USE 01
[1:0]
column address 00=8bit 01=9-bit
10=10-bit
REFRESH CONTROL
REGISTER
REFEN
[23]:=0 不能 =1能自动刷新
TREFMD[22] :=0 CBR/AUTO Refresh 1=Self
Refresh
TRP[21:20] :semi row
cycle time resest =11
refresh counter=[10:0]:
sdram 64ms
refresh 8k cycle-》64ms/8192=7.8125us
refresh_count=7.8125*12MHZ(CPU 频率)=
refresh
period=(2^11+1-12*7.8125)=1955=0x7a3
so refresh=0x008c0000+1955
BANKSIZE
REGISTER (TQ2400 set 0Xb1)
MRSR(SDRAM MODE
REGISTER SET REGISTER)
TQ2440 SET
0X30
6.2 USE
SDRAM
s3c2440A unit 6 nand flash contorller
设置成NAND
启动时,s3c2440会把nand的前4kb内容复制到自身内部的steppingstone(大小4kb的sram),然后跳到0地址执行;主要执行将nand的内容复制到sdram执行!!!!(初步理解)2012年9月5日
23:05:11
head.s:
@****************
@file:head.s
@set sdram copy programm to sdram and run it
@8******
.equ
MEM_CTL_BASE ,0x48000000
.equ
SDRAM_BASE,0x30000000
.text
.global _start
_start:
bl
disable_watch_dog
@shut down watchdog
bl
memset
@set memconf
bl
copy_steppingstone_to_sdram
@copy
ldr pc,=on_sdram
on_sdram:
ldr
sp,=0x34000000
@set stack in the sdram
bl main
@ go to
main
copy_steppingstone_to_sdram:
@4kb copy to sdram
mov
r1,#0
@stepping start addr
ldr
r2,=SDRAM_BASE
@sdram 0x30000000
mov
r3,#4*1024
@4kb
ls:
ldr
r4,[r1],#4
@read from step
str r4,[r2],#4 @r4 4b
cmp r1,r3
bne
ls
@loop untill copy finish
mov pc,lr
@return
memset:
@set memcon so that to use sdram
mov r1,#MEM_CTL_BASE
adrl
r2,mem_cfg_val
@ reset value addr
add r3,r1,#52
@ 13*4=52
l:
ldr
r4,[r2],#4
@read reset value
str
r4,[r1],#4
@set memcon reset value
cmp r1,
r3
@set 13 mencon
bne
l
@loop
mov pc, lr
@return
disable_watch_dog:
@watchdogcon=0
mov r1,#0x53000000
mov r2,#0x00
str r2,[r1]
mov pc,lr @return
.align 4
mem_cfg_val:
.long
0x22011110