存储控制器和SDRAM 实验

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

时间: 2024-08-24 17:53:24

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

【嵌入式Linux+ARM】存储控制器(操作SDRAM)

1.存储控制器介绍 s3c2440中的"存储管理器"提供了访问外部设备所需要的信号,有如下特性: 1.支持小字节序.大字节序(通过软件选择) 2.每个BANK为128M,一共有8个BANK,共1G 3.BANK0~BANK5可以支持外接ROM.SRAM等,BANK6~BANK7除可以支持ROM.SRAM外 还支持SDRAM 4.BANK0~BANK7的起始地址是固定的 5.外接SDRAM时,支持自刷新和省电模式 s3c2440上有ADDR0~ADDR26访问范围只有128M,如何达到上

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

一.CPU访问芯片的条件 CPU通过访问存储控制器,来读取外部设备的数据. CPU想访问一个芯片,需要如下条件(配置信息): 地址线 数据线:8位/16位/32位数据宽度 时钟/频率 其他芯片相关的特性:比如SDRAM,有行地址.列地址和bank SDRAM的访问和表格检索的原理一样,先指定一个行(Row),再指定一个列(Columu),就可以准确找到所需要的单元格.这个单元格称为存储单元,这个表格(存储阵列)就是逻辑Bank(Logical Bank,即L-Bank),SDRAM一般含有4个L

TQ2440存储控制器实验

一,实验原理: 首先使用汇编语言设置好存储控制器,使得外接的SDRAM可用,然后把程序本身从片内RAM(Steppingstone)拷贝到SDRAM处,最后跳到SDRAM中执行. 二,实验目的: 1.掌握SDRAM的初始化方法 2.掌握位置无关指令,相对跳转,绝对跳转 3.掌握代码重定位 三,实验内容: 1.准备知识: 1.1 访问SDRAM的方法: SDRAM的内部是一个存储阵列,阵列就好比一个excel表格,将数据填进表格的单元格中,excel中的每个单元格会有"行"和"

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

CPU只管操作地址,而有些地址代表的是某些存储设备. 但是操作这些存储设备需要很多东西,比如需要制定bank,行/列地址等.所以就有了存储管理器,用来处理这种CPU操作的地址和存储设备间的转换. (1)存储管理器在得到一个CPU的地址时,根据地址范围和自身的信息,知道这个地址位于那个片选. (2)若该片选连接的是一个SDRAM,还会根据地址范围和自身的信息,知道对应的如SDRAM中的BANK,行/列地址等. 所以,配置存储管理器 (3)根据芯片手册知道这个芯片的存储管理器的片选有8个,说明它可以

Mini2440存储控制器

以前杂事比较多,没有仔细学习,这学期尽可能利用空闲时间好好学习理解. @************************************************************************* @ 设置SDRAM,将程序复制到SDRAM,然后跳到SDRAM继续执行 @ 2015.11.8 by Huangtao @************************************************************************* @ 总结的

02 SDRAM 实验

[email protected]:~/my03$ ll total 12 -rw-rw-r-- 1 chunli chunli 2703 Apr 13 03:49 head.S -rw-rw-r-- 1 chunli chunli  532 Apr 13 03:50 leds.c -rw-rw-r-- 1 chunli chunli  312 Apr 13 03:50 Makefile [email protected]:~/my03$ cat head.S   @**************

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

1.首先应该先了解Flash ROM的种类 NOR FLASH地址线和数据线分开,来了地址和控制信号,数据就出来. NAND Flash地址线和数据线在一起,需要用程序来控制,才能出数据.通俗的说,只给地址不行,要先命令,再给地址,才能读到NAND的数据,在一个总线完成的. 结论是:ARM无法从NAND直接启动.除非装载完程序,才能使用NAND Flash. Nand Flash的命令.地址.数据都通过I/O口发送,管脚复用,这样做做的好处是,可以明显减少NAND FLASH的管脚数目,将来如果

自己学驱动12——存储控制器

1.2440的BANK 2440一共提供给外部8个BANK(BANK0~BANK7),每个BANK均为128MB的地址空间,一共1GB地址空间.2440对外引出了27根地址线ADDR0~ADDR26,这27根地址线的访问地址大小为128MB,2440对外还引出了8根片选信号nGCS0~nGCS7,对应于BANK0~BANK7,当访问BANKx的地址空间时,nGCSx引脚输出低电平,27根地址线与8根片选信号(相当于多出3根地址线)共同完成1GB空间的访问操作. 2440作为32位的CPU,可以使

PMC 荣膺ChannelPro读者选择最佳存储控制器金奖

 PMC荣膺ChannelPro读者选择最佳存储控制器金奖 Adaptec RAID控制器脱颖而出夺取桂冠 引领大数据连接.传送以及存储,提供创新半导体及软件解决方案的PMC?公司(纳斯达克代码:PMCS)今日宣布,获得ChannelPro-SMB 2015年度读者选择最佳SAS/SATA RAID控制器金奖. PMC负责渠道和数据中心市场营销总监Toy Winslow谈到:"获得该奖项充分证实了我们的Adaptec产品在渠道市场上展现的卓越性能,兼容性和可扩展性.获得客户和合作伙伴对我们P