先编译体验一下正点原子提供的UBOOT。
首先在Ubuntu 中安装ncurses 库,否则编译会报错,安装命令如下:
sudo apt-get install libncurses5-dev
在Ubuntu 中创建存放uboot 的目录,比如我的/home/$USER/linux/uboot,然后在此目录下新建一个名为“alientek_uboot”的文件夹用于存放正点原子提供的uboot 源码。alientek_uboot文件夹创建成功以后使用FileZilla 软件将正点原子提供的uboot 源码拷贝到此目录中。
正点原子提供的uboot 源码已经放到了开发板光盘中,路径为:开发板光盘->1、例程源码->3、正点原
子Uboot 和Linux 出厂源码-> uboot-imx-2016.03-2.1.0-ge468cdc-v1.5.tar.bz2。将其拷贝到Ubuntu中新建的alientek_uboot 文件夹下,完成以后如图30.2.1 所示:
使用如下命令对其进行解压缩:
tar -vxjf uboot-imx-2016.03-2.1.0-g8b546e4.tar.bz2
解压完成以后alientek_uboot 文件夹内容如图30.2.2 所示:
上图中除了uboot-imx-2016.03-2.1.0-g8b546e4.tar.bz2 这个正点原子提供的uboot 源码压缩包以外,其他的文件和文件夹都是解压出来的uboot 源码。可以发现有Makefile,不过不能直接进行编译,需要先进行配置(因为Makefile是通用的,板子不一样)。
1、512MB(DDR3)+8GB(EMMC)核心板
如果使用的是512MB+8GB 的EMMC 核心板,使用如下命令来编译对应的uboot:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- (加空格)
mx6ull_14x14_ddr512_emmc_defconfig
make V=1 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j12
可以看出,编译完成以后uboot 源码多了一些文件,其中u-boot.bin 就是编译出来的uboot二进制文件。uboot 是个裸机程序,因此需要在其前面加上头部(IVT、DCD 等数据)才能在I.MX6U上执行【联想到前面裸机学习的,I.MX 6ULL中内部BOOT ROM初始化DDR,然后将.bin文件加载到RAM里面运行,这里就是u-boot.bin(需要加头部),然后运行的u-boot程序去引导操作系统运行】,图30.2.4 中的u-boot.imx 文件就是添加头部以后的u-boot.bin,u-boot.imx 就是我们最终要烧写到开发板中的uboot 镜像文件。
【为了方便,引入shell脚本。其实把Makefile文件进行适当修改,也可以减少输入很多字母,参考上面笔记的第四点,实际操作如下:】
然后编译的时候只要在命令行输入以下命令即可(交叉编译工具变量直接替换了):
每次编译uboot 都要输入一长串命令,为了简单起见,我们可以新建一个shell 脚本文件,将这些命令写到shell 脚本文件里面,然后每次只需要执行shell 脚本即可完成编译工作。新建名为mx6ull_alientek_emmc.sh 的shell 脚本文件,然后在里面输入如下内容:
1 #!/bin/bash
2 make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
3 make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- (加空格) mx6ull_14x14_ddr512_emmc_defconfig
4 make V=1 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j12
第1 行是shell 脚本要求的,必须是“#!/bin/bash”或者“#!/bin/sh”。
第2 行使用了make 命令,用于清理工程,也就是每次在编译uboot 之前都清理一下工程。这里的make 命令带有三个参数,第一个是ARCH,也就是指定架构,这里肯定是arm;第二个参数CROSS_COMPILE 用于指定编译器,只需要指明编译器前缀就行了,比如arm-linux-gnueabihf-gcc 编译器的前缀就是“arm-linux-gnueabihf-”;最后一个参数distclean 就是清除工程。
第3 行也使用了make 命令,用于配置uboot。同样有三个参数,不同的是,最后一个参数是mx6ull_14x14_ddr512_emmc_defconfig。前面说了uboot 是bootloader 的一种,可以用来引导Linux,但是uboot 除了引导Linux 以外还可以引导其它的系统,而且uboot 还支持其它的架构和外设,比如USB、网络、SD 卡等。这些都是可以配置的,需要什么功能就使能什么功能。所
以在编译uboot 之前,一定要根据自己的需求配置uboot。mx6ull_14x14_ddr512_emmc_defconfig就是正点原子针对I.MX6U-ALPHA 的EMMC 核心板编写的配置文件,这个配置文件在uboot源码的configs 目录中。在uboot 中,通过“make xxx_defconfig”来配置uboot,xxx_defconfig
就是不同板子的配置文件,这些配置文件都在uboot/configs 目录中。
第4 行有4 个参数,用于编译uboot,通过第3 行配置好uboot 以后就可以直接“make”编译uboot 了。其中V=1 用于设置编译过程的信息输出级别;-j 用于设置主机使用多少线程编译uboot,最好设置成我们虚拟机所设置的核心数,如果在VMware 里面给虚拟就分配了4 个核,那么使用-j4 是最合适的,这样4 个核都会一起编译。使用chmod 命令给予mx6ull_alientek_emmc.sh 文件可执行权限,然后就可以使用这个shell脚本文件来重新编译uboot,命令如下:
./mx6ull_alientek_emmc.sh
2、256MB(DDR3)+ 512MB(NAND)核心板
如果用的256MB+512MB 的NAND 核心板,新建名为x6ull_alientek_nand.sh 的shell 脚本文件,然后在里面输入如下内容:
1 #!/bin/bash
2 make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
3 make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- (加空格) mx6ull_14x14_ddr256_nand_defconfig
4 make V=1 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j12
完成以后同样使用chmod 指令给予mx6ull_alientek_nand.sh 可执行权限,然后输入如下命令即可编译NAND 版本的uboot:
./mx6ull_alientek_nand.sh
mx6ull_alientek_nand.sh 和mx6ull_alientek_emmc.sh 类似,只是uboot 配置文件不同,这里就不详细介绍了。
视频里老师先是演示了简单方便的OTG方式(参照上面笔记的第二点,给.bin添加头使用的也是另一种方式),烧写到EMMC里的。
后面我们还是使用imxdownload 软件进行烧写,就像裸机开发一样。因为使用OTG方式不仅把U_boot,还有系统镜像zimage、设备树、根文件系统全部重新烧进去,很费时间,我们只是想更新一个u-boot而已。
uboot 编译好以后就可以烧写到板子上使用了,这里我们跟前面裸机例程一样,将uboot烧写到SD 卡中,然后通过SD 卡来启动来运行uboot。使用imxdownload 软件烧写,命令如下:
chmod 777 imxdownload //给予imxdownload 可执行权限,一次即可
./imxdownload u-boot.bin /dev/sdd //烧写到SD 卡,不能烧写到/dev/sda 或sda1 设备里面!
等待烧写完成,完成以后将SD 卡插到I.MX6U-ALPHA 开发板上,BOOT 设置从SD 卡启动,使用USB 线将USB_TTL 和电脑连接,也就是将开发板的串口1 连接到电脑上。打开MobaXterm,设置好串口参数并打开,最后复位开发板。在MobaXterm 上出现“Hit any key to stop autoboot: ”倒计时的时候按下键盘上的回车键,默认是3 秒倒计时,在3 秒倒计时结束以后如果没有按下回车键的话uboot 就会使用默认参数来启动Linux 内核了。如果在3 秒倒计时结束之前按下回车键,那么就会进入uboot 的命令行模式,如图30.3.1 所示:
从图30.3.1 可以看出,当进入到uboot 的命令行模式以后,左侧会出现一个“=>”标志。uboot 启动的时候会输出一些信息,这些信息如下所示:
U-Boot 2016.03-gd3f0479 (Aug 07 2020 - 20:47:37 +0800)
CPU: Freescale i.MX6ULL rev1.1 792 MHz (running at 396 MHz)
CPU: Industrial temperature grade (-40C to 105C) at 51C
Reset cause: POR
Board: I.MX6U ALPHA|MINI
I2C: ready
DRAM: 512 MiB
MMC: FSL_SDHC: 0, FSL_SDHC: 1
Display: ATK-LCD-7-1024x600 (1024x600)
Video: 1024x600x24
In: serial
Out: serial
Err: serial
switch to partitions #0, OK
mmc1(part 0) is current device
Net: FEC1
Error: FEC1 address not set.
Normal Boot
Hit any key to stop autoboot: 0
=>
第1 行是uboot 版本号和编译时间,可以看出,当前的uboot 版本号是2016.03,编译时间是2020 年8 月7 日凌晨20 点47 分。
第3 和第4 行是CPU 信息,可以看出当前使用的CPU 是飞思卡尔的I.MX6ULL(I.MX 以前属于飞思卡尔,然而飞思卡尔被NXP 收购了),频率为792MHz,但是此时运行在396MHz。这颗芯片是工业级的,结温为-40°C~105°C。
第5 行是复位原因,当前的复位原因是POR。I.MX6ULL 芯片上有个POR_B 引脚,将这个引脚拉低即可复位I.MX6ULL。
第6 行是板子名字,当前的板子名字为“I.MX6U ALPHA|MINI”。
第7 行提示I2C 准备就绪。
第8 行提示当前板子的DRAM(内存)为512MB,如果是NAND 版本的话内存为256MB。
第9 行提示当前有两个MMC/SD 卡控制器:FSL_SDHC(0)和FSL_SDHC(1)。I.MX6ULL支持两个MMC/SD,正点原子的I.MX6ULL EMMC 核心板上FSL_SDHC(0)接的SD(TF)卡,FSL_SDHC(1)接的EMMC(MMC表示EMMC或者SD卡)。
第10 和第11 行是LCD 型号,当前的LCD 型号是ATK-LCD-7-1024x600 (1024x600),分辨率为1024x600,格式为RGB888(24 位)。
第12~14 是标准输入、标准输出和标准错误所使用的终端,这里都使用串口(serial)作为终端。
第15 和16 行是切换到emmc 的第0 个分区上,因为当前的uboot 是emmc 版本的,也就是从emmc 启动的。我们只是为了方便将其烧写到了SD 卡上,但是它的“内心”还是EMMC的。所以uboot 启动以后会将emmc 作为默认存储器,当然了,你也可以将SD 卡作为uboot 的存储器,这个我们后面会讲解怎么做。
第17 行是网口信息,提示我们当前使用的FEC1 这个网口,I.MX6ULL 支持两个网口。
第18 行提示FEC1 网卡地址没有设置,后面我们会讲解如何在uboot 里面设置网卡地址。
第20 行提示正常启动,也就是说uboot 要从emmc 里面读取环境变量和参数信息启动Linux内核了。
第21 行是倒计时提示,默认倒计时3 秒,倒计时结束之前按下回车键就会进入Linux 命令行模式。如果在倒计时结束以后没有按下回车键,那么Linux 内核就会启动,Linux 内核一旦启动,uboot 就会寿终正寝。这个就是uboot 默认输出信息的含义,NAND 版本的uboot 也是类似的,只是NAND 版本
的就没有EMMC/SD 相关信息了,取而代之的就是NAND 的信息,比如NAND 容量大小信息。
uboot 是来干活的,我们现在已经进入uboot 的命令行模式了,进入命令行模式以后就可以给uboot 发号施令了。当然了,不能随便发号施令,得看看uboot 支持哪些命令,然后使用这些uboot 所支持的命令来做一些工作。下一节就讲解uboot 命令的使用。