嵌入式linux开发 (九) RAM(3) s3c2440外扩sdram

- JZ2440  S3C2440 ARM920T
	-内置
		Steppingstone (4K-Byte SRAM)
		无rom
	-外扩
		EM63A165TS-6G:32MB/,SDRAM,共两片
  • soc
The S3C2440A is developed with ARM920T core, 0.13um CMOS standard cells and a memory complier.
The ARM920T implements MMU, AMBA BUS, and Harvard cache architecture with separate 16KB instruction and 16KB data caches, each with an 8-word line length.

The integrated on-chip functions that are described in this document include:
Around 1.2V internal, 1.8V/2.5V/3.3V memory, 3.3V external I/O microprocessor with 16KB I-Cache/16KB D-Cache/MMU
External memory controller (SDRAM Control and Chip Select logic)

SOC端 内存(存储)控制器
  • 内存控制器接口及内存映射
在 soc 内存控制器看来,sram,sdram,rom,srom 对于 soc存储控制器都是一样的,统一编制

cpu进行sdram数据读写
	CPU发送一个地址
	cpu根据地址发出片选信号(如果地址在sdram中,则片选sdram)

内存控制器做的事
	1.它需要根据你外接的SDRAM进行设置(定义了这些通信格式之后才能找到相应的地址进行存储。)
		外接芯片的位宽,容量,等,
		还需要分出几个逻辑块(L-BANK)以及分行(ROW)列(Colum),
	2.发出时序
  • 寄存器
#define MEM_CTL_BASE    0x48000000
看样子有13个寄存器
 BWSCON BANKCON0 BANKCON1 BANKCON2 BANKCON3 BANKCON4 BANKCON5 BANKCON6 BANKCON7 REFRESH BANKSIZE MRSRB6 MRSRB7

在这里插入图片描述

  • 引脚
------------------------- sclk
SCLK[1:0]		SDRAM clock
SCKE			SDRAM clock enable

------------------------- data and addr
DQ[0-15]
A[0-12]
------------------------- bank select
与BA0与BA1 连接的线,在s3c2440中没这个概念,直接用addr线代替
------------------------- control
nGCS[7:0] (General Chip Select) are activated when the address of a memory is within the address region of each bank. The number of access cycles and the bank size can be programmed. // nSCS[1:0]	 SDRAM chip select

nSRAS			SDRAM row address strobe
nSCAS			SDRAM column address strobe

nWE				nWE (Write Enable) indicates that the current bus cycle is a write cycle

DQM0[3:0]		Data Input/Output Mask: Controls output buffers in read mode and masks Input data in write mode.
#### 以下没用到
nWBE[3:0]		Write byte enable
  • 时序
    在这里插入图片描述
设备端SRAM芯片(EM63A165TS-6G)
连线

在这里插入图片描述

代码
  • 初始化

// 初始化13个寄存器,寄存器都是对soc侧控制器进行初始化的,并没有涉及到SDRAM的初始化

#define MEM_CTL_BASE    0x48000000

/* 3. 初始化SDRAM */
	ldr r0, =MEM_CTL_BASE	// r0 开始地址
	add r3, r0, #(13*4)		// 结束地址
	adr r1, sdram_config    // 配置数据开始地址 /* sdram_config的当前地址 */
1:
	ldr r2, [r1], #4 // 将 配置信息存储到 r2,r1+4
	str r2, [r0], #4 // 将 r2 配置到 r0,r0+4
				 	 // 综上,是将 配置信息放置到 MEM_CTL_BASE   地址中去
	cmp r0, r3		 // 看 r0 (是否)等于r3,等同于看配置(是否)完成 
	bne 1b			 // 没结束,则继续配置
sdram_config:
	.long 0x22011110	 //BWSCON 		0x48000000
	.long 0x00000700	 //BANKCON0		0x48000004
	.long 0x00000700	 //BANKCON1		0x48000008
	.long 0x00000700	 //BANKCON2		...
	.long 0x00000700	 //BANKCON3  
	.long 0x00000700	 //BANKCON4
	.long 0x00000700	 //BANKCON5
	.long 0x00018005	 //BANKCON6
	.long 0x00018005	 //BANKCON7
	.long 0x008C04F4	 // REFRESH
	.long 0x000000B1	 //BANKSIZE
	.long 0x00000030	 //MRSRB6
	.long 0x00000030	 //MRSRB7

  • 读写sdram
// 类似于这样来读写sdram.
// dest[i] 是 sdram 中的地址.
dest[i] = src[i];
/* 4. 重定位 : 把bootloader本身的代码从flash复制到它的链接地址去 */
	ldr sp, =0x34000000

	bl nand_init

	mov r0, #0 		/*src*/
	ldr r1, =_start 	/*dest*/
	ldr r2, =__bss_start 
	sub r2, r2, r1 /*len*/
	
	bl copy_code_to_sdram
	bl clear_bss
void copy_code_to_sdram(unsigned char *src, unsigned char *dest, unsigned int len)
{	
	int i = 0;
	
	/* 如果是NOR启动 */
	if (isBootFromNorFlash())
	{
		while (i < len)
		{
			dest[i] = src[i];
			i++;
		}
	}
	else
	{
		//nand_init();
		nand_read((unsigned int)src, dest, len);
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值