Linux--uboot移植(二)

发布于:2024-04-26 ⋅ 阅读:(24) ⋅ 点赞:(0)

修改uboot以匹配开发板的方式有两种,一种是在NXP原厂开发板i.MX 6ULL EVK的文件上进行修改,另一种仿造NXP的开发板文件,添加自己的开发板文件。

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

在修改uboot之前,先来看一下uboot的源码结构。重点是分析 uboot 启动流程,而不是整个 uboot

源码, uboot 整个源码非常大,我们只看跟我们关心的部分即可。
我们在分析 uboot 源码之前一定要 在 Ubuntu 中编译一下 uboot 源码,因为编译过程会生成一些文件,而生成的这些恰恰是分析uboot 源码不可或缺的文件。

一、U-BOOT的编译流程(Make命令的执行)

二、U-BOOT启动流程

通过对 uboot 启动流程的梳理,我们就可以掌握一些外设是在哪里被初始化的,这样当我们需要修改这些外设驱动的时候就会心里有数。另外,通过分析uboot 的启动流程可以了解 Linux 内核是如何被启动的。

三、U-BOOT移植

本节主要记录如何将 NXP 官方的 uboot 移植到自己的 I.MX6ULL 开发板上,学习如何在 uboot 中添加我们自己的板子。

1、理论

uboot 的移植并不是说我们完完全全的从零开始将 uboot 移植到我们现在所使用的开发板 或者开发平台上。这个对于我们来说基本是不可能的,这个工作一般是半导体厂商做的,半导 体厂商负责将 uboot 移植到他们的芯片上,因此半导体厂商都会自己做一个开发板,这个开发板就叫做原厂开发板,比如大家学习 STM32 的时候听说过的 discover 开发板就是 ST 自己做的。半导体厂商会将 uboot 移植到他们自己的原厂开发板上,测试好以后就会将这个 uboot 发布出去,这就是大家常说的原厂 BSP 包。我们一般做产品的时候就会参考原厂的开发板做硬件,然后在原厂提供的 BSP 包上做修改,将 uboot 或者 linux kernel 移植到我们的硬件上。这个就是uboot 移植的一般流程:
①、在 uboot 中找到参考的开发平台,一般是原厂的开发板。
②、参考原厂开发板移植 uboot 到我们所使用的开发板上。

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移植实践 - 知乎