• 上章分析了uboot启动流程后,接下来便来配置新的单板,实现nor、nand启动

1.首先在uboot里新建单板2440

1.1将2410的单板文件夹拷贝成:

cd board/samsung/
cp smdk2410 smdk2440 -rf //拷贝文件夹,

然后将smdk2440下的smdk2410.c改为smdk2440.c,以及修改更改好的Makefile

1.2 将2410的头文件拷贝成:

cd ../../include/configs/
cp smdk2410.h smdk2440.h

2.新建后,还需要修改boards.cfg,使uboot支持2440单板:

仿照

smdk2410                     arm         arm920t     -                   samsung        s3c24x0

添加:

smdk2440                     arm         arm920t     -                   samsung        s3c24x0

添加后,就能够使用make smdk2440_config命令.

(该命令便会调用include/configs/smdk2440.h和board/samsung/smdk2440里的文件来配置uboot)

3.修改uboot系统时钟

在start.S里,uboot只设置了CLKDIVN寄存器

而2440的系统时钟需要设置两个寄存器:MPLLDIVN(设置FCLK频率)、CLKDIVN(设置分频比例),且还要设为异步模式

所以将:

      ldr   r0, =CLKDIVN
mov r1, #
str r1, [r0] 

改为:

#define S3C2440_MPLL_400MHZ     ((0x5c<<12)|(0x01<<4)|(0x01))   //设置FCLK=400MHZ
#define MPLLCON 0x4C000004 //设置FCLK频率
ldr r0,=0x4C000014
mov r1,# /*FCLK:HCLK:PCLK=1:4:8 (400M:100M:50M)*/
str r1,[r0] mrc p15, , r1, c1, c0 /* 读出控制寄存器 */
orr r1, r1, #0xc0000000 /* 设置为“asynchronous bus mode” */
mcr p15, , r1, c1, c0, /* 写入控制寄存器 */ ldr r0,=MPLLCON
ldr r1,=S3C2440_MPLL_400MHZ
str r1,[r0]

并修改board\samsung\smdk2440\Smdk2440.c里的board_early_init_f()函数,屏蔽对MPLLDIVN, LOCKTIME寄存器的设置(该函数被start.S->board_init_f()调用,这些寄存器在前面已被设置)

4.烧写到NOR上,测试

烧写测试时,由于新的uboot较大,可以使用nor上的旧uboot,通过DNW烧写新的uboot到nor上面.

步骤:

usb              //使用usb下载到SDRAM上,1表示一直下载,直到完成
//然后打开DNW,传输新的uboot.bin给usb protect off all //关闭nor的写保护 erase +7FFFF //擦除nor上的 0~7FFFF地址内容, +7FFF=擦除长度=512kb,要大于新的uboot.bin才行 cp.b //将SDRAM上的新的uboot.bin,拷贝到nor上

烧写完成后,重启,通过JTAG调试的读地址命令, 判断是否与新uboot文件一致

使用JTAG调试时,发现向0x30000000地址上写值出错

5.接下来便修改bank寄存器

将board\samsung\smdk2440\lowlevel_init.S里SMRDATA符号下:

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 0x32
.word 0x30
.word 0x30

改为:

SMRDATA:
.long 0x22011110 //BWSCON
.long 0x00000700 //BANKCON0
.long 0x00000700 //BANKCON1
.long 0x00000700 //BANKCON2
.long 0x00000700 //BANKCON3
.long 0x00000700 //BANKCON4
.long 0x00000700 //BANKCON5
.long 0x00018005 //BANKCON6
.long 0x00018005 //BANKCON7
.long 0x008C04F4 //REFRESH
.long 0x000000B1 //BANKSIZE
.long 0x00000030 //MRSRB6
.long 0x00000030 //MRSRB7

6.重新编译烧写uboot,发现串口已有数据,但是乱码:

6.1进入arch\arm\cpu\arm920t\s3c24x0\Speed.c下的get_HCLK ()函数:

由于我们没有配置CONFIG_S3C2440宏,所以uboot获取HCLK时钟设置波特率时,用的是CONFIG_S3C2410宏的方法

搜索CONFIG_S3C2410宏,找到位于smdk2440.h:

然后将smdk2440.h的CONFIG_S3C2410宏 改为: CONFIG_S3C2440宏

6.2编译测试

make时,发现以下几个error:

进入drivers/mtd/nand/s3c2410_nand.c 的72行:

其中nand是一个s3c2410_nand结构体:

该结构体如下所示:

从上图可以看出,只有定义了CONFIG_S3C2410宏,才能得到该结构体,而我们6.1小节里,使用的是CONFIG_S3C2440宏。

且上面的s3c2410_nand结构体和s3c2440_nand结构体的差别也很大,修改s3c2410_nand.c会很麻烦

6.3所以就直接去掉该文件,不让编译器编译即可,步骤如下所示:

1)直接进入s3c2410_nand.c的目录,打开Makefile:

如上图所示,需要去掉CONFIG_NAND_S3C2410宏定义才行

2)搜索CONFIG_NAND_S3C2410宏,位于include/configs/smdk2440.h:

如上图所示,我们直接来屏蔽CONFIG_CMD_NAND宏即可,因为该宏下的#ifdef,都是与2410相关的

3)屏蔽include/configs/smdk2440.h下的CONFIG_CMD_NAND宏定义

重新烧写进norflash,打印如下图所示:

发现无乱码了,表示nor启动成功,其中Flash: *** failed ***表示不支持norflash,因为我们只实现了重定位,并没有对nor实现写擦除等命令。

7.接下来便修改uboot,实现NAND启动

新的uboot链接地址位于0,且在arm-linux-ld时加了"-pie"选项, 使得u-boot.bin里多了"*(.rel*)", "*(.dynsym)",从而程序非常大,不利于从NAND启动(重定位之前的启动代码应该少于4K).

所以接下来修改代码,并取消"-pie"选项.

7.1去掉 "-pie"选项

使用grep "\-pie" * -nR找到:

arch/arm/config.mk::LDFLAGS_u-boot += -pie             // LDFLAGS: arm-linux-ld的参数

所以屏蔽arch/arm/config.mk文件的"LDFLAGS_u-boot += -pie"这行即可

7.2参考之前自制uboot使用的start.S, init.c来修改uboot代码

1)将以前写uboot里的init.c放入board/samsung/smdk2440目录, 并检查是否有同名函数名,若函数只在同文件使用,则添加static.并修改Makefile

2)修改include/configs/smdk2440.h文件

将CONFIG_SYS_TEXT_BASE宏改为0x33f00000,也就是uboot重定位后的位置, 这里留了1MB空间供给uboot重定位(在反汇编中看到,代码真正总大小为700多KB(包括了bss段))

3)修改arch/arm/cpu/arm920t/start.S,更改重定位代码

由于nand启动时,2440未初始化之前只有前4K可读写,所以将重定位代码放在start.S的cpu_init_crit(初始化SDRAM)段后面

添加以下带红色的字段:

#ifndef CONFIG_SKIP_LOWLEVEL_INIT

bl    cpu_init_crit

#endif

/*重定位                          */

ldr   sp, =(CONFIG_SYS_INIT_SP_ADDR)          //等于0x30000f80

bic   sp, sp, #7                                                   /* 8-byte alignment for ABI compliance */

mov r0,#0                         //r0->src

ldr r1,_TEXT_BASE          //_TEXT_BASE : 0x33f00000

ldr r2,_bss_start_ofs       // _bss_start_ofs:  __bss_start - _start   (有效代码大小)

bl copy_code_to_sdram     //该函数首先会初始化nand控制器,然后复制代码到SDRAM连接地址dest上

bl clear_bss                         //清除bss段(参考自制uboot章节)

ldr pc,=call_board_init_f                 //绝对跳转,跳到SDRAM上执行

call_board_init_f:

ldr   r0,=0x00000000

bl    board_init_f

上面的_TEXT_BASE,在start.S靠前处定义:

由于它位于靠前处,保证了_TEXT_BASE存在前4k空间里,若直接使用ldr r1,=CONFIG_SYS_TEXT_BASE,编译器可能会将这个宏定义放在SDRAM上,则会出错

4)重定位写在前面了,所以我们还要删除start.S后面的relocate_code重定位段,清除BSS段

board_init_r位置处的代码,改为如下所示:

/* void relocate_code (addr_sp, gd, addr_moni)*/
.globl relocate_code
relocate_code: mov r4, r0 /* save addr_sp */
mov sp, r4
mov r0, r1 /* save addr of gd */
mov r1, r2 /* save addr of destination */
bl board_init_r //进入uboot第二阶段代码

7.3修改board_init_f()函数(位于arch/arm/lib/board.c)

本节添加的uboot重定位是直接以基地址0x33F00000开始的, 在上一章分析出,board_init_f()函数划分uboot重定位所在区域时,是通过动态划分的.

所以修改board_init_f()函数的第113行:

       /*
* reserve memory for U-Boot code, data & bss
* round down to next 4 kB limit
*/ //addr -= gd->mon_len; //屏蔽该行
//addr &= ~(4096 - 1); //屏蔽该行 addr=CONFIG_SYS_TEXT_BASE; //0x33f00000,添加该行

7.4修改链接脚本

把start.S, init.c(实现重定位), lowlevel.S(实现初始化SDRAM)等文件放在最前面

vi arch/arm/cpu/u-boot.lds

添加以下带红色的字段:

. = ALIGN(4);

.text :

{

__image_copy_start = .;

CPUDIR/start.o (.text)              //CPUDIR为arch/arm/cpu/arm920t目录

board/samsung/smdk2440/libsmdk2440.o (.text)

*(.text)

}

libsmdk2440.o是将smdk2440单板目录下的所有*.c,*S文件编译后,连接成一个库文件.

8.然后通过旧的uboot,将新的uboot烧写到nand

usb                               //先下载到SDRAM上

nand erase   0x80000                      //擦除512kb,必须大于新的uboot

nand write      0x80000           //将SDRAM上的新uboot写入nand中

烧写后,如下图所示:

nand启动便实现完成了,上面的Flash: *** failed *** 是属于uboot第二阶段函数board_init_r()里的代码,表示不支持nor flash,不能实现读,写,擦除等命令

下一章便来让uboot支持nor flash、nand flash.

2.移植uboot-添加2440单板,并实现NOR、NAND启动的更多相关文章

  1. X-003 FriendlyARM tiny4412 uboot移植之添加相应目录文件

    X-003 FriendlyARM tiny4412 uboot移植之添加相应目录文件 <<<<<<<<<<<<<< ...

  2. 移植u-boot.2012.04.01

    /*************************************************** *u-boot版本:u-boot2012.04.01 *gcc版本:arm-linux-gcc ...

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

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

  4. mini2440移植uboot 2014.04(一)

    最新版的uboot添加了很多新功能,我决定在最新版代码基础上重新移植一遍加深理解. 我修改的代码已经上传到github上,地址:https://github.com/qiaoyuguo/u-boot- ...

  5. mini2440移植uboot 2014.04(三)

    我修改的代码已经上传到github上,地址:https://github.com/qiaoyuguo/u-boot-2014.04-mini2440.git 参考文档: s3c2440手册(下载地址) ...

  6. Linux主机上使用交叉编译移植u-boot到树莓派

    0环境 Linux主机OS:Ubuntu14.04 64位,运行在wmware workstation 10虚拟机 树莓派版本:raspberry pi 2 B型. 树莓派OS: Debian Jes ...

  7. 1.ok6410移植bootloader,移植u-boot,学习u-boot命令

    ok6410移植u-boot 既然是移植u-boot当然首先需要u-boot源码,这里的u-boot代码是由国嵌提供的. 一.配置编译u-boot A. 解压 u-boot 压缩文件 B. 进入解压生 ...

  8. 从0移植uboot(六) _实现网络功能

    为uboot添加网卡功能可以让uboot通过tftp下载内核, 方便我们的开发, 对于网卡功能的移植,我们依然在在一遍又一遍的实践这个uboot改造的套路. 找运行逻辑,即插入代码的位置. 根据运行逻 ...

  9. mini2440移植uboot 2014.04(六)

    上一篇博文:<mini2440移植uboot 2014.04(五)> 代码已经上传到github上:https://github.com/qiaoyuguo/u-boot-2014.04- ...

随机推荐

  1. 【转】使用nvm快速搭建 Node.js 开发环境

    原文链接:http://www.cnblogs.com/shuoer/p/7802891.html 快速搭建 Node.js 开发环境 如果你想长期做 node 开发, 或者想快速更新 node 版本 ...

  2. 在.NET Core类库中使用EF Core迁移数据库到SQL Server

    前言 如果大家刚使用EntityFramework Core作为ORM框架的话,想必都会遇到数据库迁移的一些问题. 起初我是在ASP.NET Core的Web项目中进行的,但后来发现放在此处并不是很合 ...

  3. linux grep 从入门到精通

    linux grep 从入门到精通 一.初级 搜索日志 grep "186" catalina.out 在新输出日志中监听固定字符串 tail -f catalina.out | ...

  4. JavaSE之绘制菱形

    在JavaSE的算法练习中,绘制菱形是一个比较常见的案例.菱形效果如下图所示: 我们在解决算法问题时,通常情况下,先不要急于马上编码,而是要先观察,找出解决问题的关键所在. 在上图中,我们可以看到,菱 ...

  5. zoj 3195 Design the city LCA Tarjan

    题目链接 : ZOJ Problem Set - 3195 题目大意: 求三点之间的最短距离 思路: 有了两点之间的最短距离求法,不难得出: 对于三个点我们两两之间求最短距离 得到 d1 d2 d3 ...

  6. 关于磁盘冗余阵列、热备、群集、负载均衡、云计算、F5、Nginx等的概念和基本原理

    在系统部署实施过程中,客户往往会关注系统的可用性方面的指标. 对于一个具备高可用性的系统来说, 多机部署方案是必不可少的. 我们这个知识分享,就从多个不同层面来介绍多机部署方案. ---------- ...

  7. phython编写图形界面

    Python支持多种图形界面的第三方库,包括: Tk wxWidgets Qt GTK 等等. 但是Python自带的库是支持Tk的Tkinter,使用Tkinter,无需安装任何包,就可以直接使用. ...

  8. 2、C#基础 - Visual Studio 的版本选择和下载

    有句话说:工欲善其事,必先利其器,我不推荐在学习一个语言时使用记事本练习,甚至说相当的排斥.当然了,你也可以选择你自己喜欢的方式.本系列推荐使用的IDE为vs2017 community版,银子不够的 ...

  9. tyvj4869 罪犯分组

    看数据范围,果断状压.真是比愤怒的小鸟还智障..... #include<bits/stdc++.h> using namespace std; #define MAXN 500000+1 ...

  10. this的取值

    在函数中this到底取何值,是在函数真正被调用执行的时候确定的,函数定义的时候确定不了. 情况1:构造函数 function Foo(){ this.name="王福朋" this ...