海思hi35xxuboot启动分析总结(代码片段)

liwen01 liwen01     2023-04-20     727

关键词:

前言

在嵌入式linux设备中,uboot的最终目的就是启动kernel。对于uboot而言,没有人把它引导起来,所以uboot首先需要把自己加载起来,然后再去引导kernel的启动,这也就可以大致的分为Uboot启动的第一阶段和第二阶段。

(一)start.S第一阶段启动总结

在海思hi3251a官方的《Hi3521A_PINOUT_CN》手册上有上电锁存管脚BOOTROM_SEL,这个是引脚用来定义是从BOOTROM启动还是从spi flash启动 。

(1)BOOTROM启动

当启动模式为从 BOOTROM 启动时,海思的BOOTROM的程序会去初始化串口,然后与海思的HiBurn工具建立通信

如果能建立通信,则启动HiBurn升级uboot程序流程,如果不能与HiBurn建立连接,等待一段时间之后它就转去从外部的spi flash启动

(2)HiBurn 烧入原理

HiBurn烧入的基本原理是,HiBurn工具与BOOTROM程序建立连接之后,先下载uboot程序的开始4KB数据到海思芯片的内部RAM

然后通过下载的那一小部分uboot代码去初始化外部的DDR,如果DDR初始化成功,HiBurn再将剩下的uboot程序下载到外部的DDR中去

最后是在DDR中启动uboot,如果要进行烧入操作,是通过DDR中的Uboot程序,发送uboot命令将DDR中的uboot程序烧入到外部的flash中去,这样就实现了uboot程序的升级。

(3)spi flash启动

海思的hi3521a芯片支持从 SPI NOR Flash 和 SPI NAND Flash 直接启动,它的启动也就是我们start.s中的大部分实现。主要做的工作有:

  1. 初始化CPU相关功能(关缓存,关MMU,设置SVC模式等)
  2. 将异常中断向量表重定向到内部RAM
  3. 将uboot代码重定向到外部DDR中
  4. 设置栈空间
  5. 清空BSS段
  6. 最后调用C语言接口去执行C语言代码实现第二阶段的启动。
    第一阶段在执行之后,在DDR中的映射空间的数据分布如下:

(二)start_armboot第二阶段启动总结

在uboot的启动的第二阶段,主要做的是:

  1. 初始化变量和结构体
  2. 重定向环境变量
  3. 初始化堆管理器
  4. 初始化环境变量
  5. 进入命令处理循环

在命令处理循环中,默认Uboot是超时等待用户命令输入

如果有检测到命令的输入,则执行相应的命令,如果超时没有命令输入,uboot默认执行的bootm命令进行kernel启动引导。

这里涉及到两个比较总要的点:环境变量的重定向和uboot命令处理。

(1)环境变量重定向

在uboot第二阶段的时候,uboot会去检测flash中环境变量的地址中环境变量是否有效,如果有效,则使用flash中的环境变量值来初始化uboot运行中的环境变量,如果flash中的环境变量无效,则使用默认的环境变量来初始化运行中的uboot。

在uboot的用户命令操作过程中,如果有对环境变量进行修改,都是修改的内存中的那一份环境变量,如果要将修改的环境变量保存到flash中去,则需要运行命令saveenv
uboot在flash的分布如下:

uboot.bin烧入到flash的0地址位置,boot.bin里面的数据就是按我们连接脚本中的数据那样分布。在0x80000(512KB)开始的位置就是环境变量的在flash的位置,其大小为256KB。

(2)uboot命令处理

在启动的最后阶段,就是执行uboot的bootm命令,主要就是uboot将kernel程序从flash中复制到内存去,然后就是检验kernel镜像文件的有效性,设置uboot传递给kernel的参数,设置kernel启动的环境(比如关缓存,关中断,CPU处于SVC模式等)

最后就是通过一个函数指针指向kernel的启动地址,调用该函数实现uboot到kernel的运行。

在这个过程中,启动参数和机器码同时传递给kernel,关于参数传递,实际在这里是通过寄存器间参数的地址传递给了kernel。

(3)参数传递

C语言进行函数调用的时候,常常会传递给被调用的函数一些参数,对于这些C语言级别的参数,被编译器翻译成汇编语言的时候,就要找个地方存放一下,并且让被调用的函数能够访问,否则就没发实现传递参数了。对于找个地方放一下,分两种情况。

  1. 一种情况是,本身传递的参数就很少,就可以通过寄存器传送参数。因为在前面的保存现场的动作中,已经保存好了对应的寄存器的值,那么此时,这些寄存器就是空闲的,可以供我们使用的了,那就可以放参数,而参数少的情况下,就足够存放参数了,比如参数有2个,那么就用r0和r1存放即可。

  2. 另外一种情况是,如果参数太多,寄存器不够用,那么就得把多余的参数堆栈中了。即,可以用堆栈来传递所有的或寄存器放不下的那些多余的参数。

---------------------------End---------------------------

长按识别二维码
关注 liwen01 公众号

基于海思hi3516dv300的u-boot-2016.11分析(代码片段)

1.先看链接脚本文件u-boot.lds,文件位于u-boot-2016.11\arch\arm\cpu\armv7\hi3516dv300\hw_compressedOUTPUT_FORMAT("elf32-littlearm","elf32-littlearm","elf32-littlearm")OUTPUT_ARCH(arm)/*设置输出文件的架构体系为arm架构*/ENTRY(_star 查看详情

海思vpss前后绑定关系总结(代码片段)

前言工作中遇到一路码流(分辨率为384x288)从vi进入,通过vpss处理需要实现如下功能;(以3516,vi-vpss均离线模式为例)(1)需要将分辨率缩放为800x600;(vpss)(2)需要实现抓拍;(venc)(3)需要实现h264打包成mp4;(venc)(4)需要实现rtsp图传;(venc)(5)需要实... 查看详情

海康摄像头海思ai芯片(hi35xx):图像jpg转.bgr(代码片段)

...果,我觉得python转化更为习惯吧。本代码仅面向学习海思35xx的各位。转化完不是标准bgr格式,由于Hi35xx的bgr分布不是标准格式,所以写了一点代码进行bgr与jpg格式图片互相转化,并逆向思维进行测试转化后的bgr。代码... 查看详情

hi3516开发笔记:hi3516虚拟机基础环境搭建之交叉编译环境境搭建以及开机启动脚本分析(代码片段)

...L、ffmpeg、OSG、单片机、软硬结合等等)持续更新中…海思开发专栏上一篇:《Hi3516开发笔记(二):Hi3516虚拟机基础环境搭建之串口调试、网络连接以及sftp文件传输》下一篇:《Hi3516开发笔记(四ÿ... 查看详情

hi3516开发笔记:hi3516虚拟机基础环境搭建之交叉编译环境境搭建以及开机启动脚本分析(代码片段)

...L、ffmpeg、OSG、单片机、软硬结合等等)持续更新中…海思开发专栏上一篇:《Hi3516开发笔记(二):Hi3516虚拟机基础环境搭建之串口调试、网络连接以及sftp文件传输》下一篇:《Hi3516开发笔记(四ÿ... 查看详情

hi3516开发笔记:hi3516虚拟机编译ubootkernelroofts和userdata以及分区表(代码片段)

...L、ffmpeg、OSG、单片机、软硬结合等等)持续更新中…海思开发专栏上一篇:《Hi3516开发笔记(三):Hi3516虚拟机基础环境搭建之交叉编译环境境搭建以及开机启动脚本分析》下一篇:《Hi3516开发笔记(... 查看详情

ffmpeg开发笔记:ffmpeg在ubuntu上的交叉编译移植到海思hi35xx平台(代码片段)

...L同步播放》下一篇:敬请期待前言  将ffmpeg移植到海思HI3559、Hi3516平台上,需要交叉编译。FFmpeg下载  开发使用当前3.4.8稳定版本:  官方地址:http://ffmpeg.org/download.html#re 查看详情

ffmpeg开发笔记:ffmpeg在ubuntu上的交叉编译移植到海思hi35xx平台(代码片段)

...L同步播放》下一篇:敬请期待前言  将ffmpeg移植到海思HI3559、Hi3516平台上,需要交叉编译。FFmpeg下载  开发使用当前3.4.8稳定版本:  官方地址:http://ffmpeg.org/download.html#re 查看详情

hi3516开发笔记:在qtcreator开发环境中引入海思sdk的bsp包,运行显示qt界面(代码片段)

...L、ffmpeg、OSG、单片机、软硬结合等等)持续更新中…海思开发专栏上一篇:《Hi3516开发笔记(八):Hi3516虚拟机交叉开发环境搭建之配置QtCreator开发交叉编译环境》下一篇:敬请期待…前言  之前启动Qt... 查看详情

hi3516开发笔记:在qtcreator开发环境中引入海思sdk的bsp包,运行显示qt界面(代码片段)

...L、ffmpeg、OSG、单片机、软硬结合等等)持续更新中…海思开发专栏上一篇:《Hi3516开发笔记(八):Hi3516虚拟机交叉开发环境搭建之配置QtCreator开发交叉编译环境》下一篇:敬请期待…前言  之前启动Qt... 查看详情

opencv开发笔记(七十四):opencv3.4.1+ffmpeg3.4.8交叉编译移植到海思平台hi35xx平台(代码片段)

...别物体》下一篇:持续补充中…前言  移植opencv到海思平台,opencv支持对视频进行解码,需要对应的ffmpeg支持。Ffmpeg的移植  Ffmpeg的移植请参考之前的文章:《FFmpeg开发笔记(十):ffmpeg在ubuntu上... 查看详情

hi3516开发笔记:hi3516虚拟机编译ubootkernelroofts和userdata以及分区表(代码片段)

...L、ffmpeg、OSG、单片机、软硬结合等等)持续更新中…海思开发专栏上一篇:《Hi3516开发笔记(三):Hi3516虚拟机基础环境搭建之交叉编译环境境搭建以及开机启动脚本分析》下一篇:《Hi3516开发笔记(... 查看详情

海思hi35xx之----视频处理单元各通道间的关系

最近在折腾HI3518C的芯片,应用到IPCamera上,最终获取多路不同分辨率的视频流供不同需求的预览切换。此处简单记录一下视频前处理元VPSS(Video Process Sub-System)的多通道间的关系以及使用心得。HI3518C的视频子系统包括:... 查看详情

[转帖]华为海思hi1620芯片发布在即7nm制程arm架构最高可达3.0ghz(代码片段)

华为海思Hi1620芯片发布在即7nm制程ARM架构最高可达3.0GHzhttps://www.cnbeta.com/articles/tech/850561.htm中电科旗下的普华软件支持国产CPUHi1620参数看起来还是很不错的. 一夜间,华为海思“备胎转正”,不仅周边的“备胎股&rdquo... 查看详情

海思hi3519av100emmcflash方式linux系统移植hitool工具烧写(代码片段)

因为我这里的海思文档只有SPINORFlash方式的详细烧写步骤,没有emmc方式的,本文提供一个自己成功的案例仅供参考和记录1.准备SDK、安装交叉编译工具、编译osdrv1.1解压SDK包 将Hi3519AV100_SDK_Vx.x.x.x.tgz文件放入ubuntu系统下ÿ... 查看详情

海思qt开发系列:3559平台qt移植(代码片段)

参考海思Hi3559av100移植Qt5.9.7Qt5.5.1移植到freescaleimx6网上的版本大都不完善,或多或少会出一些错误,所以一切以我为准!环境主机环境:Ubuntu16.04;板端:hi3559av100交叉编译环境:aarch64-himix100-linux-没环... 查看详情

设置海思芯片mmz内存os内存详解(代码片段)

1、前言(1)本文是基于hi3516dv300芯片的uboot和内核进行讲解;(2)dv300芯片的板子上实际接了2G内存,dv300芯片实际最大也只支持2G内存;2、hi3516dv300芯片的内存地址范围(1)通过查阅数据手册可知《Hi3516DV300专业型SmartIPCameraSo... 查看详情

海思hi35xx开发学习:视频输入

...到DDR之前,它可以实现裁剪等功能。PIPE的工作模式参考:海思hi35xx开发学习(2):系统控制掩码掩码用于指示VI设备的视频数据来源。镜头畸变校正(LDC)镜头畸变校正,一些低端镜头容易产生图像畸变,需要根据畸变程度对其图像... 查看详情