U-Boot移植 (1)- uboot添加自己的开发板

文章目录

  • uboot添加自己的开发板
    • 1. uboot源码结构分析
    • 2. 编译和烧写 NXP 官方开发板对应的 uboot
      • 2.1 编译NXP官方开发板对应的 uboot
      • 2.2 烧写验证与驱动测试
        • 1. SD 卡和 EMMC 驱动检查
        • 2. LCD 驱动检查
        • 3. 网络驱动
        • 4. u-boot需要修改的地方
    • 3. 添加开发板默认配置文件
    • 4. 添加开发板对应的头文件
    • 5. 添加开发板对应的板级文件夹
      • 5.1 修改Makefile文件
      • 5.2 修改imximage.cfg文件
      • 5.3 修改Kconfig文件
      • 5.4 修改MAINTAINERS文件
    • 6. 修改U-Boot图形界面配置文件
    • 7. 创建编译脚本

链接: C/C++Linux服务器开发/后台架构师【零声教育】-学习视频教程-腾讯课堂

uboot添加自己的开发板

NXP原厂的uboot,直接烧录到我的开发板中,LCD的驱动是不正常的,需要进行修改。「使得uboot能匹配我们自己的开发板」

修改uboot以匹配开发板的方式有两种,一种是在NXP原厂开发板 「i.MX 6ULL EVK」 的文件上进行修改,另一种仿造NXP的开发板文件,添加自己的开发板文件。为了能更多的了解uboot,使用代码改动较大的第二种方式进行uboot的移植。

在修改uboot之前,先来看一下uboot的源码结构。

1. uboot源码结构分析

uboot的源码如下,这里是源码编译后的结果,包含编译后的文件。

U-Boot移植 (1)- uboot添加自己的开发板_第1张图片

这里文件的含义如下:

U-Boot移植 (1)- uboot添加自己的开发板_第2张图片

u-boot:编译出来的 ELF 格式的 uboot 镜像文件。
u-boot.bin:编译出来的二进制格式的 uboot 可执行镜像文件。
u-boot.cfg: uboot 的另外一种配置文件。
u-boot.imx: u-boot.bin 添加头部信息以后的文件, NXP 的 CPU 专用文件。
u-boot.lds:链接脚本。
u-boot.map: uboot 映射文件,通过查看此文件可以知道某个函数被链接到了哪个地址上。
u-boot.srec: S-Record 格式的镜像文件。
u-boot.sym: uboot 符号文件。
u-boot-nodtb.bin:和 u-boot.bin 一样, u-boot.bin 就是 u-boot-nodtb.bin 的复制文件。

2. 编译和烧写 NXP 官方开发板对应的 uboot

2.1 编译NXP官方开发板对应的 uboot

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- -j8

2.2 烧写验证与驱动测试

使用 imxdownload 软件将 u-boot.bin烧写到 SD 卡中,启动开发板

U-Boot移植 (1)- uboot添加自己的开发板_第3张图片

可以看出, uboot 启动正常,虽然我们用的是 NXP 官方 I.MX6ULL 开发板的uboot,但是在正点原子的 I.MX6ULL 开发板上是可以正常启动的。而且 DRAM 识别正确,为512MB

1. SD 卡和 EMMC 驱动检查

检查一下 SD 卡和 EMMC 驱动是否正常,使用命令 mmc list 列出当前的 MMC 设备

看出当前有两个 MMC 设备,检查每个 MMC 设备信息

=> mmc list
FSL_SDHC: 0 (SD)
FSL_SDHC: 1

=> mmc info
Device: FSL_SDHC
Manufacturer ID: 3
OEM: 5344
Name: SC16G
Tran Speed: 50000000
Rd Block Len: 512
SD version 3.0
High Capacity: Yes
Capacity: 14.8 GiB
Bus Width: 4-bit
Erase Group Size: 512 Bytes

mmc 设备 0 是 SD 卡, SD 卡容量为 14.8GB,这个和我所使用的SD 卡信息相符,说明 SD 卡驱动正常

=> mmc dev 1
switch to partitions #0, OK
mmc1(part 0) is current device

=> mmc list
FSL_SDHC: 0 (SD)
FSL_SDHC: 1 (eMMC)

=> mmc info
Device: FSL_SDHC
Manufacturer ID: 15
OEM: 100
Name: 8GTF4
Tran Speed: 52000000
Rd Block Len: 512
MMC version 4.0
High Capacity: Yes
Capacity: 7.3 GiB
Bus Width: 8-bit
Erase Group Size: 512 KiB

mmc 设备 1 为 EMMC,容量为 7.3GB,说明 EMMC 驱动也成功

2. LCD 驱动检查

如果 uboot 中的 LCD 驱动正确的话,启动 uboot 以后 LCD 上应该会显示出 NXP 的 logo

U-Boot移植 (1)- uboot添加自己的开发板_第4张图片

  • 如果用的不是正点原子的 4.3 寸 480x272 分辨率的屏幕的话,那么 LCD 就不会显示 logo 界面。因为 NXP 官方 I.MX6ULL 开发板的屏幕就是 4.3 寸 480x272 分辨率的

  • 所以 uboot 默认 LCD 驱动是 4.3 寸 480x272 分辨率的。如果使用其他分辨率的 LCD 就需要修改 LCD 驱动,uboot 的 LCD 需要修改就行了。

3. 网络驱动

uboot 启动的时候提示“Board Net Initialization Failed”和“No ethernet found.”这两行,说明网络驱动也有问题

U-Boot移植 (1)- uboot添加自己的开发板_第5张图片

说明当前 uboot 的网络部驱动也是有问题的,这是因为正点原子开发板的网络芯片复位引脚和 NXP 官方开发板不一样,因此需要修改驱动。

4. u-boot需要修改的地方

总结一下 NXP 官方 I.MX6ULL EVK 开发板的 uboot 在正点原子 EMMC 版本 I.MX6ULL开发板上的运行情况:
①、 uboot 启动正常, DRAM 识别正确, SD 卡和 EMMC 驱动正常。
②、 uboot 里面的 LCD 驱动默认是给 4.3 寸 480x272 分辨率的,如果使用的其他分辨率的屏幕需要修改驱动。
③、网络不能工作,识别不出来网络信息,需要修改驱动。

接下来我们要做的工作如下:
①、前面我们一直使用着 NXP 官方开发板的 uboot 配置,接下来需要在 uboot 中添加我们自己的开发板,也就是正点原子的 I.MX6ULL 开发板。
②、解决 LCD 驱动和网络驱动的问题。

3. 添加开发板默认配置文件

首先是**「创建自己开发板的配置文件」**,该文件可参考原厂开发板的配置文件,在configs文件夹下,将原来的默认配置文件mx6ull_14x14_evk_emmc_defconfig复制一份,并重命名为mx6ull_myboard_defconfig,该文件即用于作为自己开发板的配置文件。

cd configs
cp mx6ull_14x14_evk_emmc_defconfig mx6ull_myboard_defconfig

然后将文件 mx6ull_myboard_defconfig 中的内容改成下面的:

CONFIG_SYS_EXTRA_OPTIONS="IMX_CONFIG=board/freescale/mx6ull_myboard/imximage.cfg,MX6ULL_MYBOARD_EMMC_REWORK"
CONFIG_ARM=y
CONFIG_ARCH_MX6=y
CONFIG_TARGET_MX6ULL_MYBOARD=y
CONFIG_CMD_GPIO=y

4. 添加开发板对应的头文件

在目录 include/configs 下添加自己开发板对应的头文件,复制mx6ullevk.h,并重命名为mx6ull_myboard.h,将文件中的

cp include/configs/mx6ullevk.h include/configs/mx6ull_myboard.h
vi include/configs/mx6ull_myboard.h

将文件中的

#ifndef __MX6ULLEVK_CONFIG_H
#define __MX6ULLEVK_CONFIG_H

修改为:

#ifndef __MX6ULL_MYBOARD_CONFIG_H
#define __MX6ULL_MYBOARD_CONFIG_H

该文件里面有很多宏定义,这些宏定义基本用于配置uboot,如果我们自己要想使能或者禁止uboot的某些功能,那就要在这里面修改。

5. 添加开发板对应的板级文件夹

boot中每个板子都有一个对应的文件夹来存放板级文件(如开发板上外设驱动文件等)。NXP的I.MX系列芯片的所有板级文件夹都存放在 board/freescale/目录下,在这个目录下有个名为mx6ullevk的文件夹,原厂开发板的板级文件夹。

复制 mx6ullevk,将其重命名为mx6ull_myboard,进入mx6ull_myboard目录中, 将其中的mx6ullevk.c文件重命名为mx6ull_myboard.c

cd board/freescale/
cp mx6ullevk/ -r mx6ull_myboard
cd mx6ull_myboard
mv mx6ullevk.c mx6ull_myboard.c

还需要对 mx6ull_myboard 目录下的文件做一些修改:

5.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 $< $@

其中的依赖项修改为:

# (C) Copyright 2015 Freescale Semiconductor, Inc.
#
# SPDX-License-Identifier:	GPL-2.0+
#

obj-y  := mx6ull_myboard.o

extra-$(CONFIG_USE_PLUGIN) :=  plugin.bin
$(obj)/plugin.bin: $(obj)/plugin.o
	$(OBJCOPY) -O binary --gap-fill 0xff $< $@

这样才会编译mx6ull_myboard.c这个文件

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

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

修改为:

if TARGET_MX6ULL_MYBOARD

config SYS_BOARD
	default "mx6ull_myboard"

config SYS_VENDOR
	default "freescale"

config SYS_CONFIG_NAME
	default "mx6ull_myboard"

endif

5.4 修改MAINTAINERS文件

再接着修改 board/freescale/mx6ull_myboard 目录下的MAINTAINERS文件

将原始内容:

MX6ULLEVK BOARD
M:	Peng Fan 
S:	Maintained
F:	board/freescale/mx6ullevk/
F:	include/configs/mx6ullevk.h
F:	configs/mx6ull_14x14_evk_defconfig
F:	configs/mx6ull_9x9_evk_defconfig

修改为:

MX6ULLEVK BOARD
M:	Peng Fan 
S:	Maintained
F:	board/freescale/mx6ull_myboard/
F:	include/configs/mx6ull_myboard.h
F:	configs/mx6ull_myboard_defconfig

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

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

在207行插入一些内容:

config TARGET_MX6ULL_MYBOARD
        bool "Support mx6ull_myboard"
        select MX6ULL
        select DM
        select DM_THERMAL

然后,在最后一行的endif的前一行添加如下内容:

source"board/freescale/mx6ull_myboard/Kconfig"

添加完成以后的 Kconfig 文件如图

U-Boot移植 (1)- uboot添加自己的开发板_第6张图片

7. 创建编译脚本

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

在uboot-imx-rel_imx_4.1.15_2.1.0_ga目录下新建一个名为build_myboard.sh的 shell 脚本,写入如下内容:

#!/bin/bash
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原厂开发板相关的配置文件,重新复制了一份,并对板子名称修改为了自己板子的名字。

chmod 777 build_myboard.sh.sh //给予可执行权限,一次即可
./build_myboard.sh.sh //运行脚本编译 uboot

此时执行./build_myboard.sh,等待编译完成后输入如下命令:

U-Boot移植 (1)- uboot添加自己的开发板_第7张图片

如果有很多文件都引用了mx6ull_alientek_emmc.h这个头文件,那就说明新板子添加成功

编译完成以后就使用 imxdownload 将新编译出来的 u-boot.bin 烧写到 SD 卡中测试



U-Boot 2016.03 (Jun 24 2023 - 22:32:08 +0800)

CPU:   Freescale i.MX6ULL rev1.1 69 MHz (running at 396 MHz)
CPU:   Industrial temperature grade (-40C to 105C) at 32C
Reset cause: POR
Board: MX6ULL 14x14 EVK
I2C:   ready
DRAM:  512 MiB
MMC:   FSL_SDHC: 0, FSL_SDHC: 1
*** Warning - bad CRC, using default environment

Display: TFT43AB (480x272)
Video: 480x272x24
In:    serial
Out:   serial
Err:   serial
switch to partitions #0, OK
mmc0 is current device
Net:   Board Net Initialization Failed
No ethernet found.
Normal Boot
Hit any key to stop autoboot:  0
=>

将uboot进行编译并运行,实际的效果应该和原厂uboot的效果一样(LCD无法显示)。

「总结一下刚才都有哪些修改」:

右端灰色的为原厂开发板的相关文件,黄色的为模仿原厂文件,新添加并修改的自己开发板的文件。

U-Boot移植 (1)- uboot添加自己的开发板_第8张图片

你可能感兴趣的:(linux系统移植,linux)