S3C2440 存储控制器(memory controller)提供了訪问外部设备所需的信号,这是一种通过总线形式来訪问扩展的外设。



S3C2440  的存储器控制器有下面的特性:

  • 支持小字节序、大字节序(通过软件选择)

  • 每一个BANK的地址空间为128MB。总共1GB(8 BANKs)

  • 可编程控制的总线位宽(8/16/32 -bit)。只是 BANK0 仅仅能选择两种位宽(16/32 -bit)

  • 总共8个BANK。 BANK0 ~ BANK5 能够支持外接 ROM,SRAM等,BANK6 ~ BANK7 除能够支持 ROM,SRAM外,还支持SDRAM等;

  • BANK0 ~ BANK6 共7个BANK的起始地址是固定的。

  • BANK7 的起始地址是可编程选择;

  • BANK6、BANK7的地址空间大小是可编程控制的。

  • 每一个BANK的訪问周期均可编程控制。

  • 能够通过外部的”wait“ 信号延长总线的訪问周期。

  • 在外接SDRAM时。支持自刷新(self-refresh)和省电模式(power down mode)。



S3C2440 对外引出的27根地址线 ADDR0 ~ ADDR26 的訪问范围仅仅有 128MB。那么假设达到上面所说的1GB的訪问空间呢?CPU对外还引出了8根片选信号 nGCS0 ~ nGCS7。相应与 BANK0 ~ BANK7,当訪问 BANKx 的地址空间时,nGCSx 引脚输出低电平用来选中外接的设备。

这样。每一个 nGCSx 相应 128MB 地址空间,8个 nGCSx
信号总共就相应了 1GB 的地址空间。这8个 BANK的地址空间如图:



如图所看到的,左边相应不使用 NAND Flash 作为启动设备(单板上不接 NAND_BOOT 跳线)时的地址空间布局。右边相应使用 NAND Flash启动设备(单板上接 NAND_BOOT 跳线)时的地址空间布局。

S3C2440 作为32位的CPU,能够使用的地址范围理论上达到 4GB。

除去上述用于连接外设的 1GB 地址空间外。另一部分是 CPU 内部寄存器的地址,剩下的地址空间没有使用。

注意:这里说的是物理地址。



S3C2440 的寄存器地址范围都处于 0x48000000 ~ 0x5FFFFFFF,各功能部件的寄存器大体同样。

如图:







源代码:
@*************************************************************************
@ File:head.S
@ 功能:设置SDRAM,将程序拷贝到SDRAM,然后跳到SDRAM继续运行
@************************************************************************* .equ MEM_CTL_BASE, 0x48000000
.equ SDRAM_BASE, 0x30000000 .text
.global _start
_start:
bl disable_watch_dog @ 关闭看门狗
bl memsetup @ 设置存储控制器
bl copy_steppingstone_to_sdram @ 复制代码到SDRAM中
ldr pc, =on_sdram @ 跳到SDRAM中继续运行
on_sdram:
ldr sp,=0x34000000 @ 设置堆栈
bl main
halt_loop:
b halt_loop disable_watch_dog:
@ 往 WATCHDOG 寄存器写0 就可以
mov r1, #0x53000000
mov r2, #0x0
str r2, [r1]
mov pc, lr @返回 copy_steppingstone_to_sdram:
@ 将Steppingstone的4K数据所有拷贝到SDRAM中
@ Steppingstone起始地址为 0x00000000。SDRAM中起始地址为 0x30000000 mov r1, #0
ldr r2, =SDRAM_BASE
mov r3, #4*1024
1:
ldr r4, [r1],#4 @ 从Steppingstone读取4字节的数据,并让源地址加4
str r4, [r2],#4 @ 将此4字节的数据拷贝到SDRAM中,并让目地地址加4
cmp r1, r3 @ 推断是否完毕:源地址等于 Steppingstone 的末地址
bne 1b @ 若没有复制完,继续
mov pc, lr @ 返回 memsetup:
@ 设置存储控制器以便使用 SDRAM 等外设
mov r1, #MEM_CTL_BASE @ 存储控制器的13个寄存器的開始地址
adrl r2, mem_cfg_val @ 这13个值的起始存储地址
add r3, r1, #52 @ 13*4 = 52
1:
ldr r4, [r2], #4 @ 读取设置值。并让 r2 加 4
str r4, [r1], #4 @ 将此值写入寄存器,并让 r1 加 4
cmp r1, r3 @ 推断是否设置完所有13个寄存器
bne 1b @ 若没有写成,继续
mov pc, lr @ 返回 .align 4
mem_cfg_val:
@ 存储控制器 13 个寄存器的设置值 @ 存储控制器共同拥有 13 个寄存器。
@ BANK0 ~ BANK5 仅仅须要设置 BWSCON 和 BANKCONx(x为0~5)两个寄存器:
@ BANK6、BANK7 外接SDRAM时,除 BWSCON 和 BANKCONx(x为6~7)外,还要设置
@ REFRESH、BANKSIZE、MRSRB6、MRSRB7 等4个寄存器。 @ 位宽和等待控制寄存器 BWSCON (BUS WIDTH & WAIT CONTROL REGISTER)
@ BWSCON 中每4位控制一个 BANK。最高4位相应 BANK7、接下来4位相应 BANK6,依此类推
@ STx:启动/禁止 SDRAM 的数据掩码引脚,对于 SDRAM,此位为0。对于 SRAM。此位为 1
@ WSx:是否使用存储器的 WAIT 信号,通常设为 0
@ DWx:使用两位来设置相应 BANK 的位宽, 0b00 相应8位。 0b01 相应16位。0b10 相应32位,0b11表示保留
@ 比較特殊的是 BANK0。它没有 ST0 和 WS0。DW0([2:1])仅仅读---由硬件跳线决定:
@ 0b01 相应16位,0b10 相应32位。BANK0 仅仅支持16、32两种宽度
@ 对于本开发板(JZ2440)。能够确定 BWSCON 寄存器的值为: 0x22011110
.long 0x22011110 @ BWSCON @ BANK 控制寄存器 BANKCONx(BANK CONTROL REGISTER, x 为 0~5)
@ 这几个寄存器用来控制 BANK0 ~ BANK5 外接设备的訪问时序,使用默认的 0x0700 就可以
.long 0x00000700 @ BANKCON0
.long 0x00000700 @ BANKCON1
.long 0x00000700 @ BANKCON2
.long 0x00000700 @ BANKCON3
.long 0x00000700 @ BANKCON4
.long 0x00000700 @ BANKCON5 @ BANK 控制寄存器 BANKCONx(BANK CONTROL REGISTER, x 为 6~7)
@ 在8个BANK中,仅仅有BANK6和BANK7能够外接SRAM或SDRAM,
@ 所以BANKCON6 ~ BANKCON7 与 BANKCON0 ~ BANKCON5 有点不同
@ MT([16:15]) 用于设置本 BANK 外接的是 ROM/SRAM 还是 SDRAM。
@ MT=0b00 时,此寄存器与 BANKCON0 ~ BANKCON5 相似。 (外接SRAM)
@ MT=0b11 时,此寄存器其他值例如以下设置。(外接SDRAM)
@ Trcd([3:2]) RAS to CAS delay,设置推荐值为 0b01
@ SCAN([1:0]) SDRAM 的列地址位数。对于本开发板使用的 SDRAM K4S561632,
@ 列地址位数为 9。 所以 SCAN = 0b01。假设使用其他型号的 SDRAM, 须要查看其数据手冊来决定 SCAN 的取值。 @ 0b00 表示8位, 0b01 表示9位, 0b10 表示10位
@ 综上所述,本开发板中 BANKCON6/7 均设为 0x00018005
.long 0x00018005 @ BANKCON6
.long 0x00018005 @ BANKCON7 @ 刷新控制寄存器 REFRESH(REFRESH CONTROL REGISTER): 设为 0x008C0000 + R_CNT
@ REFEN([23]) 0 = 禁止 SDRAM 的刷新功能。 1 = 开启 SDRAM 的刷新功能
@ TREFMD([22]) SDRAM 的刷新模式。 0 = CBR/Auto Refresh, 1 = Self Refresh(一般在系统休眠时使用)
@ Trp([21:20]) 设为 0 就可以。
@ Tsrc([19:18]) 设为默认值 0b11 就可以。 @ Refresh Counter([10:0]) 即上述的 R_CNT
@ R_CNT 可例如以下计算 (SDRAM 时钟频率就是 HCLK)
@ R_CNT = 2 ^ 11 + 1 - SDRAM 时钟频率(MHz) * SDRAM 刷新周期 (uS)
@ SDRAM 的刷新周期在 SDRAM 的数据手冊上有标明,在本开发板使用的 SDRAM K4S561632 的数据手冊上,
@ 可看见这么一行 "64 ms refresh period (8K Cycle)"
@ 所以。刷新周期 = 64ms/8192 = 7.8125 us
@ 在未使用 PLL 时, SDRAM 时钟频率等于晶振频率 12 MHz
@ 如今能够计算: R_CNT = 2 ^ 11 + 1 - 12 * 7.8125 = 1955
@ 所以,在末使用 PLL 时, REFRESH = 0x008C0000 + 1955 = 0x008C07A3
.long 0x008C07A3 @ REFRESH @ BANKSIZE 寄存器 REFRESH (BANKSIZE REGISTER)
@ BURST_EN([7]) 0 = ARM 核禁止突发传输。 1 = ARM 核支持突发传输
@ SCKE_EN([5]) 0 = 不使用 SCKE 信号令 SDRAM 进入省电模式。 1 = 使用 SCKE 信号令 SDRAM 进入省电模式
@ SCLK_EN([4]) 0 = 时刻发出 SCLK 信号, 1 = 仅在訪问 SDRAM 期间发出 SCLK 信号
@ BK76MAP([2:0]) 设置 BANK6/7 的大小
@ BANK6/7 相应的地址空间与 BANK0~5 不同。 BANK0~5 的地址空间大小都是固定的 128MB,
@ 地址返回是 (x*128M) 到 (x+1)*128M-1。 x表示 0 到 5。BANK6/7 的大小是可变的,
@ 以保持这两个空间的地址连续,即 BANK7 的事实上地址会随它们的大小变化。BK76MAP 的取值意义例如以下:
@ 0b010 = 128M/128M
@ 0b001 = 64MB/64MB
@ 0b000 = 32MB/32MB
@ 0b111 = 16MB/16MB
@ 0b110 = 8MB/8MB
@ 0b101 = 4M/4M
@ 0b100 = 2M/2M
@ 本开发板 BANK6 外接64MB的 SDRAM。 令[2:0]=0b001 (64MB/64MB)
@ 表示 BANK6/7 的容量都是64MB。尽管 BANK7 没有使用
@ 综上所述。本开发板 BANKSIZE 寄存器的值可算得 0xB1
.long 0x000000B1 @ BANKSIZE @ SDRAM 模式设置寄存器 MRSRBx (SDRAM MODE REGISTER SET REGISTER, x为6~7)
@ 能改动的仅仅有位 CL([6:4]),这是 SDRAM 时序的一个时间參数:
@ 0b000 = 1 clocks, 0b010 = 2 clocks。 0b011 = 3 clocks
@ SDRAM K4S561632 不支持 CL = 1的情况,所以位[6:4]取值为 0b010 或 0b011 。 @ 本开发板取最保守的值 0b011, 所以 MRSRB6/7 的值为 0x30
.long 0x00000030 @ MRSRB6
.long 0x00000030 @ MRSRB7

// leds.c
#define GPFCON (*(volatile unsigned long *)0x56000050)
#define GPFDAT (*(volatile unsigned long *)0x56000054) #define GPF4_out (1<<(4*2))
#define GPF5_out (1<<(5*2))
#define GPF6_out (1<<(6*2)) void wait(volatile unsigned long dly)
{
for(; dly > 0; dly--);
} int main(void)
{
unsigned long i = 0; GPFCON = GPF4_out|GPF5_out|GPF6_out; // 将LED1,2,4相应的GPF4/5/6三个引脚设为输出 while(1){
wait(30000);
GPFDAT = (~(i<<4)); // 依据i的值,点亮LED1,2,4
if(++i == 8)
i = 0;
} return 0;
}


#Makefile
sdram.bin : head.S leds.c
arm-linux-gcc -g -c -o head.o head.S
arm-linux-gcc -g -c -o leds.o leds.c
arm-linux-ld -Ttext 0x30000000 -g head.o leds.o -o sdram_elf
arm-linux-objcopy -O binary -S sdram_elf sdram.bin
arm-linux-objdump -D -m arm sdram_elf > sdram.dis
clean:
rm -f sdram.dis sdram.bin sdram.dis *.o

存储控制器和SDRAM 实验的更多相关文章

  1. u-boot移植(七)---代码修改---存储控制器

    一.CPU访问芯片的条件 CPU通过访问存储控制器,来读取外部设备的数据. CPU想访问一个芯片,需要如下条件(配置信息): 地址线 数据线:8位/16位/32位数据宽度 时钟/频率 其他芯片相关的特 ...

  2. 今天学习的裸板驱动之存储控制器心得(初始化SDRAM)

    CPU只管操作地址,而有些地址代表的是某些存储设备. 但是操作这些存储设备需要很多东西,比如需要制定bank,行/列地址等.所以就有了存储管理器,用来处理这种CPU操作的地址和存储设备间的转换. (1 ...

  3. JZ2440 裸机驱动 第6章 存储控制器

    本章目标:     了解S3C2410/S3C2440地址空间的布局     掌握如何通过总线形式访问扩展的外设,比如内存.NOR Flash.网卡等 ························ ...

  4. LCD实验学习笔记(六):存储控制器

    s3c2440可使用地址空间为1GB(0x00000000到0x40000000). 1G空间分为8个BANK,每个BANK为128MB. 设27条地址线,和8个片选引脚(nGCS0-nGCS7). ...

  5. s3c2440存储控制器和地址以及启动的理解

    转自:http://blog.sina.com.cn/s/blog_5ddb672b0100fkcf.html 1.首先应该先了解Flash ROM的种类 NOR FLASH地址线和数据线分开,来了地 ...

  6. JZ2440开发笔记(6)——存储控制器

    存储控制器与CPU及其它外设的关系 我们看到cpu上集成了一个存储管理器,外围的存储设备都接在这个存储管理器上.cpu负责发出命令,其它的一切工作都交给了存储管理器.那么存储管理器是如何来管理这些外设 ...

  7. S3C2440之存储控制器学习记录

    /==========翻译S3C2440存储控制器部分================/ 5 存储控制器 概述 S3C2440内存控制器为外部存储访问提供内存控制信号. S3C2440A有如下特征: ...

  8. S3C2440—7.存储控制器访问外设

    文章目录 一.内存接口的概念 二.存储控制器(内存控制器) 2.1 什么是存储控制器? 2.2 S3C2440存储控制器介绍 2.3 存储控制器如何处理不同位宽的外设 2.4 怎么确定芯片的访问地址? ...

  9. DELL MD3200i存储控制器解锁方法

    DELL MD3200i存储控制器解锁方法 现有一台DELL MD3200i存储,因种种原因导致控制器被锁定,这里是刚出厂的一台存储,出现这个问题让我们都很困惑,只能怀疑DELL公司的问题. 这台存储 ...

随机推荐

  1. 包及常用模块(time、datetime、random、sys)

    什么是包?‘ #官网解释 Packages are a way of structuring Python’s module namespace by using “dotted module nam ...

  2. qduoj~前端~二次开发

    青岛大学qdu的onlinejudge是js的写的前端,框架是vue.js,在nodejs上部署运行,其实整体运行还是建立在docker的容器虚拟环境里,这里暂时不需要docker.安装环境是Ubun ...

  3. Win10平台下通过VMware虚拟机安装Win7、Ubuntu、Mac

    1.安装VMware14.1.1 下载地址:https://download.csdn.net/download/jasonczy/10611423 产品秘钥: CG54H-D8D0H-H8DHY-C ...

  4. 【BZOJ 1047】[HAOI2007]理想的正方形

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 二维的ST表. 每个大的正方形可以由4个小的正方形组成. 然后区域内的最大值最小值.也可以由4个小的张方形部分全部覆盖到. [代码] ...

  5. 国庆 day 6 下午

    1.数组异或 (xorarray.pas/c/cpp) (xorarray.in/out) 时间限制:2s/空间限制:256M [题目描述] xor——异或,和 and 与or 一样,是一种重要的逻辑 ...

  6. zookeeper_相关命令 以及 API

    (区分大小写) 启动ZooKeeper服务        进入主目录下的 /bin 文件夹. zkServer.sh start.  需要每个节点运行启动命令 客户端启动          zkCli ...

  7. 使用commons-email发邮件

    这里我用到了两个包: commons-email-1.3.2.jar mail-1.4.1.jar 如果不加mail.jar,就可能会抛出NoClassDefFoundError异常 之后代码引用ht ...

  8. JVM学习心得

    出处:http://blog.csdn.net/qq_16143915/article/details/51195438 一.JAVA内存管理与GC机制 Java在JVM所虚拟出的内存环境中执行,ja ...

  9. 【C语言】打印1到最大的n位数

    //打印1到最大的n位数 //输入数字n,按顺序打印出从1到最大的n位十进制数. 比方:输入3.则打印出1.2一直到最大的3位数999 #include <stdio.h> #includ ...

  10. LeetCode -- 最大连续乘积子序列

    问题描写叙述: 给定数组,找出连续乘积最大值的子序列.比如 0,-1,-3.-2.则最大连续乘积为6= (-3) * (-2) 实现思路此题与最大连续和的子序列问题相似,也可通过找到递推公式然后用DP ...