imx6ull boot 启动
1.启动方式
During reset, the chip checks the power gating controller status register.
During boot, the core’s behavior is defined by the boot mode pin settings,When waking up from the low-power boot mode, the core skips
the clock settings. The boot ROM checks that the PERSISTENT_ENTRY0 。如果PERSISTENT_ENTRY0 为有效地址,则直接执行该地址,否则执行系统复位。
BOOT_MODE是在上电的时候采集 BOOT_MODE0 和BOOT_MODE1的值,采集后这2个引脚就不会影响BOOT_MODE的值了。
00模式在我们的开发过程中很少用到。在这种模式下,GPIO的值被忽略。Boot ROM会根据eFUSE的值来选择启动设备、设置启动设备。但是,对于刚出厂的芯片eFUSE值可能是错乱的、不适合你的设备的,怎么办?eFUSE中有一个值BT_FUSE_SEL,它的出厂值是0,表示eFUSE未被烧写。boot ROM程序发现BT_FUSE_SEL为0时,它会通过USB或串口来下载程序;发现BT_FUSE_SEL为1时,才会根据eFUSE的值选择启动设备,读出、运行该设备上的程序。
01模式,boot ROM程序通过USB或串口下载、运行程序,这个模式可以用来烧写EMMC等设备。当产品在出厂时通过这个模式下载、烧写出厂程序的。
10模式,称之为内部模式,简单地说就是从SD卡、EMMC等设备启动程序。
那怎么选择从sd卡 还是emmc 还是nand启动呢?imx6ull使用GPIO或者efuse来选择,同时可以设置启动设备的参数,如nandflash 的页大小,从哪个esdhc 接口启动emmc。具体如下图所示,作为软件人员只需要知道产品怎么启动即可。
作为学习使用的开发板100ask_imx6ull_mini_emmc,启动方式参考开发板手册如下:
100ASK_IMX6ULL开发板上的红色拨码开关用来设置启动方式、选择启动设备,支持这3种方式:EMMC启动、SD卡启动、USB烧写。
板子背后画有一个表格,表示这3种方式如何设置。
表格如下:
BOOT CFG | ||||
---|---|---|---|---|
BOOT | SW1(LCD_DATA5) | SW2(LCD_DATA11) | SW3(BOOT_MODE0) | SW4(BOOT_MODE1) |
EMMC | OFF | OFF | ON | OFF |
SD | ON | ON | ON | OFF |
USB | X | X | OFF | ON |
拔码开关中的SW3、SW4用来设置BOOT_MODE,ON表示0,OFF表示1。
所以当SW3、SW4设置为ON、OFF时,BOOT_MODE为0b10,将会使用SD卡、TF卡、EMMC等设备启动。
刚出厂的开发板中BT_FUSE_SEL默认为0,表示使用GPIO来设置参数。即使用LCD1_DATA07~05来选择启动设备。
100ASK_IMX6ULL开发板只支持SD/TF卡、EMMC启动,LCD1_DATA0705为0b010时选择SD/TF卡启动,LCD1_DATA0705为0b011时选择EMMC启动。这两种启动设备对应的LCD1_DATA07~06的值相同,都是0b01,这在核心板上已经通过电阻设置好,我们只需要在拨码开关上设置SW1(对应LCD1_DATA05)就可以。
IMX6ULL上有2个EMMC Flash接口,也复用为2个SD/TF卡接口,通过LCD1_DATA12~11来选择接口。0b00对应eSDHC1接口,0b01对应eSDHC2接口。LCD1_DATA12的值在核心板上已经通过电阻设置好。LCD1_DATA11的值通过拨码开关SW2来设置:ON表示0,对应eSDHC1接口,100ASK_IMX6ULL的TF卡接口使用了eSDHC1接口;OFF表示1,对应eSDHC2接口,100ASK_IMX6ULL的EMMC接口使用了eSDHC2接口。
这3种启动方式的设置示意图如下:
要注意的是,设置为USB启动时,不能插上SD卡、TF卡。
刚出厂的板子在EMMC上烧写了系统,你可以设置为EMMC启动方式。
2.启动流程
IMX6ULL一上电首先执行的是bootROM的代码,它需要从EMMC、SD/TF卡把程序复制到内存里面。那么bootROM需要知道从启动设备哪个位置读程序,读多大的程序,复制到哪里去。这些内容由IVT来告诉给bootROM
还有一个问题,IMX6ULL的boot ROM程序可以把程序读到DDR里,那需要先初始化DDR。每种板子接的DDR可能不一样,boot ROM程序需要初始化这些不同的DDR。boot ROM从哪里得到这些不同的参数?还有,IMX6ULL支持各种启动设备,比如各种Nor Flash。为了通用,boot ROM程序将会使用最保守的参数,也就是最慢的时序来访问Nor Flash。为加快启动程序,boot ROM程序可以根据我们提供的信息初始化硬件,让它以更优的参数运行。这些数据可以从Device Configuration Data ,设备配置数据(DCD)这些DCD将会跟bin文件一起打包烧写在启动设备上。boot ROM程序会从启动设备上读出DCD数据,根据DCD来写对应的寄存器以便初始化芯片。DCD中列出的是对某些寄存器的读写操作,我们可以在DCD中设置DDR控制器的寄存器值,可以在DCD中使用更优的参数设置必需的硬件。这样boot ROM程序就会帮我们初始化DDR和其他硬件,然后才可以把bin程序读到DDR中并运行。
所以一个镜像文件包含以下内容:
IVT:位于固定地址,它包含其他各部分的地址信息。
Boot data:—a table that indicates the program image location, program image size in bytes, and the plugin flag.
Device configuration data—IC configuration data
这4部分内容合并成为一个映像文件,烧写在EMMC、SD卡或TF卡等启动设备的某个固定地址,boot ROM程序去这个固定地址读出映像文件。启动设备不同,固定地址不同,如下图:
下面具体分析每项内容:
IVT表中存放一系列的地址,bootROM根据这些地址来确定文件中其他部分的存放位置等相关信息。
header: 对应E:\uboot-imx\include\imximage.h
typedef struct {uint8_t tag; //0xD1uint16_t length;//ivt大小,固定为32字节,大字节序uint8_t version;//0x40或0x41
} __attribute__((packed)) ivt_header_t;
typedef struct {ivt_header_t header;uint32_t entry; //用户程序运行时第一条指令的地址,就是程序的链接地址。uint32_t reserved1;uint32_t dcd_ptr; //映像被复制到内存后dcd数据的地址uint32_t boot_data_ptr; //映像被复制到内存后,其中的boot data的地址。uint32_t self; //映像被复制到内存后,IVT自己所在的地址。uint32_t csf; //映像被复制到内存后, Command Sequence File (CSF)的地址,该文件是被HAB libraryuint32_t reserved2;
} flash_header_v2_t;
boot data 每个成员都是32bit
typedef struct {uint32_t start;//映像文件在内存中的地址,映像文件=(1K数据,内含分区表等信息)+IVT+BootData+DCD+用户数据(bin文件)uint32_t size; //保存在启动设备上的整个映像文件的长度,从0地址开始(不是从IVT开始)。uint32_t plugin;//这是一个标记位,当它为1时表示这个映像文件是“plugin”,即插件。boot ROM程序可以支持有限的启动设备,如果你想双持更多的启动设备比如 //网络启动、CDROM启动,就需要提供对应的驱动。这些驱动就是“plugin”,如果不涉及,该标记位为0。
} boot_data_t;
Boot data就是用来表示映像文件应该被复制到哪里去,以及它的大小。boot ROM程序就是根据它来把整个映像文件复制到内存去的。
注意:start = IVT在内存中的地址 - IVT offset。假设IVT被保存在启动设备TF卡1024偏移地址处,IVT被复制到内存地址0x87000000,那么start=0x87000000-1024。所以start表示的是启动设备开头的数据,被复制到内存哪里去。从它的含义也可以推理出:boot ROM程序会把启动设备开头的数据,复制到内存;而不仅仅是从IVT开始复制。
DCD就是设备的配置信息,里面保存寄存器值。芯片复位后,在系统中的所有外设将使用默认寄存器值。然而,这些设置通常并不是实现最佳系统性能的理想设置,甚至有一些外设必须配置才能使用。DCD是程序映像中包含的配置信息,bootRom将使用这些信息来配置外设。DCD表格式如下:
Header格式如下:
typedef struct {uint8_t tag; //0xD2uint16_t length; //DCD的大小,包含头部,大字节序uint8_t version;//0x41
} __attribute__((packed)) ivt_header_t;typedef struct {ivt_header_t header;struct dcd_v2_cmd dcd_cmd;uint32_t padding[1]; /* end up on an 8-byte boundary */
} dcd_v2_t;
CMD 分为以下几种类型: Write data command Check data command NOP command Unlock command
每种类型格式不一样,等需要使用的时候具体研究。基本上是由硬件厂家提供,主要作用为:
a. 设置时钟:DDR也需要时钟,这很好理解
b. 设置引脚:DDR需要很多引脚
c. 设置DDR控制器:Multi-mode DDR controller (MMDC)
User code and data:
式不一样,等需要使用的时候具体研究。基本上是由硬件厂家提供,主要作用为:
a. 设置时钟:DDR也需要时钟,这很好理解
b. 设置引脚:DDR需要很多引脚
c. 设置DDR控制器:Multi-mode DDR controller (MMDC)
User code and data:
就是用户程序或数据,原原本本地添加到映像文件里就可以。
imx6ull boot 启动相关推荐
- Spring boot 启动后执行特定的操作
有时候我们需要在应用启动完成后执行一些特定的操作,比如: 删除一些临时文件或者Redis中的缓存 将一些字典类的数据加载到缓存,这样就不用每次去数据库中查了,有些关联数据从缓存中取得赋值就可以了,不再 ...
- Gradle 配置spring boot启动
2019独角兽企业重金招聘Python工程师标准>>> 配置插件 apply plugin: 'org.springframework.boot' 启动命令 gradle bootR ...
- Spring Boot启动过程源码分析--转
https://blog.csdn.net/dm_vincent/article/details/76735888 关于Spring Boot,已经有很多介绍其如何使用的文章了,本文从源代码(基于Sp ...
- Spring Boot 启动载入数据 CommandLineRunner
Spring Boot 启动载入数据 CommandLineRunner 实际应用中,我们会有在项目服务启动的时候就去载入一些数据或做一些事情这种需求. 为了解决这种问题.Spring Boot 为我 ...
- 在Spring Boot启动时运行代码
Spring Boot会自动为我们执行很多配置,但是迟早您将不得不做一些自定义工作. 在本文中,您将学习如何进入应用程序引导生命周期并在Spring Boot启动时执行代码 . 因此,让我们看看该框架 ...
- spring boot 启动类
做项目用到spring boot 感觉spring boot用起来比较流畅.想总结一下,别的不多说,从入口开始. spring boot启动类Application.class 不能直接放在main/ ...
- java 自动启动监听_Spring Boot 启动事件和监听器,太强大了!
大家都知道,在 Spring 框架中事件和监听无处不在,打通了 Spring 框架的任督二脉,事件和监听也是 Spring 框架必学的核心知识之一. 一般来说,我们很少会使用到应用程序事件,但我们也不 ...
- Spring Boot————Spring Boot启动流程分析
一.引言 Spring Boot 的启动虽然仅仅是执行了一个main方法,但实际上,运行流程还是比较复杂的,其中包含几个非常重要的事件回调机制.在实际生产开发中,有时候也会利用这些启动流程中的回调机制 ...
- 强大的Spring Boot启动监听器事件-初始化系统账号密码
文章目录 前言 一.SpringApplicationEvents 事件类型 1.1 ApplicationStartingEvent 1.2 ApplicationEnvironmentPrepar ...
- mac 删除 Windows 或 EFI Boot 启动盘的方法
由于我的 mac 之前装了 Windows 双系统,然后 mac 系统升级后,我想把 Windows 系统给删掉,但是发现升级 mac 系统以后不能用 Boot Camp 删除 Windows 了,然 ...
最新文章
- HTTP/HTTPS抓包工具-Fiddler
- C - 食物链 POJ - 1182
- python导入其他py文件-Python如何import其它.py文件及其函数
- 【数据挖掘】贝叶斯公式应用 拼写纠正示例分析 ( 先验概率 | 似然概率 | 后验概率 )
- NFV节省企业宽带成本—Vecloud微云
- 数学图形(2.26) 3D曲线结
- Tensorflow源码解析6 -- TensorFlow本地运行时
- java中0x07_JAVA里0X00的表示
- 进云仿美团外卖平台 v1.39源码
- centos7 python3安装numpy_centos下pip3安装numpy
- TikZ绘图示例——尺规作图: 椭圆的近似画法
- java怎么把毫秒转换成天数_关于java:如何将毫秒转换为“ hh:mm:ss”格式?
- 多目标跟踪全解析,全网最全
- 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_07 缓冲流_3_BufferedInputStream_字节缓冲...
- Codeforces Round #568 (Div. 2)A
- R语言、Meta分析、MATLAB在生态环境领域里的应用
- blender初学实用快捷键
- ASP.NET资源大全-知识分享
- MIMICIV数据库下载导入
- 银河麒麟高级服务器操作系统V10下载安装及安装docker