嵌入式烧写uboot,kernel,dtb,rootfs

目录

下载方法

烧写介质

1:QSPI_FLASH

2:EMMC

3:SD

4:网络挂载

具体实现

使用 QSPI_FLASH :

使用 EMMC/SD:

使用网络挂载


参考:

linux 挂载 SD 卡


下载方法

目前接触过的下载方法主要有三种:

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'

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值