报价
HOME
报价
正文内容
om nand flash 启动 IMX6ULL——启动流程(与stm32对比)
发布时间 : 2024-12-29
作者 : 小编
访问数量 : 23
扫码分享至微信

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

相关问答

怎样 启动flash ?

要启动Flash,您可以按照以下步骤操作:1.确保您的计算机上安装了AdobeFlashPlayer插件。如果没有安装,请先下载并安装插件。2.打开您想要启动Flash的浏览器...

怎么把 flash 设置为自 启动 ?

要把Flash设置为自启动,可以在Windows操作系统上操作。具体步骤如下:1.打开Windows操作系统的“控制面板”,在搜索框中输入“程序和功能”,然后选择...

为什么在安装adobe flash player时出现“某些文件没法被创建...

oX90Pro+举报手机MotoMotoFLASH3人讨论9685次围观关注问题写回答讨论回答(3)zxlhjzjy因为这个问题,我按照一般网页上的办法试了N次,什么删除注册...

我在stm32外加了sram和 flash 怎样让程序从片外的 flash启动 ?

方法一:从flash旧扇区,取出1k数据到ram,放到flash新的扇区;从flash旧扇区,取出第2个1k数据到ram,放到flash新的扇区;重复至取完,然后再擦除flash旧扇...方....

Adobe Captivate 启动 ,老是提示要安装 Flash Player ,怎么处理...

oX90Pro+举报手机三星三星I8974人讨论8484次围观关注问题写回答讨论回答(4)wbs1984解决的办法是在运行中输入regedit,在注册表中找到HKEY_LO...

flash 怎么使用?

使用Flash需要以下步骤:1下载和安装FlashPlayer:首先,你需要下载并安装AdobeFlashPlayer插件。你可以在Adobe官方网站上找到适用于你的操作系统和浏览器...

怎么启用 Flash ,怎么 启动 浏览器 Flash ?

您可以通过以下步骤启用Flash和启动浏览器Flash:1.打开Edge浏览器,点击右上角【...】打开菜单栏。2.在打开的菜单中再点击进入【设置】界面。3.进入浏览...

笔记本电脑 flash 怎么在运行中 启动 ?

要在运行中启动笔记本电脑的Flash,您可以按照以下步骤操作:首先,确保您的笔记本电脑已连接到电源并处于开启状态。然后,插入Flash驱动器到笔记本电脑的USB...

adobeflash使用教程?

第1步打开Internet浏览器并导航到AdobeFlash。在页的顶部Flash应用程序将发挥自动剪辑这表明如果FlashPlayer目前安装的成功部署。如果FlashPlayer是没有找...

下载完 flash 怎么玩4399?

要使用Flash玩4399小游戏,可以按照以下步骤操作:确保已经下载并安装了最新版本的FlashPlayer。可以在Adobe官方网站上下载并安装最新版本的FlashPlayer。确...

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

QQ

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

热线

188-0000-0000
专属服务热线

微信

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