UBOOT环境配置及系统烧写
+ -

UBoot

2025-11-05 34 0

UBOOT简介

UBOOT一般分类为三类,并且是逐级完善的:

种类 描述
uboot 官方的 uboot 代码 由 uboot 官方维护开发的 uboot 版本,版本更新快,基本包含所有常用的芯片。
半导体厂商的 uboot 代码 半导体厂商维护的一个 uboot,专门针对自家的芯片,在对自家芯片支持上要比 uboot 官方的好。
开发板厂商的 uboot 代码 开发板厂商在半导体厂商提供的 uboot 基础上加入了对自家开发板的支持。
UBoot官方

第一级为UBOOT官方,uboot 官方的 uboot 源码是给半导体厂商准备的,半导体厂商会下载 uboot 官方的 uboot 源码,然后将自家相应的芯片移植进去。

Uboot官方网址为:https://docs.u-boot.org/en/latest/index.html

芯片厂商UBOOT

第二级为芯片厂商UBOOT,这个版本是半导体厂商根据官方的UBOOT进行定制,使其支持自定的芯片。
NXP维护的UBOOT源代码:https://github.com/nxp-imx/uboot-imx

开发板厂商UBoot

第三级为开发板厂商,这时开发板厂商会在半导体厂商的基础上再次修改,不过这次修改的一般都比较少。
如正点原子在NXP的官方UBoot进行修改适配:ubootimx-2016.03-2.1.0-ge468cdc-v1.5.tar.bz2

UBoot编译准备

和Linux一样,UBoot也需要交叉编译。
在编译Uboot之前,需要安装交叉编译工具链和ncurses库。
交叉工个链的安装详见:https://www.pciee.com/article/detail-162.html

ncurses库的安装,详见:https://www.pciee.com/article/detail-201.html

sudo apt-get install libncurses5-dev

libncurses5-dev 是一个用于在 Linux/Unix 终端下开发“文本用户界面”程序的开发库。

UBoot编译

正点原子提供的IMX6ULL开发板UBOOT源代码文件名为: uboot-imx-2016.03-2.1.0-ge468cdc-v1.5.tar.bz2
其配置文件位于configs目录下,如\uboot-imx-2016.03-2.1.0-g0ae7e33-v1.7\configs

解压:

tar -vxjf uboot-imx-2016.03-2.1.0-g8b546e4.tar.bz2

1.512MB(DDR3)+8GB(EMMC)核心板编编译

#!/bin/bash
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean     #清除工程
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- (加空格) mx6ull_14x14_ddr512_emmc_defconfig    #配置工程
make V=1 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j12        #编译UBOOT

NXP提供的官方EMMC配直文件为:mx6ull_14x14_evk_emmc_defconfig
NXP提供的EMMC配置文件中网卡驱动配置和LCD驱动的配置和正点原子的配置不一样,故会失败,需要移植配置。

2.256MB(DDR3)+ 512MB(NAND)核心板

#!/bin/bash
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- (加空格) mx6ull_14x14_ddr256_nand_defconfig
make V=1 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j1

NXP提供的官方EMMC配直文件为:mx6ull_14x14_evk_nand_defconfig

编译后在UBOOT根目录下就可以看到,关于各个格式之见的区别详见 https://www.pciee.com/article/detail-166.html

zzmt@zzmt:~/Desktop/uboot/uboot-imx-rel_imx_4.1.15_2.1.0_ga$ ls | grep u-boot
u-boot
u-boot.bin ##编译出的二进制文件
u-boot.cfg
u-boot.imx ##添加了头部(IVT、DCD等数据)以后的 u-boot.bin
u-boot.lds
u-boot.map
u-boot-nodtb.bin
u-boot.srec
u-boot.sym

编译后的文件说明:

  • u-boot:编译出来的 ELF 格式的 uboot 镜像文件。
  • u-boot.bin:编译出来的二进制格式的 uboot 可执行镜像文件。
  • u-boot.cfg: uboot 的另外一种配置文件。
  • u-boot.imx: u-boot.bin 添加头部信息以后的文件, NXP 的 CPU 专用文件。
  • u-boot.lds:链接脚本。
  • u-boot.map: uboot 映射文件,通过查看此文件可以知道某个函数被链接到了哪个地址上。
  • u-boot.srec: S-Record 格式的镜像文件。
  • u-boot.sym: uboot 符号文件。
  • u-boot-nodtb.bin:和 u-boot.bin 一样, u-boot.bin 就是 u-boot-nodtb.bin 的复制文件

Uboot烧写

uboot 编译好以后就可以烧写到板子上使用了.将 uboot烧写到 SD 卡中,然后通过 SD 卡来启动来运行 uboot。

chmod 777 imxdownload 
./imxdownload u-boot.bin /dev/sdd //烧写到 SD 卡,不能烧写到/dev/sda 或 sda1 设备里面!

这里烧写的是盘,而不是逻辑分区。以实际盘符为准,可以用fdisk -l查看

启动

烧完完成后,使用SD卡启动.

  • EMMC启动:10100110
  • SD启动:10000010
  • NAND启动:10001001

可以看到输出信息:

U-Boot 2016.03 (Nov 10 2025 - 14:50:32 +0800)

CPU:   Freescale i.MX6ULL rev1.1 792 MHz (running at 396 MHz)
CPU:   Industrial temperature grade (-40C to 105C) at 37C
Reset cause: WDOG
Board: I.MX6U ALPHA|MINI
I2C:   ready
DRAM:  512 MiB
MMC:   FSL_SDHC: 0, FSL_SDHC: 1
*** Warning - bad CRC, using default environment

imxdownload

imxdownload源码位于:https://github.com/flyghost/uboot/blob/master/imxdownload.c

imxdownload.c

#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "imxdownload.h"

#define SHELLCMD_LEN    (200)
#define BIN_OFFSET        (3072)

/* 此宏指明是否打印u-boot.imx的IVT DCD表信息,不同的开发板其IVT和DCD
 * 表的数据是不同的,因此需要获取所使用的开发板的IVT和DCD表信息,最
 * 简单的方法就是读取开发板配套资料里面的u-boot.imx的前1KB数据,理论上
 * 应该读取3KB的数据,但是表信息远远没有3K这么多,因此读1KB即可 
 */
#define PRINT_TAB        0    
/*
 * 介绍: 此软件是针对NXP的IMX6U系列芯片的,软件用来烧写bin文件到SD卡里面,
 *        本软件会自动添加IVT、DCD等信息到原始的bin文件里面,主要用于裸机和uboot的烧写。
 * 使用方法: 1、编译好原始的二进制bin文件,如,u-boot.bin等,并将编译好的.bin文件和本
 *             软件放置到同一个目录下!!!!
 *            2、执行命令sudo ./imxdownload <soucre_bin> <sd_device>
 *             如烧写u-boot.bin到/dev/sdd中即可使用如下所示命令:
 *             sudo ./imxdownload u-boot.bin /dev/sdd
 */

/*
 * 输出一些信息
 */
void message_print(void)
{    
    printf("I.MX6ULL bin download software\r\n");
    printf("Edit by:zuozhongkai\r\n");
    printf("Date:2019/6/10\r\n");
    printf("Version:V1.1\r\n");
    printf("log:V1.0 initial version,just support 512MB DDR3\r\n");
    printf("    V1.1 and support 256MB DDR3\r\n");
}

int main(int argc, char *argv[])
{
    FILE *fp;
    unsigned char *buf;
    unsigned char *cmdbuf;
    int nbytes, filelen;
    int i = 0, j = 0;
    int ddrsize = 0; /* 0为512MB,1为256MB,2为128MB...... */

    message_print();

    if((argc != 3) && (argc != 4)){
        printf("Error Usage! Reference Below:\r\n");
        printf("sudo ./%s <-512m or -256m> <source_bin> <sd_device>\r\n", argv[0]);
        return -1;
    }

    /* 查找参数,获取DDR容量 */
    for(i = 0; i < argc; i++)
    {
        char *param = argv[i];
        if(param[0] != '-')
            continue;
        if(strcmp(param, "-256m") == 0)         /* 256MB */
            ddrsize = 1;
        else if(strcmp(param, "-512m") == 0)    /* 512MB */
            ddrsize = 0;
    }
    if(argc == 3)    /* 三个参数,也就是不输入DDR容量的话默认为512MB */
        ddrsize = 0;

    /* 打开bin文件 */
    fp = fopen(argv[1], "rb"); /* 以二进制只读方式打开bin文件 */
    if(fp == NULL){
        printf("Can't Open file %s\r\n", argv[1]);
        return -1;
    }

    /* 获取bin文件长度 */
    fseek(fp, 0L, SEEK_END);
    filelen = ftell(fp);
    fseek(fp, 0L, SEEK_SET);
    printf("file %s size = %dBytes\r\n", argv[1], filelen);

    /* 读取bin文件到缓冲区buf中 */
    buf = malloc(filelen + BIN_OFFSET);
    if(buf == NULL){
        printf("Mem Malloc Failed!\r\n");
        fclose(fp);
        return -1;
    }
    memset(buf, 0, filelen + BIN_OFFSET); /* 清零 */
    /* 读取bin源码文件 */
    fread(buf + BIN_OFFSET, 1, filelen, fp);

    /* 关闭文件 */
    fclose(fp);

#if PRINT_TAB
    printf("IVT DCD Table:\r\n");
    for(i = 0; i < 1024/32; i++){
        for(j = 0; j < 8; j++)
        {
            printf("0X%08X,",*(int *)(buf + BIN_OFFSET + (((i * 8) + j) * 4)));
        }
        printf("\r\n");
    }    
    free(buf);
    return 0;
#endif

    /* 添加IVT DCD等表信息到bin文件里面 */
    if(ddrsize == 0) {        /* 512MB */
        printf("Board DDR SIZE: 512MB\r\n");
        memcpy(buf, imx6_512mb_ivtdcd_table, sizeof(imx6_512mb_ivtdcd_table));
    }
    else if (ddrsize == 1) {    /* 256MB */
        printf("Board DDR SIZE: 256MB\r\n");
        memcpy(buf, imx6_256mb_ivtdcd_table, sizeof(imx6_256mb_ivtdcd_table));
    }

    /* 现在我们已经在buf中构建好了可以用于下载的bin文件,将buf中的数据保存到
     * 到一个文件中,文件命名为load.imx
     */
    printf("Delete Old load.imx\r\n");
    system("rm -rf load.imx");        /* 先删除旧的load.imx文件    */

    printf("Create New load.imx\r\n");
    system("touch load.imx");        /* 创建新的load.imx文件        */
    fp = fopen("load.imx", "wb");    /* 打开laod.imx                */
    if(fp == NULL){
        printf("Cant't Open load.imx!!!\r\n");
        free(buf);
        return -1;
    }
    nbytes = fwrite(buf, 1, filelen + BIN_OFFSET, fp);
    if(nbytes != (filelen + BIN_OFFSET)){
        printf("File Write Error!\r\n");
        free(buf);
        fclose(fp);
        return -1;
    }
    free(buf);
    fclose(fp);    

    /* 构建烧写的shell命令 */
    cmdbuf = malloc(SHELLCMD_LEN);
    sprintf(cmdbuf, "sudo dd iflag=dsync oflag=dsync if=load.imx of=%s bs=512 seek=2",argv[2]);    
    printf("Download load.imx to %s  ......\r\n", argv[2]);

    /* 执行上面的shell命令 */
    system(cmdbuf);
    free(cmdbuf);
    return 0;    
}

imxdownload.h

#ifndef _IMXDOWNLOAD_H
#define _IMXDOWNLOAD_H
/* IMX6U IVT DCD表信息  暂时定义为1K Bytes,此表是读取的u-boot.imx前1K Bytes
 * imx6_ivedcd_table[9]是指明代码长度的,本应该根据实际的代码长度来修改
 * 这里为了方便,就直接定义为2M Bytes,即
 */

const int imx6_512mb_ivtdcd_table[256] = {
0X402000D1,0X87800000,0X00000000,0X877FF42C,0X877FF420,0X877FF400,0X00000000,0X00000000,
0X877FF000,0X00200000,0X00000000,0X40E801D2,0X04E401CC,0X68400C02,0XFFFFFFFF,0X6C400C02,
0XFFFFFFFF,0X70400C02,0XFFFFFFFF,0X74400C02,0XFFFFFFFF,0X78400C02,0XFFFFFFFF,0X7C400C02,
0XFFFFFFFF,0X80400C02,0XFFFFFFFF,0XB4040E02,0X00000C00,0XAC040E02,0X00000000,0X7C020E02,
0X30000000,0X50020E02,0X30000000,0X4C020E02,0X30000000,0X90040E02,0X30000000,0X88020E02,
0X30000C00,0X70020E02,0X00000000,0X60020E02,0X30000000,0X64020E02,0X30000000,0XA0040E02,
0X30000000,0X94040E02,0X00000200,0X80020E02,0X30000000,0X84020E02,0X30000000,0XB0040E02,
0X00000200,0X98040E02,0X30000000,0XA4040E02,0X30000000,0X44020E02,0X30000000,0X48020E02,
0X30000000,0X1C001B02,0X00800000,0X00081B02,0X030039A1,0X0C081B02,0X0B000300,0X3C081B02,
0X44014801,0X48081B02,0X302C4040,0X50081B02,0X343E4040,0X1C081B02,0X33333333,0X20081B02,
0X33333333,0X2C081B02,0X333333F3,0X30081B02,0X333333F3,0XC0081B02,0X09409400,0XB8081B02,
0X00080000,0X04001B02,0X2D000200,0X08001B02,0X3030331B,0X0C001B02,0XF3526B67,0X10001B02,
0X630B6DB6,0X14001B02,0XDB00FF01,0X18001B02,0X40172000,0X1C001B02,0X00800000,0X2C001B02,
0XD2260000,0X30001B02,0X23106B00,0X40001B02,0X4F000000,0X00001B02,0X00001884,0X90081B02,
0X00004000,0X1C001B02,0X32800002,0X1C001B02,0X33800000,0X1C001B02,0X31800400,0X1C001B02,
0X30802015,0X1C001B02,0X40800004,0X20001B02,0X00080000,0X18081B02,0X27020000,0X04001B02,
0X2D550200,0X04041B02,0X06100100,0X1C001B02,0X00000000,0X00000000,0X00000000,0X00000000,
0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,
0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,
0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,
0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,
0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,
0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,
0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,
0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,
0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,
0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,
0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,
0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,
0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,
0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,
0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000
};

const int imx6_256mb_ivtdcd_table[256] = {
0X402000D1,0X87800000,0X00000000,0X877FF42C,0X877FF420,0X877FF400,0X00000000,0X00000000,
0X877FF000,0X00076000,0X00000000,0X40E801D2,0X04E401CC,0X68400C02,0XFFFFFFFF,0X6C400C02,
0XFFFFFFFF,0X70400C02,0XFFFFFFFF,0X74400C02,0XFFFFFFFF,0X78400C02,0XFFFFFFFF,0X7C400C02,
0XFFFFFFFF,0X80400C02,0XFFFFFFFF,0XB4040E02,0X00000C00,0XAC040E02,0X00000000,0X7C020E02,
0X30000000,0X50020E02,0X30000000,0X4C020E02,0X30000000,0X90040E02,0X30000000,0X88020E02,
0X30000C00,0X70020E02,0X00000000,0X60020E02,0X30000000,0X64020E02,0X30000000,0XA0040E02,
0X30000000,0X94040E02,0X00000200,0X80020E02,0X30000000,0X84020E02,0X30000000,0XB0040E02,
0X00000200,0X98040E02,0X30000000,0XA4040E02,0X30000000,0X44020E02,0X30000000,0X48020E02,
0X30000000,0X1C001B02,0X00800000,0X00081B02,0X030039A1,0X0C081B02,0X04000000,0X3C081B02,
0X3C013C01,0X48081B02,0X38324040,0X50081B02,0X28304040,0X1C081B02,0X33333333,0X20081B02,
0X33333333,0X2C081B02,0X333333F3,0X30081B02,0X333333F3,0XC0081B02,0X09409400,0XB8081B02,
0X00080000,0X04001B02,0X2D000200,0X08001B02,0X3030331B,0X0C001B02,0XF352433F,0X10001B02,
0X630B6DB6,0X14001B02,0XDB00FF01,0X18001B02,0X40172000,0X1C001B02,0X00800000,0X2C001B02,
0XD2260000,0X30001B02,0X23104300,0X40001B02,0X47000000,0X00001B02,0X00001883,0X90081B02,
0X00004000,0X1C001B02,0X32800002,0X1C001B02,0X33800000,0X1C001B02,0X31800400,0X1C001B02,
0X30802015,0X1C001B02,0X40800004,0X20001B02,0X00080000,0X18081B02,0X27020000,0X04001B02,
0X2D550200,0X04041B02,0X06100100,0X1C001B02,0X00000000,0X00000000,0X00000000,0X00000000,
0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,
0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,
0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,
0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,
0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,
0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,
0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,
0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,
0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,
0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,
0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,
0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,
0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,
0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,
0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,
};

#endif

0 篇笔记 写笔记

uboot烧写Kernle和根文件系统前网络准备
uboot网络设置与PING手动设置UBOOT网络信息setenv ipaddr 192.168.0.66setenv ethaddr 11:22:33:44:55:66setenv gatewayip 192.168.0.1setenv netmask 255.255.255.0sete......
UBoot移植
UBoot移植是在NXP官方提供的UBOOT的基础上实现的。配置文件创建新的配置文件cd configscp mx6ull_14x14_evk_emmc_defconfig mx6ull_alientek_emmc_defconfig驱动移植uboot 中修改驱动基本都是在 xxx.h 和 ......
UBoot结构分析
boot.lds/u-boot.mapUBoot的入口函数位于arch/arm/cpu/u-boot.lds中,不过这只是一个模板代码,真正的代码是uboot编译后生成的u-boot.lds,位于源文件根目录中。u-boot.lds是uboot编译后的链接器脚本。主要定义了生成的uboot文件的大小......
rootfs根文件系统挂载uboot配置
开发板启动后,串口打印 Kernel panic - not syncing: VFS: Unable to mount root fs on unknownblock 以后就停止了,这个是开发板找不到文件系统报内核恐慌 Kernel panic 提示。如果需要挂载文件系统,以下进行分情况讲解:......
uboot默认参数信息
输出信息CPU: Freescale i.MX6ULL rev1.1 792 MHz (running at 396 MHz)CPU: Industrial temperature grade (-40C to 105C) at 47CReset cause: PORBoard: I.......
UBoot
UBOOT简介UBOOT一般分类为三类,并且是逐级完善的:种类描述uboot 官方的 uboot 代码由 uboot 官方维护开发的 uboot 版本,版本更新快,基本包含所有常用的芯片。半导体厂商的 uboot 代码半导体厂商维护的一个 uboot,专门针对自家的芯片......
关注公众号
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

您的支持,是我们前进的动力!