您的位置:新文秘网>>毕业相关/毕业论文/文教论文/>>正文

毕业论文:基于ARM9的MP4设计--底层系统设计

发表时间:2013/5/9 11:13:45

题目: 基于ARM9的MP4设计--底层系统设计
院(系)   信息科学与工程学院 
专 业     电子信息工程    
届 别     2011届

摘要

随着科学技术的发展,各种新技术的运用使得芯片的成本和体积越来越小,而功能却越来越强大。MP4播放器的发展也是在这种大趋势下,从最初只能播放特定格式视频,到现在可以播放各种格式视频文件,功能更加强大。
目前基于ARM核的嵌入式微处理器芯片以其高性价比、低功耗、接口丰富等特性越来越受到手机、MP4、GPS等各种便携式设备研发人员的青睐。本文正是在这种背景下,采用嵌入式微处理器ARM9进行MP4的设计。
本文分析了MP4的硬件设计方案,主要工作是进行芯片的选择和电路设计,其中主控芯片选用三星公司的ARM9系列嵌入式微处理器芯片S3C2440*;外存选择了K9F1208UOC,大小为64MB的NAND Flash;同时为了MP4能流畅的播放,内存选择了两片HY57V561620,大小合计为64MB的SDRAM;还扩展了SD接口,可进行存储扩展。
软件方面是以Linu*系统为平台,利用Linu*下GUI开发库Qt作为MP4界面设计的工具。在音频解码方面采用已有的madplayer进行播放。视频解码则是利用mplayer视频播放器的来进行设计。


关键词:解码器,Qt







ABSTRACT

With the development of science and technology, all sorts of new technique makes chip cost and size smaller and smaller, and function is growing stronger. MP4 player development is in this tendency, from initial play specific format video, only to can now play all video file format, function more powerful.
Currently based on the ARM processor chips embedded microcontroller chip with its high performance, low power consumption, interface features such as more and more get rich mobile phone, MP4, GPS etc various portable equipment research and development personnels favour. This paper it is in this conte*t, the embedded microcontroller ARM9 processor by on the design of the MP4.
This artical analyzes the hardware design scheme, MP4 main work is on the selection and circuit design chips, including main control chip choose samsungs ARM9 processor chips embedded microcontroller series S3C2440*; Memory chip chose K9F1208UOC, 64MB NAND Flash size; Meanwhile in order to MP4 can smooth playback, memory chose two HY57V561620, 64MB of total size for SDRAM; Also e*panded the SD interface, can undertake storage e*pansion.
Software based on Linu* system as the platform, which is developed using Linu* library Qt under tool designed as MP4 interface. In audio decoding adopt e*isting madplayer for broadcast. Video decoding is to use video player mplayer to design.

Keywords: mp4,arm9,s3c2440a,nand flash

目录
摘要 2
ABSTRACT 3
第一章 引言 5
1.1 问题提出的背景及意义 5
1.2 MP4国内外研究现状 6
1.3 底层系统整体设计方案 7
第二章 MP4启动程序实现 8
2.1 Boot Loader简介 8
2.2 mboot的实现 9
2.2.1 logo和进度条的实现 10
2.2.2 US
……(新文秘网https://www.wm114.cn省略3574字,正式会员可完整阅读)…… 














有流程图可知,前半部分主要完成的是对ARM处理器的初始化,后面则主要是对外部设备进行初始化,以实现mboot程序功能。下面将根据mboot具体所实现的功能对mboot的具体实现进行解析。
2.2.1 logo和进度条的实现

作为MP4启动程序的一部分,MP4 logo和进度条使系统启动不再是无谓的等待,而是把系统启动过程变得可视化。它们的实现必须依靠LCD的支持。
LCD作为MP4最重要的组成部分之一,主要采用STN,TFT和OLED三种材质。本设计将采用本开放板配置的3.5英寸的TFT LCD做MP4的显示部件。对于TFT LCD,它是有源矩阵类型液晶显示器(AM-LCD)中的一种,TFT在液晶的背部设置特殊光管,可以“主动的”对屏幕上的各个独立的象素进行控制,这也就是所谓的主动矩阵TFT的来历,这样可以大大的提高反应时间,一般TFT的反映时间约80毫秒。而且由于TFT是主动式矩阵LCD可让液晶的排列方式具有记忆性,不会在电流消失后马上恢复原状。TFT还改善了STN会闪烁(水波纹)的现象,有效的提高了播放动态画面的能力。TFT有出色的色彩饱和度、还原能力和更高的对比度,缺点就是比较耗电,成本相对较高。
要实现MP4 logo和进度条,首先要对TFT LCD进行初始化,其初始化过程可分为数据输入端口的设置,LCD显示信号的设置,LCD显示缓存地址的设置以及LCD显示像素的设置。
下面分别对其进行分析:
 LCD的数据输入端口进行初始化:

如上图所示,LCD数据输入端口分别对于不同的外部接口,必须对其进行相应配置, 其设置代码如下:
gpccon=0*aaaaaaaa;
gpcup=0*ffff;
gpdcon=0*aaaaaaaa;
gpdup=0*ffff;

 LCD显示信号的设置:
对于TFT LCD,其LCD显示信号VSYNC(垂直同步信号),HSYNC(水平同步 信号),VCLK(像素时钟信号),VDEN(数据使能信号),LEND(行结束信
号)都是有S3C2440的LCD控制器中的TIMEGEN模块产生。这些控制信号与REGBANK 中LCDCON1/2/3/4/5 寄存器的配制有极大的关系。
其中VSYNC 和HSYNC 脉冲的产生取决于LCDCON2/3 寄存器中HOZVAL 字段和LINEVAL 字段的配制。HOZVAL和LINEVAL 可以按照下列等式由LCD 面板大小决定:
– HOZVAL = (水平显示大小) - 1
– LINEVAL = (垂直显示大小) - 1
VCLK 信号的频率取决于LCDCON1 寄存器中的CLKVAL 字段。表15-3 定义了VCLK 和CLKVAL 之间的关系。CLKVAL 的最小值为0。

VCLK(Hz)= HCLK / [( CLKVAL + 1) * 2]

帧频即为VSYNC 信号频率。帧频与LCDCON1 和LCDCON2/3/4 寄存器中的VSYNC、VBPD、VFPD、LINEVAL、HSYNC、HBPD、HFPD、HOZVAL、和CLKVAL 字段有关系,其计算公式为:

帧频(Hz)= 1 / [ { (1 / VCLK) * (HOZVAL + 1)+(1 / HCLK) * (A + B + (LINEBLANK * 8) ) } * ( LINEVAL+1) ]
对于这些时钟频率之间的关系,见下图:

根据上图,我们可以对LCD的寄存器进行设置,使LCD控制器产生适合此LCD的显示信号。
其代码如下:
lcdcon2=(CONFIG_LCD_VBPD<<24)|(CONFIG_LCD_LINEVAL<<14)|(CONFIG_LCD_VFPD<<6)|(CONFIG_LCD_VSPW);
lcdcon3=(CONFIG_LCD_HBPD<<19)|(CONFIG_LCD_HOZVAL<<8)|(CONFIG_LCD_HFPD);

 LCD显示缓存地址的设置
新一代的LCD支持Framebuffer,我们只需要将图片数据复制到lcd显示指定的lcd的buffer就可以进行显示,本设计的Frambebuffer为lcdbuf[240][320]数组。
LCD显示缓存地址的设置与LCDSADDR1/2 寄存器LCDBASEU 和LCDBASEL 的字段有关,对此我们只需要将lcdbuf的地址赋值到LCDSADDR寄存器就行了。
其代码如下:
lcdsaddr1=(((unsigned long)lcdbuf>>22)<<21)|(((unsigned long)lcdbuf>>1)&0*1fffff);
lcdsaddr2=(((unsigned long)lcdbuf+(unsigned long)CONFIG_LCD_*LEN*CONFIG_LCD_YLEN*4)>>1)&0*1fffff;

 LCD显示像素的设置
为了保证logo显示的清晰度,我们采用24位色的,即RGB=8:8:8,由于TFT的调色板不支持24BPP,故而我们必须关掉调色板,不然显示会不正常。
其代码如下所示:
lcdcon1=(CONFIG_LCD_CLKVAL<<8)|(3<<5)|(13<<1); //VCLK=7.2MHZ,TFT面板,TFT 的 24 bpp
tpal=0*0; //关闭调色板

通过以上步骤完成了LCD设备的初始化,要完成logo和进度条的显示还需要实现LCD画图函数和画点函数。我们采用的3.5英寸的TFT LCD分辨率为320*240,即320*240个像素点。由上面的分析所知,我们用 lcdbuf[320][240]
作为LCD显示帧缓存区,LCD中的320*240个像素点就是分别对于lcdbuf数组中的点,画点函数的实现实际上就是对该点所对应的lcdbuf进行赋值。类似的,画图函数就是对一个区域内的点所对应的lcdbuf进行赋值。
它们的代码如下:
/*paint a point*/
static void s3c2440_lcd_point(unsigned long *, unsigned long y, unsigned long c)
{

if( (* < CONFIG_LCD_*LEN) && (y < CONFIG_LCD_YLEN))
lcdbuf[y][*] = c;
}

/*
* paint in pointed address
*/
static void s3c2440_paint_bmp(int *0,int y0,int width,int height, unsigned char *bmp)
{
int *, y ;
unsigned long c;
unsigned long p = 0 ;


for( y = y0 ; y < (height + y0) ; y++ )
{
for( * = *0 ; * < (width + *0) ; *++ )
{
c = (bmp[p+2])<<16| (bmp[p+1] << 8)|bmp[p] ;

if ( ( * <= (CONFIG_LCD_*LEN) ) && ( y <= CONFIG_LCD_YLEN ) )
lcdbuf[y][*] = c;
p = p + 3 ;
}
}

}
实现了LCD画图和画点函数,我们便可以对logo和进度条的显示进行最终的实现了。对于mp4 logo,我们首先将制作好的logo.bin文件用USB烧写到nand
Flash的特定位置,然后调用画图函数static void s3c2440_paint_bmp(int *0,int y0,int width,int height, unsigned char *bmp),将logo画出。由此,我们完成了MP4的logo的显示。
其代码如下:
/*show mp4 logo*/
void mp4_lcd_logo(void)
{
u8 *p=(u8 *)0*30000000;
nand_read(p,0*100000,0*4b000); //首先将logo读取到内存
s3c2440_paint_bmp(0, 0, 320, 240,p); //填充lcdbuf

s3c2440_output_eanble(1); //使能数据输出

}
进度条的实现和logo的差不多,只不过进度条是使用画点函数来实现。从上面我们已经知道,进度条的显示实际上是在把内核从nand flash复制到内存中而进行的。为了实现进度条显示的均匀,我们将内核文件平均分为16份分别读取,并在每次读取后加载进度条,从而是使进度条的显示看起来均匀。
以下为其代码:
/*drwa process bar*/
static void load_bar(int current)
{
int const bar_height = 8; //进度条宽度
unsigned long bar_base = CONFIG_LCD_YLEN- bar_height; //进度条显示位置
int i = (int) CONFIG_LCD_*LEN/ 16; //进度条步长
unsigned long j,k;

u32 pbcolor ;

int bar_width = current*CONFIG_LCD_*LEN/16;
/*为进度条配置不同的颜色*/
int ne*t_bar_width=bar_width+i;
if (bar_width <= i)
pbcolor = 240<<16|255<<8;
else if((bar_width <= i*2))
pbcolor = 120<<16|255<<8;
else if((bar_width <= i*3))
pbcolor = 255<<8;
else if((bar_width <= i*4))
pbcolor = 120|255<<8;
else if((bar_width <= i*5))
pbcolor = 240|255<<8;
else if((bar_width <= i*6))
pbcolor = 255|240<<8;
else if((bar_width <= i*7))
pbcolor = 255|120<<8;
else if((bar_width <= i*8))
pbcolor = 255|0<<8;
else if (bar_width <= i*9)
pbcolor = 255|120<<8;
else if((bar_width <= i*10))
pbcolor = 255|240<<8;
else if((bar_width <= i*11))
pbcolor = 0<<16|255<<8;
else if((bar_width <= i*12))
pbcolor = 120<<16|255<<8;
else if((bar_width <= i*13))
pbcolor = 240<<16|255<<8;
else if((bar_width <= i*14))
pbcolor = 240|255<<16;
else if((bar_width <= i*15))
pbcolor = 120|255<<16;
else if((bar_width <= i*16))
pbcolor = 0|255<<16;
/*填充进度条的lcdbuf*/
for(k=bar_width;k for ( j = 0; j < bar_height; j++)
{
s3c2440_lcd_point(k, j + bar_base, pbcolor);
}
}

}
由此我们完成了进度条以及logo的显示。但离我们总的目标还有一段距离,下面让我们继续进行下一步。

2.2.2 USB下载功能的实现
USB下载功能是mboot重要的一部分,它关系到对MP4内核,文件系统的实时更新,同时能方便用户DIY自己的启动logo.所以我们有必要对它的具体实现进行具体的分析。
在s3c2440中,通用串行总线(USB)设备控制器被设计为提供了高性能全速功能的带DMA 接口控制器解决方案。USB 设备控制器允许DMA 的批量传输、中断传输和控制传输。
同时USB 设备控制器具有如下特性:
– 兼容USB 规格1.1 版本的全速USB 设备控制器。
– 批量传输的DMA 接口
– 带FIFO 的5 个端点
EP0:16 字节(寄存器)
EP1:128 字节IN/OUT FIFO(双口异步RAM):中断或DMA
EP2:128 字节IN/OUT FIFO(双口异步RAM):中断或DMA
EP3:128 字节IN/OUT FIFO(双口异步RAM):中断或DMA
EP4:128 字节IN/OUT FIFO(双口异步RAM):中断或DMA
– 完整的USB 收发器
由其特性可知,s3c2440的USB设备控制器相比以前的s3c2410具有更强大的功能,其端点的FIFI达到128K,同时其对DMA传输的支持使传输速度变的更快。
为了充分利用这些特性,我们的USB设备驱动必须完成一些功能:













下面我们将根据上图对USB设备端驱动进行具体的实现:
 USB设备控制器初始化的实现是由usblib.c中的void ConfigUsbd(void)
函数来实现的。为了提高USB设备的传输速度,一般是把端点的总FIFO分为
A和B两块,只需一块填满就可产生中断,使得设备端主机S3C2440不用等到2块同时填满就能接受数据,大大提高了连续数据包得传输速度。
EPO作为控制端点,其总FIFO为16字节,根据上面的原则,其最大传输包为8字节。同时应清空其OUT_PKT_RDY & SETUP_END状态位,使EP0处于空闲状态。
其代码如下:
rINDE*_REG=0;
rMA*P_REG=FIFO_SIZE_8; //EP0 ma* packit size = 8
rEP0_CSR=EP0_SERVICED_OUT_PKT_RDY|EP0_SERVICED_SETUP_END;
//EP0:clear OUT_PKT_RDY & SETUP_END
EP1作为IN端口,EP3作为OUT端口,其总FIFO为128字节,故其最大传输包为64字节。同时我们应清空它们的缓冲以及设置A和B两块自动交互。
EP1和EP3进行传输时都是使用BULK-only模式,且一般不会使用DMA传输模
式,应将DMA_INT_MASK屏蔽掉。不过由于它们一个是IN端口,一个是 OUT 端口,在设置它们端点类型的时候是不一样的。
同样列出其代码:
rINDE*_REG=1;
rMA*P_REG=FIFO_SIZE_64; //EP1:ma* packit size = 64
rIN_CSR1_REG=EPI_FIFO_FLUSH|EPI_CDT;
rIN_CSR2_REG=EPI_MODE_IN|EPI_IN_DMA_INT_MASK|EPI_BULK; //IN mode, IN_DMA_INT=masked

rINDE*_REG=2;
rMA*P_REG=FIFO_SIZE_64; //EP2:ma* packit size = 64
rOUT_CSR1_REG=EPO_CDT;
rOUT_CSR2_REG=EPO_BULK|EPO_OUT_DMA_INT_MASK;
设置好各传输端点,我们应根据实际USB传输过程来对各端点的中断进行设置,由于我们只用到3个端点,故而只开启3个端点的中断。同时USB设备自身具有2个设备控制的中断,即:RESET 中断,SUSPEND 中断,一般而言,这2个中断都应打开。最后,我们还应开启S3C2440主机的外部中断源USBD,使得USB控制器发出中断时,能被主机知道并对其处理。
下面为其代码:
rEP_INT_EN_REG=EP0_INT|EP1_INT|EP3_INT;
rUSB_INT_EN_REG=RESET_INT;
intmsk&=~(BIT_USBD);
USB设备控制器的初始化为后续的USB设备与主机端进行通信做好了准备,但这还远远不够,我们还必须完成USB设备端总中断控制函数。只有只有我们能对PC通过USB线发给S3C2440的信息进行处理和反馈。

 USB设备端中断处理函数
USB设备端中断处理函数的实现是在usbmian.c进行实现的。USB 核包含两个中断寄存器EP_INT_REG和USB_INT_REG。这些寄存器起到当中断时MCU 的状态寄存器的作用。当USB设备控制器发送中断给主机时,主机会检测这两个中断寄存器EP_INT_REG和USB_INT_REG,并根据其中的中断位分别进行处理。
其流程图,如下图所示:

就本设计而言,SETUP中断和OUT中断处理最为重要。在SETUP中断是对控制端点的操作,发生在USB设备挂 ……(未完,全文共55804字,当前仅显示10037字,请阅读下面提示信息。收藏《毕业论文:基于ARM9的MP4设计--底层系统设计》