文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>blob简介

blob简介

时间:2007-04-02  来源:sunqianpanda

1 Blob简介

Blob是“Boot loader Object”的缩写,是一款嵌入式linux引导程序。最初是Jan-Derk Bakker和 ErikMouw针对LART目标板而设计的,同其他开源代码一样,很多人未blob的发展做出了自己的贡献。到现在为止,blob已经支持多种cpu, 包括sa1100,sa1110,pxa255,pxa270等,用户可以根据目标板的特性进行定制。

它能实现以下功能:

  • 引导嵌入式linux,它可以把linux、kernel等从flash中load到Ram中执行
  • 命令行下在线更新blob、kernel和ramdisk。
  • 命令行下可以直接对物理寻址空间进行查看和修改。

可见blob除了引导系统这个基本功能外,还具备BSP开发的功能,对于嵌入式开发前期,blob是一个非常有效的工具。

2 Blob的下载

Blob的官方版本到2.0.5-pre2就不再更新了,而在sourceforge.net上却一直在不断更新。如果因某些原因无法链接以上地址,可以从下面地址下载:

  1. blob官方版本blob-2.0.5-pre2.tar.gz
  2. sourcforge2004年12月cvs版本

3 Blob的编译

对本节内容如果有疑问可以参考README。

3.1 编译环境

在编译之前要确保主机系统和是否安装了需要的软件。

  • 主机系统必须是linux
  • 交叉编译器gcc版本在2.95.2以上,因为blob针对的cpu都是arm核的,所以需要arm-linux-gcc2.95.2以上版本
  • GNU make,我安装的是3.0
  • GNU autoconf和automake,我安装的版本是autoconf 2.95和automake 1.9.5
  • 打了rmk补丁的for arm的linux kernel 2.4.x。

3.2 配置blob

在配置前,首先要运行/tools/rebuild脚本两次,或者cvs的版本“make-fMakefile.cvs”,效果是一样的,可以生成 各个目录的makefile.in和根目录下的configure。为什么两次我没有仔细研究,反正README里强调了两次。如果在第二次以后 rebuild,似乎一次就可以。

配置的过程就是运行./configure脚本,后面加入若干参数。一个典型的配置是这样的:

     ./configure --with-board=pmpxa --host=i686 --enable-xmodem \
--enable-md5 --with-commands=used
  • --with-board,表示目标板的名字,当然前提是目标板已经在源程序中已经被定制,在后面介绍如何定制目标板。
  • --host,表示主机的cpu类型,必须设置
  • --enable-*,表示这个配置生效,在blob中支持很多设备驱动,通过这种形式来进行使能,但是这个并不是必须的。
  • --with-commands=used,我在configure里定义了一个命令组叫做used,现在要使用它。

编译选项挺繁杂,想详细了解最好能看一下configure。

configure的结果可以生成makefile文件

3.3 编译blob

     make

生成的blob是“src/blob/blob”,把这个二进制文件下载到目标板程序运行起始地址即可。

利用arm-linux-objdump工具可以对编译好的二进制文件进行反汇编。

     arm-linux-objdump -D -S blob-elf32 > blob-elf32-dump

并把结果输出到blob-elf32-dump文件中,在一些调试的过程中也许用的到。

4 Blob的定制

4.1 定制自己目标板的blob

编译blob过程比较简单,但是一般不会这么巧有blob中包含的目标板能完全符合你的。所以需要定制目标板。

下面的部分参考doc/porting.txt另外加入一些我定制的经验。

定制目标板,首先要确定一些信息。目标板的.c和.h文件的名字,这里以LART目标板为例,我们要知道使用的是哪中cpu,flash用arm还是intel的,16位还是32位,还有就是带哪些外设。然后需要修改或添加以下文件:

  • configure.in
    搜索一下其他目标板声明的位置,在里面按照其他板子的模样添加自己目标板的声明,含义还是比较容易懂的,可以多看看其他目标板是如何设定的,如下:
 lart)
board_name="Delft University of Technology LART"
AC_DEFINE(LART,1,[Delft University of Technology LART])
BLOB_PLATFORM_OBJS="lart.o"
BLOB_LED_DRIVER_OBJS="led-sa11x0.o"
BLOB_LED_STARTCODE="ledasm-sa11x0.o"
BLOB_FLASH_OBJS="intel32.o"
DIAG_PLATFORM_OBJS="lart.o"
use_cpu="sa1100"
use_lcd="no"
;;

  • include/blob/arch.h
    指定目标板对应的.h文件。
 #elif defined LART
# include <blob/arch/lart.h>

  • include/blob/arch/lart.h
    可以看到,这个.h文件就是上面所指定的文件。当然如果自己写,那工作量太大了,可以根据目标板的情况,找一个和它类似的板子,复制过来修改。
    在 这里主要设置cpu速度、串口和它的波特率,各个模块在flash和ram中的位置,CPU各个寄存器的设置。其中,sdram的设置很重要,否则 blob无法正确load到ram中运行,GPIO也要小心设置,调整到正确的工作模式和初始电平,否则可能板子无法正确工作。
  • src/blob/lart.c
    添加板子的驱动,和添加.h文件一样,复制一个来修改。
  • 根据文档,如果是sa1110还要修改src/blob/memsetup-sa1110.S的起始地址,我用的是pxa255,这一步不需要了。
  • 由于添加了lart.c和lart.h所以要在它们所在目录的Makefile.am中登记一下。

完成这些工作后,重新rebuild,重新configure,这时可以添加“--with-board=lart”了。

4.2 让blob做更多事情

开源代码软件的最大好处就是我们可以根据需要进行修改。虽然blob为我们提供了很多指令和设备驱动,但是在我们使用blob的时候总会觉得不够。我们要添加一些东西,但是如果要修改,我们最好是遵循blob的结构。

4.2.1 blob的结构

blob提供了一个简单的目录结构,但是谈不上严谨,我们在这个结构里可以很方便的添加代码。看一下src目录下的结构,

     src/   blob/
lib/
commands/

  • src/blob/blob基本功能的代码。
  • src/lib/针对一些外设的驱动。
  • src/commandsblob下的命令行指令。

4.2.2 添加一个命令行指令

blob支持的命令行指令,可以在进入命令行模式后输入“help”查看。

blob支持下面这个宏:

 __commandlist(command_function,command_string,help)

关于这个宏的详情可参考doc/commandlist.txt。

通用的方法是这样:

  • 定义这个命令行指令需要调用的函数。 注意 这个函数是命令行下执行的,函数参数一定是,“intargc,char*argv[]”
  • 定义帮助字符串。
  • 用“__commandlist”添加到命令列表中。 注意 第二个参数不必和函数同名,这个字符串是命令行下输入指令。

blob还提供了一套格式化的添加指令方法。

注意src/commands目录,每一个.c文件就是一条指令。但是在这里添加指令,函数名,和帮助字符串的命名就都有专门的规定。

比如添加的指令是“download”,那么函数名必须是“download_cmd”,帮助必须是“download_help”,而且不必用“__commandlist”宏,编译的时候脚本“make_commands.sh”脚本会自动生成。

这种方法还需要在configure.in中添加这条指令到blob_commands中去。blob_commands是根据配置生成的指令列 表,比如如果“--with-command=all”,那么blob_commands=all_commands。所以你的指令可以根据需要放在适当 的列表中,如果是和某个模块相关,那么你可以参考“xdownload”是如何和“--enable-xmode”关联的。

4.2.3 添加一个设备驱动

如果目标板带lcd,我希望在blob的启动过程中在LCD上显示一些logo,应该如果做呢?

  • 首先在src/lib下建立lcd的源代码,编写驱动程序。
  • src/blob/initcall.c里面可以看到初始化的过程中调用的所有程序,把lcd_init照样子添加进去。
  • 具体要在lcd上显示什么东西,就看在lcd_init函数里如何编写了。如果要做到类似linux启动logo那样的效果,那就要参考linux是如何实现的了,实际上也很简单。
相关阅读 更多 +
排行榜 更多 +
暗夜格斗手游

暗夜格斗手游

棋牌卡牌 下载
魔渊之刃手游

魔渊之刃手游

角色扮演 下载
像素火影次世代手游版

像素火影次世代手游版

体育竞技 下载