buildroot构建项目(六)--- u-boot 2017.11 适配开发板修改 4 ---- 系统启动初始化之三

时间:2022-02-02 12:34:40

一、内存控制器

  在关闭了MMU和caches 之后 就进入lowlevel_init 函数,对内存控制器进行初始化。lowlevel_init.S (board\samsung\mini2440)

1.1 内存控制器介绍

  buildroot构建项目(六)--- u-boot 2017.11 适配开发板修改 4 ---- 系统启动初始化之三

  buildroot构建项目(六)--- u-boot 2017.11 适配开发板修改 4 ---- 系统启动初始化之三

  前面已经看过这张表格了。从这张表格中可以看处,我们的程序代码,不管使用不使用 NAND Flash 都是从0地址开始启动,只不过使用 Nand flash 需要将前4K代码拷贝进 SRAM中去。

1.2 内存控制器的寄存器

1.2.1 总线宽度和等待控制寄存器
  buildroot构建项目(六)--- u-boot 2017.11 适配开发板修改 4 ---- 系统启动初始化之三

  buildroot构建项目(六)--- u-boot 2017.11 适配开发板修改 4 ---- 系统启动初始化之三

  buildroot构建项目(六)--- u-boot 2017.11 适配开发板修改 4 ---- 系统启动初始化之三

  buildroot构建项目(六)--- u-boot 2017.11 适配开发板修改 4 ---- 系统启动初始化之三

  每一个 BANK 对应一个 DW WS ST位

1.2.2 BANK 控制寄存器

  buildroot构建项目(六)--- u-boot 2017.11 适配开发板修改 4 ---- 系统启动初始化之三

  buildroot构建项目(六)--- u-boot 2017.11 适配开发板修改 4 ---- 系统启动初始化之三

  buildroot构建项目(六)--- u-boot 2017.11 适配开发板修改 4 ---- 系统启动初始化之三

  buildroot构建项目(六)--- u-boot 2017.11 适配开发板修改 4 ---- 系统启动初始化之三

1.2.3 刷新控制寄存器

  buildroot构建项目(六)--- u-boot 2017.11 适配开发板修改 4 ---- 系统启动初始化之三

1.2.4 Bank 大小寄存器

  buildroot构建项目(六)--- u-boot 2017.11 适配开发板修改 4 ---- 系统启动初始化之三

1.2.5 SDRAM模式寄存器

  buildroot构建项目(六)--- u-boot 2017.11 适配开发板修改 4 ---- 系统启动初始化之三

二、代码修改

2.1 硬件电路图

  JZ2440的硬件电路图如下:

  buildroot构建项目(六)--- u-boot 2017.11 适配开发板修改 4 ---- 系统启动初始化之三

  由图中,可以知道 norflash 是16位的。所以我们要设置我们的位宽位 16位

  片选信号 nCE 接在 nGCS0 上,则我们的控制寄存器选择 BANKCON0

  • nGCS0:norflash,16位位宽
  • nGCS1:未接
  • nGCS2:未接
  • nGCS3:未接,用于外部扩展
  • nGCS4:DM9000网卡,16位位宽
  • nGCS5:未接,用于外部扩展
  • nGCS6:SDRAM,32位位宽
  • nGCS7:nGCS7未接  

2.1 代码修改

  代码修改较少,主要是根据各个芯片手册进行配置

 /*
* Memory Setup stuff - taken from blob memsetup.S
*
* Copyright (C) 1999 2000 2001 Erik Mouw (J.A.K.Mouw@its.tudelft.nl) and
* Jan-Derk Bakker (J.D.Bakker@its.tudelft.nl)
*
* Modified for the Samsung SMDK2410 by
* (C) Copyright 2002
* David Mueller, ELSOFT AG, <d.mueller@elsoft.ch>
*
* SPDX-License-Identifier: GPL-2.0+
*/ #include <config.h>
#include <version.h> /* some parameters for the board */ /*
*
* Taken from linux/arch/arm/boot/compressed/head-s3c2410.S
*
* Copyright (C) 2002 Samsung Electronics SW.LEE <hitchcar@sec.samsung.com>
*
*/ #define BWSCON 0x48000000 /* BWSCON */
#define DW8 (0x0) /* 8位总线宽度 */
#define DW16 (0x1) /* 16位总线宽度 */
#define DW32 (0x2) /* 32位总线宽度 */
#define WAIT (0x1<<2) /* BANK的 WAIT 状态,当前定义的此位是1,使能 */
#define UBLB (0x1<<3) /* 决定 SRAM 是否对 Bank 7 使用 UB/LB,使能 */ /* BWSCON中 BANK0 位宽由OM引脚决定,其余不用设置 */
#define B1_BWSCON (DW32) /* B1 位宽为32位,未用到 */
#define B2_BWSCON (DW16) /* B2 位宽为16位,未用到 */
#define B3_BWSCON (DW16 + WAIT + UBLB) /* B3 位宽为16位,未用到 */
#define B4_BWSCON (DW16) /* B4 位宽为16位,DM9000网卡,16位 */
#define B5_BWSCON (DW16) /* B5 位宽为16位,未用到 */
#define B6_BWSCON (DW32) /* B6 位宽为32位,接SDRAM,32位 */
#define B7_BWSCON (DW32) /* B7 位宽为32位,未用到 */ /* BANK0CON,norflash,设为复位默认值即可 */
#define B0_Tacs 0x0 /* 0clk */
#define B0_Tcos 0x0 /* 0clk */
#define B0_Tacc 0x7 /* 14clk */
#define B0_Tcoh 0x0 /* 0clk */
#define B0_Tah 0x0 /* 0clk */
#define B0_Tacp 0x0
#define B0_PMC 0x0 /* normal */ /* BANK1CON,未定义,设为复位默认值即可 */
#define B1_Tacs 0x0 /* 0clk */
#define B1_Tcos 0x0 /* 0clk */
#define B1_Tacc 0x7 /* 14clk */
#define B1_Tcoh 0x0 /* 0clk */
#define B1_Tah 0x0 /* 0clk */
#define B1_Tacp 0x0
#define B1_PMC 0x0 /* BANK2CON,未定义,设为复位默认值即可 */
#define B2_Tacs 0x0
#define B2_Tcos 0x0
#define B2_Tacc 0x7
#define B2_Tcoh 0x0
#define B2_Tah 0x0
#define B2_Tacp 0x0
#define B2_PMC 0x0 /* BANK3CON,未定义,设为复位默认值即可 */
#define B3_Tacs 0x0 /* 0clk */
#define B3_Tcos 0x3 /* 4clk */
#define B3_Tacc 0x7 /* 14clk */
#define B3_Tcoh 0x1 /* 1clk */
#define B3_Tah 0x0 /* 0clk */
#define B3_Tacp 0x3 /* 6clk */
#define B3_PMC 0x0 /* normal */ /* BANK4CON,DM9000网卡,设为复位默认值即可 */
#define B4_Tacs 0x0 /* 0clk */
#define B4_Tcos 0x0 /* 0clk */
#define B4_Tacc 0x7 /* 14clk */
#define B4_Tcoh 0x1 /* 1clk */
#define B4_Tah 0x0 /* 0clk */
#define B4_Tacp 0x0
#define B4_PMC 0x0 /* normal */ /* BANK5CON,未定义,设为复位默认值即可 */
#define B5_Tacs 0x0 /* 0clk */
#define B5_Tcos 0x0 /* 0clk */
#define B5_Tacc 0x7 /* 14clk */
#define B5_Tcoh 0x0 /* 0clk */
#define B5_Tah 0x0 /* 0clk */
#define B5_Tacp 0x0
#define B5_PMC 0x0 /* normal */ /* BANK6CON,SDRAM */
#define B6_MT 0x3 /* 同步SDRAM */
#define B6_Trcd 0x1 /* 3clk */
#define B6_SCAN 0x1 /* 9bit */ /* BANK7CON,未定义,设为复位默认值即可 */
#define B7_MT 0x3 /* SDRAM */
#define B7_Trcd 0x1 /* 3clk */
#define B7_SCAN 0x1 /* 9bit */ /* REFRESH parameter,刷新寄存器,主要是设置SDRAM */
#define REFEN 0x1 /* Refresh enable */
#define TREFMD 0x0 /* SDRAM 刷新模式 为自刷新 */
#define Trp 0x0 /* SDRAM RAS 预充电时间为2clk */
#define Trc 0x3 /* SDRAM 半行周期时间 7clk */
#define Tchr 0x0 /* 保留位,不需要设置 */
#define REFCNT 0x4f4 /* period=15.6us, HCLK=60Mhz, (2048+1-15.6*60) */
/**************************************/ _TEXT_BASE:
.word CONFIG_SYS_TEXT_BASE .globl lowlevel_init
lowlevel_init:
/* memory control configuration */
/* make r0 relative the current location so that it */
/* reads SMRDATA out of FLASH rather than memory ! */
ldr r0, =SMRDATA /* 获取SMRDATA的地址 */
ldr r1, _TEXT_BASE /* 获取代码基地址 */
sub r0, r0, r1 /* 计算SMRDATA相对与代码基地址的偏移量 */
ldr r1, =BWSCON /* 总线位宽控制器地址赋值给R1 */
add r2, r0, #* /* r2 = r0 + 52,即将 SMRDATA的结束地址赋值给 r2 */
/* 进入循环,按照预先的设计设定每个BANK的属性。 */
:
ldr r3, [r0], # /* 将存储器地址为R0的字数据读入寄存器R3,并将R0+4 */
str r3, [r1], # /* 将R3中的字数据写入以R1为地址的存储器中,并将新地址R1+4写入R1。 */
cmp r2, r0
bne 0b /* everything is fine now */
mov pc, lr .ltorg
/* the literal pools origin */ SMRDATA:
.word (+(B1_BWSCON<<)+(B2_BWSCON<<)+(B3_BWSCON<<)+(B4_BWSCON<<)+(B5_BWSCON<<)+(B6_BWSCON<<)+(B7_BWSCON<<))
.word ((B0_Tacs<<)+(B0_Tcos<<)+(B0_Tacc<<)+(B0_Tcoh<<)+(B0_Tah<<)+(B0_Tacp<<)+(B0_PMC))
.word ((B1_Tacs<<)+(B1_Tcos<<)+(B1_Tacc<<)+(B1_Tcoh<<)+(B1_Tah<<)+(B1_Tacp<<)+(B1_PMC))
.word ((B2_Tacs<<)+(B2_Tcos<<)+(B2_Tacc<<)+(B2_Tcoh<<)+(B2_Tah<<)+(B2_Tacp<<)+(B2_PMC))
.word ((B3_Tacs<<)+(B3_Tcos<<)+(B3_Tacc<<)+(B3_Tcoh<<)+(B3_Tah<<)+(B3_Tacp<<)+(B3_PMC))
.word ((B4_Tacs<<)+(B4_Tcos<<)+(B4_Tacc<<)+(B4_Tcoh<<)+(B4_Tah<<)+(B4_Tacp<<)+(B4_PMC))
.word ((B5_Tacs<<)+(B5_Tcos<<)+(B5_Tacc<<)+(B5_Tcoh<<)+(B5_Tah<<)+(B5_Tacp<<)+(B5_PMC))
.word ((B6_MT<<)+(B6_Trcd<<)+(B6_SCAN))
.word ((B7_MT<<)+(B7_Trcd<<)+(B7_SCAN))
.word ((REFEN<<)+(TREFMD<<)+(Trp<<)+(Trc<<)+(Tchr<<)+REFCNT)
.word 0xb1 /*64M bank大小,使能突发操作,禁止 SDRAM 掉电模式,SCLK 只在访问期间有效*/
.word 0x30 /* MRSRB6,写突发长度是使能,测试模式为模式寄存器组,CAS 等待时间为3clk,突发类型为连续,突发长度为1 */
.word 0x30