您的位置:新文秘網(wǎng)>>畢業(yè)相關(guān)/畢業(yè)論文/文教論文/>>正文

畢業(yè)論文:基于ARM9的MP4設(shè)計(jì)--底層系統(tǒng)設(shè)計(jì)

發(fā)表時(shí)間:2013/5/9 11:13:45

題目: 基于ARM9的MP4設(shè)計(jì)--底層系統(tǒng)設(shè)計(jì)
院(系)   信息科學(xué)與工程學(xué)院 
專 業(yè)     電子信息工程    
屆 別     2011屆

摘要

隨著科學(xué)技術(shù)的發(fā)展,各種新技術(shù)的運(yùn)用使得芯片的成本和體積越來(lái)越小,而功能卻越來(lái)越強(qiáng)大。MP4播放器的發(fā)展也是在這種大趨勢(shì)下,從最初只能播放特定格式視頻,到現(xiàn)在可以播放各種格式視頻文件,功能更加強(qiáng)大。
目前基于ARM核的嵌入式微處理器芯片以其高性價(jià)比、低功耗、接口豐富等特性越來(lái)越受到手機(jī)、MP4、GPS等各種便攜式設(shè)備研發(fā)人員的青睞。本文正是在這種背景下,采用嵌入式微處理器ARM9進(jìn)行MP4的設(shè)計(jì)。
本文分析了MP4的硬件設(shè)計(jì)方案,主要工作是進(jìn)行芯片的選擇和電路設(shè)計(jì),其中主控芯片選用三星公司的ARM9系列嵌入式微處理器芯片S3C2440*;外存選擇了K9F1208UOC,大小為64MB的NAND Flash;同時(shí)為了MP4能流暢的播放,內(nèi)存選擇了兩片HY57V561620,大小合計(jì)為64MB的SDRAM;還擴(kuò)展了SD接口,可進(jìn)行存儲(chǔ)擴(kuò)展。
軟件方面是以Linu*系統(tǒng)為平臺(tái),利用Linu*下GUI開發(fā)庫(kù)Qt作為MP4界面設(shè)計(jì)的工具。在音頻解碼方面采用已有的madplayer進(jìn)行播放。視頻解碼則是利用mplayer視頻播放器的來(lái)進(jìn)行設(shè)計(jì)。


關(guān)鍵詞:解碼器,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 問(wèn)題提出的背景及意義 5
1.2 MP4國(guó)內(nèi)外研究現(xiàn)狀 6
1.3 底層系統(tǒng)整體設(shè)計(jì)方案 7
第二章 MP4啟動(dòng)程序?qū)崿F(xiàn) 8
2.1 Boot Loader簡(jiǎn)介 8
2.2 mboot的實(shí)現(xiàn) 9
2.2.1 logo和進(jìn)度條的實(shí)現(xiàn) 10
2.2.2 US
……(新文秘網(wǎng)http://jey722.cn省略3574字,正式會(huì)員可完整閱讀)…… 














有流程圖可知,前半部分主要完成的是對(duì)ARM處理器的初始化,后面則主要是對(duì)外部設(shè)備進(jìn)行初始化,以實(shí)現(xiàn)mboot程序功能。下面將根據(jù)mboot具體所實(shí)現(xiàn)的功能對(duì)mboot的具體實(shí)現(xiàn)進(jìn)行解析。
2.2.1 logo和進(jìn)度條的實(shí)現(xiàn)

作為MP4啟動(dòng)程序的一部分,MP4 logo和進(jìn)度條使系統(tǒng)啟動(dòng)不再是無(wú)謂的等待,而是把系統(tǒng)啟動(dòng)過(guò)程變得可視化。它們的實(shí)現(xiàn)必須依靠LCD的支持。
LCD作為MP4最重要的組成部分之一,主要采用STN,TFT和OLED三種材質(zhì)。本設(shè)計(jì)將采用本開放板配置的3.5英寸的TFT LCD做MP4的顯示部件。對(duì)于TFT LCD,它是有源矩陣類型液晶顯示器(AM-LCD)中的一種,TFT在液晶的背部設(shè)置特殊光管,可以“主動(dòng)的”對(duì)屏幕上的各個(gè)獨(dú)立的象素進(jìn)行控制,這也就是所謂的主動(dòng)矩陣TFT的來(lái)歷,這樣可以大大的提高反應(yīng)時(shí)間,一般TFT的反映時(shí)間約80毫秒。而且由于TFT是主動(dòng)式矩陣LCD可讓液晶的排列方式具有記憶性,不會(huì)在電流消失后馬上恢復(fù)原狀。TFT還改善了STN會(huì)閃爍(水波紋)的現(xiàn)象,有效的提高了播放動(dòng)態(tài)畫面的能力。TFT有出色的色彩飽和度、還原能力和更高的對(duì)比度,缺點(diǎn)就是比較耗電,成本相對(duì)較高。
要實(shí)現(xiàn)MP4 logo和進(jìn)度條,首先要對(duì)TFT LCD進(jìn)行初始化,其初始化過(guò)程可分為數(shù)據(jù)輸入端口的設(shè)置,LCD顯示信號(hào)的設(shè)置,LCD顯示緩存地址的設(shè)置以及LCD顯示像素的設(shè)置。
下面分別對(duì)其進(jìn)行分析:
 LCD的數(shù)據(jù)輸入端口進(jìn)行初始化:

如上圖所示,LCD數(shù)據(jù)輸入端口分別對(duì)于不同的外部接口,必須對(duì)其進(jìn)行相應(yīng)配置, 其設(shè)置代碼如下:
gpccon=0*aaaaaaaa;
gpcup=0*ffff;
gpdcon=0*aaaaaaaa;
gpdup=0*ffff;

 LCD顯示信號(hào)的設(shè)置:
對(duì)于TFT LCD,其LCD顯示信號(hào)VSYNC(垂直同步信號(hào)),HSYNC(水平同步 信號(hào)),VCLK(像素時(shí)鐘信號(hào)),VDEN(數(shù)據(jù)使能信號(hào)),LEND(行結(jié)束信
號(hào))都是有S3C2440的LCD控制器中的TIMEGEN模塊產(chǎn)生。這些控制信號(hào)與REGBANK 中LCDCON1/2/3/4/5 寄存器的配制有極大的關(guān)系。
其中VSYNC 和HSYNC 脈沖的產(chǎn)生取決于LCDCON2/3 寄存器中HOZVAL 字段和LINEVAL 字段的配制。HOZVAL和LINEVAL 可以按照下列等式由LCD 面板大小決定:
– HOZVAL = (水平顯示大小) - 1
– LINEVAL = (垂直顯示大小) - 1
VCLK 信號(hào)的頻率取決于LCDCON1 寄存器中的CLKVAL 字段。表15-3 定義了VCLK 和CLKVAL 之間的關(guān)系。CLKVAL 的最小值為0。

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

幀頻即為VSYNC 信號(hào)頻率。幀頻與LCDCON1 和LCDCON2/3/4 寄存器中的VSYNC、VBPD、VFPD、LINEVAL、HSYNC、HBPD、HFPD、HOZVAL、和CLKVAL 字段有關(guān)系,其計(jì)算公式為:

幀頻(Hz)= 1 / [ { (1 / VCLK) * (HOZVAL + 1)+(1 / HCLK) * (A + B + (LINEBLANK * 8) ) } * ( LINEVAL+1) ]
對(duì)于這些時(shí)鐘頻率之間的關(guān)系,見(jiàn)下圖:

根據(jù)上圖,我們可以對(duì)LCD的寄存器進(jìn)行設(shè)置,使LCD控制器產(chǎn)生適合此LCD的顯示信號(hào)。
其代碼如下:
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顯示緩存地址的設(shè)置
新一代的LCD支持Framebuffer,我們只需要將圖片數(shù)據(jù)復(fù)制到lcd顯示指定的lcd的buffer就可以進(jìn)行顯示,本設(shè)計(jì)的Frambebuffer為lcdbuf[240][320]數(shù)組。
LCD顯示緩存地址的設(shè)置與LCDSADDR1/2 寄存器LCDBASEU 和LCDBASEL 的字段有關(guān),對(duì)此我們只需要將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顯示像素的設(shè)置
為了保證logo顯示的清晰度,我們采用24位色的,即RGB=8:8:8,由于TFT的調(diào)色板不支持24BPP,故而我們必須關(guān)掉調(diào)色板,不然顯示會(huì)不正常。
其代碼如下所示:
lcdcon1=(CONFIG_LCD_CLKVAL<<8)|(3<<5)|(13<<1); //VCLK=7.2MHZ,TFT面板,TFT 的 24 bpp
tpal=0*0; //關(guān)閉調(diào)色板

通過(guò)以上步驟完成了LCD設(shè)備的初始化,要完成logo和進(jìn)度條的顯示還需要實(shí)現(xiàn)LCD畫圖函數(shù)和畫點(diǎn)函數(shù)。我們采用的3.5英寸的TFT LCD分辨率為320*240,即320*240個(gè)像素點(diǎn)。由上面的分析所知,我們用 lcdbuf[320][240]
作為L(zhǎng)CD顯示幀緩存區(qū),LCD中的320*240個(gè)像素點(diǎn)就是分別對(duì)于lcdbuf數(shù)組中的點(diǎn),畫點(diǎn)函數(shù)的實(shí)現(xiàn)實(shí)際上就是對(duì)該點(diǎn)所對(duì)應(yīng)的lcdbuf進(jìn)行賦值。類似的,畫圖函數(shù)就是對(duì)一個(gè)區(qū)域內(nèi)的點(diǎn)所對(duì)應(yīng)的lcdbuf進(jìn)行賦值。
它們的代碼如下:
/*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 ;
}
}

}
實(shí)現(xiàn)了LCD畫圖和畫點(diǎn)函數(shù),我們便可以對(duì)logo和進(jìn)度條的顯示進(jìn)行最終的實(shí)現(xiàn)了。對(duì)于mp4 logo,我們首先將制作好的logo.bin文件用USB燒寫到nand
Flash的特定位置,然后調(diào)用畫圖函數(shù)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讀取到內(nèi)存
s3c2440_paint_bmp(0, 0, 320, 240,p); //填充lcdbuf

s3c2440_output_eanble(1); //使能數(shù)據(jù)輸出

}
進(jìn)度條的實(shí)現(xiàn)和logo的差不多,只不過(guò)進(jìn)度條是使用畫點(diǎn)函數(shù)來(lái)實(shí)現(xiàn)。從上面我們已經(jīng)知道,進(jìn)度條的顯示實(shí)際上是在把內(nèi)核從nand flash復(fù)制到內(nèi)存中而進(jìn)行的。為了實(shí)現(xiàn)進(jìn)度條顯示的均勻,我們將內(nèi)核文件平均分為16份分別讀取,并在每次讀取后加載進(jìn)度條,從而是使進(jìn)度條的顯示看起來(lái)均勻。
以下為其代碼:
/*drwa process bar*/
static void load_bar(int current)
{
int const bar_height = 8; //進(jìn)度條寬度
unsigned long bar_base = CONFIG_LCD_YLEN- bar_height; //進(jìn)度條顯示位置
int i = (int) CONFIG_LCD_*LEN/ 16; //進(jìn)度條步長(zhǎng)
unsigned long j,k;

u32 pbcolor ;

int bar_width = current*CONFIG_LCD_*LEN/16;
/*為進(jìn)度條配置不同的顏色*/
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;
/*填充進(jìn)度條的lcdbuf*/
for(k=bar_width;k for ( j = 0; j < bar_height; j++)
{
s3c2440_lcd_point(k, j + bar_base, pbcolor);
}
}

}
由此我們完成了進(jìn)度條以及l(fā)ogo的顯示。但離我們總的目標(biāo)還有一段距離,下面讓我們繼續(xù)進(jìn)行下一步。

2.2.2 USB下載功能的實(shí)現(xiàn)
USB下載功能是mboot重要的一部分,它關(guān)系到對(duì)MP4內(nèi)核,文件系統(tǒng)的實(shí)時(shí)更新,同時(shí)能方便用戶DIY自己的啟動(dòng)logo.所以我們有必要對(duì)它的具體實(shí)現(xiàn)進(jìn)行具體的分析。
在s3c2440中,通用串行總線(USB)設(shè)備控制器被設(shè)計(jì)為提供了高性能全速功能的帶DMA 接口控制器解決方案。USB 設(shè)備控制器允許DMA 的批量傳輸、中斷傳輸和控制傳輸。
同時(shí)USB 設(shè)備控制器具有如下特性:
– 兼容USB 規(guī)格1.1 版本的全速USB 設(shè)備控制器。
– 批量傳輸?shù)腄MA 接口
– 帶FIFO 的5 個(gè)端點(diǎn)
EP0:16 字節(jié)(寄存器)
EP1:128 字節(jié)IN/OUT FIFO(雙口異步RAM):中斷或DMA
EP2:128 字節(jié)IN/OUT FIFO(雙口異步RAM):中斷或DMA
EP3:128 字節(jié)IN/OUT FIFO(雙口異步RAM):中斷或DMA
EP4:128 字節(jié)IN/OUT FIFO(雙口異步RAM):中斷或DMA
– 完整的USB 收發(fā)器
由其特性可知,s3c2440的USB設(shè)備控制器相比以前的s3c2410具有更強(qiáng)大的功能,其端點(diǎn)的FIFI達(dá)到128K,同時(shí)其對(duì)DMA傳輸?shù)闹С质箓鬏斔俣茸兊母臁?br>為了充分利用這些特性,我們的USB設(shè)備驅(qū)動(dòng)必須完成一些功能:













下面我們將根據(jù)上圖對(duì)USB設(shè)備端驅(qū)動(dòng)進(jìn)行具體的實(shí)現(xiàn):
 USB設(shè)備控制器初始化的實(shí)現(xiàn)是由usblib.c中的void ConfigUsbd(void)
函數(shù)來(lái)實(shí)現(xiàn)的。為了提高USB設(shè)備的傳輸速度,一般是把端點(diǎn)的總FIFO分為
A和B兩塊,只需一塊填滿就可產(chǎn)生中斷,使得設(shè)備端主機(jī)S3C2440不用等到2塊同時(shí)填滿就能接受數(shù)據(jù),大大提高了連續(xù)數(shù)據(jù)包得傳輸速度。
EPO作為控制端點(diǎn),其總FIFO為16字節(jié),根據(jù)上面的原則,其最大傳輸包為8字節(jié)。同時(shí)應(yīng)清空其OUT_PKT_RDY & SETUP_END狀態(tài)位,使EP0處于空閑狀態(tài)。
其代碼如下:
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字節(jié),故其最大傳輸包為64字節(jié)。同時(shí)我們應(yīng)清空它們的緩沖以及設(shè)置A和B兩塊自動(dòng)交互。
EP1和EP3進(jìn)行傳輸時(shí)都是使用BULK-only模式,且一般不會(huì)使用DMA傳輸模
式,應(yīng)將DMA_INT_MASK屏蔽掉。不過(guò)由于它們一個(gè)是IN端口,一個(gè)是 OUT 端口,在設(shè)置它們端點(diǎn)類型的時(shí)候是不一樣的。
同樣列出其代碼:
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;
設(shè)置好各傳輸端點(diǎn),我們應(yīng)根據(jù)實(shí)際USB傳輸過(guò)程來(lái)對(duì)各端點(diǎn)的中斷進(jìn)行設(shè)置,由于我們只用到3個(gè)端點(diǎn),故而只開啟3個(gè)端點(diǎn)的中斷。同時(shí)USB設(shè)備自身具有2個(gè)設(shè)備控制的中斷,即:RESET 中斷,SUSPEND 中斷,一般而言,這2個(gè)中斷都應(yīng)打開。最后,我們還應(yīng)開啟S3C2440主機(jī)的外部中斷源USBD,使得USB控制器發(fā)出中斷時(shí),能被主機(jī)知道并對(duì)其處理。
下面為其代碼:
rEP_INT_EN_REG=EP0_INT|EP1_INT|EP3_INT;
rUSB_INT_EN_REG=RESET_INT;
intmsk&=~(BIT_USBD);
USB設(shè)備控制器的初始化為后續(xù)的USB設(shè)備與主機(jī)端進(jìn)行通信做好了準(zhǔn)備,但這還遠(yuǎn)遠(yuǎn)不夠,我們還必須完成USB設(shè)備端總中斷控制函數(shù)。只有只有我們能對(duì)PC通過(guò)USB線發(fā)給S3C2440的信息進(jìn)行處理和反饋。

 USB設(shè)備端中斷處理函數(shù)
USB設(shè)備端中斷處理函數(shù)的實(shí)現(xiàn)是在usbmian.c進(jìn)行實(shí)現(xiàn)的。USB 核包含兩個(gè)中斷寄存器EP_INT_REG和USB_INT_REG。這些寄存器起到當(dāng)中斷時(shí)MCU 的狀態(tài)寄存器的作用。當(dāng)USB設(shè)備控制器發(fā)送中斷給主機(jī)時(shí),主機(jī)會(huì)檢測(cè)這兩個(gè)中斷寄存器EP_INT_REG和USB_INT_REG,并根據(jù)其中的中斷位分別進(jìn)行處理。
其流程圖,如下圖所示:

就本設(shè)計(jì)而言,SETUP中斷和OUT中斷處理最為重要。在SETUP中斷是對(duì)控制端點(diǎn)的操作,發(fā)生在USB設(shè)備掛 ……(未完,全文共55804字,當(dāng)前僅顯示10037字,請(qǐng)閱讀下面提示信息。收藏《畢業(yè)論文:基于ARM9的MP4設(shè)計(jì)--底層系統(tǒng)設(shè)計(jì)》
文章搜索
相關(guān)文章