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

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

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

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

摘要

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


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














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

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

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

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

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

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

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

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

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

}
實現(xiàn)了LCD畫圖和畫點(diǎn)函數(shù),我們便可以對logo和進(jìn)度條的顯示進(jìn)行最終的實現(xiàn)了。對于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)度條的實現(xiàn)和logo的差不多,只不過進(jìn)度條是使用畫點(diǎn)函數(shù)來實現(xiàn)。從上面我們已經(jīng)知道,進(jìn)度條的顯示實際上是在把內(nèi)核從nand flash復(fù)制到內(nèi)存中而進(jìn)行的。為了實現(xiàn)進(jìn)度條顯示的均勻,我們將內(nèi)核文件平均分為16份分別讀取,并在每次讀取后加載進(jìn)度條,從而是使進(jìn)度條的顯示看起來均勻。
以下為其代碼:
/*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)度條步長
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下載功能的實現(xiàn)
USB下載功能是mboot重要的一部分,它關(guān)系到對MP4內(nèi)核,文件系統(tǒng)的實時更新,同時能方便用戶DIY自己的啟動logo.所以我們有必要對它的具體實現(xiàn)進(jìn)行具體的分析。
在s3c2440中,通用串行總線(USB)設(shè)備控制器被設(shè)計為提供了高性能全速功能的帶DMA 接口控制器解決方案。USB 設(shè)備控制器允許DMA 的批量傳輸、中斷傳輸和控制傳輸。
同時USB 設(shè)備控制器具有如下特性:
– 兼容USB 規(guī)格1.1 版本的全速USB 設(shè)備控制器。
– 批量傳輸?shù)腄MA 接口
– 帶FIFO 的5 個端點(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,同時其對DMA傳輸?shù)闹С质箓鬏斔俣茸兊母臁?br>為了充分利用這些特性,我們的USB設(shè)備驅(qū)動必須完成一些功能:













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

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

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