基于arm9的流媒体播放器的设计课程设计学位论文.docx
《基于arm9的流媒体播放器的设计课程设计学位论文.docx》由会员分享,可在线阅读,更多相关《基于arm9的流媒体播放器的设计课程设计学位论文.docx(33页珍藏版)》请在冰豆网上搜索。
基于arm9的流媒体播放器的设计课程设计学位论文
基于嵌入式ARM920T的视频播放器设计
摘要
嵌入式技术已经成为了后PC时代的核心技术,而基于嵌入式技术的便携式视频播放器由于体积小、重量轻、携带方便等特点,具有极广的市场前景,所以嵌入式视频播放器成为了现在IT行业研究的热点。
本文提出了一种基于ARM9处理器,以嵌入式Linux为底层操作平台的嵌入式视频播放器的设计方案。
本文首先介绍了视频播放器软硬件的整体设计方案,然后详细介绍了如何通过移植Bootload、Linux内核和制作根文件系统来完成搭建视频播放器底层操作平台的工作,最后通过移植开源的多媒体播放器软件MPlayer和设计相关控件完成了整个视频播放器的设计工作。
最后,总结了论文所做的工作,指出了嵌入式播放器所需要进一步解决和完善的问题。
关键词:
嵌入式,视频播放器,嵌入式Linux,ARM920T
DesignofVideoPlayerBasedonEmbeddedARM920T
Abstract
Embeddedtechnologyhasbecomethecoretechnologyofthepost-PCera,andbasedonembeddedtechnologyofportablevideoplayerforsmallvolume,lightweight,convenienttocarryhaveaverywideprospectofmarket,andsoembeddedvideoplayertobecomearesearchfocusoftheITindustry.Thispaperputsforwardakindofembeddedvideoplayerdesignscheme,theschemeisbasedontheARM9processor,andtheEmbeddedLinuxastheunderlyingoperatingplatform.
Thispaperfirstintroducedthevideoplayeroveralldesignschemeofsoftwareandhardware,thendetailedindetailhowtotransplantBootloader,Linuxkernelandmakearootfilesystemtocompletetheworktobuildavideoplayerunderlyingoperatingplatform,finally,throughtransplantationofopensourcemultimediaplayersoftwareMPlayeranddesigncontrolstocompletethedesignworkofthevideoplayer.
Finally,summarizetheworkofthispaper,pointsouttheembeddedplayerwhichneedtobesolvedandperfectedproblem.
Keywords:
Embedded,Videoplayer,EmbeddedLinux,ARM
第一章引言
1.1研究背景
伴随着半导体技术、计算机技术、网络技术和软件技术的飞速发展,现如今,我们已经进入了后PC时代。
在这一阶段电子产品的发展趋势是智能化、数字化、网络化、便携轻巧、易于操作,而嵌入式技术(EmbeddedTechnology)的发展为人们提供了一个很好的解决方案。
所谓嵌入式是指以应用为中心,以计算机技术为基础,软件、硬件可裁剪,适用于应用系统对功能、可靠性、成本、体积、功耗有严格要求的专用计算机系统[1]。
嵌入式技术已经被广泛的应用于科学研究、工程设计、军事领域和文艺商业的方方面面,嵌入式产品更是随处可见,比如消费电子产品、车载电子设备、智能家电、MP3、MP4等。
如今人们随着生活水平的提高,对视听享受方面的要求也越来越高,人们不单仅仅满足于在电脑上或电视上欣赏高品质的音视频,也渴望能够随时随地的欣赏音乐观看电影,所以基于嵌入式技术的便携式多媒体播放器也成为了现今IT界研究的热点之一。
面对广阔的市场需求,海内外的各大厂商也在积极研发自己的产品以抢占市场。
基于这一背景,本文提出了一款基于嵌入式Linux操作系统和ARM处理器的视频播放器设计方案。
1.2发展状况和研究意义
自从2002年法国的爱可视推出全球第一款MP4——多媒体Jukebox以来,基于嵌入式技术的便携式视频播放器已经发展了十年,经过这十年的发展,视频播放器技术已日趋成熟,市面上的产品支持的视频格式也越来越多,功能也越来越强大,很多MP4都集成了上网、游戏、个人事务处理甚至是视频录制、数码照相等功能。
目前。
很多提供视频播放器处理器的半导体厂商都推出有自己的视频播放器硬件解决方案,这些方案可以概括为以下四类:
一类是以德州仪器、飞利浦为代表的基于CPU+DSP芯片的解决方案;一类则是以Intel和AMD为代表的基于通用CPU的解决方案;第三种则是以飞思卡尔和深圳安凯为代表的基于MCU芯片的解决方案;第四种是基于双CPU的解决方案[4]。
在软件方面基本上市面上的便携式视频播放器都带有嵌入式操作系统,主要的操作系统有Vxworks、PalmOS、WindowsCE、Linux、Android以及厂家自己开发的操作系统。
生产厂商在设计自己的产品时如果采用上述的硬件方案,都要支付一笔不菲的授权费用,而在嵌入式操作系统的选择上也只有Linux是开源免费的,所以产品成本比较高。
ARM处理器具有体积小、功耗低、低成本、高性能等优点,并且支持Linux系统[6]。
所以可以选用ARM处理器配合Linux进行产品的设计,这样可以充分的利用Linux开源的特性,根据需要修改和移植一些免费的开源软件,这样不仅能降低产品研发的难度,加快产品的上市时间,还能省去一笔不菲的软硬件授权费用。
1.3本文组织结构
本文介绍了一款便携式视频播放器的设计工作,该视频播发器是以ARM处理器为硬件开发平台,嵌入式Linux作为操作系统,通过移植Linux上的一款优秀的开源视频播放器软件MPlayer来实现的。
本文共分五章,内容安排如下:
第一章,引言。
介绍了本文的选题背景,当前国内外的发展状况以及研究意义,并对论文的主要工作进行了简单介绍。
第二章,播放器总体设计方案介绍。
主要介绍播放器的硬件整体架构和软件系统的层次结构。
第三章,系统开发平台的构建。
本章详细介绍了Linux系统移植到ARM处理器的过程,Linux的移植主要包括三个方面:
Booterloader的移植、Linux内核的移植和根文件的制作。
第四章,视频播放器的设计与实现。
介绍MPlayer的移植过程和播放器相关控件的设计工作。
第五章,总结。
第二章播放器总体设计方案介绍
2.1播发器硬件系统架构
本设计将选用国嵌公司生产的GQ2440开发板作为硬件平台,GQ2440是一款ARM9开发板。
GQ2440采用的是三星公司生产的S3C2440A处理芯片,主频400MHz,最高可达533MHz。
图2.1为视频播放器的硬件系统框图,其中S3C2440处理器除了负责对音视频文件进行解码工作外,还要负责对整个视频播放器进行管理和控制;LCD为播放器的视频输出模块;UDA1341芯片为音频的输出模块,负责将经处理器解码后得到的音频数据转换为模拟信号,并传递给麦克风等输出装置;Flash存储器负责对Linux内核、根文件系统、应用软件和视频文件的存储工作;按键用于完成对视频播放器的控制工作。
图2.1播放器硬件系统框架
2.2播发器软件系统架构
由于Linux具有源代码开放、可移植性好、资源丰富、可靠、稳定、免费等特点,所以本文将选用嵌入式Linux作为视频播放器的底层操作平台。
而视频播器软件是通过移植Linux下一款优秀的开源视频播放软件MPlayer来实现的。
如图2.2所示为视频播放器的整个软件系统层次图。
其中Linux内核中的设备驱动负责完成LCD显示器、UDA1314声卡芯片等设备的驱动工作,MPlayer为视频播放器,处于应用层,利用其完成对各种音视频文件的解码工作。
图2.2视频播放器软件系统层次
第三章系统开发平台的构建
3.1软件开发环境介绍
在嵌入式系统中,由于硬件资源的有限性、差异性,所以需要开发者根据不同的硬件资源对嵌入式的操作系统作出相应的剪裁,从而定制出能够运行在特定目标平台上的嵌入式操作系统。
构建一个嵌入式Linux操作系统主要包括三个方面的工作:
移植Bootloader,移植Linux内核,构建Linux根文件系统。
由于嵌入式系统的特殊性,其硬件资源十分有限,所以不可能在嵌入式操作系统上安装开发工具,也就不可能直接在嵌入式系统上直接进行软件的开发,所以有了交叉开发模型。
交叉开发模式是指先在主机上编写程序,然后通过交叉编译工具编译程序,生成目标平台上可运行的二进制文件,最后下载到具体的目标平台上进行运行[7]。
交叉开发模型如图3.1所示。
图3.1交叉开发模型
本文是以红帽公司发行的RedHatEnterpriseLinux5作为宿主机的操作系统进行相关软件开发的,使用的交叉编译工具链为友善之臂公司提供的arm-linux-gcc-4.3.2。
3.2Bootloader的移植
Bootloader是在操作系统运行之前执行的一小段程序,它在系统上电时开始执行,初始化硬件设备、建立内存空间的映射表,从而建立适当的系统软硬件环境,为最终调用操作系统内核做好准备[6]。
可以把Bootloader当成PC机的BIOS来理解。
嵌入式系统的硬件存在很大的差异性,Bootloader对硬件有很大的依赖性,并且Bootloader引导的操作系统也可能不同,所以在嵌入式世界中建立一个通用的Bootloader是不可能的,不过由于大部分Bootloader任然具有很多共性,所以某些Bootloader也能支持多种不同架构的处理器和操作系统。
例如,U-Boot就可以同时支持PowerPC、ARM、MIPS和X86等体系结构。
U-Boot是遵循GPL条款的开放源码项目。
而今U-Boot作为一个主流Bootloader,已经成功地被移植到包括PowerPC、ARM、X86、MIPS、NIOS、XScale等主流体系结构上的百种开发板,成为功能最多、灵活性最强,开发性最积极的开源Bootloader。
本文将选取U-Boot作为开发板的Bootloader。
在开始移植U-Boot之前,应该分析手上的U-Boot源代码已经支持的开发板,选择出硬件配置最接近的开发板作为参考。
选择的原则为,首先选择MCU相同的开发板,如果没有,则选择MPU相同的开发板作为参考,这样能大大的降低移植的难度。
本文使用的U-Boot版本为u-boot-2009.06,由于U-Boot目前还不支持S3C2440处理器,所以移植的时候可以我们将以SBC2410开发板为参考,移植的工作就是针对S3C2440和s3c2410的不同,以及SBC2410和GQ2440开发板外设的不同做相应的修改。
以下为移植的详细步骤:
(1)添加新的配置选项。
在U-Boot的顶层目录的Makefile文件中定义了所有开发板的配置选项,首先应该为开发板添加新的配置选项,参照SMDK2410的配置,加入如下语句:
gq2440_config:
unconfig
@$(MKCONFIG)$(@:
_config=)armarm920tgq2440NULLs3c24x0
开发板配置选项中各项的含义如下:
arm:
表示CPU的架构是ARM体系结构。
arm920t:
表示CPU的内核类型,对应cpu、arm920t子目录。
NULL:
这位用于表示开发商者或经销商。
S3c24x0:
片上系统定义。
(2)在board目录下创建开发板目录,并添加文件。
在board目录下存放着许多U-Boot支持的开发板的子目录,进行移植时要为具体的开发板建立目录并添加相应文件。
这里建立gq2440目录并把用于参考移植的sbc2410x目录下的内容全部拷贝到gq2440目录下,此外还要把拷贝过来的文件内容进行修改,进入gq2440目录,把sbc2410x.c文件重命名为gq2440.c。
gq2440.c是本文选用的开发板GQ2440相关的代码,它是由sbc2410x.c直接复制来的所以需要针对GQ2440开发板的硬件特性做修改。
(3)为开发板添加新的配置文件。
当我们修改好gq2440.c文件后,还应该进入include/configs目录为我们的开发板添加配置文件,可以直接复制一份SBC2410x开发板的配置文件sbc2410x.h,再把它重命名为gq2440.h,然后再根据GQ2440开发板的具体情况进行修改。
(4)配置和编译。
当完成前面的步骤后就可以进行编译了,执行:
makegq2440_config命令将会配置好开发板,接着执行:
makeCROSS_COMPILE=arm-linux-命令系统将开始编译U-Boot,编译成功后会得到U-Boot的映像,即可把其下载到开发板上。
3.3Linux内核的移植
内核移植主要是指操作系统从一种硬件平台转移到另一种硬件平台上运行。
对于嵌入式系统来说,有各种体系结构的处理器平台,使用的外围硬件也不一样。
嵌入式Linux严重依赖于具体硬件,所以只要硬件平台有略微差别,也需要做一些移植的工作。
3.3.1Linux内核移植步骤
在移植内核前需要在主机上安装好Linux操作系统,以完成对内核代码的配置和编译的工作,本文采用主机安装虚拟机并在虚拟机安装Linux的方法。
作为主机,虚拟机安装的是RetHat公司发行的RetHatEnterpriseLinux5。
本文使用的硬件开发板是GQ2440,GQ2440是参照友善之臂公司设计的Mini2440进行扩展设计的,硬件电路完全相同,自从Linux-2.6-31开始,Linux内核已经官方支持Mini2440,但官方的支持还是很有限。
其实Mini2440是参考三星公司的SMDK2440设计而来的,它们的核心电路基本是一样的,而且内核对SMDK2440的支持非常丰富,所以本文将使用Mini2440的配置并以SMDK2440为参考进行移植Linux内核的移植。
以下将对移植的步骤进行详细的讲解。
(1)获取源代码。
Linux的源代码是开源的,可以到Linux的官方网站:
http:
//www.kernel.org/上去下载Linux源代码,本文使用的源代码为Linux-2.6-32.2。
下载好源代码后我们可以把源代码解压到指定目录,例如执行以下命令我们可以把Linux解压到/home/wusong目录:
tarxvzflinux-2.6-32.2.tar.gz–C/home/wusong。
解压完后,在/home/wusong目录下将生成一个Linux-2.6.32.2目录。
(2)指定交叉编译变量。
Linux内核缺省配置的目标平台是X86的,要使内核能在运行在ARM平台上,需要进入Linux-2.6.32.2目录,修改总目录里的Makefile文件。
打开Makefile文件找到以下信息:
exportKBUILD_BUILDHOST:
=$(SUBARCH)
ARCH?
=$(SUBARCH)
CROSS_COMPILE?
=
把它改为:
exportKBUILD_BUILDHOST:
=$(SUBARCH)
ARCH?
=arm
CROSS_COMPILE?
=arm-linux-
其中,ARCH是指定目标平台为ARM,CROSS_COMPILE是指定交叉编译器,这里指定为系统默认的交叉编译器。
(3)替换BSP。
Linux对于特定的硬件平台的软件就叫做BSP(BoardSupportPackage)。
我们进入linux-2.6.32.2/arch/arm/mach-s3c2440目录可以看到有一个mach-mini2440.c文件,这就是外国的开发者对Mini2440设计的BSP,因为它对Mini2440的支持十分有限,所以可以不使用它,把它删掉。
而以SMDK2440的BSP为参考,把linux-2.6.32.2/arch/arm/mach-s3c2440目录下得mach-smdk2440.c复制一份,重命名为mach-mini2440.c,既可使用新的mach-mini2440.c作为GQ2440的BSP。
(4)修改BSP。
在GQ2440开发板上使用的晶振是12MHz,而SMDK2440使用的是16.9344MHz,所以我们要修改BSP指定的系统时钟源,打开mach-mini2440.c,把staticvoid__initsmdk2440_map_io(void)函数内的16934400改为12000000。
再把smdk2440_machine_init(void)函数中的smdk_machine_init()函数删掉。
这时候可以回到Linux-2.6.32.2的源代码根目录下分别执行如下命令:
#makemini2440_defconfig;
#makezImage;
mini2440_defconfig是官方自带的对mini2440的配置。
执行makezImage命令后将开始编译内核,编译完成后将在在arch/arm/boot目录下生成内核文件在zImage。
这时把zImage下到开发板里,通过串口终端可以看到内核是能正常启动的,但由于大部分驱动都没添加,也没有根文件系统,所以还无法登陆,开发板上资源也还不能正常使用。
所以接下来还应该为具体的硬件移植相应的硬件驱动程序。
3.3.2Flash驱动的移植
Flash存储器在嵌入式系统中是必不可少的,它是Bootloader、Linux内核、文件系统和数据的最佳载体。
在Linux内核中,引入了MTD(MemoryTechnologyDevice,内存技术设备)层为NORFlash和NANDFlash设备提供统一的接口,从而使得Flash驱动的设计工作大为简化[9]。
在GQ2440开发板上有256M的NANDFlash存储芯片。
Linux内核在MTD的下层实现了通用的NAND驱动(主要通过driver/mtd/nand/nand_base.c文件实现),所以要实现NANDFlash的驱动并不需要太大的工作量。
S3C2440的NANDFlash驱动是以platform驱动的形式实现的,在执行probe()函数时,初始化nand_chip实例并运行nand_scan()函数扫描NANDFlash设备,最后调用add_mtd_partitions()函数添加BSP文件中定义的分区表。
因此只要在mach-mini2440.c中定义和注册分区表和相关硬件信息即可完成NANDFlash的移植工作。
首先应在mach-mini2440.c加入的是NANDFlash的分区表的代码:
staticstructmtd_partitionfriendly_arm_default_nand_part[]={
[0]={
.name="bootloader",
.size=0x00040000,
.offset=0,
},
[1]={
.name="param",
.offset=0x00040000,
.size=0x00020000,
},
[2]={
.name="Kernel",
.offset=0x00060000,
.size=0x00500000,
},
[3]={
.name="rootfs",
.offset=0x00560000,
.size=1024*1024*1024,//
},
[4]={
.name="nand",
.offset=0x00000000,
.size=1024*1024*1024,//
}
};
接下来还应把开发板的NANDFlash设置表和NANDFlash本身的一些特性注册进内核,分别在mach-mini2440.c中加入以下代码:
staticstructs3c2410_nand_setfriendly_arm_nand_sets[]={
[0]={
.name="NAND",
.nr_chips=1,
.nr_partitions=ARRAY_SIZE(friendly_arm_default_nand_part),
.partitions=friendly_arm_default_nand_part,
},
};
staticstructs3c2410_platform_nandfriendly_arm_nand_info={
.tacls=20,
.twrph0=60,
.twrph1=20,
.nr_sets=ARRAY_SIZE(friendly_arm_nand_sets),
.sets=friendly_arm_nand_sets,
.ignore_unset_ecc=1,
};
为了使NANDFlash正常工作,还需把NANDFlash设备注册到系统中,把NandFlash设备注册到系统只要将其放入mach-mini2440.c中定义的mini2440_devices数组即可。
除此外我们还应该把NANDFlash的一些特性传递给驱动,首先在driver/mtd/nand目录下找到NANDFlash的驱动程序:
s3c2410.c,打开文件,在函数staticints3c2410_nand_setrate(structs3c2410_nand_info*info)中添加如下代码:
structs3c2410_platform_nand*plat=info->platform;
再在mach-mini2440.c中的函数staticvoid__initmini2440_machine_init(void)里面添加如下代码:
S3c_device_nand.dev.platform_data=&mini2440_nand_info;
最后重新编译内核即可完成了NANDFlash驱动的移植。
3.3.3LCD驱动的移植
对嵌入式视频播放器来说。
LCD显示器自然是必不可少的,Linux-2.6.32.2内核已经支持S3C2440的LCD控制器驱动,只要在mach-mini2440.c中注册具体的LCD硬件参数即可完成LCD驱动的移植工作。
GQ2440开发板使用的是统宝的3.5英寸真彩色TFT液晶屏,分辨率为320x240,带触摸屏的。
图3.2为TFT屏的时序图:
图3.2TFT屏时序
上图中的VCLK、HSYNC、VSY