Uboot-2012.4的启动流程:

  自从Uboot-2010后的Uboot在文件结构和启动流程方面都有非常大的改变,所以移植Uboot-2012.4的时候还是费了我不少时间,

首先在编译Uboot的时候,nand_spl文件夹下的Makefile会建立几个链接文件(具体链接到那几个文件自己查看),然后生成u-boot-spl-16k.bin文件,

之后在与u-boot.bin文件结合生成u-boot-nand.bin的可执行文件,当从Nandflash启动时,首先CPU会复制u-boot-nand.bin的前8k数据到IROM,

这8K数据就是u-boot-spl-16k.bin的数据,这个文件的功能是初始化Nandflash、SDRAM、以及时钟等一些最基本的C程序运行环境,

然后将整个u-boot-nand.bin从Nandflash复制到SDRAM中的0x57e0000处,跳转执行C程序 board_init_f 这个函数的功能是执行

init_sequence 初始化队列、建立 gd 结构体,最后执行 relocate_code(addr_sp, id, addr); 这个函数是在 start.S 的汇编文件中,

功能是将u-boot-nand.bin从0x57e0000处转移到0x5ff75000并且会修改所有代码的链接地址,转移完成后会传递两个给 board_init_r 函数,

一个是 gd 结构体的地址和 u-boot-nand.bin 的起始地址 0x5ff75000 。board_init_r 函数的功能就是进一步初始化然后进入命令行模式!

整个启动过程就完成了!

  但是我认为这种方式效率非常低,所以我把他改变成不需要u-boot-spl-16k.bin文件,直接从u-boot.bin中的 start.S 文件处开始执行,

基本初始化后直接将所有代码复制到 0x5ff75000 处执行!下面的只是几个关键地方的改动!

1、打开根目录下的Makefile文件

smdk6400_noUSB_config    \
smdk6400_config : unconfig
@mkdir -p $(obj)include $(obj)board/samsung/smdk6400
@mkdir -p $(obj)nand_spl/board/samsung/smdk6400
@echo "#define CONFIG_NAND_U_BOOT" > $(obj)include/config.h
@echo "CONFIG_NAND_U_BOOT = y" >> $(obj)include/config.mk
@if [ -z "$(findstring smdk6400_noUSB_config,$@)" ]; then \
echo "RAM_TEXT = 0x5ff75000" >> $(obj)board/samsung/smdk6400/config.tmp;\
else \
echo "RAM_TEXT = 0xc7e00000" >> $(obj)board/samsung/smdk6400/config.tmp;\
fi
@$(MKCONFIG) smdk6400 arm arm1176 smdk6400 samsung s3c64xx
# @echo "CONFIG_NAND_U_BOOT = y" >> $(obj)include/config.mk
//注释掉这一项,这涉及到nandflash启动问题,具体说明请看u-boot-2010.3移植到Tiny6410问题总结的问题一;我习惯让CPU直接从start.s处开始执行

修改 include/configs/smdk6400.h 的这个宏定义 #define CONFIG_SYS_PHY_UBOOT_BASE    (CONFIG_SYS_SDRAM_BASE + 0x0ff75000)

2、打开board/samsung/smdk6400/lowlevel_init.S文件按照友善的相应文件进行修改,修改后编译测试发现什么现象都没有,然后用LED程序测试Uboot在哪里停止了,原来在start.S文件中跳转执行 bl    lowlevel_init 时跳不过去,打开根目录下的System.map文件搜索 lowlevel_init 发现 57e28534 T lowlevel_init 说明 lowlevel_init 函数的链接地址在0x57e28534处,而这是程序还在CPU内部的 8K IROM中,内存也还没有初始化,所以是肯定跳转不过去的。

  所以我们要修改链接脚本,打开arch/arm/cpu/u-boot.lds

.text :
{
__image_copy_start = .;
CPUDIR/start.o (.text)
board/samsung/smdk6400/lowlevel_init.o (.text) //我自己添加的一行
     board/samsung/smdk6400/nand_cp.o (.text)
*(.text)
}

  但是编译时出现错误: multiple definition of `lowlevel_init' 原来是因为2010.3以后的Uboot改变了链接规则,他是将每个文件夹下面的所有的.o文件先打包为 $(obj)lib$(BOARD).o 比如说board/samsung/smdk6400下的文件打包为 libsmdk6400.o 和Linux内核的链接模式差不多所以这个文件中已经包含了lowlevel_init.o 文件,如果我们又在arch/arm/cpu/u-boot.lds中添加 board/samsung/smdk6400/lowlevel_init.o (.text) 会导致 lowlevel_init.o 文件被链接了两次,所以会出现多重定义错误;我们要修改 board/samsung/smdk6400 下的Makeflie文件使 lowlevel_init.o 不被包含到 libsmdk6400.o文件中去;

include $(TOPDIR)/config.mk

LIB    = $(obj)lib$(BOARD).o

NAND_CP              := nand_cp.o //红色部分是我自己加的 nand_cp.o 的作用是将uboot从nandflash复制到sdram中
COBJS-y := smdk6400.o
SOBJS := lowlevel_init.o SRCS := $(SOBJS:.o=.S) $(COBJS-y:.o=.c) $(NAND_CP:.o=.c)
OBJS := $(addprefix $(obj),$(COBJS-y))
SOBJS := $(addprefix $(obj),$(SOBJS))
NAND_CP              := $(addprefix $(obj),$(NAND_CP)) $(LIB):    $(obj).depend $(SOBJS) $(OBJS) $(NAND_CP)
  $(call cmd_link_o_target, $(OBJS)) //去掉 $(SOBJS) 使他不连接到 libsmdk6400.o

3、 arch/arm/lib/board.c 文件中的 board_init_f 函数中注释掉这个函数,

  //relocate_code(addr_sp, id, addr); 我们已经将代码复制到了0x5ff75000 不需要重定位了,也把start.S中的这个函数去掉!

4、arch/arm/lib/board.c 文件中的 board_init_r 函数中

/* The Malloc area is immediately below the monitor copy in DRAM */
    malloc_start = dest_addr - TOTAL_MALLOC_LEN  - 0x200000;

/* -0x200000 is becase TOTAL_MALLOC_LEN is too long it will Cover the uboot coder*/
    mem_malloc_init (malloc_start, TOTAL_MALLOC_LEN);

这里减去 0x200000 的作用是,但当没有减的时候,程序执行到这里就重启,原因是 mem_malloc_init 是初始化一段内存空间给uboot用,初始化就是将这段内存清零,清零的时候可能将Uboot的原有代码也清除掉了,所以出现无限重启状态,当减去了0x200000 后是为了是初始化的这段空间离uboot代码远一点!

  哎,很失败!移植Uboot2012就是为了烧写yaffs文件系统,可是怎么搞也不能让自己的内核挂载Nandflash上的文件系统!还是技术有待提高呀!!!

移植u-boot-2012.4到Tiny6410_1G_Nandflash的更多相关文章

  1. 1uboot移植要点[原创☆☆]

    ----- 一:我们先来了解下实际内存: nand.nor.ram. 所以从CPU是从那部分启动的呢? 答:要看主控芯片的boot如何设置(正如分的启动方式和下载方式一样). uboot:sd卡→iR ...

  2. 使用EasyBCD完美实现Windows7与Linux双系统

    在Linux横行的时代,不玩Linux简直对不起它的流行,但又不能不用Windows,还要干活,还要工作啊,最重要的是:还要娱乐啊!! 废话不多说,直接进入主题! 1.下载EasyBCD,这个软件可以 ...

  3. 关于e820cycles参数

    关于e820cycles参数http://bbs.wuyou.net/forum.php?mod=redirect&goto=findpost&ptid=327458&pid= ...

  4. 移植u-boot.2012.04.01

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

  5. macbook air 2012 mid 安装 windows10 双系统遇到错误 no bootable device insert boot disk and press any key

    macbook型号:air 2012 mid 当前操作系统:mojave 安装工具:boot camp assistant 要安装的双系统:windows 10家庭版 安装教程:百度搜一堆 安装过程中 ...

  6. X-009 FriendlyARM tiny4412 uboot移植之SD Card用起来Kernel boot起来

    <<<<<<<<<<<<<<<<<<<<<<<<< ...

  7. 标题:u-boot 移植步骤详解

    1 U-Boot简介U-Boot,全称Universal Boot Loader,是遵循GPL条款的开放源码项目.从FADSROM.8xxROM.PPCBOOT逐步发展演化而来.其源码目录.编译形式与 ...

  8. -boot移植(十一)---代码修改---支持nandflash

    一.移植前的修改 1.1 include/configs/jz2440修改 原来的定义: 可以看出,要先定义CONFIG_CMD_NAND才能使能NANDFlash. 这个在我们文件中的82行有定义, ...

  9. 移植u-boot-1.1.6(原创)

    #u-boot:u-boot-1.1.6#server:ubuntu 12.04#gcc: arm-linux-gcc -4.3.2# 一.建立单板1> /board/smdk2410 : cp ...

随机推荐

  1. Spring 中 AbstractExcelView 支持根据模板生成Excel文件. 通过设置 view 的 URL 属性指定模板的路径

     注意:1. 模板需放在 WEB-INF 目录下2. 指定模板路径时不需要添加扩展名, Spring将自动添加 .xls 到URL 属性中.3. 在指定URL前需先设置 view 的 Applicat ...

  2. jquery中lhgdialog插件(一)

    一:前言 最近在使用jquery的控件,其实以前也写但是突然之间遇到了需要从弹出窗口传值到父窗口,突然觉得这种传值的方式其实也是需要javascript的基础的,但是我自己还没有去真正的做过,所以还是 ...

  3. POJ 1064---二分搜索法

    ///2.假定一个解并判断是否可行 ///POJ1064 /** Q:有N条绳子,长度分别为Li,从中切割出k条长度相同的绳子, 这K条绳子最长能有多长?保留两位小数 A: 二分搜索模型. 条件C(x ...

  4. HDU 5878---预处理+二分查找

    给一个数n,让你求一个大于等于n的最小的满足题意中2^a*3^b*5^c*7^d的数字. 思路: #include<iostream> #include<cstdio> #in ...

  5. CentOS 7 主机加固手册-下

      CentOS 7 主机加固手册-上 CentOS 7 主机加固手册-中 CentOS 7 主机加固手册-下 0x1f 删除禁用非必要的服务 删除非必要的服务 # Remove yum remove ...

  6. onvif实现

    前言 负责开发了公司的onvif,一个人从0开始写的,花了两个月 !!!下面是我的总结. onvif介绍 ONVIF[Open Network Video Interface Forum](开放型网络 ...

  7. PL/SQL 10 管理用户子程序

    --查看存储过程源代码IKKI@ test10g> select text from user_source where name='ADD_DEPT'; TEXT--------------- ...

  8. 【反演复习计划】【COGS2432】爱蜜莉雅的施法

    也是一个反演. 第一次手动推出一个简单的式子,激动.jpg 原题意思是求:$Ans=\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m}\phi(gcd(i,j))$随 ...

  9. django框架实现restful风格的API开发

    RESTful风格的要求:https://www.cnblogs.com/chichung/p/9933116.html 利用django原生的框架直接做RESTful的API开发是怎样的呢?感受一下 ...

  10. 使用python获取整月每一天的系统监控数据生成报表

    1.安装阿里开源监控工具tsar tsar官方网站 wget -O tsar.zip https://github.com/alibaba/tsar/archive/master.zip --no-c ...