u-boot 订阅
Das U-Boot 是一个主要用于嵌入式系统的引导加载程序,可以支持多种不同的计算机系统结构,包括PPC、ARM、AVR32、MIPS、x86、68k、Nios与MicroBlaze。这也是一套在GNU通用公共许可证之下发布的自由软件。Das U-Boot可以在x86计算机上建构,但这部x86计算机必须安装有可支持特定平台结构的交互发展GNU工具链,例如crosstool、Embedded Linux Development Kit (ELDK)或OSELAS.Toolchain。 展开全文
Das U-Boot 是一个主要用于嵌入式系统的引导加载程序,可以支持多种不同的计算机系统结构,包括PPC、ARM、AVR32、MIPS、x86、68k、Nios与MicroBlaze。这也是一套在GNU通用公共许可证之下发布的自由软件。Das U-Boot可以在x86计算机上建构,但这部x86计算机必须安装有可支持特定平台结构的交互发展GNU工具链,例如crosstool、Embedded Linux Development Kit (ELDK)或OSELAS.Toolchain。
信息
类    型
开放源码项目
特    点
遵循GPL条款
中文名
U-Boot
全    称
Universal Boot Loader
U-Boot简介
U-Boot不仅仅支持嵌入式Linux系统的引导,它还支持NetBS D, VxWorks, QNX, RTEMS, ARTOS, LynxOS, android嵌入式操作系统。其目前要支持的目标操作系统是OpenBSD, NetBSD, FreeBSD,4.4BSD, Linux, SVR4, Esix, Solaris, Irix, SCO, Dell, NCR, VxWorks, LynxOS, pSOS, QNX, RTEMS, ARTOS, android。这是U-Boot中Universal的一层含义,另外一层含义则是U-Boot除了支持PowerPC系列的处理器外,还能支持MIPS、 x86、ARM、NIOS、XScale等诸多常用系列的处理器。这两个特点正是U-Boot项目的开发目标,即支持尽可能多的嵌入式处理器和嵌入式操作系统。就目前来看,U-Boot对PowerPC系列处理器支持最为丰富,对Linux的支持最完善。其它系列的处理器和操作系统基本是在2002年11 月PPCBOOT改名为U-Boot后逐步扩充的。从PPCBOOT向U-Boot的顺利过渡,很大程度上归功于U-Boot的维护人德国DENX软件工程中心Wolfgang Denk[以下简称W.D]本人精湛专业水平和执着不懈的努力。当前,U-Boot项目正在他的领军之下,众多有志于开放源码BOOT LOADER移植工作的嵌入式开发人员正如火如荼地将各个不同系列嵌入式处理器的移植工作不断展开和深入,以支持更多的嵌入式操作系统的装载与引导。选择U-Boot的理由:① 开放源码;② 支持多种嵌入式操作系统内核,如Linux、NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS, android;③ 支持多个处理器系列,如PowerPC、ARM、x86、MIPS;④ 较高的可靠性和稳定性;⑤ 高度灵活的功能设置,适合U-Boot调试、操作系统不同引导要求、产品发布等;⑥ 丰富的设备驱动源码,如串口、以太网、SDRAM、FLASH、LCD、NVRAM、EEPROM、RTC、键盘等;⑦ 较为丰富的开发调试文档与强大的网络技术支持;
收起全文
精华内容
下载资源
问答
  • U-Boot编译过程解析

    2021-05-11 23:38:11
    解压u-boot-2010.03.tar.bz2就可以得到全部U-Boot源程序。在顶层目录下有29个子目录,分别存放和管理不同的源程序。这些目录中所要存放的文件有其规则,可以分为3类。●与处理器体系结构或者开发板硬件直接相关。●...

    解压u-boot-2010.03.tar.bz2就可以得到全部U-Boot源程序。在顶层目录下有29个子目录,分别存放和管理不同的源程序。这些目录中所要存放的文件有其规则,可以分为3类。

    ● 与处理器体系结构或者开发板硬件直接相关。

    ● 一些通用的函数或者驱动程序。

    ● U-Boot的应用程序、工具或者文件。

    表1.5列出了U-Boot顶层目录下各级目录的存放原则。

    表1.5 U-Boot的源码顶层目录说明

    目 录

    特 性

    解 释 说 明

    board

    平台依赖

    存放电路板相关的目录文件,如RPXlite(mpc8xx)、smdk2410(arm920t)、sc520_cdp(x86) 等目录

    cpu

    平台依赖

    存放了CPU相关的目录文件,如mpc8xx、ppc4xx、arm720t、arm920t、xscale、i386等目录

    lib_ppc

    平台依赖

    存放对PowerPC体系结构通用的文件,主要用于实现PowerPC平台通用的函数

    lib_arm

    平台依赖

    存放对ARM体系结构通用的文件,主要用于实现ARM平台通用的函数

    lib_i386

    平台依赖

    存放对X86体系结构通用的文件,主要用于实现X86平台通用的函数

    lib_avr32

    平台依赖

    存放对AVR32体系结构通用的文件,主要用于实现AVR32平台通用的函数

    lib_blackfin

    平台依赖

    存放对BLACKFIN体系结构通用的文件,主要用于实现BLACKFIN平台通用的函数

    lib_m68k

    平台依赖

    存放对M68K体系结构通用的文件,主要用于实现M68K 平台通用的函数

    lib_microblaze

    平台依赖

    存放对Microblaze体系结构通用的文件,主要用于实现Microblaze平台通用的函数

    lib_mips

    平台依赖

    存放对MIPS体系结构通用的文件,主要用于实现MIPS平台通用的函数

    lib_nios

    平台依赖

    存放对NIOS体系结构通用的文件,主要用于实现NIOS平台通用的函数

    lib_nios2

    平台依赖

    存放对NIOS体系结构通用的文件,主要用于实现NIOS2平台通用的函数

    lib_sh

    平台依赖

    存放对SH体系结构通用的文件,主要用于实现SH平台通用的函数

    lib_sparc

    平台依赖

    存放对SPARC体系结构通用的文件,主要用于实现SPARC平台通用的函数

    libfdt

    通用

    支持设备树的库文件

    api

    通用

    存放U-Boot提供的接口函数

    common

    通用

    通用的代码,涵盖各个方面,以命令行处理为主

    disk

    通用

    磁盘分区相关代码

    nand_spl

    通用

    NAND存储器相关代码

    include

    通用

    头文件和开发板配置文件,所有开发板的配置文件都在configs目录下

    common

    通用

    通用的多功能函数实现

    lib_generic

    通用

    通用库函数的实现

    net

    通用

    存放网络相关程序

    fs

    通用

    存放文件系统相关程序

    post

    通用

    存放上电自检程序

    drivers

    通用

    通用的设备驱动程序,主要有以太网接口的驱动

    disk

    通用

    硬盘接口程序

    examples

    应用例程

    一些独立运行的应用程序的例子,如helloworld

    tools

    工具

    存放制作S-Record或者U-Boot格式的镜像等工具,如mkimage

    doc

    文档

    开发使用文档

    Rtc

    通用

    RTC的驱动程序

    U-Boot的源代码包含对几十种处理器、数百种开发板的支持。可是对于特定的开发板,配置编译过程只需其中部分程序。这里以S3C2410处理器为例,具体分析S3C2410处理器和开发板所依赖的程序,以及U-Boot的通用函数和工具。

    U-Boot的源码是通过gcc和Makefile组织编译的。顶层目录下的Makefile可以设置开发板的定义,然后递归地调用各级子目录下的Makefile,后把编译过的程序链接成U-Boot映像。

    1)顶层目录下的Makefile

    Makefile负责U-Boot整体配置编译,按照配置的顺序阅读其中关键的几行。

    每一种开发板在Makefile下都需要有主板配置的定义。例如,smdk2410开发板的定义如下:

    smdk2410_config:unconfig

    @$(MKCONFIG) $(@:_config=) arm arm920t smdk2410 samsung s3c24x0

    执行配置U-Boot的命令make smdk2410_config,通过mkconfig脚本生成include/config.mk的配置文件,文件内容正是根据Makefile对开发板的配置生成的。

    ARCH = arm

    CPU = arm920t

    BOARD = smdk2410

    VENDOR = samsung

    SoC = s3c24x0

    上面的include/config.mk文件定义了ARCH、CPU、BOARD、VENDOR、SoC这些变量,这样,硬件平台依赖的目录文件可以根据这些定义来确定。SMDK2410平台相关目录如下:

    board/Samsung/smdk2410

    cpu/arm920t/

    cpu/arm920t/s3c24x0/

    lib_arm/

    include/configs/smdk2410.h

    再回到顶层目录的Makefile文件开始的部分,其中,下列几行包含了这些变量的定义:

    # load ARCH, BOARD, and CPU configuration

    include $(obj)include/config.mk

    export ARCH CPU BOARD VENDOR SOC

    Makefile的编译选项和规则在顶层目录的config.mk文件中定义,各种体系结构通用的规则直接在这个文件中定义。通过ARCH、CPU、BOARD、VENDOR、SoC等变量为不同硬件平台定义不同选项。不同体系结构的规则分别包含在ppc_config.mk、arm_config.mk、mips_config.mk等文件中。

    顶层目录的Makefile中还要定义交叉编译器,以及编译U-Boot所依赖的目标文件

    ifeq (arm,$(ARCH))

    CROSS_COMPILE ?=arm-none-linux-gnueabi-

    # 交叉编译器的前缀

    endif

    # load other configuration

    include $(TOPDIR)/config.mk

    # U-Boot objects....order is important (i.e. start must be first)

    OBJS = cpu/$(CPU)/start.o # 处理器相关的目标文件

    #定义依赖的目录,每个目录下先把目标文件连接成*.a文件

    LIBS = lib_generic/libgeneric.a

    LIBS += lib_generic/lzma/liblzma.a

    LIBS += lib_generic/lzo/liblzo.a

    LIBS += $(shell if [ -f board/$(VENDOR)/common/Makefile ];

    Then echo "board/$(VENDOR)/common/lib$(VENDOR).a"; fi)

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

    ifdef SOC

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

    endif

    ifeq ($(CPU),ixp)

    LIBS += cpu/ixp/npe/libnpe.a

    endif

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

    还有U-Boot镜像编译的依赖关系如下:

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

    $(U_BOOT_ONENAND)

    all: $(ALL)

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

    $(OBJCOPY) ${OBJCFLAGS} -O ihex $< $@

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

    $(OBJCOPY) -O srec $< $@

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

    $(OBJCOPY) ${OBJCFLAGS} -O binary $< $@

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

    $(CREATE_LDR_ENV)

    $(LDR) -T $(CONFIG_BFIN_CPU) -c $@ $< $(LDR_FLAGS)

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

    $(OBJCOPY) ${OBJCFLAGS} -O ihex $< $@ -I binary

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

    $(OBJCOPY) ${OBJCFLAGS} -O srec $< $@ -I binary

    $(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 $< $@

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

    $(obj)tools/mkimage -n $(IMX_CONFIG) -T imximage \

    -e $(TEXT_BASE) -d $< $@

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

    $(obj)tools/mkimage -n $(KWD_CONFIG) -T kwbimage \

    -a $(TEXT_BASE) -e $(TEXT_BASE) -d $< $@

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

    $(obj)tools/ubsha1 $(obj)u-boot.bin

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

    $(OBJDUMP) -d $< > $@

    Makefile默认的编译目标为all,包括u-boot.srec、u-boot.bin和System.map。u-boot.srec和u-boot.bin就是通过ld命令按照U-Boot.map地址表把目标文件组装成U-Boot的。其他Makefile内容就不再详细分析了,通过上述代码分析应该可以为读者阅读代码提供一些线索。

    2)开发板配置头文件

    除了编译过程Makefile以外,还要在程序中为开发板定义配置选项或者参数。这个头文件是include/configs/.h。用相应的BOARD定义代替。

    这个头文件中主要定义了两类形式的参数。

    一类形式的参数用来选择处理器、设备接口、命令、属性等,以及定义总线频率、串口波特率、Flash地址等参数。

    大部分参数前缀是CONFIG_,例如:

    #define CONFIG_ARM920T 1

    #define CONFIG_KGDB_BAUDRATE 115200

    #define CONFIG_CS8900

    #define CONFIG_KGDB_BAUDRATE 115200

    另一类形式的参数为:

    #define PHYS_FLASH_SIZE 0x00100000

    #define USE_920T_MMU 1

    根据对Makefile的分析,编译分为两步。第1步是配置,如make smdk2410_config;第2步是编译,执行make就可以了。

    编译完成后,可以得到U-Boot各种格式的映像文件和符号表,如表1.6所示。

    表1.6 U-Boot编译生成的映像文件

    文 件 名 称

    说 明

    文 件 名 称

    说 明

    System.map

    U-Boot映像的符号表

    u-boot.bin

    U-Boot映像原始的二进制格式

    u-boot

    U-Boot映像的ELF格式

    u-boot.srec

    U-Boot映像的S-Record格式

    U-Boot的3种映像格式都可以烧写到Flash中,但需要看加载器能否识别这些格式。一般u-boot.bin为常用,直接按照二进制格式下载,并且按照绝对地址烧写到Flash中就可以了。U-Boot和u-boot.srec格式映像都自带定位信息。

    热点链接:

    展开全文
  • 注意:本文以ARM架构下的u-boot源码来进行分析。u-boot版本:4.1.15 在u-boot源码下,随处可见gd,那么文本就来看看神秘的gd》》》》》》》 包含两个内容: (1)gd是如何定义的 (2)gd_t结构体定义 一、gd是如何...

    注意:本文以ARM架构下的u-boot源码来进行分析。u-boot版本:4.1.15

    在u-boot源码下,随处可见gd,那么本文就来看看神秘的gd》》》》》》》


    本文包含两个内容:

    (1)gd是如何定义的

    (2)gd_t结构体定义


    一、gd是如何定义的

    在U-Boot的源码中,使用寄存器r9来表示全局数据结构gd。以下代码片段出自
    u-boot Dir/arch/arm/include/asm/global_data.h

    #ifdef __clang__
    
    #define DECLARE_GLOBAL_DATA_PTR
    #define gd	get_gd()
    
    static inline gd_t *get_gd(void)
    {
    	gd_t *gd_ptr;
    
    #ifdef CONFIG_ARM64
    	/*
    	 * Make will already error that reserving x18 is not supported at the
    	 * time of writing, clang: error: unknown argument: '-ffixed-x18'
    	 */
    	__asm__ volatile("mov %0, x18\n" : "=r" (gd_ptr));
    #else
    	__asm__ volatile("mov %0, r9\n" : "=r" (gd_ptr));
    #endif
    
    	return gd_ptr;
    }
    
    #else
    
    #ifdef CONFIG_ARM64
    #define DECLARE_GLOBAL_DATA_PTR		register volatile gd_t *gd asm ("x18")
    #else
    #define DECLARE_GLOBAL_DATA_PTR		register volatile gd_t *gd asm ("r9")
    #endif
    #endif
    

    以上代码所示,当不是ARM64和clang时,代码本质就是:

    #define DECLARE_GLOBAL_DATA_PTR		register volatile gd_t *gd asm ("r9")
    

    那么如何定义一个寄存器变量呢? 根据GCC使用手册中可知,定义如下:

    register int *foo asm (“reg”);
    其中register关键字是必须的,asm (“reg”)为嵌入式汇编,因此,register volatile gd_t *gd asm (“r9”)表示:用r9寄存器存储gd指针,r9寄存器和CPU体系结构相关。需要注意的是,不能使用static const 和volatile等限定符,否则,可能与预期设想相反。特别需要注意的是volatile,就算加了也是阻止不了编译器优化的(因为在U-Boot中的定义是不符合GCC编译器规范的,如果用grep DECLARE_GLOBAL_DATA_PTR -nr 命令在U-Boot源码中查找,就会发现有的定义就没有volatile)。

    定义寄存器变量,单有上面的定义还是不行。因为,虽然声明了使用reg来表示foo指针,但编译器还是会使用reg去作其他的用途(参数传递等等)。如果想让编译器不使用reg寄存器用作其他用途,则还需要使用【-ffixed-reg】 编译选项显式告诉编译器reg寄存器是固定用途寄存器。

    在u-boot源码下arch/arm/config.mk文件中有如下变量定义,可以找到‘-ffixed-reg’选项(U-Boot使用了r9寄存器),因此编译器在进行编译时,则将r9寄存器视为固定寄存器。
    PLATFORM_RELFLAGS += -ffunction-sections -fdata-sections
    -fno-common -ffixed-r9

    gd是一个全局指针变量,那么该变量指向的是gd_t结构体类型数据,然而对于gd变量在定义时是没有被初始化,即没有被赋予初值,那么gd变量是在哪被赋予初值的呢?继续下文分析

    ## 二、gd_t结构体定义

    gd变量是一个指向gd_t结构体的指针,gd_t结构体定义如下,代码片段出自
    u-boot dir/include/asm-generic/global_data.h

    typedef struct global_data {
    	bd_t *bd;
    	unsigned long flags;
    	unsigned int baudrate;
    	unsigned long cpu_clk;	/* CPU clock in Hz!		*/
    	unsigned long bus_clk;
    	/* We cannot bracket this with CONFIG_PCI due to mpc5xxx */
    	unsigned long pci_clk;
    	unsigned long mem_clk;
    #if defined(CONFIG_LCD) || defined(CONFIG_VIDEO)
    	unsigned long fb_base;	/* Base address of framebuffer mem */
    #endif
    #if defined(CONFIG_POST) || defined(CONFIG_LOGBUFFER)
    	unsigned long post_log_word;  /* Record POST activities */
    	unsigned long post_log_res; /* success of POST test */
    	unsigned long post_init_f_time;  /* When post_init_f started */
    #endif
    #ifdef CONFIG_BOARD_TYPES
    	unsigned long board_type;
    #endif
    	unsigned long have_console;	/* serial_init() was called */
    #ifdef CONFIG_PRE_CONSOLE_BUFFER
    	unsigned long precon_buf_idx;	/* Pre-Console buffer index */
    #endif
    	unsigned long env_addr;	/* Address  of Environment struct */
    	unsigned long env_valid;	/* Checksum of Environment valid? */
    
    	unsigned long ram_top;	/* Top address of RAM used by U-Boot */
    
    	unsigned long relocaddr;	/* Start address of U-Boot in RAM */
    	phys_size_t ram_size;	/* RAM size */
    #ifdef CONFIG_SYS_MEM_RESERVE_SECURE
    #define MEM_RESERVE_SECURE_SECURED	0x1
    #define MEM_RESERVE_SECURE_MAINTAINED	0x2
    #define MEM_RESERVE_SECURE_ADDR_MASK	(~0x3)
    	/*
    	 * Secure memory addr
    	 * This variable needs maintenance if the RAM base is not zero,
    	 * or if RAM splits into non-consecutive banks. It also has a
    	 * flag indicating the secure memory is marked as secure by MMU.
    	 * Flags used: 0x1 secured
    	 *             0x2 maintained
    	 */
    	phys_addr_t secure_ram;
    #endif
    	unsigned long mon_len;	/* monitor len */
    	unsigned long irq_sp;		/* irq stack pointer */
    	unsigned long start_addr_sp;	/* start_addr_stackpointer */
    	unsigned long reloc_off;
    	struct global_data *new_gd;	/* relocated global data */
    
    #ifdef CONFIG_DM
    	struct udevice	*dm_root;	/* Root instance for Driver Model */
    	struct udevice	*dm_root_f;	/* Pre-relocation root instance */
    	struct list_head uclass_root;	/* Head of core tree */
    #endif
    #ifdef CONFIG_TIMER
    	struct udevice	*timer;	/* Timer instance for Driver Model */
    #endif
    
    	const void *fdt_blob;	/* Our device tree, NULL if none */
    	void *new_fdt;		/* Relocated FDT */
    	unsigned long fdt_size;	/* Space reserved for relocated FDT */
    	struct jt_funcs *jt;		/* jump table */
    	char env_buf[32];	/* buffer for getenv() before reloc. */
    #ifdef CONFIG_TRACE
    	void		*trace_buff;	/* The trace buffer */
    #endif
    #if defined(CONFIG_SYS_I2C)
    	int		cur_i2c_bus;	/* current used i2c bus */
    #endif
    #ifdef CONFIG_SYS_I2C_MXC
    	void *srdata[10];
    #endif
    	unsigned long timebase_h;
    	unsigned long timebase_l;
    #ifdef CONFIG_SYS_MALLOC_F_LEN
    	unsigned long malloc_base;	/* base address of early malloc() */
    	unsigned long malloc_limit;	/* limit address */
    	unsigned long malloc_ptr;	/* current address */
    #endif
    #ifdef CONFIG_PCI
    	struct pci_controller *hose;	/* PCI hose for early use */
    	phys_addr_t pci_ram_top;	/* top of region accessible to PCI */
    #endif
    #ifdef CONFIG_PCI_BOOTDELAY
    	int pcidelay_done;
    #endif
    	struct udevice *cur_serial_dev;	//当前的串口设备
    	struct arch_global_data arch;	/* architecture-specific data */
    #ifdef CONFIG_CONSOLE_RECORD
    	struct membuff console_out;	/* console output */
    	struct membuff console_in;	/* console input */
    #endif
    #ifdef CONFIG_DM_VIDEO
    	ulong video_top;		/* Top of video frame buffer area */
    	ulong video_bottom;		/* Bottom of video frame buffer area */
    #endif
    } gd_t;
    

    对于gd_t结构体类型,注意两点:
    (1)每一种架构体系都有其私有的数据字段。

    (2)以上所定义的数据将被放置在系统启动后早期可用的内存中,例如MPC8xx/MPC82xx上的DPRAM或者被锁定的数据缓存。以便在系统的内存控制器还没有设置好之前,在系统初始化期间能够存放最小的全局变量集。

    三、gd如何在u-boot启动过程中被赋值的

    在这里插入图片描述
    如上图所示,该代码出自…/arch/arm/lib/crt0.S文件中,第89行,将r0中的值赋值给r9,因为r9存放的是gd变量,因此gd变量在此刻就被赋予初始值了。然后,第90行,调用函数board_init_f_init_reserve进行gd指向空间的调整和预留gd指向数据的内存空间。

    board_init_f_init_reserve函数定义在…/common/init/board_init.c文件中,也独立于特定体系架构。如下代码片段所示:

    void board_init_f_init_reserve(ulong base)
    {
    	struct global_data *gd_ptr;
    #ifndef _USE_MEMCPY
    	int *ptr;
    #endif
    
    	/*
    	 * clear GD entirely and set it up.
    	 * Use gd_ptr, as gd may not be properly set yet.
    	 */
    	gd_ptr = (struct global_data *)base;
    	/* zero the area */
    #ifdef _USE_MEMCPY
    	memset(gd_ptr, '\0', sizeof(*gd));
    #else
    	for (ptr = (int *)gd_ptr; ptr < (int *)(gd_ptr + 1); )
    		*ptr++ = 0;
    #endif
    	/* set GD unless architecture did it already */
    #if !defined(CONFIG_ARM)
    	arch_setup_gd(gd_ptr);
    #endif
    	/* next alloc will be higher by one GD plus 16-byte alignment */
    	base += roundup(sizeof(struct global_data), 16);
    
    	/*
    	 * record early malloc arena start.
    	 * Use gd as it is now properly set for all architectures.
    	 */
    
    #if defined(CONFIG_SYS_MALLOC_F)
    	/* go down one 'early malloc arena' */
    	gd->malloc_base = base;
    	/* next alloc will be higher by one 'early malloc arena' size */
    	base += CONFIG_SYS_MALLOC_F_LEN;
    #endif
    }
    
    
    展开全文
  • 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 $<$@ $(obj)u-boot.srec: $(obj)u-boot $(OBJCOPY) ${...

    第一次写技术博客,还有些兴奋呢。我是CrazyCatJack,大家可以叫我CCJ或者疯猫。我即将成为一名嵌入式Linux的驱动工程师,现在还是一枚大四狗,呼呼~大学期间做了一些项目和比赛,都是基于32位的MCU(例如STM32、Freescale K60),这些呢都是根据网上的视频,PDF自学的。现在想更进一步,学习一下嵌入式Linux、UCOS-II等嵌入式系统。因为给板子加系统是一个必然趋势,控制会越来越复杂,内容也越来越多的。有一个系统统筹管理是非常棒的选择。好了,废话少说,今天开始我的第一篇技术博客:u-boot的配置、编译和链接^_^

    1.u-boot的配置

    首先,我们要想了解u-boot,最好是从Makefile开始看,就能知道u-boot要执行的操作了。就像C语言中的main函数一样。在Makefile文件里,和配置相关的语句如下:

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

    SRCTREE :=$(CURDIR)

    TOPDIR :=$(SRCTREE)

    LNDIR :=$(OBJTREE)

    export TOPDIR SRCTREE OBJTREE

    MKCONFIG := $(SRCTREE)/mkconfig

    export MKCONFIG

    CCJ_config : unconfig

    @$(MKCONFIG) $(@:_config=) arm arm920t CCJ NULL s3c24x0

    根据Makefile中ReadMe文件中的描述,我们要配置u-boot,就要执行"make _config"这条指令。所以从Makefile中要查找一下你所用的开发板型号的相关配置信息。一般厂家都会给你配置好u-boot,你也可以自己写。在这里就假设我们使用的开发板名字为“CCJ”。分析最后这条语句:

    @$(MKCONFIG) $(@:_config=) arm arm920t CCJ NULL s3c24x0

    第一个MKCONFIG在Makefile文件中已有定义,可以看到MKCONFIG:=$(SRCTREE)/mkconfig,也就是说我们要用源代码树下的mkconfig替换这条语句中的MKCONFIG。

    第二个$(@的含义是用前面板子的名字替换掉后面的内容,而且不要“_config”,也就是说替换之后为CCJ。

    现在经过替换,这条语句变成了:

    ./mkconfig CCJ arm arm920t CCJ NULL s3c24x0

    后面的5个参数其实分别代表着你现在用到的硬件平台的架构、CPU、开发板型号名称、供应商、SOC名称。这个我们后面还会有讲解。所以能够看出这里我用到的是ARM架构,CPU为ARM920T,开发板名称为CCJ,SOC为S3C24X0。

    那现在我们已经分析了这条配置语句所代表的含义,但它具体是怎么工作的呢?是怎样将我们写好的这些硬件相关的信息进行具体配置赋值的呢?其实这里我们调用了根目录下的./mkconfig这一文件,就像C语言中的函数调用一样,调用mkconfig这个文件,并传入参数(arch,CPU,boardname,vendor,soc)为(arm arm920t CCJ NULL s3c24x0),来执行相应的操作。这么说大家应该就理解了吧。所以接下来我们看mkconfig文件中是怎样使用这些参数进行配置的。

    现在我们打开mkconfig文件,先分析第一段代码:

    APPEND=no # Default: Create newconfig file

    BOARD_NAME="" # Name to print inmake outputwhile [ $# -gt 0 ] ; do

    case "$1" in

    --) shift ; break;;-a) shift ; APPEND=yes ;;-n) shift ; BOARD_NAME="${1%%_config}"; shift ;;*) break;;

    esac

    done

    ["${BOARD_NAME}" ] || BOARD_NAME="$1"[ $#-lt 4 ] && exit 1[ $#-gt 6 ] && exit 1echo"Configuring for ${BOARD_NAME} board..."

    首先我们看到两个参数的赋值,APPEND为“no”,这个参数我们后面会用到,BOARD_NAME为“”,非空。这里大家会看到很多“$1,$2,$3...”等等,大家不要晕,其实很简单的,他们都分别对应我们刚刚所说传入的参数:

    Makefile命令: ./mkconfig CCJ arm arm920t CCJ NULL s3c24x0

    mkconfig对应符号表示: $0 $1 $2 $3 $4 $5 $6

    所以这里用到的$1其实就是"CCJ",$2就是"arm",以此类推。进入while语句,由于这句Makefile命令中没有“--”,“-a”,“-n”。所以这个while其实什么都没干。如果大家在写Makefile命令的时候,用到了“--”,“-a”,“-n”,则这里会改变APPEND和BOARD_NAME两个参数的值。我们这里没有改变。

    接下来看下一句话 [ "${BOARD_NAME}"] || BOARD_NAME="$1" 这句话是说如果BOARD_NAME不为空,则BOARD_NAME等于$1,即“CCJ”。然后是 echo "Configuring for ${BOARD_NAME} board..." 这句话的含义就是打印“Configuring for CCJ board”,所以在我们执行“make CCJ_config”命令时,一定会打印出这句话来。其中CCJ是你开发板的型号。

    if [ "$SRCTREE" != "$OBJTREE"] ; then

    mkdir-p ${OBJTREE}/include

    mkdir-p ${OBJTREE}/include2

    cd ${OBJTREE}/include2

    rm-f asm

    ln-s ${SRCTREE}/include/asm-$2asm

    LNPREFIX="../../include2/asm/"cd ../include

    rm-rf asm-$2rm-f asm

    mkdir asm-$2ln-s asm-$2asmelsecd ./include

    rm-f asm

    ln-s asm-$2asm

    fi

    rm-f asm-$2/arch

    接着往下看,上面这段代码主要完成链接工作。首先if判断 $SRCTREE 是否等于 $OBJTREE,这里要注意了,这两个参数是我们在Makefile文件中定义的。看我发的第一个代码片中就有对它们的赋值。

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

    SRCTREE := $(CURDIR)

    第一条语句的意思是如果我们定义了BUILD_DIR,则OBJTREE等于 $BUILD_DIR,否则等于 $CURDIR。那么这里我没有定义BUILD_DIR,所以OBJTREE= $CURDIR。所以现在OBJTREE=SRCTREE,则不执行if语句中的内容,而转去执行else分支的内容。

    首先进入./include目录下,删除原来生成的asm文件,重新建立asm文件,并链接到asm-$2文件。经过前面的讲解,相信你已经知道asm-$2经过转换,得到asm-arm。也就是说现在asm->asm-arm。最后删除asm-arm/arch文件。同理,为后面重新建立连接做准备。

    if [ -z "$6" -o "$6" = "NULL"] ; then

    ln-s ${LNPREFIX}arch-$3 asm-$2/archelseln-s ${LNPREFIX}arch-$6 asm-$2/arch

    fiif [ "$2" = "arm"] ; then

    rm-f asm-$2/proc

    ln-s ${LNPREFIX}proc-armv asm-$2/proc

    fi

    接着往下分析,如果$6不为空,或$6等于NULL,则执行if内的语句,我们$6=s3c24x0。所以执行分支语句,建立文件asm-am/arch,并指向arch-sac24x0。

    第二个if中,因为$2等于arm,所以执行语句,删除asm-arm/proc,建立文件asm-arm/proc,并指向proc-armv。

    #

    # Create include fileforMake

    #

    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

    #

    # Create board specific header file

    #if [ "$APPEND" = "yes"] # Append to existing config file

    then

    echo>>config.helse

    > config.h # Create newconfig file

    fi

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

    echo"#include " >>config.h

    exit0

    现在是不是有点累了?我们开始分析mkconfig的最后一大段^_^。坚持就是胜利!!!

    根据注释,第一段代码的作用是创建包含的文件,为配置做准备。这里我们主要是创建config.mk文件。这里说明一下">"表示创建某文件,">>"表示将内容添加到某文件。所以接下来几行的含义就分别是:创建config.mk文件,并添加"ARCH  = arm",添加"CPU  = arm920t",添加"BOARD  = CCJ"语句。$5为NULL,不执行语句。$6为s3c24x0,添加"SOC  =s3c24x0"所以,如果你尝试着执行config.mk文件一定会出现如下信息:

    ARCH =arm

    CPU= arm920t

    BOARD= CCJ

    SOC = s3c24x0

    接下来看第二段代码,根据作者提供的注释我们知道要创建开发板指定头文件了。根绝最开始mkconfig中我们定义的APPEND值,执行语句,由于这里我定义的是APPEND=no,所以执行else分支,创建config.h头文件,并添加  /* Automatically generated - do not edit */    #include   语句到config.h头文件中。 最后执行 exit 0 退出mkconfig文件。

    2.u-boot的编译

    接下来我们要做的就是编译了,即make。我们回到Makefile文件,看与你所使用的硬件平台相关的代码,这里我使用的是ARM9。根据注释,可以得知这段代码用于载入架构,开发板信息,CPU的配置。

    # load ARCH, BOARD, and CPU configuration

    include $(OBJTREE)/include/config.mk

    export ARCH CPU BOARD VENDOR SOC

    ifndef CROSS_COMPILE

    ifeq ($(HOSTARCH),ppc)

    CROSS_COMPILE=

    elseifeq ($(ARCH),ppc)

    CROSS_COMPILE= powerpc-linux-endif

    ifeq ($(ARCH),arm)

    CROSS_COMPILE= arm-linux-endif

    ifeq ($(ARCH),i386)

    ifeq ($(HOSTARCH),i386)

    CROSS_COMPILE=

    elseCROSS_COMPILE= i386-linux-endif

    endif

    在包含了我们之前所配置的config.mk文件后,Makefile代码就会根据我们配置的具体架构信息选择合适的交叉编译,很明显,因为我的是ARM架构,这里CROSS_COMPILE=arm-linux-。

    export CROSS_COMPILE

    # load other configuration

    include $(TOPDIR)/config.mk

    接着往下看,最下面我们包含了顶层目录下的config.mk文件。其实这里我发现有一个问题,就是之前我们不是也生成了一个config.mk吗?这其实是两个文件。之前那个完完全全是我们自己创建的config.mk,它的作用就是为了给接下来包含的这个原作者书写的config.mk传值,传递CPU、SOC、ARCH、BOARD、VENDOR的参数值。如果你手头上有下载好的u-boot源文件,打开u-boot文件夹,你就会看到一个config.mk。打开它就明白我刚刚所说的,传递的参数进入这个config,mk配置交叉编译选项、选择结构依赖规则。如下图:

    ifeq ($(ARCH),arm)

    ifeq ($(CROSS_COMPILE),powerpc-netbsd-)

    PLATFORM_CPPFLAGS+= -D__ARM__

    endif

    ifeq ($(CROSS_COMPILE),powerpc-openbsd-)

    PLATFORM_CPPFLAGS+= -D__ARM__

    endif

    endif

    ifeq ($(ARCH),blackfin)

    PLATFORM_CPPFLAGS+= -D__BLACKFIN__ -mno-underscore

    endif

    ifdef ARCH

    sinclude $(TOPDIR)/$(ARCH)_config.mk # include architecture dependend rules

    endif

    ifdef CPU

    sinclude $(TOPDIR)/cpu/$(CPU)/config.mk # include CPU specific rules

    endif

    ifdef SOC

    sinclude $(TOPDIR)/cpu/$(CPU)/$(SOC)/config.mk # include SoC specific rules

    endif

    在这个文件中,也有调用结构依赖规则,就是你所用的硬件架构对应的结构规则config文件,这里不再详述。可以自己打开看看。

    41e5461eafcd771bf05eb4ae37786d65.png

    接下来接着看Makefile的命令:

    # U-Boot objects....order isimportant (i.e. start must be first)

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

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

    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

    首先是目标文件start.o,然后是给LIBS变量指定平台/开发板相关的库。这些库是由各个模块自身编译生成的。(.a文件)

    $(OBJS):

    echo $(OBJS)

    $(MAKE)-C cpu/$(CPU) $(if$(REMOTE_BUILD),$@,$(notdir $@))

    $(LIBS):

    $(MAKE)-C $(dir $(subst $(obj),,$@))

    usb:

    $(MAKE)-C drivers/usb

    $(SUBDIRS):

    $(MAKE)-C $@ all

    这些.o文件和.a文件就是由上面的语句编译生成的。其中库文件是由每个模块子目录自己make后生成的。编译过程就此结束。

    3.u-boot的链接

    通过连接,我们可以得到最终的u-boot的hex文件,srec文件,二进制文件,img文件。

    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 $

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

    $(OBJCOPY) ${OBJCFLAGS}-O srec $

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

    $(OBJCOPY) ${OBJCFLAGS}-O binary $

    $(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 $

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

    $(OBJDUMP)-d $< >$@

    $(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

    LDFLAGS确定了程序地址和代码段、数据段的排列位置。下图是board/CCJ/u-boot.lds文件

    SECTIONS

    {

    .= 0x00000000;

    .= ALIGN(4);

    .text :

    {

    cpu/arm920t/start.o (.text)

    board/CCJ/boot_init.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);

    __bss_start=.;

    .bss : {*(.bss) }

    _end=.;

    }

    首先定义了基地址0x00000000,这个地址并不是我们实际存储程序的地址,而是在board目录下我们还要定义一个config.mk,包含内容TEXT_BASE = 0x33F80000。这个地址是我们自己定义的,基地址+偏移地址,才是u-boot程序最终存储的地址(0+0x33F80000=0x33F80000)。首先存储start.o的代码段,初始化代码段,然后是只读数据段,数据段。就此,u-boot链接完毕。

    第一次写博客,感觉真挺累的,但是一写就停不下来。还是很高兴的,将自己学到的知识分享给大家,其实嵌入式的学习路程真的很长,需要不断地努力,还要有兴趣。我很喜欢乔布斯说的那句话:“人类追求极致,并分享给同类,然后才能共同进步。”在实际的编程、比赛、项目中,我们都需要合作和互相学习,尤其是不同领域的人们合作更会创造出令人惊叹的事物,会让我们感叹人类创造力的同时让生活更美好。这大概也是GPL协议的初衷吧,开源、但又尊重人们的自由和所属权。

    今天写的博客都是基于这段时间的学习。希望能帮到大家。有写的不对的地方也希望大家给我指正,我会非常高兴,因为我喜欢交流^_^。

    最后谢谢u-boot的作者,能够将u-boot开源,并提供下载以供全世界的人们学习使用。我尊重u-boot的作者的版权:Wolfgang Denk, DENX Software Engineering, wd@denx.de.

    0b1331709591d260c1c78e86d0c51c18.png

    展开全文
  • 但如果要修改u-boot的话,就要在build u-boot之后,在u-boot的源码的目录里修改代码。 修改完成后使用git diff做成一个patch文件,然后把patch加入到yocoto的bb文件中。 (比如修改了test.c文件,..

    Linux开发时,有时需要修改uboot代码,或者有时需要查看uboot代码。

    在Yocot build时,若要生成uboot,需要:

    (如果使用的是u-boot.bb文件)

    $bitbake u-boot

    然后就会得到uboot的image文件。

    但如果要修改u-boot的话,就要在build u-boot之后,在u-boot的源码的目录里修改代码。

    修改完成后使用git diff做成一个patch文件,然后把patch加入到yocoto的bb文件中。

    (比如修改了test.c文件,就是用git diff test.c > fixbug.patch得到patch文件)

    这样下次构建u-boot时,先远程下载u-boot源码,然后打上我们加的patch文件,得到最终源码。

    这个修改过程对kernel也是一样的。

    但有的时候发现,build完成了,却找不到源码?

    别急,可能是build过程中,源码作为中间产物没有留下。

    我们只需执行命令:

    $bitbake -c unpack u-boot

    然后去u-boot的构建目录里去找就能发现源码:

    .\machine-bsp\build\tmp\work\machine-poky-linux-gnueabi\u-boot\v2017.03-r0\git

    在同级的deploy-u-boot目录,可以找到构建的image文件。

    对于kernel的源码位置:

    .\machine-bsp\build\tmp\work\machine-poky-linux-gnueabi\linux\4.1.15-r0\git

    展开全文
  • U-boot介绍
  • 参考正点原子 linux-ARM开发板 目标all 在顶层Makefile P802行 ... 变量 u-boot-init,u-boot-main在 顶层Makefile P678行 $(head-y)和CPU 架构有关,我们使用的是ARM 芯片,所以 $(head-y)在 arch/arm/Makefi..
  • u-boot 编译流程 (二)

    2021-01-17 01:21:40
    1 U-Boot.bin 研究U-Boot.bin的产生,从而进一步研究Linux内核编译流程 1.1 find all target 首先当我们执行sudo make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi-命令后, 默认的target是all,所以我们首先在顶层...
  • u-boot启动详解

    2021-05-31 15:44:04
    1. U-Boot启动流程分析 参考文献1 超详细分析Bootloader(Uboot)到内核的启动流程 1.1 U-boot主要目录结构: - board 目标板相关文件,主要包含SDRAM、FLASH驱动; - common 独立于处理器体系结构的通用代码,如...
  • u-boot学习笔记是基于NXP i.MX8系列芯片中imx8mq芯片学习记录的心得体会,各位大神在阅读过程中如发现有错误的地方,还请在评论区中指出,小生在此先拜谢了。 学习过程中使用的开发板是米尔科技开发的MYD-JX8MQ6-8E...
  • 为了深入了解ARM 64位芯片架构,笔者为u-boot添加了archinfo命令,以获取CPU当前的工作状态等信息。不过在增加完整的64位ARM架构信息查看功能之前,笔者首先增加了简单的获取当前PC指针及栈指针的函数: diff --git ...
  • 基于ARM处理器的U-BOOT详细移植总结

    千次阅读 2021-10-07 16:44:07
    如果存储器使用nand flash,但是第一次里面什么都没有,所以只能根据处理器的启动方式从其他方式启动如sd卡或nor存储器启动,然后在SD卡或nor存储器启动的基础之上使用USB或网络接口把u-boot.bin先下载到内存中,...
  • uboot移植到an2410全记录 http://www.eechina.com/thread-6690-1-1.html http://wenku.baidu.com/view/c6c5fad049649b6648d74745.html U-BOOT 编写流程 Bootloader的两部分: 1、NANFLASH 前4KB ...
  • By: fulinux ...目录u-boot相关EXTRA_IMAGEDEPENDS 变量u-boot-common.incu-boot.incUBOOT_MACHINE变量 继续分析meta-yocto-bsp/conf/machine/beaglebone-yocto.conf配置文件的作用 Beagleboneblack在启动.
  • 移植的u-boot版本 2021.01 [下载地址] 交叉编译工具 arm-linux-gnueabihf-gcc 6.5.0 [下载地址] 注:如果移植过程有不懂的步骤可以先看这篇文章:[点击跳转] 1、先使用官方默认配置编译一遍 查看configs目录下...
  • U-Boot顶层Makefile详解

    2021-08-01 20:51:15
    文章目录一、U_Boot工程目录分析1.打包编译好的uboot2.目录介绍1.arch2.board3.configs4.Makefile5. .config6.README二、VSCode工程创建1.新建工程2.屏蔽不需要文件三、U-Boot顶层Makefile分析1.版本号2.MAKEFLAGS...
  • ~/Works/ZYNQ/MZ702P/petaLinux$ petalinux-boot --jtag --u-boot --hw_server-url TCP:ubuntu:3121 INFO: Sourcing build tools INFO: Launching XSDB for file download and boot. INFO: This may take a few ...
  • 本文章主要以基于ARM® Cortex-A7内核的Freescale i.MX6ULL这款SoC探索u-boot-2021.01启动linux内核的流程。在了解启动流程之后,如果需要移植不同版本的u-boot或移植到其他平台的SoC,相信也能按照同样的思路去排查...
  • 如何编译配置u-boot

    2021-05-11 23:38:09
    板信息会被存储到“obj/u-boot/tmpARM/include/config.mk”中: ARCH= ARM CPU= ARMv7 BOARD= smdkc210 VENDOR = samsung SOC= exynos 2.4编译u-boot $ make 如果u-boot已经支持该单板,执行这个命令就可以完成编译...
  • U-Boot命令行模式 U-Boot启动过程中会打印出“Hit any key to stop autoboot: 0”。表示U-boot正在执行倒计时,n就表示计时时间(一般是3秒),如果在倒计时为0之前没有敲击到键盘上任何一个按键,则U-Boot倒计时...
  • petalinux编译自己下载的u-boot1. 新建工程目录,定位编译链,启动PetaLinux:cd program/source /home/admin-hjj/PetaLinux/settings.sh2. 新建petaLinux工程:petalinux-create --type project --template zynq --...
  • Hi3520DV400 U-Boot 编译

    2021-04-30 10:43:18
    1.Hi3521D_V100&Hi3520D_V400共用SDK 2.海思SDK版本中代号C01是uclibc库,...2.编译uboot,生成u-boot.bin文件 3.生成最终使用的 U-boot 镜像 烧写 U-boot 1.烧写 2.uboot环境变量配置 通过修改uboot代码来配置环境变量
  • 初学arm u-boot,总有很多问题。虽然这是一个小问题,但还是想写下来,记录一下,以免以后的的麻烦。u-boot执行的第一阶段将_armboot_start(也即_start)到_bss_start的代码都移到SDRAM中去了,但是唯独没有移动bss段...
  • U-BOOT 功能及启动流程解析源码整体框架第一阶段硬件设备初始化;为加载 Bootloader 的第二阶段代码准备 RAM 空间;复制 Bootloader 的第二阶段代码到 RAM 空间中;设置好栈;跳转到第二阶段代码的 C 入口点(start_...
  • u-boot 2021.01 版本编译

    2021-02-25 16:15:54
    u-boot 2021.01 官方版本编译 环境:vm15.0,ubuntu 20.04LTS u-boot的编译实际上网上资源很多, http://wiki.friendlyarm.com/wiki/index.php/Building_U-boot_and_Linux_for_H5/H3/H2%2B/zh 基本上只要按照wiki...
  • = $(TOPDIR)/board/$(BOARDDIR)/u-boot.lds LDFLAGS += -Bstatic -T $(obj)u-boot.lds $(PLATFORM_LDFLAGS) ifneq ($(TEXT_BASE),) LDFLAGS += -Ttext $(TEXT_BASE) endif 在u-boot-2009.08\board\samsung\smdk2410...
  • u-boot版本 备注 4.1.15 * 一、u-boot对命令行的命令解析过程分析 在u-boot的主线运行过程中,在board_init_r()函数进行u-boot初始化过程中的最后一个过程是:运行主函数循环。函数名为:run_main_loop()。该...
  • u-boot 编译过程分析

    2021-04-15 15:20:05
    TPL) += tpl/u-boot-tpl.bin ALL-$(CONFIG_OF_SEPARATE) += u-boot.dtb u-boot-dtb.bin ifeq ($(CONFIG_SPL_FRAMEWORK),y) ALL-$(CONFIG_OF_SEPARATE) += u-boot-dtb.img endif ALL-$(CONFIG_OF_HOSTFILE) += u-boot...
  • u-boot之顶层Makefile分析(二)中分析了config.mk的生成过程,接着继续分析顶层Makefile 导出config.mk为环境变量 # load ARCH, BOARD, and CPU configuration include $(obj)include/config.mk export ARCH ...
  • Yocto内核和u-boot开发

    2021-08-31 11:47:41
    bsp/u-boot/u-boot-fslc-common_2020.04.inc b/recipes-bsp/u-boot/u-boot-fslc-common_2020.04.inc index 94db11cc..d6a3e72d 100644 --- a/recipes-bsp/u-boot/u-boot-fslc-common_2020.04.inc +++ b/recipes-bsp/...
  • 嵌入式软件工程师听说过 u-boot 和 bootloader,但很多工程师依然不知道他们到底是啥。今天就来简单讲讲u-boot和bootloader的内容以及区别。Bootloa...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 215,269
精华内容 86,107
关键字:

u-boot

友情链接: Chapter5.zip