修改uboot以匹配开发板的方式有两种,一种是在NXP原厂开发板i.MX 6ULL EVK的文件上进行修改,另一种仿造NXP的开发板文件,添加自己的开发板文件。
为了能更多的了解uboot,我们使用代码改动较大的第二种方式进行uboot的移植。
在修改uboot之前,先来看一下uboot的源码结构。重点是分析 uboot 启动流程,而不是整个 uboot
一、U-BOOT的编译流程(Make命令的执行)
二、U-BOOT启动流程
三、U-BOOT移植
1、理论
2、实践
2.1添加开发板配置文件
首先是创建自己开发板的配置文件,该文件可参考原厂开发板的配置文件,在configs
文件夹下,将原来的默认配置文件mx6ull_14x14_evk_emmc_defconfig
复制一份,并重命名为mx6ull_myboard_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
修改为:
2.2 添加开发板对应的头文件
在目录 include/configs
下添加自己开发板对应的头文件,复制mx6ullevk.h
,并重命名为mx6ull_myboard.h
,将文件中的
#ifndef __MX6ULLEVK_CONFIG_H
#define __MX6ULLEVK_CONFIG_H
修改为:
该文件里面有很多宏定义,这些宏定义基本用于配置uboot,如果我们自己要想使能或者禁止uboot的某些功能,那就要在这里面修改。
在ubuntu中,可以安装VS Code软件来辅助查看代码,在ubuntu中安装vscode,需要先下载deb格式的安装包,然后使用类似如下的指令即可进行安装:
sudo dpkg -i code_1.58.0-1625728071_amd64.deb
安装完之后,我们可以将图标添加到ubuntu桌面上,ubuntu安装的所有软件图标都在目录/usr/share/applications
中,找到 Visual Studio Code 的图标,然后点击鼠标右键,选择复制到->桌面即可。
2.3 添加开发板对应的板级文件夹
uboot中每个板子都有一个对应的文件夹来存放板级文件(如开发板上外设驱动文件等)。NXP的I.MX系列芯片的所有板级文件夹都存放在 board/freescale/
目录下,在这个目录下有个名为mx6ullevk
的文件夹,原厂开发板的板级文件夹。
复制 mx6ullevk,将其重命名为mx6ull_myboard
,进入mx6ull_myboard
目录中, 将其中的mx6ullevk.c
文件重命名为mx6ull_myboard.c
。
2.3.1 修改Makefile文件
首先是修改 board/freescale/mx6ull_myboard 目录下的Makefile
文件
将原始内容:
# (C) Copyright 2015 Freescale Semiconductor, Inc.
#
# SPDX-License-Identifier: GPL-2.0+
#
obj-y := mx6ullevk.o
extra-$(CONFIG_USE_PLUGIN) := plugin.bin
$(obj)/plugin.bin: $(obj)/plugin.o
$(OBJCOPY) -O binary --gap-fill 0xff $< $@
其中的依赖项修改为:
obj-y := mx6ull_myboard.o
这样才会编译mx6ull_myboard.c
这个文件。
2.3.2 修改imximage.cfg文件
然后修改 board/freescale/mx6ull_myboard 目录下的imximage.cfg
文件
将imximage.cfg
中的下面一句:
PLUGIN board/freescale/mx6ullevk/plugin.bin 0x00907000
改为:
PLUGIN board/freescale/mx6ull_myboard/plugin.bin 0x00907000
2.3.3 修改Kconfig文件
接着修改 board/freescale/mx6ull_myboard 目录下的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
修改为:
2.3.4 修改MAINTAINERS文件
再接着修改 board/freescale/mx6ull_myboard 目录下的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
修改为:
2.3.5 重命名板子的c文件
将 board/freescale/mx6ull_myboard 目录下原来的mx6ullevk.c
重命名为mx6ull_myboard.c
2.4 修改U-Boot图形界面配置文件
最后修改arch/arm/cpu/armv7/mx6/
目录下的Kconfig
文件
注意这里的Kconfig和
board/freescale/mx6ull_myboard
目录下的Kconfig是不一样的。
在207行插入一些内容:
config TARGET_MX6ULL_MYBOARD
bool "Support mx6ull_myboard"
select MX6ULL
select DM
select DM_THERMAL
然后,在最后一行的endif
的前一行添加如下内容:
source "board/freescale/mx6ull_myboard/Kconfig"
2.5 创建编译脚本
在uboot根目录下新建一个名为build_myboard.sh
的 shell 脚本,写入如下内容:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- mx6ull_myboard_defconfig
make V=1 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j8
至此,以上完成的工作,相当于将NXP原厂开发板相关的配置文件,重新复制了一份,并对板子名称修改为了自己板子的名字。
此时执行./build_myboard.sh
,等待编译完成后输入如下命令:
grep -nR "mx6ull_myboard.h"
如果有很多文件都引用了这个头文件, 那就说明新板子添加成功:
将uboot进行编译并运行,实际的效果应该和原厂uboot的效果一样(LCD无法显示)。
总结一下刚才都有哪些修改:
右端灰色的为原厂开发板的相关文件,黄色的为模仿原厂文件,新添加并修改的自己开发板的文件。
参考资料:i.MX6ULL嵌入式Linux开发2-uboot移植实践 - 知乎