对Bootloader中SDRAM初始化过程的诠释
- 格式:doc
- 大小:30.50 KB
- 文档页数:2
BootLoader启动过程分析一、 Boot Loader的概念和功能1、嵌入式Linux软件结构与分布在一般情况下嵌入式Linux系统中的软件主要分为以下及部分:(1)引导加载程序:其中包括内部ROM中的固化启动代码和Boot Loader两部分。
而这个内部固化ROM是厂家在芯片生产时候固化的,作用基本上是引导Boot Loader。
有的芯片比较复杂,比如Omap3,他在flash中没有代码的时候有许多启动方式:USB、UART 或以太网等等。
而S3C24x0则很简单,只有Norboot和Nandboot。
(2)Linux kernel 和drivers。
(3)文件系统。
包括根文件系统和建立于Flash内存设备之上的文件系统(EXT4、UBI、CRAMFS等等)。
它是提供管理系统的各种配置文件以及系统执行用户应用程序的良好运行环境的载体。
(4)应用程序。
用户自定义的应用程序,存放于文件系统之中。
在Flash 存储器中,他们的一般分布如下:但是以上只是大部分情况下的分布,也有一些可能根文件系统是initramfs,被一起压缩到了内核映像里,或者没有Bootloader参数区,等等。
2、在嵌入式Linux中为什么要有BootLoader在linux内核的启动运行除了内核映像必须在主存的适当位置,CPU还必须具备一定的条件:【1】CPU寄存器设置:R0=0;R1=Machine ID(即Machine Type Number,定义在linux/arch/arm/tools/mach-types);R2=内核启动参数在RAM中起始基地址;【2】CPU模式:必须禁止中断(IRQs和FIQs);CPU 必须工作在是超级保护模式(SVC) 模式;【3】Cache和MMU的设置:MMU 必须关闭;指令Cache可以打开也可以关闭;数据Cache必须关闭;但是在CPU刚上电启动的时候,一般连内存控制器都没有配置过,根本无法在内存中运行程序,更不可能处在Linux内核的启动环境中。
SDRAM原理和时序SDRAM(Synchronous Dynamic Random Access Memory)是一种同步动态随机访问存储器,主要用于计算机系统中,以存储数据和指令。
本文将从原理和时序两个方面对SDRAM进行详细的解析和教程。
一、原理1.寻址:SDRAM采用地址总线将存储单元进行编号,通过地址总线可以访问存储器中特定的单元。
SDRAM的地址空间通常是2的幂次方大小,即N=2^k,其中k为地址总线的位数。
2.读写操作:SDRAM的读写操作是通过数据总线进行的。
写操作可以将数据写入特定的存储单元,而读操作可以将存储单元中的数据读取到CPU或其他外部设备。
3.预充电:SDRAM中的每个存储单元都是由一个电容和一个开关组成。
在进行读写操作之前,需要对存储单元进行预充电操作,以确保电荷的准确读取和写入。
4.刷新:SDRAM是一种动态存储器,存储单元中的电荷会逐渐漏失。
为了保持数据的有效性,SDRAM需要进行定期的刷新操作,即将所有存储单元的数据重新写入并恢复电荷。
二、时序1.读时序:SDRAM的读操作包括行选通、列选通和数据输出三个过程。
首先,通过地址总线选通特定的行(行选通),然后选通特定的列(列选通),最后将存储单元中的数据通过数据总线输出。
读操作的时序需要考虑地址选通和数据输出之间的延迟。
2.写时序:SDRAM的写操作包括行选通、列选通和数据输入三个过程。
首先,通过地址总线选通特定的行(行选通),然后选通特定的列(列选通),最后将数据通过数据总线输入到特定的存储单元中。
写操作的时序需要考虑地址选通和数据输入之间的延迟。
时序的设计和调整对于SDRAM的稳定性和性能非常重要。
不同的SDRAM芯片可能有不同的时序参数需要设置和优化。
三、教程以下是使用SDRAM的一般步骤:1.确认SDRAM的规格和时序参数,包括容量、位宽、频率等,并根据需要准备好相应的电路板和接口。
2.将SDRAM芯片焊接到电路板上,确保正确连接电源和信号线。
SDRAM基本操作原理SDRAM(Synchronous Dynamic Random Access Memory)是一种同步动态随机存取存储器,是计算机系统中主要的存储设备之一、它利用同步时钟信号来管理数据的读写操作,与传统的动态随机存取存储器(DRAM)相比具有更高的工作频率和更低的延迟。
1.写入数据:当CPU需要写入数据到SDRAM时,先将数据存放在写入缓冲区。
然后,CPU向SDRAM发出写入信号和数据地址,并将要写入的数据传送给SDRAM控制器。
控制器会存储这些数据,并在适当的时机将其写入SDRAM芯片内部的存储单元。
2.读取数据:当CPU需要读取SDRAM中的数据时,首先需要提供数据的地址。
然后,SDRAM控制器根据这个地址找到对应的数据,并将其传送给CPU。
这个过程通常需要几个时钟周期来完成。
3.行地址选择:与传统的DRAM相比,SDRAM具有更高的工作频率。
这是因为SDRAM通过在行地址线上传输数据来选择存储单元,而不像DRAM那样通过在列地址线上传输数据。
因此,SDRAM的存储单元可以被更快地访问。
4.命令和控制:SDRAM控制器接收来自CPU的各种命令和控制信号,并将其转化为SDRAM内部操作所需的信号。
例如,当CPU准备写入数据时,控制器会将命令转化为写入信号,并将数据存放在写入缓冲区中。
同样,当需要读取数据时,控制器会将命令转化为读取信号,并将数据传送给CPU。
5.同步时钟:SDRAM使用同步时钟信号来控制数据的读写操作。
这使得多个SDRAM芯片可以同时工作,并通过同步时钟信号来协调操作。
同步时钟信号还可以用来控制SDRAM的刷新操作,以保持存储单元中的数据的正确性。
总结起来,SDRAM的基本操作原理是通过同步时钟信号来管理数据的读写操作。
CPU通过命令和控制信号将数据写入或读取到SDRAM中,SDRAM控制器则负责将这些信号转化为内部操作所需的信号,并将数据存储在合适的存储单元中。
SDRam的初始化过年来的这一个月,都是在整着启动文件啊,SDRam 初始化啊,Nor Flash初始化啊,还有程序在SDRAM中运行等一干事情。
今天就记录一下,我初始化SDRam过程中所学到的东西以及一些体会。
本人还属于菜鸟,有什么讲得不好的地方,还希望指正指正哈。
也是为了以后不会温习之用。
虽然手里有一些样例程序,但是真正理解起来还是很费劲。
开发板:LPC1788,SDRAM:HY57V561620,据说已经停产了~~~~ SDRAM大概都步骤都相同,只是有些芯片具体的参数需要查阅资料才能填写。
初始化SDRAM的基本步骤:1. 初始化引脚,PCONP,EMCDLYCTL,EMCControl寄存器,以及一些与芯片相关的参数,还有EMCDynamicConfig0.2. SDRAM上电后,等待100us或是200us,期间可以发送NOP命令。
3. 对所有banks预充电,PALL。
4. 执行8次预充电:给EMCDynamicRefresh赋值,然后延时一段时间,令其有8次self-refresh的时间。
(自己的理解)5. 延时完毕后,对EMCDynamicRefresh寄存器赋值。
对刷新寄存器的赋值如下:6. 设置模式寄存器Mode Register。
以虚读的方式对其进行赋值。
如下:*(INT32U*) EMCDynamicControl = 0x00000083;dummy = *((volatileINT32U*)( DynamicMemoryBaseAddr|(0x23 << 13)));至今还没完全明白为什么0x23<<13?7. 最后设置Normal 并延时一段时间。
这样就差不多大功告成了。
在验证SDRAM是否设置正确的过程遇到一些麻烦。
1. 引脚没有全部初始化完全。
导致对SDRAM赋值的过程中,有一部分值不能被赋值上。
2. *(INT16U*)Addr++,这个过程中,如果Addr的初始值是0xA0000000的话,Addr就变成0xA0000002.同理,*(INT32U*)Addr++,这个过程中,如果Addr的初始值是0xA0000000的话,Addr就变成0xA0000004.3. 先是对SDRAM赋值0,然后再对其赋值。
SDRAM 工作过程SDRAM是Synchronous Dynamic Random Access Memory(同步动态随机存储器)的简称,它将CPU和RAM通过一个相同的时钟锁在一起,使得RAM和CPU能够共享一个钟周期,以相同的速度同步工 作,从而解决了CPU和RAM之间的速度不匹配问题,避免了在系统总线对异步DRAM进行操作时同步所需的额外等待时间,可加快数据的传输速度。
SDRAM工作过程:启动初始化:1、同时启动设备核心电源VDD和设备I/O电源VDDQ。
声明并维持CKE引脚为高电平(CKE引脚为Clock Enable,时钟使能信号,高电平表示启动内部时钟信号)。
2、等到VDD和VDDQ稳定后并且CKE设为高电平,应用稳定时钟。
3、等待200μs执行空操作命令。
4、precharge:预充电命令。
SDRAM执行一条预充电命令后,要执行一条空操作命令,这两个操作会使所有 的存储单元进行一次预充电,从而 使所有阵列中的器件处于待机状态。
引脚A10(=AP Auto Precharge)可以对预充电的模式进行选择,当A10=LOW时,给单个bank pre-charge,bank由BA0和BA1引脚进行选择;当A10=HIGH时,给所有的bank进行precharge。
5、auto-refresh:自刷新命令。
SDRAM要执行两条自刷新命令,每一条刷新命令之后,都需要执行一条空操作命令。
这些操作会使 SDRAM内部的刷新及计数器进入正常运行状态,以便为SDRAM模式寄存器编程做好准备。
6、load mode register:设置模式寄存器。
Mode Register一般被用于定义SDRAM 运行的模式,寄存器里一般设置了读取延迟,burst长度,CAS,burst类型,操作模式,还有是设置 SDRAM是工 作在单个读写操作还是burst操作下。
Mode Register通过LOAD MODE REGISTER命令进行编程,这组信息将会一直保存在Mode Register中直到内存掉电之后才会消失。
ARM JTAG仿真器调试方法之SDRAM篇(转)2007-12-16 09:28之前介绍了使用ARM JTAG仿真器将映像文件加载到ARM处理器内部SRAM中进行程序调试的方法,而在实际操作中,将映像文件加载到外部SDRAM中进行调试的方式更为常见。
要把映像文件加载到SDRAM中,除了要正确设置好映像文件的RO段基地址外(对于一个加载时域和运行时域相同的映像文件来说,RO段基地址实际上就是该映像文件在存储空间的起始地址),更关键的是要对SDRAM进行初始化。
因为在上电时,SDRAM是没有被初始化的,所谓初始化SDRAM,就是要设置处理器的SDRAM空间以及读写SDRAM 的时序参数,因而SDRAM在初始化之前是不能进行读写操作的。
对于PXA270处理器,初始化SDRAM的工作通过配置存储控制器寄存器来完成,这些寄存器包括MDCNFG,MDREFR,MDMRS。
由于这些寄存器都映射到了某一存储空间地址,因而可以在AXD的命令行窗口(System Views->Command Line Interface [Alt+L])中使用setmem命令来对寄存器进行配置。
setmem命令(简写为smem)可以为存储空间的某一地址单元指定值。
例如“setmem 0x48000000 0xac9 32”的含义就是将常数0xac9保存到地址为0x48000000的字中(一个字32bit)。
实际上,通过查阅Intel PXA27x Processor Family Developer’s Manual可知,0x48000000正是寄存器MDCNFG的地址,因而这条命令实质上完成了对MDCNFG寄存器的配置,使能SDRAM partition 0,使用32bit宽的SDRAM数据总线,9位列地址,13位行地址,SDRAM内部采用4 bank设计,tRP=3,CL=3,tRCD=3,tRAS=7,tRC=10,采用普通寻址模式;不使用SDRAM partition 2/3。
详解内存(RAM,SRAM,SDRAM)工作原理及发展历程/csrwzt/blog/item/7ec462ef44e87fe9cf1b3e6f.htmlRAM(Random Access Memory)随机存取存储器对于系统性能的影响是每个PC 用户都非常清楚的,所以很多朋友趁着现在的内存价格很低纷纷扩容了内存,希望借此来得到更高的性能。
不过现在市场是多种内存类型并存的,SDRAM、DDR SDRAM、RDRAM等等,如果你使用的还是非常古老的系统,可能还需要EDO DRAM、FP DRAM(块页)等现在不是很常见的内存。
虽然RAM的类型非常的多,但是这些内存在实现的机理方面还是具有很多相同的地方,所以本文的将会分为几个部分进行介绍,第一部分主要介绍SRAM和异步DRAM(asynchronous DRAM),在以后的章节中会对于实现机理更加复杂的FP、EDO和SDRAM进行介绍,当然还会包括RDRAM和SGRAM等等。
对于其中同你的观点相悖的地方,欢迎大家一起进行技术方面的探讨。
存储原理:为了便于不同层次的读者都能基本的理解本文,所以我先来介绍一下很多用户都知道的东西。
RAM主要的作用就是存储代码和数据供CPU在需要的时候调用。
但是这些数据并不是像用袋子盛米那么简单,更像是图书馆中用有格子的书架存放书籍一样,不但要放进去还要能够在需要的时候准确的调用出来,虽然都是书但是每本书是不同的。
对于RAM等存储器来说也是一样的,虽然存储的都是代表0和1的代码,但是不同的组合就是不同的数据。
让我们重新回到书和书架上来,如果有一个书架上有10行和10列格子(每行和每列都有0-9的编号),有100本书要存放在里面,那么我们使用一个行的编号+一个列的编号就能确定某一本书的位置。
如果已知这本书的编号87,那么我们首先锁定第8行,然后找到第7列就能准确的找到这本书了。
在RAM 存储器中也是利用了相似的原理。
现在让我们回到RAM存储器上,对于RAM存储器而言数据总线是用来传入数据或者传出数据的。
SDRAM基本操作原理
1.写操作:
写操作分为写入命令和写入数据两个步骤。
-写入命令:CPU将写入地址和写入数据发送给SDRAM控制器,控制器将地址和数据存储在写入缓冲器中。
-写入数据:控制器根据同步时钟信号将数据写入到内存芯片中的相应位置,同时控制器根据判别电路的反馈信息确定写入是否成功。
2.读操作:
读操作分为读取命令和读取数据两个步骤。
-读取命令:CPU将读取地址发送给SDRAM控制器,控制器将地址存储在读取缓冲器中。
-读取数据:控制器根据同步时钟信号将需要读取的数据从内存芯片中读取到读取缓冲器中,然后将数据传输给CPU。
3.刷新操作:
-刷新命令:控制器发送刷新命令给SDRAM,这个命令包含了需要刷新的行地址。
-刷新数据:控制器根据同步时钟信号将刷新数据写入内存芯片的刷新地址中,用于刷新存储的数据。
4.预充电操作:
预充电操作是为了提高SDRAM的读取操作性能,通过预先将存储器中的电荷释放,减少读取操作时对信号的干扰。
-预充电命令:控制器发送预充电命令给SDRAM,将预充电电流导入到内存芯片中进行预充电操作。
-预充电数据:控制器控制预充电电流的时间和大小,以确保电荷完全释放。
5.周期控制:
-控制信号:控制器根据同步时钟信号生成相应的控制信号,用于控制SDRAM内部电路的工作时间和数据传输速度。
-时序要求:不同的SDRAM有不同的工作时序要求,控制器需要按照SDRAM的要求生成相应的时序信号,以保证数据的正常读写。
SDRAM的原理和时序一、 SDRAM内存模组与基本结构我们平时看到的SDRAM都是以模组形式出现,为什么要做成这种形式呢?这首先要接触到两个概念:物理Bank与芯片位宽。
1、物理Bank传统内存系统为了保证CPU的正常工作,必须一次传输完CPU在一个传输周期内所需要的数据。
而CPU在一个传输周期能接受的数据容量就是CPU数据总线的位宽,单位是bit (位)。
当时控制内存与CPU之间数据交换的北桥芯片也因此将内存总线的数据位宽等同于CPU数据总线的位宽,而这个位宽就称之为物理Bank(Physical Bank,下文简称P-Bank)的位宽。
所以,那时的内存必须要组织成P-Bank来与CPU打交道。
资格稍老的玩家应该还记得Pentium刚上市时,需要两条72pin的SIMM才能启动,因为一条72pin -SIMM只能提供32bit 的位宽,不能满足Pentium的64bit数据总线的需要。
直到168pin-SDRAM DIMM上市后,才可以使用一条内存开机。
不过要强调一点,P-Bank是SDRAM及以前传统内存家族的特有概念,RDRAM 中将以通道(Channel)取代,而对于像Intel E7500那样的并发式多通道DDR系统,传统的P-Bank概念也不适用。
2、芯片位宽上文已经讲到SDRAM内存系统必须要组成一个P-Bank的位宽,才能使CPU正常工作,那么这个P-Bank位宽怎么得到呢?这就涉及到了内存芯片的结构。
每个内存芯片也有自己的位宽,即每个传输周期能提供的数据量。
理论上,完全可以做出一个位宽为64bit的芯片来满足P-Ban k的需要,但这对技术的要求很高,在成本和实用性方面也都处于劣势。
所以芯片的位宽一般都较小。
台式机市场所用的SDRAM芯片位宽最高也就是16bit,常见的则是8bit。
这样,为了组成P-Bank所需的位宽,就需要多颗芯片并联工作。
对于16bi t芯片,需要4颗(4×16bit=64bit)。
SDRAM⼯作原理SDRAM(Synchronous Dynamic Random Access Memory,同步动态随机存储器)也就是通常所说的内存。
在我们现在所⽤的PC机中,所指的内存,其实就是SDRAM,只不过是他的升级版,如DDR内存,DDR2内存,DDR3内存等等,⼤部分显卡上的显存也是SDRAM的。
内存是代码的执⾏空间,以PC机为例,程序是以⽂件的形式保存在硬盘⾥⾯的,程序在运⾏之前先由操作系统装载⼊内存中,由于内存是RAM(随机访问存储器),可以通过地址去定位⼀个字节的数据,CPU在执⾏程序时将PC的值设置为程序在内存中的开始地址, CPU会依次的从内存⾥取址,译码,执⾏,在内存没有被初始化之前,内存好⽐是未建好的房⼦,是不能读取和存储数据的,因此我们要想让程序运⾏在内存⾥必须进⾏内存的初始化。
在介绍内存⼯作原理之前有必要了解下存储设备的存储⽅式:ROM,RAMROM(Read-Only Memory):只读存储器,是⼀种只能读出事先所存数据的固态半导体存储器。
其特性是⼀旦储存资料就⽆法再将之改变或删除。
通常⽤在不需经常变更资料的电⼦或电脑系统中,资料并且不会因为电源关闭⽽消失。
如:PC⾥⾯的BIOS。
RAM(Random Access Memory) :随机访问存储器,存储单元的内容可按需随意取出或存⼊,且存取的速度与存储单元的位置⽆关的存储器。
可以理解为,当你给定⼀个随机有效的访问地址,RAM会返回其存储内容(随机寻址),它访问速度与地址的⽆关。
这种存储器在断电时将丢失其存储内容,故主要⽤于存储短时间内随机访问使⽤的程序。
计算机系统⾥内存地址是⼀个四字节对齐的地址(32位机),CPU的取指,执⾏,存储都是通过地址进⾏的,因此它可以⽤来做内存。
RAM按照硬件设计的不同,随机存储器⼜分为DRAM(Dynamic RAM)动态随机存储器和SRAM(Static RAM) 静态随机存储器。
几天前看初始化SDRAM代码时觉得比较困难,主要是因为之前没有接触过这方面,毫无经验,现在看来不难,麻烦在需要根据datasheet进行设置,好在是移植,很多强人的文章可参考。
自己很容易忘事,就记录下来吧。
我的板子是sbc2410,使用两片容量为32MB、位宽16bit的HY57V561620CT-H芯片拼成容量为64M、32bit的SDRAM存储器。
根据2410datasheet,要使用SDRAM需配置13个寄存器,以下逐个来看:
1、BWSCON:Bus width & wait status control register总线位宽和等待状态
控制寄存器。
此寄存器用于配置BANK0 – BANK7的位宽和状态控制,每个BANK用4位来配置,分别是:
● ST(启动/禁止SDRAM的数据掩码引脚。
对于SDRAM,此位置0;对于SRAM,此位置1)
● WS(是否使用存储器的WAIT信号,通常置0为不使用)
● DW(两位,设置位宽。
此板子的SDRAM是32位,故将DW6设为10)
特殊的是bit[2:1],即DW0,设置BANK0的位宽,又板上的跳线决定,只读的。
我这板子BWSCON可设置为0x22111110。
其实只需将BANK6对应的4位设为0010即可。
2、BANKCON0 – BANKCON7
用来分别配置8个BANK的时序等参数。
SDRAM是映射到BANK6和BANK7上的(内存只能映射到这两个BANK,具体映射多大的空间,可用BANKSIZE寄存器设置),所以只需参照SDRAM芯片的datasheet配置好BANK6和BANK7,BANKCON0 – BANKCON5使用默认值
0x00000700即可。
对于BANKCON6和BANKCON7中的各个位的描述:
(1)MT(bit[16:15]):设置本BANK映射的物理内存是SRAM还是SDRAM,后面的低位就根据此MT的选择而分开设置。
本板子应置0b11,所以只需要再设置下
面两个参数
(2)Trcd(bit[3:2]):RAS to CAS delay(00=2 clocks,01=3 clocks,10=4 clocks),推2410手册上的荐值是0b01。
我们PC的BIOS里也可以调节的,
应该玩过吧。
(3)SCAN(bit[1:0]):Column address number(00 = 8-bit,01 = 9-bit,10= 10-bit),SDRAM列地址位数。
查阅HY57V561620CT-H芯片手册得知
此值是9,所以SCAN=0b01。
综合以上各值,BANKCON6 – 7设为0x00018005。
3、REFRESH:刷新控制寄存器。
此寄存器的bit[23:11]可参考默认值,或自己根据经验修改,这里用0x008e0000,关键是最后的Refresh Counter(简称R_CNT,bit[10:0])的设置,2410手册上给出了公式计算方法。
SDRAM手册上“8192 refresh cycles / 64ms”的描述,得到刷新周期为64ms/8192=7.8125us,结合公式,R_CNT=2^11 + 1 –12 * 7.8125 = 1955。
所以可得REFRESH=0x008e0000+1995=0x008e07a3。
4、BANKSIZE:设置SDRAM的一些参数。
其中BK76MAP(bit[2:0])配置BANK6/7映
射的大小,可设置为010 = 128MB/128MB或001 = 64MB/64MB,只要比实际RAM 大都行,因为bootloader和linux内核都可以检测可用空间的。
BANKSIZE=0x000000b2。
5、MRSRB
6、MRSRB7:Mode register set register bank6/7
可以修改的只有CL[6:4](CAS latency,000 = 1 clock, 010 = 2 clocks, 011=3 clocks),其他的全部是固定的(fixed),故值为0x00000030。
这个CAS在BIOS中应该也设置过吧,对PC的速度提升很明显哦
至此,13个寄存器全部配置好了,下面就可以把代码复制到SDRAM中执行了,同样的程序速度要比片内SRAM运行的慢不少。