u-boot移植(七)---代码修改---存储控制器

2023-07-03  

一、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 (boardsamsungjz2440) 

  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, #13*4            /* 将SMRDATA这一块地址赋值给r2中 */

 97 0:

 98     ldr     r3, [r0], #4            /* 将r0的值代表的内存单元放入r3中,之后r0的值偏移4位 */

 99     str     r3, [r1], #4            /* 将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


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。