U-Boot 移植初探

article/2025/10/6 17:40:41

1. NXP官方开发板uboot编译测试

uboot移植不需要从零开始将uboot移植到使用的开发板上。因为半导体厂商通常都会自己做一个开发板, 将uboot移植到他们自己的原厂开发板上,再将这个uboot(原厂BSP 包)发布出去。因此使用自已的开发板移植uboot,一般按如下步骤进行

1.1 查找官方开发板默认配置文件

市面上的开发板,通常会参考原厂的开发板做硬件,然后在原厂提供的 BSP 包上做修改,如本文所使用的正点原子 I.MX6ULL 开发板参考的就是NXP官方的 I.MX6ULL EVK 开发板做的硬件:
在这里插入图片描述

  • 将NXP官方原版Uboot源码包,拷贝至Ubuntu下的相应文件夹中,然后进行解压:
tar -vxjf uboot-imx-rel_imx_4.1.15_2.1.0_ga.tar.bz2
  • 解压后,configs 目录下有很多跟 I.MX6UL/6ULL 有关的配置,找到与mx6ull相同的,如下图:
    在这里插入图片描述

因为这里使用的开发板是emmc版本的,所以使用这个配置文件:mx6ull_14x14_evk_emmc_defconfig

1.2 编译官方开发板对应的uboot

找到 NXP 官方 I.MX6ULL EVK 开发板对应的默认配置文件以后就可以编译了,编译uboot使用下面3条指令或者使用编译脚本文件:

#ARCH=arm表示设置目标为arm架构,相当于make distclean,清除工程
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
#配置uboot,配置文件为mx6ull_14x14_evk_emmc_defconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- mx6ull_14x14_evk_emmc_defconfig
#V=1用于设置编译过程中的信息输出级别,相当于make -j12,即使用12核来编译uboot
make V=1 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j12 
##########################################################################
#每次编译uboot都需要输入一长串命令
#为了简单起见,建立一个shell脚本文件,将这些命令写到shell脚本里
#执行shell脚本即可完成编译工作
#新建mx6ull_evk_emmc.sh脚本文件
##########################################################################
#!/bin/bash
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- mx6ull_14x14_evk_emmc_defconfig
make V=1 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j12 
##########################################################################
#通过命令“./mx6ull_evk_emmc.sh”编译uboot

编译完成以后会生成 u-boot.bin、u-boot.imx 等文件,但是这些文件是 NXP 官方 I.MX6ULL EVK 开发板配置生成的,所以接下来将其烧录到正点原子的 I.MX6ULL 开发板上看看能否使用

1.3 烧写验证与测试

将 imxdownload 软件拷贝到 uboot 源码根目录下,然后使用 imxdownload 软件将 u-boot.bin 烧写到 SD 卡中,烧写命令如下:

chmod 777 imxdownload               #给予imxdownload可执行权限
./imxdownload u-boot.bin /dev/sdd   #烧写到SD卡中

烧录完之后,将SD卡插入开发板启动,使用串口连接电脑,查看uboot启动信息:从下图可以看出,uboot启动正常,虽然用的是NXP官方 I.MX6ULL 开发板的uboot,但是在正点原子的I.MX6ULL开发板上是可以正常启动的,而且 DRAM 识别正确,为512MB

在这里插入图片描述

2. 在U-Boot中添加自已的开发板

上面介绍了如何使用NXP原厂的uboot进行编译、烧写和运行。但是NXP原厂的uboot,直接烧录到我的开发板中,LCD的驱动和网络驱动是不正常的,需要进行修改

下面将介绍如何修改uboot,使得uboot能匹配我们自己的开发板。修改uboot以匹配开发板的方式有两种:

  • 在NXP原厂开发板i.MX 6ULL EVK的文件上进行修改
  • 仿造NXP的开发板文件,添加自己的开发板文件

为了能更多的了解uboot,我们使用代码改动较大的第二种方式进行uboot的移植

2.1 添加开发板默认配置文件

在configs文件夹下,参考原厂开发板的配置文件,创建自己开发板的配置文件。

  • 复制mx6ull_14x14_evk_emmc_defconfig,并重命名为mx6ull_andyxi_emmc_defconfig
cp mx6ull_14x14_evk_emmc_defconfig mx6ull_alientek_emmc_defconfig
  • 修改mx6ull_alientek_emmc_defconfig中的内容,如下:
######### 原始内容 ###############################
CONFIG_SYS_EXTRA_OPTIONS="IMX_CONFIG=board/freescale/mx6ullevk/imximage.cfg,MX6ULL_EVK_EMMC_REWORK"
CONFIG_ARM=y
CONFIG_ARCH_MX6=y
CONFIG_TARGET_MX6ULL_14X14_EVK=y
CONFIG_CMD_GPIO=y
######### 修改后的内容 ###########################
CONFIG_SYS_EXTRA_OPTIONS="IMX_CONFIG=board/freescale/mx6ull_andyxi_emmc/imximage.cfg,MX6ULL_ANDYXI_EMMC_REWORK" 
CONFIG_ARM=y 
CONFIG_ARCH_MX6=y 
CONFIG_TARGET_MX6ULL_ANDYXI_EMMC=y 
CONFIG_CMD_GPIO=y

2.2 添加开发板对应的头文件

在目录include/configs下添加开发板对应的头文件,

  • 复制mx6ullevk.h,并重命名为mx6ull_andyxi_emmc.h
cp mx6ullevk.h mx6ull_andyxi_emmc.h
  • 修改mx6ull_andyxi_emmc.h里面的内容,该文件里面有很多宏定义用于配置uboot,可按需修改
/*######### 原始内容 ###############################*/
#ifndef __MX6ULLEVK_CONFIG_H 
#define __MX6ULLEVK_CONFIG_H
/*######### 修改后的内容 ###########################*/
#ifndef __MX6ULL_ANDYXI_EMMC_CONFIG_H 
#define __MX6ULL_ANDYXI_EMMC_CONFIG_H

2.3 添加开发板对应的板级文件

uboot中每个板子都有一个对应的文件夹来存放板级文件(如开发板上外设驱动文件等)。NXP的I.MX系列芯片的所有板级文件夹都存放在board/freescale/目录下,该目录下的 mx6ullevk文件夹,即原厂开发板的板级文件夹。参考该文件夹,创建自己开发板的板级文件

  • 复制 mx6ullevk,将其重命名为mx6ull_andyxi_emmc,进入目录中, 将其中的mx6ullevk.c文件重命名为mx6ull_andyxi_emmc.c
cd board/freescale/                     #进入板级文件夹
cp mx6ullevk/ -r mx6ull_andyxi_emmc     #复制mx6ullevk为mx6ull_andyxi_emmc
cd mx6ull_andyxi_emmc                   #进入mx6ull_andyxi_emmc文件夹
mv mx6ullevk.c mx6ull_andyxi_emmc.c     #将其中的mx6ullevk.c文件重命名为mx6ull_andyxi_emmc.c
  • 修改 mx6ull_andyxi_emmc目录下的 Makefile文件,将依赖项修改为mx6ull_andyxi_emmc.o
# (C) Copyright 2015 Freescale Semiconductor, Inc.
#
# SPDX-License-Identifier:      GPL-2.0+
#obj-y  := mx6ull_andyxi_emmc.oextra-$(CONFIG_USE_PLUGIN) :=  plugin.bin
$(obj)/plugin.bin: $(obj)/plugin.o$(OBJCOPY) -O binary --gap-fill 0xff $< $@
  • 修改 mx6ull_andyxi_emmc目录下的 imximage.cfg文件
######### 原始内容 ###############################
PLUGIN board/freescale/mx6ullevk/plugin.bin 0x00907000
######### 修改后的内容 ###########################
PLUGIN board/freescale/mx6ull_andyxi_emmc/plugin.bin 0x00907000
  • 修改 mx6ull_andyxi_emmc目录下的 Kconfig文件
######### 原始内容 ###############################
if TARGET_MX6ULL_14X14_EVK || TARGET_MX6ULL_9X9_EVKconfig SYS_BOARDdefault "mx6ullevk" config SYS_VENDORdefault "freescale"config SYS_CONFIG_NAMEdefault "mx6ullevk"endif 
######### 修改后的内容 ###########################
if TARGET_MX6ULL_ANDYXI_EMMCconfig SYS_BOARDdefault "mx6ull_andyxi_emmc" config SYS_VENDORdefault "freescale"config SYS_CONFIG_NAMEdefault "mx6ull_andyxi_emmc"endif
  • 修改 mx6ull_andyxi_emmc目录下的 MAINTAINERS文件
######### 原始内容 ###############################
MX6ULLEVK BOARD
M:      Peng Fan <peng.fan@nxp.com>
S:      Maintained
F:      board/freescale/mx6ullevk/
F:      include/configs/mx6ullevk.h
F:      configs/mx6ull_14x14_evk_defconfig
F:      configs/mx6ull_9x9_evk_defconfig
######### 修改后的内容 ###########################
MX6ULL_ANDYXI_EMMC BOARD
M:      Peng Fan <peng.fan@nxp.com>
S:      Maintained
F:      board/freescale/mx6ull_andyxi_emmc/
F:      include/configs/mx6ull_andyxi_emmc.h
F:      configs/mx6ull_andyxi_emmc_defconfig

2.4 修改U-Boot图形界面配置文件

uboot支持图形界面配置,因此要修改arch/arm/cpu/armv7/mx6/目录下的图像界面配置文件Kconfig

######### 207行加入如下内容 ###############################
config TARGET_MX6ULL_ANDYXI_EMMCbool "Support mx6ull_andyxi_emmc"select MX6ULLselect DMselect DM_THERMAL
######### 最后一行endif的前一行添加如下内容 ###############
source "board/freescale/mx6ull_andyxi_emmc/Kconfig"

2.5 使用新添加的板子配置编译uboot

在 uboot根目录下新建 shell脚本,来配置编译 uboot

  • mx6ull_andyxi_emmc.sh脚本内容如下:
#!/bin/bash 
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean 
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- mx6ull_andyxi_emmc_defconfig 
make V=1 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j16
  • 给予 mx6ll_andyxi_emmc.sh可执行权限,然后运行脚本来完成编译,命令如下:
chmod 777 mx6ull_andyxi_emmc.sh   #给予可执行权限,一次即可
./mx6ull_andyxi_emmc.sh           #运行脚本编译uboot
  • 编译完成后输入如下命令,查看添加的头文件有没有被引用,如果有很多文件都引用了这个头文件(如下图),那就说明新板子添加成功
grep -nR "mx6ull_andyxi_emmc.h"

在这里插入图片描述

  • 编译完成以后就使用 imxdownload将新编译出来的 u-boot.bin烧写到 SD卡中测试,串口输出结果如下图

在这里插入图片描述

从上图可以看出,此时的Board还是“MX6ULL 14x14 EVK”,如果接了 LCD屏幕的话会发现 LCD屏幕并没有显示 NXP的 logo,而且从图中可以看出此时的网络同样也没识别出来。后续文章会介绍如何修改 LCD驱动和网络驱动…

总结一下上面做了哪些修改:右端蓝色的为原厂开发板的相关文件,黄色的为模仿原厂文件,新添加并修改的自己开发板的文件

在这里插入图片描述

关注公众号,发送“uboot”,即可获取uboot相关资料 !!!


http://chatgpt.dhexx.cn/article/QgCs0snd.shtml

相关文章

U-Boot移植

一、U-Boot Linux 系统要启动就必须需要一个 bootloader 程序&#xff0c;芯片上电以后先运行一段bootloader程序。 bootloader程序会先初始化DDR等外设&#xff0c;然后将Linux内核从flash(NAND&#xff0c;NOR FLASH&#xff0c; SD&#xff0c; eMMC 等)拷贝到 DDR 中&…

uboot移植

一、我们知道uboot就是一个Bootloader。但是&#xff0c;arm不像我们的pc机一样&#xff0c;用一个老毛桃随便找一个网站下一个windows镜像就可以直接装了。 我们的uboot对应的就是老毛桃里面刷的引导程序。 虽然uboo支持很多架构很多不同的厂家的板子&#xff0c;但是UBOOT它…

【Linux】系统移植篇四--uboot移植

系统移植篇四--uboot移植 一、uboot源码结构1、uboot源码获取2、uboot特点3、uboot源码结构 二、uboot的配置与编译1、uboot配置2、uboot编译 前言&#xff1a;本篇主要介绍uboot的一些结构与相关配置&#xff0c;uboot是一款免费开源的芯片启动软件&#xff0c;代码完全开源&a…

uboot移植过程

uboot移植过程 IMX6ULL 文章目录 uboot移植过程 IMX6ULL 前言一、从原厂中移植uboot进行测试二、在U-Boot中添加自己的硬件1. 添加默认配置文件2. 添加对应的头文件3. 添加对应的板级文件夹3.1 修改Makefile文件3.2 修改 mx6ull_alientek 目录下的 imximage.cfg 文件3.3 修改 m…

MediaCodec对接到OMX的简单分析

一、引言&#xff1a; nuplayer播放器是使用MediaCodec来进行编解码的&#xff0c;而OMX组件则是MediaCodec的解码核心&#xff0c;但是因为涉及的面太过底层&#xff0c;往往是芯片公司才会涉及到这一块&#xff0c;所以就做一个简单分析&#xff0c;对通路有个大致了解就行。…

MediaCodec(native)状态机分析

一、引入&#xff1a; MediaCodec这条通路的调用逻辑是MediaCode->ACodec->OMX&#xff0c;因为OMX有自己的状态机&#xff0c;所以MediaCodec和ACodec也分别基于OMX组件的调用维护了其状态机&#xff0c;这篇博客就先分析MediaCodec的状态机是如何运转的。 二、MediaCo…

视频-MediaCodec

1.解析视频可以使用android 提供的api MediaPlayer,实现简单的播放暂停&#xff0c;提取视频中的一帧或者编辑视频&#xff0c;需要另一个api MediaCodec&#xff08;硬解&#xff0c;控制DSP芯片&#xff09;或者 ffmpeg(软解&#xff0c;耗时)&#xff0c;选择的优先级一定要…

MediaCodec解析MP4视频

MediaCodec讲解 MediaCodec是Android提供的用于对音视频进行编解码的类&#xff0c;它通过访问底层的codec来实现编解码的功能。是Android media基础框架的一部分&#xff0c;通常和 MediaExtractor, MediaSync, MediaMuxer, MediaCrypto, MediaDrm, Image, Surface和AudioTra…

Android视频编解码之MediaCodec简单入门

本篇只是简单入门&#xff0c;后面会继续写文章详细讲解&#xff1a; 由于MediaCodec涉及内容众多&#xff0c;原本想一篇文章把所有内容概括&#xff0c;但是后来发现不太可能&#xff0c;限于自己能力&#xff0c;想要考虑全面太难&#xff0c;我也是刚开始学习需要借助网上…

Android:MediaCodec基本原理

最近需要使用MediaCodec做一些工作&#xff0c;因此对MediaCodec做了些研究和代码编写&#xff0c;在此先对MediaCodec的一些基础原理、工作流程、常用API等做个初步总结&#xff0c;方便后续开发过程中查阅。 1.MediaCodec简介 1.1 MediaCodec来历 Android从最初的API 1.0版…

MediaCodec原理及使用

使用MediaCodec目的 MediaCodec是Android底层多媒体框架的一部分&#xff0c;通常与MediaExtractor、MediaMuxer、AudioTrack结合使用&#xff0c;可以编码H264、H265、AAC、3gp等常见的音视频格式 MediaCodec工作原理是处理输入数据以产生输出数据 MediaCodec工作流程 Medi…

Android MediaCodec

Android中可以使用MediaCodec来访问底层的媒体编解码器&#xff0c;可以对媒体进行编/解码。 MediaCodec可以处理的数据有以下三种类型&#xff1a;压缩数据、原始音频数据、原始视频数据。这三种类型的数据均可以利用ByteBuffers进行处理&#xff0c;但是对于原始视频数据应提…

android P MediaCodec编解码流程分析

1.MediaCodec初始化流程分析 通过上面流程分析可知&#xff0c;MediaCodecList初始化是通过调用它的getLocalInstance函数&#xff0c;然后在里面new的MediaCodecList对象。在MediaCodec的CreateByType函数中new了MediaCodec对象。 allocateNode调用流程是在ACodec.cpp中的onA…

MediaCodec_Analyze-3-start

MediaCodec Analyse – start Refrence: https://source.android.google.cn/devices/media 一 APK调用的核心API Android APK使用 MediaCodec API 播放音视频的简易流程&#xff1a; MediaCodec codec MediaCodec.createDecoderByType("video/avc"); MediaFormat …

mediacodec api

mediacodec api 官网&#xff1a; https://developer.android.com/reference/android/media/MediaCodec 中文&#xff1a; https://www.apiref.com/android-zh/android/media/MediaCodec.html 学习mediacodec api的使用说明&#xff0c;在android源码查看&#xff1a; andro…

MediaCodec硬解流程

一 MediaCodec概述 MediaCodec 是Android 4.1(api 16)版本引入的低层编解码接口&#xff0c;同时支持音视频的编码和解码。通常与MediaExtractor、MediaMuxer、AudioTrack结合使用&#xff0c;能够编解码诸如H.264、H.265、AAC、3gp等常见的音视频格式。MediaCodec在编解码的过…

MediaCodec_Analyze-1-create

MediaCodec Analyse – create Refrence: https://source.android.google.cn/devices/media 一 APK调用的核心API Android APK使用 MediaCodec API 播放音视频的简易流程&#xff1a; MediaCodec codec MediaCodec.createDecoderByType("video/avc"); MediaFormat…

mediacodec

MedaiCodec简介 MediaCodec是Android中提供的音视频编/解码工具。它主要是完成上层接口的封装&#xff0c;供给开发者使用&#xff0c;编解码功能实际是在native底层服务中完成的 MediaCodec工作流程 包括两个缓冲区队列 一个输入缓冲区队列&#xff0c;包含一组输入缓冲区(格…

Android MediaCodec 完全解析

MediaCodec是什么&#xff1f; MediaCodec类为开发者提供了能访问到Android底层媒体Codec&#xff08;Encoder/Decoder&#xff09;的能力&#xff0c;它是Android底层多媒体基础架构的一部分&#xff08;通常和MediaExtractor、MediaSync、MediaMuxer、MediaCrypto、MediaDrm…

Android MediaCodec解析

Android MediaCodec解析 1 引言 MediaCodec是Android平台提供的一个底层的音视频编解码框架&#xff0c;它是安卓底层多媒体基础框架的重要组成部分。它经常和 MediaExtractor, MediaSync, MediaMuxer, MediaCrypto, MediaDrm, Image, Surface, AudioTrack一起使用。解码的作…