linux系列目录:
linux系统移植篇(二)—— Uboot使用介绍
Uboot专题(一)—— 移植NXP官方Uboot(2016.03版本)
文章目录
一、编译NXP官方uboot
uboot 移植的一般流程:
①、在 uboot 中找到参考的开发平台,一般是原厂的开发板。
②、参考原厂开发板移植 uboot 到我们所使用的开发板上。
1、获取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
。
2、编译uboot
- 设置临时环境变量
export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabihf-
- 清理构建:
make distclean
- 加载板级配置文件,具体的板级配置文件在 uboot 根目录下的 configs 目录下,选择emmc版本
make mx6ull_14x14_evk_emmc_defconfig
4.配置好之后编译:
make
编译出的文件:
- 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-nodtb.bin的复制文件
3、烧写验证与驱动测试
- 烧录
插上读卡器,使用 lsblk 命令查看磁盘设备,如下所示
执行以下烧录命令,将 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和网络问题。
二、移植uboot
1、新建单板
- 新建单板目录和文件
cd board/freescale
cp -rf mx6ullevk/ mx6ullfire
进入新建的目录,进行修改文件,重命名c文件:
mv mx6ullevk.c mx6ullfire.c
修改Makefile:
obj-y := mx6ullfire.o
修改Kconfig 文件
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 <peng.fan@nxp.com>
S: Maintained
F: board/freescale/mx6ullfire/
F: include/configs/mx6ullfire.h
F: configs/mx6ull_fire_emmc_defconfig
- mx6ullfire.c :里写了一些 uboot 启动代码和我们对板子引脚读取的代码。
- plugin.S :用汇编写的设置 ddr 和时钟,一般不需要更改。
- Makefile :里面修改 C 文件编译后的 o 文件,有多少个就写多少个 o 文件,注意与 c 文件名字相同。
- Kconfig : (目录: board/路径/目标文件夹/Kconfig)。
- imximage.cfg : (目录: board/路径/目标文件夹)(NXP 特有的文件, 只需要修改一处即可, 这是添加头部信息的)
- 添加开发板默认配置文件
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。
- 修改 U-Boot 图形界面配置文件
修改arch/arm/cpu/armv7/mx6/Kconfig文件,仿照其它单板文件,添加:
config TARGET_MX6ULL_FIRE
bool "Support mx6ullfire"
select MX6ULL
select DM
select DM_THERMAL
在末尾处添加:
source "board/freescale/mx6ullfire/Kconfig"
2、新的单板编译测试
至此,添加一个新的单板到uboot中完成,编译测试:
make distclean
make mx6ull_fire_emmc_defconfig
make
烧录测试:
和原厂uboot运行效果一样,新建单板成功。
三、修改适配驱动
一般 uboot 中修改驱动基本都是在 xxx.h 和 xxx.c 这两个文件中进行的, xxx 为板子名称,比如 mx6ullfire.h 和 mx6ullfire.c 这两个文件。
1、修改LCD驱动
一般修改 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" \
重新编译uboot,烧写到SD卡中运行:
2、修复网络命令夯机问题
解决方法:
- 使用低版本编译器arm-linux-gnueabihf-gcc 4.9.4编译器。
- 关闭内存地址对齐错误的检查功能(仅armv7以上内核支持)。修改start.S文件 ,在arch/arm/cpu/armv7/start.S文件中找到以下代码:
/*
* 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 中的驱动。