2015-03-27 21:37:54 zihulidejia 阅读数 1450
1.kernel/Kconfig.hz
          在 config HZ_100  之前添加:
          config HZ_10
      bool "10 HZ"
       help 
                      10 HZ is added by song.
         
          在  default 100 if HZ_100   之前添加:
                default 100 if HZ_10


2.kernel\linux\jiffies.h
          在  #if HZ >= 12 && HZ < 24  处进行修改,看规律,每除2  shift_hz减一
                #if HZ >= 3 && HZ < 6
                # define SHIFT_HZ 2
                #elif HZ >= 6 && HZ < 12
                # define SHIFT_HZ 3
                #elif HZ >= 6 && HZ < 12 


3.kernel\net\inet_timewait_sock.h
          #if HZ <= 16 || HZ > 4096   修改为:    此处为网络不需要额外修改
          #if HZ <= 4 || HZ > 4096


4.arch\x86\kernel\apic\apic.c    若将频率修改到10以下,则需要修改4、5
           当频率小于10时会导致除0错误
           将 #define LAPIC_CAL_LOOPS (HZ/10)修改为:
               #if HZ < 1
               #define LAPIC_CAL_LOOPS 1
               #else
               #define LAPIC_CAL_LOOPS (HZ/10)
               #endif


5. block\cfq-iosched.c  
          当频率小于10时会导致除0错误,导致调度程序挂死。
           static const int cfq_slice_sync = HZ / 10;  修改为:
           #if HZ < 1
           static const int cfq_slice_sync = 1;
           #else
           static const int cfq_slice_sync = HZ / 10;
           #endif
2015-06-18 19:14:38 u010346967 阅读数 4186

                                                                      疯雨-版权所有,转载请注明【http://blog.csdn.net/u010346967】

U-Boot移植_DDR3移植:首先在这里感谢网友fengtian的整理,没有你就没有这篇文章

在系统上电后,CPU并不知道外部的RAM是什么类型的存储器,因此U-Boot需要对CPU进行RAM初始化设置,然后将程序拷贝到RAM中运行。

本系统采用的RAM是DDR3类型存储芯片,容量是4GB,频率是1066KHz;系统从eMMC中启动。采用的是U-Boot-2009版,linux3.0.35系统内核,U-Boot对DDR3的配置在board/max6q/flash_header.S文件中,下面根据源代码对DDR3移植进行详细描述。

 

#include <config.h>                         //包含配置头文件config.h

#include <asm/arch/mx6.h>                  //包含配置头文件mx6.h

 

#ifdef        CONFIG_FLASH_HEADER     //if语句判断是否如果定义了CONFIG_FLASH_HEADER

#ifndef CONFIG_FLASH_HEADER_OFFSET   //如果没有定义CONFIG_FLASH_HEADER_OFFSET

# error "Must define the offset offlash header"  //提示"Mustdefine the offset of flash header"错误

#endif                            //结束ifndef

/**************************大小端转换函数*************************************/

/*ARM架构的CPU的数据支持大端和小端存储,而指令支持小端存储。由于程序编写时我们的习惯是大端,所以要进行大小端变换,将数据转换为小端格式。现代计算机中内存空间都是按照byte划分的,因此按照字节进行转换*/

#define CPU_2_BE_32(l) \                       //定义CPU_2_BE_32(l)函数

    ((((l) & 0x000000FF) << 24) | \        //取l中低7-0位,左移24位,既放在31-24位

         (((l)& 0x0000FF00) << 8)  | \        //取l中的15-8位,左移8位,放在23-16位

         (((l)& 0x00FF0000) >> 8)  | \        //取l中的23-16位,右移8位,放在15-8位

         (((l)& 0xFF000000) >> 24))          //取l中的31-24位,右移24位,放在7-0位

 

/****************************定义MXC_DCD_ITEM宏*************************/

/*ARM指令:4字节对齐,Thumb指令:2字节对齐*/

#define MXC_DCD_ITEM(i, addr, val)   \    //定义函数MXC_DCD_ITEM(i, addr, val),参数为//i, addr, val

/* dcd_node_ i,##为连接符,将dcd_node_与//i连接,dcd_node_i为标号名称。*/

/* dcd_node_##i:(Tab).wordCPU_2_BE_32(addr)是将CPU_2_BE_32(addr)的值直接放到dcd_node_##i位置。即: dcd_node_##i代表CPU_2_BE_32(addr)的值。汇编和C引用变量的不同:汇编是“绝对”引用,即没有指针的概念,引用得到的就是值;c语言是“间接”引用,相当于指针的概念,引用地址变量,得到的就是该变量所指的内容值。[标号名称]:(Tab).word 是汇编word标号的格式*/

/*ARM指令:4字节对齐,Thumb指令:2字节对齐。在执行完dcd_node_##i:(Tab).wordCPU_2_BE_32(addr)后,dcd_node_##i 对应的下一个地址放的是.word CPU_2_BE_32(val)*/

dcd_node_##i:                     \ 

        .wordCPU_2_BE_32(addr)  

       .word CPU_2_BE_32(val)      

/***************************定义段*******************************************/

/* b  _start跳到_start函数开始执行,_start函数在U-boot-2009.08/Cpu/Arm_cortexa8/start.S中定义,b是相对跳转指令符号。.org是将其后面的程序保存到org指定的地址上*/

.section ".text.flasheader","x"               //定义段.text.flasheader,类型为x执行段。

         b       _start 

         .org  CONFIG_FLASH_HEADER_OFFSET    //将如下程序保存到

//CONFIG_FLASH_HEADER_OFFSET地址

/*定义ivt_header标号,根据参考手册第433页IVT HeaderFormat定义,IVT Header Format的格式是[Tag] [Length] [Version],Tag是单字节数据,设置为0xD1。 Length是双字节大端数据,长度固定且只能为32 bytes。Version是单字节数据,设置为0x40 or 0x41。进行大小端转化后,得到0x402000D1。*/

ivt_header:       .word 0x402000D1 /* Tag=0xD1,Len=0x0020, Ver=0x40 */

app_code_jump_v:  .word _start           //定义标号app_code_jump_v,值为_start

reserv1:          .word 0x0              //定义标号reserv1,值为0x0

dcd_ptr:          .word dcd_hdr          //定义标号dcd_ptr,值为dcd_hdr

boot_data_ptr:          .word boot_data       //定义标号boot_data_ptr,值为boot_data

self_ptr:         .word ivt_header        //定义标号self_ptr,值为ivt_header

app_code_csf:     .word 0x0             //定义标号app_code_csf,值为0x0

reserv2:          .word 0x0             //定义标号reserv2,值为0x0

 

/*定义标号boot_data,值为TEXT_BASE,TEXT_BASE在config.mk中定义,其值为0x27800000。*/

boot_data:        .word TEXT_BASE     

/*定义标号image_len,值为_end_of_copy  - TEXT_BASE + CONFIG_FLASH_HEADER_OFFSET,_end_of_copy在u-boot.lds中定义,_end_of_copy = .; /* end_of ROM copy code here */CONFIG_FLASH_HEADER_OFFSET在u-boot-2009.08/include/configs/mx6q.h中定义,“#defineCONFIG_FLASH_HEADER_OFFSET 0x400”*/

image_len:        .word _end_of_copy  - TEXT_BASE + CONFIG_FLASH_HEADER_OFFSET

plugin:           .word 0x0   //定义标号plugin,值为0x0

 

2015-05-26 13:34:44 davidlinux 阅读数 7800

一、DDR原理

 

DDR 内存 既然叫做双倍速率SDRAM(Dual date rate SDRSM),就是说是SDRAM的升级换代产品。从技术上分析,DDR SDRAM最重要的改变是在界面数据传输上,其在时钟信号上升缘与下降缘时各传输一次数据,这使得DDR的数据传输速率为传统SDRAM的两倍。那么大家就应该知道了,我们所说的DDR400,DDR333,DDR266,他们的工作频率其实仅为那些数值的一半,也就是说DDR400工作频率为200MHz。

FSB与内存频率的关系

  首先请大家看看表一:FSB(Front Side Bus:前端总线)和内存比率与内存实际运行频率的关系。

FSB/MEM比率

实际运行频率

1/01

200MHz

1/02

100MHz

2/03

133MHz

3/04

150MHz

3/05

120MHz

5/06

166MHz

7/10

140MHz

9/10

180MHz

  对于大多数玩家来说,FSB和内存同步,即1:1(DFI 用1/01表示)是使性能最佳的选择。而其他的设置都是异步的。同步后,内存的实际运行频率是FSBx2,所以,DDR400的内存和200MHz的FSB正好同步。如果你的FSB为240MHz,则同步后,内存的实际运行频率为240MHz x 2 = 480MHz。

表2更详尽列出了FSB与不同速度的DDR内存之间正确的设置关系

  强烈建议采用1:1的FSB与内存同步的设置,这样可以完全发挥内存带宽的优势。

Command Per Clock(CPC)

  可选的设置:Auto,Enable(1T),Disable(2T)。

  Command Per Clock(CPC:指令比率,也有翻译为: 首命令延迟 ),一般还被描述为DRAM Command Rate、CMD Rate等。由于目前的DDR内存的寻址,先要进行P-Bank的选择(通过DIMM上CS片选信号进行),然后才是L-Bank/行激活与列地址的选择。这个参数的含义就是指在P-Bank选择完之后多少时间可以发出具体的寻址的L-Bank/行激活命令,单位是时钟周期。

  显然,也是越短越好。但当随着主板上内存模组的增多,控制芯片组的负载也随之增加,过短的命令间隔可能会影响稳定性。因此当你的内存插得很多而出现不太稳定的时间,才需要将此参数调长。目前的大部分主板都会自动设置这个参数。

  该参数的默认值为Disable(2T),如果玩家的内存质量很好,则可以将其设置为Enable(1T)。

CAS Latency Control(tCL)  

  可选的设置:Auto,1,1.5,2,2.5,3,3.5,4,4.5。

  一般我们在查阅内存的时序参数时,如“3-4-4-8”这一类的数字序列,上述数字序列分别对应的参数是“CL-tRCD-tRP-tRAS”。这个3就是第1个参数,即CL参数。

  CAS Latency Control(也被描述为tCL、CL、CAS Latency Time、CAS Timing Delay),CAS latency是“ 内存读写操作前列地址控制器的潜伏时间  CAS控制从接受一个指令到执行指令之间的时间 。因为CAS主要控制十六进制的地址,或者说是内存矩阵中的列地址,所以它是最为重要的参数,在稳定的前提下应该尽可能设低。

  内存是根据行和列寻址的,当请求触发后,最初是tRAS(Activeto Precharge Delay),预充电后,内存才真正开始初始化RAS。一旦tRAS激活后,RAS(Row Address Strobe )开始进行需要数据的寻址。首先是行地址,然后初始化tRCD,周期结束,接着通过CAS访问所需数据的精确十六进制地址。期间从CAS开始到CAS结束就是CAS延迟。所以CAS是找到数据的最后一个步骤,也是内存参数中最重要的。

  这个参数控制内存接收到一条数据读取指令后要等待多少个时钟周期才实际执行该指令。同时该参数也决定了在一次内存突发传送过程中完成第一部分传送所需要的时钟周期数。这个参数越小,则内存的速度越快。必须注意部分内存不能运行在较低的延迟,可能会丢失数据,因此在提醒大家把CAS延迟设为2或2.5的同时,如果不稳定就只有进一步提高它了。而且提高延迟能使内存运行在更高的频率,所以需要对内存超频时,应该试着提高CAS延迟。

  该参数对内存性能的影响最大,在保证系统稳定性的前提下,CAS值越低,则会导致更快的内存读写操作。CL值为2为会获得最佳的性能,而CL值为3可以提高系统的稳定性。注意,WinbondBH-5/6芯片可能无法设为3。

RAS# to CAS# Delay(tRCD)

  可选的设置:Auto,0,1,2,3,4,5,6,7。

  该值就是“3-4-4-8”内存时序参数中的第2个参数,即第1个4。RAS# to CAS# Delay(也被描述为:tRCD、RAS to CAS Delay、Active to CMD),表示" 行寻址到列寻址延迟时间",数值越小,性能越好。对内存进行读、写或刷新操作时,需要在这两种脉冲信号之间插入延迟时钟周期。在JEDEC规范中,它是排在第二的参数,降低此延时,可以提高系统性能。建议该值设置为3或2,但如果该值设置太低,同样会导致系统不稳定。该值为4时,系统将处于最稳定的状态,而该值为5,则太保守。

  如果你的内存的超频性能不佳,则可将此值设为内存的默认值或尝试提高tRCD值。

Min RAS# Active Timing(tRAS)

  可选的设置:Auto,00,01,02,03,04,05,06,07,08,09,10,11,12,13,14,15。

  该值就是该值就是“3-4-4-8”内存时序参数中的最后一个参数,即8。Min RAS# Active Time (也被描述为:tRAS、Active to Precharge Delay、Row Active Time、Precharge Wait State、Row Active Delay、Row Precharge Delay、RAS Active Time),表示“ 内存行有效至预充电的最短周期 ,调整这个参数需要结合具体情况而定,一般我们最好设在5-10之间。这个参数要根据实际情况而定,并不是说越大或越小就越好。

  如果tRAS的周期太长,系统会因为无谓的等待而降低性能。降低tRAS周期,则会导致已被激活的行地址会更早的进入非激活状态。如果tRAS的周期太短,则可能因缺乏足够的时间而无法完成数据的突发传输,这样会引发丢失数据或损坏数据。该值一般设定为CAS latency + tRCD + 2个时钟周期。如果你的CAS latency的值为2,tRCD的值为3,则最佳的tRAS值应该设置为7个时钟周期。为提高系统性能,应尽可能降低tRAS的值,但如果发生内存错误或系统死机,则应该增大tRAS的值。

  如果使用DFI的主板,则tRAS值建议使用00,或者5-10之间的值。

Row Precharge Timing(tRP)

  可选的设置:Auto,0,1,2,3,4,5,6,7。

  该值就是“3-4-4-8”内存时序参数中的第3个参数,即第2个4。Row Precharge Timing (也被描述为:tRP、RAS Precharge、Precharge to active),表示 " 内存行地址控制器预充电时间 ",预充电参数越小则内存读写速度就越快。

  tRP用来设定在另一行能被激活之前,RAS需要的充电时间。tRP参数设置太长会导致所有的行激活延迟过长,设为2可以减少预充电时间,从而更快地激活下一行。然而,想要把tRP设为2对大多数内存都是个很高的要求,可能会造成行激活之前的数据丢失,内存控制器不能顺利地完成读写操作。对于桌面计算机来说,推荐预充电参数的值设定为2个时钟周期,这是最佳的设置。如果比此值低,则会因为每次激活相邻紧接着的bank将需要1个时钟周期,这将影响DDR内存的读写性能,从而降低性能。只有在tRP值为2而出现系统不稳定的情况下,将此值设定为3个时钟周期。

  如果使用DFI的主板,则tRP值建议2-5之间的值。值为2将获取最高的性能,该值为4将在超频时获取最佳的稳定性,同样的而该值为5,则太保守。大部分内存都无法使用2的值,需要超频才可以达到该参数。

Row Cycle Time(tRC)  

  可选的设置:Auto,7-22,步幅值1。

  Row Cycle Time(tRC、RC),表示“ SDRAM行周期时间 ,它是 包括行单元预充电到激活在内的整个过程所需要的最小的时钟周期数 

  其计算公式是:

row cycle time (tRC) = minimum row active time(tRAS) + row precharge time(tRP)

因此,设置该参数之前,你应该明白你的tRAS值和tRP值是多少。如果tRC的时间过长,会因在完成整个时钟周期后激活新的地址而等待无谓的延时,而降低性能。然后一旦该值设置过小,在被激活的行单元被充分充电之前,新的周期就可以被初始化。

  在这种情况下,仍会导致数据丢失和损坏。因此,最好根据tRC = tRAS + tRP进行设置,如果你的内存模块的tRAS值是7个时钟周期,而tRP的值为4个时钟周期,则理想的tRC的值应当设置为11个时钟周期。

Row Refresh Cycle Time(tRFC)

  可选的设置:Auto,9-24,步幅值1。

  Row Refresh Cycle Time(tRFC、RFC),表示  SDRAM行刷新周期时间 ,它是行单元刷新所需要的时钟周期数。该值也表示向相同的bank中的另一个行单元两次发送刷新指令(即:REF指令)之间的时间间隔。tRFC值越小越好,它比tRC的值要稍高一些。

  如果使用DFI的主板,通常tRFC的值不能达到9,而10为最佳设置,17-19是内存超频建议值。建议从17开始依次递减来测试该值。大多数稳定值为tRC加上2-4个时钟周期。

Row to Row Delay(RAS to RAS delay)(tRRD)

  可选的设置:Auto, 0-7,每级以1的步幅递增。

  Row to Row Delay,也被称为RAS to RAS delay (tRRD),表示" 行单元到行单元的延时 "。该值也表示向相同的bank中的同一个行单元两次发送激活指令(即:REF指令)之间的时间间隔。tRRD值越小越好。

  延迟越低,表示下一个bank能更快地被激活,进行读写操作。然而,由于需要一定量的数据,太短的延迟会引起连续数据膨胀。于桌面计算机来说,推荐tRRD值设定为2个时钟周期,这是最佳的设置,此时的数据膨胀可以忽视。如果比此值低,则会因为每次激活相邻紧接着的bank将需要1个时钟周期,这将影响DDR内存的读写性能,从而降低性能。只有在tRRD值为2而出现系统不稳定的情况下,将此值设定为3个时钟周期。

  如果使用DFI的主板,则tRRD值为00是最佳性能参数,4超频内存时能达到最高的频率。通常2是最合适的值,00看上去很奇怪,但有人也能稳定运行在00-260MHz。

Write Recovery Time(tWR)

   可选的设置:Auto,2,3。

  Write Recovery Time (tWD),表示“ 写恢复延时 。该值说明在一个激活的bank中完成有效的写操作及预充电前,必须等待多少个时钟周期。这段必须的时钟周期用来确保在预充电发生前,写缓冲中的数据可以被写进内存单元中。同样的,过低的tWD虽然提高了系统性能,但可能导致数据还未被正确写入到内存单元中,就发生了预充电操作,会导致数据的丢失及损坏。

  如果你使用的是DDR200和266的内存,建议将tWR值设为2;如果使用DDR333或DDR400,则将tWD值设为3。如果使用DFI的主板,则tWR值建议为2。

Write to Read Delay(tWTR)

  可选的设置:Auto,1,2。

  Write to Read Delay (tWTR),表示“ 读到写延时 。三星公司称其为“TCDLR (last data in to read command)”,即最后的数据进入读指令。它设定向DDR内存模块中的同一个单元中,在最后一次有效的写操作和下一次读操作之间必须等待的时钟周期。

  tWTR值为2在高时钟频率的情况下,降低了读性能,但提高了系统稳定性。这种情况下,也使得内存芯片运行于高速度下。换句话说,增加tWTR值,可以让内容模块运行于比其默认速度更快的速度下。如果使用DDR266或DDR333,则将tWTR值设为1;如果使用DDR400,则也可试着将tWTR的值设为1,如果系统不稳定,则改为2。

Refresh Period(tREF)

  可选的设置:Auto, 0032-4708,其步进值非固定。

  Refresh Period (tREF),表示“ 刷新周期  它指内存模块的刷新周期 

  先请看不同的参数在相同的内存下所对应的刷新周期(单位:微秒,即:一百万分之一秒)。?号在这里表示该刷新周期尚无对应的准确数据。

  1552= 100mhz(?.??s)

  2064= 133mhz(?.??s)

  2592= 166mhz(?.??s)

  3120= 200mhz(?.??s) 

  ---------------------

  3632= 100mhz(?.??s)

  4128= 133mhz(?.??s)

  4672= 166mhz(?.??s)

  0064= 200mhz(?.??s)

  ---------------------

  0776= 100mhz(?.??s)

  1032= 133mhz(?.??s)

  1296= 166mhz(?.??s)

  1560= 200mhz(?.??s)

  ---------------------

  1816= 100mhz(?.??s)

  2064= 133mhz(?.??s)

  2336= 166mhz(?.??s)

  0032= 200mhz(?.??s)

  ---------------------

  0388= 100mhz(15.6us)

  0516= 133mhz(15.6us)

  0648= 166mhz(15.6us)

  0780= 200mhz(15.6us)

  ---------------------

  0908= 100mhz(7.8us)

  1032= 133mhz(7.8us)

  1168= 166mhz(7.8us)

  0016= 200mhz(7.8us)

  ---------------------

  1536= 100mhz(3.9us)

  2048= 133mhz(3.9us)

  2560= 166mhz(3.9us)

  3072= 200mhz(3.9us)

  ---------------------

  3684= 100mhz(1.95us)

  4196= 133mhz(1.95us)

  4708= 166mhz(1.95us)

  0128= 200mhz(1.95us)

  如果采用Auto选项,主板BIOS将会查询内存上的一个很小的、名为“SPD”(Serial Presence Detect )的芯片。SPD存储了内存条的各种相关工作参数等信息,系统会自动根据SPD中的数据中最保守的设置来确定内存的运行参数。如过要追求最优的性能,则需手动设置刷新周期的参数。一般说来,15.6us适用于基于128兆位内存芯片的内存(即单颗容量为16MB的内存),而7.8us适用于基于256兆位内存芯片的内存(即单颗容量为32MB的内存)。注意,如果tREF刷新周期设置不当,将会导致内存单元丢失其数据。

  另外根据其他的资料显示,内存存储每一个bit,都需要定期的刷新来充电。不及时充电会导致数据的丢失。DRAM实际上就是电容器,最小的存储单位是bit。阵列中的每个bit都能被随机地访问。但如果不充电,数据只能保存很短的时间。因此我们必须每隔15.6us就刷新一行。每次刷新时数据就被重写一次。正是这个原因DRAM也被称为非永久性存储器。一般通过同步的RAS-only的刷新方法(行刷新),每行每行的依次刷新。早期的EDO内存每刷新一行耗费15.6us的时间。因此一个2Kb的内存每列的刷新时间为15.6?s x2048行=32ms。

  如果使用DFI的主板,tREF和tRAS一样,不是一个精确的数值。通常15.6us和3.9us都能稳定运行,1.95us会降低内存带宽。很多玩家发现,如果内存质量优良,当tREF刷新周期设置为3120=200mhz(?.??s)时,会得到最佳的性能/稳定性比。

Write CAS# Latency(tWCL)  

  可选的设置:Auto,1-8

  Write CAS Latency (tWCL),表示“ 写指令到行地址控制器延时 。SDRAM内存是随机访问的,这意味着内存控制器可以把数据写入任意的物理地址,大多数情况下,数据通常写入距离当前列地址最近的页面。tWCL表示写入的延迟,除了DDRII,一般可以设为1T,这个参数和大家熟悉的tCL(CAS-Latency)是相对的,tCL表示读的延迟。

DRAM Bank Interleave

  可选的设置:Enable, Disable

  DRAM Bank Interleave,表示“ DRAM Bank交错 。这个设置用来控制是否启用内存交错式(interleave)模式。Interleave模式允许内存bank改变刷新和访问周期。一个bank在刷新的同时另一个bank可能正在访问。最近的实验表明,由于所有的内存bank的刷新周期都是交叉排列的,这样会产生一种流水线效应。

  虽然interleave模式只有在不同bank提出连续的的寻址请求时才会起作用,如果处于同一bank,数据处理时和不开启interleave一样。CPU必须等待第一个数据处理结束和内存bank的刷新,这样才能发送另一个地址。目前所有的内存都支持interleave模式,在可能的情况下我们建议打开此项功能。

  对于DFI主板来说,任何情况下该设置都应该是Enable,可以增大内存的带宽。Disable对将减少内存的带宽,但使系统更加稳定。

DQS Skew Control

  可选的设置:Auto,Increase Skew,Decrease Skew

  DQS Skew Control,表示“ DQS时间差控制 。稳定的电压可以使内存达到更高的频率,电压浮动会引起较大的时间差(skew),加强控制力可以减少skew,但相应的DQS(数据控制信号)上升和下降的边缘会出现电压过高或过低。一个额外的问题是高频信号会引起追踪延迟。DDR内存的解决方法是通过简单数据选通脉冲来增加时钟推进。

  DDRII引进了更先进的技术:双向的微分I/O缓存器来组成DQS。微分表示用一个简单脉冲信号和一个参考点来测量信号,而并非信号之间相互比较。理论上提升和下降信号应该是完全对成的,但事实并非如此。时钟和数据的失谐就产生了DQ-DQS skew。

  如下图所示。

  对于DFI主板来说,建议设置为Increase Skew可以提升性能,而Decrease Skew在牺牲一定性能的情况下,可以增加稳定性。

DQS Skew Value

  可选的设置:Auto,0-255,步进值为1。

  当我们开启了DQS skew control后,该选项用来设定增加或减少的数值。这个参数对系统的影响并不很敏感。 对于DFI主板来说,开启"Increase Skew"选项后,可以将该值设为50-255之间的值。值越大,表示速度越快。

DRAM Drive Strength

  可选的设置:Auto,1-8,步进值为1。

  DRAM Drive Strength(也被称为:driving strength),表示“ DRAM驱动强度 。这个参数用来控制内存数据总线的信号强度,数值越高代表信号强度越高,增加信号强度可以提高超频的稳定性。但是并非信号强度高就一定好,三星的TCCD内存芯片在低强度信号下性能更佳。

  如果设为Auto,系统通常会设定为一个较低的值。对使用TCCD的芯片而言,表现会好一些。但是其他的内存芯片就并非如此了,根据在DFI NF4主板上调试和测试的结果,1、3、5 、7都是性能较弱的参数,其中1是最弱的。2、4、6、8是正常的设置,8提供了最强的信号强度。TCCD建议参数为3、5或7,其他芯片的内存建议设为6或8。

  DFI用户建议设置:TCCD建议参数为3、5、7,其他芯片的内存建议设为6或8。

DRAM Data Drive Strength

  可选的设置:Auto,1-4,步进值为1。

  DRAM Data Drive Strength表示“ DRAM数据驱动强 度”。这个参数决定内存数据总线的信号强度,数值越高代表信号强度越高。它主要用于处理高负荷的内存读取时,增加DRAM的驾驭能力。因此,如果你的系统内存的读取负荷很高,则应将该值设置为高(Hi/High)。它有助于对内存数据总线超频。但如果你并没有超频,提升内存数据线的信号强度,可以提高超频后速度的稳定性。此外,提升内存数据总线的信号强度并不能增强SDRAM DIMM的性能。因此,除非你内存有很高的读取负荷或试图超频DIMM,建议设置DRAM Data Drive Strength的值为低(Lo/Low)。

  要处理大负荷的数据流时,需要提高内存的驾驭能力,你可以设为Hi或者High。超频时,调高此项参数可以提高稳定性。此外,这个参数对内存性能几乎没什么影响。所以,除非超频,一般用户建议设为Lo/Low。

   DFI用户建议设置:普通用户建议使用level 1或3,如果开启了CPC,可能任何高于1的参数都会不稳定。部分用户开启CPC后能运行在3。更多的人关闭CPC后2-4都能够稳定运行。当然最理想的参数是开启CPC后设为level4。

Strength Max Async Latency

  可选的设置:Auto,0-15,步进值为1。

  Strength Max Async Latency目前还没能找到任何关于此项参数的说明,不知道其功能。感觉网友的经验,在进行Everest的LatencyTest时,可以看出一些差别。在我的BH-6上,参数从8ns到7ns在Latency Test的测试结果中有1ns的区别。从7ns调低6ns后,测试结果又减少了2ns。

  DFI主板建议设置:BIOS中的默认值为7ns,建议大家在5-10之间调节。6ns对内存的要求就比较高了,建议使用BH-5和UTT芯片的用户可以尝试一下,但对TCCD不适用。7ns的要求低一些,UTT和BH-5设为7n比较适合超频。8ns对UTT和BH-5就是小菜一碟,8ns时TCCD通常能稳定运行在DDR600,如果想超频到DDR640就必须设为9ns甚至更高了。

Read Preamble Time

  可选的设置:Auto,2.0-9.5,步进值为0.5。

  Read Preamble Time这个参数表示DQS(数据控制信号)返回后,DQS又被开启时的时间间隔。Samsung早期的显存资料显示,这个参数是用以提升性能的。DQS信号是双向的,无论从图形控制器到DDR SGRAM还是从DDR SGRAM到图形控制器都起作用。

  DFI主板建议设置:BIOS中的该值设置为Auto时,实际上此时执行的是默认值5.0。建议大家在4.0-7.0之间调节,该值越小越好。

Idle Cycle Limit

  可选的设置:Auto,0-256,无固定步进值。

  Idle Cycle Limit这个参数表示“ 空闲周期限制” 。这个参数指定强制关闭一个也打开的内存页面之前的memclock数值,也就是读取一个内存页面之前,强制对该页面进行重充电操作所允许的最大时间。

  DFI主板建议设置:BIOS中的该值设置为Auto时,实际上此时执行的是默认值256。质量好的内存可以尝试16-32,华邦(WINBOND)BH-5颗粒的产品能稳定运行在16。Idle Cycle Limit值越低越好。

Dynamic Counter

  可选的设置:Auto, Enable, Disable。

  Dynamic Counter这个参数表示“ 动态计数器 。这个参数指定开启还是关闭动态空闲周期计数器。如果选择开启(Enable),则会每次进入内存页表(Page Table)就强制根据页面冲突和页面错误(conflict/page miss:PC/PM)之间通信量的比率而动态调整Idle Cycle Limit的值。这个参数和前一个Idle Cycle Limit是密切相关的,启用后会屏蔽掉当前的Idle Cycle Limit,并且根据冲突的发生来动态调节。

  DFI主板建议设置:BIOS中的该值设置为Auto和关闭和一样的。打开该设置可能会提升性能,而关闭该设置,可以使系统的更稳定。

R/W Queue Bypass

  可选的设置:Auto,2x,4x,8x,16x。

  R/W Queue Bypass表示“ 读/写队列忽略 。这个参数指定在优化器被重写及DCI (设备控制接口:Device Control Interface)最后一次的操作被选定前,忽略操作DCI的读/写队列的时间。这个参数和前一个Idle Cycle Limit是相类似,只是优化器影响内存中的读/写队列。

  DFI主板建议设置:BIOS中的该值默认为16x。如果你的系统稳定,则保留该值。但如果不稳定,或者要超频,就只有降低到8x甚至更低的4x或2x。该值越大,则说明系统性能越强,该值越小,则会是系统越稳定。

Bypass Max

  可选的设置:Auto, 0x-7x, 步进值为1。

  Bypass Max表示“ 最大忽略时间 。这个参数表示优化器选择否决之前,最后进入DCQ(Dependence Chain Queue)的可以被优化器忽略的时间。仔细研究后,我觉得这个参数会影响内存到CPU内存控制器的连接。

  DFI主板建议设置:BIOS中的该值默认为7x。建议4x或7x,两者都提供了很好的性能及稳定性。如果你的系统稳定,则保留该值。但如果不稳定,或者要超频,就只有降低到8x甚至更低的4x或2x。该值越大,则说明系统性能越强,该值越小,则会是系统越稳定。

32 Byte Granulation

  可选的设置:Auto,Disable (8burst),Enable(4burst)。

  32 Byte Granulation表示" 32位颗粒化 "。当该参数设置为关闭(Disable)时,就可以选择突发计数器,并在32位的数据存取的情况下,最优化数据总线带宽。因此该参数关闭后可以达到最佳性能的目的。

  DFI主板建议设置:绝大多数情况下,建议选择Disable(8burst)选项。开启Enable (4burst)可以使系统更稳定一些。

第三部分 超强的内存芯片

  上述参数的设置不可能适用于每位用户。不同的内存芯片的电压、参数都不同,所以超频能力也不一样。下面给出超频能力很强的一些内存芯片,建议大家在选购时多加以留意。

·Winbond(华邦)系列颗粒::BH-5、CH-5、BH-6、CH-6 、UTT;

·Hynix(现代)系列颗粒:D43、D5;

·Micron(镁光)系列颗粒:-5B C、-5B G;

·Infineon(英飞凌)系列颗粒:B5、BT-6、BT-5、CE-5、BE-5;

·Samsung(三星)系列颗粒:TCB3、TCCC、TCC4、TCC5、TCCD。

 

二:DDR操作

 

1 相关原理

DDR3内部相当于存储表格,和表格的检索相似,需要先指定

行地址(row),再指定列地址(column),这样就可以准确的找到需要的单元格。对于DDR3内存,单元格称为基本存储单元(也就是每次能从该DDR3芯片读取的最小数据),存储表格称为逻辑bank(DDR3内存芯片都是8bank,也就是说有8个这样的存储表格)

所以寻址的流程是先指定bank地址,再指定行地址(row),最后指列地址(column)来确定基本存储单元,每个基本存储单元的大小等于该DDR3芯片的数据线位宽,也就是每次能从单个DDR3芯片读取的最小数据长度

2 地址线和内存容量分析

由上文可知要寻址DDR3芯片的基本存储单元需要指定3个地址:

bank地址,行地址(row),列地址(column)

下面以三星MT41J1G4MT41J512M8MT41J256M16进行分析

MT41J1G4 128 Meg x 4 x 8 banks

MT41J512M8 64 Meg x 8 x 8 banks

MT41J256M16 32 Meg x 16 x 8 banks

三个型号的容量都是一样,仅仅只是数据线位宽不一样,从上述扩展命名可以分析DDR3芯片的地址线数量,数据线位宽,整体容量

比如:

MT41J256M16 - 32 Meg x 16 x 8 banks

单个DDR3芯片内部有8banks因此有3bank地址线BA0,BA1,BA2

每个bank大小是32M*16 bit = 64MB

16根数据线即基本存储单元是16bit

每个bank32M个基本存储单元,总共有32M*8=256M个地址

datasheet分析有15bit row地址和10bit column地址。但是芯片只提供了15根地址线,不够25根。

其实原因是行地址线RA0-RA14和列地址线CA0-CA9地址线分时共用(反正是先取行地址再取列地址)所以只需要15根地址线就可以

每个bank总共有2^15 * 2^10 = 32M个基本存储单元

然后每个基本单元的大小是16bit所以总大小是32M*16bit*8 = 4Gbit

MT41J512M8 64 Meg x 8 x 8 banks 

单个DDR3芯片内部有8banks因此有3bank地址线BA0,BA1,BA2

每个bank大小是64M*8bit = 64MB

8根数据线即基本存储单元是8bit

每个bank64M个基本存储单元,总共有64M*8=512M个地址

datasheet分析有16bit row地址和10bit column地址。但是芯片只提供了16根地址线,不够26根。

原因也是行地址线RA0-RA15和列地址线CA0-CA9地址线分时共用

所以只需要16根地址线就可以

每个bank总共有2^16* 2^10 = 64M个基本存储单元

然后每个基本单元的大小是8bit所以总大小是64M * 8bit*8 = 4Gbit

MT41J1G4 128 Meg x 4 x 8 banks

单个DDR3芯片内部有8banks

每个bank大小是128M* 4bit = 64MB

4根数据线即基本存储单元是4bit

每个bank128M个基本存储单元,总共是128M*8=1G个的地址

datasheet分析有16bit row地址和11bit column地址

由于行地址线RA0-RA15和列地址线CA0-CA9CA11地址线分时共用

所以只需要16根地址线就可以

每个bank总共有2^16* 2^11 = 128M个基本存储单元

然后每个基本单元的大小是4bit所以总大小是128M *4bit*8 = 4Gbit

 

注意DDR3芯片的PAGESIZE = 2^column * 数据线位宽/8

由此可知

MT41J1G4 128 Meg x 4 x 8 banks

PAGESIZE = 2^11 * 4/8 = 1KB

MT41J512M8 64 Meg x 8 x 8 banks

PAGESIZE = 2^10 * 8/8 = 1KB

MT41J256M16 32 Meg x 16 x 8 banks

PAGESIZE = 2^10 * 16/8 = 2KB

 

 

3  DDR3控制器16bit/32bit概念

这儿所说的16bit/32bit指的是整个内存控制器以多长为单位进行存储,而不是单个DDR3芯片的基本存储单元

32bit表示内存控制器以32bit为单位访问内存,即给定一个内存地址。内存芯片会给内存控制器 32bit的数据到数据线上,当然该32bit数据可能不来自同一个DDR3芯片上,16bit与此类似

下面分析用两个16bitDDR3内存如何拼成32bitDDR3

第一片16bit DDR3BA0,BA1,BA2连接CPUBA0, BA1, BA2
第二片16bit DDR3 BA0,BA1,BA2连接CPU BA0, BA1, BA2
第一片16bit DDR3A0~A13连接CPUA0~A13
第二片16bit DDR3A0~A13连接CPUA0~A13
第一片16bit DDR3D0~D15连接CPUD0~D15
第二片16bit DDR3D0~D15连接CPUD16~D31

分析下该实例。
bank地址线是3bit所以单个16bit DDR3内部有8bank.
行地址(row)A0~A1314bit说明每个bank2^14
列地址(column)A0~A910bit说明每个bank2^10

每个bank大小是2^14 * 2^10 * 16 = 16M * 16bit = 32MB

每个bank16M个基本存储单元,总共有16M*8=128M个地址

单个芯片总大小是 32MB * 8 = 256MB      



从前面的连线可知两块16bit DDR3BA0~BA2D0~D14是并行连接到内存控制器,所以内存控制器认为只有一块内存,访问的时候按照BA0~BA2A0~A13给出地址。两块16bit DDR3都收到了该地址,给出的反应是要么将给定地址上的2个字节读到数据线上,要么是将数据线上的两个字节写入到指定的地址。

此时内存控制认为自己成功的访问的了一块32bit的内存,

所以内存控制器每给出一个地址,将访问4个字节的数据,读取/写入。这4字节数据对应到内存控制器的D0~D31,又分别被连接到两片DDR3芯片的D0~D15,这样32bit就被拆成了两个16bit分别去访问单个DDR3芯片的基本存储单元。

注意:尽管DDR3芯片识别的地址只有128M个,但由于内存控制器每访问一个内存地址,将访问4个字节数据,所以对于内存控制器来说,能访问的内存大小仍是512M,只不过在内存控制器将地址传给DDR3芯片时,低两位被忽略,也就是说DDR3芯片识别的地址只有128M个。
比如内存控制器访问地址0x000000000x000000010x000000020x00000003,但对DDR3来说,都是访问地址0x00000000

4 内存映射的概念

上文中的内存寻址主要讲的是内存控制器如何去访问DDR3芯片基本存储单元

 

本文中的内存映射主要讲的是如何将内存控制器管理的DDR3芯片地址空间映射到SOC芯片为DDR3预留的地址范围。比如基于ARMSOC芯片,DDR3的预留地址一般都是0x80000000,如果没有使用内存映射,SOC去访问0x80000000地址时会造成整个系统崩溃,因为访问的地址并不存在实际的内存

 

DDR3控制器有两种映射模式:非交织映射和交织映射(interlave).

交织映射,即双通道内存技术,当访问在控制器A上进行时,控制器B为下一次访问做准备,数据访问在两个控制器上交替进行,从而提高DDR吞吐率。支持128byte,256byte,512byte的交织模式。如果要使用交织模式,要保证有两个内存控制器以及两个内存控制器有对称的物理内存(即两块内存大小一致;在各自的控制器上的地址映射一致)

非交织映射,即两个内存控制器的内存映射在各自的映射范围内线性递增。对于只存在1个内存控制器或者只使用1个内存控制器时则只能使用非交织的线性映射模式。

5 内存映射具体介绍

下面以DM385DM8168来介绍内存映射

DM3851DDR控制器EMIF0支持JEDEC标准的DDR2,DDR3芯片.

当然DM385只能使用非交织映射模式

数据总线支持16bit32bit.

DM3854个内存映射寄存器,所以最多可以映射4段地址空间

DMM_LISA_MAP__0, DMM_LISA_MAP__1,

DMM_LISA_MAP__2, DMM_LISA_MAP__3

下图是该寄存器的具体介绍

SYS_ADDR:  映射到SOC系统上的物理地址,

比如需要映射到0x8000000SYS_ADDR = 80

SYS_SIZE:   映射的内存大小,讲的是主要给系统映射了多大的内存

SDRC_INTL: 是否使用交织模式,以及使用何种交织模式映射

SDRC_MAP: 交织映射则为3,否则为1或者2

SDRC_ADDR:内存控制器的高位地址即没有映射前他的内存地址

           一般都是从0x00000000开始

下面是我们DM385板卡的内存映射

#define DDR3_DMM_LISA_MAP__0  0x00

#define DDR3_DMM_LISA_MAP__1  0x00

#define DDR3_DMM_LISA_MAP__3  0x80400100

#define DDR3_DMM_LISA_MAP__4  0xB0400110

使用了两个映射寄存器,所以主要映射了两段地址空间

           

从上图可以看出来

第一段映射是将EMIF00x00000000映射到SOC系统地址0x8000000上,映射长度为256MB

第二段映射是将EMIF00x10000000映射到SOC系统地址0xB000000上,映射长度为256MB

下图是访问模式,线性访问物理地址

 

由于DM385只有一个内存控制器EMIF0所以只能非交织映射

当然对于上述映射方式可以变为如下映射

#define DDR3_DMM_LISA_MAP__0  0x00

#define DDR3_DMM_LISA_MAP__1  0x00

#define DDR3_DMM_LISA_MAP__3  0x00

#define DDR3_DMM_LISA_MAP__4  0x80500100

EMIF00x00000000映射到SOC系统地址0x80000000,映射长度是512MB

 

6 DM8168内存映射

2DDR控制器EMIF0EMIF1,支持JEDEC标准的DDR2,DDR3芯片

DM8168支持非交织模式映射和交织模式映射

数据总线支持16bit32bit.

DM81684个内存映射寄存器,所以最多可以映射4段地址空间

下面是我们DM8168板卡的内存映射

#define DDR3_DMM_LISA_MAP__0  0x00

#define DDR3_DMM_LISA_MAP__1  0x00

#define DDR3_DMM_LISA_MAP__3  0x80640300

#define DDR3_DMM_LISA_MAP__4  0xC0640320

使用了两个映射寄存器,所以主要映射了两段地址空间

    

从上图可知

第一段映射是将EMIF0EMIF10x0000000交织映射到SOC系统的0x80000000,对于系统来说了总共映射了1GB的大小,从EMIF0映射了512MB,EMIF1映射了512MB

第二段映射是将EMIF0EMIF10x2000000交织映射到SOC系统的0xC0000000,对于系统来说了总共映射了1GB的大小,从EMIF0映射了512MB,EMIF1映射了512MB

下图是访问模式,交织访问物理地址,128字节交替映射,在交织访问模式下,系统送出的物理地址在两个内存控制器上交替访问

当然也可以使用如下非交织映射

 

#define DDR3_DMM_LISA_MAP__0  0x00

#define DDR3_DMM_LISA_MAP__1  0x00

#define DDR3_DMM_LISA_MAP__3  0x80600100

#define DDR3_DMM_LISA_MAP__4  0xC0600200

EMIF00x00000000映射到SOC系统地址0x80000000,映射长度是1GB

EMIF10x00000000映射到SOC系统地址0xC0000000,映射长度是1GB

使用下图的线性访问模式

 

7 DDR3引脚描述

4bit8bit位宽芯片一般采用78FBGA封装

16bit位宽芯片一般采用96FBGA封装

下列信号方向都是针对DDR3芯片来说的

A0-A9,A10/AP,A11,A12/BC#,A13,A14    input

地址输入信号,行地址线和列地址线分时使用

A10/AP 表示PRECHARGE命令期间对某个bank预充电auto-precharge

A10为低则有BA[0,2]来决定哪个bank进行auto-prechargeA10为高电平表示对所有bank进行auto-precharge

 

BA0,BA1,BA2                       input

bank地址输入信号,三个bank地址线表明该DDR3内部有8bank

LOAD MODE命令期间定义DDR3芯片使用哪个模式(MR0,MR1,MR2)

 

CK,CK#                            input

差分时钟输入,所有控制和地址输入信号在CK上升沿和CK#的下降沿交叉处被采样,输出数据选通(DQS,DQS#)参考CKCK#的交叉点

 

CKE                               input

时钟使能信号,高电平有效,CKE为低电平时提供PRECHARGE POWN-DOWNSELF REFRESH操作(对所有bank里行有效)

CS#                               input

片选使能信号当CS#为高的时候,所有的命令被屏蔽,CS#提供了多RANK系统的RANK选择功能,CS#是命令代码的一部分

 

DM(mask)                           input

数据输入屏蔽,每8bit数据对应一个DM信号,在写期间,当伴随输入数据的DM信号被采样为高的时候,这8bit的输入数据视为无效。

DM信号相当于就是掩码控制位,该信号在读操作时没有用:比如在读32bit数据,但只需要8bit数据,在软件里将高24bit0就行,有没有DM信号都关系不大,但执行写操作时,如果没有DM信号,可能程序只需要写8bit数据,但是物理连接是32bitDDR3,只要WR信号有效,32bit数据就全部写到DDR3里边去了,高24bit数据就被覆盖了,有了DM信号它对应的8bit数据就会被忽略,这样就不会覆盖其他数据了

对于4bit位宽DDR3,两个芯片共用一个DM信号,对于8bit位宽DDR3芯片一个芯片占用一个DM信号,对于16bit位宽DDR3芯片则需要2DM信号

虽然DM仅作为输入脚,但是,DM负载被设计成与DQDQS脚负载相匹配。DM的参考是VREFCADM可选作为TDQS

 

ODT                                 input

片上终端使能。ODT使能(高)和禁止(低)片内终端电阻。在正常操作使能的时候,ODT仅对下面的管脚有效:DQ[15:0],DQS,DQS#DM。如果通过LOAD MODE命令禁止,ODT输入被忽略

 

RAS#,CAS#,WE#                        input

命令输入,这三个信号,连同CS#用来定义一个命令

 

RESET#                               input

复位,低有效,参考是VSS

 

DQ0-DQ7/ DQ0-DQ15                   I/O

数据输入/输出。双向数据

 

DQS,DQS#                             I/O

数据选通。读时是输出,边缘与读出的数据对齐。写时是输入,中心与写数据对齐。

DQSDDR中的重要功能,它的功能主要用来在一个时钟周期内准确的区分出每个传输周期,并便于接收方准确接收数据。每8bit数据都有一个DQS信号线,它是双向的,在写入时它用来传送由内存控制器发来的DQS信号,读取时,则由芯片生成DQS向内存控制器发送。完全可以说,它就是数据的同步信号。 

在读取时,DQS与数据信号同时生成(也是在CKCK#的交叉点)。而DDR内存中的CL也就是从CAS发出到DQS生成的间隔,DQS生成时,芯片内部的预取已经完毕了,由于预取的原因,实际的数据传出可能会提前于DQS发生(数据提前于DQS传出)。

DQS在读取时与数据同步传输

而在接收方,一切必须保证同步接收,不能有偏差。这样在写入时,芯片不再自己生成DQS,而以发送方传来的DQS为基准,并相应延后一定的时间,在DQS的中部为数据周期的选取分割点(在读取时分割点就是上下沿),从这里分隔开两个传输周期。这样做的好处是,由于各数据信号都会有一个逻辑电平保持周期,即使发送时不同步,在DQS上下沿时都处于保持周期中,此时数据接收触发的准确性无疑是最高的。 

 

TDQS,TDQS#                           output

终端数据选通。当TDQS使能时,DM禁止,TDQSTDDS提供终端电阻。

VDD

电源电压,1.5V+/-0.075V

VDDQ

DQ电源,1.5V+/-0.075V。为了降低噪声,在芯片上进行了隔离

VREFCA

数据的参考电压。VREFDQ在所有时刻(除了自刷新)都必须保持规定的电压

VSS

VSSQ

DQ地,为了降低噪声,在芯片上进行了隔离

ZQ

输出驱动校准的外部参考。这个脚应该连接240ohm电阻到VSSQ

 

 

 

2016-10-18 14:18:58 zpzyf 阅读数 3021

内存(内置):DDR 32MB
CPU架构:ARM926EJ-S
CPU频率:192Mhz
操作系统:linux-2.6.35.4
交叉编译器:arm-linux-gcc-4.2
其他特性请参考http://blog.csdn.net/zpzyf/article/details/52222920

Init RTC....OK
DDR size: 32MB
SD Port0 Booting Fail - No Check ID
NAND Booting (2K-page 5 Address Cycle) Success
Clock Skew
 DQSODS 0x1010
 CKDQSDS 0x888800
Code Executes at 0x00900000
Nand Boot Loader ..
Get NANDLoader image from block 0x0 ..
Load file length 0x4BB740, execute address 0x0
Linux version 2.6.35.4 (root@zpzyf) (gcc version 4.2.1) #6 PREEMPT Thu Oct 13 15:03:56 CST 2016
CPU: ARM926EJ-S [41069265] revision 5 (ARMv5TEJ), cr=00053177
CPU: VIVT data cache, VIVT instruction cache
Machine: W55FA93
Memory policy: ECC disabled, Data cache writeback
CPU type 0x00fa5c30 is W55FA93
w55fa93_external_clock  = 12.0 MHz
w55fa93_apll_clock      = 72000 KHz
w55fa93_upll_clock      = 192000 KHz
w55fa93_system_clock    = 192000 KHz
w55fa93_cpu_clock       = 192000 KHz
w55fa93_ahb_clock       = 96000 KHz
w55fa93_apb_clock       = 48000 KHz
Built 1 zonelists in Zone order, mobility grouping on.  Total pages: 8128
Kernel command line: root=/dev/ram0 console=ttyS1,115200n8 rdinit=/sbin/init mem=32M vt.global_cursor_default=0
PID hash table entries: 128 (order: -3, 512 bytes)
Dentry cache hash table entries: 4096 (order: 2, 16384 bytes)
Inode-cache hash table entries: 2048 (order: 1, 8192 bytes)
Memory: 32MB = 32MB total
Memory: 21600k/21600k available, 11168k reserved, 0K highmem
Virtual kernel memory layout:
    vector  : 0xffff0000 - 0xffff1000   (   4 kB)
    fixmap  : 0xfff00000 - 0xfffe0000   ( 896 kB)
    DMA     : 0xff600000 - 0xffe00000   (   8 MB)
    vmalloc : 0xc2800000 - 0xe0000000   ( 472 MB)
    lowmem  : 0xc0000000 - 0xc2000000   (  32 MB)
    modules : 0xbf000000 - 0xc0000000   (  16 MB)
      .init : 0xc0008000 - 0xc013a000   (1224 kB)
      .text : 0xc013a000 - 0xc049f000   (3476 kB)
      .data : 0xc04a0000 - 0xc04bb6c0   ( 110 kB)
Hierarchical RCU implementation.
        RCU-based detection of stalled CPUs is disabled.
        Verbose stalled-CPUs detection is disabled.
NR_IRQS:32
Console: colour dummy device 80x30
console [ttyS1] enabled
Calibrating delay loop... 95.64 BogoMIPS (lpj=478208)
pid_max: default: 32768 minimum: 301
Mount-cache hash table entries: 512
CPU: Testing write buffer coherency: ok
devtmpfs: initialized
NET: Registered protocol family 16
bio: create slab <bio-0> at 0
SCSI subsystem initialized
usbcore: registered new interface driver usbfs
usbcore: registered new interface driver hub
usbcore: registered new device driver usb
Advanced Linux Sound Architecture Driver Version 1.0.23.
cfg80211: Calling CRDA to update world regulatory domain
Switching to clocksource w55fa93-timer1
NET: Registered protocol family 2
IP route cache hash table entries: 1024 (order: 0, 4096 bytes)
TCP established hash table entries: 1024 (order: 1, 8192 bytes)
TCP bind hash table entries: 1024 (order: 0, 4096 bytes)
TCP: Hash tables configured (established 1024 bind 1024)
TCP reno registered
UDP hash table entries: 256 (order: 0, 4096 bytes)
UDP-Lite hash table entries: 256 (order: 0, 4096 bytes)
NET: Registered protocol family 1
register clock device
w55fa93_edma_init
ROMFS MTD (C) 2007 Red Hat, Inc.
msgmni has been set to 42
io scheduler noop registered (default)
---w55fa93fb_init ----w55fa93 frame buffer init 
###########w55fa93 frame buffer probe############
1*** fbi->fb->fix.smem_len = 0x4b000
check_var(var=c1c87020, info=c1c87000)
w55fa93fb_set_par !!! ================= 
Console: switching to colour frame buffer device 40x30
w55fa93 LCD driver has been installed successfully
w55fa93 SysMgr driver has been initialized successfully!
93BLT major_no = 252, minor_no = 0
w55fa93 BLT driver has been initialized successfully!
W55FA93 uart driver has been initialized successfully!
w55fa93-uart0: ttyS0 at MMIO 0xb8008000 (irq = 13) is a W55FA93
w55fa93-uart1: ttyS1 at MMIO 0xb8008100 (irq = 24) is a W55FA93
brd: module loaded
loop: module loaded
w55fa93 mtd nand driver version: 20141219
NAND Flash ID: 01 DA 90 95 44 01 DA 90 
Probe chip: writesize=2048 erasesize=131072, oobsize=64
NAND device: Manufacturer ID: 0x01, Chip ID: 0xda (AMD NAND 256MiB 3,3V 8-bit)
SYSTEM: USE BCH_T4 HWECC algorithm(SMRA size: 64, Parity number:32 bytes)
EXECUTE: USE BCH_T8 HWECC algorithm(SMRA size: 64, Parity number:60 bytes)
USE BCH_T8 HWECC algorithm(Parity number:60 bytes)
chip->ecc.bytes = 0x3c !!!!
Scanning device for bad blocks
(0x00000000)BCH change to BCH_T4: 32B
(0x00080000)BCH change to BCH_T8: 60B
Creating 4 MTD partitions on "NAND 256MiB 3,3V 8-bit":
0x000000000000-0x000000080000 : "SYSTEM"
0x000000080000-0x000001080000 : "EXECUTE"
0x000001080000-0x000003080000 : "NAND1-1"
0x000003080000-0x000010000000 : "NAND1-2"
fmi-sm: registered successfully! 
rtl8150: v0.6.2 (2004/08/27):rtl8150 based usb-ethernet driver
usbcore: registered new interface driver rtl8150
ohci_hcd: USB 1.1 'Open' Host Controller (OHCI) Driver
Init CONFIG_W55FA93_USB_HOST_LIKE_PORT2
ohci_hcd_w55fa93_drv_probe
usb_hcd_w55fa93_probe
get_pll
External clock = 12MHz
NF: 32, NR: 2, NO: 1
PLL is 192   ---
div1 = 1
div0 = 1
div0 = 2
div0 = 3
div0 = 4
Div1 = 0,  Div0 = 3
USBH IP  Reset
CONFIG_W55FA93_USB_HOST_LIKE_PORT1
w55fa93-ohci w55fa93-ohci: Nuvoton W55FA93 OHCI Host Controller
w55fa93-ohci w55fa93-ohci: new USB bus registered, assigned bus number 1
w55fa93-ohci w55fa93-ohci: irq 18, io mem 0xb1009000
ohci_w55fa93_start
hub 1-0:1.0: USB hub found
hub 1-0:1.0: 2 ports detected
USB device plug in
Initializing USB Mass Storage driver...
usbcore: registered new interface driver usb-storage
USB Mass Storage support registered.
w55fa93_udc_probe 20150209
mice: PS/2 mouse device common for all mice
input: W55FA93 TouchScreen as /class/input/input0
input: W55FA93 Keypad as /class/input/input1
W55FA93 keypad driver has been initialized successfully!
w55fa93-rtc w55fa93-rtc: rtc core: registered w55fa93-rtc as rtc0
Init Nuvoton RTC!
i2c_adap_w55fa93_init
w55fa93_i2c_probe()
w55fa93-i2c w55fa93-i2c: bus frequency set to 100 KHz
w55fa93-i2c w55fa93-i2c: Add W55FA93 I2C port adapter
Linux video capture interface: v2.00
memory allocate for port 1Planar buf 0 Phys addr = 0x4dc000
Planar buf 0 Virt addr = 0xc04dc000
Planar buf 1 Phys addr = 0x69f000
Planar buf 1 Virt addr = 0xc069f000
Planar buf 2 Phys addr = 0x862000
Planar buf 2 Virt addr = 0xc0862000
Packet buf 0 Phys addr = 0xa25000
Packet buf 0 Virt addr = 0xc0a25000
Packet buf 1 Phys addr = 0xa4b800
Packet buf 1 Virt addr = 0xc0a4b800
Packet buf 2 Phys addr = 0xa72000
Packet buf 2 Virt addr = 0xc0a72000
SnrPowerDown
1-3
REG_GPBFUN = 0xfc000000
jpegcodec_init
W55FA93 MMC/SD driver (20141219) has been initialized successfully!
SDHC card will run under 24MHz clock on SD port.
w55fa93evb_asoc_dev = 0xc1f251a0 !!! 
asoc: W55FA93_DAC HiFi <-> w55fa93-spu mapping ok
ret = 0x0 !!!, platform device added 
******* global g_pw55fa93_adc_data address = 0xc1f33aa0
 0 = platform_driver_register

asoc: W55FA93ADC HiFi <-> w55fa93adc_cpu_dai mapping ok
ALSA device list:
  #0: W55FA93_SPU (W55FA93_DAC)
  #1: mach-W55FA93_ADC (codecADC)
TCP cubic registered
NET: Registered protocol family 17
w55fa93-rtc w55fa93-rtc: setting system clock to 2005-01-06 05:30:41 UTC (1104989441)
Freeing init memory: 1224K
W55FA93 DEVMEM driver has been initialized successfully!
true: applet not found
yaffs: dev is 32505858 name is "mtdblock2" rw
yaffs: passed flags "inband-tags"
yaffs: dev is 32505859 name is "mtdblock3" rw
yaffs: passed flags "inband-tags"
mmc0: new high speed SDHC card at address 1234
mmc0: report SD insert event to sysmgr
mmcblk0: mmc0:1234 SA04G 3.63 GiB (ro)
 mmcblk0:
[Mount VFAT]: /dev/mmcblk0 --> /mnt/sdcard


BusyBox v1.15.2 (2016-10-12 10:02:42 CST) hush - the humble shell

这里写图片描述

2014-11-18 17:04:14 linbounconstraint 阅读数 519
一、Linux内核启动过程:

boot loader  == bios
1.启动boot:
启动是为了能在系统上加载并执行内核做准备。主要完成以下工作:
a.关中断、关看门狗
b.初始化CPU的工作时钟频率
c.初始化UART设备,用它来做终端设备
d.内存DDR2 SDRAM的初始化
e.NAND Flash设备的初始化

2.加载loader:
加载Linux操作系统的内核,再由内核完成操作系统的初始化。加载完操作系统并让内核开始执行,这以后是内核在接手系统的控制,bootloader程序就不再起作用了。

PC机的启动过程:
电脑加电后,CPU会完成自身的硬件初始化,并且做自测试(上电自举),CPU到一个预先定好的地址去取指令执行(这里是BIOS芯片的地址),在BIOS里设置有启动设备的信息,找到第一个启动设备,如果这是一个硬盘,之后会到它的MBR(主引导扇区)里取指令执行,然后它再找到硬盘的第一个活动分区(对windows来说一般是C盘,linux则是根目录的那个分区),从活动分区中找到启动加载程序(bootloader),这个程序在Linux上通常是LILO或者GRUB,GRUB程序执行以后回去找到硬盘上的LINUX内核并加载它,内核开始执行以后会初始化计算机上的其他的硬件设备,最后会挂载根文件系统,初始化用户程序运行环境(执行自启动脚本,或者开启一些服务程序),最后给用户一个登录界面,输入用户名和密码成功后,LINUX启动就完成了。

开发板的启动过程:
开发板上电,CPU硬件初始化,它一般先到0地址去取指令执行,tiny210板子的0地址对应的设备,是在S5PV210芯片内部的iRom的设备(里面是三星公司在CPU出厂前预先固化的一些程序) ,iRom中的程序主要完成以下工作:
a.初始化CPU时钟频率到默认的800MHz
b.初始化CPU内部的iRAM
c.根据启动拨码开关,找到第一个启动设备(NAND或者SD卡)
d.从第一个启动设备上加载头16K到iRAM中自动执行。
所以我们烧写到开发板上的程序的头16k会自动得到执行,这意味着:
<1>如果你的程序小于16K,你都不需要初始化SDRAM就可以执行你的程序。
<2>如果你的程序大于16K,你的程序只有一部分会得到执行,所以要调整你的链接脚本,把需要预先初始化好的设备的驱动链接到你的程序的头16K里(内存的初始化代码、nand的初始化代码),然后用它先把内存和nand初始化,再做自搬移(把程序自身从nand上搬运到内存上),然后在执行自身在内存上的这个拷贝。
使用上述方法让iRom帮我们执行程序,不论程序有多长。
后续的启动步骤与PC机类似。


二、我们自己的bootloader程序执行过程:
开发板上电,CPU从0地址取指令执行(iROM中的三星预先固化的程序先执行)==>iROM中的程序找到启动设备(SD/NAND)上的头16k,把它复制到iRAM上去执行==>iRAM中的头16k程序的第一条指令就是_start标号处的指令==>在链接脚本中设定了,入口是_start,所以第一条执行应从_start开始执行。
_start ==> 设置SVC模式的栈指针,为后续执行C函数做准备 ==> 关看门狗、关中断 ==> 初始化CPU时钟 ==> 初始化SDRAM内存 ==> 把栈指针指定到一个更宽裕的地方SDRAM ==> bl copy_myself 跳转到copymyself.c文件中的copy_myself函数做自拷贝,把程序自身从nand的0地址搬运到SDRAM内存上0x30000000的位置上, 暂时还未执行(后面再执行) ==>  ldr pc, =loader 跳转到main.c文件中的loader函数执行(loader函数就是我们刚才搬移到SDRAM中的代码) => loader函数中由mode_select()函数选择执行的模式(按下K1按键进入shell模式my_shell(),不按则正常加载内核load_os()) ==> 如果未按下K1,执行了load_os() ==> bootm() (在my_command.c文件中) ==> 在bootm中声明了一个带3个参数的函数指针 void (*fp)(int,int,int),第一个参数固定为0,第二个参数是开发板板号3466,第三个参数是内核启动参数(就是Uboot中的bootargs环境变量的值,它应该放在内存地址0x20000100位置上,以taglist一个链表的形式存在)==> fp()函数一旦启动了内核的执行,bootloader程序就不存在了。以后就是由linux内核在管理我们的计算机系统了。

烧写方法:
loadb 加载到0x21000000内存地址上,加载文件send app-sd.bin
nand erase 0x0 0x6000
nand write 0x21000000 0x0 0x6000

DDR内存时序指南

阅读数 1505

没有更多推荐了,返回首页