毕业设计(论文)基于arm的mp3播放器设计_第1页
毕业设计(论文)基于arm的mp3播放器设计_第2页
毕业设计(论文)基于arm的mp3播放器设计_第3页
毕业设计(论文)基于arm的mp3播放器设计_第4页
毕业设计(论文)基于arm的mp3播放器设计_第5页
已阅读5页,还剩36页未读 继续免费阅读

下载本文档

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

文档简介

1、目目 录录摘 要 .IAbstract.II引 言.11MP3 播放器概述.3MP3 播放器的工作原理.3MP3 的文件结构.4MP3 播放器的历史与开展.4MP3 播放器设计的可行性分析.5技术可行性分析.5经济可行性分析.62系统硬件平台介绍.7系统硬件特性介绍.7ARM9 处理器介绍.7RISC 微处理器 S3C2440 介绍.7硬件平台工作原理.83平台搭建的总体设计.10嵌入式系统概述.10软件平台的设计.10U-BOOT 分析与移植.11BootLoader 简介.11U-BOOT 启动流程分析.11U-BOOT 的详细设计.12Linux 内核分析与文件系统移植.17Linux

2、启动过程.17Linux 内核的移植.17文件系统的设计.18Jffs2 文件系统介绍.19文件系统的制作.194MP3 播放器的设计与实现.22播放模块的设计.22声卡驱动的设计.22MADPLAY 播放器的移植.23同步歌词模块的设计.25USB 驱动模块的设计.26按键控制模块的设计.31创立歌曲列表.31播放 MP3 文件.314.暂停播放.33停止播放.33歌曲切换.335MP3 播放器的界面设计.35界面设计工具的选择.35图形界面的设计.35致 谢.39参考文献.40引引 言言随着计算机技术的开展和微处理器工艺的改良,社会正在一天天的步入信息化,嵌入式系统的应用也越来越广泛,计算

3、机和网络已经全面渗透到了我们日常生活中的每个角落,任何人都可以拥有从小到大的各种采用了嵌入式技术的产品,小到MP3,PDA 等微型数字化产品,大到许多的家用电器,车载设备等,嵌入式系统及其应用在电子市场占有了一定的份额,并起了一定的主导作用。由于嵌入式系统是建立在特定的硬件系统之上,系统的开发和硬件的关系十分密切,且入市开发板为开发者提供了丰富的设为设备和接口,通过接口可以调试应用程序和打印输出调试信息。嵌入式开发板已经成为了嵌入式开发和移植的有力工具。基于 ARM 内核的微控制器芯片不但占据了高端微控制器市场的大局部是成份额,同时也逐渐向低端微控制器应用领域扩展,ARM 微控制器的低功耗、高

4、性价比使其以 70%左右的市场占有率成为嵌入式解决方案中主流处理器。Linux 近几年在嵌入式领域异军突起,成为了非常有潜力的操作系统。Linux 操作系统的代码的开放性、系统的稳定性、强大的网络功能以及优秀的文件系统支持,在嵌入式设备特别是网络设备中得到了广泛的应用。因此,选择 Linux 操作系统作为设计的操作系统。随着计算机和多媒体技术的不断开展以及个人计算机的普及,各种各样的媒体文件、媒体播放器层出不穷,而 MP3MPEG Audio Layer3格式以其体积小、音质也有保证的特点成为使用最为广泛的音频格式,得到了绝大多数软件和硬件媒体播放器的支持。如今,软件市场上的媒体播放器层出不穷

5、,如:酷狗音乐、千千静听、QQ 音乐播放器等。高音质播放和低内存消耗是各种媒体播放器所追求的目标。嵌入式系统具有巨大的市场需求前景,可广泛应用于移动计算设备、网络设备、信息电器、工控设备、车载设备、娱乐设施、仪器仪表等场合。而 MP3 具有巨大的市场需求。为适应当前开展趋势,开发基于嵌入式 LINUX 的 MP3 音乐播放器系统。为了对嵌入式系统的开发过程能够熟练的掌握,学习了一些有关嵌入式系统开发技术的方法,掌握了开发的根本步骤。在设计时构建了一个 ARM9 开发平台、使用嵌入式 Linux 操作系统进行了具体的设计,最终实现了在 ARM 上的简易 MP3 播放器的设计。本设计探索性地设计实

6、现了一个支持 LRC 歌词显示的 MP3 播放器的软件。该播放器实现了在播放 MP3 的同时实时地显示 LRC 歌词,并实现歌曲的暂停、停止以及歌曲的切换功能。论文首先介绍了嵌入式系统以及开发环境,然后,介绍了一些设计过程中的准备工作,接着介绍了 MP3 播放器的开发平台,阐述了系统各功能的详细设计与实现。最后,论文介绍了系统的运行环境及运行效果,并对各个局部进行了图示说明。最后介绍了本设计的设计目标,划分并设计了系统功能模块,包括:系统初始化模块、播放模块、同步歌词模块、按键切换模块等,设计了媒体文件和歌词文件的处理流程。1MP3 播放器概述播放器概述MP3 的全称应为 MPEG1 Laye

7、r-3 音频文件,MPEG(Moving Picture Experts Group)在汉语中译为活动图像专家组,特指活动影音压缩标准,MPEG 音频文件是MPEG1 标准中的声音局部,也叫 MPEG 音频层,它根据压缩质量和编码复杂程度划分为三层,即 Layer-1、Layer2、Layer3,且分别对应 MP1、MP2、MP3 这三种声音文件,并根据不同的用途,使用不同层次的编码。1.1 MP3 播放器的工作原理播放器的工作原理MP3 播放器是利用数字信号处理器 DSPDigital Sign Processer来完成处理传输和解码 MP3 文件的任务的。DSP 掌管随身听的数据传输,设备

8、接口控制,文件解码回放等活动。DSP 能够在非常短的时间里完成多种处理任务,而且此过程所消耗的能量极少,这也是它适合于便携式播放器的一个显著特点。 一个完整 MP3 播放机要分几个局部:中央处理器、解码器、存储设备、主机通讯端口、音频 DAC 和功放、显示界面和控制键。其中中央处理器和解码器是整个系统的核心。这里的中央处理器我们通常称为 MCU,简称单片机。它运行 MP3 的整个控制程序,也称为 fireware,或者固件程序。它控制了 MP3 的各个部件的工作,例如从存储设备读取数据送到解码器解码;与主机连接时完成与主机的数据交换;接收控制按键的操作,显示系统运行状态等。解码器是芯片中的一个

9、硬件模块,或者说是硬件解码,它可以直接完成各种格式的 MP3 数据流的解码操作,并输出 PCM 或 I2S 格式的数字音频信号。 存储设备是 MP3 播放机的重要局部,通常的 MP3 随身听都是采用半导体存储器FLASH MEMORY或者硬盘HDD作为储存设备的。它通过接受储存主机通讯端口传来的数据,回放的时候 MCU 读取存储器中的数据并送到解码器。数据的存储是要有一定格式的,众所周知,PC 管理磁盘数据是以文件形式,MP3 也不例外,最常用的方法就是直接利用 PC 的文件系统来管理存储器。 主机通讯端口是 MP3 播放器与 PC 机之间交换数据的重要途径,PC 机通过该端口操作 MP3 播

10、放器存储设备中的数据,对数据进行拷贝、删除、复制文件等操作。目前最广泛使用的是 USB 总线,并且遵循微软定义的大容量移动存储协议标准,将MP3 播放器作为主机的一个移动存储设备。这里需要遵循几个标准:1、USB 通信协议,2、大容量移动存储器标准,3、SCSI 协议。 音频 DAC 是将数字音频信号转换成模拟音频信号,以推动耳机、功放等模拟音响设备。在这里,本文需要介绍一下数字音频信号。数字音频信号是相对模拟音频信号来说的。我们知道声音的本质是波,人说能听到的声音的频率在 20Hz 到 20kHz之间,称为声波。模拟信号对波的表示是连续的函数特性,根本的原理是不同频率和振幅的波叠加在一起。数

11、字音频信号是对模拟信号的一种量化,典型方法是对时间坐标按相等的时间间隔做采样,对振幅做量化。单位时间内的采样次数称为采样频率。这样一段声波就可以被数字化后变成一串数值,每个数值对应相应抽样点的振幅值,按顺序将这些数字排列起来就是数字音频信号了。这是 ADC模拟-数字转换过程,DAC数字-模拟转换过程相反,将连续的数字按采样时候的频率顺序转换成对应的电压。MP3 解码器解码后的信息属于数字音频信号数字音频信号有不同的格式,最常用的是 PCM 和 I2S 两种 ,需要通过 DAC 转换器变成模拟信号才能推动功放,被人耳所识别。 MP3 播放器的显示设备通常采用 LCD 或者 OLED 等来显示系统

12、的工作状态。控制键盘通常是按钮开关。键盘和显示设备合起来构成了 MP3 播放机的人机交互界面。 MP3 播放器的软件结构跟硬件是相对应的,即每一个硬件局部都有相应的软件代码,这是因为大多数的硬件局部都是数字可编程控制的。 通过以上分析,一个最简化的 MP3 播放器的工作原理可以概括如下:首先将MP3 歌曲文件从内存中取出并读取存储器上的信号,然后到解码芯片对信号进行解码操作,然后通过数模转换器将解出来的数字信号转换成模拟信号,再把转换后的模拟音频放大,经过低通滤波后到耳机输出口,最后输出的就是我们所听到的音乐了。1.2 MP3 的文件结构的文件结构MP3 的文件大体分为三局部:TAG_V1(I

13、D3V1),Frame,TAG_V2(ID3V2)。TAG_V1(ID3V1)包含了作者,作曲,专辑等信息,长度为 128BYTE。Frame 是一系列的帧,个数由文件大小和帧长来决定,帧是 MP3 文件中最小的组成单位,每个 Frame 的长度可能不固定,有 bitrate比特率来决定。每个Frame 又分有帧头和数据实体两局部,帧头几率 MP3 的位率,采样率和版本信息等。TAG_V2(ID3V2)到现在共有 4 个版本,但流行的播放软件一般只支持第 3 版本,它存放在文件的首部,包含了作者,作曲,专辑等信息,但是长度不固定,同时扩展了 ID3V1 的信息量。1.3 MP3 播放器的历史与

14、开展播放器的历史与开展世界上第一台 MP3 的诞生,其实是有一个小故事的,故事追溯到 1997 年 3 月的一天,韩国三星公司一位部门经理 Moon 先生,出差在美国回到汉城的飞机上,在他的笔记本电脑上看他的同事给他发出的一分报告。这是一份图象、文字和 MP3音乐合成的简报。当 Moon 阅读完毕摘下耳机,发现他身旁的旅客正在听着MD,Moon 顿时受到启发:要是电脑上的 MP3 音乐文件也能够直接取出来,用一个独立的播放器来播放,那不就是最好的音乐随身听吗?回到韩国后,他将这个想法提给当时的总裁尹钟龙。可惜的是,当时三星正在进行组织重整,无暇兼顾Moon 的开展提案。半年后,亚洲金融风暴的发

15、生使三星公司受到巨大的冲击,Moon 先生也被迫提早退休。离开三星公司后,Moon 先生进入了另一家韩国企业Saehan世韩出任总裁,并将他的想法在 Saehan 公司转变成为了现实,于 1998年推出了世界上第一台的 MP3 播放器MPMan F10。 MPMan,取意于 MP3 与 WALKMAN 的结合。MPMan F10 的体积为 70 x90 x,约有四个软盘堆叠起来这么大,体重为 65 克,可谓非常轻巧。MPMan F10 没有任何的机械部件,信噪比到达 70dB,失真率为 0.01-0.1%。播放时可显示音轨、播放时间,可编排播放顺序,支持低音/中音放大,电池状态检测和显示,依靠

16、 2 个镍氢电池也能维持 8 小时播放,即使在现在也并不会显得落后。MPMan F10 当时开发出来的目的是为了让使用者从收费音乐网站下载歌曲,可惜 Saehan 公司没有足够的实力进行大范围的推广,加上 MPMan F10 采用的是而且采用的是当时极为昂贵的闪存,很快便在与 MD 的较量中败下阵来。 虽然没有引起人们太多的注意,但 MPMan F10 的出现从此便启动了 MP3 市场,韩国的许多公司都开始了对 MP3 的研发和生产。直到今日,韩国依然在 MP3 领域处于领先地位。MP3 随身听已经经历了数年的开展,而随身听市场的竞争亦趋于白热化,几乎每个星期甚至每天都会有新品 MP3 的推出

17、,其开展的速度实在惊人。与此同时,在各种媒体上,无论是 IT 网站还是报纸杂志,MP3 厂商们的广告铺天盖地,各种各样的解码芯片,支持的媒体格式,还有 MP3 屏幕的发色数以及分辨率令消费者目不暇接,不知所措。然而,在众多的广告当中,有一条却特别引起了笔者的注意,那就是以艾诺为首的厂商所提出的音画双绝的概念,在笔者看来,这不仅仅是一个概念,一个名称,它更是一种潮流的趋势。此外 MP3 的制作和交流也很方便,有很多音乐播放软件都提供 MP3 的制作,转换等功能。基于 MP3 的上述优点,他很快成为了深受人们喜爱的音乐媒体,而携带方便,小巧精致的 MP3 播放器,也在最近几年风行一时,成为了广阔消

18、费者茶余饭后的音乐伴侣。1.4 MP3 播放器设计的可行性分析播放器设计的可行性分析本文设计的是 MP3 播放器。该播放器是基于嵌入式 Linux 操作系统、以S3C2440 为硬件平台。1.4.1技术可行性分析技术可行性分析本设计因为采用了嵌入式 Linux,所以该 Mp3 播放器可以很容易的移植到其他微控制器系统中,使设备兼具 MP3 播放的功能,同时使用 Linux 操作系统可以使设计出来的 MP3 播放器的性能更加的稳定。另外硬件电路以 Samsung 公司的 ARM9 处理器S3C2440 为中心。这是一款基于 ARM920T 内核的 16 位/32 位 RISC 嵌入式处理器。AR

19、M920T 核由ARM9TDMI、存储管理单元(MMU)和高速缓存三局部组成。下面对这三局部进行简要的概述。ARM9TDMI 是 ARM9 的处理器核,它采用了哈弗结构,将指令存储器和数据存储器分开,在数据中止模式时,ARM9TDMI 采用的是基地址重新载入的模式,当出现访问存储器数据中止时,处理器硬件在数据中止指令执行前,自动保存相应发生数据中止时基地址存放器的值。MMU 是用来管理虚拟内存系统的硬件,用于完成将虚拟地址转换成物理地址,并控制存储器的存储权限。主要对 ARM9TDMI 的指令和数据地址接口提供传输和访问允许检查,提供地址信号的传输和保护规划。高速缓存由独立的 16KB 地址和

20、 16KB 数据高速 Cache 组成。采用了 64 路相连的分段式 CAM-RAM 组织,每个 cache 分为 8 段,每段 64 行。S3C2440 芯片集成了大量的功能单元,让设计出的 MP3 播放器拥有低功耗的特性。1.4.2经济可行性分析经济可行性分析本设计是在 Linux 环境下的进行编程实现的,Linux 是免费、开源的,使用的硬件平台是 S3C2440,价格廉价,运行稳定,也可方便的移植到其他平台。这点让设计出来的 MP3 播放器能够降低设计本钱,同时也可以让开发者在开发过程中进一步完善 MP3 播放器的功能。综上所述,本文以 S3C2440 为硬件平台,基于嵌入式 Linu

21、x 操作系统,设计出了 MP3 播放器。2系统硬件平台介绍系统硬件平台介绍2.1 系统硬件特性介绍系统硬件特性介绍嵌入式系统总是面向特定应用的,与通用 PC 的硬件相比,它的硬件系统具有以下特性:1、 对实时多任务有很强的支持能力,能完成多任务并且有较短的中断响应时间,从而使内部的代码和实时内核的执行时间减少到最低的限度。2、 具有功能很强的存储区保护功能。这是由于嵌入式系统的软件结构已模块化,为了防止在软件模块之间出现错误的交叉作用,需要设计强大的存储区保护功能,同时也有利于软件诊断。3、 可扩展的处理器结构,以便能够迅速地开发出满足各种应用需求的高性能嵌入式微处理器。2.1.1ARM9 处

22、理器介绍处理器介绍相比于 ARM7,ARM9 系列微处理器在性能和功耗方面表现更佳,具有以下特点:(1)5 级整数流水线,指令执行效率更高;(2)提供 11MIPSMHz 的哈佛结构;(3)支持 32 位 ARM 指令集和 1 6 位 Thumb 指令集;(4)支持 32 位的高速 AMBA 总线接口;(5)全性能的 MMU,支持 Windows CE、Linux、Palm OS 等多种主流嵌入式操作系统;(6)MPU 支持实时操作系统;(7)支持数据 Cache 和指令 Cache,具有更高的指令和数据处理能力。ARM9 系列微处理器主要应用于无线设备、仪器仪表、平安系统、机项盒、高端打印机

23、、数字照相机和数字摄像机等。ARM9 系列微处理器包含 ARM920T、ARM922T 和ARM940T 三种类型。2.1.2RISC 微处理器微处理器 S3C2440 介绍介绍三星公司推出的 16/32 位 RISC 微处理器 S3C2440A, 为手持设备和一般类型应用提供了低价格、低功耗、高性能小型微控制器的解决方案。 为了降低整体系统本钱,S3C2440A 提供了一下丰富的内部设备 S3C2440A 采用了 ARM920t 的内核, 0.13um 的 CMOS 标准宏单元和存储器单元。其低功耗,简单,优雅,且全静态设计特别适合于对本钱和功率敏感型的应用。它采用了新的总线架构 Advan

24、ced Micro controller Bus Architecture (AMBA). 。 S3C2440A 的杰出的特点是其核心处理器(CPU),是一个由 Advanced RISC Machines 设计的 16/32 位 ARM920T 的 RISC 处理器。ARM920T 实现了 MMU, AMBA BUS 和 Harvard 高速缓冲体系结构构。这一结构具有独立的 16KB 指令 Cache 和 16KB 数据 Cache。每个都是由具有 8 字长的行组成。通过提供一套完整的通用系统外设, S3C2440A 减少整体系统本钱和无需配置额外的组件。2.2 硬件平台工作原理硬件平台工

25、作原理图图 2-1 系统硬件原理图系统硬件原理图硬件平台使用了三星公司的 S3C2440 微处理器作为 CPU,主频为 400Hmz,其中有 64M SDRAM 内存,32BIT 数据总线,并且其时钟频率高达 100MHz,在这个开发板上有 2 个 Flash 存储器,一个是 64M Nand Flash,掉电非易失。另外一个是2M Nor Flash,掉电易失。 系统硬件说明:USB 接口:通过 USB,同开发板进行数据传输。JTAG 接口:在 Linux 系统下,通过 JTAG 接口烧写程序到 Nandflash 中。复位键:让系统复位。开关键:搬动开关键,让开发板运行或关闭。串口:通过串

26、口能够让开发板与 PC 宿主机进行通信。音频输出:将播放的 MP3 歌曲输出到音频输出端口FLASH 是一种在可编程期间,存储的信息在系统掉电后不会丧失的存储器,具S3C2440ResetJTAG电源转换SDRAMFLASH音频放大电路UARTUSB有低功耗,大容量,擦写速度快等特点。在系统中通常用于存放程序代码、以及一些在系统掉电后需要保存的用户数据等。SDRAM 存取速度远远大于 FLASH 存储器,而且具有读、写属性。在系统中主要用作程序的运行空间、数据、及堆栈区,当系统启东市,CPU 从复位地址 0X0 处读取启动代码,完成系统初始化后,程序代码调入到 SDRAM 中运行,以提高系统的

27、运行速度。UART 能够实现 PC 与开发板间的串口通信。UART 在程序运行期间需要向终端输出信息,以便用户获取系统状态信息。S3C2440 的 UART 提供了三个同步串行IO 口,第一个串口都可以使用中断模式和 DMA 模式,换句话说就是 UART 可以产生一个中断或者是 DMA 请求使数据在 CPU 和 UART 之间进行传递。DMA 全称是 Direct Memory Access存储器直接访问 。这是指一种高速的数据传输操作,允许在外部设备和存储器之间直接读写数据,既不通过 CPU,也不需要CPU 干预。整个数据传输操作在一个称为DMA 控制器的控制下进行的。CPU除了在数据传输开

28、始和结束时做一点处理外,在传输过程中 CPU 可以进行其他的工作。这样,在大局部时间里,CPU 和输入输出都处于并行操作。因此,使整个计算机系统的效率大大提高。3平台搭建的总体设计平台搭建的总体设计3.1 嵌入式系统概述嵌入式系统概述嵌入式系统是以应用为中心、以计算机技术为根底、软件硬件可裁剪、对功能、可靠性、本钱、体积、功耗有严格要求的专用计算机系统。它包括硬件和软件两局部。在嵌入式系统中,计算机系统一般作为智能终端控制部件嵌入到整个应用系统中,是整个系统的控制中心,主要用于对系统的信息处理部件和用户交互界面加以控制。在这种情况下,用户并不知道嵌入式系统的存在,系统控制软件一般被固化在嵌入式

29、计算机中,嵌入式计算机一般不需要被用户重新编程,通过特殊的输入、输出设备与系统进行交互。任何嵌入式系统都包括硬件和软件两个方面。硬件包括处理器微处理器、存储器及外设器件和 IO 端口、图形控制器等。软件局部包括操作系统软件(OS)(要求实时和多任务操作)和应用程序。应用软件控制着嵌入式系统的运作和行为,而操作系统那么为应用程序提供必要的底层支持,它一般是通过提供给用编程接口(API)来实现的。因为嵌入式系统是面向应用、产品和用户的,具体的应用将决定对硬件和软件的需求,如芯片、存储器、IO 扩展和操作系统、应用程序编制等。和通用计算机不同,嵌入式系统的硬件和软件都必须高效率的设计,量体采用,去除

30、冗余,尽量以最小的系统、最低的本钱去实现目标功能。它通常都具有低功耗、体积小、集成度高等特点,能够把通用 CPU 中许多由板卡完成的任务集成在芯片内部,从而有利于嵌入式系统设计趋于小型化,移动能力大大增强,跟网络的结合也越来越紧密。3.2 软件平台的设计软件平台的设计本文设计的软件平台包括如下 4 个方面的内容:1、Boot Loader 引导程序2、Linux 内核3、设备驱动程序4、应用程序Boot Loader 引导程序能实现系统的快速引导,首先完成对 CPU 环境的最初初始化,如:芯片引脚、外部控制器、输入输出设备等,然后负责将 Linux 内核加载到内存,将控制权交给内核初始化程序。

31、具体工作包括:寻找或将指定的内核映像文件解压至内存,然后解压文件系统,将控制权移交给内核。在本设计中采用了 U-BOOT 作为 Boot Loader 引导程序,当翻开 MP3 播放器的电源开关时,系统会自动加载 Linux 引导程序。Linux 是一个单一内核操作系统,但可以动态装入和卸载内核中的局部源代码。Linux 内核由内存管理、进程管理、定时器中断管理、模块管理、虚拟文件系统、接口文件系统、设备驱动程序、进程间通信、网络管理、系统启动等构成。在本设计中,针对设计的功能,对 Linux 内核进行了剪裁。设备驱动程序是内核的一局部,它像内核中其它代码一样运行在内核模式。Linux 设备驱

32、动程序的主要功能有:对设备进行初始化;使设备投入运行和退出效劳;从设备接收数据并将它们送回内核;将数据从内核送到设备;检测和处理设备出现的错误。在本设计中,主要进行了字符设备的驱动,声卡驱动,以及 USB 驱动等。嵌入式应用软件是针对特定应用领域,基于某一固定的硬件平台,用来到达用户预期目标的计算机软件,由于用户任务可能有时间和精度上的要求,因此有些嵌入式应用软件需要特定嵌入式操作系统的支持。在本次设计中,对于设计的 MP3 播放器的根本功能,例如播放器进行歌曲的播放、暂停、停止、以及歌曲的切换等进行了设计与优化,让播放器尽可能的满足准确性、平安性和稳定性以及实际应用的需要,以减少对系统资源的

33、消耗,降低硬件本钱。下面本文将对 MP3 播放器的设计进行详细的论述。 3.3 U-BOOT 分析与移植分析与移植3.3.1BootLoader 简介简介引导加载程序是系统加电后运行的第一段代码。它一般在系统启动时运行非常短的一段时间,但对于嵌入式系统来说,这是一个非常重要的组成局部。通过这段小程序,初始化必要的硬件设备,创立内核需要的一些信息,并将一些信息通过相关机制传递给内核,真正起到引导和加载内核的租用。BootLoader 和硬件密切相关,一般来说都要对 BootLoader 的源代码进行修改才可以在自己的硬件平台上运行起来,目前嵌入式领域里出现了很多种类的 BootLoader,如

34、armboot、U-BOOT 等,其中U-BOOT 是功能最完善的,所以在设计中采用了 U-BOOT 作为引导程序。3.3.2U-BOOT 启动流程分析启动流程分析U-BOOT 分为两个阶段,其中依赖于 CPU 体系结构的代码都存放在阶段一中,而且通常用汇编语言来实现。而阶段二通常用 C 语言来实现,这样可以实现复杂的功能,而且有更好的可读性和移植性。U-BOOT 的第一阶段功能是:1、 定义入口2、 设置异常向量3、 本地硬件设备初始化4、 初始化内存控制器5、 设置堆栈、同时跳转到第二阶段的程序入口U-BOOT 的第二阶段主要完成:1、 调用一系列的设备初始化函数2、 确定目标板是进入下载

35、操作模式还是启动加载模式3、 如果是启动加载模式,那么将内核映像和根文件系统映像从 FLASH 上独到RAM 空间中。4、 为内核设置启动参数5、 调用内核。如图 3-1 所示,图中从根本硬件初始化到跳转到 STAGE2 的入口处为第一阶段,初始化硬件设备是第二阶段。图图 3-13-1 U-BOOTU-BOOT 启动流程图启动流程图3.3.3U-BOOT 的详细设计的详细设计首先对 U-BOOT 进行配置,具体步骤如下:基本硬件初始化准备RAM空间拷贝STAGE2到RAM中设置堆栈指针跳转到STAGE2的入口处初始化硬件设备检查内存映射加载内核和根文件系统映像设置内核启动参数调用内核1、进入

36、U-BOOT 的 board 目录,在 board 目录下每一个子目录都包含一个 u-boot 支持的硬件开发板的支持代码,其中有 smdk2410 子目录,但没有 smdk2440 目录。这说明 U-BOOT 支持 S3C2410,但不支持 S3C2440。S3C2440 与 S3C2410 非常相似,因此可以用 S3C2410 的支持代码作为根底,为 S3C2440 移植 U-BOOT。2、为了将QQ2440V3开发板的信息编译进u-boot,需要修改当前目录下的Makefile。具体修改内容是:3、复制更名原smdk2410的头文件为QQ2440V3的头文件4、修改/opt/ u-boo

37、t-.tar.bz2/Makefile,为接下来make命令作准备。 在Makefile的中模仿smdk2410_config目标增加新目标QQ2440V3_config QQ2440V3_config : unconfig $(MKCONFIG) $(:_config=) arm arm920t QQ2440V3 NULL s3c24x0这样,系统就会在执行make命令时,显示QQ2440V3的标签,供操作者选择。5、在u-boot根目录下键入命令:make QQ2440V3_config 系统会根据这条命令找寻当前目录下的Makefile文件,然后在该文件内查找QQ2440V3_confi

38、g这个标志,找到后会执行其下代码,代码含义为将用户输入的make命令后的参数中的“_config去掉,执行MKCONFIG所指向的脚本mkconfig,就在u-boot的根目录下并且传递参数“arm arm920t QQ2440V3 NULL s3c24x0” ,故“make QQ2440V3_config 会被替换为“./mkconfig QQ2440V3 arm arm920t QQ2440V3 NULL s3c24x0”这条命令。键入命令后,如显示“Configuing for QQ2440V3 board.那么说明上述配置修改成功。6、如果现在键入 make,系统就会在当前目录下编译生

39、成“文件。但这个文件烧写到开发板上后,开发板却没有任何反映。这是由于这个 U-BOOT 是用于S3C2410 的,虽然名字改成了 QQ2440V3,但也只是改了名字而已,其中对开发板的一些硬件的初始化都没有修改。故而,需要修改源代码,将其对开发板硬件的初始化适用于 QQ2440V3。修改正程如下:A、因为 QQ2440 的 HCLK=100Mhz,修改内存刷新时间#define REFCNT 1268B、修改时钟频率,使其中的 MPLL、分频、机器 ID 符合实际的开发板#define S3C2440_MPLL_400MHz (0 x5c12) | (0 x014) | (0 x01)#def

40、ine S3C2440_UPLL_48MHz (0 x3812) | (0 x02MPLLCON = S3C2440_MPLL_400MHz;clk_power-UPLLCON = S3C2440_UPLL_48MHz;C、修改机器码gd-bd-bi_arch_number = MACH_TYPE_S3C2440;D、S3C2440设置时钟频率和CAMDIVN有关系,S3C2410里没有CAMDIVN,所以添加文件:include/s3c24x0.h 中的 结构体:S3C24X0_CLOCK_POWER添加CAMDIVN S3C24X0_REG32 CAMDIVN;E、针对 S3C2440 特

41、性添加以下 FCLK:HCLK:PCLK 的换算关系在vim cpu/arm920t/s3c24x0/speed.c中进行修改: 增加以下宏定义:#define S3C2440_CLKDIVN_PDIVN (10)#define S3C2440_CLKDIVN_HDIVN_MASK (31) #define S3C2440_CLKDIVN_HDIVN_1 (01) #define S3C2440_CLKDIVN_HDIVN_2 (11) #define S3C2440_CLKDIVN_HDIVN_4_8 (21) #define S3C2440_CLKDIVN_HDIVN_3_6 (31) #

42、define S3C2440_CAMDIVN_CAMCLK_MASK (0 xf0) #define S3C2440_CAMDIVN_CAMCLK_SEL (14) #define S3C2440_CAMDIVN_HCLK3_HALF (18) #define S3C2440_CAMDIVN_HCLK4_HALF (19) #define S3C2440_CAMDIVN_DVSEN (112) 在函数static ulong get_PLLCLK(int pllreg)修改: return(CONFIG_SYS_CLK_FREQ * m * 2) / (p CLKDIVN; camdiv =

43、clk_power-CAMDIVN; switch(clkdiv & S3C2440_CLKDIVN_HDIVN_MASK) case S3C2440_CLKDIVN_HDIVN_1: hdiv = 1; break; case S3C2440_CLKDIVN_HDIVN_2: hdiv = 2; break; case S3C2440_CLKDIVN_HDIVN_4_8: hdiv = (camdiv & S3C2440_CAMDIVN_HCLK4_HALF) ? 8 : 4; break; case S3C2440_CLKDIVN_HDIVN_3_6: hdiv = (ca

44、mdiv & S3C2440_CAMDIVN_HCLK3_HALF) ? 6 : 3; break; return get_FCLK() / hdiv;在函数ulong get_PCLK(void)中修改:unsigned long clkdiv, camdiv; int hdiv = 1; clkdiv = clk_power-CLKDIVN; camdiv = clk_power-CAMDIVN; switch(clkdiv & S3C2440_CLKDIVN_HDIVN_MASK) case S3C2440_CLKDIVN_HDIVN_1: hdiv = 1; break

45、; case S3C2440_CLKDIVN_HDIVN_2: hdiv = 2; break; case S3C2440_CLKDIVN_HDIVN_4_8: hdiv = (camdiv & S3C2440_CAMDIVN_HCLK4_HALF) ? 8 : 4; break; case S3C2440_CLKDIVN_HDIVN_3_6: hdiv = (camdiv & S3C2440_CAMDIVN_HCLK3_HALF) ? 6 : 3; break; return get_FCLK() / hdiv / (clkdiv & S3C2440_CLKDIVN_

46、PDIVN) ? 2 : 1);F、添加 NANDFLASH 驱动,来启用 nand 命令CFG_CMD_NAND | CFG_CMD_PING | 增加如下Nand相关配置项:#define CFG_NAND_BASE 0#define CFG_MAX_NAND_DEVICE 1#define NAND_MAX_CHIPS 1以下这两行代码是为了支持u-boot可以传参数给Linux内核,例如告诉Linux内核root=/dev/mtdblock2”#define CONFIG_SETUP_MEMORY_TAGS1#define CONFIG_CMDLINE_TAG1G、修改 NANDFLA

47、SH 相关存放器:定义 2440 的 nand flash 控制器存放器的数据结构,以供 board_nand_init 函数使用/* NAND FLASH (see S3C2440 manual) */typedef struct S3C24X0_REG32 NFCONF; S3C24X0_REG32 NFCONT; S3C24X0_REG32 NFCMD; S3C24X0_REG32 NFADDR; S3C24X0_REG32 NFDATA; S3C24X0_REG32 NFMECCD0; S3C24X0_REG32 NFMECCD1; S3C24X0_REG32 NFMECCD; S3C

48、24X0_REG32 NFSTAT; S3C24X0_REG32 NFESTAT0; S3C24X0_REG32 NFESTAT1; S3C24X0_REG32 NFSECC; S3C24X0_REG32 NFMECC0; S3C24X0_REG32 NFMECC1; S3C24X0_REG32 NFSBLK; S3C24X0_REG32 NFEBLK; /*_attribute_(_packed_)*/ S3C2440_NAND;H、static inline S3C2440_NAND * const S3C2440_GetBase_NAND(void)return (S3C2440_NAN

49、D * const)S3C2410_NAND_BASE;I、3c24x0/下,为上层提供 nandflash 驱动接口函数,让 u-boot 使用J、修改 Makefile 编译进 image 里K、执行到这里时,说明 U-BOOT 已经加载完成,只需要将生成的 u-boot.bin 烧写到开发板中的 0 x000000 地址处,就可以在启动时自动加载这段程序了。3.4 Linux 内核分析与文件系统移植内核分析与文件系统移植3.4.1Linux 启动过程启动过程在 BootLoader 将 Linux 内核映像拷贝到 RAM 中以后,通过 call_linux(0,machine_type,

50、kernel_params_base)这句代码启动 Linux 内核。一般的嵌入式系统均采用压缩内核的方式,对 ARM 系列处理器来说 zImage 的入口程序即为 arch/arm/boot/compressed/head.S。它依次成了 MMU 和 Cache 的开启,并且调用函数解压内核,最后通过调用 call_kerne()函数进入非压缩内核 Image 的启动。3.4.2Linux 内核的移植内核的移植 在 linux 内核局部,也要根据设计需要进行相应的修改a)修改顶层 Makefile,用来指定体系结构和交叉编译器ARCH ?= armCROSS_COMPILE ?= arm-l

51、inux-b) 修改晶振频率s3c24xx_init_clocks(16934400)改为s3c24xx_init_clocks(12000000)用 make S3C2410_defconfig 先配置系统默认的 2410 配置,linux 内核具备一个现代操作系统的所有功能,并能对绝大多数硬件提供支持,但是对于每个设计来说,并不是所有的功能都会被用到,所以要在配置内核时,对所需要的功能进行相应的配置。用 make menuconfig 配置 linux 内核,即保存需要的内容,这样可以减少内核文件的大小。在 linux-.6/arch/arm/plat-s3c24xx 目录下的 commo

52、n-smdk.c 中对系统进行分区,我将系统分为了 4 个区,分别是引导区,内核区,文件系统区和保存区,代码如下:0 = .name = “Boot Loader, .size = SZ_1M, .offset = 0,1 = .name = “Linux Kernel, .size = SZ_4M - SZ_1M, .offset = SZ_1M,2 = .name = “File System, .size = SZ_8M, .offset = SZ_4M,3 = .name = “Reserved, .size = SZ_64M - SZ_8M - SZ_4M, .offset = SZ

53、_4M + SZ_8M,这些代码为对 Nand Flash 的分区代码,它会显示在内核启动信息中。在之后设置的 u-boot 引导参数,要将其设置为内核所在分区的地址;最后制作的文件系统也要放到相应分区。.name 为分区名;.size 为分区大小;.offset 为分区起始地址相对于 0 的偏移。可根据自己喜好设定。编译内核,当出现这些信息时,代表编译成功:Image Name: Linux-.2Created: Wed Mar 16 09:56:26 2021Image Type: ARM Linux Kernel Image (uncompressed)Data Size: 191033

54、2 Bytes = 1865.56 kB = 1.82 MBLoad Address: 0 x30008000Entry Point: 0 x30008000Image arch/arm/boot/uImage is ready编译成功后将在 arch/arm/boot 中生成可用于 u-boot 加载的 Linux 内核uImage 文件。3.5 文件系统的设计文件系统的设计Linux 支持多种文件系统,不同的文件系统类型也有着各自的特点。所以在选择文件系统类型的时候,就需要根据存储设备的硬件特性和系统的需求进行相应的选择。在 Linux 系统中,主要的存储设备分为随机存取存储器 RAM 和

55、只读存储器ROM。而常用的基于这两种存储设备的文件类型有:jffs2,yaffs,ramfs/tmpfs 等。在本设计中采用了 Jffs2 作为文件系统3.5.1Jffs2 文件系统介绍文件系统介绍Jffs2 文件系统主要应用与 NOR 型的存储设备中,它最主要的特点是可读写、支持数据压缩,掉电不易失,在掉电时会自动保存数据,为系统提供了一种平安的保护模式。Jffs2 的数据压缩方式和 CRAMFS 一样,其数据可存放在全部的闪存区域中,数据的写入和删除分布在很大一片区域中以防止同样的块会被重复使用。但是当文件系统已经接近饱和是,Jffs2 会因为垃圾收集的关系,导致系统运行速度的降低。下面列

56、举文件系统中应该包含的重要目录:/bin 目录:该目录下存放所有用户(包括系统管理员和一般用户)都可以使用的根本命令。/sbin 目录:该目录下存放系统命令,即只有管理员能够适用的命令。/dev 目录:该目录下存放的是设备文件(字符设备和块设备) 。/etc 目录:该目录下存放各种配置文件。/lib 目录:该目录下存放共享库和可加载模块(即驱动程序) 。/home 目录:即用户目录,它是可选的.在该目录下有一个以用户名命名的子目录,用于存放用户相关的配置文件。/root 目录:根用户(即 root)的目录。/usr 目录:该目录下存放的是可以在多个主机间共享,只读的程序和数据。/var 目录:

57、与/usr 目录相反,里面存放可变的数据。/proc 目录:这是一个空目录,常作为 porc 文件系统的挂接点。/mnt 目录:用于临时挂接某个文件系统的挂接点,通常是空目录。/tmp 目录:用于存放临时文件,通常是空目录。3.5.2文件系统的制作文件系统的制作在 Boot loader 中,将文件系统映像烧录到 flash 的某一个分区中,在启动的时候,将该分区作为根文件系统挂载。根文件系统是存放 Linux 系统所必须的配置文件、库文件、脚本、设备文件和其他特殊文件的地方,其中配置文件用来初始化和布局文件系统,库文件和脚本是从编程角度上来说的,它们为程序代码中的头文件提供效劳,设备文件用来

58、存放设备驱动。这些文件可以通过复制宿主机上交叉编译器处得文件来制作根文件系统。但是如果按照这种方法,制作文件系统的工作量会非常的巨大,还会出现错误,所以在本设计中借助了 BusyBox 这种工具来制作根文件系统。BusyBox 被称作是嵌入式领域中的一把瑞士军刀,它是标准 Linux 工具的一个单个可执行实现,它包含了一些简单的工具,还包含了一些更大、更复杂的工具,如 grep,find 等,他就像是一个工具箱,压缩了 Linux 许多工具和命令。在设计过程中,本设计采用了 BusyBox 来为系统提过 Linux 的命令集和必要的库文件。制作文件系统过程如下:首先进入 BusyBox 的目录

59、下,将 BusyBox 默认的体系结构改为 ARM,默认的交叉编译器改为 arm-linux-gcc: ARCH ?= arm CROSS_COMPILE ?= arm-linux-然后执行 make defconfig 和 make menuconfig 这两条语句,让编译器编程可以在开发板中运行的程序。之后让 busybox 在指定的目录下生成文件系统: make CONFIG_PREFIX=/nfs_root/root_fs install当初步生成了的文件系统的框架后,需要丰富其系统中的内容以到达 Linux 系统要求的目录结构及其中的文件:1、创立 dev 目录创立 dev 目录并创

60、立必要的设备节点,其中需要 console 和 null 设备节点,故需创立它们。而它们的主次设备号以及其他属性,在设计中参照可 Linux 中 dev 目录下的 console 和 null。2、创立 etc 目录回到文件系统的根目录,创立 etc 目录并在其中创立初始化脚本 inittab: 在 inittab 中输入以下代码 :askfirst:-/bin/sh :shutdown:/bin/umount a r在当前的 etc 目录下创立 init.d 目录并在 init.d 目录下创立 rcS: #!/bin/sh echo “Hello world! mount t sysfs none /sys mount t proc non

温馨提示

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

评论

0/150

提交评论