技 术纵 横
B 1 0 b在 ¥3 C 44B 0上的移植
■ 北京交通大学
赵 俊 良 李 哲英
关键词
¥3C44B0 Blob Bootloader 移植
Bootloader对于嵌入式设备来说至关重要,它涉及
到许多硬件相关的知识。对于自制的嵌入式开发板,它
又是不可跳过的步骤,所以很多人对于它感到很头痛。
本文将以一款优秀的Bootloader Blob为例,详细讲解它
的运行原理以及在 S3C44B0通用处理器上的移植过程,
为在嵌入式设备上的后续软件开发打下基础 。
1 B I ob简介
Blob是Boot Loader Object的缩写,是一款功能强大
的Bootloader。它遵循GPL,源代码完全开放。Blob既
可以用来简单的调试,也可以启动Linux kernel。Blob最
初是Jan-Derk Bakker和Erik Mouw为一块名为LART(Linux
Advanced Radio Termina1)的板子写的,该板使用的处理
器是StrongARM SA-llo0。现在Blob已经被移植到了很
多CPU上,包括 ¥3C44B0 a
MBA44B0是一款基于 ¥3C44B0的开发板。本文将以
运行在 MBA44B0开发板上的Blob的源代码为基础,再
针对自己的开发板进行 Blob的移植 。
开发板的主要配置为 :
◇三星ARM7处理器 ¥3C44B0:
◇2MB的Flash,地址范围0x0000 0000--0x0020 0000;
◇ 8MB的SDRAM,地址范围0x0c00 0000--0x0c80 0000;
◇ 1个串口,2个LED灯 ;
◇ JTAG接口;
◇晶振为6MHz,系统主频为60MHz。
2 BIob的运行过程分析
图 l为Bl0b程序
启动流程 。
B1Ob编译后的
代 码 定 义最 大 为
64KB,并且这64KB
又分成两个阶段来
执行 。第 一阶段的
代码在start.s中定
图 1 BIob启动文件关系
义,大小为 l KB,它包括从系统上电后在0x00000000地
址开始执行的部分。这部分代码运行在Fla sh中,它包
括对 ¥3C44B0的一些寄存器的初始化和将Blob第二阶段
代码从Flash拷贝到SDRAM中。除去第一阶段的lKB代
码,剩下的部分都是第二阶段的代码。第二阶段的起始
文件为trampoline.sI被复制到SDRAM后,就从第一阶
段跳转到这个文件开始执行剩余部分代码。第二阶段最
大为63KB,单词trampoline词义为 “蹦床”,所以在这
个程序中进行一些B s s段设置,堆栈的初始化等工作
与可靠性,以更适合于嵌入式应用环境也将是我们下一
步的目标。■
参考文献
l ANSI/IEEE Std 802.Il
2 三星公司 ¥3C4510B处理器数据手册
笪禹:硕士研究生,研究方向为无线通信、 ■LAN、Ad HOc网
络。李建 东:教授、博士生手师,从事宽带无线 I P技术、移
动通信、软件无线电、ad h O c自组织网络等方面的研究。重
敏:讲师、博士,研究方向为宽帝无线IP技术、Ad [4oc同络
中的关键技术。
(收修改稿日期:2004—04—29)
技 术 纵 横
后,最后跳转到main.c进
C函数。
我们 的移植 主要需
对上述 的几个文件进行
改。在进行移植以前,首
需要对存储器的地址空
分配了解清楚 。关于存
器空间的定义在 /includ
blob arch/mba44b0.h中 。
图2为在Flash中的存
器空间分布,图3为启动
后在 SDRAM 中的存储
器空间分布 。
如图2所示,2MB的
Flash空间分别分配给了
Blob、ker
nel、ramdisk。系
统上电后,先执行第一
阶段代码 ,进行相应的
初始化后,将Blob第二阶
段代码复制到RAM地址
blob—
abs—
base,然后跳
转到第二阶段开始执行 。
通过Blob烧写进Flash,覆盖原来的 Blob进行升级 。这
样就不必因为对 B l O b做了一点小的改动就重新烧写
Flash,从而减少了烧写Flash的次数 。
3 B I ob的移植
对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:
.1ong Oxl l 101002
进行存储器的配置,
SDRAMI ̄i]新速度配置等?/
这里需要根据不同情况进行修改?/
.1ong 0x20
.globl memsemp
定义全局标号,以便能被start.s调用 /
memsemp:
ldr r0,=MEMORY—
CONFIG
进行配置 /
ldmia r0,{rl-r13}
ldr rO,=0x01c80000
stmia r0,{rl-r13}
mov pc,lr
程序返回 /
Trampoline.S不需要进行修改。
进入Main()后,串口传输速度在结构体blob—
status
中设定 :
blob—
status.downloadSpeed= baud—
ll 5200;
blob—
status.terminalSpeed baud_l 15200;
串口的初始化相关代码定义在函数s3c44b0一
serial一
38 丰哼-J-入 ●幢▲一—_—l
技 术 纵 横
initO中,该函数在serial—s3c44b0.C中。对于¥3C44B0的串
口,一般只需要初始化下面四个寄存器串口就可以正常
工作。如果不能工作,可能是系统时钟设置不同,只需
要按照下列公式计算出divi sor:
divisor=(int)(MCLK/(baud× 1 6))一1
替换下面的divisor即可。其中MCLK为系统主频,
baud为波特率。
serial—s3c44b0.C中s3c44b0一serial—initO函数初始化串口O部分 /
REG(UFCONO)=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命令将它们组成一个完整的Bl0b二进制文件。
(1)命令行的修改
在笔者使用的Blob版本中,BackSpace不能起作用,
这对于调试非常的不方便。查阅源码,可以发现在S re/
blob/lib/command.C中,GetCommand函数中定义着人机交
互部分。将elseif(c一 ’\b’这一行修改为elseif(c ̄Ox70,
即可支持 Backspace功能。
(2)BIob的运行
如果在前面的工作中没有什么问题的话,将blOb/
src/blob/blob文件烧写进Flash后,上电就可以从串口看
到欢迎信息。加载linux内核和文件系统的后,等待几
秒,如果没有操作,将启动操作系统,否则出现提示符 :
Blob>
表示进入Blob。在该模式下提供了许多命令,可以
方便地进行硬件调试 、系统升级和系统引导。
BlOb常用的命令有 :blOb、bOOt、xdOWnload、
flashreload、dump、reblob、status等。
不同的Flash操作有所不同。笔者发现通过Blob烧
写Flash的软件有些问题,为了调试方便,决定编写自
己的Flash驱动程序。
(3)F I ash驱动程序的编写
Flash作为非易失性的存储器,在开发板上的作用是
能保存数据且掉电不丢失。和EEPROM 最大的不同在
于,对Fla sh编程不需要对特定的引脚加高电压,只是
对特定地址写入一组特定的数据即可进行编程,这样就
直接在开发板上通过软件进行擦写,不必使用特定的编
程器 。但是它的缺点也是很明显的 :操作过于复杂,
SST39VF160是 SST公司的一款 16M位的Flash,16位数
据线宽度,共2MB容量,分为5 1 2个扇区,每个扇区有
4KB,或32个块(block),每个块 64KB。对Flash编程之
前,必须对相应的扇区 、块或者整个芯片进行擦除后,
才能进行编程 。
通过S3C44B0进行Flash的烧写需要注意几点:首
先,S3C44B0外部地址总线是根据外部数据总线宽度连
接的。例如,本开发板外部数据总线为1 6位宽度,这
样S3C44B0的地址线A0就没有接入外部地址总线,而
是从A l接起。表 l所列为不同的外部数据总线宽度下,
处理器与外部存储器的地址线接法。
表 1 存储器在不同总线宽度下与 ¥3C44B0地址线的接法
存储器地址 8位数据总线时 l6位数据总线时 32位数据总线时
引脚
¥3C44B0引脚
¥3C44B0引脚
¥3C44B0引脚
A0
A0
AI
A2
Al
Al
A2
A3
A2
A2
A3
A4
A3
A3
A4
A5
对Flash编程需要对 Flash写入一个特定的时序。如
果 ¥3C44B0寻址0x5555,由于外部总线错了一位,这样
在Flash看来发过来的地址信号是0xAAAA,也就不能
正确地完成操作。注意到这一点,根据Blob自带的Flash
驱动程序,就可以很方便地改写出适合自己Fla sh驱动
程序 。
结 语
根据笔者经验介绍了Blob在 ¥3C44B0上的移植,目
前它已经能稳定地运行在开发板上 ;并且可以进行烧写
Flash,查看内存,引导uClinux等操作,为项目的后续
开发奠定了良好的基础。■
参考文献
1 刘安昱,温晓辉,刘志红.基于 ¥3C44B0的uClinux的
移植.单片机与嵌入式系统应用,2003(12)
2 杜春雷.ARM体系结构与设计.北京:清华大学出版
社,2003
3 http://www.arm.com ;http://embed.8800.org;http://bbs.
edw.com.ca
(收稿 日期 :2004—04—21)
■■—■ Mi唧 Ile &Embedded sys 39