用户登录  |  用户注册
首 页商业源码原创产品编程论坛
当前位置:PB创新网文章中心解决方案电子通信

Blob在S3C44B0上的移植

减小字体 增大字体 作者:佚名  来源:本站整理  发布时间:2009-01-11 00:03:21
【本文由PB创新网为您整理】
 摘要:Bootloader是嵌入式系统软件开发的第一个环节,它紧密地将软硬件衔接在一起,对于一个嵌入式设备后续的软件开发至关重要。Blob是一款功能强大的Bootloader,S3C44B0是三星公司一款基于ARM7TDMI的嵌入式通用处理器。本文详细介绍Blob在基于S3C44B0的开发板上的运行原理与移植过程。

    关键词:S3C44B0 Blob Bootloader 移值

Bootloader对于嵌入式设备来说至关重要,它涉及到许多硬件相关的知识。对于自制的嵌入式开发板,它又是不可跳过的步骤,所以很多人对于它感到很头痛。本文将以一款优秀的Bootloader Blob为例,详细讲解它的运行原理以及在S3C44B0通用处理器上的移植过程,为在嵌入式设备上的后续软件开发打下基础。

1 Blob简介

Blob是Boot Loader Object的缩写,是一款功能强大的Bootloader。它遵循GPL,源泉代码完全开放。Blob既可以用来简单的调试,也可以启动Linux kernel。Blob最初是Jan-Derk Bakker和Erik Mouw为一块名为LART(Linux Advanced Radio Terminal)的板子写的,该板使用的处理器是StrongARM SA-1100。现在Blob已经被移植到了很多CPU上,包括S3C44B0。

MBA44B0是一款基于S3C44B0的开发板。本文将以运行在MBA44B0开发板上的Blob的源代码为基础,再针对自己的开发板进行Blob的移植。

开发板的主要配置为:

*三星ARM7处理器S3C44B0;

*2MB的Flash,地址范围0x0000 0000~0x0020 0000;

*8MB的SDRAM,地址范围0x0c00 0000~0x0c80 0000;

*1个串口,2个LED灯;javascript:window.open(this.src);" style="cursor:pointer;"/>

*JTAG接口;

*晶振为6MHz,系统主频为60MHz。

2 Blob的运行过程分析

图1为Blob程序启动流程

Blob编译后的代码定义最大为64KB,并且这64KB又分成两个阶段来执行。第一阶段的代码在start.s中定义,大小为1KB,它包括从系统上电后在0x00000000地址开始执行的部分。这部分代码运行在Flash中,它包括对S3C44B0的一些寄存器的初始化和将Blob第二阶段代码从Flash拷贝到SDRAM中。除去第一阶段的1KB代码,剩下的部分都是第二阶段的代码。第二阶段的起始文件为trampoline.s,被复制到SDRAM后,就从第一阶段跳到这个文件开始执行剩余部分代码。第二阶段最大为63KB,单词trampoline词义为“蹦床”,所以在这个程序中进行一些BSS段设置,堆栈的初始化等工作后,最后跳转到main.c进入C函数。

我们的移植主要需要对上述的几个文件进行修改。在进行移植以前,首先需要对存储器的地址空间分配了解清楚。关于存储器空间的定义在/include/blob arch/mba44b0.h中。

图2为在Flash中的存储器空间分布,图3为启动后在SDRAM中的存储器空间分布。

如图2所示,2MB的Flash空间分别分配给出Blob、kernel、ramdisk。系统上电后,先执行第一阶段代码,进行相应的初始化后,将Blob第二阶段代码复制的RAM地址bloc_abs_base,然后跳转到第二阶段开始执行。

在第二阶段中,从汇编跳转到C的Main()函数,继续进行如下工作:

*外围的硬件初始化(串口,USB等);

*从Flash中将kernel加载到SDRAM的kernel区域;

*从Flash中的ramdisk加载到SDRAM的ramdisk区域;

*根据用户选择,进入命令行模块或启动kernel。

在我们使用的开发板上,kernel选用uClinux。由于Flash的存储空间有限,所以存放在Flash中的uClinux内核是经过压缩的。Blob将压缩的uClinux内核加载到SDRAM地址0x0C300000。如果选择启动uClinux,那么压缩的uClinux内核将自解压.Text段到0x0c00800(见uClinux/arch/armnommu/Makefile),然后再跳转到核处,开始运行uClinux。具体的uClinux移植在此就不详细讨论了。

在SDRAM的存储器空间分配图中,可以看到有blob_base和blob_abs_base两部分。blob_abs_base大家已经知道了,是Blob将自身的第二阶段代码复制到SDRAM所在的区域,而blob_base则是从Blob进行自升级或调试的区域。举例说明,假如Blob已经能正常运行了,但是对于Flash的擦写还不能支持得很好,就可以使用已经运行的Blob通过串口将所新编译好的Blob下载到SDRAM中该区域进行运行调试。调试通过后,可以通过Blob烧写进Flash,覆盖原来的Blob进行升级。这样就不必因为对Blob做了一点小的改动就重新烧写Flash,从而减少了烧写Flash的次数。

3 Blob的移植

对Blob的运行有了一定了解后,就可以进行Blob的具体移植了。首先要修改的start.s文件,具体工作如下:

*屏蔽掉看门狗WTCON;

*配置寄存器SYSCFG暂时关闭缓存,等Blob运行稳定后再开启提高性能;

*初始化I/O寄存器;

*屏蔽中断;

*配置PLLCON寄存器,决定系统的主频;

*调用ledasm.s,在串口未初始化时led状态对于程序是否正常运行很重要;javascript:window.open(this.src);" style="cursor:pointer;"/>

*调用memsetup-s3c44b0.s中的memsetup进行初始化存储器空间,初始化SDRAM刷新速率等;

*将第二阶段复制到SDRAM,并且跳转到第二阶段。

在ledasm.s中,提供了led的汇编的语言驱动程序。在Blob还有个led.c文件,它和ledasm.s原理一样,只不过是在C语言中调用的。修改led是为了方便初期阶段的调试。在这里根据自己的开发板进行修改。

在memsetup-s3c44b0.s中,修改MEMORY_CONFIG中设置存储器相关的配

[1] [2]  下一页

Tags:

作者:佚名

文章评论评论内容只代表网友观点,与本站立场无关!

   评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论

相关文章

PB创新网ourmis.com】Copyright © 2000-2009 . All Rights Reserved .
页面执行时间:21,984.38000 毫秒
Email:ourmis@126.com QQ:2322888 蜀ICP备05006790号