分析JZ2440的Uboot的配置和编译过程

大家都知道PC机在上电后,首先会启动BIOS,然后通过BIOS来启动Windows操作系统,然后识别出盘符(C盘、D盘),然后再执行应用程序。同样的道理嵌入式Linux系统,上电后,首先执行BootLoader,通过BootLoader启动linux内核,然后在挂接根文件系统,最后执行用户应用程序,通过分析可知BootLoader的最终目的是启动Linux内核

首先介绍一下的编译过程:

1、解压

tar  jxvf  u-boot-1.1.6.tar.bz2

2、在u-boot-1.1.6目录下进行打补丁

                            patch -p1 < ../ u-boot-1.1.6_jz2440.patch

3、配置

make   100ask24x0_config  

4、编译

        直接执行make即可


二、分析Uboot的配置过程

首先分析其配置过程,当我们执行make   100ask24x0_config时,相当执行如下命令,该命令在u-boot-1.1.6目录下的Makefile文件中:

100ask24x0_config :        unconfig

         @$(MKCONFIG) $(@:_config=) arm arm920t100ask24x0 NULL s3c24x0

 

其中MKCONFIG     := $(SRCTREE)/mkconfig 源文件目录下的mkconfig文件

    $(@:_config=)的意思是在目标名称100ask24x0_config      中去掉_config相当于100ask24x0

当我们执行make 100ask24x0_config的时候实际上相当于执行如下脚本,脚本文件位于u-boot-1.1.6目录下

# mkconfig 100ask24x0  arm  arm920t 100ask24x0  NULL  s3c24x0

#  $0        $1       $2    $3       $4        $5     $6

 

 

APPEND=no     # Default: Create new config file

BOARD_NAME=""   # Name to print in make output

 

while [$# -gt 0 ] ; do     #  $#代表参数个数

         case "$1" in

         --) shift ; break ;;

         -a) shift ; APPEND=yes ;;

         -n) shift ;BOARD_NAME="${1%%_config}" ; shift ;;

         *) break ;;

         esac

done

 

mkconfig  100ask24x0 arm  arm920t  100ask24x0  NULL  s3c24x0命令中没有”--””-a””-n”等符号所以这几行代码没有任何意义

 

["${BOARD_NAME}" ] || BOARD_NAME="$1"

 

如果BOARD_NAME不为空则不执行BOARD_NAME="$1"

BOARD_NAME为空时执行BOARD_NAME="$1"即就是BOARD_NAME=100ask24x0

 

[ $# -lt4 ] && exit 1

[ $# -gt6 ] && exit 1

 

$#表示参数的个数,上面代码的意思是参数个数小于4或者大于6退出

 

echo"Configuring for ${BOARD_NAME} board..."

 

打印Configuring for ${BOARD_NAME} board...Configuring for 100ask24x0  board...

 

if ["$SRCTREE" != "$OBJTREE" ] ; then

         mkdir -p ${OBJTREE}/include

         mkdir -p ${OBJTREE}/include2

         cd ${OBJTREE}/include2

         rm -f asm

         ln -s ${SRCTREE}/include/asm-$2 asm

         LNPREFIX="../../include2/asm/"

         cd ../include

         rm -rf asm-$2

         rm -f asm

         mkdir asm-$2

         ln -s asm-$2 asm

else

         cd ./include

         rm -f asm

         ln -s asm-$2 asm

 

if条件不成立所以上面的代码执行else,相当于

cd ./include

rm -f asm 

ln -s  asm- arm  asm  #asm-arm目录链接成asm目录 asm是指向asm-arm的连接文件

 

rm -fasm-$2/arch 

 

相当于rm -f asm- arm /arch删除asm-arm目录下的arch目录

 

if [ -z"$6" -o "$6" = "NULL" ] ; then

         ln -s ${LNPREFIX}arch-$3 asm-$2/arch

else

         ln -s ${LNPREFIX}arch-$6 asm-$2/arch

fi

 

如果$6为空执行if 不为空时执行else ${LNPREFIX}无人定义 相当于空

所以ln -s ${LNPREFIX}arch-$6 asm-$2/arch

相当于 ln –s  arch-s3c24x0  asm-arm/arch 创建asm-arm目录下arch文件该文件是arch-s3c24x0的连接文件

 

if ["$2" = "arm" ] ; then

         rm -f asm-$2/proc

         ln -s ${LNPREFIX}proc-armv asm-$2/proc

fi

 

如果$2==arm条件成立rm -f asm-arm/proc

 ln –s  proc-armv asm-arm/proc 创建连接文件asm-arm/proc指向proc-armv

 

#

# Createinclude file for Make

#

echo"ARCH   = $2" >  config.mk

echo"CPU    = $3" >>config.mk

echo"BOARD  = $4" >>config.mk

 

["$5" ] && [ "$5" != "NULL" ] &&echo "VENDOR = $5" >> config.mk

 

["$6" ] && [ "$6" != "NULL" ] &&echo "SOC    = $6" >>config.mk

创建配置文件 >表示创建文件 >>表示追加执行以上三条指令后 config.mk文件内容为:

ARCH   = arm

CPU    = arm920t  

BOARD  = 100ask24x0  

SOC    = s3c24x0

 

#

# Createboard specific header file

#

if ["$APPEND" = "yes" ]  #Append to existing config file

then

         echo >> config.h

else

         > config.h                   # Create new config file

fi

echo"/* Automatically generated - do not edit */" >>config.h

echo"#include <configs/$1.h>" >>config.h

 

因为APPEND=no所以执行else  创建config.h 文件

内容:/* Automatically generated - do not edit */

       #include <configs/100ask24x0 .h>

 

通过上面的分析可以知道在执行脚本

mkconfig  100ask24x0 arm  arm920t  100ask24x0  NULL  s3c24x0

即就是配置过程主要做一下操作:

1、  BOARD_NAME=100ask24x0即BOARD_NAME赋值为100ask24x0

2、  打印Configuring for ${BOARD_NAME} board... 即Configuring for 100ask24x0  board...

3、      cd./include           #进入include目录

rm -f asm             #删除include目录下的asm文件

ln -s  asm- arm  asm   #创建连接文件asm,该文件指向asm- arm

rm -f asm-$2/arch 

#相当于rm -f asm- arm /arch 删除asm-arm目录下的arch目录

ln –s  arch-s3c24x0 asm-arm/arch

#创建asm-arm目录下arch文件 该文件是arch-s3c24x0的连接文件

rm -f asm-arm/proc  #删除asm-arm目录下的proc文件

ln –s  proc-armv  asm-arm/proc #创建连接文件asm-arm/proc指向proc-armv

4、  创建config.mk文件,内容如下:该文件位于u-boot-1.1.6/include目录下

ARCH   = arm          #架构

CPU    = arm920t       #MCU

BOARD  = 100ask24x0    #开发板名称

SOC    = s3c24x0        #MCU型号

5、  创建config.h内容如下:#include <configs/100ask24x0 .h>该文件位于u-boot-1.1.6/include目录下

 

三、分析编译过程

u-boot-1.1.6/board/100ask24x0目录下:u-boot.lds是 u-boot的连接脚本

 

OUTPUT_FORMAT("elf32-littlearm","elf32-littlearm", "elf32-littlearm")

/*OUTPUT_FORMAT("elf32-arm","elf32-arm", "elf32-arm")*/

OUTPUT_ARCH(arm)

ENTRY(_start)

SECTIONS

{

         . = 0x00000000;    //程序的链接地址=该地址+TEXT_BASE = 0x33F80000

             //TEXT_BASEu-boot-1.1.6/board/100ask24x0目录下的config.mk中定义

         . = ALIGN(4);

         .text      :

         {

          cpu/arm920t/start.o   (.text)     //第一个启动文件

          board/100ask24x0/boot_init.o (.text)

          *(.text)

         }

 

         . = ALIGN(4);

         .rodata : { *(.rodata) }

 

         . = ALIGN(4);

         .data : { *(.data) }

 

         . = ALIGN(4);

         .got : { *(.got) }

 

         . = .;

         __u_boot_cmd_start = .;

         .u_boot_cmd : { *(.u_boot_cmd) }

         __u_boot_cmd_end = .;

 

         . = ALIGN(4);

         __bss_start = .;

         .bss : { *(.bss) }

         _end = .;

}

通过以上分析可知uboot的第一个启动文件为cpu/arm920t/start.o

本节就分析到这,下次从启动文件cpu/arm920t/start.o直接分析uboot的启动全过程

敬请期待!!!!!!!!!!!!!!!!!!!!!!!!!!!!!



有嵌入式相关的设计开发需求,请联系我QQ:919104337


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
hi3536uboot是海思公司(Hisilicon)的一款基于ARM架构的嵌入式开发板使用的启动引导程序。要配置编译hi3536uboot,需要按照以下步骤进行: 1. 下载并安装交叉编译工具链:在海思官方网站上下载适用于hi3536uboot的交叉编译工具链,并将其解压到合适的目录中。然后将该目录添加到系统环境变量中,以便在命令行中可以直接使用交叉编译命令。 2. 获取hi3536uboot源码:从海思官方网站上下载最新版本的hi3536uboot源码,并将其解压到工作目录中。 3. 配置编译选项:进入hi3536uboot源码目录,在命令行中执行"make menuconfig"命令。这将打开一个菜单配置界面,用于选择编译选项。根据实际需求进行配置,例如选择启动方式、设备驱动支持等。 4. 进行编译:在命令行中执行"make"命令,开始编译hi3536uboot编译过程可能需要一段时间,视电脑性能和源码大小而定。 5. 生成uboot镜像文件:编译完成后,将生成的uboot镜像文件保存到合适的位置。通常情况下,uboot镜像文件的名称为"u-boot.bin"。 6. 烧录uboot镜像文件:将生成的uboot镜像文件通过JTAG或串口等方式烧录到hi3536开发板上。确保开发板电源正常供电,并按照官方文档或板载接口定义正确连接烧录工具。 7. 验证uboot功能:烧录完成后,重启hi3536开发板,并使用串口终端连接到开发板。通过终端界面可以验证uboot的功能和正确性,例如执行命令、加载内核等。 配置编译hi3536uboot需要一定的嵌入式开发和Linux系统操作经验,同时需要参考海思官方提供的文档和资料。以上步骤仅为简要介绍,具体操作可能会因个人环境和需求而有所不同。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值