基于嵌入式Linux的PMP系统设计与实现
pmp系统简介
便携式多媒体播放器(pmp),也就是通常人们所说的mp4,已成为继mp3以后消费类产品的一个新热点。pmp的主要优点是:携带方便,能够直接播放高品质音/视频文件;也可以浏览图片,以及作为移动硬盘、数字银行使用;此外,还有fm、游戏等功能。pmp播放器不仅需要对机体大小有所限制,更重要的是需要一种压缩效率更高、画面质量更高的视频压缩技术,以及相关编解码芯片。本文介绍了此pmp系统的软、硬件设计,重点在软件设计,此pmp系统方案现在已经进入量产阶段。
pmp系统的硬件设计
现阶段pmp内部核心架构,大多都是采用cpu搭配dsp的方式。其中,dsp负责编/解码工作;cpu则是针对文件管理、存取、以及使用接口、周边组件的控制等进行处理。另外,还需考虑整合硬盘、存储卡及lcd显示屏等组件,以及与外部usb接口、操控按钮间的搭配等问题。
为符合上述要求,pmp的设计需要内建视频编/解码芯片,作为模拟与数字两种信号间转换之用。另外,设计还需要考虑:用来连接视频译码器与dsp的总线;lcd显示屏的驱动电路;ide接口与硬盘控制芯片间的沟通等。
本系统整体方案是建立在tidm320基础之上的。dm320是一款支持视频编/解码的带有双cpu核的处理器。针对多媒体器件做专门的处理,它可以直接支持视频输入/输出,可以方便的扩展音频的输入/输出,支持usb,sdram,flash,cf/sd/mmc/ms/ms
pro接口。dm320的结构图,如图1所示。

ti dm320将c5409与arm926整合,即将cpu与dsp同时集成在dm320核心内。芯片采用32mb或64mb容量的sdram,以及4mb的闪存,用作加载与存放操作系统。dm320本身已内建lcd控制器、usb2.0
otg接口控制器,同时让ccir-656格式信号经由总线在视频译码芯片与dm320间传送。由于ntsc/pal编码器也被整合在其中,因此也可直接进行复合视频输出。
另一方面,dm320还可支持ccd/cmos感光组件的连接,使得未来pmp要导入dsc、dv等更为容易。对于存储卡的兼容性部分,除现阶段主流的cf、sd及mmc外,还包括memory
stick。此外,此芯片还提供2组rs232串行端口、1组jtag接口,能支持更多的外围设备。dm320硬件系统的整体框架图,如图2所示。

pmp系统的软件设计
因为要兼顾到高质量的音视频效果、多种外设和有限的系统资源,pmp软件系统的设计变得相对复杂。系统设计将软件分为三层结构,如图3所示。

该系统的最底层是操作系统层,其中包括bootloader引导程序,主要完成系统从flash的启动,logo的显示,以及os的引导。嵌入式linux主要包括适合在tidm320上运行的linux操作系统,以及各种外围设备的驱动程序。第2层为codec和mmi核层,mmi核包括第3层主gui和各种应用程序所依赖的各种框架结构和数据结构,如窗口管理,定时器管理等。codec部分包括音频的编解码程序(主要由arm实现)和图像的编解码程序(主要由dsp实现)。最上层为主gui和各种应用程序。应用程序包括:filemanager(用来浏览存储器中的文件),videoplayer(播放视频文件),audioplayer(播放音频文件),imageviewer(浏览图片),fm(收音机),games(游戏),resumes(重新播放音/视频文件)。
嵌入式linux操作系统
本系统采用的linux内核是对从internet上下载比较稳定的arm-linux内核进行相应的修改,并缩写相关外围设备的驱动程序,使之成为一个适合ti
dm320开发的操作系统环境。之所以称为嵌入式,是因为其操作系统运行的环境并不是普遍的pc,而且嵌入在非pc构架的电子设备中。
关于内核修改
kconfig文件
kconfig文件是用来对你所要加载内核内容进行配置的文件。比如,当在控制台上敲入make menuconfig,就会看到内核配置的窗口,可对其中的内容进行选择。选择[*]表示把此内容编入内核,选择[m]表示把此内容当成模块编译。linux支持动态加载内核模块的功能,甚至可以在运行操作系统一段时间后再加载内核模块。由于dm320框架并未列入内核中,所以我们需要把dm320框架加入内核。首先,就要在内核目录下./arch/arm/kconfig加入dm320的配置选项,这样才能在执行make
menuconfig配置内核时看到dm320框架。修改的部分内容如下所示:
choice
prompt"arm system type"
default arch_dm320_20//在配置arm系统时,默认的就是dm320框架。
source"arch/arm/mach-dm32020/kconfig"把dm320框架下的配置选项也引入。
同时,去掉其他cpu框架。如:
#source "arch/arm/machclps711x/kconfig"
#source "arch/arm/machintegrator/kconfig"
其中,“#”表示此行内容为注释内容。
最后,就是要把内核配置选项中对dm320开发有用的项选进来。比如:
source"drivers/char/kconfig"
if(!arch_dm320_20)
source "sound/kconfig"
endif//选择开发字符设备的驱动,而不需要声音的支持。
因为要把codec编入内核,所以我们还要加入支持codec的配置选项:
source "codecs/modules/kconfig"
同时,如果我们要加入一个新外围设备,需要在kconfig文件中加入对应的内容。比如说,要加入一个三星的4英寸tft lcd的驱动,我们可以修改./drivers/char/kconfig文件,并加入以下内容:
config dm320_samsung_4_lcd
tristate "dm320 samsung4.0 inch 16:9 tft tcd"
depends on arch_dm320_20 &&board_400h
defaulty
help
this driver provides support for samsung 4.0"16:9 tft lcd
for dm320.
其中,config dm320_samsung_4_lcd表示增加一个新的配置入口。一旦这个配置选项被选中就会在./include/linux/autoconf.h:有#define
config_dm320_samsung_4_lcd1的定义。这样的话,我们在整个内核源码树中都可以使用config_dm320_samsung_4_lcd来进行特定的选择。
在tristate"dm320 samsung 4.0 inch 16:9 tft lcd"中,引号里的内容未出现在配置选项中的提示文字。tristate表示三态,意思是除了可以选择[*]、[]外,还可以选择[m],表示把当前内容当成模块编译。
depends on arch_dm320_20&&board_400h表示如果前面配置平台框架时选择了arch_dm320_2o,并在选择型号时选择了board_400h,我们就可以看到这个对于三星4英寸tft
lcd的配置选项。
defaulty表示默认把此驱动编入内核。help的内容为当我们对内核进行配置时,选帮助所看到的内容。
makefile文件
简单地说,makefile是用来进行项目配置和管理的。我们要把linux编译,链接最后生成可执行的内核映像,makefile文件是必不可少的。
在该pmp设计开发中,只需要把外设驱动模块加入相应的内核源码树就可以完成对makefile文件的修改。以加入三星4英寸tft
lcd驱动为例,只需要在./drivers/char/makefile加入如下内容即可:
obj-$(config_dm320_samsung_4_lcd)+=dm320_lcd_samsung4.0
pmp系统设计中两个必须的驱动以及要注意的问题
lcd驱动程序
在一个pmp设备中,lcd显示屏是必备的。在lcd驱动程序的设计过程中,主要是要选好时钟源、分频系数以及时钟极性。比如在dm320中,时钟控制器有以下几个外部输入:pclk、sysclk、mxi、m48xi,其中除了m48xi外其余均27m外部晶振。lcd的时钟频率dclk在本系统中是由venc(video
encoder clock)确定,而venc又可以通过系统的pll分频而确定,所以说首先要选好时钟源和恰当的分频系数,然后通过设置venc的寄存器就可以设置时钟的极性。
framebuffer驱动
framebuffer是把显存抽象成一个设备,通过对这个设备的读写就等同于直接对显存进行操作。这种操作是抽象的、统一的。用户不必关心显存的物理位置、换页机制等具体细节,这些都是由framebuffer设备驱动程序来完成的。framebuffer对应的源文件在linux/drivers/video/目录下。全部的抽象设备文件作为fbcon.c与各种显卡驱动程序相关的源文件放在该目录下,如笔者所进行的针对dm320的framebuffer源文件dm320fb.c。在源文件我们要设置相应屏幕的长、宽以及每一个像素点的位数等等,还有一些与dm320
osd(on-screen display)相关的寄存器的设置。因为涉及内容较多,再次不再赘述。
结语
本pmp方案设计的产品已经进入量产阶段,经过大量的用户测试,证实了整个设计是切实可行的。同时,其设计思路对于其他类似产品如车载gps,都有一定的参考价值。
评论