U-Boot移植(1)--在U-boot中建立自己的开发板

来源:互联网 发布:微信uwp for windows 编辑:程序博客网 时间:2024/05/29 16:40

        本人一菜鸟,最近一直在学习嵌入式,接触到uboot移植。本文记载学习过程与心得。如有错误的地方希望大家指点。

 

       对于一个计算机而言,当系统启动加电后,内核启动或应用程序运行之前,首先运行ROM中的一段程序代码,通过这段代码,为最终调用重装系统内核,运行应用程序准备正确的环境,这段代码就是所谓的引导加载程序。

           对于ARM中体系结构的CPU说,第一条指令从0x00000000开始执行。在嵌入式开发板中需要把存储器件ROM或者Flash映射到这个地址,而在这个地址处安排的通常就是系统的Bootloader(而嵌入式系统则将固态存储设备比如(Flash)安排在这个地址上,可保证掉电之后Bootloader不丢失),通过这个小程序,可以初始化硬件设备,建立内存空间的映射图,以便最终调用操作系统内核准备好正确的环境。 而Bootloader包含两种不同的操作模式,启动加载模式下载模式

    1.启动加载程序 

     这种模式,在上电后,Bootloader从目标机上某一个固态存储设备将操作系统加载到RAM中运行,已正式发布的嵌入式产品的Bootloader显然必须工作在这个模式下。

    2.下载模式

        目标机上的Bootloader将通过串口连接或网络连接等通信手段从主机(host)下载文件。

 

Bootloader 启动流程分析

    一个嵌入式软件系统可以分为引导加载程序、linux内核、文件系统、用户应用程序四个层次。

   从固态存储设备上启动的Bootloader大多采用两阶段,启动过程中分为stage1和stage2:stage1通常用汇编语言编写完成初始化硬件,为stage2准备内存空间,并将stage2复制到内存中,设置堆栈,然后跳转stage2。stage2通常用c语言实现,初始化要使用的硬件(串口,网口等等)、检测系统内存映射、为内核设置启动参数、调用内核。

 

uboot浅谈

         随着Bootloader的发展,对于arm体系结构比较常用的Bootloader 主要有 U-Boot、vivi和Biob.U-boot 从最开始的支持PowerPC,到现在还可以支持MIPS、ARM、X86等体系结构。 UBoot不仅支持嵌入式linux系统的引导,还支持Vxworks,QNX等多种嵌入式操作系统。下载uboot的源代码“ftp://ftp.denx.de/pub/u-boot”  下载解压后,主要目录如下:

    

      主要目录说明:

      1. board  包括板子的相关内容(每个板子都以一个子目录出现在当前目录中),主要包含SDRAM,FLASH,网卡驱动等。

      2.common  与处理器体系结构无关的通用代码。实现Uboot支持的命令。

      3.cpu 与处理器相关的文件,每个子目录都包含 cups,interrupt.c和start.s 。

      4.disk  Disk驱动分区相关信息代码。

      5.doc  U-boot的说明文档。

      6.drivers  通用设备驱动程序。

U-boot 编译(以OK6410开发板来说)

     在网上下载的U-boot并不支持6410开发板,需要进行编译。编译步骤分为两步:配置,编译。

     1.下载uboot,解压后进入目录:(我用的是u-boot-2011.03.tar.bz2 版本。)

                   #tar xjvf  u-boot-2011.03.tar.bz2

                   #cd  u-boot-2011.03/

    2.在U-boot中建立自己的开发板:

      (1) 由于s3c6410和s3c6400的接口资源比较类似,仅在外接设备和CPU的运行频率等方面有些差别。故在board/samsung/下建立自己开发板的项目,取名为smdk6410。 并且将smdk6400文件里的所有内容复制到smdk6410文件内, 进入smdk6410文件夹 smdk6400.c更名为smdk6410.c  打开smdk6410.c文件 将里面6400全改为6410,打开smdk6410文件下的Makfile, 将里面的6400改为6410.

     (2) 在修改后的smdk6410.c中,头文件包含 #include <asm/arch/s3c6410.h>的话,因为在文件夹asm/arch中没有s3c6410.h,先暂时使用asm/arch/s3c6400.h或者把asm/arch中的s3c6400.h复制后修改为s3c6410.h

     (3)  进入/u-boot-2011.03/nand_spl/board/samsung/smdk6400/的目录,复制smdk6410,粘贴,将副本的smdk6400改名为smdk6410.更改Makefike文件,将里面的6400全部改为6410。

    (4) 进人/u-boot-2011.03/include/configs/  复制smdk6400.h,并将副本改为smdk6410.h。

   

    (5)  打开/u-boot-2011.03/Makefile ,  找到CROSS_COMPILE?= 在后面添加arm-linux-      

               

在此Makefile搜索6400,然后跳转到如下图;

 

复制上面代码 然后粘贴到这段代码后面 把6400改为6410

运行make smdk6410_config  

然后在运行make

如果编译失败,提示
 

这个错误要修改
uboot.lds
nand_spl/u-boot.lds
nand_spl/board/samsung/smdk6410/u-boot.lds
board/samsung/smdk6410/u-boot-nand.lds
加入 _end = .;
在这一行的前面

.bss __rel_dyn_start (OVERLAY) : {

再次编译就可以成功了 生成uboot.bin文件。
现在已在u-boot中建立属于自己的ok6410开发板了,但是这些操作只是个框架。要使u-boot 完全支持自己的开发板硬件平台还需要根据不同的硬件接口设备对u-boot修改。

 

 

 

 

 

 

                 

 

 

 

 

    

原创粉丝点击