0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

关于Blob的介绍及其在S3C44B0上的移植

电子工程师 来源:网络整理 2018-04-06 03:26 次阅读

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)的板子写的,该板使用的处理器是StrongarmSA-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灯;
◇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地址blob_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状态对于程序是否正常运行很重要;
◆ 调用memsetup-s3c44b0.s中的memsetup进行初始化存储器空间,初始化SDRAM刷新速率等;
◆ 将第二阶段复制到SDRAM,并且跳转到第二阶段。

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

在memsetup-s3c44b0.s中,修改MEMORY_CONFIG中设置存储器相关的配置,并设定SDRAM刷新速度,相关源码如下所示:
MEMORY_CONFIG:
.long 0x11101002 /*进行存储器的配置,
SDRAM刷新速度配置等*/
… /*这里需要根据不同情况进行修改*/
.long 0x20
.globl memsetup /*定义全局标号,以便能被start.s调用*/
memsetup:
ldr r0, =MEMORY_CONFIG /*进行配置*/
ldmia r0, {r1-r13}
ldr r0, =0x01c80000
stmia r0, {r1-r13}
mov pc, lr /*程序返回*/
Trampoline.s不需要进行修改。

进入Main()后,串口传输速度在结构体blob_status中设定:
blob_status.downloadSpeed = baud_115200;
blob_status.terminalSpeed = baud_115200;
串口的初始化相关代码定义在函数s3c44b0_serial_ init()中,该函数在serial-s3c44b0.c中。对于S3C44B0的串口,一般只需要初始化下面四个寄存器串口就可以正常工作。如果不能工作,可能是系统时钟设置不同,只需要按照下列公式计算出divisor:
divisor=(int)(MCLK/(baud ×16))-1
替换下面的divisor即可。其中MCLK为系统主频,baud为波特率。
/*serial-s3c44b0.c中s3c44b0_serial_init()函数初始化串口0部分*/
REG(UFCON0) = 0x0; /*关闭fifo*/
REG(ULCON0) = 0x03; /*设置数据位8,无奇偶校验,1位
停止位*/
REG(UCON0) = 0x05; /*脉冲中断,中断请求或查询模式*/
REG(UBRDIV0) = divisor;/*设置波特率*/

至此,初级移植工作已经完成,运行./configure 杦ith-board=mba-44b0-with-linux-prefix=http://www.eda-china.com/path/to/linux-src进行相关配置。在此还可以加一些开关选项进行配置,具体请参阅Blob自带文档。如果没有错误,就可以make进行编译了。如果编译正确,可在blob/src/blob下得到bin格式的Blob,将其烧写到Flash即可运行。关于Blob第一部分和第二部分的链接脚本,可以在start-ld-script和rest-ld-script.in中看到相关的链接地址,编译器是根据这些地址链接程序的。在blob/src/blob/Makefile中可以看到,两个阶段分别以blob-start和blob-rest来编译,最后通过dd命令将它们组成一个完整的Blob二进制文件。

(1)命令行的修改
在笔者使用的Blob版本中,BackSpace不能起作用,这对于调试非常的不方便。查阅源码,可以发现在src/blob/lib/command.c中,GetCommand函数中定义着人机交互部分。将else if(c ==’b’这一行修改为else if(c ==0x7f),即可支持Backspace功能。

(2)Blob的运行
如果在前面的工作中没有什么问题的话,将blob/src/blob/blob文件烧写进Flash后,上电就可以从串口看到欢迎信息。加载linux内核和文件系统的后,等待几秒,如果没有操作,将启动操作系统,否则出现提示符:
Blob>

表示进入Blob。在该模式下提供了许多命令,可以方便地进行硬件调试、系统升级和系统引导。
Blob常用的命令有:blob、boot、xdownload、flashreload、dump、reblob、status等。

不同的Flash操作有所不同。笔者发现通过Blob烧写Flash的软件有些问题,为了调试方便,决定编写自己的Flash驱动程序。

(3)Flash驱动程序的编写
Flash作为非易失性的存储器,在开发板上的作用是能保存数据且掉电不丢失。和EEPROM最大的不同在于,对Flash编程不需要对特定的引脚加高电压,只是对特定地址写入一组特定的数据即可进行编程,这样就直接在开发板上通过软件进行擦写,不必使用特定的编程器。但是它的缺点也是很明显的:操作过于复杂,SST39VF160是SST公司的一款16M位的Flash,16位数据线宽度,共2MB容量,分为512个扇区,每个扇区有4KB,或32个块(block),每个块64KB。对Flash编程之前,必须对相应的扇区、块或者整个芯片进行擦除后,才能进行编程。

通过S3C44B0进行Flash的烧写需要注意几点:首先,S3C44B0外部地址总线是根据外部数据总线宽度连接的。例如,本开发板外部数据总线为16位宽度,这样S3C44B0的地址线A0就没有接入外部地址总线,而是从A1接起。表1所列为不同的外部数据总线宽度下,处理器与外部存储器的地址线接法。


对Flash编程需要对Flash写入一个特定的时序。如果S3C44B0寻址0x5555,由于外部总线错了一位,这样在Flash看来发过来的地址信号是0xAAAA,也就不能正确地完成操作。注意到这一点,根据Blob自带的Flash驱动程序,就可以很方便地改写出适合自己Flash驱动程序。

结 语

根据笔者经验介绍了Blob在S3C44B0上的移植,目前它已经能稳定地运行在开发板上;并且可以进行烧写Flash,查看内存,引导uClinux等操作,为项目的后续开发奠定了良好的基础。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • FlaSh
    +关注

    关注

    10

    文章

    1634

    浏览量

    147973
  • ARM7
    +关注

    关注

    3

    文章

    207

    浏览量

    50351
  • bootloader
    +关注

    关注

    2

    文章

    235

    浏览量

    45618
收藏 人收藏

    评论

    相关推荐

    uCOSS3C44B0移植代码 1.0(源程

    uCOSS3C44B0移植代码 1.0(源程序)
    发表于 03-28 09:47 39次下载

    μC OS-II S3C44B0X 处理器移植

    介绍实时操作系统μC/OS-II 的特点和内核结构,给出μC/OS-II Samsung 嵌入式S3C44B0X ARM7 微处理器
    发表于 05-15 13:34 18次下载

    基于S3C44B0和μCOS-II 的CAN节点的设计

    本文将嵌入式实时操作系统μCOS-II 移植S3C44B0 的基础,将CAN 总线通讯程序作为一个模块植入μCOS-II 之中,形成一个CAN 总线智能节点。阐述了CAN 总线智
    发表于 08-06 10:35 14次下载

    基于S3C44B0的U-Boot启动分析和移植实现

    U-Boot 是sourceforge网站上的一个开源项目,是当今比较流行、功能强大的BootLoader,能支持多种体系结构。本文阐述U-Boot启动过程之后,对其S3C44B0
    发表于 08-27 09:08 37次下载

    μC/OS-ⅡS3C44B0X移植

    本文简介了一种实时多任务内核μC/OS-Ⅱ。并根据S3C44B0X 芯片的硬件特性,给出了一种把μC/OS-Ⅱ移植S3C44B0X
    发表于 08-31 11:46 18次下载

    S3C44B0中文手册,S3C44B0中文资料

    S3C44B0中文手册:S3C44B0X 的UART(通用异步收发器)单元提供两个独立的异步串行I/O 端口,每个都可以中断和DMA 两种模式下工作。它们支持的最高波特率为115.2Kbps。每个UART通道包含2
    发表于 09-10 18:53 572次下载

    为何选用SAMSUNG S3C44B0进行开发

    为何选用SAMSUNG S3C44B0进行开发   目前,ARM7芯片在国内开发的潮流是三星公司的S3C44B0S3C4510。这两款芯片各有侧重:前者着力于PDA 应用,芯片内部集成了LCD控
    发表于 02-09 17:57 45次下载

    BlobS3C2440A移植

    Blob(Boot Loader Object)是一款功能强大的Bootloader,多用于S3C44B0而少用于S3C2440A。介绍了常见的Bootloader;归纳了
    发表于 12-17 16:31 26次下载

    BlobS3C44B0移植

     摘要:Bootloader是嵌入式系统软件开发的第一个环节,它紧密地将软硬件衔接在一起,对于一个嵌入式设备后续的软件开发至关重要。Blob是一款功能强大的Bootloader,S3C44
    发表于 03-11 12:37 923次阅读
    <b class='flag-5'>Blob</b><b class='flag-5'>在</b><b class='flag-5'>S3C44B0</b><b class='flag-5'>上</b>的<b class='flag-5'>移植</b>

    S3C44B0高精度直流开关电源中的应用

    S3C44B0高精度直流开关电源中的应用 0 引言   近年来,嵌入式技术发展极为迅速,出现了以单片机、专用嵌入式ARM为核心的高集成度处理器
    发表于 02-25 10:26 1098次阅读
    <b class='flag-5'>S3C44B0</b><b class='flag-5'>在</b>高精度直流开关电源中的应用

    uCGUI如何移植S3C44B0X

    移植uCGUI到ARM处理器S3C44BOX,并编写Hello World程序,Micetek 44B0实验平台的LCD
    发表于 05-10 10:30 1994次阅读

    基于S3C44B0的串口服务器系统的设计

    为使现有的基于RS232 、RS485 或CAN 总线的串口设备以以太网的方式组网运行,文章介绍了一种基于S3C44B0 的 串口服务器 系统的设计,详细阐述了系统硬件、软件结构及其工作原理。实际
    发表于 09-01 15:16 1747次阅读
    基于<b class='flag-5'>S3C44B0</b>的串口服务器系统的设计

    S3C44B0的初始化程序的理解

    S3C44B0的初始化程序就是初始化各个关键的寄存器,建立中断向量,然后转移到主函数去执行程序。不过S3C44B0不支持地址映射,所以程序不COPY到RAM种执行。S3C44B0初始化对我们广大初学者
    发表于 09-28 11:32 1700次阅读

    基于S3C44B0开发板进行Blob移植操作和步骤

    Bootloader是嵌入式系统软件开发的第一个环节,它紧密地将软硬件衔接在一起,对于一个嵌入式设备后续的软件开发至关重要。Blob是一款功能强大的Bootloader,S3C44B0是三星公司一款基于ARM7TDMI的嵌入式通用处理器。本文详细
    的头像 发表于 10-04 17:08 1903次阅读
    基于<b class='flag-5'>S3C44B0</b>开发板进行<b class='flag-5'>Blob</b>的<b class='flag-5'>移植</b>操作和步骤

    基于S3C44B0的LCD控制及触摸屏接口设计

    电子发烧友网站提供《基于S3C44B0的LCD控制及触摸屏接口设计.pdf》资料免费下载
    发表于 10-11 09:45 0次下载
    基于<b class='flag-5'>S3C44B0</b>的LCD控制及触摸屏接口设计