目录
参考:
下载方法
目前接触过的下载方法主要有三种:
1:通过官方提供的串口烧录工具
通过板子官方提供的一键烧写工具。将编译好的 uboot ,kernel,dtb, rootfs 镜像放到工具所指定的文件目录下,实现一键烧写。
2:通过调式器 + GDB
这种方式主要使用到了 GDB 的 restore 命令,通过调试器将指定uboot,kernel等文件 load 到板载 DDR 的指定位置上。与使用 tftp 将内核镜像文件加载到 DDR 上效果一样,后面配合烧写介质进行详细介绍。
3:tftp/nfs加载kernel,dtb,nfs挂载rootfs
烧写介质
目前接触过的烧写介质主要有4种
1:QSPI_FLASH
QSPI_FLASH 用来做 Linux 存储介质的话,受限于大小。一般用来存储 uboot 和kerne和设备树。很少拿来存放 rootfs 。用来存放 rootfs 的话,其格式接触过的有 jffs2 格式。
2:EMMC
EMMC 和 SD 卡操作上一致,只是 EMMC 速度更快,但焊死在板子上,没有 SD 卡方便。EMMC 和 SD 卡存储 rootfs 的格式一般都为 ext2/3/4 的格式。
需要注意的是,EMMC 和 SD 卡在存放之前要先进行分区和对分区格式化。一般在 linux 环境下使用 fdisk 来进行分区操作。使用 mkfs.ext2/3/4 来进行指定分区的格式化。这两个命令的具体使用网上都有很多了,不多赘述。
有些 rootfs 中可能没有 mkfs 的命令,就需要去移植了。
3:SD
同上
4:网络挂载
这种是调试阶段最常见的加载方式,一般都是通过tftp加载kernel,但是由于tftp没有重联的机制,对于网络要求比较高。所以在某些网络不稳定的情况下也可以用 nfs 加载kernel。uboot 只能存在于板载的介质上,不可通过网络挂载。其余的都可通过网络挂载。
具体实现
在通过调试器加 GDB 的方式去下载的时候,需要确定调试器正确连接。然后使用工具链自带的 GDB 去连接到调试器。一般是通过调试器的端口 IP 去修改 .gdbinit 文件,若此刻板子上没有 uboot,那么可以直接使用 uboot 编译好的可执行文件通过 gdb 带到 DDR 上直接运行。
下面的操作都是依靠在 uboot 成功运行且按回车停留在命令输入阶段。
在 uboot 命令输入阶段使用 GDB 正确连接之后使用 restore 命令将要下载的文件 load 到板载的 DDR 上。类似于 tftp 命令通过网络将要下载的文件 load 到板载的 DDR 上。这里需要注意确保操作的 DDR 地址是没有被 uboot 使用的。之后的操作便要根据不同的介质来执行不同的命令
使用 QSPI_FLASH :
在 uboot 的命令窗口使用 sf 命令来操作 QSPI_FLASH。粗略使用步骤如下:
sf probe xxx
/*先挂载指定的 QSPI_FLASH*/
sf update A B C
/*A: DDR中的起始地址 B: QSPI_FLASH 指定烧写地址 C: 烧写长度*/
使用 EMMC/SD:
在 uboot 的命令窗口使用 mmc 命令来操作 EMMC/SD 卡。粗略使用步骤如下:
mmc dev 1 1
/*根据实际情况,切换到指定设备的指定分区*/
mmc write A B C
/*A: DDR的起始地址
B: 要烧写设备的指定开始扇区号
C: 要烧写的长度*/
注意,以上命令的地址参数都是 16 进制。
由于 SD 卡的灵活性,所以烧写到 SD 卡可以不需要在 uboot 中进行,其他方法详见文首参考项。
使用网络挂载
关于这种方式,网上有很多资料。总结以下几可能会导致网络挂载失败的原因:
1:板子和虚拟机之间网络不通。
2:主机端没有安装 tftp, nfs 的功能。又或者相关文件没有配置对。
3:编译的板载内核中没有开启 nfs 的服务,主机安装nfs版本和板载uboot中nfs版本协议不同( 一般主机安装的较新版本nfs默认是不支持nfs_V2服务的,而板载uboot中的nfs一般都是nfs_V2类型,所以导致nfs由于协议不匹配挂载不上rootfs,相关的解决方法可以 点此链接 查看)。
4:对 bootargs 和 bootcmd 网络命令相关的赋值出错,特别是 nfs 挂载 rootfs 的命令比较长。
这里讲一下如何使用nfs加载kernel和设备树。
目前一般都是使用tftp的方式来加载kernel和设备树,但其实也可以通过nfs来加载,优点就是加载过程更加稳定,由于nfs有一定程度的重连机制,所以在加载过程中由于网络导致的数据错误并不会像tftp一样无法处理。缺点就是速度上相较于tftp会慢许多。这里直接介绍一下加载的具体命令格式:
格式:
nfs DDR加载目标地址 服务器IP:/文件路径(确保是在nfs能访问的目录下)/文件名
举例:
将主机path目录下的zImage加载到板载DDR 80800000 地址处,
将主机path目录下的a.dtb 加载到板载DDR 83000000 地址处,
最后执行镜像文件
setenv bootcmd 'nfs 80800000 192.168.3.100:/path/zImage; nfs 83000000 192.168.3.100:/path/a.dtb; bootz 80800000 - 83000000'