海思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人点赞
日记本
相关问答
怎么把 flash 设置为自 启动 ?要把Flash设置为自启动,可以在Windows操作系统上操作。具体步骤如下:1.打开Windows操作系统的“控制面板”,在搜索框中输入“程序和功能”,然后选择...
笔记本电脑 flash 怎么在运行中 启动 ?要在运行中启动笔记本电脑的Flash,您可以按照以下步骤操作:首先,确保您的笔记本电脑已连接到电源并处于开启状态。然后,插入Flash驱动器到笔记本电脑的USB...
我在stm32外加了sram和 flash 怎样让程序从片外的 flash启动 ?方法一:从flash旧扇区,取出1k数据到ram,放到flash新的扇区;从flash旧扇区,取出第2个1k数据到ram,放到flash新的扇区;重复至取完,然后再擦除flash旧扇...方....
电脑 flash 开机自动 启动 怎么办?要取消电脑flash开机自动启动,首先需要打开任务管理器,找到启动选项卡,然后找到flash相关的程序,右键点击选择禁用即可。如果不确定具体是哪个程序,可以通过...
如何 启动 flashplayer?启动flashplayer方法:1、播放插件未能获得加载的权限,在IE弹出窗口提示,请允许即可。2、用360修复IE如不管用升级你的AdobeFlashPlayer3、重新升级、...
Flash 安装步骤?1、启动Flash安装程式,然后点击下一步2、接受许可协议3、在安装选项中,只需选择“在桌面上生成快捷方式”项即可4、选中安装FlashPlayer项(记住是独立的,...
flash 组合快捷键是什么?工具材料:Flash所有版本操作方法01【FLASH快捷键一】A箭头L套索H移动M放大镜I墨水瓶U油漆桶P铅笔B笔刷N直线T文字O...工具材料:...
怎么制作 flash 动画[最佳回答]Flash基础一、界面介绍启动Flash后,Flash的界面主要有菜单栏、标准工具栏、左边的工具箱、左下角的工具选项、最下面的状态栏。菜单栏包含...
求教awdflash的使用方法,详细些,我是初學者。-ZOL问答如果你要升级的bios文件和awdflash一个目录,叫做a.bin直接在dos下面输入“awdflasha.bin”就行了(格式awdflash空格文件路径),回车后,只显示:...
怎么 启动 adobe flsyer player?flashplayer是自动启动的。因为flash是个插件,当其他软件需要使用flash的时候会自动激发启动。flashplayer是自动启动的。因为flash是个插件,当其他软件需...