ARM裸机开发-bootloader-内存初始化

来源:互联网 发布:mac电脑怎么退出全屏 编辑:程序博客网 时间:2024/05/16 06:51

一、从内部看内存

内存由于其访问速度快,访问方式简单成为PC机与嵌入式设备不可缺少的部件。

1、内存的分类

内存分为DRAM和SRAM,其中DRAM又包含SDRAM、DDR、DDR2。

DRAM:它的基本部件是小电容,电容可以再两个极板上保留电荷,但是需要定期的充电(刷新),否则数据就好丢失。缺点:要进行不断的刷新才能保持数据,存取速度较慢。

SRAM:它是一种具有静止存取功能的内存,不需要定期刷新电路就能保持它们内部存储的数据。其优点:存取的速度快;但是缺点是:功耗大,成本高。常用于存储容量不高,但存取速度快的场合,比如stepping stone。

DRAM的分类:在嵌入式系统中,除了CPU内部的垫脚石采用SRAM外,板载内存一般会采用DRAM,而DRAM又可以分为SDRAM,DDR,DDR2等。

SDRAM(Synchronous Dynamic Random Access Memory):同步动态随机存储器。

同步:内存工作需要同步时钟,内部命令的发送与数据的传输都以该时钟为基准。

动态:存储阵列要不断保持刷新来保证数据不丢失。

随机:数据不是线性依次存储,而是自由指定地址进行数据读写。

2440使用的是SDRAM

DDR:(Double Data Rate SDRAM),即“双倍速率同步动态随机存储器”。与早起的SDRAM相比,DDR除了可以在时钟脉冲的上升沿传输数据,还可以在下降沿传输信号,这就意味着在相同的工作频率下,DDR的理论传输速度为SDRAM的两倍。DDR2则在DDR的基础上再次进行了改进,使得数据传输速率在DDR的基础上再次翻倍。

6410开发板通常采用DDR内存

210开发板通常采用DDR2内存

2、内存的内部结构

内存的内部结构包含三项内容:表结构、L-Bank、寻址信息

2.1内存的内部如同表格,数据就存放在每个单元格中。数据读写时,先指定行号(行地址),再指定列号(列地址),我们就可以准确地找到所需要的单元格。而这张表格称为:Logical Bank(L-Bank)。

由于技术、成本等原因,一块内存不可能把所有的单元格做到一个L-Bank,现在内存内部基本都会分割成4个L-Bank。

内存的寻址有三个重要因素:1、L-Bank选择信号 2、行地址 3、列地址

二、内存初始化

1、2440

对于这部分内容,接下来要从以下四个方面来阐述:1、地址空间2、内存芯片的硬件连接3、存储控制寄存器的设置4、编写代码进行内存初始化设置

1、S3c2440芯片对外提供的引脚上,只给出了27根地址线Addr[0:26]。单靠芯片上的27根引脚,它只能访问128M的外设空间。为了扩大外设的访问范围,S3c2440芯片又提供了8个片选信号nGCS0-nGCS7.当某个片选信号nGCSX有效时,则可以通过27根地址线去访问对应的片选的128MB空间。由于有8个片选,所以2440芯片能访问的外设空间总共为8*128MB=1GB。而1G(0x40000000)以上的空间,则安排给了2440内部的寄存器,访问这些内部寄存器,则是通过32位的处理器内部总线来完成的。

ARM9核不知道内存、NorFlash、网卡芯片寄存器地址,而是通过存储器控制器来进行解析,从而使得ARM核可以通过存储控制器寄存器来设置访问外设寄存器。

2、S3c2440有32根数据线引脚,两片32M的内存芯片并联在数据线的高、低位上。所以说2440的数据是32位的。

3、设置2440存储控制寄存器,参考2440的芯片手册进行设置。

BWSCON 0x22000000

BANK CON0-5 保持不变,为0x00000070.因为0-5不存放内存。只有6-7才存放了内存。

在计算机中,RAM一般用于内存。ROM用来存放一些硬件的驱动程序,也就是固件。

咱们平时用的U盘为Flash。它可以在相同的电压下读写,且容量大,成本低。而ROM一般读为5V,写12V。

BANK6-7 0x18001

REFRESH 定期充电

BANKSEZE

MRSRB6-7

对以上的所有寄存器进行完初始化后,内存控制器的所有寄存器就都进行了初始化。

4、代码编写:

由于数据和寄存器比较多,所以运用循环把相应的数据存入各个寄存器。

#define mem_contrl 0x48000000init_sdram:ldr r0, =mem_contrl add r3, r0, #4*13adrl r1, mem_data0:ldr r2, [r1], #4str r2, [r0], #4cmp r0, r3bne 0b /*表示向前跳转*/mov pc, lrmem_data:.long 0x22000000 .long 0x00000700.long 0x00000700.long 0x00000700.long 0x00000700.long 0x00000700.long 0x00000700.long 0x00018001.long 0x00018001.long 0x008c04f5.long 0x000000b1.long 0x00000030.long 0x00000030
介绍一下汇编语言中的访问存储器 [r1] 就是取出r1地址处的内容,实际就是指针操作。

6410:

1、地址空间:S3C6410处理器拥有32位地址总线,其寻址空间为4GB。其中高2G为保留区,低2G区域又可分为两部分:主存储区和外设存区。



2、主存储区又分为:

启动镜像区:这个区域的作用正如它的名字所述,是用来启动ARM系统的。但是这个区域并没有固定的存储介质与之对应。而是通过修改启动选项,把不同的启动介质映射到

该区域。比如说选择了IROM启动方式后,就把IROM映射到该区域。

内部存储区:这个区域对应着内部的内存地址,iROM和SRAM都是分布在这个区间。0x08000000-0x0bffffff对应着内部ROM,但是IROM实际只有32KB,选择从IROM启动的时候,首先运行就是这里面的程序BL0,这部分代码由三星固化。0x0c000000-ox0fffffff对应内部SRAM,实际就是8KB的Steppingstone。

静态存储区:这个区域用于访问挂在外部总线上的设备,比如说NOR flash、oneNand等。这个区域被分割为6个bank,每个bank为128MB,数据宽度最大支持16bit,每个bank由片选Xm0CS[0]-Xm0CS[5]选中。

动态存储区:该区域从0x50000000-0x6fffffff,又分为2个区间,分别占256MB,可以片选Xm1CS[0]-Xm1CS[1]来进行着2个区间的选择。我们6410开发板上256MB的DDR内存就安排在这个区域,这也就是为什么6410的内存地址是从0x50000000开始的原因。

2、内存芯片的连接可以参考2440

3、代码编写:

由于这部分代码量比较大,所以我把这部分单独放在了一个文件下并命名为

mem.S,并要在makefile中做相应的修改

.text.global mem_initmem_init:@set data pin;ldr r0, =0x7e00f120 mov r1, #0x0str r1, [r0]@program memc_cmd to b100,which makes DRAM Controller enter 'Config'state.ldr r0, =0x7e001004 mov r1, #0x4         str r1, [r0]ldr r0, =0x7e001010  ldr r1, =( ( 7800 / ( 1000000000/133000000 ) + 1 ) )      str r1, [r0]ldr r0, =0x7e001014  mov r1, #(3 << 1)str r1, [r0]ldr r0, =0x7e001018  mov r1, #0x1str r1, [r0]ldr r0, =0x7e00101c  mov r1, #0x2str r1, [r0]ldr r0, =0x7e001020   ldr r1, =( ( 45 / ( 1000000000 / 133000000 ) + 1 ) )str r1, [r0]ldr r0, =0x7e001024  ldr r1, =( ( 68 / ( 1000000000 / 133000000 ) + 1 ) )str r1, [r0]ldr r0, =0x7e001028  ldr r1, =( ( 23 / ( 1000000000 / 133000000 ) + 1 ) )str r1, [r0]ldr r0, =0x7e00102c  ldr r1, =( ( 80 / ( 1000000000 / 133000000 ) + 1 ) )str r1, [r0]ldr r0, =0x7e001030   ldr r1, =( ( 23 / ( 1000000000 / 133000000 ) + 1 ) )str r1, [r0]ldr r0, =0x7e001034   ldr r1, =( ( 15 / ( 1000000000 / 133000000 ) + 1 ) )str r1, [r0]ldr r0, =0x7e001038   ldr r1, =( ( 15 / ( 1000000000 / 133000000 ) + 1 ) )@  ldr r2, [r0]str r1, [r0]ldr r0, =0x7e00103c   mov r1, #0x07str r1, [r0]ldr r0, =0x7e001040   mov r1, #0x02str r1, [r0]ldr r0, =0x7e001044   ldr r1, =( ( 120 / ( 1000000000 / 133000000 ) + 1 ) )str r1, [r0]ldr r0, =0x7e001048   ldr r1, =( ( 120 / ( 1000000000 / 133000000 ) + 1 ) )str r1, [r0]ldr r0, =0x7e00100c   ldr r1, =0x00010012   str r1, [r0]ldr r0, =0x7e00104c   ldr r1, =0x0b45str r1, [r0]ldr r0, =0x7e001200   ldr r1, =0x150f8str r1, [r0]ldr r0, =0x7e001304   mov r1, #0x0str r1, [r0]@Issue NOPldr r0, =0x7e001008 ldr r1, =0x000c0000str r1, [r0]@prechargeallldr r1, =0x00000000str r1, [r0]@Autorefreshldr r1, =0x00040000str r1, [r0]@Autorefreshldr r1, =0x00040000str r1, [r0]@mrsldr r1, =0x000a0000str r1, [r0]@mrsldr r1, =0x00080032str r1, [r0]ldr r0, =0x7e001004mov r1, #0x0str r1, [r0]check_dmc1_ready:ldr r0, =0x7e001000 ldr r1, [r0]mov r2, #0x3and r1, r1, r2cmp r1, #0x1bne check_dmc1_readynopmov pc, lr

210:

1、地址空间


1、210有4G的寻址空间,内存地址从0x20000000开始,0地址处为映射区,系统从此开始。

2、210采用的芯片是8bit的4个内存芯片(128M)。

其中DRAM0为512M

DRAM1为1G。

警告:当编写代码时,如果可以保持默认值不变,就把寄存器设置为默认值。

4、代码的编写部分可以参考210的芯片手册或U-Boot中的代码。

0 0
原创粉丝点击