NXP原厂的uboot,直接烧录到我的开发板中,LCD的驱动是不正常的,需要进行修改。「使得uboot能匹配我们自己的开发板」。
修改uboot以匹配开发板的方式有两种,一种是在NXP原厂开发板 「i.MX 6ULL EVK」 的文件上进行修改,另一种仿造NXP的开发板文件,添加自己的开发板文件。为了能更多的了解uboot,使用代码改动较大的第二种方式进行uboot的移植。
在修改uboot之前,先来看一下uboot的源码结构。
uboot的源码如下,这里是源码编译后的结果,包含编译后的文件。
这里文件的含义如下:
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 的复制文件。
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
使用 imxdownload
软件将 u-boot.bin
烧写到 SD 卡中,启动开发板
可以看出, uboot 启动正常,虽然我们用的是 NXP 官方 I.MX6ULL 开发板的uboot,但是在正点原子的 I.MX6ULL 开发板上是可以正常启动的。而且 DRAM 识别正确,为512MB
检查一下 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 驱动也成功
如果 uboot 中的 LCD 驱动正确的话,启动 uboot 以后 LCD 上应该会显示出 NXP 的 logo
如果用的不是正点原子的 4.3 寸 480x272 分辨率的屏幕的话,那么 LCD 就不会显示 logo 界面。因为 NXP 官方 I.MX6ULL 开发板的屏幕就是 4.3 寸 480x272 分辨率的
所以 uboot 默认 LCD 驱动是 4.3 寸 480x272 分辨率的。如果使用其他分辨率的 LCD 就需要修改 LCD 驱动,uboot 的 LCD 需要修改就行了。
uboot 启动的时候提示“Board Net Initialization Failed”和“No ethernet found.”这两行,说明网络驱动也有问题
说明当前 uboot 的网络部驱动也是有问题的,这是因为正点原子开发板的网络芯片复位引脚和 NXP 官方开发板不一样,因此需要修改驱动。
总结一下 NXP 官方 I.MX6ULL EVK 开发板的 uboot 在正点原子 EMMC 版本 I.MX6ULL开发板上的运行情况:
①、 uboot 启动正常, DRAM 识别正确, SD 卡和 EMMC 驱动正常。
②、 uboot 里面的 LCD 驱动默认是给 4.3 寸 480x272 分辨率的,如果使用的其他分辨率的屏幕需要修改驱动。
③、网络不能工作,识别不出来网络信息,需要修改驱动。
接下来我们要做的工作如下:
①、前面我们一直使用着 NXP 官方开发板的 uboot 配置,接下来需要在 uboot 中添加我们自己的开发板,也就是正点原子的 I.MX6ULL 开发板。
②、解决 LCD 驱动和网络驱动的问题。
首先是**「创建自己开发板的配置文件」**,该文件可参考原厂开发板的配置文件,在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
在目录 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的某些功能,那就要在这里面修改。
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
目录下的文件做一些修改:
首先是修改 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
这个文件
然后修改 board/freescale/mx6ull_myboard 目录下的imximage.cfg
文件
将imximage.cfg
中的下面一句:
PLUGIN board/freescale/mx6ullevk/plugin.bin 0x00907000
改为:
PLUGIN board/freescale/mx6ull_myboard/plugin.bin 0x00907000
接着修改 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
再接着修改 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
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 文件如图
使用新添加的板子配置编译 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
,等待编译完成后输入如下命令:
如果有很多文件都引用了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无法显示)。
「总结一下刚才都有哪些修改」:
右端灰色的为原厂开发板的相关文件,黄色的为模仿原厂文件,新添加并修改的自己开发板的文件。