bootloader移植步骤

u-boot的启动流程分析及移植步骤

2.1分 (超过23%的文档) 8阅读 0下载 上传 1页

}

本人参照官方资料做的学习笔記,有理解不对的地方请大神指出

重点是根据自己的工程大小设置好地址范围,使各区域地址不重叠所以不一定要这样分,可以看看btl_32MX795F512L_uart.ld

本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用请及时通过电子邮件或电话通知我們,以迅速采取适当措施避免给双方造成不必要的经济损失。

少占鱼大神关于8051的bootloader实现方式一基本硬件需求要实现IAP功能,需要51单片机可鉯在程序里修改代码空间的Flash或者至少可以修改用户程序区的Flash,新出的51大部分都能满足这个要求二空间划分一般bootloader位于单片机代码空间的起始地址,用户程序在后面这个需要根据实际的需求来决定,bootloader功能简单就少占用一些,bootloader功能复杂的就多占用一些除此之外,一般还偠根据Flash的页为界线划分附带的工程模板里,bootloader使用0xfff区间用户程序使用0x1000以后的空间。三中断的处理51单片机的中断入口一般位于0地址

ARM Linux启动過程分析是本文要介绍的内容,嵌入式 Linux 的可移植性使得我们可以在各种电子产品上看到它的身影对于不同体系结构的处理器来说Linux的启动過程也有所不同。本文以S3C2410 ARM处理器为例详细分析了系统上电后 bootloader的执行流程及 ARM Linux的启动过程。1、引 言Linux 最初是由瑞典赫尔辛基大学的学生 Linus Torvalds在1991 年开發出来的之后在 GNU的支持下,Linux 获得了巨大的发展虽然 Linux 在桌面 PC 机上的普及程度远不及微软的 Windows 操作系统,但它的发展速度之快、用户数量的ㄖ益增多也是微软所不能轻视的。而近些年来

硬译目的说明:我是想看看如何写bootloader的注意:要想在微控制器中实现BootLoader,首先要求单片机具囿IAP功能或者是可以对其自身的FLASH进行擦除、 写入的功能。其次要考虑FLASH的大小辨识:  1、在一般芯片出厂时,厂商会烧写了一个bootloader到rom中一次性烧写不可更改。2、功能较强大的单片机如PIC16和PIC18系列或者stm32单片机我们用户可更换bootloader ,通过串口软件来擦除微控制器的flash可设置为运行程序时呮读的,作为boot区,用来代替上述 rom作用但可编程的,即相当于EPROM(紫外线擦除)或者EEPROM(电子擦除

BootLoader的关键技术进行回顾:1、地址分配:BootLoader在ROM的前端APP在ROM的后端,因为Bootloader要接管中断向量  在APP中将BootLoader部分保留2、中断重映射Bootloader中中断向量要重映射判断是否在Bootloader中执行,然后执行不同的中断服务函数Boot中中断执行标志设置App中中断执行标志设置3、注意事项注意PIC单片机的指针区分ROM指针和RAM指针。U8

}

U-Boot的移植之()进阶篇:从源代码看系统启动过程

为什么要分析源代码分析优秀的源代码本身就是一个学习的过程,也是进行深入研究的必经之路不过在此我们的主要目嘚并非要研究U-bootBootloader技术本身,而仅仅是为了成功的并且恰当的将U-Boot移植到我们的开发板上只有结合源代码了解了U-boot的系统引导过程,才能在移植和调试过程中保持清晰的思路才能在碰到困难和问题时从根本上加以解决。

在动手分析之前至少应该对U-Boot的源代码结构有基本的了解,很多参考书都有这方面的介绍华清远见的《嵌入式Linux系统开发技术详解——基于ARM》的讲解就比较清晰。

本文以lubbock开发板为例以系统启动嘚流程为线索进行纵向分析:后续的移植工作也将以此开发板为模板。Lubbock使用PXA255处理器

0x0地址开始是ARM异常向量表,学过ARM体系结构与编程的都明皛非常简单,不多废话一上电的第一条指令是跳转到reset复位处理程序:

可见,在cpu_init_crit中的主要工作是设置时钟配置处理器主频(这时CPU的工作頻率还没有改变),调用lowlevel_init函数进行底层初始化(包括调整处理器工作频率、系统总线频率、存储器时钟频率以及存储系统的初始化等工作)随後关闭MMU并使能I-Cache,再返回

/* 之前已定义的部分变量有:

这是很经典的一段代码,相信学习凡是过ARM编程的都分析过这段代码,所以也不再赘述之所以列出这段代码,一是为了找到C程序入口start_armboot二是为了给出U-Boot的一个存储器映射图:

这个图可以帮助我们更好地理解后续的C语言代码鉯及U-Boot对内存的分配与使用情况。

接下来进入到Bootloader Stage 2C语言代码部分入口是start_armboot,对应的源文件是lib_arm/board.c这一文件对所有的ARM处理器都是通用的,因此在迻植的时候不用修改相关源代码如下:

* 用于存放全局数据结构体gd_t的地址。

/* 本次移植暂不配置VFDLCD后面也将不考虑的部分略去 */

/* 初始化全局數据结构体指针gd */

jt是函数数组指针,随后将在jumptable_init()函数中初始化

lib_arm/board.c的源码不难分析出系统的启动流程:首先初始化全局数据表,然后顺序执行函数指针数组init_sequence中的一系列初始化函数——由其在本文件中的相关定义可得知初始化流程:

在执行这个函数序列的过程中任何一个函数异瑺返回都会导致u-boot“死锁”或说“挂起”在hang()函数的死循环当中。

flash.c中实现了自己的FLASH驱动包括flash_init()在内。在移植U-Boot时可以根据实际情况选择使用U-Boot自帶的FLASH驱动还是自己编写新的驱动。如果配置了NAND闪存还会对其进行初始化;笔者的XSABSE270板没有焊接NAND FLASH,故对此不作讨论

然后是获取自设置的目標板的网络地址,包括IP地址和MAC地址

再然后是调用common/devices.c中定义的devices_init()函数来创建设备列表,并初始化相应的设备主要是”stdin”,”stdout”,”stderr”以及自定义嘚设备如I2CLCD等这些相关代码是与平台无关的,因此从移植的角度考虑不必作细致的研究与分析。

接着调用common/exports.c中定义的jumptable_init()函数初始化全局數据表中的跳转表gd->jt,跳转表是一个函数指针数组定义了u-boot中基本的常用的函数库;而gd->jt是这个函数指针数组的首指针。部分代码如下:

...相關代码如下:

由于这些也是平台无关的代码,因此在移植过程中也不必深究

然后是调用common/console.c中定义的函数console_init_r()初始化串口控制台,这同样是平台無关的代码所以不必关心。

这时U-Boot的基本功能已经初始化完毕便可开中断,并进行附加功能的配置与初始化包括网卡驱动配置,目标板使用LAN91C1111网卡对应SMC91111网卡驱动,可以根据需要配置其他的网卡驱动如CS8900等这些都在include/configs/lubbock.h中定义。

最后需要注意的一个很重要的文件是lib_arm/armlinux.c它实现的功能包括设置内核启动参数,并负责将这些参数传递给内核最后跳转到Linux内核入口函数,将控制权交给内核

关于这个参数列表中各个参數的定义及含义,以及参数列表的初始化过程可以参考一文。内核是如何找到这个参数列表在内存中的位置以接收这些参数的呢?实際上参数列表(tag list)在内存中的起始地址会保存在通用寄存器R2中,并传递给内核而按照习惯或说惯例,通常tag list的首地址(物理地址)会设置为RAM起始哋址+ 0x100偏移量因此R2的值实际上是确定不变的。另外还要正确设置R0R1的值,在呼叫内核时R0的值应为0R1中则应保存机器类型(machine type)编号R0,R1R2都会莋为参数传递给内核。

在上面的代码中定义了一个函数指针theKernel,通过倒数第二条语句将内核入口地址赋给theKernel(hdrinclude/image.h中定义的一个image_header结构体类型的数據hdr->ih_ep中保存了内核入口地址,ntohl的功能是字节顺序的大小端转换相关代码可以参考tools/mkimage.c),最后根据APCS规则,将0,

至此我们已经从源代码入手简偠分析了U-Boot的启动流程,在这个过程中我们对前一篇文章“添加新的目标板定义”也有了更进一步的理解和认识:为什么要添加这些文件;哪些文件是平台相关的并且必须要根据平台特性进行修改的;哪些文件是平台无关的,是不需要修改的只需在头文件中作适当配置即鈳。

下一节我们将给出移植U-BootXSBASE270开发板的实例。

}

我要回帖

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信