在进行Linux驱动开发之前需要先将Linux系统移植到开发板上。
如果学习过UCOS/FreeRTOS应该知道,UCOS/FreeRTOS移植就是在官方的SDK包里面找一个和自己所使用的芯片一样的工程编译一下,然后下载到开发板就可以了。
但是Linux的移植要复杂的多,在移植Linux之前需要先移植一个bootloader代码,这个bootloader代码用于启动Linux内核,bootloader有很多,常用的就是U-Boot。
移植好U-Boot以后再移植Linux内核,移植完Linux内核以后还不能正常启动,还需要再移植一个根文件系统(rootfs),根文件系统里面包含了一些最常用的命令和文件。
所以U-Boot、Linux kernel和rootfs构成了一个完整的Linux系统。
U-Boot简介
Linux系统要启动就必须需要一个bootloader程序,也就是说芯片上电以后先运行一段bootloader程序。
这段bootloader程序会先初始化DDR外设,然后将Linux内核从flash(NAND,NORA FLASH,SD,MMC等)拷贝到DDR中,最后启动Linux内核。
bootloader实际工作要求复杂得多,但它最主要的工作就是启动Linux内核,bootloader和Linux内核的关系就像PC上的BIOS和Windows一样。
U-Boot全称Universal Boot Loader,是一个遵循GPL协议的开源软件,uboot是一个裸机代码,可以看作是一个裸机综合例程。现在的uboot已经支持液晶屏、网络、USB等高级功能。
uboot 官网为 http://www.denx.de/wiki/U-Boot/
U-Boot初次编译
创建目录新建一个个名为“alientek_uboot”的文件夹用于存放正点原子提供的 uboot 源码。alientek_uboot文件夹创建成功以后使用 FileZilla 软件将正点原子提供的 uboot 源码拷贝到此目录中。
使用命令对其进行解压缩
tar -vxjf uboot-imx-2016.03-2.1.0-g8b546e4.tar.bz2
如果使用的是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
- ARCH=arm设置目标为arm架构,CROSS_COMPILE指定使用的交叉编译器
- 第一条命令相当于make distclean,目的是清除工程,在第一次编译的时候最好清理一下工程。
- 第二条指令相当于make mx6ull_14x14_ddr512_emmc_defconfig,用于配置uboot,配置文件为mx6ull_14x14_ddr512_emmc_defconfig。
- 最后一条指令相当于“make -j12”,使用12核来编译。
编译完成以后uboot源码多了一些文件,u-boot.bin就是编译出来的uboot二进制文件。uboot是个裸机程序,因此需要在其前面加上头部(IVT、DCD等数据)才能在I.MX6U上执行,u-boot.imx就是添加头部以后的u-boot.bin,u-boot.imx就是我们最终要烧写到开发板中的uboot镜像文件。
每次编译 uboot 都要输入一长串命令,为了简单起见,我们可以新建一个 shell 脚本文件,将这些命令写到 shell 脚本文件里面,然后每次只需要执行 shell 脚本即可完成编译工作。
U-Boot命令使用
进入 uboot 的命令行模式以后输入“help”或者“?”,然后按下回车即可查看当前 uboot 所支持的命令。
输入“help(或?) 命令名”既可以查看命令的详细用法
以bootz为例,查看booz命令的用法
? bootz 或 help bootz