U-boot(二):主Makefile

        本文主要探讨210的主Makefile。

Makefile

        uboot版本号:
                VERSION:主板本号
                PATCHLEVEL:次版本号
                SUBLEVEL:再次版本号
                EXTRAVERSION:附加信息

VERSION = 1
PATCHLEVEL = 3
SUBLEVEL = 4
EXTRAVERSION =
U_BOOT_VERSION = $(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)
VERSION_FILE = $(obj)include/version_autogenerated.h
root@kaxi-virtual-machine:~/qt_x210v3s_160307/uboot# cat include/version_autogenerated.h 
#define U_BOOT_VERSION "U-Boot 1.3.4"

        宿主机参数
                HOSTARCH:宿主机架构
                HOSTOS:宿主机系统

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/ppc64/ppc/ \-e s/macppc/ppc/)HOSTOS := $(shell uname -s | tr '[:upper:]' '[:lower:]' | \sed -e 's/\(cygwin\).*/cygwin/')export  HOSTARCH HOSTOS

        静默编译
                make -s

# Allow for silent builds
ifeq (,$(findstring s,$(MAKEFLAGS)))
XECHO = echo
else
XECHO = :
endif

 

        指定编译结果路径

O参数(优先级高)make O=/tmp/build distcleanmake O=/tmp/build NAME_configmake O=/tmp/build all设置环境变量export BUILD_DIR=/tmp/buildmake distcleanmake NAME_configmake all


                OBJTREE:默认当前目录,O参数可指定输出目录
                SRCTREE: 源码目录(uboot一级目录)

ifdef O
ifeq ("$(origin O)", "command line")
BUILD_DIR := $(O)
endif
endififneq ($(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)
$(if $(BUILD_DIR),,$(error output directory "$(saved-output)" does not exist))
endif # ifneq ($(BUILD_DIR),)OBJTREE         := $(if $(BUILD_DIR),$(BUILD_DIR),$(CURDIR))
SRCTREE         := $(CURDIR)
TOPDIR          := $(SRCTREE)
LNDIR           := $(OBJTREE)
export  TOPDIR SRCTREE OBJTREEMKCONFIG        := $(SRCTREE)/mkconfig
export MKCONFIGifneq ($(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# Make sure CDPATH settings don't interfere
unexport CDPATH

        开发板配置

ifeq ($(obj)include/config.mk,$(wildcard $(obj)include/config.mk))# load ARCH, BOARD, and CPU configuration
include $(obj)include/config.mk
export  ARCH CPU BOARD VENDOR SOC

        make x210_sd_config(调用mkconfig脚本)  ==>  include/config.mk

x210_nand_config :      unconfig@$(MKCONFIG) $(@:_config=) arm s5pc11x x210 samsung s5pc110@echo "TEXT_BASE = 0xc3e00000" > $(obj)board/samsung/x210/config.mk
root@kaxi-virtual-machine:~/qt_x210v3s_160307/uboot# cat include/config.mk
ARCH   = arm
CPU    = s5pc11x
BOARD  = x210
VENDOR = samsung
SOC    = s5pc110

        编译工具链

                CROSS_COMPILE:工具链(可外部定义:路径(/usr/local/arm/arm-2009q3/bin/)+工具链标签(arm-none-linux-gnueabi-))
                $(TOPDIR)/config.mk(94-107定义完整工具链:路径+工具链标签+gcc)

#
# Include the make variables (CC, etc...)
#
AS      = $(CROSS_COMPILE)as
LD      = $(CROSS_COMPILE)ld
CC      = $(CROSS_COMPILE)gcc
CPP     = $(CC) -E
AR      = $(CROSS_COMPILE)ar
NM      = $(CROSS_COMPILE)nm
LDR     = $(CROSS_COMPILE)ldr
STRIP   = $(CROSS_COMPILE)strip
OBJCOPY = $(CROSS_COMPILE)objcopy
OBJDUMP = $(CROSS_COMPILE)objdump
RANLIB  = $(CROSS_COMPILE)RANLIB

        Makefile(291)开始编译目标
        unconfig目标可多次配置

x210_nand_config :      unconfig@$(MKCONFIG) $(@:_config=) arm s5pc11x x210 samsung s5pc110@echo "TEXT_BASE = 0xc3e00000" > $(obj)board/samsung/x210/config.mk


解析config.mk
$(TOPDIR)/config.mk(uboot/config.mk)

        加载宏(开发板配置)(112)

# Load generated board configuration
sinclude $(OBJTREE)/include/autoconf.mk

        文件指导uboot编译过程,包含CONFIG_xxx宏它由源码目录inlcude/configs/xxx.h头文件生成(其他开发板)
        210使用include/configs/x210_sd.h


        加载链接脚本(142-149,board/samsung/x210/u-boot.lds)

ifndef LDSCRIPT
#LDSCRIPT := $(TOPDIR)/board/$(BOARDDIR)/u-boot.lds.debug
ifeq ($(CONFIG_NAND_U_BOOT),y)
LDSCRIPT := $(TOPDIR)/board/$(BOARDDIR)/u-boot-nand.lds
else
LDSCRIPT := $(TOPDIR)/board/$(BOARDDIR)/u-boot.lds
endif


        定义链接脚本地址(156-158,board/samsung/x210/config.mk)

ifneq ($(TEXT_BASE),)
CPPFLAGS += -DTEXT_BASE=$(TEXT_BASE)
endif
root@kaxi-virtual-machine:~/qt_x210v3s_160307/uboot# cat board/samsung/x210/config.mk
TEXT_BASE = 0xc3e00000

        TEXT_BASE是uboot链接地址由于启用虚拟地址映射,C3E00000地址等于0x23E00000


        自动推导规则(239-256)

ifndef REMOTE_BUILD%.s:    %.S$(CPP) $(AFLAGS) -o $@ $<
%.o:    %.S$(CC) $(AFLAGS) -c -o $@ $<
%.o:    %.c$(CC) $(CFLAGS) -c -o $@ $<else$(obj)%.s:      %.S$(CPP) $(AFLAGS) -o $@ $<
$(obj)%.o:      %.S$(CC) $(AFLAGS) -c -o $@ $<
$(obj)%.o:      %.c$(CC) $(CFLAGS) -c -o $@ $<
endif


        解析mkconfig(uboot/mkconfig)
 

x210_nand_config :      unconfig@$(MKCONFIG) $(@:_config=) arm s5pc11x x210 samsung s5pc110@echo "TEXT_BASE = 0xc3e00000" > $(obj)board/samsung/x210/config.mk

                6个参数 :$(@:_config=) arm s5pc11x x210 samsung s5pc110
                $1:    x210_sd
                $2:    arm
                $3: s5pc11x
                $4:    x210
                $5: samsumg
                $6:    s5pc110
                $# = 6

                BOARD_NAME=x210_sd


                创建符号链接(33-118,便于移植)
                uboot/include:asm -> asm-arm
                uboot/inlcude/asm-arm:arch->arch-s5pc11x
                uboot/include:regs.h->s5pc110.h
                uboot/include/asm-arm:proc->proc-armv

                创建include/config.mk文件用于主Makefile配置开发板(123-129)

#
# Create include 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

                默认追加#include <configs/x210_sd.h>(开发板配置宏)到include/config.h(134-141)

...APPEND=no       # Default: Create new config file...#
# Create board specific header file
#
if [ "$APPEND" = "yes" ]        # Append to existing config file
thenecho >> 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

链接脚本(uboot/board/samsung/x210/u-boot.lds)
        ENTRY(_start)程序入口地址
        指定链接地址:-Ttext 0x00000000;(优先级高),链接脚本SECTIONS中定义. = 0x00000000
        uboot链接地址用-Ttext指定(make x210_sd_config ==> uboot/board/samsung/x210/config.mk(定义TEXT_BASE))
        链接脚本*(.text)前部分为前16KB(基础的初始化)其余为16KB之后,便于烧录,
        链接脚本除.text  .data .rodata .bss段还有自定义段(.u_boot_cmd)

OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
/*OUTPUT_FORMAT("elf32-arm", "elf32-arm", "elf32-arm")*/
OUTPUT_ARCH(arm)
ENTRY(_start)
SECTIONS
{. = 0x00000000;. = ALIGN(4);.text      :{cpu/s5pc11x/start.o   (.text)cpu/s5pc11x/s5pc110/cpu_init.o        (.text)board/samsung/x210/lowlevel_init.o    (.text)cpu/s5pc11x/onenand_cp.o      (.text)                 cpu/s5pc11x/nand_cp.o (.text)                     cpu/s5pc11x/movi.o (.text) common/secure_boot.o (.text) common/ace_sha1.o (.text)cpu/s5pc11x/pmic.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);.mmudata : { *(.mmudata) }. = ALIGN(4);__bss_start = .;.bss : { *(.bss) }_end = .;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/191031.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenAI 解雇了首席执行官 Sam Altman

Sam Altman 已被 OpenAI 解雇&#xff0c;原因是担心他与董事会的沟通和透明度&#xff0c;可能会影响公司的发展。该公司首席技术官 Mira Murati 将担任临时首席执行官&#xff0c;但 OpenAI 可能会从科技行业寻找新的首席执行官来领导未来的产品开发。Altman 的解雇给 OpenAI…

ubuntu下载conda

系统&#xff1a;Ubuntu18.04 &#xff08;1&#xff09;下载安装包 wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/Anaconda3-2021.11-Linux-x86_64.sh 报错错误 403&#xff1a;Forbidden 解决方法 wget -U NoSuchBrowser/1.0 https://mirrors.tuna.tsingh…

机器学习算法——集成学习

目录 1. Bagging 1. Bagging Bagging&#xff08;bootstrap aggregating&#xff1a;自举汇聚法&#xff09;也叫装袋法&#xff0c;其思想是通过将许多相互独立的学习器的结果进行结合&#xff0c;从而提高整体学习器的泛化能力&#xff0c;是一种并行集成学习方法。 工作流…

【SpringBoot】 环境准备

一.SpringBoot准备 1.下载idea 社区版 2021.1 - 2022.1.4 专业版 无要求 2.Maven 是一个工具,和Java没有关系 . 主要功能是项目构建和依赖管理. 项目构建 上述对应的都是maven命令 . 依赖管理 添加坐标之后,点击刷新,右侧就会载入依赖. Maven还有依赖传递和依赖排除功…

CCF ChinaSoft 2023 论坛巡礼|软件测试产教研融合论坛

2023年CCF中国软件大会&#xff08;CCF ChinaSoft 2023&#xff09;由CCF主办&#xff0c;CCF系统软件专委会、形式化方法专委会、软件工程专委会以及复旦大学联合承办&#xff0c;将于2023年12月1-3日在上海国际会议中心举行。 本次大会主题是“智能化软件创新推动数字经济与社…

小程序申请,商户号申请,微信支付开通操作流程

总目录 文章目录 总目录前言1 申请商户号&#xff08;如已有商户号跳过&#xff09;1 申请流程与资料2 详细申请步骤 2 申请开通接入微信支付步骤3 申请微信小程序1 申请小程序步骤2 查看小程序AppID 4 微信支付普通商户与AppID账号关联结语 前言 本文主要讲解如何申请微信商户…

Dart笔记:glob 文件系统遍历

Dart笔记 文件系统遍历工具&#xff1a;glob 模块 作者&#xff1a;李俊才 &#xff08;jcLee95&#xff09;&#xff1a;https://blog.csdn.net/qq_28550263 邮箱 &#xff1a;291148484163.com 本文地址&#xff1a;https://blog.csdn.net/qq_28550263/article/details/13442…

探索游戏公司跨部门合作的项目管理工具选择

为了实现出色的用户体验&#xff0c;游戏公司需要强大的研发能力和发行运营经验。通常情况下&#xff0c;游戏公司内部有多个独立工作的研发部门和发行部门&#xff0c;它们需要跨部门协作。随着公司快速发展和游戏项目增加&#xff0c;游戏公司迫切需要一套适用于特殊协作流程…

轻量级 Java 日志组件

日志记录功能在开发中很常用&#xff0c;不仅可以记录程序运行的细节&#xff0c;方便调试&#xff0c;也可以记录用户的行为&#xff0c;是框架中不可或缺的组件。为最大程度复用现有的组件&#xff0c;我们就地取材使用了 JDK 自带的 JUL&#xff08;java.util.logging&#…

操作系统 day11(进程调度时机、切换、调度方式、调度程序)

进程调度的时机 这里的主动放弃指的是—内中断&#xff08;异常、例外&#xff09;&#xff0c;中断信号来自CPU内部。而被动放弃指的是—外中断&#xff08;中断&#xff09;&#xff0c;中断信号来自CPU外部 如果该进程还没退出临界区&#xff08;还没解锁&#xff09;就进行…

轻量级的资源授权:基于 OAuth 规范

了解 OAuth 感觉 OAuth 太负盛名了&#xff0c;以至于后来在 OIDC 反而难以企及前辈 OAuth。倒是大家谈论比较多的是 JWT&#xff08;例如https://www.cnblogs.com/lyzg/p/6132801.html&#xff09;&#xff0c;——实际谈 JWT 就是在实现 OIDC&#xff0c;反而 OIDC 大家不怎…

搜索引擎ElasticSearch分布式搜索和分析引擎学习,SpringBoot整合ES个人心得

ElasticSearch Elasticsearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎&#xff0c;基于RESTful web接口。Elasticsearch是用Java语言开发的&#xff0c;并作为Apache许可条款下的开放源码发布&#xff0c;是一种流行的企业级搜索引擎。Elas…