ARM裸机篇(二)——i.MX6ULL启动过程

发布者:cangart最新更新时间:2022-06-01 来源: eefocus关键字:ARM  裸机  i  MX6ULL  启动过程 手机看文章 扫描二维码
随时随地手机看文章

一、 i.MX6ULL启动流程
I.MX6U 支持多种启动方式以及启动设备,比如可以从 SD/EMMC、 NAND Flash、 QSPI Flash等启动。


i.MX6UL完整的启动流程如下图所示,完成启动任务的代码位于0x0000 0000 地址处的Boot ROM。


启动流程过程大致可分为六步。①检查CPU的ID ,②检查复 位状态,③获取启动方式,④加载程序映像,⑤校验映像,⑥跳转到映像去执行。

i.MX6ULL有四个启动模式,如下表,具体使用哪种启动模式通过内部寄存器 BOOT_MODE 中的值来选择,如图:

当 BOOT_MODE 设置为内部 BOOT 模式以后,所谓“内部”是相对于“Serial Download”来说的,“内部”可以认为是 i.MX6ULL 支持的启动存储设备,例如 emmc、 nandflash、 SD card、norFlash 等等。具体从那种“内部”设备启动,由 BOOT_CFG1[7:4] 决定,如下表所示。表内部启动方式选择:


二、i.MX6ULL镜像格式
知道启动方式后 Boot ROM 代码并不能立即加载启动映像,因为我们的代码保存在芯片外部存储设备,从这些存储设备读数据之前首先要进行初始化。在 Boot ROM 程序根据保存在芯片中的默认配置信息配置这些存储器接口。


I.MX6ULL 的最终可烧写文件组成如下:
①、 Image vector table,简称 IVT, IVT 里面包含了一系列的地址信息,这些地址信息在ROM 中按照固定的地址存放着。


②、 Boot data,启动数据,包含了镜像要拷贝到哪个地址,拷贝的大小是多少等。

 


③、 Device configuration data,简称 DCD,设备配置信息,重点是 DDR3 的初始化配置。


④、用户代码可执行文件,比如 led.bin。


最终烧写到 I.MX6U 中的程序其组成为: IVT+Boot data+DCD+.bin。


这4部分内容合并成为一个映像文件,烧写在EMMC、SD卡或TF卡等启动设备的某个固定地址,boot ROM程序去这个固定地址读出映像文件。启动设备不同,固定地址不同,如下图:

三、镜像实例
制作映像文件的起点是:我们编写的程序。制作过程中各项值的计算方法如下图所示。


按照上述的配置,板子上电后Boot Rom会根据上述的配置初始化时钟和DDR3,然后会将映像文件从启动设备(TF卡、eMMC)自动拷贝到DDR3内存上。Boot Rom应该将映像文件拷贝到内存的哪个位置,上述的配置文件已经规定好了,拷贝到DDR3中的位置和大小由Boot data数据决定,用户.bin文件的起始地址由地址entry决定,需要在链接脚本中手动配置。假设.bin文件的起始地址为0X87800000。复制结束后,CPU会从这个地址读取第一条指令开始执行程序。


四、制作镜像
假设我们已经有了一个led.S的裸机程序,然后经过编译链接到0X87800000这个地址,使用objcopy工具转换成bin文件:

arm-none-eabi-gcc -c led.S -o led.o
arm-none-eabi-ld -Ttext 0X87800000 led.o -o led.elf
arm-none-eabi-objcopy -O binary -S -g led.elf led.bin

1、确定入口地址entry:
我们的程序运行时要放在内存中哪一个位置,这是我们决定的,由于我们把程序链接到了0X87800000,所以此地址就是程序的入口地址。


2、确定映像文件在内存中的地址start:
boot ROM程序启动时,会把“Initial Load Region”读出来,“Initial load Region”里含有IVT、Boot data、DCD。boot ROM根据DCD初始化设备后,再把整个映像文件读到内存。
在启动设备上,“Initial Load Region”之后紧跟着我们的程序,反过来说就是我们程序的前面,放着“Initial Load Region”。“Initial Load Region”的大小为load_size,那么在内存中“Initial Load Region”的位置start = entry – load_size=0X87800000 - 0x1000 = 0X877FF000。

在启动设备上,“initial load region”之后紧跟着我们的程序,反过来说就是我们程序的前面,放着“initial load region”。假设“initial load region”的大小为load_size,那么在内存中“initial load region”的位置start = entry – load_size。

注意:“initial load region”位于启动设备0位置,它的头部并不是IVT,而是一些无用的数据(或是分区信息)。(在文中是4k其中1K是最前面的偏移量,里面放着存储器的分区信息,紧接着是IVT boot DATA,DCD)

3、确定IVT在内存中的地址self:
self = start + ivt_offset = 0X877FF000 + 0x400 = 0X877FF400
4、确定Boot data在内存中的地址boot_data:
IVT结构的大小是32个字节,IVT之后就是Boot data,而IVT中的boot_data值表示Boot data在内存中的位置,计算如下:
boot_data = self + 32 =0X877FF400+32=0X877FF420
5、确定DCD在内存中的地址dcd:
Boot data结构的大小是12字节,Boot data之后就是DCD,而IVT中的dcd值表示DCD在内存中的位置,计算如下:
dcd = boot_data + 12 = 0X877FF420 + 0x0C = 0X877FF42C
6、写入DCD的数据
DCD是用初始化硬件的,特别是初始化DDR。而DDR的初始化非常的复杂、专业,我们一般是使用硬件厂家提供的代码。
7、写入用户程序
经过上述7个步骤,映像文件就构建出来了,可以把它烧入启动设备。

把上述步骤,可以写成如下代码,自动为我们完成映像的制作:
imxdownload.c:

#include "stdio.h"
#include "stdlib.h"
#include "string.h"

#define SHELLCMD_LEN    (200)
#define BIN_OFFSET        (3072)

/* 此宏指明是否打印u-boot.imx的IVT DCD表信息,不同的开发板其IVT和DCD
 * 表的数据是不同的,因此需要获取所使用的开发板的IVT和DCD表信息,最
 * 简单的方法就是读取开发板配套资料里面的u-boot.imx的前1KB数据,理论上
 * 应该读取3KB的数据,但是表信息远远没有3K这么多,因此读1KB即可 
 */
#define PRINT_TAB        0    
/*
 * 介绍: 此软件是针对NXP的IMX6U系列芯片的,软件用来烧写bin文件到SD卡里面,
 *        本软件会自动添加IVT、DCD等信息到原始的bin文件里面,主要用于裸机和uboot的烧写。
 * 使用方法: 1、编译好原始的二进制bin文件,如,u-boot.bin等,并将编译好的.bin文件和本
 *             软件放置到同一个目录下!!!!
 *            2、执行命令sudo ./imxdownload
 *             如烧写u-boot.bin到/dev/sdd中即可使用如下所示命令:
 *             sudo ./imxdownload u-boot.bin /dev/sdd
 */

/* IMX6U IVT DCD表信息  暂时定义为1K Bytes,此表是读取的u-boot.imx前1K Bytes
 * imx6_ivedcd_table[9]是指明代码长度的,本应该根据实际的代码长度来修改
 * 这里为了方便,就直接定义为2M Bytes,即
 */

const int imx6_512mb_ivtdcd_table[256] = {
0X402000D1,0X87800000,0X00000000,0X877FF42C,0X877FF420,0X877FF400,0X00000000,0X00000000,
0X877FF000,0X00200000,0X00000000,0X40E801D2,0X04E401CC,0X68400C02,0XFFFFFFFF,0X6C400C02,
0XFFFFFFFF,0X70400C02,0XFFFFFFFF,0X74400C02,0XFFFFFFFF,0X78400C02,0XFFFFFFFF,0X7C400C02,
0XFFFFFFFF,0X80400C02,0XFFFFFFFF,0XB4040E02,0X00000C00,0XAC040E02,0X00000000,0X7C020E02,
0X30000000,0X50020E02,0X30000000,0X4C020E02,0X30000000,0X90040E02,0X30000000,0X88020E02,
0X30000C00,0X70020E02,0X00000000,0X60020E02,0X30000000,0X64020E02,0X30000000,0XA0040E02,
0X30000000,0X94040E02,0X00000200,0X80020E02,0X30000000,0X84020E02,0X30000000,0XB0040E02,
0X00000200,0X98040E02,0X30000000,0XA4040E02,0X30000000,0X44020E02,0X30000000,0X48020E02,
0X30000000,0X1C001B02,0X00800000,0X00081B02,0X030039A1,0X0C081B02,0X0B000300,0X3C081B02,
0X44014801,0X48081B02,0X302C4040,0X50081B02,0X343E4040,0X1C081B02,0X33333333,0X20081B02,
0X33333333,0X2C081B02,0X333333F3,0X30081B02,0X333333F3,0XC0081B02,0X09409400,0XB8081B02,
0X00080000,0X04001B02,0X2D000200,0X08001B02,0X3030331B,0X0C001B02,0XF3526B67,0X10001B02,
0X630B6DB6,0X14001B02,0XDB00FF01,0X18001B02,0X40172000,0X1C001B02,0X00800000,0X2C001B02,
0XD2260000,0X30001B02,0X23106B00,0X40001B02,0X4F000000,0X00001B02,0X00001884,0X90081B02,
0X00004000,0X1C001B02,0X32800002,0X1C001B02,0X33800000,0X1C001B02,0X31800400,0X1C001B02,
0X30802015,0X1C001B02,0X40800004,0X20001B02,0X00080000,0X18081B02,0X27020000,0X04001B02,
0X2D550200,0X04041B02,0X06100100,0X1C001B02,0X00000000,0X00000000,0X00000000,0X00000000,
0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,
0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,
0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,
0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,
0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,
0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,
0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,
0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,
0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,
0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,
0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,
0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,
0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,
0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,
0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000
};

const int imx6_256mb_ivtdcd_table[256] = {
0X402000D1,0X87800000,0X00000000,0X877FF42C,0X877FF420,0X877FF400,0X00000000,0X00000000,
0X877FF000,0X00076000,0X00000000,0X40E801D2,0X04E401CC,0X68400C02,0XFFFFFFFF,0X6C400C02,
0XFFFFFFFF,0X70400C02,0XFFFFFFFF,0X74400C02,0XFFFFFFFF,0X78400C02,0XFFFFFFFF,0X7C400C02,
0XFFFFFFFF,0X80400C02,0XFFFFFFFF,0XB4040E02,0X00000C00,0XAC040E02,0X00000000,0X7C020E02,
0X30000000,0X50020E02,0X30000000,0X4C020E02,0X30000000,0X90040E02,0X30000000,0X88020E02,
0X30000C00,0X70020E02,0X00000000,0X60020E02,0X30000000,0X64020E02,0X30000000,0XA0040E02,
0X30000000,0X94040E02,0X00000200,0X80020E02,0X30000000,0X84020E02,0X30000000,0XB0040E02,
0X00000200,0X98040E02,0X30000000,0XA4040E02,0X30000000,0X44020E02,0X30000000,0X48020E02,
0X30000000,0X1C001B02,0X00800000,0X00081B02,0X030039A1,0X0C081B02,0X04000000,0X3C081B02,
0X3C013C01,0X48081B02,0X38324040,0X50081B02,0X28304040,0X1C081B02,0X33333333,0X20081B02,
0X33333333,0X2C081B02,0X333333F3,0X30081B02,0X333333F3,0XC0081B02,0X09409400,0XB8081B02,
0X00080000,0X04001B02,0X2D000200,0X08001B02,0X3030331B,0X0C001B02,0XF352433F,0X10001B02,
0X630B6DB6,0X14001B02,0XDB00FF01,0X18001B02,0X40172000,0X1C001B02,0X00800000,0X2C001B02,
0XD2260000,0X30001B02,0X23104300,0X40001B02,0X47000000,0X00001B02,0X00001883,0X90081B02,
0X00004000,0X1C001B02,0X32800002,0X1C001B02,0X33800000,0X1C001B02,0X31800400,0X1C001B02,
0X30802015,0X1C001B02,0X40800004,0X20001B02,0X00080000,0X18081B02,0X27020000,0X04001B02,
0X2D550200,0X04041B02,0X06100100,0X1C001B02,0X00000000,0X00000000,0X00000000,0X00000000,
0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,
0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,
0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,
0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,
0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,
0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,
0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,
0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,
0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,
0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,
0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,
0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,
0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,
0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,
0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,0X00000000,
};

/*
 * 输出一些信息
 */
void message_print(void)
{    
    printf("I.MX6ULL bin download softwarern");
    printf("Edit by:zuozhongkairn");
    printf("Date:2019/6/10rn");
    printf("Version:V1.1rn");
    printf("log:V1.0 initial version,just support 512MB DDR3rn");
    printf("    V1.1 and support 256MB DDR3rn");
}

int main(int argc, char *argv[])
{
    FILE *fp;
    unsigned char *buf;
    unsigned char *cmdbuf;
    int nbytes, filelen;
    int i = 0, j = 0;
    int ddrsize = 0; /* 0为512MB,1为256MB,2为128MB...... */

[1] [2]
关键字:ARM  裸机  i  MX6ULL  启动过程 引用地址:ARM裸机篇(二)——i.MX6ULL启动过程

上一篇:瑞萨电子将展示首颗基于Cortex M85内核的RA系列MCU
下一篇:ARM64处理器缓存原理

推荐阅读最新更新时间:2024-11-17 04:53

ARM正式宣布M3免预付授权费,A75、A55采用人工智能DynamIQ技术
  今天, ARM  在北京召开媒体发布会,正式宣布对其DesignStart项目进行升级,在此前开放Cortex-M0基础上,再次开放Cortex- M3 处理器及相关IP子系统,对其免预付授权费。下面就随嵌入式小编一起来了解一下相关内容吧。   此外, ARM  还详细介绍了为人工智能时代研发的全新的DynamIQ技术。据悉该技术已经应用到 ARM  最新的 Cortex-A75处理器、ARM Cortex-A55处理器和ARM Mali-G72 图形处理器当中。    DesignStart项目升级:Cortex-M0后,Cortex- M3 正式免预付授权费   ARM 自2010年起,启动DesignStart
[嵌入式]
Arm-Linux摄像头驱动程序的移植
Arm开发板上摄像头的移植有两种方法:第一,将驱动程序添加到内核,通过编译内核,烧写到板子上;第二种,通过动态加载摄像头驱动模块的方法进行硬件的驱动。作者首先在PC的linux系统进行摄像驱动程序的移植,保证驱动程序版本正确,然后将驱动程序编译成模块,通过文件系统挂载到板子,然后进行加载,进而创建摄像头设备节点。下面将具体介绍摄像头动态加载的过程。 移植过程所使用的摄像头型号ZC301P,arm板上的内核版本为2.6.9,开发板为pxa270,所采用的驱动程序包为spca5xx-20060501.tar.gz。 第一步,使用命令解压文件: tar zxvf spca5xx-20060501.tar.gz
[单片机]
STM32CubeMX | 29-使用硬件I2C读取甲醛传感器SGP30
本篇详细的记录了如何使用STM32CubeMX配置STM32L431RCT6的硬件I2C外设读取环境光强度传感器数据(BH1750)。 1. 准备工作 开发板 首先需要准备一个开发板,这里我准备的是STM32L4的开发板(BearPi)。 SGP30传感器模块 SGP30是一款单一芯片上具有多个传感元件的金属氧化物室内气体传感器,内集成4个气体传感元件,具有完全校准的空气质量输出信号,主要是对空气质量进行检测。TVOC(Total Volatile Organic Compounds,总挥发性有机物)是一项重要指标,一般我们可以用它来反映甲醛的浓度,所以SGP主要用于甲醛的检测,另外还可以用于监测CO2浓度。 SGP
[单片机]
STM32CubeMX | 29-使用硬件<font color='red'>I</font>2C读取甲醛传感器SGP30
东芝展出i-MiEV M的锂离子充电电池
  东芝在其太平洋横滨会展中心“Smart City Week 2011”(展会日期为2011年10月26日~28日)的展区,公开了三菱汽车EV“i-MiEV M”配备的锂离子充电电池组 。   i-MiEV M的电池组平均电压为270V,容量约为10.5kWh。原来“i-MiEV”的电池组平均电压为330V、容量为16kWh。新款电池组采用的外壳与原i-MiEV相同。电池组配备平均电压为27.6V(18~32.4V)、容量为40Ah的电池模块。电池模块的尺寸为359mm×187mm×124mm,重量为15kg。    电池模块   电池模块采用了2并联×12串联共计24个东芝制造的20Ah单元。单元电压为1.5
[汽车电子]
ARM抢攻服务器芯片市场 与英特尔AI战争即将开打
在手机领域大放异彩的芯片业者ARM触角再向外延伸,其和微软(Microsoft)、惠与科技(Hewlett Packard Enterprise;HPE)等大厂合作,抢攻英特尔(Intel)独占的服务器市场,目标至2021年市占从零提高到25%,ARM与英特尔的人工智能(AI)战争即将开打。   HPE、微软和英特尔在服务器市场是盟友关系,微软与英特尔的关系起于1990年代,其结合传奇性的Wintel联盟,使得PC进入主流市场;HPE前身HP,则和英特尔携手研发64bit处理器Itanium,陆续从大型服务器到PC都采用英特尔制的处理器,如今双双发布采用ARM架构的消息。   HPE于2017年5月发表新款电脑原型机The Mac
[半导体设计/制造]
基于s3c2440实现的裸机数码相框
实现数码相框之前,要将图片转换为二进制数组,用的是Image2Lcd这个软件。将软件各选项与自己的开发板、寄存器中像素设置等设置成相同。如下图: 具体程序实现如下: #define U32 unsigned int #include gImage_xiaogou.h #include ningbo.h #include tushu.h #include bailu.h #include yejing.h #define M5D(n) ((n) & 0x1fffff) /*用于设置显示缓存区时,取低21位地址*/ #define rGPCCON (*(volatile unsigne
[单片机]
基于s3c2440实现的<font color='red'>裸机</font>数码相框
苹果收购芯片公司搅局MID市场竞争
  众所周知,随着PC市场增长的放缓以及互联网应用的普及,以接入互联网设备为主的移动设备市场或者说以互联网应用为主的智能手机市场成为厂商尤其是芯片厂商的新利润增长点。为此,英特尔前不久发布了针对MID(移动互联网接入设备)的Atom(凌动)系列处理器,并将竞争的焦点直接指向目前在智能手机市场排行老大的ARM,而随着日前苹果公司宣布收购一家名为P.A.Semi的芯片公司,使得未来智能手机芯片市场上的竞争格局变得更加复杂。   ARM强调商业模式   从日前IDF上英特尔发布的Atom系列处理器来看,英特尔认为,与竞争对手ARM相比的优势是其基于X86架构的应用要远远多于基于RISC架构的ARM处理器的应用(尤其是在互联网和多媒
[焦点新闻]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved