快讯
HOME
快讯
正文内容
arm nand flash启动 海思Hi35xx uboot启动分析总结
发布时间 : 2024-11-24
作者 : 小编
访问数量 : 23
扫码分享至微信

海思Hi35xx uboot启动分析总结

liwen01 2019.12.09

前言

在嵌入式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中的大部分实现。主要做的工作有:

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

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

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

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

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

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

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

(1)环境变量重定向

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

在uboot的用户命令操作过程中,如果有对环境变量进行修改,都是修改的内存中的那一份环境变量,如果要将修改的环境变量保存到flash中去,则需要运行命令saveenvuboot在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语言级别的参数,被编译器翻译成汇编语言的时候,就要找个地方存放一下,并且让被调用的函数能够访问,否则就没发实现传递参数了。对于找个地方放一下,分两种情况。

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

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

如需获取更多内容

请关注公众号 liwen01

IMX6ULL——启动流程(与stm32对比)

一、IMX6ULL——启动流程

飞向深空关注

2021.02.08 10:26:55字数 1,387阅读 1,754

1.IMX6拿C来编程需要C运行环境,这个运行环境由arm汇编来实现,文件夹的start.s文件就是启动文件,来实现C运行环境。其实STM32也有这个.s文件,拿H7举例,startup_stm32h753xx.s,这个文件是MDK自动生成的,不需要自己编写。

2.IMX6编程到运行需要把所有.c文件变成.o可执行文件,然后把所有.o文件链接在运行地址0x87800000转变成一个.bin文件,但是仅仅是.bin文件并不能在IMX中跑,需要在.bin文件头部加上数据头变成.imx文件传入IMX才能运行。

3.上述操作,可以编写make文件来实现,make文件可以实现通用,避免每增加一个文件就需要更改上述的命令。其实make文件也是实现了上述步骤,但最终是实现.bin文件。其实STM32也背地里帮你实现了make文件的功能,MDK帮你把.c文件变为.o然后变为.bin最后变为.hex文件即stm32要的执行文件,等价于IMX6的.imx文件

4.生成了.imx文件,但是如何让imx6获取到代码并执行? 这就涉及到了启动方式。IMX6的启动方式由26个IO所决定,其中有boot0,boot1和其余24个IO。boot1 - boot00 0 从FUSE启动 , 不用0 1 串行下载 , 用到但是代码定型使用到1 0 内部boot模式,用到,常用

串行下载:串行下载的意思就是可以通过 USB 或者 UART 将代码下载到板子上的外置存储设备中这个下载是需要用到 NXP 提供的一个软件,一般用来最终量产的时候将代码烧写到外置存储设备中的。

内部boot模式:在此模式下,芯片会执行内部的 boot ROM 代码,这段 boot ROM 代码会进行硬件初始化(一部分外设),然后从 boot 设 备(就是存放代码的设备、比如 SD/EMMC、NAND)中将代码拷贝出来复制到指定的 RAM 中,一般是 DDR。上面这句话看起来有点难懂,其实就是选了这个模式就先执行内部boot rom程序初始化硬件,然后根据boot0/1的选择和24个IO的选择的启动方式把从什么地方取到.imx文件。可以根据启动方式的配置,配置为从①、接到 EIM 接口的 CS0 上的 16 位 NOR Flash。②、接到 EIM 接口的 CS0 上的 OneNAND Flash。③、接到 GPMI 接口上的 MLC/SLC NAND Flash,NAND Flash 页大小支持 2KByte、4KByte和 8KByte,8 位宽。④、Quad SPI Flash。⑤、接到 USDHC 接口上的 SD/MMC/eSD/SDXC/eMMC 等设备。⑥、SPI 接口的 EEPROM。从这几个地方取.imx文件,其实就是在这几个地方启动,我现在看到的章节,原子说它用5,从SD卡启动。Boot ROM还会初始化IMX的时钟式,主频396Mhz。其实.imx文件下载到SD卡并不算完,代码最终要被放在跟IMX6u连接的DDR3(SDRAM)中,因为imx6没有内部SRAM使用,所以代码最后放到SDRAM运行了,Boot ROM 中有初始化DDR3的代码。

boot0,boot1如上,其余的24个IO,在正点原子板子上用于了LCD , 其实这24个IO用啥都没关系,它只在启动时候用于启动方式选择,后面自动变成普通IO。这个24个IO全部下拉, 实际只用其实6个。具体是哪几个我目前不去管它,只需要知道这板子上8个管脚作用。设置        启动设备0 1 x x x x x x    串行下载,可以通过 USB 烧写镜像文件。1 0 0 0 0 0 1 0    SD 卡启动。1 0 1 0 0 1 1 0    EMMC 启动。1 0 0 0 1 0 0 1    NAND FLASH 启动。

目前选SD卡启动方式

5..bin文件转化成.imx文件。也需要几个步骤,但正点原子提供了一个软件imxdownload来实现了着几个步骤,只需要把这个软件放在.bin文件同级目录下就行了,但此时观察软件名字发现是灰色,需要使用chmod 777 imxdownload来给这个软件可执行权限,发现名字变成绿色可以执行。软件是可以执行了,但如何来使用?上面说到启动设备选择SD卡,于是就用这个软件把.bin文件变成.imx文件传入到SD卡。目前软件有了,启动方式决定了,还插SD卡,拿读卡器装上SD卡,插到电脑上,选择接入到Ubuntu , 执行命令 ls /dev/sd* 看看有没有新增的sd* ,不能决定就插拔SD卡看谁在变化,找不到SD卡重启ubuntu。有SD卡文件化的文件后,执行命令 ./imxdownload led.bin /dev/sdf 就可以把.imx文件传到SD卡。注意拿空SD卡,因为会先格式化清空SD卡。

0人点赞

日记本

相关问答

arm 内部数据怎么保存到 flash ?

ARM处理器内部的数据可以通过特定的指令或编程接口保存到外部的Flash存储器中。以下是一些可能的方法:使用ARMCortex-M系列处理器的STM(StoretoFlash)指...

arm flash cortex区别?

1ARMCortex是一种处理器架构,而Flash是一种存储器技术。2ARMCortex是一种处理器架构,它定义了处理器的指令集和功能。它具有高性能、低功耗和灵活性等特点...

简述Boot Loader的功能和 启动 过程?

大多数BootLoader都包含两种不同的操作模式。启动加载模式和下载模式。(1)启动加载(Bootloading)模式:这种模式也称为“自主”模式,也即BootLoader从目...

SDRAMandBurstFlashControllersareallfeatu_作业帮

[回答]外部总线接口(EBI的)目的是确保成功之间的数据传输几个外部设备和嵌入式内存控制器的一个ARM基器件的静态存储器,SDRAM和闪存控制器突发都是功能...

ARM 仿真器有什么作用?

可以在寄存器级、用汇编语言调试你的硬件。当然用C也可以。普通在你的ARM板是完全的裸板时,即所有Flash都还没有烧写程序时(这时串口、网口都不能用),烧写必要...

请高手告诉我 arm 开发板能做什么?

用过手机吗?手机就是一套嵌入式系统。能做什么,要看你的ARM9开发板上有什么硬件资源。烧写程序是把程序烧写到开发板的FLASH中,相当于把程序拷贝到PC的硬盘...

星趣控3980是什么型号?

星趣控3980是一款高性能的工业级嵌入式计算平台,基于ARMCortex-A9双核处理器,主频1GHz,内存容量为256MBDDR3,存储容量为1GBNANDFlash。该平台具有丰富的...

arm 盒子是什么?

ARM盒子(ARMBox)是一种基于ARM架构的硬件盒子,具有高性能的性能和灵活性。它是一种尺寸较小的单板电脑,可以嵌入各种设备或系统中,如物联网设备、嵌入式系统、...

ARM 采用什么样的存储器结构?

ARM处理器采用的存储器结构包括:1.寄存器文件:ARM处理器具有多个通用寄存器,用于存储和处理数据。这些寄存器是ARM架构的关键组成部分,通常用于高速数据访问...

学嵌入式linux要先学什么?

那么这份嵌入式linux学习路线分享给大家。1、嵌入式高级C语言Linux系统LinuxUbuntu操作系统安装、使用、Linux常用命令、samba服务器、SSH远程登录GCC编译器...

 舞台膜结构  乱世奇侠 
王经理: 180-0000-0000(微信同号)
10086@qq.com
北京海淀区西三旗街道国际大厦08A座
©2024  上海羊羽卓进出口贸易有限公司  版权所有.All Rights Reserved.  |  程序由Z-BlogPHP强力驱动
网站首页
电话咨询
微信号

QQ

在线咨询真诚为您提供专业解答服务

热线

188-0000-0000
专属服务热线

微信

二维码扫一扫微信交流
顶部