前言

在前一篇 Hi3516DV300开发板——2.uboot、kernel、fs文件系统烧写

之后,还是有很多坑的,比如 uboot 烧写进去后,如何根据自己手里不同的开发板,设置 bootargsbootcmd 等选项。

同时最后会解决一些上一篇的小问题。

说明

bootargs  传递给内核的启动参数,告诉内核相关内容,决定内核启动后根文件系统如何挂载
bootcmd:  用于实现内核的自启动的参数传递

这里有兴趣的同学,可以去看看韦东山老师的 uboot 的分析课程,可以结合实践去分析了解。

Uboot 启动

问题一:uboot无法启动kernel或者rootfs

说明:

其中很多人遇到的一个问题:就是当你 uboot 烧录进去没问题,但是去启动 Kernel 或者挂载 rootfs 的时候就会出现类似的错误:## Error: "distro_bootcmd" not defined 或者挂载根文件系统失败、uboot一直重启等

原因:

这是因为你的 bootargsbootcmd 设置和你的实际板卡外围芯片型号和硬件电路原理图不匹配,导致 Kernel 启动失败。

解决:

这里用我的开发板举个例子:

# HiSpark AI Camera Hi3516DV300 uboot printenvarch=arm
baudrate=115200
board=hi3516dv300
board_name=hi3516dv300
bootargs=console=ttyAMA0,115200n8 root=emmc fstype=vfat rootaddr=10M rootsize=15M rw
bootcmd=mmc read 0x0 0x80000000 0x800 0x4800; saveenv; go 0x80000000
bootdelay=2
cpu=armv7
ethact=eth0
ethaddr=7a:fb:28:6b:e7:60
gatewayip=192.168.1.1
ipaddr=192.168.1.15
netmask=255.255.255.0
serverip=192.168.1.5
soc=hi3516dv300
stderr=serial
stdin=serial
stdout=serial
vendor=hisilicon
verify=n

bootargs:主要是要告诉内核一些相关设置和 rootfs文件系统 的相关参数

参数分析:

console=ttyAMA0,115200n8
串口作为console终端,波特率为115200,8为数据,无校验root=emmc
rootfs根文件系统挂载的介质为:eMMC fstype=vfat
rootfs根文件挂载的文件系统类型为:vfat             rootaddr=10M rootsize=15M
rootfs根文件系统储存的地址为10M的位置,大小为15Mrw
默认文件系统只读,需要在 bootargs 中加入rw 选项,文件系统才可读写

解释:

rootfs根文件系统挂载的介质一般有:

  • emmc
  • /dev/mmcblk0p3
  • /dev/nfs(网络NFS)

fstype挂载的文件的类型一般有:(下一篇文章会细讲

  • vfat
  • jffs2 — SPI NOR
  • yaffs2 — SPI NAND
  • ext4 — eMMC

重要!!!!!

这里着重说明一下 rootaddr 和 rootsize,这里的addr对应上一篇 HiTools 烧录时 rootfs 根文件后面的开始地址和文件大小 (重要!!!!!)

如果自己编译了 内核和rootfs,这里rootaddr地址需要根据内核的实际大小去算,rootsize对应你实际文件的大小,一般向上取整!!!

比如这里uboot 大小1M,然后我自己编译的OHOS_Image.bin大小和18.6M,rootfs 大小为25.6M,这里就需要改了,修改命令为:
setenv bootargs 'console=ttyAMA0,115200n8 root=emmc fstype=vfat rootaddr=20M rootsize=26M rw'

计算过程如下:

文件 开始地址 文件大小
u-boot-hi3516dv300.bin 0 1M
OHOS_Image.bin 1M 19M
userfs.img 20M 26M

bootcmd

参数分析:

# mmc 按块儿读 一块大小是512字节mmc read 0x0 0x80000000 0x800 0x4800;
读取emmc起始地址为0x800(单位为512B,即1MB)
大小为0x4800(单位为512B,即9MB)的内容到0x80000000的内存地址saveenv;
保存uboot的环境变量设置go 0x80000000
跳转到地址为0x80000000

解释:

命令:mmc read < device num > addr beg_addr SIZE

参数:

  • device num: mmc的设备号,可以通过mmc list查询
  • addr:目标内存地址
  • beg_addr:读取的起始地址
  • SIZE:大小

这里先解释下这个读取的是 ubootmmc read 的作用:

简单来说,主要是内核启动的时候,把以beg_addr起始的位置读取SIZE大小 的内核文件,读到addr内存位置去,然后保存设置,跳转到addr内存位置去启动内核。

实质就是,把你烧录的OHOS_Image.bin内核文件读到内存去启动。


大小计算(!!!重要!!!!)

包括我很多人开始看到这些这么多地址啊、大小的值,啥是啥啊,一脸懵逼,哪怕自己移植,也不会算,但后面细心看看不难,这里我计算一遍,看一遍,自己也算算。

这里前两个参数 0x0 0x80000000 是指:把内核从emmc(0x0)读出,放到0x80000000地址,所以第一个参数是设备号,第二个是设备的地址,我们不用管。

这里以我手里的板子和官方的镜像,内核,rootfs为例子:

文件 开始地址 文件大小
u-boot-hi3516dv300.bin 0 1M
OHOS_Image.bin 1M 9M
userfs.img 10M 15M

继续,后面的 0x800 是指读取的的起始地址,也就是内核( OHOS_Image.bin) ,实际就是你烧录进去emmc储存的实际物理地址,也就是那个开始的地址,但为什么是0x800

因为一个“块”为512字节:

//起始地址
0x800(hex) ===> 2048(dec十进制)
2048 * 512 = 1048576 (字节)
1048576 / 1024 / 1024 = 1M//所以0x800 = 1M

要把0x4800大小的内核文件移动到内存(0x8000000)中,计算如下:

//移动大小
0x4800(hex) ===> 18432(dec十进制)
18432 * 512 = 9437184(字节)
1048576 / 1024 / 1024 = 9M//所以0x4800 = 9M

所以这样就很明显了,后面你的内核大小改变了,你这里的大小也就需要修改,不过是需要逆向的推回十六进制了。

修改uboot命令

如果你要修改相关命令,可以这样:

setenv uboot_cmd 内容# eg:
# 设置uboot 倒计时为10s
setenv bootdelay 10

要清除某个命令的操作:

setenv uboot_cmd# eg:
# 清除ipaddr
setenv ippaddr

总结

bootcmd:设置了内核相关读取搬移和启动位置,如果内核编译大小变动了,这里的设置也就需要改变,不然无法启动内核!

bootargs :设置了 rootfs 根文件系统的相关参数,如果 rootfs 变动了,这里的设置也需要改变,不然无法挂载根文件系统。

解决

最后,如果你的开发板参考我的上一篇成功的烧录了 uboot内核根文件系统,但是还无法启动,先进入 uboot 输入 pri 打印看看 bootargs 和 bootcmd 是否正确。

最后贴一张官方的uboot设置:

来自电子发烧友

Hi3516DV300开发板——3.烧录过程问题、uboot相关设置及移植前准备相关推荐

  1. Hi3516DV300开发板固件烧录

    Hi3516DV300开发板固件烧录经验 1. 固件烧录的一般流程 钟老师讲解的十分详细:electronic_borad-固件烧录 2. 问题与解决方法 对于推荐的烧录方式:个人推荐网口烧录,方便且 ...

  2. Hi3516DV300开发板——2.uboot、kernel、fs文件系统烧写

    前言 搭建环境教程:Hi3516DV300开发板--1.环境搭建 此教程默认环境:Win10+VMware+Ubuntu18.04 这篇文章只针对使用Windows下使用 网口进行烧录,所以需要有一根 ...

  3. 【4412嵌入式开发板学习笔记】认识uboot -迅为电子资料分享

    重要说明:这份笔记不是4412开发配套的,是我在网上看视频的时候下载上课老师的笔记后修改的.所以我试了一下笔记上的uboot命令,有些无法使用,可能是uboot版本问题或者文件系统问题.具体原因我目前 ...

  4. PYNQ-Z1开发板通过QSPI FALSH启动UBOOT

    PYNQ-Z1开发板通过QSPI FALSH启动UBOOT 前期准备工作 安装虚拟机和ubuntu 安装petalinux 安装vivado和SDK 下载PYNQ-Z1的board file文件 方法 ...

  5. 驱动开发基础知识必修-(一)嵌入式开发板的启动过程

    驱动开发必修-嵌入式开发板的启动过程 简介 从打印日志入手 熟悉启动过程 1.执行u-boot程序 2.加载linux内核 3.挂载rootfs 4.加载完后 进入终端(命令输入行) UBOOT 1. ...

  6. Mastering Embedded Linux Programming 学习 (二)在百问网157开发板上,编译构建u-boot

    Mastering Embedded Linux Programming 学习 (二)在百问网157开发板上,编译构建u-boot 一.下载u-boot源码 git clone https://git ...

  7. 开发板与虚拟机组网、uboot源码makefile分析、uboot安全启动与非安全启动方式、uboot源码配置与编译流程、制作TF启动盘

    开发板与虚拟机组网. 局面:开发板.PC(Ubuntu系统).网线直连PC:设置Ubuntu系统:1.设置桥接模式,桥接到PC的有线网卡上:2.手动配置IP V4的地址信息,注意和开发板保持在同一网段 ...

  8. opencv-3.4.3 交叉编译并且移植到高通820开发板(包括Qt 5.11.2部分交叉编译及移植),NEON OpenCV编译

    opencv-3.4.3 交叉编译并且移植到高通820开发板(包括Qt 5.11.2部分交叉编译及移植),NEON OpenCV编译 原文我是用有道笔记记录的,下面排版不是很好,可参看有道笔记原文:h ...

  9. Linux学习之ARM开发板连接ubuntu18.04LTS及NFS相关配置

    Linux学习之ARM开发板连接ubuntu18.04LTS及NFS相关配置 第一步:在PC机安装Ubuntu18.04LTS 具体安装步骤参见上一篇文章 第二步:安装arm-linux-gcc交叉编 ...

最新文章

  1. gradle多工程打包冲突问题
  2. 评论与回复php代码,php – 显示评论和回复?
  3. 【转】自旋锁及其衍生锁
  4. 03.德国博士练习_02_admin_cluster
  5. 【ArcGIS风暴】ArcGIS获取一个省各个地区界内的河流的总长度--以甘肃省为例
  6. JHChart 1.1.0 iOS图表工具库中文ReadMe
  7. android 多类型参数,Android的数据绑定-类型参数T具有不兼容的上限:ViewDataBinding和MainActivity...
  8. 程序员中的老司机们,30 后的路该开向哪里?
  9. 最小二乘法拟合直线-C++实现
  10. linux延迟加载so,WebRTC Linux ADM 实现中的符号延迟加载机制
  11. 开源大阅兵:盘点那些走向世界的中国项目
  12. sublime text 3 javascript 语法检查
  13. html页面如何实现搜索功能,使用jQuery怎么实现一个页面关键字搜索功能
  14. pycharm创建虚拟环境后突然出现invalid SDK标识
  15. 后端工程师必看学习路线图(含初、中、高阶)
  16. H.264编码技术(zz)
  17. iOS 开发:彻底理解 iOS 内存管理(MRC 篇)
  18. arguments的用法(介绍)
  19. 在jsp中通过I/O流方式读取图片并展示到页面
  20. 数据库实验七——视图、索引及数据安全

热门文章

  1. 喜讯!麦聪软件获得国际权威机构颁发的CMMI3证书
  2. 计算机编程语言历史_早期编程语言的历史
  3. 题目整理---Excel表的操作
  4. 腾讯云linux没有root,解决腾讯云服务器默认为ubuntu用户问题
  5. 2021年中国工业互联网行业发展现状分析,“5G+工业互联网”驱动行业快速发展
  6. 硬件基础——驱动电路
  7. 【PTA】 7-3 玩转二叉树 (二叉树静态建树+左右子树交换+层次遍历)
  8. Photoshop 2015 CC快捷键命令大全
  9. 第一台量子计算机哪国先发明出来,这是世界上第一台光量子计算机,它来自中国 | 早期实验室...
  10. STM32F4 基于FPU使用FIR滤波