2024年5月10日发(作者:)

基于嵌入式ARM-Linux的播放器的设计与实现

摘要

随着21世纪的到来,人类进入了PC时代。在这一阶段,嵌入式技术得到

了飞速发展和广泛应用。由此,本文提出了一种基于嵌入式ARM-Linux的播放

器设计与实现的方案。

本文首先详细分析了ARM体系结构,研究了嵌入式Linux操作系统在ARM9

微处理器的移植技术,包括交叉编译环境的建立、引导装载程序应用、移植嵌

入式Linux内核及建立根文件系统,并且实现了嵌入式Linux到S3C2410开发

板的移植。

由于嵌入式系统本身硬件条件的限制,常用在PC机的图形用户界面GUI系

统不适合在其上运行。为此,本文选择了Minigui作为研究对象,在对其体系

结构等方面进行研究基础上,实现了Minigui到S3C2410开发板的移植,完成

了嵌入式图形用户界面开发,使得系统拥有良好的操作界面。

对于播放器,本文实现了Linux系统下的通用媒体播放器—Mplayer到

S3C2410开发板的移植。通过对音频数据输出的研究,解决了Mp1ayer播放声

音不正常的问题,实现了一个集音乐和视频播放于一体的嵌入式多媒体播放系

统。

最后,总结了论文所做的工作,指出了嵌入式播放器所需要进一步解决和

完善的问题。

关键词:嵌入式ARM-Linux; S3C2410; Mplayer; GUI界面; Minigui

I

Player Designing and Implement Based On Embedded ARM-Linux

Abstract

Along with the 21st century arrivals, the humanity enters the post

PC time. In this stage, embedded technology gets rapidly developed and

widely used. So, this paper aims to design a player based on embedded

ARM-Linux.

First, in this paper, ARM architecture and the characteristic are

analyzed in detail. The emphasis of the study is put on the porting

techniques of embedded Linux operation system based on the ARM9

micro-processor, which include setting cross complier、transplanting

Bootloader、transplanting embedded Linux kernel and setting root file

system; Furthermore, implement the technique of transplanting Embedded

Linux to S3C2410 board.

GUI (Graphical User Interfaces) systems which are supported by normal

PCs cannot run well on the embedded systems, just because of the

restriction of the hardware of embedded devices. So, this paper selects

Minigui as research object. Based on the Minigui architecture and its

other aspects, the technique of transplanting Minigui to S3C2410 board

is given in detail, and then an embedded GUI system is established and

it also makes the handle interface friendly.

About the player, this paper implements transplanting the universal

player on Linux-Mplayer to S3C2410 board. By learning of audio data,

it solves the problem of sound abnormality, and achieves an embedded

multimedia system which could play audio and video files.

Key words: Embedded ARM-Linux; S3C2410; Mplayer; GUI interface; Minigui

II

目录

摘要 ................................................................ I

Abstract ........................................................... II

目录 .............................................................. III

第一章 绪论 ........................................................ 1

1.1系统研究背景 ................................................. 1

1.1.1 多媒体播放器与嵌入式系统 ............................... 1

1.1.2 嵌入式多媒体播放器国内外发展现状 ....................... 1

1.2 嵌入式处理器 ................................................ 3

1.3 嵌入式系统 .................................................. 4

1.3.1嵌入式系统的概述 ....................................... 4

1.3.2 嵌入式系统的选择 ....................................... 5

1.4 本文的意义和主要工作 ........................................ 7

第二章 系统软硬件平台的搭建 ......................................... 8

2.1 硬件开发平台的介绍 ......................................... 8

2.1.1 核心板 ................................................. 8

2.1.2 外设板 ................................................ 8

2.1.3 设计所用硬件介绍 ...................................... 9

2.2 硬件平台的设计方案 ......................................... 9

2.2.1 核心板设计 ............................................ 9

2.2.2 外设电路设计 ......................................... 14

2.3 嵌入式软件开发环境 ......................................... 15

2.3.1 引导装载程序 .......................................... 16

2.3.2 宿主机开发环境配置 .................................... 17

2.3.3 交叉开发环境的建立 .................................... 18

2.3.4 内核的编译 ............................................ 18

2.3.5 烧制内核映像和文件系统 ................................ 20

2.4 嵌入式图形用户界面的实现 ................................... 20

2.4.1 图形用户界面minigui的简介 ............................ 20

2.4.2 MiniGUI在S3C2410开发板上的移植过程 .................. 21

第三章 Mplayer的移植 .............................................. 25

3.1 Mplayer的简介 .............................................. 25

3.2 Mplayer的移植 .............................................. 25

3.2.1 安装交叉编译工具及解压源代码 .......................... 25

3.2.2 编译Mplayer .......................................... 25

3.3 调试 ....................................................... 27

第四章 嵌入式播放器Mplayer的设计 .................................. 31

4.1 播放器的工作流程 ........................................... 31

4.2 播放器的逻辑结构 ........................................... 31

4.3 Mplayer播放器的目录文件组织结构 ............................ 32

4.4 播放器对解码器和输出设备的管理方式 ......................... 34

第五章 总结与展望 .................................................. 36

5.1 本文主要完成的工作及结论 ................................... 36

5.2 完善与展望 ................................................. 36

III

致谢 ............................................................... 37

参考文献: ......................................................... 38

IV

第一章 绪论

1.1系统研究背景

从上世纪末开始,随着计算机和电子技术的发展走上快车道,便携式电子设备,诸如

智能手机,个人电子助理(PDA)的运算存储能力和通信能力都得到了长足的进步,便携式

设备的用户界面也变的越来越友好,从早期的只能显示单色文字的LED,发展到现在大尺

寸6万色彩色液晶屏幕。因此,用户已经不再仅仅满足于早期的便携式电子设备提供的传

统的,简单的语音通信或文档处理功能。随着多媒体技术发展,用户希望能够在轻巧的便

携式设备上同样能够享受到过去只能在笨重的台式机或笔记本电脑上才能享受到语音甚

至视频等多媒体服务。

1.1.1 多媒体播放器与嵌入式系统

随着芯片技术的快速发展,嵌入式系统的性能逐步提高,功能也越来越丰富。嵌入式

系统在众多领域的应用给我们的生活带来了便利,并且对人们的生活方式的改变和生活质

量的提高具有重要的影响。在这些领域中,消费电子产品的应用具有更为广泛的潜力,尤

其是便携式消费电子产品。当前,消费类电子产品更新换代的速度进一步加快,市场需求

不断增大。在MP3数码随身听取得巨大的市场成功后,支持视频的便携式播放器逐渐进入

消费者的视线,成为继MP3之后的新一代数码影音娱乐平台。受MP3的影响,人们习惯的

将这一类嵌入式多媒体系统称作MP4。

在法国Archos公司推出第一款MP4掌上影院后,众多企业均看好MP4的发展态势。新

一代MP4良好的发展前景和潜在的市场,成为移动数码产业的新亮点,吸引着众多厂商大

力研发,并将其推向市场。

除播放视频这一基本功能外,嵌入式多媒体系统还附带了若干增值功能,如音乐播放、

图片浏览、游戏、调频收音、录音、电子书以及拍照、录像功能。

1.1.2 嵌入式多媒体播放器国内外发展现状

目前嵌入式多媒体的内部结构,比较成熟的解决方案有三种:基于 SigmaDesigns851x

系列芯片的解决方案、基于 TlDM32ODSP+ARM处理器的解决方案和基于工 ntelPXA27x的

解决方案,这三种解决方案是目前的主流方案。上述几种方案各有特点:

(1)SigmaDesigns 851x 方案

SigmaDesignS851x处理器是目前性能最强、最全面的专业解码芯片,采用双核设计,

将200MHz 32位RISC处理器和MPEG解码处理器集成于单芯片上,在无需其它外围芯片支

持的情况下,完成系统所需各种接口的提供、系统处理以及流畅的 WMA V9、 DivXV3.11、

DivXV4.X和S.X、MPEG-4、MPEG-2、MPEG-1等音视频解码。其中对系统要求极高的MPEG-2

解码, SigmaDesigns851x能轻松达到3OfpsDI,流畅自如,难能可贵!

优点:单芯片,低成本,低功耗;硬核视频解码,视频播放效果好

缺点:无法播放网络视频格式RM,RMVB等

(2)TI DM320 DSP-I-ARM处理器的解决方案

作为DSP巨头,TI力推DM320 DSP的PMP解决方案。TI方案是利用DM320 DSP进行音

1

视频编解码处理,ARM处理器负责系统处理及提供外围设备接口。与SigmaDesigns方案一

样,TI方案支持的媒体类型非常丰富,能支持WMV、 DivXV3.11、 DivXV4.X和5.X、MPEG-4、

MPEG-2、MPEG-1等。但由于 TlDM320为纯DSP芯片,因此必须配合ARM处理器才能组成

完整的解决方案,因此在成本上并不具备优势。

优点:支持的媒体类型丰富,编解码能力强

缺点:必须配合ARM处理器,成本不占优势,功耗较大;不支持网络视频格式RM,RMVB

(3)Intel PXA27x 的解决方案

Intel公司于2003年底推出了性能最为强劲的PXA27x嵌入式处理器,最高频率可达

624MHz。作为一款性能及其强劲的嵌入式处理器,配合嵌入式Linux或wince操作系统,

PXA27x理论上可以支持任何媒体格式,并通过软件升级,支持未来媒体格式。但由于MPEG-2

对硬件的极高要求,因此单纯依靠PXA27x处理器进行MPEG-2编解码是不现实的。Intel

公司于2004年推出了2700G多媒体加速芯片,配合PXA270进行视频加速与3D加速。同

时,PXA27x加入了wireless MMX技术和SpeedStep动态电源管理技术,不但大大增强了

PXA270的媒体处理能力,而且极大降低了系统功耗,延长PMP产品的电池寿命。 2700G

的加入,更使PXA27x方案成为全能解决方案,不但完美解决了MPEG-2编解码问题,更使

基于PXA27x的PMP产品能向多功能化发展,可以加入游戏、摄像等功能,成为个人娱乐

终端。

优点:支持目前所有的媒体类型,可通过软件升级支持未来媒体类型;接口丰富,可支

持SD、MS、CF等;支持最大400万象素摄像头;支持动态电源管理,功耗低

缺点:成本可能较高

目前市面上还有其它几种非主流方案,如PxA255解决方案、Sunplus SPCA536解决方

案、 21解决方案等。基于PXA255的方案特点是功耗较低,且能够支持较

多的媒体格式,但缺点是无法支持大尺寸图像的编解码,如MPEG-2等。 Sunplus SPCA536

解决方案价格低廉,但仅支持MPEG-4编解码与JPEG,支持媒体类型单纯,功能单

一 ;21芯片原为智能手机专门设计,接口类型比较丰富,但音视频处理能

力一般,无法进行流畅的MPEG-4播放,无法处理MPEG-2视频。

由于PMP(便携式多媒体播放器)产品的研发难度较大,目前市面上的大多数PMP产品均

为国外或台湾设计。中国大陆消费类娱乐产品的生产商因研发能力普遍较低而无法自己研

发产品,因此未来中国大陆PMP设计制造将更多的按照生产商 +Design House的模式进

行,这样生产商可以充分发挥自己的渠道和规模优势,而 Design House则发挥自己的强

设计能力和低营运成本优势,双方合作则能够共同把PMP市场做大、做强。

国内目前也有进行PMP方案设计的公司,如南京东集公司 (),采用的

是Intel嵌入式处理器PXA255方案。采用SigmaDesignS解决方案的公司主要集中在深圳,

如深圳市深视通科技开发有限公司(),该公司目前己经设计出了基于

SiglnaDesigns85n处理器的成熟的PMP解决方案,并制作了DEMO。而 TIDM320方案,目

前主要依靠TI合作伙伴美国Ingenient公司推广

[1]

2

1.2 嵌入式处理器

嵌入式处理器是嵌入式硬件平台的核心,负责系统事件的响应、任务的调度、外围器

件的控制以及信号的处理。嵌入式处理器是由通用计算机中的CPU演变而来的。它的特征

是32位以上,具有较高的性能。与通用计算机中的CPU不同的是,嵌入式处理器在实际

嵌入式应用中只保留和嵌入式应用紧密相关的功能硬件,去除其他的冗余功能部分,这样

就以最低的功耗和资源实现嵌入式应用的特殊要求。嵌入式处理器体积小、功耗低、成本

低、可靠性高的优点使其在互联网、通信、消费类电子等多个领域得到了广泛的应用。目

前主要的嵌入式处理器按体系结构不同可分为五大类:ARM、MIPS、POWERPC、x86和SH系

列。

ARM内核是由ARM公司开发的一系列32位RISC处理器内核,当前有6个系列的产

品:ARM7,ARM9,ARM9E,ARM10E,SecurCore以及最新的ARM11系列。目前业界可以提供

ARM内核处理器的著名半导体公司有Intel,TI,Freescale, Analog Devices, Cirrus

Logic和Samsung等。本课题设计采用的S3C2410处理器就是Samsung提供的一款采用32

位ARM内核的处理器。

S3C2410 内部集成了微处理器和一些手持设备的常用外围组件, 特别适用于手持产

品。S3C2410微处理器是一个多用途的通用芯片,它内部集成了微处理器和常用外围组件,

可用于各种领域。它是应用于手持设备的低成本实现,提供了更高性价比。

HHARM2410 套件由核心板和底板(外设板或称基本板)组成,核心板上集成Samsung

S3C2410 处理器,64M SDRAM以及16M 的FLASH,为您的应用研发提供了足够的空间。底

板上则提供以下外设接口:一个四线RS-232 串口(COM1), 一个USB HOST接口, 一个

10M/100M自适应以太网接口, 一个TFT LCD接口, 一个触摸屏接口。核心板和底板配合

即构成一个最小的完整应用系统。系统具有体积小、耗电低、处理能力强、等特点,能够

装载和运行嵌入式Linux 操作系统。用户可以在这个系统平台上进行自主软件开发。

HHARM2410 套件中提供底板硬件电路图及硬件设计文档,极大的方便了用户进行硬件扩展

开发。

HHARM2410套件提供完备的嵌入式Linux 开发环境及丰富的开发调试工具软件。

S3C2410 微处理器的精彩特性

[2]

 ARM920T 嵌入式处理器内核,主频可达203MHz;

 扩展总线最大频率100MHz;

 32 位数据,27 位外部地址线 ;

 完全静态设计(0-203M) ;

 存储控制器(八个存储体) :

 包含 RAM(SDRAM)控制器,NAND 控制器 ;

 复位时引导芯片选择(8-,16-比特存储或NAND 可供选择) ;

 四个带有PWM 的16 位定时器

 多达 55 个中断源的中断控制器 ;

3

 RTC;

 三个UART ,Supports IrDA 1.0;

 四个 DMA 通道; (支持外设 DMA)

 8通道,500KSPS,10-bit ADC;

 支持 STN

 看门狗;

 IIS音频接口;

 两个USB口;

 IIC-Bus接口;

 两个串行外围接口电路(SPI)

 SD卡接口;

 HHARM2410开发套件硬件主要结构:

 Sumsung S3C2410 处理器

 16Mbytes 16 位FLASH

 64Mbytes 32 位SDRAM

 一个四线 RS-232 接口

 一个 10M/100M 自适应以太网接口

 一个TFT LCD 接口,

 一个触摸屏接口。

 JTAG 接口

 9V 直流电源

 H/W 复位建

 运行状态指示LED 灯

1.3 嵌入式系统

1.3.1嵌入式系统的概述

嵌入式系统的定义如下:是一种以应用为中心、以计算机技术为基础,软件硬件可裁剪,

适应应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。由嵌入式

系统的定义可见,嵌入式系统具有以下几大特点:

(1) 技术密集

嵌入式系统是将先进的计算机技术、半导体技术和电子技术以及各个行业的具体应用

相结合后的产物。这一点就决定了它必然是一个技术密集、不断创新的知识集成系统。

(2) 专用性强

嵌入式系统是与应用紧密结合的,具有很强的专用性。嵌入式系统的个性化很强,其

中的软件系统和硬件的结合非常紧密,一般要针对硬件进行系统的移植,即使在同一品牌、

4

 与 TFT LCD 控制器;

同一系列的产品中也要根据系统硬件的变化不断进行修改。同时针对不同的任务,往往需

要对系统进行较大的更改,程序的编译下载要和系统相结合。

(3) 系统精简

嵌入式系统必须根据应用需求可对软硬件进行裁剪,满足应用系统的功能、可靠性、

成本、体积等要求。因此目前嵌入式系统的开发一般是先建立一个相对通用的软硬件平台,

然后在其基础上进行裁剪和精简,开发出适应各种需要的系统。一般而言,嵌入式系统的

结构自底向上可分为3个部分,如图1-1所示

嵌入式应用软件

嵌入式操作系统

嵌入式硬件平台

图1-1 嵌入式系统的结构

嵌入式硬件平台是整个嵌入式操作系统和应用软件运行的基础。不同的应用通常有不

同的硬件平台,但是基本的结构是相同的,通常包括嵌入式处理器、存储器和输入输出(工

/0)接口,如图1-2所示

[1]

输入

嵌入式处理器

输出

存储器

图1-2 嵌入式硬件平台结构

1.3.2 嵌入式系统的选择

现今,与嵌入式应用相结合的嵌入式操作系统有VxWorks、Linux、WinCE、

COS-II

等,他们各有其特点,相比较而言,嵌入式Linux更具有优势。归纳起来,嵌入式Linux

至少具有以下优势

[3]

5

(1)开放的源码,丰富的软件资源

Linux是自由的操作系统,它的开放源码使用户获得了最大的自由度。Linux上的软

件资源十分丰富,每一种通用程序在Linux上都可以找到。

(2)功能强大的内核,性能高效、稳定,多任务

Linux的内核非常稳定,它的高效和稳定性已经在各个领域,尤其在网络服务器领域,

得到了事实的验证。Linux内核小巧灵活,易于裁减,这使得它很适合嵌入式系统的应用。

(3)支持多种体系结构,如X86、ARM、MIPS、ALPHA、SPARC等

目前,Linux已经被移植到数十种硬件平台上,几乎支持所有流行的CPU。

(4)完善的网络通讯、图形、文件管理机制

Linux自产生之日起就与网络密不可分,网络是Linux的强项。另外,Linux还支持

多种文件和图形系统。

(5)支持大量的周边硬件设备

Linux上的驱动已经非常丰富了,它们支持各种主流硬件设备和最新硬件技术。

(6)大小、功能都可定制

Linux秉承Unix的优秀设计思想,非常灵活,各部分的可定制性都很强。

(7)良好的开发环境,不断发展的开发工具集

Linux有着非常优秀的完整开发工具链,有十几种集成开发环境,其中很多是免费的,

大大降低了开发费用。

(8)软件开发者的广泛支持

Linux的自由精神吸引了成千上万的程序员投入到Linux的开发和测试中来,这使得

Linux在短时间内就成为一个功能强大的操作系统。

(9)价格低廉

有效降低产品成本,对成本敏感的嵌入式系统来说至关重要,Linux恰好具有这一特

性。

正是这些优势,嵌入式Linux系统的研发热潮正在蓬勃兴起,并且占据了很大的市场

份额,除了一些传统的Linux公司(如RedHat、Monta Vista等)正在从事嵌入式Linux

的开发和应用之外,IBM、Intel、Motorolar等著名企业也开始进行嵌入式Linux的研究

[4]

嵌入式图形用户界面(Graphics User Interface)系统是嵌入式实时操作系统的一个重

要组成部分,随着嵌入式系统硬件设备可获得性的提高和价格的不断降低及嵌入式系统应

用范围的不断扩大,嵌入式GUI系统的重要性越来越突出,特别是对高性能嵌入式人机图

形交互界面的要求也越来越迫切,比如消费电子和工业实时控制系统

[5][6][7]

。这些系统对

GUI的基本要求包括:

 轻型、占用资源少

 高性能

 高可靠性

6

 可配置

此外,适合嵌入式Linux的GUI还要求是开放源码的自由软件

[8]

时代的发展告诉我们,图形用户界面GUI的应用加速了计算机的普及广度,嵌入式技术

的发展加速了计算机的普及深度,后PC时代呼唤着两者日益紧密的结合

[9]

。所以对二者的

研究有着深刻的意义。

1.4 本文的意义和主要工作

本文在研究嵌入式系统开发技术的基础上,提出了一套满足要求的低成本的嵌入式多

媒体终端的解决方案。通过对系统的功能需求分析以及市场上主流处理器的功能和性能分

析,选择了华恒公司的HHARM9-EDU-R3实验平台和Red Hat 9.0 Linux分别作为系统的

硬件和软件开发平台。

本文的主要工作包括三方面的内容,首先,基于ARM平台开发相应的引导

加载程序、构建嵌入式Linux操作系统;第二,针对ARM处理器和Linux操作

系统特点进行音视频解码器的设计和研究;第三,对系统进行验证;论文的主要结构如下:

第二章 系统软硬件平台的搭建。包括ARM处理器及硬件核心部件介绍、bootloader

第三章 Mplayer到开发板的移植。Mplayer为Linux下通用的媒体播放软件,但非为

实现、交叉开发环境建立、Linux移植、minigui移植等;

嵌入式系统而设计,然而其强大的功能却是嵌入式系统所需要的。为此本章完成其到开发

板的移植,来完善嵌入式系统对音视频文件的支持;

第四章 嵌入式播放器Mplayer的设计,针对播放器Mplayer整体结构设计及数据处理

最后,对论文进行总结与展望。

流程到诸如分流器,音、视频解码,音、视频同步等各个关键功能模块作描述。

7

第二章 系统软硬件平台的搭建

2.1 硬件开发平台的介绍

本设计使用的硬件开发平台是华恒科技的HHARM9-EDU-R3教学实验系统,此平台由核

心板和外设板组成,下面分别对这两部分进行介绍

[10]

2.1.1 核心板

核心板的功能模块结构图如图2-1所示,板上集成Samsung S3C2410处理器,16M的

FLASH和64M SDRAM,它能为我们的研发、应用提供足够的空间。

图2-1 核心板功能模块结构图

S3C2410是一款16/32-bit RISC(精简指令集)高性价比,低功耗,体积小,高性能,

高集成度的微处理器,采用203MHZ的ARM920T内核。集成了16KB指令缓存和16KB数据

缓存,利用MMU实现对虚拟内存的管理,支持TFT LCD屏,支持NAND FLASH。正是由于

S3C2410的这些特点,才使核心板的模块组成成为可能,也为Linux系统的移植提供必要

的硬件资源。

2.1.2 外设板

外设板为核心板的应用提供了其它的接口和设备,它提供以下外设接口:

(1) 10M/100M自适应以太网接口一个;

(2) 四线RS-232 串口(COM1)一个;

(3) 四线RS232/RS485串口各一个(COM2、COM3);

(4) IDE/CF卡接口;

(5) SD/MMC卡接口;

(6) USB HOST接口一个;

8

(7) USB Device接口一个;

(8) TFT LCD接口;

(9) 触摸屏接口;

(10) 音频输入输出接口,麦克风接口;

(11) A/D,D/A接口;

(12) PS/2接口;

核心板和底板是通过一个144针的插槽相接,它们配合后即构成一个完整的应用系统。

2.1.3 设计所用硬件介绍

首先,核心板是必不可少的部分,它是一个最小系统。

其次,本设计是一个人机交互界面设计的应用,故需要一个LCD显示屏和触摸屏,通

过以上的TFT LCD接口和触摸屏接口与外设板相接.

最后,设计的调试需要通过在PC Linux上运行minicom与开发板通信,所以需要使

用到一个串口,并且,内核文件等镜像的下载需要网络接口,故开发板上的网络接口就必

不可少了。

以上的设备即构成本设计中必需的硬件开发平台,缺一不可。

2.2 硬件平台的设计方案

参考华恒HHARM9-EDU-R3教学实验平台的硬件电路设计,为了减小难度,增加通用性,

我们可以选用跟实验平台相似的设计,把整个硬件电路设计成两个主要部分:核心板和外

设板,两者通过插槽接口相接,功能的扩展只需通过对外设板的修改来达到。

2.2.1 核心板设计

核心板的正面俯视图如图2-2所示:

根据功能模块分别介绍各个主要组成部分:

(1) 存储部分构成

核心板内存由图2-2中两块HY57V561620CT为16M*16位数据宽度的SDRAM构成,两片

拼成32位模式,公用nGCS6片选空间,共64M RAM。通过参考s3c2410技术手册的内存

映像地址,如图2-3,可以知道内存的起始地址为0x30000000

[12]

核心板还集成有一片8M*16位数据宽度的INTEL 28F128J3C FLASH,通过nGCS0作为

片选,从图2-3可知,起始地址为0x00000000。

根据地址的分配与片选设置,我们设计的核心板存储部分电路图如图2-4和图2-5所

示,从图2-4中可以看到,FLASH使用的地址线为MA1到MA24,而使最高位A0接地,这

9

图2-2核心板正面俯视图

图2-3 s3c2410 内存映射

样使得FLASH的0地址为0x01000000,以后内核等的烧写地址也是以此为准。数据地址线

为MD0到MD15,正好为16位的数据宽度。

从图2-5可见,两片内存使用的地址线为MA2到MA25,而数据线分别为MD0-MD15和

MD16-MD31,由于共用地址线和片选nGCS6,而分别使用32位数据线,所以这两片16位宽

度的内存共同组成了32位宽度的内存存储空间。

10

图2-4 FLASH电路接线

图2-5内存电路接线

11

(2) 供电部分构成

核心板的供电部分由LV14A 六角施密特触发倒相器(HEX SCHMITT-TRIGGER INVERTERS)

和AMS 1117 800mA低门限稳压器(800mA Low Dropout Voltage Regulator)构成,具体

电路如图2-6和图2-7所示:

图2-6 LV14A电路

图2-7 AMS 1117电路

从图中还可以看到,核心板还有相应的电源指示灯D5 LED,当核心板接收到reset

信号时,指示灯灭,而正常工作状态,指示灯亮。

(3) 振荡电路部分构成

核心板的振荡电路由两个晶振电路组成,如图2-8。

12MHz的晶振与s3c2410的XTIpll、XTOpll两个管脚相接,为内部振荡电路提供振荡

源(for internal OSC circuit)。32.768KHz晶振与XTIrtc、XTOrtc两个管脚相接,作为

实时时钟(Real Time Clock,RTC)振荡源

[11]

12

图2-8 振荡电路

图2-9 DIMM 144引脚说明

13

(4) 与外设板接口部分

核心板与外设板是通过144针的插槽相接的,主要把核心板电路中的16根存储数据线

DM0-DM16、24根存储地址线MA0-MA23、8根外部中断引线EINT0-EINT7、两路UART数据

线与控制线、通用接口GPIO、IIC、SPI以及其它的读写信号、控制线等引出供外设板调

用。详细请参见图2-9。

这里只使用到了144针的插槽接口,而没有使用168线的内存条接口插槽或者PCI插

槽,是由于168线需要用到金手指,走线很密,而且工艺要求高,两层板布线很难实现,

可能需要4层板才能完成,对于学校项目设计来说难度很大,而这样增加难度是没有必要

的,因为144针的接线已经基本能够满足实际需要,通过以上的接口可以连接通常使用的

器件,如本项目需要使用到的LCD和触摸屏等。

2.2.2 外设电路设计

本设计中需要使用到的外设有LCD显示屏和触摸屏,并且作为一个应用平台,外设电

路不再包括有调试用的COM接口和网络接口。因为软件的调试可以先在HHARM9-EDU-R3平

台上测试好后,再把核心板放到外设电路板上进行实测。

(1)LCD显示屏模块接口

基于电路设计的模块化,我们把LCD显示屏与外设板分开,使用40针的数据线进行联

接,因为LCD屏及其外围电路通常可以整块地进行购买,这样设计也即省下了不必要的电

路设计的麻烦。LCD屏我们选用HHARM9-LCD-R4模块,屏幕的大小为240x320象素, LCD

屏模块接口电路如图2-10所示。

图2-10 LCD屏模块接口电路

14

(2)触摸屏电路

触摸屏控制器选用ADS7846,由于触摸屏与LCD显示屏是贴在一起的,所以ADS7846

的采集信号输入也是通过LCD显示屏模块接口引线接出来的,如图2-10中的RIGHT、LEFT 、

UPPER、DOWN引脚。通过对这四路输入信息的转换,即可把触摸屏上响应的电压信息转换

成相应的坐标信息。ADS7846电路如图2-11所示。

图2-11 触摸屏控制器ADS7846电路

2.3 嵌入式软件开发环境

本文设计的播放器是基于嵌入式Linux操作系统进行设计。嵌入式Linux是按照嵌入

式操作系统的要求而设计的一种小型操作系统。相对于WinCE、pSOS、palm05等商用实时

操作系统(RTOS)它具有源码开放、易移植、模块化、资源丰富等优势。支持多线程、多进

程;支持多种平台,如x86、PowerPC、ARM、MIPS等等。如图2-11所示,它是由一个内

核和一些可以定制系统模块组成,如文件模块,网络模块,各种驱动模块等。针对本应用,

对其进行了裁剪和配置,只包含了系统所需的模块支持ext2jffs2等文件系统;内存驱

动模块提供内存管理功能;网络接口模块支持以太网接口;GPIO驱动模块主要是提供给键

盘和触摸屏使用;图形驱动模块是图形用户界面(GUI)和图像显示的底层支撑模块;音

频设备输出驱动模块支持音频数据的数模转换。

15

应用程序

文件

系统

驱动

模块

嵌入式Linux内核

硬件平台

图2-12 嵌入式Linux体系结构

2.3.1 引导装载程序

BootLoader就是在操作系统内核运行之前运行的一段小程序。通过这段小程序,我们

可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的

状态,以便为最终调用操作系统内核准备好正确的环境。最终,bootloader把操作系统内

核映像加载到RAM中,并将系统控制权传递给它。

Bootloader程序与硬件平台有很强相关性,不同开发板需要不同的bootloader。与

Linux一样,网上有很多开放源代码的bootloader,在为自己的开发板写bootloader程

序时,可以先找到与硬件平台相类似的bootloader,然后只要做一些改动就可以在开发板

上运行了。

Bootloader的功能相当于一个通信控制器,有了它之后,才可以通过串口或网口完成

内核的加载和应用程序的烧写。当然,利用JTAG技术也可以完成上述任务,但是,JTAG

烧写速度很慢

[12]

本系统采用的是ppcboot,ppcboot在嵌入式系统中相当于PC机的BI0S加上操作系统

引导头部的内容,并且引导操作系统进行装载和运行,ppcboot启动后有一系列的命令,

使得我们能够方便地对FLASH、RAM进行操作,同时ppcboot己经对系统的频率、定时器

进行了设置,初始化了一个调试串口,这样可以通过串口或以太网进行数据的下载。

PPCBoot的主要特点如下表所示

[13]

16

内存

驱动

模块

网络

驱动

模块

GPIO

驱动

模块

图形

驱动

模块

音频输

出驱动

模块

表2-1 PPCBoot的主要特点

功能

系统加载

内存操作

设备驱动

上电自检

交互命令

其他特点

描述

支持NFS、以太网挂载操作系统和根文件系统

支持内存查看、修改和比较

支持串口、FLASH、外部SDRAM、EEP、ROM、LCD、USB、PCI

等驱动

自动检测FLASH、SDRAM选型及使用情况,CPU类型

通过设定和访问环境变量灵活配置系统各项参数,灵活升级

支持在线读写Flash,支持SCC/FCC以太网、TFTP引导、IP

和MAC的预置功能

2.3.2 宿主机开发环境配置

(1)安装Linux系统

宿主开发环境,我们选用在windows下安装VMware WorkStation虚拟机+RedHat Linux

9.0的组合来组建

[2]

在虚拟机中安装Linux系统,我们选择自定义安装(Custom),安装过程中先不用指定

PC机上网卡的IP地址,在配置防火墙(Firewall)时,选择不安装防火墙(No Firewall),

在选择软件Package时选择完全安装,即最后一项:Everything,这一项非常重要,这样

安装会装上一些无用的东西而浪费一点磁盘空间,但是却可以避免以后使用中找不到某个

程序的烦恼。

(2)NFS和TFTP服务器的配置

这里设置开发环境的网络环境,首先设置PC机的IP地址为192.168.2.111,因为

HHARM9开发平台在烧写时默认的IP为192.168.2.222,所以建议PC机也在此网段

(192.168.2.X),故我们选择了此IP地址。

然后配置NFS服务器,它是用于网络文档的共享之用的,可以把网络上的某个服务器

最后配置TFTP服务器,它是用于在网络中传送大型文件时用的,通过它可以方便进行

开发板上程序的调试与这两个服务器分不开,需要使用NFS的mount命令来共享宿主机

目录的,而把宿主机上的镜像文件下载到开发板的内存中去则需要使用TFTP服务器,所

以这两个配置非常重要。

(3)minicom的配置

minicom是一个RedHat Linux9.0自带的通信终端程序,通过minicom可以设置、监

视串口工作状态,接收、显示串口收到的信息,并且在主机和开发板之间传递数据和控制

17

的内容mount到本PC上,达到在本机访问网络服务器的目的。

文件的传输。以上的详细配置可以参见参考文献[2]中“NFS和TFTP服务器的配置”一节。

指令,从而实现通过主机上调试开发板的目的。

首先在shell下运行ln -sf /dev/ttyS0 /dev/modem来设置使用第一个串口,然后设

置minicom的配置文件/etc/为

pr port /dev/ttyS0

pu baudrate 115200

pu minit

pu mreset

pu rtscts No

它表示端口为/dev/ttyS0、波特率为115200、数据位8位、停止位1位、无奇偶校验

位、无数据流控制。

2.3.3 交叉开发环境的建立

PC Linux上的编译器安装于/usr/bin目录下,这是在完全安装RedHat Linux时已经安

装好的,但是对于交叉编译,需要交叉编译器来生成可以在ARM开发板上执行的二进制应

用程序。

我们安装的是ARM板的交叉编译器,可以上网去下载编译器,也可以使用华恒实验箱

自带的编译工具。这里我们使用后者,安装华恒的光盘后,即可在/opt/host/armv4l/bin

目录下安装了交叉编译器

[2]

为了以后使用的方便,我们还可以在可执行程序的路径加入到PATH中去:

#vim ~/.bashrc

在.bashrc最后面加上一句

export PATH=”$PATH:/opt/host/armv4l/bin”

再执行

#source .bashrc

重启环境变量。当需要使用时就可指出编译器的位置。

2.3.4 内核的编译

安装华恒提供的光盘时,嵌入式 Linux 内核及设备驱动源代码(光盘安装后建立完备

的开发环境)被安装到/HHARM2410/kernel 目录下,交叉编译的工具如下表2-2所示被放

置到/opt/host/armv4l目录下。

表2-2 交叉编译的工具

18

GNU 工具集

armv4l-unknown-linux-gcc armv4l-unknown-linux-cc1plus armv4l-unknown-linux-ranlib

armv4l-unknown-linux-as armv4l-unknown-linux-objcopy armv4l-unknown-linux-strings

armv4l-unknown-linux-ld armv4l-unknown-linux-objdump mv4l-unknown-linux-gdb

armv4l-unknown-linux-g++ armv4l-unknown-linux-strip

armv4l-unknown-linux-cc1 armv4l-unknown-linux-nm

armv4l-unknown-linux-cpp armv4l-unknown-linux-ar

cd /HHARM2410-R3/kernel

make zImage

编译完成后,就会自动把zImage复制到/tftpboot/目录下以供 TFTP 下载。

如果需要对内核进行配置和裁剪,可以在/HHARM2410/kernel 目录下键入

make menuconfig

则出现如下界面,可逐项对内核和驱动模块进行选择和配置:

可见内核版本为:Linux Kernel v2.4.18-rmk7-pxa1

Armv4l-unknown-linux-gasp

Armv4l-unknown-linux-size

Armv4l-unknown-linux-addr2line

图2-13 配置内核

一些关键的设置:

System Type --->

(S3C2410-based) ARM system type

--- S3C2410 Implementation

19

[*] SMDK (MERI TECH BOARD)

[*] change AIJI

< > S3C2410 USB function support

--- Processor Type

[*] ARM920T CPU idle

[*] ARM920T I-Cache on

[*] ARM920T D-Cache on

[ ] Force write through caches on ARM920T

[ ] Support Thumb instructions (experimental)

完成自己的设置后,退出,保存配置,然后执行 make zImage即可编译生成自己定制的内

核映像文件,并自动被复制到/tftpboot/目录下以供烧写。

2.3.5 烧制内核映像和文件系统

内核映像和文件系统烧写的大致过程如下:

(1)在PC机启动minicom,按复位键重启开发板,在minicom 中应该有启动信息,

立即按空格键或回车键,让开发板停留在ppcboot的提示符“SMDK2410 #”,进行以下烧

写;

(2)下载、烧写内核

zImage,tftp 0x30008000 zImage //通过TFTP 下载内核

fl 0x40000 0x30008000 0xe0000 //烧写刚下载的文件到指定的位置。

(3)下载、烧写文件系统 ;

tftp 0x30800000 //通过TFTP下载ramdisk文件系统

fl 0x140000 0x30800000 0x240000

(4)下载、烧写cramfs文件系统和JFFS2 文件系统,

tftp 0x30008000 //通过 TFTP 下载cramfs文件系统

fl 0x540000 0x30008000 0x200000

tftp 0x30008000 //通过TFTP 下载 jffs2 文件系统

fl 0x700000 0x30008000 0x200000

2.4 嵌入式图形用户界面的实现

2.4.1 图形用户界面minigui的简介

20

烧完后重新启动开发板,便可以从flash里面读出配置的内核以及根文件系统并运行

Linux。

自 MiniGUI 从 1998 年底推出以来,越来越多的人开始选择 MiniGUI 在 Linux 上开

发实时嵌入式系统。MiniGUI 系统也逐渐成熟,应用到各种嵌入式系统中,包括PDA、机

顶盒、DVD、MP4播放器等。本文讲解基于 Linux 和 MiniGUI 的嵌入式系统软件开发,,

其内容不仅仅限于 MiniGUI 的编程,还会涉及到一些 Linux 下嵌入式系统软件开发的技

巧,包括交叉编译环境的建立,根文件系统的生成等。

MiniGUI 是由北京飞漫软件技术有限公司拥有版权并主持和维护的自由软件,遵循

GPL 条款发布(1.2.6及之前的版本以LGPL条款发布),其目标是为实时嵌入式

Linux/

Clinux、eCos、

C/OS-II、VxWorks 等操作系统建立一个快速、稳定和轻量级

的图形用户界面支持系统。与QT/Embeddoed、MicoroWindows等其他GUI相比,MiniGUI

最大的特点是占用资源少,在主频为66M的ARM7内核也能够稳定的运行。经过几年的发

展已经发布了很多的版本,现在比较稳定的是1.3.x版本,而且源码是开放的,方便我们

大家学习的研究。本文就是采用的此版本

[14]

2.4.2 MiniGUI在S3C2410开发板上的移植过程

(1) 交叉编译MiniGUI

首先,从网上下载三个源码包(/访问网址超出本站范围,不

能确定是否安全 继续访问 取消访问/),同时可以下载到相应的

用户手册

[15]

:MiniGUI 函数库源代码,其中包括libminigui、libmgext

和 libvcongui。

: MiniGUI 所使用的资源, 包括基本字体、图标、位图

和鼠标光标。

:MiniGUI的综合演示程序。

先安装MiniGUI的函数库,我们先在PC的根目录下建立一个名为minigui的目录,将

下载的三个源码包全部复制到minigui目录下,再在minigui目录下建立一个名为

miniguitmp的目录,用来存放生成的文件和minigui库函数。

解压(tar zxf )

生成目录,编写脚本文件配置lib内容如下:

./configure—host=arm-unknown-linux—enable=jpgsupport=no

--enable-pngsupport=no—enable-gifsupport=no –disable-lite

--prefix=/minigui/miniguitmp –enable-smdk2410ial=yes

保存为

host用于指明宿主机的类型disable-lite用来指定生成基于线程的minigui版本而

不是生成基于进程的minigui版本prefix用于指定MiniGUI函数库的安装路径

/minigui/miniguitmp,进入该目录运行./configure脚本文件,我们为了适合我们的开发

板做了适当的修改,其他的开发板类似。

21

根据PC机的交叉编译环境安装的路径修改目录下的configure文

件,在文件的开头处加入编译器的安装路径,然后保存,笔者主机上交叉编译器安装路径

是/usr/local/arm/,所以修改如下:

CC=/usr/local/arm/3.3.2/bin/arm-linux-gcc

CPP=/usr/local/arm/3.3.2/bin/cpp

LD=/usr/local/arm/3.3.2/bin/arm-linux-ld

AR=/usr/local/arm/3.3.2/bin/arm-linux-ar

RANLIB=/usr/local/arm/3.3.2/bin/arm-linux-ranlib

STRIP=/usr/local/arm/3.3.2/bin/arm-linux-strip

然后运行脚本文件

./

make

make install

如果运行成功,就会生成定制的MakeFile文件,执行make和make install 后相应的函

数库就安装到/minigui/miniguitmp/lib下,在执行make install命令是用户一定要具有

root权限。

下面安装MiniGUI资源,这些资源包括基本字体、图标、位图和鼠标光标等等。解压

minigui-res- 1.3.x (ar zxf minigui-res-1.3.x ),进入生成目录,修

改文件,指明TOPDIR= /minigui1.3.3/miniguitmp

执行

make install

就可以把相关文件拷贝到/minigui/miniguitmp/目录下的相关目录中去。

执行后会在/minigui/miniguitmp/ 下生成usr/local/lib/minigui/res 相关目录,以下

为res目录下的子目录,用户有兴趣可以进入以下目录查看其中的内容。

bmp

cursor

font

icon

imetab

(2) 制作带有MiniGUI的文件系统映象(root_)

CRAMFS是Linus Torvalds撰写的只具备基本特性的文件系统。CRAMFS是一个简单的,

经压缩以及只读的文件系统,通常要为文件系统建立映象,首先要建立并安装CRAMFS工

具,在这里我们使用mkcramfs工具建立自己的文件系统映象。

开发板上的linux,自带有VESA FrameBuffer设备驱动程序,并且初始状态已经激活,

这样MiniGUI就可以使用FrameBuffer作为图象引擎来显示图象。

将/minigui/miniguitmp/lib中所有的库文件复制到root_minigui的/usr/lib 中,

22

将 /minigui/miniguitmp/usr/local/lib/minigui目录复制到root_minigui的/usr/lib

目录中,在 /root_dir/root_minigui/usr/local 下执行ln –s /usr/lib lib,生成一个

链接文件。

修改/minigui/miniguitmp/etc/文件,找到

ial_engine=console

mdev=/dev/mouse

改为

ial_engine=SMDK2410

mdev=/dev/ts

然后保存退出。

把/minigui1.3.3/miniguitmp/etc/文件复制到

/root_dir/root_minigui/usr/local/目录中。

以上把MiniGUI运行库和其它资源环境已经拷贝到root_minigui文件系统中,同时把

mde-1..3.0/src/下可执行文复制到/usr/local/bin下。然后编译文件系统,在/root_dir

执行

[root@localhost root_dir]# mkcramfs root_minigui root_

就可以生成 root_ 文件系统映象,把root_ 复制到 PC

机的/tftproot 下,通过tftp命令把文件系统下载到2410开发板上。

重启开发板后执行:

#cp

制到/tmp 临时目录下

#cd

/tmp

//用cd 命令去到/tmp 目录下

经过以上工作,用户就可以在/tmp目录下执行自己的应用程序了。

例如:

执行

#chmod 777 helloworld //改变

权限,使其为可执行

#./helloworld

//执行 helloworld

这样就成功的将带有minigui界面的文件系统成功的移植到了我们的开发板上了。

23

/usr/local/bin/*

/tmp //将可执行文件复

24

第三章 Mplayer的移植

3.1 Mplayer的简介

MPlayer是Linux上的电影播放器(也能跑在许多其它平台上,甚至非x86CPU上)。它

能使用众多的本地的,XAnim,RealPlayer,和 Win32 DLL编解码器,播放大多数MPEG,

VOB,AVI,OGG,VIVO,ASF/WMV,QT/MOV,FLI,RM,Nuppe1Video,yuv4mpeg,FILM,RoQ

文件。你还能观看VideoCD,SVCD,DVD,3ivx,Rea1Media,和DivX格式的电影。Mplayer

的另一个大的特色是广泛的输出设备支持。它可以在X11,Xv,DGA,OpenGL,SVGAlib,

fbdev,AAlib,DirectFB上工作,而且也能使用GGI和SDL(由此可以使用他们支持的各

种驱动模式)和一些低级的硬件相关的驱动模式(比如Matrox,3Dfx和Radeon,Mach64,

Permedia3)!他们大多数支持软件或者硬件缩放,因此你能在全屏下观赏电影。 MPlayer

还支持通过硬件MPEG解码卡显示。可以使用European/IS08859-1,2(匈牙利语,英语,

捷克语等等),西里尔语,韩语的字体的清晰放大并且反锯齿的字幕(支持10种格式)。

该播放器能够稳如泰山的播放被破坏的MPEG文件(对一些VCD有用),而它能播放著名

的 windows media player都打不开的坏AVI文件。甚至,没有索引部分的AVI文件可播

放,你能暂时由重建他们的索引-idx选择,或者用MEncoder永久重建,使你能够在影片

中搜索!如你所见,稳定和质量是最重要的事情,而且他的速度是也惊人的。由此,能够

将 Mp1ayer移植到嵌入式系统中将极大丰富嵌入式设备的多媒体性能。

[1]

3.2 Mplayer的移植

3.2.1 安装交叉编译工具及解压源代码

首先下载交叉编译工具及Mplayer源代码(其实华恒提供的实验资料的application

里面就有Mplayer-0.91的源代码),其实可以选择到Mplayer的官方网站去下载最新的

Mplayer的开源代码,另一种就是选用华恒提供的Mplayer-0.91的源代码。我选择后一种

方案。交叉编译工具选择2,这个有70多M,将arm-linux-gcc

安装到/usr/local/arm/3.3.2/bin下,确保有root权限,假设arm-linux-gcc工具包放

在~/src目录下,执行以下的操作。当然也可以将arm-linux-gcc安装到其它地方。

cd /

tar jxvf ~ /src/2

修改 $PATH变量包含arm-linux-gcc,木文是修改当前用户home目录下的.bash_profile

文件。在.bash_profile文件中增加一行:

$PATH=/usr/loeal/arm/3.3.2/bin:$PATH

这样交叉编译工具便可以使用了。

3.2.2 编译Mplayer

首先是对Mplayer进行配置,Mplayer提供了很多配置选项,执行以下命令可以查看:

./configure –help

本文在编译时的配置命令如下:

25

./configure --cc=/usr/local/arm/3.3.2/bin/arm-linux-gcc

--target=arm-linux

--enable-static

--disable-win32

--disable-dvdread

--enable-fbdev

--disable-mencoder

--disable-live

--enable-mad

--enable-libavcodec

--disable-tv

--with-extralibdir=/usr/local/arm/3.3.2/lib/lib

--with-extraincdir=/usr/local/arm/3.3.2/lib/include

--disable-sdl

--disable-gui

--disable-mpdvdkit

--enable-linux-devfs

--cc=/usr/local/arm/3.3.2/bin/arm-linux-gcc这个是用来指定交叉编译器。

--target=arm-linux这个参数要注意的是一个分两部分,第一部分的arm是指arch,

这里设定为arm;第二部分的linux是指系统平台。

--enable-static是用来设定静态链接,不需要动态。

--enable-fbdev是支持Framebuffer显示,因嵌入式系统中不具备PC机那样的显卡

系统,本开发系统采用的是Framebuffer驱动来实现图像的播放,如果不加此项,编译生

成的可执行文件在开发板上不能够显示图像。其他选项可以根据个人喜好选用。

接下来开始跨平台编译,执行:

make

在编译过程中会出现几个错误,缺少头文件和解码库的问题,首先第一个是在

libmpcodecs和libavcodec这两个目录下,有一个疏漏,就是这两个目录的源文件都以

#ineude“config.h”的方式引用头文件“config.h”,但是在这两个目录下并不存在该头

文件“config.h”,这些源文件实际是期望引用mplayer安装包根目录下的“config.h”

头文件,因此我们需要在libmpcodecs、libavcodec这两个目录下手动建立一个名为

config.h的链接并指向mplayer安装包根目录下的“config.h”头文件,建立方法如下:

$>cd 1ibmpeodees

$>ln –s .. /config.h config.h

$>cd ../

$>cd 1ibaveodec

26

$)ln –s .. /config.h config.h

第二个比较重大的错误是找不到mad.h的错误,后来上网查找资料,解决问题,下面

(1) 交叉编译libmad

下载libmad包();

打开一个终端,进入libmad的目录,输入配置命令:

./configure --enable-fpm=arm --host=arm-linux --disable-shared(这个选项就

就是针对这个问题的解决方案:

是说明要静态编译) --disable-debugging --prefix=/usr/local/arm/3.3.2/lib

CC=/usr/local/arm/3.3.2/bin/arm-linux-gcc

make

make install

这样/usr/local/arm/3.3.2/lib 目录下多了include和lib目录,这些就是libmad相关

的库。

(2) 在 configure mplayer的时候,要加上以下几个选项:

--enable-mad

--with-extraincdir=/usr/local/arm/3.3.2/lib/include(这个指明 mad.h 这个文件所

在的路径)

--with-extralibdir=/usr/local/arm/3.3.2/lib/lib(这个指明libmad相关链接库所在

的路径)

通过以上两个步骤,就可以把libmad交叉编译到mplayer中去了。

解决了这两个问题之后,几乎就没有什么大问题了,编译顺利通过,得到mplayer的

3.3 调试

利用配置好的NFS对编译通过的可执行文件进行调试,将整个PC机mount到开发板,

./mplayer

利用可执行文件mplayer播放影音文件,如下:

屏幕没反应,液晶屏也没有显示,后来上网查找原因,了解到是声音驱动的问题,后来执

行:

./mplayer -nosound

通过网上查找资料,以上那个问题产生的根源追溯到音频的驱动部分。华恒的这块

液晶屏幕出现画面,播放很流畅,只是没有声音。

HHARM-EDU-R3板子使用的是飞利浦音频解码芯片UDA1380,这个驱动基本符合了OSS的规

范,但是当使用到多段DMA音频数据传输时,出现了一个问题,即DMA缓冲的建立发生在

第一次调用write()函数将音频数据传送到设备描述符的时候,然而OSS驱动的调用者通

常要在打开音频设备描述时候,就期望获取DMA缓冲的信息,然而因为缓冲尚未建立,因

而返回缓冲大小为0这个结果。

27

可执行文件,有3M左右大小。

解决的办法是在音频驱动源码smdk2410_audio_open()函数体,加上如下一段代码:

if (!output_stream .buffers && audio_setup_buf(&output_stream)

)

return -ENOMEM;

具体位置如下:

if (cold) {

audio_rate = AUDIO_RATE_DEF

AULT;

audio_channels = AUDIO_CHAN

NELS_DEFAULT;

audio_fragsize = AUDIO_FRAG

SIZE_DEFAULT;

audio_nbfrags = AUDIO_NBFRA

GS_DEFAULT;

//加上以上这行代码

if (!output_stream .buffers && audio_setup_buf(&output_stream))

return -ENOMEM;

MOD_INC_USE_COUNT;

return 0;

}

然后重新编译内核,再烧写到开发板上,重新运行mplayer程序,可是还是无声播放。

后来再仔细检查,发现原来没有加载音频驱动 2410audio.o。总得来说,整个实验箱

28

}

是由S3C2410 通过 IIS(Inter-IC Sound)总线与音频控制芯片 UDA1380 进行通信。放

音时发送数据到 UDA1380 的 DATAI 管脚,录音时从 UDA1380 的 DATAO 管脚接收数据,

其数据传输方式为 DMA 方式。

S3C2410 的音频驱动 2410audio.o 由 2410audio.c 来实现,放音时调用函数

smdk2410_audio_write 来对外发送数据,录音时通过函数 smdk2410_audio_read 接收数

据。

在 S3C2410 音频驱动加载时,需要:

(1) 设置 GPI/O模式,并初始化 IIS 总线;

(2) 通过 I2C对 UDA1380 的各个寄存器进行初始化,使 UDA1380 可正确工作;

(3) 设置数据输入和输出的 DMA 通道,并发出 DMA 请求;

(4) 申请音频设备。

在驱动卸载时,必须:

(1) 将申请的音频设备注销;

(2) 申请的 DMA 通道释放。

而我的解决方法是在编译了2410audio.c之后,利用配置好的NFS直接把PC机mount

insmod 2410audio.o

加载完成后重新运行mplayer:

./mplayer -ac mad 3

./mplayer

出现这样的问题,我仔细想了一下,播放mp3文件的时候声音很流畅,令其无声

到开发板,动态加载2410audio.o:

通过实验箱的音频输出口播放出悠扬的音乐,接着播放音视频文件,直接播放的时候:

LCD液晶显示屏出现了画面,但是很卡,极不流畅,声音也是时断时续。

(nosound)播放avi文件时画面也是非常流畅,那问题肯定出现在音频解码这一块,因

为我在交叉编译的时候是额外附加了音频解码包libmad的,没有直接使用mplayer自带

的mp3lib音频解码包,于是我在播放影音文件时指定音频解码方式:

./mplayer -ac mad

播放画面及声音都非常流畅,同时达到音视频同步,以下图3-1就是播放视频图像:

29

图3-1 开发板视频播放画面

30

第四章 嵌入式播放器Mplayer的设计

4.1 播放器的工作流程

媒体播放器要具备解码、音视频同步、播放的功能,其工作流程图如下图4-1所示。

首先,播放器进行自身的初始化,包括检测硬件平台、出错信息处理,打开实时时钟等等。

然后读入媒体数据文件,并对文件格式进行解析。通过解析文件格式选择相应的分流器对

音视频数据进行分流,并将分流后的数据存入到音视频各自的缓冲区中等待处理。下一步

读取缓冲区中音、视频各自的头信息,分别将初始化音、视频的过滤器及解码器,开始进

行解码。解码后收集时间戳,音、视频做同步处理。最后,将处理后的音、视频分别送到

各自的输出设备上进行播出。

开始

系统初始化

读入媒体文件并分析媒体类型

将音视频数据分流到不同的缓冲区

音视频分别进行解码

No

音视频同步

将音视频送入到相应的输出设备播放

Yes

处理完所有帧?

结束

图4-1 播放器工作流程图

4.2 播放器的逻辑结构

下图4-2展示了嵌入式播放器Mplayer的逻辑结构,该结构主要分为4个功能层,它

们分别是:

(1) 输入层(input layer):包含读取媒体文件模块,主要负责将文件中的媒体数据按照

流的方式读入进来,并将数据存放到一块缓冲区中,解析文件头从而判断该流属于何种音、

视频的文件。

31

(2) 分流层(demuxer layer):即图中分流部分,其主要功能模块为分流器,它的功能是

依靠数据头来判断音、视频在这段文件数据中的各自位置,继而对音、视频进行分离。分

离后的音、视频数据将分别存入各自缓冲区。分流器同时将提取时间戳(PTS, Presentation

time stamp),随音、视频数据一同传送。通过PTS,我们可以有效的控制音频和视频的同

步输出。

(3) 解码层(decoder layer):该层不但包含音、视频的解码模块,也包含了音、视频解

码器的选择模块。在解码层中,由音、视频解码模块根据分流器分离出来的音、视频数据

的压缩格式。初始化对应格式的音、视频解码器以便将音、视频数据分别进行解码,将解

码出来的信息输出,传递给下一级的输出层。

(4) 输出层(output layer):主要包含音视频同步,音频输出和视频输出三个模块。这一

层由输出模块选择最合适的输出设备驱动,根据PTS确定的同步机制进行音、视频的播放

以达到同步的目的。

音频解码

器选择

音频解码

音频输出

媒体

文件

读取媒体

文件数据

分流

音视频同步

视频解码

视频输出

视频解码

器选择

图4-2 播放器的逻辑结构

4.3 Mplayer播放器的目录文件组织结构

为了实现Mplayer媒体播放器的强大功能,其源代码的文件非常庞杂,其中一部分功

能是嵌入式播放器所不需要的,因此我们要对其进行必要的删改。考虑到嵌入式播放器的

的需求,我们去掉了其对TV、VCD、DVD支持的功能,其主要目录及文件功能如下表4-1

所示:

表4-1 播放器主要目录及文件功能

目录名

32

目录功能

文件名

mp_msg.c

playtree.c

cputable.h

cpudetect.c

mplayer.c

件调度,如图4-3所示:

A、分流

mplayer.c

B、解码

媒体数据分析分流库

媒体编解码库

音频输出库

视频输出库

外设输入

与OS相关的文件

音频过滤器库

文件功能

播放器出错信息处理功能实现

播放列表功能实现

CPU类型定义

检测CPU类型

主程序

播放器开始运行后,主程序文件mplayer.c负责分流、解码、输出三个功能模块的文

C、输出

dec_audio.c

dec_video.c

video_out.c

vo_*.c

display

stream.c

ad.c

stream_*.c

ad_*.c

vd.c

vd_*.c

demuxer.c

demux_*.c

audeo_out.c

ao_*.c

audio

系统os层文件操作

af.c

af_*.c

vf.c

vf_*.c

libmpdemux

图4-3 播放器的目录文件组织结构

A、分流

对输入的媒体数据进行分流所要调用的文件都存放在媒体数据分析分流库

33

当中。首先调用stream.c文件,判断数据流类型,播放器一共定义六种文

件流类型,因而存在六种文件,分别是stream_file.c、stream_ftp.c、

stream_netstream.c、stream_null.c、stream_vcd.c、stream_vstream.c。从中挑选出

正确的文件进行数据流的处理。下一步调用demuxer.c文件,判断媒体类型,继而调用对

应的分流器文件对媒体数据进行音、视频的分流。播放器包含的分流器类型很多,常用的

有demux_asf.c、demux_avi.c、demux_mpg.c、demux_mov.c等等。

B、解码

解码分为视频解码和音频解码。以视频解码为例,媒体编解码库中的

dec_video.c文件读取视频数据的相关编码信息,判断视频格式。下一步调用视频编解码

中的vd.c文件,从中选择对应的解码器。最后由vd_ffmpeg.c(以ffmpeg

解码器为例)对视频数据进行解码。若要对视频进行控制,如亮度设置、对比度设置、图

像翻转、放大缩小等,还要从vf.c文件中选择相应滤波器对视频进行滤波处理。

C、输出

输出也分为视频输出和音频输出。以视频输出为例,视频输出库中的文件

video_out.c首先判断输出设备类型(如framebuffer),继而调用相应的设备驱动。通过

vo_fbdev.c将解码后的视频按照帧的方式从framebuffer设备上播放。

4.4 播放器对解码器和输出设备的管理方式

媒体文件格式的多样性决定了媒体播放器要处理各种类型的音、视频数据,媒体播放

器高效的全局变量调用关系,使其能够为特定的音、视频数据快速准确地找到对应的解码

器,为不同的输出设备安装相应的设备驱动。

播放器将解码相关函数的指针放入一个结构体中,这个结构体在设计模式的意义上讲

就是一个接口,这些接口被链在了一起,形成了一个接口表,通过对接口表的查询找出恰

当的解码接口参与解码操作。如下图4-4所示,播放器通过分析输入进来的媒体文件头信

息,从数据流列表(auto_open_streams)中选取对应的数据流类型,进而在分流器列表

当中选择正确的分流器(demuxer)来对媒体文件进行音、视频分流。以视频ffmpeg解码

器为例,这个解码器本身支持多种解码格式。播放器首先从视频驱动解码列表

(mpcodecs_vd_drivers)中选择ffmpeg视频库解码驱动(mpcodecs_vd_ffmpeg),ffmpeg

对每种压缩格式所提供的解码接口函数都被记录到一个叫AVCodec的结构之中,所有的这

些结构被链成一个链表,表头存放在一个静态变量之中,可以通过avcodec_find_decoder()

函数来查找链表中的结构取得需要的AVCodec结构进行解码。在这种方式下,要添加一个

或一系列新的解码器是非常容易的,只需要将解码器的解码接口函数加入一个新的

AVCodec结构之中并将这个结构添加到链表之中,这样就可以通过同样的方法使用新加入

的解码器了。对输入设备的管理与对解码器的管理十分的相似,它将所有的输出函数指针

都存放到一个vo_functions_t的结构体中,这些结构被统一存放于数组

video_out_drivers之中,播放器提供了一个init_best_video_out方法来查询这个数组,

如果成功的话会返回一个指定vo_functions结构的指针,通过这个结构,可以操作特定

34

的输出设备(如framebuffer)。

mpcodecs_admp3lib

mp3音频库解码驱动

filter_list

音频过滤器列表

mpcodecs_ad_mp3lib

mp3音频库解码驱动

mpcodecs_admp3lib

mp3音频库解码列表

audio_out_oss

oss音频输出

audio_out_drivers

音频输出

auto_open_streams

数据流列表

demuxer

分流器

音频输出设备驱动列表

video_out_drivers

视频输出设备驱动列表

视频输出

mpcodecs_vd_drivers

视频驱动解码列表

video_out_fbdev

framebuffer输出

filter_list

视频过滤器列

mpcodecs_vd_ffmpeg

ffmpeg视频库解码驱动

mpcodecs_vd_fimpeg

ffmpeg视频库解码驱动

图4-4 播放器对解码器的输出设备的管理方式

35

第五章 总结与展望

5.1 本文主要完成的工作及结论

(1) 论文对嵌入式系统的概念、发展特点进行了分析研究,通过对嵌入式各种处理器

和嵌入式系统的各种操作系统的分析对比,得出“ARM9+LINUX”在嵌入式系统应用开发中

的发展优势和前景。

(2) 学习基于ARM平台开发相应的引导加载程序、并构建嵌入式Linux操作系统;搭

建系统软硬件平台,包括ARM处理器及硬件核心部件、boot1oader实现、交叉开发环境建

立、Linux移植、minigui移植等;

(3) 在了解Mplayer的基础上,通过修改和调试,实现播放器Mplayer到开发板的移

植,针对ARM处理器和Linux操作系统特点进行音视频解码器的设计和研究;

(4) 最后,在熟悉ARM平台和Linux的基础之上对系统进行了测试及验证。

5.2 完善与展望

虽然目前已经做了不少工作,但是考虑到系统功能扩展性的需求,今后一段时间可以

(1) 图形用户界面的开发完善,本文的媒体播放器还没有具备图形接口,在可操作性

在以下方面继续展开工作:

和人机交互性上尚有欠缺。需要对其开发图形界面,使用户配合TFT LCD的触摸屏可以方

便地控制播放器的活动;

(2) 现在市面上流行的便携式多媒体播放器功能丰富注重娱乐的同时兼顾实用性,而

本文的媒体播放器仅支持音视频文件播放,功能单一,为此以后的工作还应扩展如网络下

载、文字处理、图片浏览等功能。

36

致谢

该设计及论文的撰写都是在李芬兰老师的悉心指导下和同学们的帮助下,我才得以完

成论文的所有工作,李老师对工作认真负责,为我们提供良好的实验环境与指导,及时督

促我们认真对待毕业设计,更是时时刻刻关心我们设计的进展情况,并及时为我们解答疑

难,让我们能够踏踏实实地、认真地完成设计。在此,我由衷地感谢李老师教导我们做人

的道理及传授很多专业知识,这一切将会使我受益终生。

此外,还要感谢曾经给予我帮助的师兄姐及同学。

37