imx6ull(0):烧录、启动

参考内容:

i.MX6ULL Applications Processors for Industrial Products

i.MX6ULLApplicationsProcessorReferenceManual

正点原子 I.MX6U嵌入式Linux驱动开发指南

以及 广大工程师们在互联网上分享的学习笔记(一样东西学的人多的时候所带来的优势)

例如这里我用的野火的板子但是看的原子的资料,在csdn就遇到一个老哥和我一样的情况:Mars.CN-CSDN博客

一、启动模式

这里做个类比,以下情况应该mcu开发者都遇到过,例如用51单片机的时候,有个io口(EA)来选择是从内部的rom启动程序,还是从外部的rom启动,stm32f103也有类似的引脚:boot0和boot1,可用来决定复位后从主闪存(就平时开发烧录进去的位置,地址)或者系统存储区启动。

imx6ull这里也一样,这里对应相关硬件引脚和对应的启动模式可查看官方的这个文档:

官方的文档内容比较多这里不贴上来,里面介绍了各种启动模式(不仅仅是启动模式,例如是emmc的话还包括emmc位宽,emmc模式,使用哪个总线这些,可以当作启动模式+配置,相关的引脚达25个)对应引脚应该是什么电平状态,硬件工程师根据自己的需求设计了自己的启动电路,这里以原子的资料为例子(其他家的也有自己的启动电路):

这是两个boot mode引脚对应的作用,例如想使用烧录模式则需要设置为01,而启动(非efuse)则是对应的10,结合下面这个图,该图则是正点原子的拨码开关对应的功能图:

其中1和2对应的就是上面两个boot mode引脚,这里不纠结太多,对应我买野火的板子则只需要参考野火的拨码开关对应的功能图即可。

二、烧录程序

这里学习为目的,所以个人选择一种最简单最快的方式:从sd卡启动的方式,只需要把我需要的程序烧录到sd卡里然后拨码开关拨到从sd卡启动,也尝试过野火资料里使用官方的烧录工具但是坚持了一天后发现还是原子资料里的烧录方式香,这里为了快速上手都图个快和方便,后面烧录uboot的时候就使用这个方式。

详细工具使用参考原子文档第八章:

三、启动流程

了解对于后面理解uboot的执行流程有一些帮助,毕业前后那会看韦老师的资料用的s3c2440,该主控在设置为nand flash启动的时候,上电时会自动将 nand flash 中前 4KB 的数据拷贝到该片内 sram执行,也就是说它的boot程序第一阶段是从sram里执行,用到了外部dram还需要在这部分代码里去配置,因为4k的空间肯定是不够执行完用户的boot程序,所以还需要将nand flash里的boot程序拷贝到外部dram,然后程序再从dram里启动,这个s3c2440的uboot里代码重定位的过程,但是imx6ull的uboot里重定位是将uboot从DDR起始部分的位置重定位到DDR最靠近结束地址的位置,也就是说imx6ull的uboot启动的时候就是在DDR里启动的,用户程序没有在内部ram里执行过,那就是说是内部rom程序把uboot固件拷贝到DDR里运行,所以这里问题会有问题:

1、程序是烧录在外部存储介质里如emmc、sd卡之类里面,内部rom怎么知道从哪里搬运固件?

2、DDR又是怎么被初始化,又怎么知道拷贝的固件多大?

第一个问题前面启动模式里已经回答了,通过一些引脚的电平确定了使用的外部存储介质,包括它们的初始化设置。

第二个问题则是在uboot的固件头里面,如果编译出来的uboot程序直接烧录进去是起不来的,这里用的原子提供的一个烧录工具则做了这个事情,个人倾向于用这个比野火资料里提供的原厂工具简单多了。

这里参考原子文档第八章:

固件头的内容主要有:

1.IVT:

这个header是IVT这个字段的大小信息,内容主要为:

entry:入口地址,也就是uboot固件里的程序的第一行指令的执行地址,即链接地址,有这个就知道运行的时候从哪个地址开始执行。

dcd:dcd字段的绝对地址。

boot data:boot data字段的绝对地址。

self:uboot固件被拷贝到DDR里后的IVT的地址。

csf:如上图描述secure boot用到。

2.boot data

start:固件头起始地址,也就是编译出来的这个固件加了固件头后的起始地址。

length:固件的大小,这里个人认为就是根据这个大小来决定拷贝多少固件到内存里。

plugin:暂时不知道做什么用的可能是额外执行的固件。

3.DCD:Device configuration data

复位后的寄存器使用默认值,因此这里可以用来设置寄存器的初始值,这里就回答了前面的问题,DDR是如何初始化的。

相关推荐
凉、介21 小时前
静态路由探究
网络·笔记·操作系统·嵌入式
网易独家音乐人Mike Zhou1 天前
【RealMCU】瑞昱官方LOG信息保存及解析,DebugAnalyzer自动化接收脚本(不需要用到ROM.trace文件)
单片机·mcu·物联网·自动化·嵌入式·iot·瑞昱
charlie1145141912 天前
嵌入式C++教程——ETL(Embedded Template Library)
开发语言·c++·笔记·学习·嵌入式·etl
良许Linux2 天前
51单片机都有哪些优缺点
单片机·程序员·嵌入式·编程
嵌入小生0072 天前
数据结构 | 常用排序算法大全及二分查找
linux·数据结构·算法·vim·排序算法·嵌入式
梵刹古音3 天前
【C语言】 结构化编程与选择结构
c语言·开发语言·嵌入式
百锦再3 天前
《C#上位机开发从门外到门内》2-7:网络通信(TCP/IP、UDP)
tcp/ip·udp·c#·嵌入式·上位机·通信·下位机
嵌入小生0073 天前
数据结构与算法 | 完全二叉树的实现、哈希表的实现
linux·c语言·数据结构·算法·vim·嵌入式
梵刹古音5 天前
【C语言】 浮点型(实型)变量
c语言·开发语言·嵌入式
良许Linux5 天前
DSP的选型和应用
后端·stm32·单片机·程序员·嵌入式