您好,  [请登录] [QQ登录]  [支付宝登录[免费注册]

商品分类

分享到: 百度搜藏 搜狐微博 新浪微博 腾讯微博 QQ收藏 人人网 Facebook Twitter

Blob在S3C44B0上的移植

发布日期:2011-04-20

  择要 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灯;
  ◇ JTAG接口;
  ◇ 晶振为6MHz,体系主频为60MHz。

2  Blob的运行进程阐发

  图1为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  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=/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所列为差别的外部数据总线宽度下,处理惩罚器与外部存储器的地点线接法。

表1  存储器在差别总线宽度下与S3C44B0地点线的接法

  对Flash编程必要对Flash写入一个特定的时序。要是S3C44B0寻址0x5555,由于外部总线错了一位,如许在Flash看来发过来的地点信号是0xAAAA,也就不克不及精确地完成操纵。细致到这一点,根据Blob自带的Flash驱动步伐,就可以很方便地改写出得当本身Flash驱动步伐。

结语

  根据笔者经历先容了Blob在S3C44B0上的移植,如今它已经能稳固地运行在开辟板上;并且可以举行烧写Flash,查察内存,引导uClinux等操纵,为项目标后续开辟奠定了精良的底子。

参考文献

1  刘安昱,温晓辉,刘志红. 基于S3C44B0的uClinux的移植. 单片机与嵌入式体系应用,2003(12)
2  杜春雷. ARM体系布局与计划. 北京:清华大学出版社,2003