Chinaunix首页 | 论坛 | 博客

XX

  • 博客访问: 504867
  • 博文数量: 281
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 562
  • 用 户 组: 普通用户
  • 注册时间: 2013-02-17 21:40
个人简介

XXX

文章分类

全部博文(281)

文章存档

2017年(1)

2015年(3)

2014年(117)

2013年(160)

我的朋友

分类: LINUX

2014-03-22 20:10:24

原文地址:裸机实验之存储控制器 作者:gc5084

知识点介绍:

       S3C2440中共有8bank每个bank的地址空间为128MB,总共1GBbank0数据位宽是由硬件选择,其他可由设置相应寄存器来改变。bank0bank5支持外接ROMSRAMbank6bank7还支持SDRAM(即开发板上的内存),且bank6bank7的地址空间大小是可变的。

       S3C2440对外引出27根地址线ADDR0ADDR26,访问空间128MB。同时还引出nGCS0-nGCS7,对应bank0bank7,当访问相应bank时。相应的nGCSx输出低电平选中外设。地址分布图如下。

Steppingstonecpu内部的RAM4KB。当cpu上电时硬件选择了从Nand flash启动则,硬件上则会将Nand flash中前4KB的数据复制到Steppingstone中,起始地址为0

 

使用SDRAM

       SDRAM需要连接到bank6或者bank7。开发板上使用的SDRAMHY57V561620,此SDRAM4个逻辑Bank(L-bank)组成,每个bank4M,数据宽度是16位。所以其容量为44MB2B32MB。开发板有两块SDRAM。数据宽度32位,则容量为64MB。连接如图:

 

因为板上SDRAM总容量为64MB,所以地址线用到26根。最末尾两位 LADDR24LADDR25连接SDRAMBA0BA1,用来选择SDRAM的逻辑bank。因为是32位数据宽度低两位LADDR0LADDR1没有使用。SDRAM的片选信号nSCS连接到cpunGCS6:nSCS0上所以使用的是Bank6

       SDRAM的访问步骤大致如下:

       1.cpu发出片选信号nSCS有效,SDRAM被选中。

       2.LADDR24LADDR25,选中SDRAM中的L-bank

       3.对被选中的芯片进行行列寻址。

       4.找到的存储单元的数据传输到数据总线上。

 

这些操作都是在设置好相应的寄存器,在访问内存时,cpu自动操作的。 cpu可以根据设置在寄存器中的列地址位数和内存大小等信息,自动分出L-bank,行,列地址,并按相应的时序发送到SDRAM

 

 

寄存器介绍:

       存储控制器共有13个寄存器,bank0bank5只需设置BWSCONBANKCONxbank6bank7外接SDRAM时还需设置其他寄存器,下面是各个寄存器的介绍。

 

BWSCON(Bus width & Wait CONtrol register) 位宽和等待寄存器。此寄存器设置每个bank的位宽,其中每4位控制一个bank。根据数据手册其中每4位中

       DWx:占两位 设置bankx的位宽,00对应8 01对应16 10对应32

       WSx:占一位 是否使用WAIT信号,一般为0不使用

       STx:占一位 是否启用SDRAM数据掩码引脚 SDRAM此位为0

其中比较特殊的是bank0,它的位宽是由硬件引脚OM0OM1决定的。

 

BANKCONx(BANK CONtrol register) 。在8bankbank6bank7可以接SDRAM所以BANKCON6BANKCON705不同。05中主要控制外接设备的访问时序。而67多出了,

MT:用于设置此BANK是外接存储器类型。SRAMROM00SDRAM11

TrcdRASCAS的延时

SCANSDRAM的列地址数,008 019 1010位,

 

REFRESH (refresh control register) 刷新控制寄存器,其中REFEN 0为禁止刷新功能,1为开启刷新功能。TREFMD 刷新模式,Trp预充电时间,Tsrc半行周期。剩下010位是刷新计数器,计算公式为2^11+1-SDRAM时钟频率(MHz)*SDRAM刷新周期(us).2440开发板在未使用PLL时,时钟频率等于晶振频率12MHz,计算得出等于1955. 整个寄存器则在本开发板中为0x008C07A3

 

BANKSIZE bank大小寄存器,其中BURST_EN 0为禁止突发传送 1为支持突发传输。SCKE_EN使能掉电模式与否,SCLK_EN仅在访问SDRAM期间发出SCLK信号。BK76MAP设置BANK67大小。010128MB 00164MB。本例为0xb1

 

MRSRBx(SDRAM mode register set rgister)x67。能设置的只有CL[6:4]CAS等待时间。整个寄存器设置为0x30

 

验代码简介:

  1. @****************************************
  2. @ 设置SDRAM 将下载到nandflash中转存到内部
  3. @ SRAM中的程序复制到SDRAM 然后跳到SDRAM处
  4. @ 执行
  5. @****************************************


  6. .equ    MEM_CTL_BASE,    0x48000000
  7. .equ    SDRAM_BASE,    0x30000000
  8. .equ    WTCON,        0x53000000
  9. .text
  10. .global _start
  11. _start:
  12.     bl disable_watchdog
  13.     bl init_sdram
  14.     bl move_to_sdram
  15.     ldr pc,     =jump_to_main


  16. disable_watchdog:
  17.     ldr r1,    =WTCON
  18.     mov r2,    #0x0
  19.     str r2,    [r1]
  20.     mov pc,    lr

  21. init_sdram:
  22.     ldr r1,    =MEM_CTL_BASE
  23.     adrl r2, mem_cfg_val
  24.     add r3,    r1,#52    @4*13 = 52
  25. 0:                    @数字标号是局部标号,这种标号可以在不同区域多次出现。
  26.     ldr r4,    [r2],#4
  27.     str r4,    [r1],#4
  28.     cmp r1,    r3
  29.     bne 0b
  30.     mov pc,    lr

  31. move_to_sdram:
  32.     mov r1,    #0;
  33.     ldr r2,    =SDRAM_BASE
  34.     add r3,    r1,#4*1024
  35. 0:
  36.     ldr r4,    [r1],#4
  37.     str r4,    [r2],#4
  38.     cmp r2,r3
  39.     bne 0b
  40.     mov pc,    lr

  41. jump_to_main:
  42.     ldr sp,    =0x34000000
  43.     bl main
  44.     

  45. .align 4
  46. mem_cfg_val:
  47.     .word    0x22011110    @BWSCON
  48.     .word    0x00000700    @BANKCON0
  49.     .word    0x00000700    @BANKCON1
  50.     .word    0x00000700    @BANKCON2
  51.     .word    0x00000700    @BANKCON3
  52.     .word    0x00000700    @BANKCON4
  53.     .word    0x00000700    @BANKCON5
  54.     .word    0x00018005    @BANKCON6
  55.     .word    0x00018005    @BANKCON7
  56.     .word    0x008C07A3    @REFRESH
  57.     .word    0x000000b1    @BANKSIZE
  58.     .word    0x00000030    @MRSRB6
  59.     .word    0x00000030    @MRSRB7

代码说明:其中比较重要的知识点是,相对跳转和绝对地址跳转。即所谓哪些的将会是位置无关代码哪些是位置相关代码。b,bl,等跳转是位置无关代码,而像ldr这样的指令或者伪指令,则是位置有关的。在连接程序时指定-Ttext,可以指定运行时地址。(类似选项还有-Tdata,-Tbss。这和在windowsADS编译器中的分散加载文件等类似。)。连接命令如下

  1. arm-linux-ld -Ttext 0x30000000 head.o leds.o -o sdram_elf

 本例中的反汇编代码如下:

  1. 30000000 <_start>:

  2.  30000000: eb000002 bl 30000010 <disable_watchdog>

  3.  30000004: eb000005 bl 30000020 <init_sdram>

  4.  30000008: eb00000c bl 30000040 <move_to_sdram>

  5.  3000000c: e59ff090 ldr pc, [pc, #144] ; 300000a4 <mem_cfg_val+0x34>

  6.  

  7.  30000010 <disable_watchdog>:

  8.  30000010: e3a01453 mov r1, #1392508928 ; 0x53000000

  9.  30000014: e3a02000 mov r2, #0

  10.  30000018: e5812000 str r2, [r1]

  11.  3000001c: e1a0f00e mov pc, lr

  12.                .......................

  13.  300000a0: 00000030 andeq r0, r0, r0, lsr r0

  14.  300000a4: 30000064 andcc r0, r0, r4, rrx

  15.  300000a8: e1a00000 nop ; (mov r0, r0)

需要注意的是第一条指令 bl 30000010看似像是绝对跳转,但其实是相对跳转,它实际执行是基于PC然后加上指令中的偏移量,所以是位置无关的。而ldr pc,  =jump_to_main这句的反汇编ldr     pc, [pc, #144]则是在基于当前PC值加上144,即300000a4处取得值给pc,实现跳转。而300000a4处存的值是依赖于编译时-Ttext选项的。







+发现
阅读(586) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~