如何配置uboot

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何配置uboot相关的知识,希望对你有一定的参考价值。

这几天,在做uboot的移植,有很多现成的方法。无非就是第一步怎么做,第二步怎么做,做来做去。虽然是做出来了,但是还是有很多迷惑。为什么这么做?
为什么这么做就好使?这些文件时怎么组织起来的?是怎么连接在一起的?于是便狠下心来,查查书,思考思考,下面就把这几天的成果跟大家分享一下。
我们在进行uboot的移植时。在我们修改完代码时。
首先做的是执行这样一条指令
例如:
make s3c2440_config
这条指令实际上是指向了一条更长的指令
这条指令在uboot根目录下的makefile中自己定义的,跟你的开发板相关;
s3c2440_config:unconfig
@$(MKCONFIG) $(@:_config=) arm arm920t s3c2440 NULL s3c24x0
这条指令指向的执行文件是MKCONFIG
通过阅读MKCONFIG 文件源码我们可以看出。MKCONFIG有如下作用
第一:确定开发板的名字就是BOARD_NAME
-n) shift ; BOARD_NAME =" $1%%_config";shift;;
第二:创建到平台/开发板的头文件的链接
ln -s asm-$2 asm
$2 便是我们第一条指令传递出来的arm,
还有如下代码
ln -s $LNPREFIXarch-$6 asm-$2/arch
这样s3c24x0也发挥作用了。
第三:创建顶层Makefile包含的文件include/config.mk
第四:创建开发板相关的头文件 include/config.h
在config.h这个文件里,存放的是开发板的配置信息。
只有以下两类宏
(1)一类是选项CONFIG开头,用来选择CPU,SOC,开发板类型,设置系统时钟,选择设备驱动
(2)另一类是参数 用CFG来开头,如设置malloc缓冲池的大小,U-boot的提示符,u-boot下载文件的默认加载地址,flash的起始地址。
开发板的第一个参数,将编译文件分别指向了/board/$board_name and cpu/$cpu/
所以才会产生如下的编译结果。
(1)首先编译/board/$board_name/start.S,对于不同的CPU,还可能编译cpu/$(CPU)下的其他文件。
(2)然后,对于平台/开发板相关的每个目录、每个通用目录都使用它们各自的Makefile生成相应的库。
(3)将1,2步骤生成的.o、.a文件安装board/$(BOARDDDIR)/U-boot.lds连接脚本进行连接。
(4)第3步得到的是ELF格式的u-boot,后面Makefile还会将它转换为二进制格式,s_Record格式。
参考技术A 这个是苹果里的?

从0移植uboot _编译最小可用uboot

来源:Linux社区  作者:xiaojiang1025  :http://www.linuxidc.com/Linux/2017-02/141020.htm

 

前两篇介绍了uboot-2013.01的配置原理以及大体的运行流程,本文将讨论如何对uboot源码进行配置,将一个可用的uboot烧录到SD卡中。

定制自己的core board

市面上能买到的开发板的核心板基本都是基于官方参考板制作的,所以虽然标准操作是"定制"自己的core board,但鉴于我的板子的核心板是基于三星的参考板做的,所以我们做的主要工作就是按照(一)中的原理,编写(山寨)我们"自己的"核心板配置。我们需要的目录是"board/samsung/origen/",这部分的主要功能就是将其中的文件"改名字"。首先来认识一下原版以示尊重

board/samsung/origen/

$ls board/samsung/origen/
lowlevel_init.S  Makefile  mem_setup.S  mmc_boot.c  origen.c  origen_setup.h  tools

接下来就开始我们的山寨工作

//山寨参考板目录
$cp -arf ./board/samsung/origen ./board/samsung/xboot

//山寨关键文件
$mv ./board/samsung/xboot/origen.c ./board/samsung/xboot/xboot.c

uboot的编译系统和内核的类似,所以Makefile也得改(./board/samsung/xboot/Makefile)
from

 30 ifndef CONFIG_SPL_BUILD
 31 COBJS   += origen.o
 32 endif

to

 30 ifndef CONFIG_SPL_BUILD
 31 COBJS   += xboot.o
 32 endif

include/configs/origen.h

用于配置整个板子的头文件也不能放过

$cp include/configs/origen.h include/configs/xboot.h

from

104 #define CONFIG_SYS_PROMPT               "ORIGEN # "
133 #define CONFIG_IDENT_STRING             " for ORIGEN"

to

104 #define CONFIG_SYS_PROMPT               "xboot # "
133 #define CONFIG_IDENT_STRING             " for xboot"

boards.cfg

最后,别忘了我在上文提到的boards.cfg文件,如果这里面不动手脚,我们的板子是不会被Makefile找到的,So,

 284 origen                       arm         armv7       origen              samsung        exynos
 285 xboot                        arm         armv7       xboot               samsung        exynos  

和之前一样,至此,我们就可以先编译一下过过手瘾(顺便检查一下配置^-^),

  1 #!/bin/bash            
  2 CPU_NUM=$(grep processor /proc/cpuinfo | awk ‘{field=$NF};END{print field+1}‘)
  3 export ARCH=arm
  4 export CROSS_COMPILE=/opt/arm-cross-compile/arm-2014.05/bin/arm-none-linux-gnueabi-
  5 newName="xboot"
  6 make distclean
  7 make ${newName}_config
  8 make  -j${CPU_NUM}

上面是编译的小脚本,下面是编译的输出。
技术分享图片

编译and烧录

按照(一)中介绍的,此时已经可以"make xboot_config;make -8"并得到uboot.bin,但此时这个uboot.bin是不能直接烧录的。但无论如何,请暂且记住它的大小:176568byte。接下来,我们需要对uboot.bin进行一系列处理使它能够在exynos4412上运行,这其中要用到下面的几个命令或三星提供的工具软件,这些操作的目的就是根据三星的芯片的启动要求对uboot.bin 进行一些处理,包括在特定长度的位置加上和校验信息以及插入一些文件段。

$split -b 14336 uboot.bin bl2
$chksum
$add_padding
$rm bl2a*
$cat E4412_N.bl1.SCP2G.bin bl2.bin all00_padding.bin u-boot.bin tzsw_SMDK4412_SCP_2GB.bin >xboot.bin

我们可以使用脚本一次性完成上面的工作。

make -j${CPU_NUM}
 
cp tools/mkimage /usr/bin/
cp u-boot.bin ${ROOTDIR}/sdfuse_q

cd ${ROOTDIR}/sdfuse_q
split -b 14336 u-boot.bin bl2   #split u-boot to bl2a... why14336???==>参考三星bl2对uboot的校验方式,它会读取14336处的CS校验码
make     #编译chksum
${ROOTDIR}/sdfuse_q/chksum      #源码显示程序生成的校验码并没有回写到uboot,即uboot还是没有校验,不知道为什么还成功了,但是这个>
${ROOTDIR}/sdfuse_q/add_padding
rm bl2a*
cp u-boot.bin ${ROOTDIR}/CodeSign4SecureBoot/

cd ${ROOTDIR}/CodeSign4SecureBoot
cat E4412_N.bl1.SCP2G.bin bl2.bin all00_padding.bin u-boot.bin tzsw_SMDK4412_SCP_2GB.bin > u-boot-${newName}.bin
rm ./u-boot.bin
cp -a ./u-boot-${newName}.bin $TFTPDIR
cp ./u-boot-${newName}.bin ../mk_sdboot/
 
cd ${ROOTDIR}/mk_sdboot
sudo ./sd_fusing_exynos4x12.sh /dev/sdb u-boot-${newName}.bin 

至此,我们就得到了一个能使用的镜像xboot.bin,这个xboot.bin的大小:527104byte!然后我们就可以使用另外的一些工具烧录到SD卡,注意如果你的开发主机对直接读取SD卡的支持不是很好的话,可以使用读卡器,不论是虚拟机还是Linux主机,对USB设备的支持还是让人满意的,烧录很简单,我们只需要执行下下面的"./sd_fusing_exynos4x12.sh /dev/your_SD_device u-boot-xboot.bin"即可,这个脚本是三星公司提供的,就是将镜像烧录到SD卡中,下面是我用的,贴出来供参考。

#!/bin/sh
#
# Copyright (C) 2010 Samsung Electronics Co., Ltd.
#              http://www.samsung.com/
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License version 2 as
# published by the Free Software Foundation.
# sd_fusing_exynos4x12.sh
####################################
reader_type1="/dev/sd"
reader_type2="/dev/mmcblk0"

if [ -z $2 ]
then
    echo "usage: ./sd_fusing.sh <SD Reader‘s device file> <filename>"
    exit 0
fi

param1=`echo "$1" | awk ‘{print substr($1,1,7)}‘`

if [ "$param1" = "$reader_type1" ]
then
    partition=$1"1"
elif [ "$1" = "$reader_type2" ]
then
    partition=$1"p1"
else
    echo "Unsupported SD reader"
    exit 0
fi

if [ -b $1 ]       
then
    echo "$1 reader is identified."
else
    echo "$1 is NOT identified."
    exit 0
fi

####################################
echo "----------------------------------"
echo $partition
echo "----------------------------------"

# format
umount $partition 2> /dev/null

echo "$2 fusing..."
dd iflag=dsync oflag=dsync if=./$2 of=$1 seek=1 &&         echo "$2 image has been fused successfully."

####################################
#<Message Display>
echo "Eject SD ca

将启动模式调整到从SD卡启动,uboot就可以跑起来了。

以上是关于如何配置uboot的主要内容,如果未能解决你的问题,请参考以下文章

如何配置uboot

一文看懂如何配置OK335x平台 uboot环境变量工具

启动uboot后,网线断开

从0移植uboot _编译最小可用uboot

请问Jenkins如何配置自动或定时编译?

嵌入式linux核心课程 2.uboot和系统移植-第4部分-2.4.uboot配置和编译过程详解