一. 简介
前面学习了 uboot的移植,在 NXP的 Kernel内核源码里添加 ALPHA开发板的工作。本文为设置CPU主频做准备,开发板从 Nand-Flash中启动根文件系统。
具体来说,我的目的是开发板能正常启动(从Nand-Flash加载根文件系统)。
二. APLHA开发板系统启动
1. 开发板启动文件
uboot: 添加过ALPHA开发板的NXP官方 uboot
zImage(kernel镜像):添加过ALPHA开发板的 NXP官方 kernel
设备树文件(.dtb):添加过ALPHA开发板的 NXP官方kernel内部,设备树文件
根文件系统:正点原子提供的 文件系统。
MFG烧录工具: 正点原子提供的 MFG烧录工具
2. APLHA开发板系统启动
(1) 首先,通过 MFG-Tool工具烧录文件到 Nand-Flash中。
这里使用正点原子提供的 MFG-Tool工具,将添加了ALPHA开发板的 u-boot.imx复制到 MFG-Tool工具 mfgtool/Profiles/Linux/OS Firmware/files/boot 目录下,并重命名为 如下的文件名:
因为我使用的是 Nand-Flash开发板,DDR是 256MB,所以,我这里将编译后的 (经过移植的NXP官方的 uboot)u-boot.imx拷贝到该目录下后,重命名为 u-boot-imx6ull-14x14-ddr256-nand.imx。
更新好 uboot文件后,开始烧录开发板。开发板拨码开关拨到 usb启动,开发板上电。打开如下文件开始烧录:
(2) 其次,设置从tftp 服务下载 zImage与设备树文件(.dtb文件)到开发板,设置从 Nand-Flash启动 根文件系统。具体就是设置 bootcmd 与 bootargs参数。
开发板烧录完成后,断电。开发板开发板拨码开关拨到 nand-Flash启动,上电,按下 "Enter"回车键进入uboot命令模式。
首先,保证 开发板可以 ping通 ubuntu。具体是:开发板设置网络相关的一系列地址,tftp服务可以使用。设置网络相关地址包括如下:
setenv ipaddr 192.168.1.50
setenv ethaddr b8:ae:1d:01:00:00
setenv gatewayip 192.168.1.1
setenv netmask 255.255.255.0
setenv serverip 192.168.1.66
uboot命令模式下设置完上面的ip 地址后,也需要保存,保存命令如下:
=> saveenv
设置环境变量 bootcmd,操作如下:
=> setenv bootcmd 'tftp 0x80800000 zImage;tftp 0x83000000 imx6ull-alientek-nand.dtb;bootz 0x80800000 - 0x83000000;'
=> saveenv
Saving Environment to NAND...
Erasing NAND...
Erasing at 0x3c00000 -- 100% complete.
Writing to NAND... OK
=>
**环境变量 bootcmd设置后,开发板重新上电后,就会通过 tftp服务从ubuntu系统加载 zImage和 imx6ull-alientek-nand.h(即设备树文件),并启动。**这里可以进行测试。
注意:这里需要保证 ubuntu虚拟机已经开启!!!
设置 环境变量 bootargs,操作如下:
=> setenv bootargs 'console=ttymxc0,115200 ubi.mtd=5 root=ubi0:rootfs rootfstype=ubifs mtdparts=gpmi-nand:4m(u-boot),128k(env),1m(logo),1m(dtb),8m(kernel),-(rootfs)'
=> saveenv
Saving Environment to NAND...
Erasing NAND...
Erasing at 0x3c00000 -- 100% complete.
Writing to NAND... OK
可以看出,bootargs设置的是与开发板交互的串口:ttymxc0,波特率为 115200。
ubi.mtd=5表示:根文件系统存放在nand-flash的第 5个分区。
mtdparts=gpmi-nand:4m(u-boot),128k(env),1m(logo),1m(dtb),8m(kernel),-(rootfs)
表示uboot,环境变量,logo,dtb设备树文件,内核镜像,根文件系统存在 nand-Flash中的大小。
注意:这里的 uboot,环境变量,logo,dtb设备树文件,内核镜像,根文件系统的分区大小草考的是:正点原子出厂uboot源码的nand-Flash分区分配大小(参考 uboot根目录下/include/configs/mx6ullevk.h中 Nand-Flash部分,开发文档中也有说明过)。
最后,确认bootcmd与 bootargs环境变量是否设置成功:
=> printenv
baudrate=115200
board_name=EVK
board_rev=14X14
bootargs=console=ttymxc0,115200 ubi.mtd=5 root=ubi0:rootfs rootfstype=ubifs mtdparts=gpmi-nand:4m(u-boot),128k(env),1m(logo),1m(dtb),8m(kernel),-(rootfs)
bootcmd=tftp 0x80800000 zImage;tftp 0x83000000 imx6ull-alientek-nand.dtb;bootz 0x80800000 - 0x83000000;
bootcmd_mfg=run mfgtool_args;bootz ${loadaddr} ${initrd_addr} ${fdt_addr};
bootdelay=3
..........................
serverip=192.168.1.66
Environment size: 1064/131068 bytes
(3) 最后,开发板重新上电启动。保证开发板能成功从 Nand-Flash启动根文件系统。
开发板重新上电,如下:
=> reset
resetting ...U-Boot 2016.03 (Nov 03 2023 - 02:32:33 +0800)
CPU: Freescale i.MX6ULL rev1.1 69 MHz (running at 396 MHz)
CPU: Industrial temperature grade (-40C to 105C) at 52C
Reset cause: WDOG
Board: MX6ULL ALIENTEK NAND
I2C: ready
DRAM: 256 MiB
NAND: 512 MiB.......................................
* starting FTP Server: vsftpd... done.
Starting crond: fec 20b4000.ethernet eth0: Link is Up - 100Mbps/Full - flow control rx/tx
IPv6: ADDRCONF(NETDEV_CHANGE): eth0: link becomes ready
OK
Starting nginx: nginx.
Running local boot scripts (/etc/rc.local).root@ATK-IMX6U:~# icm20608: version magic '4.1.15-g19f085b-dirty SMP preempt mod_unload modversions ARMv7 p2v8 ' should be '4.1.15 SMP preempt mod_unload modversions ARMv6 p2v8 '
root@ATK-IMX6U:~#
root@ATK-IMX6U:~#
可以看出,开发板重新上电后,最后按下 "Enter"回车键,出现可以输入命令,即出现了# 符号,即说明开发板已经成功从 nand-Flash中启动。