- linux启动过程
- linux启动过程为:
- 固件(uboot、linux内核、设备树、根文件系统)移植,即将NXP官方固件移植适配到我们的硬件——>移植完成后编译——>首次启动uboot(windows下mfgtool串行下载后从EMMC启动/ubuntu下读卡器 imxdownload 到SD卡后从SD卡启动)——>快速按回车进入命令行设置开发板的linux内核、设备树和根文件系统分别从何处启动——>复位启动——>uboot引导linux内核启动
- uboot有两种启动方式:从EMMC启动、从SD卡启动(串行下载是特殊情况)
- uboot 引导 Linux 内核启动有两种方式:一种是直接从 EMMC 启动内核,一种是从网络启动内核。
- 注意:1、uboot源码是重点,因为它决定了从何处启动哪个zImage,.dtb 和 根文件系统。当然如果你嫌弃重新更改 uboot 源码后重新编译再烧写到开发板太麻烦,你可以直接快速按回车进入 uboot 命令行,直接设置环境变量,使开发板的linux内核、设备树和根文件系统分别从网络启动(当然这就需要ubuntu和开发板能互ping),而不从emmc启动,这也是一种方法。
- 2、正点原子的出厂uboot是从emmc加载内核、设备树和根文件系统,所以这就要求emmc中已经有Linux内核和设备树。
- 正点原子的出厂uboot路径:08、系统镜像->01、出厂系统镜像。
- uboot命令行
- 开发板复位之后,默认倒计时 3 秒,倒计时结束之前按下回车键就会进入 uboot 命令行模式。如果在倒计时结束以后没有按下回车键,那么 Linux 内核就会启动,Linux 内核一旦启动,uboot 就会寿终正寝。
- uboot命令行设置加载何处的内核和设备树、根文件系统
- 前提:确保开发板能够和ubuntu互ping,并且ubuntu已经安装tftp、nfs服务,开发板uboot已经自带tftp、nfs这俩命令。
- uboot启动后会运行环境变量 bootcmd 中的命令 去加载 内核 和 设备树 文件,bootargs 加载根文件系统。
- 调试阶段:
- imx6ull uboot使用tftp加载内核zImage及设备树dtb文件,使用nfs挂载根文件目录。
- tftp加载内核zImage及设备树dtb文件(bootcmd):
-
sudo apt-get install tftp-hpa tftpd-hpa//韦东山只安装了这一个,只对这一个文件进行了修改 sudo apt-get install xinetd//正点原子将两个都安装了,而且对这两个文件都进行了修改
- 然后,在ubuntu上创建 TFTP 服务器工作目录,并打开 TFTP 服务配置文件。
- image.png
- 设置好了ubuntu的tftp文件路径后,uboot命令行就可通过tftpboot命令将tftp目录下的内核和设备树加载到开发板。
- 例如:将 tftpboot 文件夹里面的 zImage 文件下载到开发板 DRAM 的 0X80800000 地址处
-
1、在ubuntu命令行中 cp zImage /home/book/linux/tftpboot/ cd /home/book/linux/tftpboot/ chmod 777 zImage 2、在uboot命令行中 tftp 80800000 zImage//将ubuntu上的zImage加载到DRAM的80800000处 tftp 83000000 imx6ull-alientek-emmc.dtb bootz 80800000 - 83000000 //通过 bootz 命令从内存地址 80800000 启动内核镜像(zImage),- 表示没有指定初始化文件系统(initrd) // 并使用内存地址 83000000 指定的设备树文件(*.dtb)。 或者 2、在uboot命令行中也可将以上3条指令通过setenv设置到环境变量bootcmd中,从而一劳永逸 setenv bootcmd 'tftp 80800000 zImage; tftp 83000000 imx6ull-14x14-emmc-4.3-800x480-c.dtb; bootz 80800000 - 83000000' saveenv
-
- 正点原子的tftp配置方式参考自CSDN:imx6ull uboot使用tftp加载内核zImage及设备树dtb文件-CSDN博客
- nfs挂载根文件目录(bootargs):
- 前提是ubuntu开启nfs服务。
-
env print//查看所有环境变量 setenv bootargs 'console=tty1 console=ttymxc0,115200 root=/dev/nfs nfsroot=192.168.5.11:/home/book/Linux/nfs/rootfs,v3 ip=client-ip:server-ip:gwip:netmask:hostname:device:autoconf:dns0-ip:dns1-ip' setenv bootargs 'console=tty1 console=ttymxc0,115200 root=/dev/nfs nfsroot=192.168.5.11:/home/book/Linux/nfs/rootfs,v3 ip=192.168.5.9:192.168.5.11:192.168.5.1:255.255.255.0::eth0:off' saveenv
- 使用串口
ttymxc0
,波特率为 115200 来输出控制台信息。 - 根文件系统通过 NFS 网络文件系统挂载,根文件系统的ubuntu服务器地址为
192.168.5.11
,目录为/home/book/Linux/nfs/rootfs
,使用 NFS 协议的版本 3(若ubuntu是ubutun18.04 加个v3)。 - 设置开发板的
eth0
的静态 IP 地址。 - 禁用 DHCP,使用静态 IP 配置。
- 参考自CSDN:bootargs设置nfs挂载文件系统_bootargs nfs-CSDN博客
- 产品生产阶段:
- imx6ull uboot从emmc中 加载内核zImage及设备树dtb文件,从emmc的分区2 中加载根文件系统,这个是我们产品最终的启动方式。
- 从emmc的分区1中加载内核zImage及设备树dtb文件(bootcmd):
-
//mmc 1的第1个分区 setenv bootcmd 'fatload mmc 1:1 80800000 zImage; fatload mmc 1:1 83000000 imx6ull-14x14-emmc-4.3-800x480-c.dtb; bootz 80800000 - 83000000' saveenv
- 从emmc的分区2中加载根文件目录(bootargs):
-
setenv bootargs 'console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw' saveenv
- 调试阶段:
- 一些常用的uboot命令
-
设置开发板ip: setenv ipaddr 192.168.5.9 setenv netmask 255.255.255.0 setenv gatewayip 192.168.5.1 setenv serverip 192.168.5.11 saveenv 看开发板的uboot版本和gcc版本(好像不能看uboot的文件名): version 查看板子信息: bdinfo 查看文件系统的磁盘空间剩余使用情况的命令(同时也可以看到物理设备挂载到文件系统的哪个目录上了): df -h // -h 选项则表示以人类可读的格式显示数据(即自动使用适当的单位,如 GB、MB 或 KB) 解除挂载: umount 设备名 或者 umount 挂载路径 一次创建多级目录: mkdir /run/media/mmcblk1p1 -p //-p:这个选项用于确保如果上级目录 /run/media/ 不存在,它会被创建。
- I.MX6ULL支持两个 MMC/SD 卡控制器:FSL_SDHC(0)和 FSL_SDHC(1),正点原子的 I.MX6ULL EMMC 核心板上 FSL_SDHC(0)接的 SD(TF)卡,FSL_SDHC(1)接的 EMMC。
-
1、切换到sd卡的第0分区 => mmc dev 0 0 输出: switch to partitions #0, OK mmc0(part 0) is current device
-
2、切换到emmc 的第0分区 => mmc dev 1 0 输出: switch to partitions #0, OK mmc1(part 0) is current device
-
想看环境变量如何设置的: printenv 通过 mmc list 命令可以列出所有 MMC 设备,包括 eMMC 设备: mmc list ping 192.168.5.11 # ping ubuntu ping 192.168.5.10 # ping windows,需关闭防火墙 查看mmc0即SD卡的分区0中的文件 ls mmc 0:0 查看mmc1即emmc的分区1中的文件,即内核和设备树 ls mmc 1:1 查看mmc1即emmc的分区2中的文件,即根文件系统 ls mmc 1:2 查看 eMMC 分区信息和设备信息 mmc dev 1 1 # 切换当前MMC设备到设备1的分区1,即emmc的分区1 mmc dev 1 # 切换到设备1,即emmc。切换之后方便后续操作,没指定设备时默认操作emmc mmc info # 查看当前切换的设备信息 mmc part # 查看设备的分区信息
- 实际上emmc有三个分区,但 mmc part 打印出来的emmc只有两个分区,那是因为第0个分区没有格式化,所以识别不出来。
- 一个新的SD卡默认只有一个分区,那就是分区0。
- image.png
- Bootloader(uboot)
- 介绍:
- Bootloader 是在操作系统运行之前运行的一段代码,用于引导操作系统。通常每个操作系统都有一组专属的引导加载程序。
U-Boot(Bootloader的一种) 是一个开源的主引导加载程序。开发板上是Linux系统,Ubuntu上也是Linux系统。都需要Bootloader来引导。
- 作用:启动linux内核,以及配置一些外设。
- 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 目录中。
- 存放路径:
- 正点原子提供的 uboot 源码已经放到了开发板光盘中,路径为:开发板光盘->1、例程源码->3、正点原子 Uboot 和 Linux 出厂源码-> uboot-imx-2016.03-2.1.0-ge468cdc-v1.5.tar.bz2。
- uboot、linux内核、设备树、根文件系统移植(将NXP官方固件移植适配到我们的硬件)
- uboot移植
- 参考正点原子手册 【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.81.pdf第860页
- uboot 的移植并不是说我们完完全全的从零开始将 uboot 移植到我们现在所使用的开发板或者开发平台上。这个对于我们来说基本是不可能的,这个工作一般是半导体厂商做的,半导体厂商负责将 uboot 移植到他们的芯片上,因此半导体厂商都会自己做一个开发板,这个开发板就叫做原厂开发板,比如大家学习 STM32的时候听说过的discover 开发板就是ST自己做的。半导体厂商会将 uboot 移植到他们自己的原厂开发板上,测试好以后就会将这个 uboot 发布出去,这就是大家常说的原厂 BSP 包。我们一般做产品的时候就会参考原厂的开发板做硬件,然后在原厂提供的 BSP 包上做修改,将 uboot 或者 linux kernel 移植到我们的硬件上。
- image.png
- NXP 官方的uboot 放到了开发板光盘中,路径为:1、例程源码->4、NXP 官方原版 Uboot 和 Linux->uboot-imx-rel_imx_4.1.15_2.1.0_ga.tar.bz2
- I.MX6U-ALPHA 开发板移植好的 Linux 源码路径:开发板光盘->1、例程源码-> 3、正点原子 Uboot 和 Linux 出厂源码->uboot-imx-2016.03-2.1.0-g0ae7e33-v1.7.tar.bz2
- linux内核移植
- 参考正点原子手册 【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.81.pdf第974页
- image.png
- Linux 内核下载官网为 https://www.kernel.org
- NXP提供的已经移植到NXP官方开发板的 Linux 内核路径为: 开发板光盘->1、例程源码->4、NXP 官方原版 Uboot和Linux-> linux-imx-rel_imx_4.1.15_2.1.0_ga.tar.bz2
- I.MX6U-ALPHA 开发板移植好的 Linux 源码路径:开发板光盘->1、例程源码-> 3、正点原子 Uboot 和 Linux 出厂源码-> linux-imx-4.1.15-2.1.0-g8a006db.tar.bz2
- 根文件系统移植(在ubuntu上构建)
- 参考正点原子手册 【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.81.pdf第1010页
- 根文件系统里面就是一堆的可执行文件和其他文件组成的?难道我们得一个一个的从网上去下载这些文件?显然这是不现实的!那么有没有人或者组织专门干这个事呢?他们负责“收集”这些文件,然后将其打包,像我们这样的开发者可以直接拿来用。答案是有的,它就叫做 BusyBox。
- BusyBox 在ubuntu上构建根文件系统:
- BusyBox 可以在其官网下载到,官网地址为:https://busybox.net/
- 或者直接去路径:1、例程源码->6、BusyBox 源码->busybox-1.29.0.tar.bz2
- 按照正点原子手册构建根文件系统,因为细节很多。
- 移植完成后编译uboot和内核(在ubuntu上编译)
- 这两个都需要编译。配置编译uboot和内核的操作是一样的:(以uboot为例)
- image.png
- 使用make指令时,通常需要指定ARCH、CROSS_COMPILE,例如
-
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
- 韦东山是在设置交叉编译器为环境变量时,就将这两个参数也设置成了环境变量,所以不需要指定也可以。
- 学习 STM32 的时候我们可以直接将编译生成的.bin 文件烧写到 STM32 内部 flash 里面,但是 I.MX6U 不能直接烧写编译生成的.bin 文件,我们需要在.bin 文件前面添加一些头信息构成满足 I.MX6U 需求的最终可烧写文件。
- u-boot.bin 就是编译出来的 uboot二进制文件,是个裸机程序,因此需要在其前面加上头部(IVT、DCD等数据)才能在I.MX6U上执行,u-boot.imx 文件就是添加头部以后的 u-boot.bin,u-boot.imx 就是我们最终要烧写到开发板中的 uboot 镜像文件。
- 烧写uboot并启动uboot
- 开发板uboot启动的方式分为:EMMC/NAND 或者 SD卡 启动,所以需要把uboot烧写到这两个里面之一。
- 注意:串行下载只是在下载的时候才会使用,它是将windows上的uboot直接下载到 DDR 中进行启动,然后烧写文件到 EMMC/NAND 中,下载完成后还是需要我们重新拨动拨码开关从 EMMC/NAND 中启动。
- 开发板启动时是将 uboot、linux kernel、.dtb 和 rootfs 加载到 DDR 中进行linux系统的启动。
- image.png
- 常用的就是01串行下载和10内部boot模式。
- #首次启动uboot应该是要么通过串行下载,要么通过内部boot模式的SD卡启动。
- mfgtool串行下载
- 缺点:不能单独下载uboot、内核、设备树、根文件系统。
- 串行下载是使用nxp的官方烧录工具 mfgtool 或者正点原子的 mfgtool 工具直接用 windows 通过 usb otg 接口向开发板 EMMC 下载代码的时候使用的,这个时候八个拨码开关的位置应该是:01000000。
- 此软件在 Windows 下使用!!!
- nxp的官方烧录工具路径:5、开发工具->3、NXP官方原版MFG_TOOL烧写工具->L4.1.15_2.0.0-ga_mfg-tools.tar.gz。
- 正点原子的 mfgtool 工具路径:5、开发工具->04、正点原子MFG_TOOL出厂固件烧录工具->mfgtool->Mfgtool2-eMMC-ddr512-eMMC.vbs
- 烧写原理:通过串口向EMMC中烧写程序
- MfgTool 其实是先通过 USB OTG 先将 uboot、kernel 和.dtb(设备树)这是三个文件下载到开发板的 DDR 芯片中,注意不需要下载 rootfs。就相当于直接在开发板的 DDR 上启动 Linux 系统,等 Linux 系统启动以后再向 EMMC 中烧写完整的系统,包括 uboot、linuxkernel、.dtb(设备树)和 rootfs。总结就是,mfgtool工具先向开发板的 DDR芯片上下载一个 Linux系统,然后通过这个系统来完成烧写工作。
- 流程:
- 准备材料:
- image.png
- 用nxp的官方烧录工具烧录的话,需要重命名这四个文件的名字,否则的话nxp官方烧录工具的配置文件 ucl2.xml 是识别不出来的。我们在ubuntu上构建的根文件系统,压缩打包到windows上。
- image.png
- image.png
- 如果插了 TF 卡,请弹出 TF 卡,否则电脑不能识别 USB!等识别出来以后再插上 TF 卡!
- 连接 USB 线到 usb otg 接口,选择usb连接windows主机。
- 拨码开关拨到 USB 下载模式。
- 烧写完成以后点击“Stop”按钮停止烧写,然后点击“Exit”键退出。
- image.png
- 一旦我们自己改造的nxp官方 mfgtools 工 具 能 够 正 常 烧 写 系 统 , 那 么 mfgtools-with-rootfs/mfgtools/Profiles/Linux/OS Firmware/firmware 目录下的文件以后就不能再修改!否则可能导致烧写失败!
- 其实我们也主要是烧录file文件夹下的4个文件,而fileware这个是用于烧录时启动系统的,并不是我们要烧写的固件。
- 如果需要更新内核或者uboot,可以替换上一级目录下的files/boot目录下的内核或者uboot文件。
- 烧写完毕启动uboot:
- 拔出 USB 线,将开发板上的拨码开关拨到 EMMC 启动模式,然后重启开发板,此时就会从 EMMC 启动。
- 内部boot模式之SD卡
- 而内部boot模式是在正常运行的时候使用的,从内部boot模式启动,芯片会执行内部的boot rom代码,这段代码会进行硬件初始化,然后从boot设备(SD 或者 EMMC版本/NAND版本两者之一)中将代码拷贝出来复制到指定的RAM中。
- 烧写uboot到SD卡
- 前面通过mfgtool串行下载烧写uboot到EMMC中,然后从EMMC中启动uboot;当然也可以直接将uboot烧写到SD卡中,从SD卡启动uboot。
- 流程
- 插入读卡器
- 用usb读卡器和电脑接口相连,选择USB连接到ubuntu。Ubuntu 下所有的设备文件都在目录“/dev”里面,所以插上 SD 卡以后也会出现在“/dev”里面,其中存储设备都是以“/dev/sd”开头的。SD 卡是/dev/sdd。
- 烧写uboot.bin到SD卡中
- 在 Ubuntu 下通过 imxdownload 软件烧录到SD卡中,uboot文件在ubuntu里完成相关编译后,将 uboot.bin 烧写到 SD 卡中,然后通过 SD 卡来启动来运行 uboot,使用 imxdownload 软件烧写。
- imxdownload软件路径为:开发板光盘->05、开发工具->02、Ubuntu 下裸机烧写软件->imxdownload
-
chmod 777 imxdownload //给予 imxdownload 可执行权限,一次即可 ./imxdownload u-boot.bin /dev/sdd //烧写到 SD 卡,不能烧写到/dev/sda 或 sda1 设备里面!
- 启动uboot
- 等待烧写完成,完成以后将 SD 卡插到 I.MX6U-ALPHA 开发板上,BOOT 设置从 SD 卡启动,使用 USB 线将 USB_TTL 和电脑连接,也就是将开发板的串口 1 连接到电脑上。打开MobaXterm,设置好串口参数并打开,最后复位开发板,就可以从SD卡启动uboot了。
- 说明
- 正点原子资料中的 uboot 是 emmc 版本的,也就是从 emmc 启动的。虽然我们将 uboot 烧写到SD卡中,从SD卡启动uboot,但uboot还是会从emmc中去加载Linux内核和设备树,所以这就要求emmc中已经有Linux内核和设备树。