buildroot构建项目(六)--- u-boot 2017.11 适配开发板修改 4 ---- 系统启动初始化之三
一、内存控制器
在关闭了MMU和caches 之后 就进入lowlevel_init 函数,对内存控制器进行初始化。lowlevel_init.S (board\samsung\mini2440)
1.1 内存控制器介绍


前面已经看过这张表格了。从这张表格中可以看处,我们的程序代码,不管使用不使用 NAND Flash 都是从0地址开始启动,只不过使用 Nand flash 需要将前4K代码拷贝进 SRAM中去。
1.2 内存控制器的寄存器
1.2.1 总线宽度和等待控制寄存器




每一个 BANK 对应一个 DW WS ST位
1.2.2 BANK 控制寄存器




1.2.3 刷新控制寄存器
1.2.4 Bank 大小寄存器
1.2.5 SDRAM模式寄存器

二、代码修改
2.1 硬件电路图
JZ2440的硬件电路图如下:

由图中,可以知道 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
buildroot构建项目(六)--- u-boot 2017.11 适配开发板修改 4 ---- 系统启动初始化之三的更多相关文章
- buildroot构建项目(五)--- u-boot 2017.11 适配开发板修改 3 ---- 系统启动初始化之二
一.cpu_init_crit 当执行完时钟初始化后,程序执行: bl cpu_init_crit 跳转到CPU初始化处进行,在其中主要是执行 caches 的关闭 和 MMU的关闭,之后跳转到 ...
- buildroot构建项目(八)--- u-boot 2017.11 适配开发板修改 5 ---- 系统启动初始化之五
执行完 board_init_f 后,跳回到 crt0.S中继续执行汇编语言 ldr r0, [r9, #GD_START_ADDR_SP] /* sp = gd->start_addr_sp, ...
- buildroot构建项目(七)--- u-boot 2017.11 适配开发板修改 4 ---- 系统启动初始化之四
设置完寄存器控制器后,则跳出cpu_init_crit,进入_main 函数.即进入crt0.S (arch\arm\lib) 跟着代码流程慢慢走 一.crt0.S 1.1 第一步执行代码 /* 预 ...
- buildroot构建项目(四)--- u-boot 2017.11 适配开发板修改 2 ---- 系统启动初始化之一
一.代码分析 上一节已经分析了链接文件,知道了首先代码是从 _start 开始,之后设置了中断向量表,然后从 start.s 开始运行. _start:vectors.S (arch\arm\lib) ...
- buildroot构建项目(三)--- u-boot 2017.11 适配开发板修改 1
当前虽然编译成功了,但是对于我们自己的目标板并不太适用.还得做一系列得修改. 一.lds 文件分析 u-boot 中最重要得链接文件即是,u-boot.lds.我们可以查看我们编译出来得 u-boot ...
- buildroot构建项目(二)--- u-boot 2017.11 建立 2440 开发板
一.准备工作 在建立之前,先需要将下载的u-boot 拷贝一份出来解压,在此工程下进行更改和创建.同时根据前面搜索到的 mini2440开发板所在的版本,下载一份u-boot 拷贝出 mini2440 ...
- buildroot构建项目(一)---buildroot介绍
1.1 什么是buildroot Buildroot是Linux平台上一个构建嵌入式Linux系统的框架.整个Buildroot是由Makefile脚本和Kconfig配置文件构成的.你可以和编译Li ...
- iTOP-IMX6UL 实战项目:ssh 服务器移植到 arm 开发板
实验环境:迅为提供的Ubuntu12.04.2 以及虚拟机 编译器:arm-2009q3 编译器 开发板系统:QT系统 开发板使用手册中给Windows 系统安装了 ssh 客户端,给 Ubunt ...
- 迅为iTOP-4412物联网开发板入门学习高手进阶项目开发超树莓派
免费视频教程: 为初学者精心录制的整套视频教程全部免费,随IT技术发展而不断增添的视频教程仍然免费!一支有经验的工程师团队会始终成为您的后盾. 项目实战---全开源: 手机远程控制开发板 门禁系统 W ...
随机推荐
- wps word改多级编号为2.1
右键标题1, 修改样式 编号 多级编号 标题1 2 3 右键标题2 修改样式 选择格式-编号 选择多级编号-标题1 2 3 直接点确定,OK. ---------------------------- ...
- Jenkins之常用变量
BUILD_NUMBER 目前的编号,如“153” JOB_NAME 此构建项目的名称,如“foo”或“foo / bar”. JOB_BASE_NAME 此建立项目的名称将剥离文件夹路径,例如“ba ...
- CF527D
题面 这题还挺水的,把那个式子稍微变形一下就可以的到xi-wi>=xj+wj,易知:若把每个点看做一条线段,左端点是xi-wi,右端点是xi+wi,就只要求最多的不重叠的线段数就可以了,然后就是 ...
- BZOJ1915[USACO 2010 Open Gold 1.Cow Hopscotch]——DP+斜率优化
题目描述 奶牛们正在回味童年,玩一个类似跳格子的游戏,在这个游戏里,奶牛们在草地上画了一行N个格子,(3 <=N <= 250,000),编号为1..N.就像任何一个好游戏一样,这样的跳格 ...
- Dapper 介绍
转载:http://***/html/itweb/20130918/125194_125199_125210.htm .NET 轻量级 ORM 框架 - Dapper 介绍 Dapper简单介绍: D ...
- Python3网络爬虫(3):使用User Agent和代理IP隐藏身份
Python版本: python3 IDE: pycharm2017.3.3 一.为何要设置User Agent 有一些网站不喜欢被爬虫访问,所以会检测对象,如果是爬虫程序,他就会不让你访问,通过设置 ...
- MT【10】和三次有关的一个因式分解
解答: 评:1此处因式分解也可以看成关于$a$的函数$f(a)$利用多项式有理根的有关知识得到 2.此处我们可以得到关于$\Delta ABC$的余弦的一个不等式$cosA+cosB+cosC> ...
- hihocoder部分题解
hihocoder1609 数组分拆II [dp] 给定数组,问有多少种拆法,使得每一段不出现重复的数字,且要保证分组数最少.(1e5) 题解: O(n) d[i]表示1~i最小划分的段数, f[i] ...
- Python解惑:整数比较
在 Python 中一切都是对象,毫无例外整数也是对象,对象之间比较是否相等可以用==,也可以用is.==和is操作的区别是: is比较的是两个对象的id值是否相等,也就是比较俩对象是否为同一个实例对 ...
- AutoCompleteTextView 简单用法 实现自定义list adapter
网上有不少教程,那个提示框字符集都是事先写好的,例如用一个String[] 数组去包含了这些数据,但是,我们也可以吧用户输入的作为历史记录保存 下面先上我写的代码:import andro ...

