网络工程毕业论文_第1页
网络工程毕业论文_第2页
网络工程毕业论文_第3页
网络工程毕业论文_第4页
网络工程毕业论文_第5页
已阅读5页,还剩34页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1 题 目: 基于 linux 的嵌入式流媒体点播系统 学 号: 20090902320123 系 别: 应用计算机系 专 业: 网络工程 指导教师: 胡祝华 摘 要 随着嵌入式系统以及计算机网络通信技术、多媒体应用程序的快速发展,基于嵌入式 linux 的家庭娱乐中心、视频点播和实时会议系统已经成为一个开发的热点。这种系统因其体 积小、功耗低、使用方便而广受青睐。 论文主要做了 uboot 移植、 kernel 移植、以及播放器主界面设计的工作。内核采用 linux-,针对 mini2440 开发板对内核做了板级的定制。使用 Qt 设计了播放器主界面。 论文介绍了 RTSP 流媒体协议的体系结构和工作原理。把流媒体视频点播相关技术应用到嵌入式系统中,在嵌入式 S3C2440 硬件平台和 Linux 操作系统上开发实现一个 VOD 系统。该视频点播系统提供了美观、友好的 TQ图形用户界面,可以进行本地播放和网络播放,实现了视频点播的基本功能。 关键 字:嵌入式系统;实时流传输协议;流媒体;视频点播 2 ABSTRACT With the embedded system and computer network communication technology, the rapid development of multimedia applications, home entertainment center, video on demand based on embedded Linux and real-time conference system development has become a hot spot. This system because of its small volume, low power consumption, easy to use and popular. Thesis mainly do the uboot, the transplantation of the kernel, and players main interface design work. The kernel of Linux - used against mini2440 development threatening the custom kernel did the board level. Based on the Qt player main interface is designed. Paper introduces the system structure and working principle of RTSP streaming protocols. The streaming video on demand technology applied to embedded systems, on S3C2440 embedded hardware platform and the Linux operating system development and implementation of a VOD system. The video on demand system provides the TQ is beautiful, friendly graphical user interface, can undertake local broadcast and Internet broadcast, has realized the basic function of video on demand. KEY WORDS: Embedded system; Real Time Streaming Protocol; Stream media; Video on Demand 3 目录 1 绪论 . 1 1.1 嵌入式 Linux流媒体点播的应用背景 . 1 1.2 研究意义 . 1 2 流媒体 相关技术介绍 . 2 2.1 VOD介绍 . 2 2.2技术介绍 . 2 2.2.1 AVI . 2 2.2.2 MPEG-4 . 3 2.3 流传输技术 . 3 2.3.1 流媒体技术和流式传输方式 . 3 2.4 实时流媒体传输协议介绍 . 4 2.4.1 RTSP . 4 2.5 交叉编译 . 5 3 系统的需求说明 . 7 3.1多媒体点播系统功能需求 . 7 4 系统的总体设计 . 8 4.1 系统总体划分 . 8 4.2实现模式: C/S模型 . 9 5 系统的详细设计及实现 . 11 5.1 嵌入式系统开发环境的搭建 . 11 5.1.1 建立工作目录 . 11 5.1.2 建立交叉编译环境 . 11 5.2 嵌入式 linux 的 uboot移植 . 12 5.2.1 bootloader介绍 . 12 5.2.2 在嵌入式 Linux 中 BootLoader 的重要性 . 13 5.2.3 u-boot引导流程 . 13 5.2.4 u-boot移植步骤 . 14 5.2.5 建立开发板文件并测试编译环境 . 15 5.2.6 在 /board 中建立 mini2440 目录和文件 . 15 5.2.7 在 include/configs/中建立开发板配置文件 . 15 4 5.3 linux内核配置与编译 . 16 5.3.1 内核简介 . 16 5.3.2 建立目标平台 . 17 5.3.3 移植 Nand 驱动并修改分区信息 . 18 5.3.4 为内核打补丁支持 yaffs2 . 19 5.3.5 移植 DM9000 网卡驱动 . 19 5.3.6 移植 LCD 显示驱动 . 20 5.3.7 添加触摸屏驱动 . 21 5.3.8 移植 SD 卡驱动 . 22 5.4流媒体播放器设计 . 23 5.4.1 播放器主界面工作流程 . 23 5.4.2 播放 解码处理 . 24 5.4.3 播放器主界面设计 . 24 6 系统的集成与调试 . 30 6.1系统集成 . 30 6.2 系统播放 . 30 7总结 . 32 致谢 . 33 参考 文献 . 34 5 1 1 绪论 1.1 嵌入式 Linux流媒体点播的应用背景 随着多媒体计算机技术、移动通信技术的快速发展以及便携式移动终端设备的普及,使嵌入式开发得到了快速发展。在现代计算机网络技术快速发展的基础上,多媒体计算机技术和多媒体网络技术越来越广泛地应用到视频点播系统。在远程医疗,酒店 VOD,远程实时视频会议上得到了越来越广泛的应用,并且智能化成为其发展一大趋势。 1.2 研究意义 在这个信息化的时代,嵌入视频 VOD系统正在融入人们的生活,比如 KTV点播系统、智能电视等等,这些都使人们能更加高效便捷的享受信息资源,极大地方便了人们的生活,这使得嵌入式 VOD系统开发成为一个热点。 嵌入式开发不同于传统的有着丰富资源的 PC 开发,嵌入式开发往往是基于受限的硬件资源,这在技术和实施难度上对嵌入式流媒体点播提出了更高的要求,成为研究嵌入式多媒体点播的难点。同时嵌入式技术发展迅速,随着嵌入式产品快速地更新换代,系统还要有良好的扩展性。 2 2 流媒体相关技术介绍 2.1 VOD介绍 VOD 是 Video On Demand 的缩写 。视频点播是计算机技术、网络技术、多媒体技术发展的产物 01。现代社会中,高端嵌入式移动终端成为人们接受信息资源的便捷方式。视频点播系统不仅可以为用户提供丰富的网络信息资源而且在远程教育、智能家电等领域得到越来越广泛的应用。 用户可以按照自己的需求点播视频,即播即放,并且可以实现暂停、快进、后退等操作,这种系统播放等待时间小并且支持多种流媒体视频格式。随着智能家电、智能汽车的快速发展,嵌入式 VOD必将得到越来越广泛的应用。 2.2技术介绍 进入信息时代,数字化后的视频文件具有海量性,由于目前的网 络带宽有限,在网络传输高清大视频文件是一件很不容易的事,因为传输速度和视频质量很难满足用户的需求。所以要实现视频点播的功能必须对这些要传输的视频数据进行压缩和解压缩。随着多媒体技术的不断发展,多媒体数据的存储与压缩技术已经相对比较成熟,例如 H.261,MPEG-4 等,其中 MPEG标准已经从 MPEG-1、 MPEG-2 发展到了目前应用比较广泛的 MPEG-4 标准 02。 2.2.1 AVI AVI是将语音和影像同步组合在一起的文件格式,是微软公司 1992 年推出的视频格式,可以将视频和音频交织在一起进行同 步播放。这种播放方式不仅可以提高系统的工作效率,同时也可以迅速地加载和启动播放程序,减少播放 AVI视频数据时的用户等待时间。 AVI格式文件结构由文件头、索引块和数据块组成。AVI文件主要参数有影像参数、伴音参数和压缩参数。影像参数的视窗大小和帧率可以根据播放环境的硬件能力和处理速度进行调整,窗口越大视频文件越大。WAV文件时 AVI文件中伴音信号来源,包括影像与伴音的交织参数和同步控制参 3 数。 AVI 支持 256 色和 RLE 压缩, AVI 对视频文件采用有损压缩方式。这种视频格式的优点是可以跨多个平台使用,其缺点是视频文 件太大,目前是一种常用的视频文件格式。 2.2.2 MPEG-4 MPEG-4是一种包含音频和图像的压缩技术,对图像的压缩算法提供的压缩比可达到 200:1。 MPEG-4 在较高的压缩比下也能获得较高的图像质量,最大的特点是基于对象的编码方式以及对合成对象的编码能力。它支持固定和可变速率视频编码,具有高效的压缩性,其编码系统是开放的,随时可以加入新的有效的算法模块。 MPEG-4标准具有通用的访问性,适用于无线和有线网络以及固态存储,支持各种带宽的传输信道和接收端。可以利用很窄的带宽通过帧的重建技术压缩和传输数 据,从而能以最少的数据获得最佳的图像质量。 MPEG-4 的可视信息的码率范围可从 5 64kbit/s 直至 64kbit/s-4Mbit/s,并且可以兼容 MPEG-1 和 MPEG-2 已经提供的大多数功能 03。因此在 MPEG-4数字电视、动态图像和移动通信等领域得到了普遍应用。 2.3 流传输技术 2.3.1 流媒体技术和流式传输方式 流媒体是指使用流式传输的方式在网络上传输的媒体格式。流是对在网络上所传输的经过一定编码的多媒体信息的一种描述 04。在进行网络播放时,等待时间和视频质量是用户主要的 考虑因素。传统视频播放时必须整个视频文件必须全部下载下来才能观看,这会使得播放延时非常大。而现在很流行的嵌入式视频点播系统可以实现即播即放,极大地减少了等待时间,并且在播放时用户还可以进行相关的交互式操作。这种观看方式大大地满足了用户的需求。 流式传输有两种方式:实时流式传输和顺序流式传输。传统的视频播放中主要采用顺序传输方式,使用这种方式用户一般只能观看自己已经下载的视频,缺乏灵活性。实时流传输允许用户在进行视频观看时进行相关的交互式操作,支持 4 随机访问,比如前进、后退等。现对于传统的顺序传输方式视频播放, 实时流传输更能满足用户需求,逐渐成为视频点播的主流方式。 2.4 实时流媒体传输协议介绍 实时流媒体播放协议簇主要由 RTSP、 RTP 和 TRCP构成,整个 RTSP 协议栈是建立在 TCP/IP协议栈之上的。其中 RTSP提供控制功能,如播放器客户端播放、暂停、前进等功能, RTP协议负责流媒体数据的实时传输, RTCP负责检查反馈网络状况以进行相应的调整。协议簇的层次结构如图 2-1所示。 图 2-1 RTSP协 议栈 2.4.1 RTSP RTSP协议属于应用层协议,是一个多媒体播放控制协议,以 C/S 方式工作。在用户进行视频点播时,通过 rtsp 协议内部定义的方法可以实现交互式操作,比如暂停、后退、前进等。要实现 RTSP 的视频播放控制功能,不但要有协议还要有专门的客户端播放程序和视频服务器 05。 RTSP 在进行控制信息交互式是保证交付质量的 TCP 连接,但在进行数据流传输时和反馈调整使用 UDP连接,会导致分组丢失。如图 2-2所示。 RTSP 层 RTP /TRCP 层 UDP/TCP 层 IP 层 应用层 网络层 传输层 5 图 2-2 基于 C/S模式的 RTSP RTP 协议( Real Time Protocol)提供实时的数据流传输。在数据包中封装了发送数据的序列计数、标识符和时间戳等信息。 RTP协议通常是用 UDP协议来封装的,所以只提供实时的数据传输,但是不保证传输的可靠性。所以视频播放时会出现视频模糊,视频质量不佳的现象。随着视频解压缩技术和网络带宽的不断提高,客户端的视频质量会越来越好。 RTCP是 RTP的实时传输控制协议,它用于监视网络的服务质量和在正在进行的与会者会话中传递信息。通过质量反馈来进行流量的拥塞控制, 利用这些反馈信息进行传输速度的相应调整。 RTCP 是通过周期性地向会话的所有参加者进行通信来实现这样的功能的,根据会话者的数量来调整发包率。 2.5 交叉编译 嵌入式开发一般是基于一个资源受限的系统,直接在目标板上进行相关软件的编写不仅困难而且调试麻烦,一般的解决方案是利用交叉开发模型。即先在计算机上编写源程序,然后通过编译工具交叉编译,生成可以在目标平台上运行的二进制代码文件,下载到目标平台上的相应位置 06。典型的嵌入式 Linux开发使用如图所示的宿主机 /目标板开发模式。开发模型如图 2-4所示。 Server Client RTSP 流控( TCP) RTP 数据流( UDP) RTCP 分组 (UDP) 6 图 2-3交叉开发模型 交叉编译就是在一个平台上生成在另一个平台上执行的代码。本文的目标就是在 X86平台上交叉编译,产生可以在 ARM 开发板上运行的二进制文件。这需要在 PC 机上建立一个用于 ARM 目标板的交叉编译环境,本机使用交叉编译器arm-linux-gcc-4.4.3 配置如下: 名 称 嵌入式 linux 点播系统开发 CPU AMD 2445 内 存 2G 虚拟机 Server2003 下 VMWEAR Linux 系统 Fedora 交叉编译器 arm-linux-gcc-4.4.3 表 2-1 x86 主机配置 宿主机 目标板 网络 /串口 /JTAG 7 3 系统的需求说明 3.1多媒体点播系统功能需求 首先系统是基于 mini2440开发板进行设计的,所以在 uboot、 kerne 移植时要进行定制,包括 mini2440 板级的定制和和针对 VOD 需求的定制。所以在移植时系统需要加入对网卡、触摸屏等的支持。 其次点播系统是通过客户端 /服务器模式实现的,所以系统的功能需求可以客户端和服务器两大部分来划分。客户端主要实现视频播放功能,用户启动系统后进入视频点播系统主界面,为用户提供 网络点播和本地点播服务,播放时用户可以进行相关的交互式操作。服务器主要实现数据流的发送,使用户可以观看自己点播的视频文件。 嵌入式流媒体客户端需要具备的基本功能如下 : 1) 提供有好的播放界面和交互式界面; 1) 能读取视频文件,实现实时解码及音视频同步实时播放; 2) 可以播放 U盘中本地视频文件; 3) 可以拨号连接服务器,读取服务器视频文件; 4) 能够实现交互操作,实现对流媒体播放的暂停、快进、快退等功能; 嵌入式流媒体服务器端需要具备的基本功能如下 07: 1)能够提供种类丰富的视频文件:如 AVI, RMVB等; 2)以流式协议将视频文件发送给客户端,使用户可以观看其点播的视频文件; 3)实现和客户端的同步交互式操作,比如实现同步的暂停、快进等操作。 8 4 系统的总体设计 该部分主要进行系统的整体设计,需要对系统进行总体划分,一般将嵌入式流媒体播放器的系统体系结构划分为三层,包括硬件层、内核层和应用层。本文是以 mini2440为开发板,论文的主要工作集中于系统的移植和应用程序的开发。 4.1 系统总体划分 通常嵌入式 Linux 视频点播系统从软件的角度看通常可以分为四个层次,即引导加载程 序,嵌入式 LinuX内核,文件系统以及用户应用程序 08。经过嵌入式 u-boot的移植、 arm-linux内核的配置与编译以及嵌入式根文件系统的创建,基于 ARM处理器平台的最小嵌入式系统就完成了。因为此时的系统还没有任何的用户应用程序,但是下载到开发板可与看到自己的根文件系统目录了。典型的Bootloader、 bootloader 参数、内核映像和嵌入式根文件系统在 FLASH 上的存储如下图所示。 图 4-1嵌入式最小系统构成 GUI图形用户界面、通信协议栈和音视频解码器 mppalyer三个主要模块集 成在一起就构成了论文的嵌入式用户应用程序。与前面的最小嵌入式系统结合一起就构成了视频点播系统体系。体系结构如图 4-2所示。 9 图 4-2 嵌入式流媒体播放系统体系结构 4.2实现模式: C/S模型 嵌入式视频点播系统要实现本地播放和网络播放的功能,本地播放是读取 U盘中预先存在的视频文件进行播放。网络播放时在播放时连接服务器,连接成功后,读取服务器的视频资源,更新网络播放列表,点击相应的视频文件后, QT视频播放客户端会调用开源 软件 mplayer 进行音视频解码将视频显示在播放器播放窗口,并且在播放的状态下支持随机访问,可以进行暂停、快进、快退等交互式操作。 C/S工作模型如图 4-3所示。 应用层: 内核层: 引导层: 硬件层: 通信协议栈 音视频解码 GUI 嵌入式应用程序 Linux 内核 根文件系统 Bootloader 硬 件 平 台 嵌入式微处理器 外 围 设 备 10 图 4-3 VOD 服务模型 在用户进行播放点播的过程中,服务器必须要开启 http 服务和流媒体传输两个服务 10,通过 http 协议,用户可以向服务器端发送视频点播的请求,通过 RTP/RTSP进行视频数据流的传输和控制。播放器的 RTSP 服务器工作流程 11主要步骤如图 4-4 所示。 图 4-4服务器工作流程 开始 监听 TCP 端口 等待客户连接 请求连接 接受连接 创建新连接 接受客户消息 关闭连接 执行客户消息 响应客户消息 结束 N N VOD Server Client RTSP 控制信息( TCP) RTP 音、视频( UDP) RTCP 分组 (UDP) HTTP 点播请求 11 5 系统的详细设计及实现 该部分介绍了系统的实施细节,包括嵌入式系统开发环境的搭建, uboot、kernel移植以及视频播放主界面的设计。 5.1 嵌入式系统开发环境的搭建 5.1.1 建立工作目录 mkdir -p /opt/FriendltARM/mini2440 /mini2440 工作目录 mkdie -p /tmp/linux /各种所需源文件都拷贝到该目录下 5.1.2 建立交叉编译环境 cd /opt/FriendltARM/mini2440 解压安装编译器 arm-linux-gcc-4.4.3 tar xvzf /tmp/linux/arm-linux-gcc-4.4.3.tgz C / 添加系统环境变量如下 gedit /root/.bashrc export PATH=$PATH: /opt/FriendlyARM/toolschain/4.4.3/bin 解压安装 Linux- 内核源代码 tar xvzf /tmp/linux/linux-.tar.gz 解压安装嵌入式图形系统 arm-qtopia和 x86-qtopia 源代码 tar xvzf /tmp/linux/x86-qtopia.tgz tar xvzf /tmp/linux/arm-qtopia.tgz 解压安装嵌入式图形系统 arm-qte-4.6.3 tar xvzf /tmp/linux/arm-qte-4.6.3-20100802.tar.gz 解压安装 busybox-1.13.3 源代码 tar xvzf /tmp/linux/busybox-1.13.3-mini2440.tgz 解压安装 Linux 示例程序 tar xvzf /tmp/linux/examples-20100108.tgz 解压安装 uboot工作目录 12 tar xvzf /tmp/linux/vboot-src.tar.gz 创建 bootloader 工作目录,里有 vivi 和 u-boot源代码 tar xvzf /tmp/linux/mkyaffs2image.tgz C / 改变工作目录后会被安装到 /usr/sbin 目录下,自动生成 mkyaffs2image 和 mkyaffs2image-128M。 解压安装 LogoMaker 开机启动画面制作工具 tar xvzf /tmp/linux/logomaker.tgz C / 在开发时经常用到 NFS、 TFTP和 SMB服务,所以系统服务要事先配置好并且保证正常运行。 所建立的 mini2440 工作目录如 5-1所示。 图 5-1 虚拟机下工作目录 5.2 嵌入式 linux 的 uboot移植 5.2.1 bootloader 介绍 嵌入式系统的引导加载程序是系统必不可少的一部分,引导加载程序是系统加电后运行的第一段软件代码。其作 用类似于 PC 中的 BIOS,BootLoader 就是在 13 操作系统内核运行之前运行的一段小程序。这段程序主要作用就是初始化硬件设备、生成内存映射图等,为最后调用嵌入式内核做好充足的前期准备。 Bootloader一般有两种启动模式即启动加载模式和下载模式。下载模式主要是针对嵌入式开发人员的,因为嵌入式移植过程中的各种调试基本都是这种模式来实现的,下载模式可以通过串口、 NFS、 TFTP 等方式实现。在下载模式下, u-boot为用户提供一个命令行接口,通过接口可以使用 u-boot 提供的一些命令进行相应操作。启动加载模式 是产品发布时必须置为的模式,在这种模式下启动系统不需要用户的干涉,自动从目标主机的存储设备上将操作系统加载到内存中运行。 5.2.2 在嵌入式 Linux 中 BootLoader 的重要性 由于 BootLoader 需要直接操作硬件,所以想在嵌入式世界建立一个通用的引导加载程序是很困难的,因为一般不同的硬件平台不同的操作系统所需的加载引导程序不同。所能做的就是让一种加载引导程序支持尽量多的平台,赋予它良好的移植性。 U-boot 就是支持多平台多操作系统的优秀引导加载程序,这也是U-boot 的优势。因而 针对不同的嵌入式平台要进行加载引导程序相关的修改以满足项目需求。 5.2.3 u-boot 引导流程 Bootloader启动流程大多经过两个阶段,即启动可以分为 stage1和 stage2。stage1 完成初始化硬件的工作,为 stage2 准备足够的内存空间,并将 stage2可执行映像复制到内存中,设置堆栈,然后转调到 stage2的 C入口。 Stage2一般包括以下几个步骤,初始化本阶段要用到的硬件设备,将制作好的内核映像和根文件系统从 Flash 读到 RAM中,调用内核,跳转到 MEMSTART+0x8000 地址 处,一般是使用 x030008000 地址。启动的 stagel 一般用汇编语言来实现,汇编语言能更加高效的实现对底层硬件的操作且代码量小,对应的是 start.S 文件。而stage2 则一般用 C 语言来实现,这样做不仅可以实现更加复杂的功能,而且具有良好的可读性和移植性。启动代码中 C 语言的主函数是在 lib_arm/board.c中的 start_armboot。两个阶段的引导的主要流程如下所示。 14 图 5-2 两个阶段启动流程图 5.2.4 u-boot 移植步骤 移植 就是根据开发板和系统需求做相应的修改。 U-Boot 还没有支持三星S3C2440微处理器,移植仍是用 U-Boot 支持的友善之臂 SBC2410 的文件作蓝本来移植,因为 SBC2410 和 mini2440 硬件配置最为接近,使用一个模板可以加快移植的速度和效率。所以移植所要做的就是针 S3C2440 和 SBC2410 的不同,以及 SBC2410 和 mini2440 开发板的外设不同作相应的修改,并增加新的功能。S3C2440 和 S3C2410 的区别主要是 S3C2440 的主频更高,其他内部寄存器基本都是兼容的。 本 系统中,使用 mini2440 开发板,采用 u-boot 作为 S3C2440 处理器的BootLoader。 设置 CPU 为 SVC 关闭看门狗 /禁所有中断 /设置 cpu 频率 复制 stage2 可执行 映像到 SDRAM 中 设置堆栈指针 跳转 stage2 c 入口 Stage2: 加载内核和根文件 设置内核的启动参数。 调用内核 Stage1: 检测内存映射 15 5.2.5 建立开发板文件并测试编译环境 修改顶层 Makefile 目的:定义交叉编译工具链和开发板配置选项。 约定:代码中 +和 -号表示增删 vi Makefile +CROSS_COMPILE = arm-none-linux-gnueabi- +mini2440_config : unconfig + $(MKCONFIG) $(:_config=) arm arm920t mini2440 andywsg s3c24x0 5.2.6 在 /board 中建立 mini2440 目录和文件 在 /board 目录中建立开发板 mini2440 的目录,并复制 sbc2410x 的文件到此,做适当修改。目的:以 sbc2410x 为蓝本,因为 sbc2410 和 mini2440 配置最接近,代码复用,这样可以加快移植进度。 cd board mkdir andywsg/mini2440 cp -arf sbc2410x/* andywsg/mini2440/ cd andywsg/mini2440/ mv sbc2410x.c mini2440.c 5.2.7 在 include/configs/中建立开发板配置文件 目的 :制作 mini2440 所需头文件 cp include/configs/sbc2410x.h include/configs/mini2440.h 测试编译环境 在 uboot顶层目录执行 make mini2440_config make 编译通过如图 5-3 所示。以上测试通过后,说明编译环境和基本的开发板代码创 16 建都没有问题。下面所做工作就是针对 mini2440 进行修改,以满足项目需求。Uboot修 改主要经历四个阶段,第一阶段修改启动代码,包括初始化 CPU频率,代码重定向等。第二阶段修改初始化代码,主要是 mini2440 平台初始化。第三阶段是初始化外设,包括 LCD、网卡和 YAFFS2 文件系统支持等。第四阶段修改编译配置文件,在所有有编译条件的地方加入对 mini2440 的编译支持,这样前面修改的代码才会在编译时编译进来。下面是对 u-boot源码修改后编译的结果。 图 5-3 uboot 编译结果 5.3 linux 内核配置与编译 5.3.1 内核简介 内 核是所有 linux 系统的核心软件组件,其性能很大程度上决定了整个系统的性能。本系统中,嵌入式 Linux 内核选择 。 linux- 本身已经提供了对 mini2440 的部分支持。内核移植就是根据开发系统的需要对已有的系统进行裁减,保留需要的模块去掉不需要的模块,生成一个适合目标嵌入式系统的过程。 17 5.3.2 建立目标平台 指定平台交叉编译变量 cd linux- vi Makefile -ARCH ?= $(SUBARCH) -CROSS_COMPILE ?= +ARCH ?= arm +CROSS_COMPILE ?= arm-linux- 这里面的 ARCH ?= arm 是指定目标平台为 arm 平台, CROSS_COMPILE ?= arm-linux-是指定交叉编译器是 arm-linux-gcc-4.4.3。 添加自己的开发板信息 cd linux- rm -rf arch/arm/mach-s3c2440/mach-mini2440.c cp -arf arch/arm/mach-s3c2440/mach-smdk2440.c arch/arm/mach-s3c2440/mach- mini2440.c vi arch/arm/mach-s3c2440/mach-mini2440.c 把 MACHINE_START(S3C2440, SMDK2440) , 修改成 MACHINE_START(MINI2440, FriendlyARM Mini2440 development board)。 修定开发板时钟源频率 在 mach-mini2440.c( 就是刚刚通过复制 mach-smdk2440.c 得到的 )static void _init smdk2440_map_io(void)函数中,把原来的 16934400(代表原 SMDK2440 目标板上的晶振是 16.9344MHz)改为 mini2440 开发板上实际使用的 12000000(代表 mini2440 开发板上的晶振 12MHz)。 克隆 SMDK2440 成 MINI2440 平台 克隆自己的 mini2440 平台,需要把 mach-mini2440.c 中所有的 smdk2440 字符串改为 mini2440 。 这 里 使 用 批 处 理 命 令 在 命 令 模 式 下 输入: %s/smdk2440/mini2440/g。 编 译测试 cd linux- make mini2440_defconfig /使用 Linux 官方自带的 mini2440 配置 make zImage /编译内核,生成的内核映像 zImage 位于 arch/arm/boot 编译通过,以上测试通过后,说明编译环境和基本的开发板的代码创建都没有问题。下载到内核,从串口可以看到可以启动信息,但是大部分的定制的驱动还没有添加,根文件系统也没有制作。下面进行的是主要硬件驱动文件的移植。 18 5.3.3 移植 Nand 驱动并修改分 区信息 虽然比较新的内核 Linux 在 nand_ids.c 文件中自带了部分 Nand Flash驱动,但是系统默认的分区不是该项目所需的。为了适合系统自带的 Nand Flash 驱动接口,在 Nand Flash 的结构信息中还要添加相关信息,参考/arch/arm/plat-24xx/common-smdk.c 上结构信息,在 mach-mini2440.c 添加如下信息。 cd linux- vi arch/arm/mach-s3c2440/mach-mini2440.c /编辑平 台初始化文件 /创建 MTD 分区表 static struct mtd_partition mini2440_default_nand_part = 0 = .name = supervivi, /bootloader 分区,对应设备块 /dev/mtdblock0 .size = 0x00040000, /大小 256k .offset = 0, /起始地址 0x00000000 1 = .name = param, / supervivi 的参数区,对应块设备 /dev/mtdblock1 .offset = 0x00040000, .size = 0x00020000, /大小 128K 2 = .name = Kernel, /内核分区,大小为 5M,对应 /dev/mtdblock2 .offset = 0x00060000, .size = 0x00500000, /大小 5M 3 = .name = root, /根文件系统分区,对应 /dev/mtdblock3 .offset = 0x00560000, .size = 1024 * 1024 * 1024, , 4 = .name = nand, /表示整片的 nand flash .offset = 0x00000000, .size = 1024 * 1024 * 1024, ; /下面是开发板的 nand flash 设置表,一块板对应一个表 static struct s3c2410_nand_set mini2440_nand_sets = 0 = .name = NAND, .nr_chips = 1, .nr_partitions = ARRAY_SIZE(mini2440_default_nand_part), .partitions = mini2440_default_nand_part,; 19 /构建一个 s3c2410_platform_nand 类型的 mini2440_nand_info 结构体 static struct s3c2410_platform_nand mini2440_nand_info = .tacls = 20, /nand电平 nWE开始时间 .twrph0 = 60, / nWE持续时间 .twrph1 = 20, /nWE结束时间 .nr_sets = ARRAY_SIZE(mini2440_nand_sets), .sets = mini2440_nand_sets, .ignore_unset_ecc = 1,; /平台设备结构体数组,把 nand flash 设备添加到目标平台设备集中 static struct platform_device *mini2440_devices _initdata = &s3c_device_usb, &s3c_device_lcd, &s3c_device_i2c0, &s3c_device_iis, &s3c_device_nand, ;把 nand flash 设备添加到开发板的设备列表结构 ; 5.3.4 为内核打补丁支持 yaffs2 Linux 支持的文件系统很多,论文采用的是 yaffs2 文件作为根文件系统。 进入 yaffs2 源代码目录执行如下操作: cd yaffs2 ./patch-ker.sh c /opt/FriendlyARM/mini2440/linux- 再进入 linux-/fs 目录,看到如果已经多了一个 yaffs2 目录 ,说明 yaffs2 补丁已经成功打上。 5.3.5 移植 DM9000 网卡驱动 网 卡 是 一 个 平 台 设 备 , 在 目 标 平 台 初 始 化 代 码 中/arch/arm/mach-s3c2440/mach-mini2440.c 填写相应的结构表,具体添加如下: 添加网卡设备的资源设置,才能够和 DM9000 网卡驱动接口配合使用 : static struct resource mini2440_dm9k_resource = /片选信息 0 = .start = MACH_MINI2440_DM9K_BASE, .end = MACH_MINI2440_DM9K_BASE + 3, .flags = IORESOURCE_MEM, 1 = .start = MACH_MINI2440_DM9K_BASE + 4, 20 .end = MACH_MINI2440_DM9K_BASE + 7, .flags = IORESOURCE_MEM, 2 = .start = IRQ_EINT7, .end = IRQ_EINT7, /说明中断管脚接在 EINT7,上升沿触发中断 .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE,; static struct dm9000_plat_data mini2440_dm9k_pdata = /向驱动传入 flags 参数(使用 16 位数据线,没有 EEPROM)和 dev_addr( MAC地址) .flags = (DM9000_PLATF_16BITONLY | DM9000_PLATF_NO_EEPROM),; static struct platform_device mini2440_device_eth = .name = dm9000, .id = -1, .num_resources = ARRAY_SIZE(mini2440_dm9k_resource), .resource = mini2440_dm9k_resource, .dev = .platform_data = &mini2440_dm9k_pdata,; 把上面做好的网卡平台添加设备设备集中 static struct platform_device *mini2440_devices _initdata = &s3c_device_usb, &s3c_device_lcd, &s3c_device_iis, &s3c_device_nand, &mini2440_device_eth,; 5.3.6 移植 LCD 显示驱动 由于 Linux- 内核已经支持 S3C2440 的 LCD 控制器驱动, LCD 工作中最关键的就是取决于时钟频率 (Clock frequency)参数的设置, Linux- 内核是通过一个称为“ pixclock”的参数来调节。这里实际设置数值为 170000,单位是 ps(picoseconds)。 cd linux- vi arch/arm/mach-s3c2440/mach-mini2440.c mini2440 开发板使用的是统宝 3.5LCD,把友善之臂已经移植好的代码加入,统宝 3.5LCD 的配置和参数设置如下。 static struct s3c2410fb_display mini2440_lcd_cfg _initdata = if !defined (LCD_CON5) .lcdcon5 = S3C2410_LCDCON5_FRM565 | S3C2410_LCDCON5_INVVLINE | 21 S3C2410_LCDCON5_INVVFRAME | S3C2410_LCDCON5_PWREN | S3C2410_LCDCON5_HWSWP, else .lcdcon5 = LCD_CON5, endif .type = S3C2410_LCDCON1_TFT, .width = LCD_WIDTH, .height = LCD_HEIGHT, .pixclock = LCD_PIXCLOCK, .xres = LCD_WIDTH, .yres = LCD_HEIGHT, .bpp = 16, .left_margin = LCD_LEFT_MARGIN + 1, .right_margin = LCD_RIGHT_MARGIN + 1, .hsync_len = LCD_HSYNC_LEN + 1, .upper_margin = LCD_UPPER_MARGIN + 1, .lower_margin = LCD_LOWER_MARGIN + 1, .vsync_len = LCD_VSYNC_LEN + 1,; /构建 lcd 配置结构体 mini2440_fb_info static struct s3c2410fb_mach_info mini2440_fb_info _initdata = .displays = &mini2440_lcd_cfg, .num_displays = 1, .default_display = 0, .gpccon = 0xaa955699, .gpccon_mask = 0xffc003cc, .gpcup_mask = 0xffffffff, .gpdcon = 0xaa95aaa1, .gpdcon_mask = 0xffc0fff0, .gpdup = 0x0000faff, .gpdup_mask = 0xffffffff, .lpcsel = 0xf82,; 5.3.7 添加触摸屏驱动 由于 Linux- 内核没有包含支持 S3C2440 的触摸屏驱动, 因此需要添加设计一个触摸屏驱动文件,放置于 linux-src/drivers/input/touchscreen 目录下,增 加 一 个 友 善 之 臂 提 供 的 s3c2410_ts.c 文 件 。 然 后 在 linux-/drivers/input/touchscreen/Makefile 文件中添加该源代码的目标模块。 vi linux-/drivers/input/touchscreen/Makefile +obj-$(CONFIG_TOUCHSCREEN_S3C2410) += s3c2410_ts.o 22 5.3.8 移植 SD 卡驱动 由于 Linux- 已经自带了 S3C2440 芯片的 SD 卡驱动,所以只需在初始化代码中加入 SD 平台设备结构就可以。在 nand flash 平台结构后面添加如下代码: vi arch/arm/mach-s3c2440/mach-mini2440.c 在平台初始化代码 mini2440.c 文件中添加 SD 卡设备结构所需的头文件 include include /创建 s3c2440 的 SD 控制器的平台数据 static struct s3c24xx_mci_pdata mini2440_mmc_cfg = .gpio_detect = S3C2410_GPG(8),/ 中断管脚是开发板上接的是 GPG8 .gpio_wprotect = S3C2410_GPH(8), .set_power = NULL, .ocr_avail = MMC_VDD_32_33|MMC_VDD_33_34,; 并把 SD 卡结构设备添加到目标平台设备集中 static struct platform_device *mini2440_devices _initdata = &s3c_device_usb, &s3c_device_lcd, &mini2440_device_eth, &s3c_device_nand, &s3c_device_sdi,; 注意,上面驱动修改好之后,每一步都要执行 make menuconfig在菜单选项中选中相应的配置项,这样在编译时修改的代码才会起效。最后在 linux-顶层目录执行 make zImage 编译 ,会在 arch/arm/boot目录下产生新的 zImage。结果如图 5-4所示。 23 图 5-4 linux- 编译结果 5.4流媒体播放器设计 5.4.1 播放器主界面工作流程 根据项目需求,播放器主界面的工作流程图如下: 24 图 5-5 播放器主界面工作流程 5.4.2 播放解码处理 自己编写的播放器客户端并没有解码的功能,而是通过在虚拟机下 Linux交叉编译器交叉编译 MPlayer,使得 MPlayer 能在 ARM架构的平台上运行,实现嵌入式平台的流媒体音视频解码播放,优化并改善传输性能和质量 12。由于MPlayer是个开源软件,内置了多种解码器,可以播放很多主流音视频文件,被称为嵌入式 linux 中最好的播放工具。在交叉编译时如果不使用默认的库文件,需要进行相关库移植,以达到音视频解码的功能,属于做根文件系统模块。 5.4.3 播放器主界面设计 Qt/Embedded 是著名的图形库 Qt 开发商 Trolltech 专门面向嵌入式系统开发的 Qt 版本。这是一种基于 C+图形用户界面应用程序构架,使 嵌入式开发者可客户端主界面 显示界面 请求本地资源 拨服 务器 ip 请求网络资源 开始 更新资源列表 播放视频 更新本地列表 资源存在 连接成功 返主界面 是 是 是 否 否 否 25 以在嵌入式环境中使用图形界面开发工具进行用户应用程序开发。由于交叉编译出来的应用程序具有良好的可移植性,很多使用 Linux 开发的 Qt 应用程序可以很方便地移植到相应的嵌入式系统上去。 根据 VOD 客户端应用程序的功能, VOD 客户端应用程序可以划分为两大模块,如图 5-6 所示 图 5-6 客户端总体构架 整个客户端软件基于 Qt Embedded 程序框架开发。客户端软件分为:视频信息接收 显示模块和视频播放模块,每个模块对应一个窗体。启动开发板后,进入播放器主界面,主界面有两个按钮选项,分别是本地播放和网络播放。选择不同的按钮进入不同的播放模式,上面角有个多选项卡,选项卡里有 netplay 和localplay不同的播放选项以及帮助信息选项。主界面如下图所示。 图 5-7 播放器主界面界面 图形用户界面( GUI)模块主要负责用户和系统的交互,本系统中 GUI 模块本地播放 网络播放 接受信息 信息显示 数据接收 解码 播放 客户操作 26 的开发主要由 Qt/Embedded工具完成 13。 QtCreator是跨平台轻量级集成开发环境,使用它编写图形用户界面,创建 GUI 的小窗口部件界面。其中 QWidget类是所有用户界面对象的基类 , 图形用户界面应用程序的控制流 就是 该 类 负责 。图形用户主界面主要实现视频播放的选择和对用户交互式操作的控制。 代码的启动是从主函数 main()开始的,在这里启动第一个界面即播放器的主界面。 int main( int argc, char * argv ) . Main_vod m_vod; m_vod.show(); /打开第一个界面 . 主界面窗体 Main_vod 是继承 QDialog类。 QDialog类是对话框窗口的基类,对话框窗口是主要用于短期任务以及和用户进行简要通讯的顶级窗口。这里使用的是 QDialog 非模式即通过 show()显示。播放窗口按键间通信通过 signal 和slot 来接收信号, QT 信号槽机制 signal 和 slot 机制真正实现了封装的概念,这里 signal和 slot 在声明后通过 connect( )函数来进行调用。 Main_vod类定 义如下: class Main_vod : public QDialog Q_OBJECT /只有加入 Q_OBJECT宏 才能使用 QT中的 signal和 slot机制 public: Main_vod ( QWidget* parent = 0, const char* name = 0, bool modal = FALSE, WFlags fl = Qt:WStyle_Customize | Qt:WStyle_NoBorder );/ 构造一个父对象为 parent、名称为 name 的对话框,非 模式 show()显示,产生一个没有边际的窗体 Main_vod (); MyButton* B_local_play; /定义本地播放指针按钮 MyButton* B_net_paly; /定义网络播放指针按钮 public slots: 27 virtual void net_play_clicked();/网络播放 virtual void local_play_clicked();/本地播放 . ; 网络播放和本地播放的函数定义如下: /网络播放 /本地播放 void Main_vod:net_play_clicked() void Main_vod:local_play_clicked() close(); close(); Net_play n_Vod; local_Play localVod; n_Vod.show(); localVod.show(); n_Vod.exec(); localVod.exec(); 调用函数实现主界面的显示 Main_vod: Main_vod ( QWidget* parent, const char* name, bool modal, WFlags fl ) : QDialog( parent, name, modal, fl ) /设置显示窗体名字、大小及背景图片 setName(Main_vod); setMinimumSize(QSize(268,200); setMaximumSize(QSize(268,200); setPaletteBackgroundPixmap(QPixmap:fromMimeSource(images/movie_bg.jpg); /主界面多选按钮 QPopupMenu *file=new QPopupMenu; QFont f(Helvetica,10); setFont(f); file-setFont(f); file-insertItem(Local play,this,SLOT(local_play_clicked(); 28 file-insertItem(Net play,this,SLOT(net_play_clicked(); QMenuBar *menu; menu=new QMenuBar(this); menu-setGeometry(QRect(0,0,268,10); menu-insertItem(File,file); /构造本地播放按钮名字、坐标及背景图片 B_local_play=new MyButton(this,B_local_play); B_local_play-setGeometry(QRect(43,113,47,47); B_local_play-setMinimumSize(QSize(47,47); B_local_play-setMaximumSize(QSize(47,47); B_local_play-setPaletteBackgroundPixmap(QPixmap:fromMimeSource(images/local.jpg); B_local_play-setPixmap(QPixmap:fromMimeSource(images/local.jpg); /构造网络播放按钮名字、坐标及背景图片 B_net_play=new MyButton(this,B_net_play); B_net_play-setGeometry(QRect(171,113,47,47); B_net_play-setMinimumSize(QSize(47,47); B_net_play-setMaximumSize(QSize(47,47); B_net_play-setPaletteBackgroundPixmap(QPixmap:fromMimeSource(images/net.jpg); B_net_play-setPixmap(QPixmap:fromMimeSource(images/net.jpg); /播放 窗口按键通信通过 signal 和 slot 来接收信号

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论