历史上的今天
返回首页

历史上的今天

今天是:2026年01月11日(星期日)

2023年01月11日 | 关于uboot的功能分析透彻方案

2023-01-11 来源:elecfans

如果我们想快速的移植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


推荐阅读

史海拾趣

Eagle Plastic Devices公司的发展小趣事

随着全球环保意识的不断提高,Eagle Plastic Devices公司也开始将环保理念融入产品研发和生产过程中。公司采用环保材料、改进生产工艺、降低能耗和排放等措施,努力降低产品对环境的影响。同时,公司还积极参与环保公益活动,倡导绿色消费和可持续发展。这些举措不仅提升了公司的品牌形象,也为公司带来了更多的市场机遇。

Fujitsu America公司的发展小趣事

随着云计算技术的兴起,Fujitsu America紧跟时代潮流,积极推动云计算服务的全球化布局。公司凭借其强大的技术实力和丰富的行业经验,为北美乃至全球的企业客户提供了一站式的云计算解决方案和服务。Fujitsu America的云计算服务不仅涵盖了基础设施即服务(IaaS)、平台即服务(PaaS)和软件即服务(SaaS)等多个层面,还注重与客户的深度合作,根据客户的实际需求提供定制化的解决方案,帮助客户实现数字化转型和业务升级。

Baneasa SA公司的发展小趣事

面对日益增长的市场需求,Baneasa SA意识到必须提升产能以满足客户的需求。于是,公司投入大量资金对生产线进行升级改造,引进了先进的生产设备和技术。这些举措使得Baneasa SA的产能得到了大幅提升,同时也保证了产品质量的稳定性和可靠性。

晨晶电子(Chenjing Electronics)公司的发展小趣事

晨晶电子的前身是始建于1958年的国营第七O七厂。作为一家具有深厚历史底蕴的企业,它在中国电子行业的发展历程中扮演了重要角色。然而,随着时代的变迁和市场环境的转变,国营第七O七厂逐渐面临着体制僵化、市场竞争力下降等问题。为了适应现代企业制度的要求,该厂在2000年进行了转制,成立了北京晨晶电子有限公司。这一转制不仅为企业注入了新的活力,也为其后续的发展奠定了坚实基础。

迪一电子公司的发展小趣事

随着市场的不断变化和技术的快速发展,迪一电子公司意识到必须不断创新才能保持竞争力。于是,公司加大研发投入,引进高端技术人才,与国内外知名科研机构合作,成功研发出一系列具有竞争力的新产品。这些新产品不仅提高了公司的市场占有率,还为公司赢得了良好的口碑。

EPCOS/TDK公司的发展小趣事

2009年,EPCOS与TDK元件事业部合并,标志着两家公司在电子元器件领域的强强联合。合并后的公司更名为TDK-EPC,由位于日本的TDK-EPC公司管理。这一合并进一步增强了EPCOS在电子元器件领域的实力,使其在全球市场中的地位更加稳固。合并后,公司继续投入大量研发资源,致力于开发更小、更轻、更高效的电子元器件,以满足不断增长的市场需求。

问答坊 | AI 解惑

uwb无线定位应用

工业生产自动化★ iLocateTM生产可视化系统是采用超宽带射频技术构建的实时定位系统(RTLS)。该系统具有高速率、低功耗、抗干扰的特点,并能够在传统的应用环境中达到15cm的3D定位精度。在现代工业制造领域,该系统能够真实地虚拟工厂车间生产环境 ...…

查看全部问答>

什么是混得好

前年的春节,我去参加了高中同学毕业后的第一次聚会,聚会后一位因事无缘参加的同学问我:“咱们同学里谁混得最好?”这个问题着实让我愣了一下,同学中有自由职业者、有自己办企业的老板、有打工的职业经理、有专业领域的技术专家、有政府部局委办 ...…

查看全部问答>

[求助]关于用GPRS终端与我的电脑通信的问题

大家好,请教个问题~ 打算用ARM+GPRS模块做个终端,欲让它与我的电脑通信,现在有如下问题: 我电脑是ADSL上网的,ipconfig显示IP为192.168.0.xx; 在www.ip138.com上显示的我的公网IP是125.37.172.xx。 那么我的电脑到底具有不具有公网IP?我的 ...…

查看全部问答>

请教多显示终端的问题!

50台以上触摸屏! 怎么样才能实现,一台服务器,向触摸屏发送不同的数据, 以及,触摸屏发送不同的数据到,一台服务器呢? 或者是,触摸屏+单片机+无线网卡! 这样能不能实现呢? 敬请赐教!考虑成本与效率!…

查看全部问答>

今天在STM32的英文论坛上看到一个网友写的STM32ISP下载器

大家可以试试看:http://www.mcuisp.com/software/eispV05.rar英文论坛的有关讨论:http://www.st.com/mcu/forums-cat-7588-23.html…

查看全部问答>

ST宣布以90nm工艺生产的STM32系列,带Flash的MCU产品

即将交付给重要客户进行测试,并在2010年投入量产。 中文版新闻见13楼。 ST Unveils World’s First ARM Cortex-M Series Microcontrollers Featuring Advanced 90nm Embedded Flash Technology 90nm Embedded Flash technology will furt ...…

查看全部问答>

STM32F的flash当做EPROM用,出问题

                                 STM32说flash可以当EPROM用,我用了一个多月后发现不能读写(同一块板,同一个CPU)不知怎么搞的,后来考虑到安全 ...…

查看全部问答>

天楹(上海)光电科技有限公司急聘!!

天楹(上海)光电科技有限公司急聘以下岗位:岗位名称:测试技术员具体要求:1、协助测试工程师完成指定的测试项目;2、对测试结果进行记录并填写测试记录表;3、对测试设备和测试场地进行日常的维护及清洁。1、中专以上学历,机电、机械、电子、测 ...…

查看全部问答>

HID设备通信难题

自己的硬件设备模拟成HID设备,然后在内核层通过 IOCTL_HID_SET_FEATURE 和 IOCTL_HID_GET_FEATURE 与之通信都是失败的,返回错误值为0xc00000010(STATUS_INVALID_DEVICE_REQUEST),但是通过 IOCTL_HID_GET_COLLECTION_INFORMATION 确能通信成功 ...…

查看全部问答>

FPGA 3G数据传输项目探讨

本人要做一个3G数据传输的项目,在网上找资料时发现基本上都是用ARM+LINUX做的,用FPGA做的比较少,相关资料也比较少。研究了两天,大致想了下方案,现在有几个问题和大家讨论下。 1.3G模块打算华为的EM770W或MU509,可是这样的模块都是MINI PCI接 ...…

查看全部问答>