积分规则 网站地图 帮助中心    
嵌入式软件 单 片 机 DSP 存储器 传感控制 光电显示
嵌入式硬件 CPLD/FPGA SOPC AD/DA 接口电路 模拟设计
I C设计 通信产品 汽车电子 电源产品 消费电子 数控系统
工业控制 军工/航天 安防产品 医疗电子 计算机外设 测试测量
供应 I C
求购 公司库

  IC 求购 销售 公司 论文 DATASHEET 参考设计 论坛
当前位置: 电子技术 >> 嵌入式软件 >> Bootloader
  相关分类: LINUX | WINCE | UC/OS | Bootloader | 下载 | VXWORKS | 网络协议 | JAVA | 汇编 | 驱动设计 | Symbian | Palm OS | XP Embedded | Nucleus | DeltaOS/SMARTOS/Hope | 新产品 | 相关文章 |
基于Bootsplash嵌入式Linux启动画面定制
 
作者:kid   来源:ccidnet    点击数:377   更新时间:2007-11-7
您可以添加到网摘 让更多人关注此文章:

    

在基于linux的嵌入式仿真平台开发中,终端的美观和可定制是一个重要的问题。开机时滚动在屏幕上的字符串和单调的penguin图标,使嵌入式设备仍然脱离不了pc的痕迹,linux控制台上单调的“白纸黑字”型表现方式可谓大煞风景。改造linux控制台使之美观可定制地展示开机信息和logo成为基于嵌入式linux应用的一项重要工作。
    
开源项目bootsplash(http://www.bootsplash.org/)为解决这个问题提供了一个完美的解决方案。Boot-splash通过对内核打补丁来改变linux framebuffer控制台对图形显示的支持。通过用户空间程序来定制启动logo、设定控制台背景和显隐启动时的字符信息,甚至可以支持开机画面的动画显示。本文介绍利用splashboot打造启动画面的解决方案,涉及内核补丁、用户空间设置等方面的具体工作。

1 内核补丁和控制工具

1.1 支持bootsplash的内核补丁
   
针对不同的内核版本,bootsplash站点上给出了相应的内核补丁。我们所使用的内核版本为2.4.23,下载并给内核打上补丁:

cd /usr/src/linux
make mrproper
  patch -Np1 -i ../bootsplash-3.0.7-2.4.23.diff
  重新编译内核:
  make menuconfig
  选上如下的几个参数:
  Code maturity level options --->
  Prompt for development and/or incomplete code/drivers
  Block devices ---> RAM disk support
  Block devices ---> Initial RAM disk (initrd) support
  Console drivers ---> Video mode selection support
  Console drivers ---> Frame-buffer support --->
  Support for frame buffer devices
  VESA VGA graphics console
  Use splash screen instead of boot logo
  然后编译内核:
  make dep && make bzImage
  再把生成的内核拷贝到/boot下:
  cp arch/i386/boot/bzImage /boot/linux-bootsplash
  这样我们得到的新内核bzImage就是支持bootsplash的内核了,剩下的工作就是对bootsplash的定制了。  

1.2 安装用户空间程序
    
  下载bootsplash工具,解压安装:
  tar –zxf bootsplash-3.0.7.tar.gz
  cd  bootsplash-3.0.7/Utilities
  make
  cp fbresolution fbmngplay fbtruetype splash /sbin/

这样完成了对用户空间工具的安装,其实bootsplash分别利用如下的四个程序:splash程序是将需要在framebuffer下显示的图片资源制作成启动ram盘的工具;fbmngplay读mng文件,播放动画;fbtruetype显示truetype字体;fbresolution检查分辨率。后面提到的脚本,只是以不同参数来读取配置文件,调用上面的这几个程序。

2 开机LOGO的定制

2.1 设置splash屏幕的主题
    
前面安装好的splash用户空间程序中有一个程序splash,它需要一个配置文件来指明使用哪个图片、要不要隐藏文本信息的输出等。可以看出“theme”就是splash工具需要的配置文件、图片和其他所需要的文件的集合。有很多已经准备好的theme可供挑选,我们也可以定制theme。为了方便起见,我们下载theme-Linux.tar.bz2并以它为theme。
    
建立目录/etc/bootsplash/themes,解压Theme- Linux.tar.bz2到这个目录下,现在的目录结构应该是:
/etc/bootsplash/themes/Linux
    
读者朋友可以看看该目录下的bootsplash-1024x768.cfg来观察配置文件的格式。这个简单的文件包含的选项不多,事实上它只是清楚地表明应该显示哪幅图片、控制台显示文本的颜色和背景色以及文本信息输出的位置区域。另外,不要忘了它还可以分别指定verbose和silent模式下显示文件的位置。Silent模式禁止显示启动信息,代之以一个可选的进度条(这需要关于A外包脚本的更多设置)。基于这个配置文件,你可以自己修改以显示自己喜欢的图片和采用自己喜欢的模式。

2.2 利用splash小工具安装splash主题到initrd
    
在系统启动的早期阶段,内核还不能读写硬盘。这个阶段要显示图片,那么图片放在什么地方那?答案是把图片写到ramdisk里,这样在启动的时候才能读到,因为这时候还没有加载分区呢。当然不用担心initrd的制作,splash小工具能轻松搞定。Splash小工具能根据基于你选择的配置文件(theme)来自动产生一个initrd。所要做的就是执行如下命令:
    
   splash -s -f /etc/bootsplash/themes/arch/config /arch-1024-boot.cfg  /boot/initrd.splash
  生成的initrd.splash就是一个新的initrd。在GRUB或LILO中加入它就可以了。
  按如下的方法修改GRUB或LILO:
  在GRUB中加入或修改下面的行:
  kernel (hd0,3)/boot/vmlinuz−2.4.21−melenas root=/dev/hda4 vga=791 splash=silent
  initrd (hd0,3)/boot/initrd.splash
  在LILO中加入或修改下面的行:
  vga=791
  initrd=/boot/initrd.splash
  append=splash=silent
  来看看这几行的意义:
  vga=791: boot splash 将在1024x768 分辨率和65000 色 (16 位色)下显示。Framebuffer的设定要根据我们所使用的theme的分辨率和颜色深度来选择。
  splash=silent: 在silent模式下显示boot splash. 如果你希望用vebose模式,只需删除此行即可。Verbose模式是缺省模式。
  initrd=/boot/initrd.splash: 这行将initrd.splash调入启动ram盘(图片存于其中)。
  
更新LILO或GRUB后,就可以看到精美的启动画面。

3 启动进度条的显示

首先我们要弄清楚小工具程序progress(它是和splash程序一起拷到/sbin目录下的)。progress能够在framebuffer 设备(默认情况下是/dev/fb0)上画四边形。不带任何参数运行progress,我们可以看到该程序的可选参数列表,我们感兴趣的几个参数是:

  x: 四边形起始点的x坐标
  y: 四边形起始点的y坐标
  dx: 四边形的宽度
  dy: 四边形的高度
  color: 四边形的颜色。这是一个16进制数,于web页上表示颜色的一致。
  举例说明之:
  progress 0 0 512 384 FFFFFF
  将会在屏幕左上角画一个白色的四边形,这个四边形占据四分之一屏幕。
  progress 256 192 521 384 FCD192
  将会在屏幕正中间位置画一个黄色的四边形。
  
看这些例子的效果应该在tty终端上运行,不要在Konsole 或xterm window上看效果。

搞清楚progress的用法后,我们来看怎么把它与系统启动联系起来。通过分析Debian的启动代码,我们可以看出:它的启动脚本在每次启动完一个服务程序(xfs, cron, samba 或其他服务程序)后使用progress程序来在指定位置画指定大小的四边形。在Debian中启动脚本有两个:先执行/etc/init.d/rcS然后执行 /etc/init.d/rc。下面研究一下/etc/init.d/rcS代码,注意这个脚本一次调用各个rulevel下的脚本。我们在其中加入画四边形的代码,加入的代码用加黑表示:

    # 初始化变量j
  # j 为进度条的宽度
  j=20
  for i in /etc/rcS.d/S??*
  do
  [ ! −f $i ] &continue
  # 进度条开始
  #
  # 保证进度条宽度不超出范围
  if ((j <616))
  then
  # 此时调用progress程序,画比前一次宽一个单位
  #(15个像素)的进度条
  # x y dx dy color
  /usr/local/bin/progress 204 667 $j 21 FCD123
  let j=j+15
  fi
  # 结束进度条绘制
  case $i in
  *.sh)

  (
  trap &#8722; INT QUIT TSTP
  set start
  . $i
  )
  ;

  ;
  *)
  #遍历sh 文件后, 启动子进程
  $i start
  ;;
  esac
  done

上面的代码画出了四边形的第一部分,我们需要接着画与/etc/init.d/rc相关的第二部分。为了平滑地接着第一部分画,我们需要知道第一部分四边形画到什么位置结束的。

#
  danger_var=395
  j=danger_var
  for i in /etc/rc$runlevel.d/S*
      do
  [ ! &#8722;f $i ] &continue
  if [ $previous != N ] &[ $previous != S ]
  then
  #
  # Find start script in previous runlevel and
  # stop script in this runlevel.
  #
  suffix=${i#/etc/rc$runlevel.d/S[0&#8722;9][0&#8722;9]}
  stop=/etc/rc$runlevel.d/K[0&#8722;9][0&#8722;9]$suffix
  previous_start=/etc/rc$previous.d/S[0&#8722;9][0&#8722;9]$suffix
  #
  # If there is a start script in the previous level
  # and _no_ stop script in this level, we dont
  # have to re&#8722;start the service.
  #
  [ &#8722;f $previous_start ] &[ ! &#8722;f $stop ] &continue
  fi
  #继续进度条绘制
  #保证进度条宽度不超出范围
  if ((j <616))
  then
  /usr/local/bin/progress 204 666 $j 21 FCD123
  let j=j+15
  fi
  #结束进度条绘制
  case $runlevel in
  0|6)
  startup $i stop
  ;;
  *)
  startup $i start
  ;;
  esac
  done

这段代码以同样的方式接着画四边形进度条。但是danger_var是什么呢?前面说过为了平滑地接着第一部分画,我们需要知道第一部分四边形画到什么位置结束的。这个位置就用danger_var来记录。问题又来了,怎么将第一个脚本里的变量传到第二个脚本?可以在第一个脚本/etc/init.d/rcS的末尾加上如下的代码:

sed s/danger_var=[0&#8722;9]*/danger_var=$j/g /etc/init.d/rc > /tmp/boots
  mv /tmp/boots /etc/init.d/rc
  chmod 755 /etc/init.d/rc
   
上面的代码很清楚,获得j的值,在第二个脚本文件rc中寻找字符串“danger_var=…”并把它修改为 “danger_var=结束时的j值”,把修改后的文件另存为/tmp/boots,然后重命名为/etc/init.d/rc并改变执行权限。
    
如果选用danger_var作为变量名来传递位置值,那么注意在其他启动脚本中不能出现名字冲突。
    
现在,重启计算机,可以享受美丽的开机进度条了。

4 结论
  
通过开源项目bootsplash提供的内核补丁和各种用户空间工具,可以实现对FrameBuffer下的控制台美化和定制。这对于嵌入式仿真环境平台的开发有着重要的意义,使得嵌入式仿真环境平台从一定程度上减少PC的痕迹,成为个性化和高度可定制的平台。



相关文章
没有相关文章
热门评论排行
·江苏嵌入式Linux教育培训
·锐极LINUX驱动培训班定于
·VHDL设计中电路简化问题的
·基于实时操作系统μC/OS-
·ARM处理器应用开发4步骤

文章评论
    没有任何评论
*只显示最新10条评论。评论内容只代表网友观点,与本站立场无关。更多评论
发表评论
  * 请先[登陆]再进行评论,谢谢。
评分: 1分 2分 3分 4分 5分
内容: *
发帖须知:
一.所发文章必须遵守《互联网电子公告服务管理规定》;
二.严禁发布供求代理信息,公司介绍,产品信息等广告宣传信息;
三.严禁恶意重复发帖;
四.严禁对个人,实体,民族,国家等进行漫骂,污蔑,诽谤。
 
热点新闻 [更多]
 
“科技奥运与计算机技术的应用”研讨会
性能差异化功率器件制造面临多重挑战
探索中国特色IC业发展新模式
研祥专家做客嵌入式技术网,谈科技奥运
搭建多方交流平台 中国嵌入
Compuware Cha
中华嵌入式人才库正式运营新闻发布会
“科技奥运与计算机技术的应用”研讨会
意法半导体(ST)2007年企业责任
Diodes Incorp
 
热门下载 [更多]
 
[ ] 手把手学单片机20个例
[ ] 单片机做的智能台灯
[ ] 单片机入门书
[ ] linux系统移植开发文档
[ ] IC卡的读写程序
[ ] 8051单片机C语言彻底应用
[ 常用软件] 555定时器电路设计软件V1.2
[ 常用软件] 51定时器计算软件
[ ] ARM处理器应用开发4步骤
[ ] 实用电源电路集锦
 
论坛新帖 [更多]
 
[原创]NRF2401 NRF...
需要LM324中文资料...
[求助]大家用过lm331的可...
单片机培训班于7月12日在华北...
重磅资料-------65K色...
价格不到3元!国产“双核”51...
[转帖]关于DSP该怎么学的讨...
[转帖]在2407上实现SPW...
以常用集成块制作的声控灯光控制...
触摸式电子开关电路...

 
赞助商 [更多]
 


 

ICP许可证号:[粤 05056597]
联系电话:010-82517432 82517615 传真: 010-82517615

版权所有 Copyright © 2006 嵌入式技术网