Uboo命令行从U盘升级kernel

背景

嵌入式Android的kernel升级方式有很多,可以从OTG口、SD卡、U盘升级,常用的是OTG口,几乎每个设备都有。SD卡现在很多都不怎么用了,连手机上也已经取消。

最近在项目中就遇到了一个尴尬的情况,刚做出来的板子OTG口用不了,不能升级和刷机,也没有SD卡,只有一个USB2.0口,通过串口只能看到启动到了u-boot,kernel中的串口被关闭了,并且kernel起不来。所以就想能不能把编译好的kernel从U盘启动(此时RK的sdk中还未将u盘升级及启动的补丁打上去),也不能用RK提供的升级方式,只好试试用uboot指令将kernel刷进去。

Kernel: v4.4.179

Device: rk3328

Platform Version: Android 9.0

实现分析

  1. 首先需要将编译好的kernel.img先刷到U盘中。
  2. 将U盘中的镜像内容读取到DDR中空闲位置。
  3. 然后将使用bootm/booti/bootz指令从刚才读取的DDR启动kernel。

最终实现和分析的步骤在调试过程中有修改

实现步骤

  1. 将编译好的boot.img刷到U盘。(经验证使用kernel.img不行,启动后报错,报错具体原因未分析)

    //将U盘格式化一下或者删掉里面的文件,然后插到liunx系统电脑上。
    //查看U盘设备,并记录下U盘的块起始地址2048,转换为16进制为800,后面会用到此地址
    sudo fdisk -l

    1

    //sdxx根据具体情况修改,记录下镜像块大小65536,转换成16进制10000,后面会用到此大小
    dd if=boot.img of=/dev/sdxx

    1

  2. 将U盘中的镜像加载到DDR的空闲位置。

    打开串口连接开发板,将U盘插到开发板,上电启动,在串口Ctrl+C使其进入uboot命令行。

    //使用?查看所有指令
    //检测U盘是否存在
    usb start

    1

    //将u盘中的镜像读到DDR空闲位置(例如:0x40007000,800:U盘的起始块地址,10000:boot.img镜像大小,步骤1有说明)
    usb read 0x40007000 800 10000
    //将DDR中加载的0x40007000的内容打印出来看看,是否加载成功,只读32个字节看看MAGIC数
    md.b 0x40007000 20

    1

  3. 将DDR中boot.img镜像写入EMMC中。

    //首先查看RK定义的boot.img写在EMMC的哪个位置,地址是什么?
    //可在rockdev/Image/pararmer.txt中查看。经查看起始地址为0x00268000,大小正好为上面我们读取到的0x00010000

    1

    //将DDR中的boot.img, 写入EMMC起始地址26800这个位置,大小为10000
    mmc write 0x40007000 26800 10000

    1

  4. 掉电重启

转载请注明出处:http://www.wolfnx.com/2020/03/26/Uboot-Flash-Kernel-From-Usb

作者 : wolfnx
邮箱 : wolfnx@outlook.com
邮箱2 : lostnx@gmail.com

Click Me