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人点赞
日记本
海思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
相关问答
如何 启动 flashplayer?启动flashplayer方法:1、播放插件未能获得加载的权限,在IE弹出窗口提示,请允许即可。2、用360修复IE如不管用升级你的AdobeFlashPlayer3、重新升级、...
fpga怎么从 flash启动 ?在FPGA中,从Flash启动通常需要以下步骤:将FPGA的配置文件生成并存储在Flash芯片中。在FPGA启动时,读取Flash中的配置文件,并将其加载到FPGA的配置寄存器中...
flash 模式怎么开机?flash模式开机方法如下电脑进入flash模式说明电脑BIOS设置有误,用户通过重新设置电脑BIOS来解决,操作步骤如下:1、开机按end键进入Q-FLASH刷新界面;2、选...
flash 插件怎么开启?我们选择"设置"图标进入;3.接着我们点击左侧"高级设置"选项;4.在高级设置中我们找到"网页内容高级设置"并点击;5.在"...
mediatekflash是u盘 启动 吗?mediatekflash不是U盘启动。MediatekFlash(MTKFlash)是联发科技(MediaTek)公司的一款用于刷写固件的工具软件。它通常被用于联发科技芯片组驱动程序的安装...
索尼进 启动 项按什么键?索尼笔记本进入U盘启动的步骤:1、索尼笔记本位于键盘右上角有一个ASSIST的按键,首先按这个键就可以进入vaiocare的设置。2、通过按ASSIST进入到vaiocare界...
Flash 安装步骤?1、启动Flash安装程式,然后点击下一步2、接受许可协议3、在安装选项中,只需选择“在桌面上生成快捷方式”项即可4、选中安装FlashPlayer项(记住是独立的,...
怎样开启电脑的 flash ?网页一般都带有flash播放器,用网页浏览器直接打开就行,也可以下载一个flash播放器,注意看好你需要播放的flash电影的版本,播放器的版本要高于或相当于它的版...
microsoftedge浏览器怎么开启 Flash ?microsoftedge浏览器开启Flash的方法如下1、首先我们打开edge浏览器,然后点击右上角的三个点。2、然后在下拉菜单中选择“设置”。3、在设置界面中找到“默...
电脑自带的浏览器怎么开启 flash ?具体步骤如下:1.打开IE浏览器之后,点右上角的工具按钮,并选择Internet选项。2.点击程序标签,并打开管理加载项。3.打开管理加载项对话框之后,左边默...