linux系列目录:
linux系统移植篇(二)—— Uboot使用介绍
Uboot专题(一)—— 移植NXP官方Uboot(2016.03版本)
uboot 移植的一般流程:
①、在 uboot 中找到参考的开发平台,一般是原厂的开发板。
②、参考原厂开发板移植 uboot 到我们所使用的开发板上。
NXP官方uboot仓库地址为:https://source.codeaurora.org/external/imx/uboot-imx官方使用的Uboot为2016.03的版本。
这里直接使用正点原子下载好的NXP官方Uboot:uboot-imx-rel_imx_4.1.15_2.1.0_ga.tar.bz2。将Uboot压缩包发送到Ubuntu虚拟机,并解压:
tar -vxjf uboot-imx-rel_imx_4.1.15_2.1.0_ga.tar.bz2
。
export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabihf-
make distclean
make mx6ull_14x14_evk_emmc_defconfig
4.配置好之后编译:
make
编译出的文件:
执行以下烧录命令,将 u-boot-dtb.imx 烧写到/dev/sdb 中
sudo dd iflag=dsync oflag=dsync if=u-boot.imx of=/dev/sdb seek=2
烧录成功提示:
2. 驱动测试
插入SD卡,启动:
(1)Uboot版本:2016.03,编译时间2022年5月3日21点41分33秒
(2)uboot正确识别到DDR,大小为512MB;
(3)SD 卡和 EMMC 驱动检查,SD卡大小8GB,正常,EMMC大小为8GB,正常。
(4)LCD显示设备检查
uboot打印日志中提示LCD显示设备是Display: TFT43AB (480x272),这里我实际连接的是野火5寸RGB屏幕,不匹配,所以LCD显示不正常。
(5)网络设备检查
野火使用的 PHY 芯片与NXP 官方的I.MX6ULL EVK 开发板使用的 KSZ8081 芯片一样,所以网卡驱动部分不需要修改。
接下来,我们就基于NXP官方提供的uboot,针对野火imx6ull开发板进行一些配置参数的修改,修复LCD和网络问题。
cd board/freescale
cp -rf mx6ullevk/ mx6ullfire
进入新建的目录,进行修改文件,重命名c文件:
mv mx6ullevk.c mx6ullfire.c
修改Makefile:
obj-y := mx6ullfire.o
if TARGET_MX6ULL_FIRE
config SYS_BOARD
default "mx6ullfire"
config SYS_VENDOR
default "freescale"
config SYS_CONFIG_NAME
default "mx6ullfire"
endif
修改imximage.cfg 文件
PLUGIN board/freescale/mx6ullfire/plugin.bin 0x00907000
修改MAINTAINERS .cfg 文件
MX6ULLEVK BOARD
M: Peng Fan <[email protected]>
S: Maintained
F: board/freescale/mx6ullfire/
F: include/configs/mx6ullfire.h
F: configs/mx6ull_fire_emmc_defconfig
cp mx6ull_14x14_evk_emmc_defconfig mx6ull_fire_emmc_defconfig
修改该文件中的下面两行内容:
CONFIG_SYS_EXTRA_OPTIONS="IMX_CONFIG=board/freescale/mx6ullfire/imximage.cfg,MX6ULL_EVK_EMMC_REWORK"
CONFIG_TARGET_MX6ULL_FIRE=y
cp include/configs/mx6ullevk.h mx6ullfire.h
拷贝完成以后将:
#ifndef __MX6ULLEVK_CONFIG_H
#define __MX6ULLEVK_CONFIG_H
改为:
#ifndef __MX6ULLFIRE_CONFIG_H
#define __MX6ULLFIRE_CONFIG_H
mx6ullfire.h 里面有很多宏定义,这些宏定义基本用于配置 uboot,也有一些I.MX6ULL 的配置项目。如果我们自己要想使能或者禁止 uboot 的某些功能,那就在
mx6ullfire.h 里面做修改即可。mx6ullfire主要功能就是配置或者裁剪 uboot。
config TARGET_MX6ULL_FIRE
bool "Support mx6ullfire"
select MX6ULL
select DM
select DM_THERMAL
在末尾处添加:
source "board/freescale/mx6ullfire/Kconfig"
至此,添加一个新的单板到uboot中完成,编译测试:
make distclean
make mx6ull_fire_emmc_defconfig
make
一般 uboot 中修改驱动基本都是在 xxx.h 和 xxx.c 这两个文件中进行的, xxx 为板子名称,比如 mx6ullfire.h 和 mx6ullfire.c 这两个文件。
一般修改 LCD 驱动重点注意以下几点:
①、 LCD 所使用的 GPIO,查看 uboot 中 LCD 的 IO 配置是否正确。
②、 LCD 背光引脚 GPIO 的配置。
③、 LCD 配置参数是否正确。
我的开发板使用的是野火的5.0 寸 800x480RGB 电容触摸屏,LCD引脚配置与NXP官方一致,只需要配置参数即可:
.mode = {
.name = "TFT800x480",
.xres = 800,
.yres = 480,
.pixclock = 37037,
.left_margin = 46,
.right_margin = 20,
.upper_margin = 22,
.lower_margin = 22,
.hsync_len = 1,
.vsync_len = 1,
.sync = 0,
.vmode = FB_VMODE_NONINTERLACED
然后在include/configs/mx6ullfire.h文件中,修改uboot默认环境变量设置:
"panel=TFT800x480\0" \
解决方法:
/*
* disable MMU stuff and caches
*/
mrc p15, 0, r0, c1, c0, 0
bic r0, r0, #0x00002000 @ clear bits 13 (--V-)
bic r0, r0, #0x00000007 @ clear bits 2:0 (-CAM)
orr r0, r0, #0x00000002 @ set bit 1 (--A-) Align
orr r0, r0, #0x00000800 @ set bit 11 (Z---) BTB
修改为:
/*
* disable MMU stuff and caches
*/
mrc p15, 0, r0, c1, c0, 0
bic r0, r0, #0x00002000 @ clear bits 13 (--V-)
bic r0, r0, #0x00000007 @ clear bits 2:0 (-CAM)
orr r0, r0, #0x00000000 @ set bit 1 (--A-) Align
orr r0, r0, #0x00000800 @ set bit 11 (Z---) BTB
在《ARM ArchitectureReference Manual ARMv7-A and ARMv7-R edition.pdf》手册中有如下介绍,只需将CP15 SCTLR寄存器bit[1]位置0即可关闭地址对齐检查功能。
修复后,重新烧录:
网络命令可以正常使用。
uboot 移植到此结束,简单总结一下 uboot 移植的过程:
①、不管是购买的开发板还是自己做的开发板,基本都是参考半导体厂商的 dmeo 板,而半导体厂商会在他们自己的开发板上移植好 uboot、 linux kernel 和 rootfs 等,最终制作好 BSP包提供给用户。我们可以在官方提供的 BSP 包的基础上添加我们的板子,也就是俗称的移植。
②、我们购买的开发板或者自己做的板子一般都不会原封不动的照抄半导体厂商的 demo板,都会根据实际的情况来做修改,既然有修改就必然涉及到 uboot 下驱动的移植。
③、一般 uboot 中需要解决串口、 NAND、 EMMC 或 SD 卡、网络和 LCD 驱动,因为 uboot的主要目的就是启动 Linux 内核,所以不需要考虑太多的外设驱动。
④、在 uboot 中添加自己的板子信息,根据自己板子的实际情况来修改 uboot 中的驱动。