U-Boot移植之前期分析(上)

老是看别人移植uboot,用别人移植好的uboot,今天终于下定决心自己移植一个uboot来玩玩,好歹我也是个软件开发人员啊。

第一步:去ftp://ftp.denx.de/pub/u-boot/网站下载个uboot工程源码,为了防止环境出问题,我决定用个老一点的,于是就下了:u-boot-1.1.6.tar.bz2。

第二步:解压源码:tar  jxvf  u-boot-1.1.6.tar.bz2。

第三步:建立source insight工程

好了完成以上三步之后,我们需要的前提条件都准备好了,下面在着手移植前需要大概了解一下u-boot的整体目录结构、配置编译及启动流程。

一、整体目录:大体可以分为以下四类

1. 平台相关或开发板相关的:board、cpu、lib_arm等(lib_xxx)

2. 通用的函数:include、lib_generic、common

3. 通用的设备驱动程序:disk、drivers、dtt、fs、nand_spl、net、post、rtc

4. 工具、示例程序及文档:doc、examples、tools

二、u-boot的配置编译过程(红色标记是关键部分)

1. 顶层目录下makefile的分析过程

VERSION = 1

PATCHLEVEL = 1

SUBLEVEL = 6

### 添加子版本信息

EXTRAVERSION =(2014-04-27)

U_BOOT_VERSION = $(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)

###版本信息输出文件

VERSION_FILE = $(obj)include/version_autogenerated.h

### 定义主机系统架构

# uname -m => i686

# “sed –e”表示后面跟的是一串命令脚本,而表达式“s/abc/def/”表示要从标准输入中,

#查找到内容为“abc”的,然后替换成“def”。其中“abc”表达式可以使用“.”作为通配符。

#命令“uname –m”将输出主机CPU的体系架构类型。作者的电脑使用Intel Core2系列的CPU,

#因此“uname –m”输出“i686”。 “i686”可以匹配命令“sed -e s/i.86/i386/”中的“i.86”,

#因此在作者的机器上执行Makefile,HOSTARCH将被设置成“i386” 。

HOSTARCH := $(shell uname -m | \

sed -e s/i.86/i386/ \

-e s/sun4u/sparc64/ \

-e s/arm.*/arm/ \

-e s/sa110/arm/ \

-e s/powerpc/ppc/ \

-e s/macppc/ppc/)

### 定义主机操作系统类型

# uname -s => Linux

# uname -s | tr ‘[:upper:]‘ ‘[:lower:]‘  =>  linux

HOSTOS := $(shell uname -s | tr ‘[:upper:]‘ ‘[:lower:]‘ | \

sed -e ‘s/\(cygwin\).*/cygwin/‘)

###输出变量

export HOSTARCH HOSTOS

###设定编译输出目录

#$(origin O) => undefine

#函数$( origin, variable) 输出的结果是一个字符串,输出结果由变量variable定义的方式决定,

#若variable在命令行中定义过,则origin函数返回值为"command line"。假若在命令行中执行了

#“export BUILD_DIR=/tmp/build”的命令,则“$(origin O)”值为“command line”,而BUILD_DIR被设置为“/tmp/build”。

ifdef O

ifeq ("$(origin O)", "command line")

BUILD_DIR := $(O)

endif

endif

#若${BUILD_DIR}表示的目录没有定义,则创建该目录。

#$(BUILD_DIR) $(saved-output) => 空

ifneq ($(BUILD_DIR),)

saved-output := $(BUILD_DIR)

# Attempt to create a output directory.

$(shell [ -d ${BUILD_DIR} ] || mkdir -p ${BUILD_DIR})

# Verify if it was successful.

BUILD_DIR := $(shell cd $(BUILD_DIR) && /bin/pwd)

#若$(BUILD_DIR)为空,则将其赋值为当前目录路径(源代码目录)。并检查$(BUILD_DIR)目录是否存在。

$(if $(BUILD_DIR),,$(error output directory "$(saved-output)" does not exist))

endif # ifneq ($(BUILD_DIR),)

###CURDIR变量指示Make当前的工作目录,由于当前Make在U-Boot顶层目录执行Makefile,

#因此CURDIR此时就是U-Boot顶层目录。执行完上面的代码后,SRCTREE,src变量就是

#U-Boot代码顶层目录,而OBJTREE,obj变量就是输出目录,若没有定义BUILD_DIR环境变量,

#则SRCTREE,src变量与OBJTREE,obj变量都是U-Boot源代码目录。而MKCONFIG则表示U-Boot根目录下的mkconfig脚本。

#CURDIR => 顶层目录

#SRCTREE => 顶层目录

#LNDIR OBJTREE => 输出目录即顶层目录

### OBJTREE和LNDIR为存放生成文件的目录,TOPDIR与SRCTREE为源码所在目录

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

SRCTREE := $(CURDIR)

TOPDIR := $(SRCTREE)

LNDIR := $(OBJTREE)

export TOPDIR SRCTREE OBJTREE

### 顶层目录下的配置文件

MKCONFIG := $(SRCTREE)/mkconfig

export MKCONFIG

### 本地编译不会执行这几行代码

ifneq ($(OBJTREE),$(SRCTREE))

REMOTE_BUILD := 1

export REMOTE_BUILD

endif

# $(obj) and (src) are defined in config.mk but here in main Makefile

# we also need them before config.mk is included which is the case for

# some targets like unconfig, clean, clobber, distclean, etc.

ifneq ($(OBJTREE),$(SRCTREE))

obj := $(OBJTREE)/

src := $(SRCTREE)/

else

obj :=

src :=

endif

export obj src

#########################################################################

ifeq ($(OBJTREE)/include/config.mk,$(wildcard $(OBJTREE)/include/config.mk))

# load ARCH, BOARD, and CPU configuration

include $(OBJTREE)/include/config.mk

export ARCH CPU BOARD VENDOR SOC

.......

#确定编译工具

ifeq ($(ARCH),arm)

CROSS_COMPILE = arm-linux-

endif

#确定链接选项指定链接文件

# load other configuration

include $(TOPDIR)/config.mk

{

###注:此处是$(TOPDIR)/config.mk下比较重要的内容

.......

ifdef
VENDOR

BOARDDIR = $(VENDOR)/$(BOARD)

else

BOARDDIR = $(BOARD)

endif

......

ifeq ($(CONFIG_NAND_U_BOOT),y)

LDSCRIPT := $(TOPDIR)/board/$(BOARDDIR)/u-boot-nand.lds

else

LDSCRIPT := $(TOPDIR)/board/$(BOARDDIR)/u-boot.lds

endif

......

LDFLAGS += -Bstatic -T $(LDSCRIPT) -Ttext $(TEXT_BASE) $(PLATFORM_LDFLAGS)

}

#uboot编译连接的第一个文件

OBJS  = cpu/$(CPU)/start.o

.......

#uboot编译过程中会编译的库文件

LIBS  = lib_generic/libgeneric.a

LIBS += board/$(BOARDDIR)/lib$(BOARD).a

LIBS += cpu/$(CPU)/lib$(CPU).a

ifdef SOC

LIBS += cpu/$(CPU)/$(SOC)/lib$(SOC).a

endif

LIBS += lib_$(ARCH)/lib$(ARCH).a

LIBS += fs/cramfs/libcramfs.a fs/fat/libfat.a fs/fdos/libfdos.a fs/jffs2/libjffs2.a \

fs/reiserfs/libreiserfs.a fs/ext2/libext2fs.a

LIBS += net/libnet.a

LIBS += disk/libdisk.a

LIBS += rtc/librtc.a

LIBS += dtt/libdtt.a

LIBS += drivers/libdrivers.a

LIBS += drivers/nand/libnand.a

LIBS += drivers/nand_legacy/libnand_legacy.a

LIBS += drivers/sk98lin/libsk98lin.a

LIBS += post/libpost.a post/cpu/libcpu.a

LIBS += common/libcommon.a

LIBS += $(BOARDLIBS)

LIBS := $(addprefix $(obj),$(LIBS))

.PHONY : $(LIBS)

#make时编译执行的目录

ALL = $(obj)u-boot.srec $(obj)u-boot.bin $(obj)System.map $(U_BOOT_NAND)

all: $(ALL)

$(obj)u-boot.hex: $(obj)u-boot

$(OBJCOPY) ${OBJCFLAGS} -O ihex $< [email protected]

$(obj)u-boot.srec: $(obj)u-boot

$(OBJCOPY) ${OBJCFLAGS} -O srec $< [email protected]

$(obj)u-boot.bin: $(obj)u-boot

$(OBJCOPY) ${OBJCFLAGS} -O binary $< [email protected]

$(obj)u-boot.img: $(obj)u-boot.bin

./tools/mkimage -A $(ARCH) -T firmware -C none \

-a $(TEXT_BASE) -e 0 \

-n $(shell sed -n -e ‘s/.*U_BOOT_VERSION//p‘ $(VERSION_FILE) | \

sed -e ‘s/"[
]*$$/ for $(BOARD) board"/‘) \

-d $< [email protected]

$(obj)u-boot.dis: $(obj)u-boot

$(OBJDUMP) -d $< > [email protected]

$(obj)u-boot: depend version $(SUBDIRS) $(OBJS) $(LIBS) $(LDSCRIPT)

UNDEF_SYM=`$(OBJDUMP) -x $(LIBS) |sed  -n -e ‘s/.*\(__u_boot_cmd_.*\)/-u\1/p‘|sort|uniq`;\

cd $(LNDIR) && $(LD) $(LDFLAGS) $$UNDEF_SYM $(__OBJS) \

--start-group $(__LIBS) --end-group $(PLATFORM_LIBS) \

-Map u-boot.map -o u-boot

#调用相应子目录下的makefile

$(OBJS):

$(MAKE) -C cpu/$(CPU) $(if $(REMOTE_BUILD),[email protected],$(notdir [email protected]))

$(LIBS):

$(MAKE) -C $(dir $(subst $(obj),,[email protected]))

$(SUBDIRS):

$(MAKE) -C [email protected] all

#make MY_JZ2440_config首先要执行的命令:用于删除上一次的配置信息

#########################################################################

unconfig:

@rm -f $(obj)include/config.h $(obj)include/config.mk \

$(obj)board/*/config.tmp $(obj)board/*/*/config.tmp

#make MY_JZ2440_config时执行的操作

#重点是:@$(MKCONFIG) $(@:_config=) arm arm920t MY_JZ2440 sumsung s3c24x0

#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

#  add by lhbo

#  MY_JZ2440_config

#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

MY_JZ2440_config : unconfig

##  step0:unconfig是用于清楚上一次的config信息等

##  step1:输出一些基本信息

@echo "=============================================="

@echo "=================made by lhbo================="

@echo "=============================================="

@echo "UBOOT Version : $(U_BOOT_VERSION)"

@echo "HOST ARCH     : $(HOSTARCH)"

@echo "HOST OS       : $(HOSTOS)"

@echo "BUILD_DIR     : $(BUILD_DIR)"

@echo "obj           : $(obj)"

@echo "TOPDIR        : $(TOPDIR)"

@echo "SRCTREE       : $(SRCTREE)"

@echo "OBJTREE       : $(OBJTREE)"

@echo "MKCONFIG      : $(MKCONFIG)"

@echo "=============================================="

##  step2:调用执行配置脚本

##  target ARCH CPU BOARD VENDOR SOC

@$(MKCONFIG) $(@:_config=) arm arm920t MY_JZ2440 sumsung s3c24x0

注:2. 顶层目录下mkconfig的分析过程 和 三、u-boot启动流程 内容请见博文“U-Boot移植之前期分析(下)”

U-Boot移植之前期分析(上),码迷,mamicode.com

时间: 2024-10-09 07:06:57

U-Boot移植之前期分析(上)的相关文章

U-Boot移植之前期分析(下)

接U-Boot移植之前期分析(上): 2. 顶层目录下mkconfig的分析过程 在上面的分析中知道了语句:"@$(MKCONFIG) $(@:_config=) arm arm920t MY_JZ2440 sumsung s3c24x0"对应于执行顶层目录下的mkconfig文件并传递了六个参数 ($0-$6):100ask24x0 arm arm920t 100ask24x0 NULL s3c24x0.下面分析这句话的到底做了什么事情,具体可以阅读源码,由于比较简单这里直接列出具体

[MFC] VS2013版本MFC工程移植到VC6.0上

:VS虽号称“宇宙最强IDE”,但是有时候安装包太大,动不动就几个G:而且安装好之后也会多出很多几乎很难用到的部分,这对于那些处女座的人如何忍受!本文不是吐槽,而是给出一种在应急场景下,不用安装新版本几个G的IDE,而是将高版本的工程移植到低版本的IDE中,并使其工作和调试的解决方法~ VS2013版本MFC工程移植到VC6.0上 1.场景再现 我最近搞了个ubuntu系统,并在virtualbox中装了个win7用于安装设计PCB和嵌入式集成开发环境Keil.项目需要,得用到我之前写的一个将图

理解boot.img与逆向分析Android/linux内核

一些尝试和理解. 1>提取boot.img: 其中,msm代表是高通的芯片,msm_sdcc.1是外接的SD卡挂载的目录,by-name指的是这个sd卡分区的名称.下面几行代表每个分区存储的东西. 记得提前su,dd if=/dev/block/mmcblk0p8 of=/data/local/tmp/boot.img.将boot.img dump出来 adb root获得root权限,将boot.img 移到pc上. 2>boot.img格式分析 如system/core/mkbootimg

java/matlab混合编程应用移植到其他电脑上遇到的问题

问题1:jar包部署在其他电脑上设置vm参数无效 @echo off start java -Xmx1028M -Xms1028M -XX:PermSize=100M -XX:MaxPermSize=100M -XX:SurvivorRatio=8 -jar Edition_1.0_fat.jar 要把参数设置在前面才有效,开始把jar包放前面虽然自己电脑能运行但是其他人的电脑不能运行 问题2:# An unexpected error has been detected by HotSpot

第二章、Tiny4412 U-BOOT移植二 启动分析【转】

本文转载自:http://blog.csdn.net/eshing/article/details/37521481 版权声明:本文为博主原创文章,未经博主允许不得转载. 一.启动过程说明 讲解启动过程,首先的源头就是打开电源,这个相信没人人不知道.CPU上电后,此时SP指针指向0x0000_0000,从这个地址取第一条指令.但此时:PLL没有启动,CPU工作频率为外部输入晶振频率,非常低(Exynos4412芯片边上有一颗24MHz,一颗27MHz,一颗32.768KHz):CPU的工作模式.

spring boot应用启动原理分析

spring boot quick start 在spring boot里,很吸引人的一个特性是可以直接把应用打包成为一个jar/war,然后这个jar/war是可以直接启动的,不需要另外配置一个Web Server. 如果之前没有使用过spring boot可以通过下面的demo来感受下. 下面以这个工程为例,演示如何启动Spring boot项目: git clone [email protected]:hengyunabc/spring-boot-demo.git mvn spring-b

mini2440移植uboot 2011.03(上)

参考博文: <u-boot-2011.03在mini2440/micro2440上的移植> 本来我想移植最新版的uboot,但是移植却不太成功,所以先模仿他人的例子重新执行一遍,对uboot更熟悉后再开始新版本的移植. 操作系统: debian 7.4 uboot:   u-boot-2011.03(下载地址) 交叉编译器:arm-linux-gcc 4.4.3(下载地址) 执行过程如下: 移植(一)基本配置: 在boards.cfg下添加一行: mini2440 arm arm920t -

Spring Boot实战与原理分析

1:Spring Boot概述与课程概要介绍 2:Spring4 快速入门 3:Spring4 扩展分析(一) 4:Spring4 扩展分析(二) 5:Spring Boot 快速入门 6:Spring Boot 配置分析(一) 7:Spring Boot 配置分析(二) 8:Spring Boot 自动配置 9:Spring Boot @Enable*注解的工作原理 10:Spring Boot @EnableAutoConfiguration深入分析 11:Spring Boot 事件监听

grub的boot loader安装在磁盘上的位置

在很多资料上介绍grub的引导过程时,都是:bios->MBR->boot loaderboot loader是grub或者lilo.但是他是放在什么位置?很多资料上都没有标明. 通过阅读文档http://www.iamting.com/user1/1032/archives/2006/3089.html.中制作grub引导软盘的过程:cd /boot/grub  dd if=stage1 of=/dev/fd0 bs=512 count=1  dd if=stage2 of=/dev/fd0