一、CPU访问芯片的条件

  

  CPU通过访问存储控制器,来读取外部设备的数据。

  CPU想访问一个芯片,需要如下条件(配置信息):

    • 地址线
    • 数据线:8位/16位/32位数据宽度
    • 时钟/频率 
    • 其他芯片相关的特性:比如SDRAM,有行地址、列地址和bank

  SDRAM的访问和表格检索的原理一样,先指定一个行(Row),再指定一个列(Columu),就可以准确找到所需要的单元格。这个单元格称为存储单元,这个表格(存储阵列)就是逻辑Bank(Logical Bank,即L-Bank),SDRAM一般含有4个L-bank。  

  

  只有配置好了存储管理器,才知道如何去访问外部的设备。

二、存储控制器访问SDRAM

  2.1 原理图

  

  CPU侧:

      

  

  

  

  

  可以看看这些引脚的功能,查看SDRAM的芯片手册。

  LADDR:地址接口

  

  LnWBE[0:3]:bank的操作方式

  

  LDATA:数据接口

  

  LnWE

  

  更多的看数据手册。

三、存储管理器的配置  

  • 位宽
  • 行列地址
  • 刷新周期

  详细寄存器可以查看DATASHEET。

四、2440启动方式

4.1 NAND FALSH启动

  

4.2 NOR FLASH

  

五、代码

  内存控制器初始化代码:

  这里我们是从nor flash启动,因此CONFIG_SYS_TEXT_BASE定义的参数为0x0。

  lowlevel_init.S (board\samsung\jz2440)

  1. 1 #define BWSCON 0x48000000
  2.  
  3. /* BWSCON */
  4. #define DW8 (0x0)
  5. #define DW16 (0x1)
  6. #define DW32 (0x2)
  7. #define WAIT (0x1<<2)
  8. #define UBLB (0x1<<3)
  9.  
  10. #define B1_BWSCON (DW32)
  11. #define B2_BWSCON (DW16)
  12. #define B3_BWSCON (DW16 + WAIT + UBLB)
  13. #define B4_BWSCON (DW16)
  14. #define B5_BWSCON (DW16)
  15. #define B6_BWSCON (DW32)
  16. #define B7_BWSCON (DW32)
  17.  
  18. /* BANK0CON */
  19. #define B0_Tacs 0x0 /* 0clk */
  20. #define B0_Tcos 0x0 /* 0clk */
  21. #define B0_Tacc 0x7 /* 14clk */
  22. #define B0_Tcoh 0x0 /* 0clk */
  23. #define B0_Tah 0x0 /* 0clk */
  24. #define B0_Tacp 0x0
  25. #define B0_PMC 0x0 /* normal */
  26.  
  27. /* BANK1CON */
  28. #define B1_Tacs 0x0 /* 0clk */
  29. #define B1_Tcos 0x0 /* 0clk */
  30. #define B1_Tacc 0x7 /* 14clk */
  31. #define B1_Tcoh 0x0 /* 0clk */
  32. #define B1_Tah 0x0 /* 0clk */
  33. #define B1_Tacp 0x0
  34. #define B1_PMC 0x0
  35.  
  36. #define B2_Tacs 0x0
  37. #define B2_Tcos 0x0
  38. #define B2_Tacc 0x7
  39. #define B2_Tcoh 0x0
  40. #define B2_Tah 0x0
  41. #define B2_Tacp 0x0
  42. #define B2_PMC 0x0
  43.  
  44. #define B3_Tacs 0x0 /* 0clk */
  45. #define B3_Tcos 0x3 /* 4clk */
  46. #define B3_Tacc 0x7 /* 14clk */
  47. #define B3_Tcoh 0x1 /* 1clk */
  48. #define B3_Tah 0x0 /* 0clk */
  49. #define B3_Tacp 0x3 /* 6clk */
  50. #define B3_PMC 0x0 /* normal */
  51.  
  52. #define B4_Tacs 0x0 /* 0clk */
  53. #define B4_Tcos 0x0 /* 0clk */
  54. #define B4_Tacc 0x7 /* 14clk */
  55. #define B4_Tcoh 0x0 /* 0clk */
  56. #define B4_Tah 0x0 /* 0clk */
  57. #define B4_Tacp 0x0
  58. #define B4_PMC 0x0 /* normal */
  59.  
  60. #define B5_Tacs 0x0 /* 0clk */
  61. #define B5_Tcos 0x0 /* 0clk */
  62. #define B5_Tacc 0x7 /* 14clk */
  63. #define B5_Tcoh 0x0 /* 0clk */
  64. #define B5_Tah 0x0 /* 0clk */
  65. #define B5_Tacp 0x0
  66. #define B5_PMC 0x0 /* normal */
  67.  
  68. #define B6_MT 0x3 /* SDRAM */
  69. #define B6_Trcd 0x1
  70. #define B6_SCAN 0x1 /* 9bit */
  71.  
  72. #define B7_MT 0x3 /* SDRAM */
  73. #define B7_Trcd 0x1 /* 3clk */
  74. #define B7_SCAN 0x1 /* 9bit */
  75.  
  76. /* REFRESH parameter */
  77. #define REFEN 0x1 /* Refresh enable */
  78. #define TREFMD 0x0 /* CBR(CAS before RAS)/Auto refresh */
  79. #define Trp 0x0 /* 2clk */
  80. #define Trc 0x3 /* 7clk */
  81. #define Tchr 0x2 /* 3clk */
  82. #define REFCNT 1113 /* period=15.6us, HCLK=60Mhz, (2048+1-15.6*60) */
  83. /**************************************/
  84.  
  85. .globl lowlevel_init
  86. lowlevel_init:
  87. /* memory control configuration */
  88. /* make r0 relative the current location so that it */
  89. /* reads SMRDATA out of FLASH rather than memory ! */
  90. /* 初始化内存 */
  91. ldr r0, =SMRDATA /* 将SMRDATA的首地址(第一个.long)内存单元数据放置到r0寄存器中 r0=eac */
  92. ldr r1, =CONFIG_SYS_TEXT_BASE /* CONFIG_SYS_TEXT_BASE=0x0(include/configs/jz2440中定义)
  93. 代码的基地址 */
  94. sub r0, r0, r1 /* r0 = r0 -r1 */
  95. ldr r1, =BWSCON /* Bus Width Status Controller,BWSCON=0x48000000,此文件中定义 */
  96. add r2, r0, #* /* 将SMRDATA这一块地址赋值给r2中 */
  97. :
  98. ldr r3, [r0], # /* 将r0的值代表的内存单元放入r3中,之后r0的值偏移4位 */
  99. str r3, [r1], # /* 将r3的值放入r1的值代表的地址中,r1的值代表的地址偏移4位 */
  100. cmp r2, r0 /* 比较r2 和 r0 ,若不相等则执行下一句*/
  101. bne 0b /* 向后跳转到标签0处*/
  102.  
  103. /* everything is fine now */
  104. mov pc, lr /* 返回 */
  105.  
  106. .ltorg
  107. /* the literal pools origin */
  108.  
  109. /*
  110. * 初始化存储控制器,经过此初始化之后,内存才可以使用
  111. */
  112. /* 地址为 0x00000eb0 */
  113. SMRDATA:
  114. .long 0x22011110 //BWSCON
  115. .long 0x00000700 //BANKCON0
  116. .long 0x00000700 //BANKCON1
  117. .long 0x00000700 //BANKCON2
  118. .long 0x00000700 //BANKCON3
  119. .long 0x00000740 //BANKCON4
  120. .long 0x00000700 //BANKCON5
  121. .long 0x00018005 //BANKCON6
  122. .long 0x00018005 //BANKCON7
  123. .long 0x008C04F4 //REFRESH
  124. .long 0x000000B1 //BANKSIZE
  125. .long 0x00000030 //MRSRB6
  126. .long 0x00000030 //MRSRB7

u-boot移植(七)---代码修改---存储控制器的更多相关文章

  1. u-boot移植(八)---代码修改---存储控制器--MMU

    一.MMU介绍 1.1 虚拟地址与物理地址 建立两个应用程序,hello1.c和hello2.c,然后运行: hello1.c hello2.c 运行结果如下: 可以看到两个结果打印的地址是一样的,都 ...

  2. -boot移植(十一)---代码修改---支持nandflash

    一.移植前的修改 1.1 include/configs/jz2440修改 原来的定义: 可以看出,要先定义CONFIG_CMD_NAND才能使能NANDFlash. 这个在我们文件中的82行有定义, ...

  3. u-boot移植(五)---代码修改---时钟修改、SDRAM

    最开始已经建立了新单板以及配置文件,现在就需要做的是代码的修改,配置成适合目标板使用的u-boot. 一.时钟修改 在代码流程分析中,我们知道,系统的启动是: 设置 CPU 为管理员模式 关闭看门狗 ...

  4. u-boot移植(十二)---代码修改---支持DM9000网卡

    一.准备工作 1.1 原理图 CONFIG_DM9000_BASE 片选信号是接在nGCS4引脚,若要确定网卡的基地址,则要根据片选信号的接口去确定. 在三星2440的DATASHEET中memory ...

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

    转自:http://blog.sina.com.cn/s/blog_5ddb672b0100fkcf.html 1.首先应该先了解Flash ROM的种类 NOR FLASH地址线和数据线分开,来了地 ...

  6. ok6410 u-boot-2012.04.01移植七完善u-boot移植(u-boot移植结束)

    继ok6410 u-boot-2012.04.01移植六后,开发板已支持MLC NAND.DM9000等.但还需要完善比如环境变量.mtdpart分区.裁剪.制作补丁等.下面的工作就是完善移植的u-b ...

  7. JZ2440 裸机驱动 第6章 存储控制器

    本章目标:     了解S3C2410/S3C2440地址空间的布局     掌握如何通过总线形式访问扩展的外设,比如内存.NOR Flash.网卡等 ························ ...

  8. Spring Boot (七): Mybatis极简配置

    Spring Boot (七): Mybatis极简配置 1. 前言 ORM 框架的目的是简化编程中的数据库操作,经过这么多年的发展,基本上活到现在的就剩下两家了,一个是宣称可以不用写 SQL 的 H ...

  9. spring boot / cloud (七) 使用@Retryable来进行重处理

    spring boot / cloud (七) 使用@Retryable来进行重处理 前言 什么时候需要重处理? 在实际工作中,重处理是一个非常常见的场景,比如:发送消息失败,调用远程服务失败,争抢锁 ...

随机推荐

  1. awk、sed、grep三大shell文本处理工具之grep的应用

    1.基本格式grep pattern [file...](1)grep 搜索字符串 [filename](2)grep 正则表达式 [filename]在文件中搜索所有 pattern 出现的位置, ...

  2. .gitignore & .DS_Store

    .gitignore & .DS_Store https://stackoverflow.com/questions/107701/how-can-i-remove-ds-store-file ...

  3. windows下 navicat_premium破解方法

    https://blog.csdn.net/qq_21205435/article/details/78902052

  4. codeforces631B

    Print Check CodeForces - 631B Kris works in a large company "Blake Technologies". As a bes ...

  5. BZOJ2120&2453数颜色——线段树套平衡树(treap)+set/带修改莫队

    题目描述 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会像你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色的画笔. 2 ...

  6. Dapper 连表查询

    实体类: UserInfo: public partial class UserInfo { public UserInfo() { this.Persion = new HashSet<Per ...

  7. MT【230】一道代数不等式

    设$a,b,c>0,$满足$a+b+c\le abc$证明:$\dfrac{1}{\sqrt{1+a^2}}+\dfrac{1}{\sqrt{1+b^2}}+\dfrac{1}{\sqrt{1+ ...

  8. 01 自学Aruba之功率单位和相对单位

    点击返回:自学Aruba之路 01 自学Aruba之功率单位和相对单位 功率单位是用来测量传输振幅和接受振幅的大小,功率单位测量的是绝对功率 相对单位是用来计算增加电缆或天线后的损耗和增益的大小,相对 ...

  9. 【BZOJ3512】DZY Loves Math IV(杜教筛)

    [BZOJ3512]DZY Loves Math IV(杜教筛) 题面 BZOJ 求 \[\sum_{i=1}^n\sum_{j=1}^m\varphi(ij)\] 其中\(n\le 10^5,m\l ...

  10. [luogu2144][bzoj1002][FJOI2007]轮状病毒【高精度+斐波那契数列+基尔霍夫矩阵】

    题目描述 轮状病毒有很多变种,所有轮状病毒的变种都是从一个轮状基产生的.一个N轮状基由圆环上N个不同的基原子和圆心处一个核原子构成的,2个原子之间的边表示这2个原子之间的信息通道.如下图所示 N轮状病 ...