U-Boot 移植初探

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.o

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

config SYS_BOARD
        default "mx6ullevk" 

config SYS_VENDOR
        default "freescale"

config SYS_CONFIG_NAME
        default "mx6ullevk"

endif 
######### 修改后的内容 ###########################
if TARGET_MX6ULL_ANDYXI_EMMC

config SYS_BOARD
        default "mx6ull_andyxi_emmc" 

config SYS_VENDOR
        default "freescale"

config SYS_CONFIG_NAME
        default "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_EMMC
        bool "Support mx6ull_andyxi_emmc"
        select MX6ULL
        select DM
        select 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相关资料 !!!

  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

安迪西嵌入式

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值