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相关资料 !!!

U-Boot 移植初探相关推荐

  1. Docker 部署 Spring Boot 项目初探

    2019独角兽企业重金招聘Python工程师标准>>> 仅想在Docker里运行一个Spring Boot项目,捣鼓了许久... 本文主要适用于Windows环境下的Docker 一 ...

  2. Android Verity Boot(AVB)初探

    快速链接: .

  3. 【u-boot】uboot代码简要分析 (u-boot 移植)

    uboot代码简要分析 (u-boot 移植) 2012-12-19 22:46:04 [转] 先来看看源码目录结构,再按照代码的执行顺序简单地分析源码 1.U-boot源码整体框架 源码解压以后,我 ...

  4. uboot移植之修改支持NandFlash识别篇6(超详细)

    uboot移植之前期准备篇1 uboot移植之Makefile分析概述篇2 boot移植之init_sequence_f函数数组分析(番外篇) uboot移植之源码流程分析篇3(超详细!) uboot ...

  5. RT_thread STM32通用Bootloader 做OTA升级

    项目上需要做设备的远程升级更新程序,从而避免每次更新程序时都需要去现场烧录的麻烦.从而学习探索了RT提供的OTA功能. RT-Thread 开发团队提供了通用的 Bootloader.开发者通过该 B ...

  6. U-boot中控制台命令

    u-boot学习笔记如下: 用j-link commder 烧写nand flash(只能借助sdram来间接烧写) nand flash启动时候,我们接着s3c2440芯片内部的sram来烧写. r ...

  7. 【单片机开发】stm32f429在线IAP 实现SD卡烧写程序

    (一)背景介绍 最近做了一个工程需要用到IAP在线升级这个功能,当时在学的时候,了解到IAP的功能当时就觉得很鸡肋,明明有烧写器干嘛那么费事,现在觉得当时确实浅薄了,IAP功能在工程中确实是非常有用的 ...

  8. 【嵌入式】超详细的嵌入式路径学习精选合集,建议收藏

    超详细的嵌入式路径学习精选合集,纯干货,建议收藏! 本合集归类汇总了嵌入式开发技术相关的学习路径.知识与经验总结,以及一些源码.资料分享等.将其分类列出目录,一来为了避免有些知识长时间不用,会很容易忘 ...

  9. spring boot原理_SpringBoot-02-原理初探之主启动类

    2. 原理初探 2.1 pom.xml 父依赖 主要依赖一个父项目,主要管理项目的资源过滤和插件 <parent><groupId>org.springframework.bo ...

最新文章

  1. Java项目:中小医院信息管理系统(java+Springboot+ssm+mysql+maven+jsp)
  2. 在Eclipse中写第一个hibernate小例子
  3. Java创建一个文件变量_java如何定义一个类,创建它的成员变量和方法?
  4. angular HttpClient 配置
  5. JVM之常用基础参数详解
  6. ioc spring 上机案例_通过实例解析Spring Ioc项目实现过程
  7. h标签对html网页的作用,网页H标签SEO价值的说明与举例
  8. des算法c语言运行成功截图,求助攻:C语言DES算法的实现程序有问题
  9. 汽车在怠速时有很轻微的间歇抖动,是不是节气门脏了?
  10. Zabbix Agent2监控redis
  11. java学习之自定义异常
  12. C++实用编程——随机生成迷宫算法
  13. 【学术分享】写论文必须养成的十大良好写作习惯
  14. iOS中书写代码规范35条小建议
  15. 2016年中国OTT盒子行业市场现状及发展前景分析
  16. jieba 使用笔记
  17. 【csdn上使用MathType编写公式建议方法】【亲测有效!!!】
  18. 国际短信通道短信后台软件路由流程—移讯云短信系统
  19. 人工智能、机器学习和模式识别以及神经网络
  20. Unity内存/GC优化方法

热门文章

  1. HPE 380G10 安裝windows server 2012 教程
  2. java接口有非抽象方法_java 接口实现类编译显示不是抽象类,未覆盖抽象方法问题?...
  3. 【3D目标检测】KITTI数据集介绍
  4. 【SQL server 2008安装步骤】
  5. python爬取所有股票报道
  6. ASUS电脑显示未连接扬声器(英特尔智音技术版),声卡驱动修复,Realtek修复
  7. python数据分析-文本相似度分析
  8. jar包修改并重新打包,jar包反编译使用工具以及修改代码方法
  9. linux反编译unity手游,Unity3D安卓手游逆向
  10. C++ 激光打印二次开发