关于uboot的功能分析透彻方案

发布时间:2023-01-11  

如果我们想快速的移植uboot,那么我们就要先将我们用到的uboot的功能分析透彻,uboot最终目的就是**引导内核**,但是在实际开发中为了方便开发调试,我们将uboot加入了很多功能,比如tftp下载,nfs启动,串口打印等功能;那么我们先按着执行的顺序来分析代码。


uboot并没有对2440进行支持,所以我们分析阶段先分析smdk2410的相关代码,分析完成以后我们在根据s3c2440的技术手册在2410的基础上进行移植。


Makefile分析

首先我们根据编译过程进行分析,编译需要执行命令:

make smdk2410_config

我们查看根目录下Makefile文件,搜索smdk2410_config得到如下代码:

smdk2410_config : unconfig

@$(MKCONFIG) $(@:_config=) arm arm920t smdk2410 NULL s3c24x0在Makefile中;

@表示不打印后面的命令。

$(MKCONFIG)我们通过搜索MKCONFIG得到其定义如下:

MKCONFIG := $(SRCTREE)/mkconfig

SRCTREE定义如下:
SRCTREE := $(CURDIR)
CURDIR在Makefile中为内嵌变量,自动设置为当前的目录。所以$(MKCONFIG)就等于当前目录下的mkconfig文件;$(@:_config=)表示将目标文件的_config变为空,也就是取消目标文件的_config。

所以命令解析如下

smdk2410_config : unconfig
@mkconfig $(@:_config=) arm arm920t smdk2410 NULL s3c24x0
所以当我们执行make smdk2410_config的时候实际是执行的是:
./mkconfig smdk2410 arm arm920t smdk2410 NULL s3c24x0
$1 $2 $3 $4 $5 $6

分析根目录下mkconfig
while [ $# -gt 0 ] ; do
case "$1" in
--) shift ; break ;;
-a) shift ; APPEND=yes ;;
-n) shift ; BOARD_NAME="${1%%_config}" ; shift ;;
*) break ;;
esac
done

$#表示了传递进来的参数的个数;

-gt表示大于(>)的含义;

首先如果传递的参数个数大于0,则执行,然后在判断$1是不是--、-a、-n、*等符号,如果是则执行相应的分支,否则继续向下执行。

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

如果没有定义BOARD_NAME,则让BOARD_NAME=$1在这里就是BOARD_NAME=$1=smdk2410

[ $# -lt 4 ] && exit 1
[ $# -gt 6 ] && exit 1

-lt是小于(
也就是判断传递进来的个数是否是小于4个或者是大于6个,如果小于4个或者大于6个则退出。

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

打印信息Configuring for smdk2410 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
fi

上面代码if [ "$SRCTREE" != "$OBJTREE" ] ; 是判断SRCTREE 是否等于OBJTREE?

如果不等,则执行if 分支,如果相等等执行else分支,在顶层makefile 下查找可知SRCTREE 和OBJTREE 定义如下:

OBJTREE := $(if $(BUILD_DIR),$(BUILD_DIR),$(CURDIR))
SRCTREE := $(CURDIR)
所以:

OBJTREE := $(if $(BUILD_DIR),$(BUILD_DIR),$(CURDIR))

含义:如果定义BUILD_DIR 则OBJTREE=BUILD_DIR 否则OBJTREE=CURDIR搜索mkconfig 可知:BUILD_DIR 没有定义,即OBJTREE=CURDIR所以:SRCTREE := $(CURDIR)即SRCTREE=CURDIR,BJTREE=CURDIR 并且SRCTREE=CURDIR 所以SRCTREE=OBJTREE所以执行else 分支;

else 分支作用如下:

执行上面面三句,就相当于建立一个链接文件asm,它指向$2(即arm)。

这样做的原因?

当我们在源码中包含#include的时候不需要改动,如果是i386 呢?Avr32
呢?所以建立这个链接是为了不需要我们总是修改代码,则直接写#include即可。

rm -f asm-$2/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 为空或者为NULL 则执行ln -s ${LNPREFIX}arch-$3 asm-$2/arch而$6=s3c6410 所以if 分支忽略即执行else 分支ln -s ${LNPREFIX}arch-$6 asm-$2/arch

分析ln -s ${LNPREFIX}arch-$6 asm-$2/arch执行上面语句相当于在asm-arm($2)目录下面建立一个链接文件arch而链接文件arch 的指向是arch-s3c6410($6)。

if [ "$2" = "arm" ] ; then
rm -f asm-$2/proc
ln -s ${LNPREFIX}proc-armv asm-$2/proc
fi
通过对$2的判断发现执行此分支。

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文件并且将下面内容添加进config.mk文件:

ARCH = arm
CPU = arm920t
BOARD = smdk2410
VENDOR = NULL
SOC = s3c24x0

if [ "$APPEND" = "yes" ] # Append to existing config file
then
echo >> config.h
else
> config.h # Create new config file
fi
判断APPEND定义是否等于yes开头定义APPEND等于no,所以执行else分支,新建config.h文件

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

在config.h里面追加内容:

/* Automatically generated - do not edit */
#include


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

相关文章

    程序对内存需求比较大,所以外扩了一片64 KB的SRAM。通常,程序的下载可通过3种方式实现:①采用嵌入式实时操作系统。该方法加大了系统对存储容量的要求,增加了硬件和软件成本。②采用......
    才能够更为彻底的理解为什么Secure Boot实现策略要这么来做才更加安全。 代码明文加密与对称加密算法 为了保护软件版本IP,防止代码被恶意篡改,因此有必要针对软件版本进行加密处理,即针对代码明文进行加密处理。 AES......
    浅谈单片机Boot的几种自刷新方式;汽车软件Boot程序的主要作用是刷新App程序。在一个具体客户项目中,Boot也是客户需求的一部分,跟随项目也有软件开发计划(有的为了和其它Boot区分,把项......
    u-boot移植(一)---准备工作;一、工具链的制作 1.1 工具   软件工具:crosstool-ng   下载地址:git clone https://github.com......
    能稳定地运行在开发板上。U-Boot引导程序是嵌入式Linux系统软件开发中的一个重要环节。在此通过分析U-Boot的代码结构和启动过程,并针对开发板系统的硬件资源,通过分析与调试,实现了U-Boot的移......
    linux移植u-boot(一)——U-Boot详解+自定义命令实战;一、Bootloader     简单地说:Bootloader主要功能就是 在系统上电时开始执行,初始化硬件和设备,准备好软件......
    安全存储与使用是嵌入式系统中常见的安全功能需求之一。MCU上对于密钥的保护通常会从几个方面着眼 : 调试端口访问:避免通过调试端口获取密钥,通常通过调试端口保护机制来实现 软件代码访问:禁止任意软件......
    -linux-gcc-4.3.2.tgz u-boot:u-boot-2009.08.tar.bz2 二、移植步骤 5)准备进入u-boot的第二阶段(在u-boot中添加对我们开发板上Nand......
    u-boot-2011.06在基于s3c2440开发板的移植之硬件ECC;为了理解u-boot是如何进行硬件ECC的,我们先来简要地分析一下相关的函数。NandFlash是以......
    方式与F系列大致相同。   1.2 STM32G系列BOOT mode变换操作 本次操作流程硬件使用NUCLEO-G431RB开发板为例,软件使用STM32CubePrg。   STM32G431RBT6......

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>