您的位置:新文秘網>>畢業(yè)相關/畢業(yè)論文/文教論文/>>正文

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

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

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

摘要

隨著科學技術的發(fā)展,各種新技術的運用使得芯片的成本和體積越來越小,而功能卻越來越強大。MP4播放器的發(fā)展也是在這種大趨勢下,從最初只能播放特定格式視頻,到現在可以播放各種格式視頻文件,功能更加強大。
目前基于ARM核的嵌入式微處理器芯片以其高性價比、低功耗、接口豐富等特性越來越受到手機、MP4、GPS等各種便攜式設備研發(fā)人員的青睞。本文正是在這種背景下,采用嵌入式微處理器ARM9進行MP4的設計。
本文分析了MP4的硬件設計方案,主要工作是進行芯片的選擇和電路設計,其中主控芯片選用三星公司的ARM9系列嵌入式微處理器芯片S3C2440*;外存選擇了K9F1208UOC,大小為64MB的NAND Flash;同時為了MP4能流暢的播放,內存選擇了兩片HY57V561620,大小合計為64MB的SDRAM;還擴展了SD接口,可進行存儲擴展。
軟件方面是以Linu*系統(tǒng)為平臺,利用Linu*下GUI開發(fā)庫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 底層系統(tǒng)整體設計方案 7
第二章 MP4啟動程序實現 8
2.1 Boot Loader簡介 8
2.2 mboot的實現 9
2.2.1 logo和進度條的實現 10
2.2.2 US
……(新文秘網http://m.120pk.cn省略3574字,正式會員可完整閱讀)…… 














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

作為MP4啟動程序的一部分,MP4 logo和進度條使系統(tǒng)啟動不再是無謂的等待,而是把系統(tǒng)啟動過程變得可視化。它們的實現必須依靠LCD的支持。
LCD作為MP4最重要的組成部分之一,主要采用STN,TFT和OLED三種材質。本設計將采用本開放板配置的3.5英寸的TFT LCD做MP4的顯示部件。對于TFT LCD,它是有源矩陣類型液晶顯示器(AM-LCD)中的一種,TFT在液晶的背部設置特殊光管,可以“主動的”對屏幕上的各個獨立的象素進行控制,這也就是所謂的主動矩陣TFT的來歷,這樣可以大大的提高反應時間,一般TFT的反映時間約80毫秒。而且由于TFT是主動式矩陣LCD可讓液晶的排列方式具有記憶性,不會在電流消失后馬上恢復原狀。TFT還改善了STN會閃爍(水波紋)的現象,有效的提高了播放動態(tài)畫面的能力。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顯示幀緩存區(qū),LCD中的320*240個像素點就是分別對于lcdbuf數組中的點,畫點函數的實現實際上就是對該點所對應的lcdbuf進行賦值。類似的,畫圖函數就是對一個區(qū)域內的點所對應的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);
}
}

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

2.2.2 USB下載功能的實現
USB下載功能是mboot重要的一部分,它關系到對MP4內核,文件系統(tǒng)的實時更新,同時能方便用戶DIY自己的啟動logo.所以我們有必要對它的具體實現進行具體的分析。
在s3c2440中,通用串行總線(USB)設備控制器被設計為提供了高性能全速功能的帶DMA 接口控制器解決方案。USB 設備控制器允許DMA 的批量傳輸、中斷傳輸和控制傳輸。
同時USB 設備控制器具有如下特性:
– 兼容USB 規(guī)格1.1 版本的全速USB 設備控制器。
– 批量傳輸的DMA 接口
– 帶FIFO 的5 個端點
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設備控制器相比以前的s3c2410具有更強大的功能,其端點的FIFI達到128K,同時其對DMA傳輸的支持使傳輸速度變的更快。
為了充分利用這些特性,我們的USB設備驅動必須完成一些功能:













下面我們將根據上圖對USB設備端驅動進行具體的實現:
 USB設備控制器初始化的實現是由usblib.c中的void ConfigUsbd(void)
函數來實現的。為了提高USB設備的傳輸速度,一般是把端點的總FIFO分為
A和B兩塊,只需一塊填滿就可產生中斷,使得設備端主機S3C2440不用等到2塊同時填滿就能接受數據,大大提高了連續(xù)數據包得傳輸速度。
EPO作為控制端點,其總FIFO為16字節(jié),根據上面的原則,其最大傳輸包為8字節(jié)。同時應清空其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é)。同時我們應清空它們的緩沖以及設置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控制器發(fā)出中斷時,能被主機知道并對其處理。
下面為其代碼:
rEP_INT_EN_REG=EP0_INT|EP1_INT|EP3_INT;
rUSB_INT_EN_REG=RESET_INT;
intmsk&=~(BIT_USBD);
USB設備控制器的初始化為后續(xù)的USB設備與主機端進行通信做好了準備,但這還遠遠不夠,我們還必須完成USB設備端總中斷控制函數。只有只有我們能對PC通過USB線發(fā)給S3C2440的信息進行處理和反饋。

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

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