本博客倡导开放源代码,在此公布之程序源代码如无特别声明均采用GNU通用公共 许可证(GPL)

乐在其中

分享学习Linux的乐趣

  IT博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  23 随笔 :: 0 文章 :: 401 评论 :: 0 Trackbacks
这段时间忙于研究工具链的升级、搭建QEMU编译和测试环境以及给Samba瘦身等等,没有及时更新博客,会在后续博文中给大家一一分享。

有朋友可能会问:为什么要自己费劲编译各种软件包,Optware不是提供大量交叉编译好的软件包吗?这得从海信MP800H播放机的局限性说起。

这款播放机是较早的产品,采用的是NOR闪存来存储固件,成本高因此配备的容量较低,只有16M。而较新的播放机多采用NAND闪存,比NOR成本低,容量可以做得更大(比如MP801H配备了256M的NAND闪存)。16M的空间里系统引导程序(Bootloader)和急救程序占了1280K,/usr/local/etc文件系统占了384K,在剩下的14.4M空间里要挤进Linux内核(约4M)、音频驱动(约1.8M)、视频驱动(约2.1M)以及根文件系统(约44M),看起来似乎是不可完成的任务。其实上面四大件经过压缩以后总共只有12M,所以我们还有2.4M的闪存空间可用,按照4:1的压缩比估算还可以挤进9.6M的内容。

因此在对MP800H进行扩展时,软件包的大小成为一个极其重要的考虑因素。Optware的软件包都是连接的/opt/lib下的动态库,其中包括uclibc。如果在固件中使用optware,则需要安装两套uclibc,这不仅浪费了宝贵的flash存储,也浪费了内存,因为内存中要加载两套uclibc。自己编译软件包可以确保只使用一套动态连接库,并且可以对软件包的大小进行优化。

前面在《固件解析》中已经提到,我们可以通过修改固件安装包里package1目录下有三个文件来制作自己的固件。这三个文件就是
  1. Linux内核:vmlinux.develop.avhdd.mars.bin.lzma
  2. 根文件系统:squashfs1.img
  3. /usr/local/etc文件系统:usr.local.etc.tar.bz2
关于内核的定制请参考《编译内核》。根文件系统的制作要用到squashfs工具中的mksquashfs命令。需要注意的是播放机内核中的squashfs的版本是3.1,因此一定要使用3.x版的工具(3.0和3.4都可以)来制作squashfs1.img,如果用4.0版的mksquashfs,内核将无法挂载根文件系统。至于/usr/local/etc文件系统,它是播放机上唯一可写的闪存分区,用于存放一些允许修改的配置文件。我们可以根据需要对/usr/local/etc进行定制,不过它的容量只有384K。

自己刷固件极有可能把播放机变砖,刷机前请一定准备好串口线。关于如何通过串口线救活砖机,请看蓝媒论坛dragon版主的大作《MP800H串口刷机指南》
posted on 2010-04-10 22:24 gouzhuang 阅读(1814) 评论(5)  编辑 收藏 引用 所属分类: 嵌入式Linux

评论

# re: 关于固件制作 2010-06-23 12:52 无瑕
什么时候发个完整的固件包给大家啊,不喜欢usb夸张.  回复  更多评论
  

# re: 关于固件制作 2010-10-06 13:20 hibaby
想问下本机环境下,中文目录怎么才能支持。
应用程序诸如vsftp等都没问题,但是在shell下,如ls命令无法识别。  回复  更多评论
  

# re: 关于固件制作 2010-10-06 15:38 gouzhuang
@hibaby
你说的ls命令无法识别,是不是显示乱码?其实这是文件名的编码方式和telnet客户端的编码方式不一致造成的,比如文件名用gb2312编码而telnet客户端用utf8编码。这个问题可以通过两端使用一致的编码来解决。但是目前shell下还是不支持输入中文,以及中文文件名自动完成。  回复  更多评论
  

# re: 关于固件制作 2010-10-06 16:17 hibaby
@gouzhuang
可是很奇怪的是,在lftp下,远程目录的中文文件名显示正常,但本地的中文文件名却只能显示???
而且,mget命令下载远程文件的时候,也无法操作。
  回复  更多评论
  

只有注册用户登录后才能发表评论。