uboot命令行从U盘升级kernel

10 篇文章 4 订阅
2 篇文章 0 订阅

背景

嵌入式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/pararmeter.txt中查看。经查看起始地址为0x00026800,大小正好为上面我们读取到的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

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值