S3C2410和Linux的電影列表系統(tǒng)設(shè)計(jì)
摘要:隨著數(shù)字信息技術(shù)和網(wǎng)絡(luò)技術(shù)的高速發(fā)展,建立在其基礎(chǔ)上的嵌入式系統(tǒng)也已經(jīng)廣泛應(yīng)用于人們生活、工作的各個領(lǐng)域。本文介紹了基于S3C2410和嵌入式Linux操作系統(tǒng)的電影列表系統(tǒng)設(shè)計(jì)的實(shí)現(xiàn)過程。該系統(tǒng)基于嵌入式開發(fā)平臺搭建,以Framebuffer實(shí)現(xiàn)對JPEG格式圖片、文字的各種效果顯示和外設(shè)鼠標(biāo)的控制等。
引言
隨著新媒體的進(jìn)步,網(wǎng)絡(luò)媒體產(chǎn)品的日益發(fā)展,互聯(lián)網(wǎng)將“顛覆”電視的傳統(tǒng)地位。新媒體提供了豐富的媒體形態(tài)和多樣化的收視方式,如點(diǎn)播、回看、下載等,使其有了交互功能和更長的生命周期。因此,交互式網(wǎng)絡(luò)電視(IPTV)的出現(xiàn)是必然的結(jié)果。電影列表是IPTV中數(shù)字多媒體內(nèi)容最為關(guān)鍵的節(jié)目來源,即電視節(jié)目導(dǎo)航系統(tǒng),主要用來描述提供給電視觀眾的所有節(jié)目的信息,是構(gòu)成交互電視的重要技術(shù)之一。在IPTV業(yè)務(wù)中,用戶可通過電影列表功能來了解電視電影節(jié)目的名稱、播放時間和內(nèi)容梗概等相關(guān)信息,并實(shí)現(xiàn)對節(jié)目的快速檢索和訪問,進(jìn)行頻道選擇或視頻點(diǎn)播等操作。
1 系統(tǒng)環(huán)境的選擇與配置
1.1 系統(tǒng)軟硬件平臺選擇
嵌入式系統(tǒng)是指以應(yīng)用為中心,以計(jì)算機(jī)技術(shù)為基礎(chǔ),軟硬件可裁剪,適用于應(yīng)用系統(tǒng)對功能、可靠性、成本、體積和功耗有嚴(yán)格要求的專用計(jì)算機(jī)系統(tǒng)。嵌入式系統(tǒng)由嵌入式微處理器、外圍硬件設(shè)備、嵌入式操作系統(tǒng)以及用戶應(yīng)用程序4部分組成。本系統(tǒng)選擇x86處理器和
Linux操作系統(tǒng)作為系統(tǒng)開發(fā)環(huán)境,嵌入式ARM系列微處理器和嵌入式Linux操作系統(tǒng)作為系統(tǒng)運(yùn)行平臺。
作為學(xué)校實(shí)驗(yàn)室開放基金項(xiàng)目,本系統(tǒng)選擇學(xué)院實(shí)驗(yàn)室已有的JXARM9-2410教學(xué)實(shí)驗(yàn)系統(tǒng)進(jìn)行設(shè)計(jì)與實(shí)現(xiàn)。JXARM9-2410實(shí)驗(yàn)箱采用三星公司的S3C2410微處理器,是一款為手持設(shè)備設(shè)計(jì)的低功耗、高集成度的基于ARM920T核的微處理器。它集成了外部存儲器控制器、LCD控制器、ADC和觸摸屏接口等,現(xiàn)在廣泛應(yīng)用于PDA、移動通信、路由器、工業(yè)控制等領(lǐng)域。常見的通用型嵌入式操作系統(tǒng)有Linux、VxWorks、Win dows CE等。Linux是以Unix為基礎(chǔ)發(fā)展而成的操作系統(tǒng),能夠支持ARM、MIPS、ALPHA、x86、PowerPC等多種系列的嵌入式微處理器。Linux操作系統(tǒng)最大的特性就是開源性和可裁剪性,除此之外,Linux操作系統(tǒng)還有內(nèi)核高效穩(wěn)定、良好的可移植性、支持多種文件系統(tǒng)等優(yōu)點(diǎn),有利于Linux在嵌入式設(shè)備中的應(yīng)用。
1.2 編譯器的選擇與配置
本系統(tǒng)選用C語言編寫源碼、編譯生成在ARM平臺上的程序,因此需要在Linux環(huán)境下安裝標(biāo)準(zhǔn)的C開發(fā)環(huán)境和交叉編譯器arm-linux-gcc。使用命令sudo apt-getinstall gcc g++ libgccl libg++make gdb安裝C開發(fā)環(huán)境。安裝交叉編譯器步驟如下:
①下載編譯器源文件arm-linux-gcc-3.4.1.tar.bz2,使用tar命令進(jìn)行解壓此文件。
②將解壓后形成的arm文件夾拷貝到usr/local/目錄下,現(xiàn)在交叉編譯程序集都在/usr/local/arm/3.4.1/bin目錄下。
③修改環(huán)境變量,把交叉編譯器的路徑加入到PATH中,并使用命令source/root/.bashrc使新的環(huán)境變量生效。
2 ARM9嵌入式電影列表軟件設(shè)計(jì)
在本系統(tǒng)中主要完成的任務(wù)是對所存在的電影信息的目錄進(jìn)行檢索,通過解析生成電影節(jié)目菜單,將其可用信息主要以圖片和文字的方式通過列表的形式顯示出來,給用戶一個直觀的操作界面,以獲取節(jié)目的有用信息。
2.1 Framebuffer初始化
Framebuffer(幀緩沖)是Linux內(nèi)核的一種圖形設(shè)備驅(qū)動接口,提供了LCD控制器的抽象性描述。它將LCD控制器上的顯存抽象成一種字符設(shè)備,應(yīng)用程序通過定義好的接口可以訪問LCD控制器的顯存,直接對顯示緩沖區(qū)進(jìn)行讀/寫操作。用戶只需要直接向Framebuffer顯示緩沖區(qū)寫入數(shù)據(jù)就可以更新顯示屏的輸出。Framebuffer的設(shè)備文件一般是/dev/fb0、/dev/fb1等,其使用方法如下:
2.2 圖片顯示
本系統(tǒng)使用Libjpeg庫在Linux下顯示圖片。Libjpeg是一個被廣泛使用的jpeg壓縮/解壓縮函數(shù)庫,它能夠讀寫JPEG格式的圖像文件,通常這類文件是以.jpg或者.jpeg為后綴名的。通過Libjpeg庫,應(yīng)用程序可以每次從jpeg壓縮圖像中讀取一個或多個掃描線,而諸如顏色空間轉(zhuǎn)換、降采樣/增采樣、顏色量化等由Libjpeg完成。對于Libjpeg而言,圖像數(shù)據(jù)是一個二維的像素矩陣。對于彩色圖像,每個像素通常用三個分量表示,即R、G、B三個分量,每個分量用一個字節(jié)表示,因此每個分量的取值范圍為0~255;對于灰度圖像,每個像素通常用一個分量表示,一個分量同樣由一個字節(jié)表示,取值范圍為0~255。因此,本系統(tǒng)中只要將系統(tǒng)中需要顯示的JPEG圖片進(jìn)行解碼為bmp像素點(diǎn),再通過Framebuffer設(shè)備寫入應(yīng)用程序空間就可以實(shí)現(xiàn)圖片的顯示。通過Libjpeg對JPEG圖片進(jìn)行解碼的過程如下:
調(diào)用jpeg_start_decompress()函數(shù)之后需要為解壓后的掃描線上的所有像素點(diǎn)分配存儲空間,這個空間的大小由圖像輸出的寬度、高度和每個像素的字節(jié)數(shù)決定。JPEG解壓縮對象cinfo中output_width和output_height分別表示圖像輸出的寬度和高度,output_components表示字節(jié)數(shù)。
對掃描線的讀取是按照從上到下的順序進(jìn)行的,即圖像最上方的掃描線最先被jpeg_read_scanlines()讀入存儲空間中,緊接著是第二個掃描線,最后是圖像底邊的掃描線被讀入存儲空間中。
2.3 文字顯示
在Linux下顯示文字使用FreeType庫。FreeType庫是采用面向?qū)ο蟮乃枷敫叨饶K化的程序庫,是一個開源的、高質(zhì)量可移植的字體引擎。它提供了統(tǒng)一的接口來訪問多種字體格式文件,包括TrueType、OpenType、Type1、CID、CFF、Windows FON/FNT、X11 PCF等。本系統(tǒng)采用點(diǎn)陣的方式顯示字體,即要先取得漢字的點(diǎn)陣表示形式,然后根據(jù)點(diǎn)陣中每一位是否為1來決定是否對屏幕上相應(yīng)的像素賦值。FreeType庫里保存字體屬性的結(jié)構(gòu)體FT_Bitmap,包括位圖行、列、每行所占字節(jié)數(shù)等信息。對FreeType庫的使用步驟如下:
2.4 鼠標(biāo)事件
目前最常見的鼠標(biāo)有PS/2鼠標(biāo)和USB鼠標(biāo)。但就應(yīng)用層去看這兩種鼠標(biāo)其實(shí)沒有太大的區(qū)別,PS/2鼠標(biāo)有4種工作模式:復(fù)位模式、流模式、遙控模式、檢測模式。流模式是默認(rèn)的工作模式,在流模式下鼠標(biāo)的任何動作都會報(bào)告給主機(jī)。
(1)鼠標(biāo)的解析與繪制
鼠標(biāo)的設(shè)備文件為/dev/input/mice。當(dāng)鼠標(biāo)有動作(移動、按鍵、滾軸)的時候可以通過cat/dev/input/mice命令,獲得動作數(shù)據(jù)并顯示在屏幕上。但多數(shù)是亂碼,原因是讀到的鼠標(biāo)動作數(shù)據(jù),不一定是0~127的可見字符。
實(shí)現(xiàn)鼠標(biāo)解析的主要代碼如下:
通過上述對鼠標(biāo)協(xié)議數(shù)據(jù)的解析,獲取鼠標(biāo)的按鍵事件和x、y方向的相對增量,只要聲明一組變量,用來累加dx、dy即可獲取鼠標(biāo)在屏幕的絕對坐標(biāo)。
鼠標(biāo)的繪制首先需要定義一個鼠標(biāo)的標(biāo)志。在屏幕上繪制鼠標(biāo)標(biāo)志前,先保存屏幕相應(yīng)位置(鼠標(biāo)標(biāo)志大小)的原有圖像,而后再繪制鼠標(biāo)的標(biāo)志。當(dāng)鼠標(biāo)移動到一個新位置時,在原來位置就可以根據(jù)保存的原有圖像恢復(fù),而在新的位置繼續(xù)重復(fù)保存、繪制即可。
(2)鼠標(biāo)的按鍵事件控制
以按鈕A事件為例,其主要實(shí)現(xiàn)代碼如下:
通過解析的鼠標(biāo)信息。判斷D0,即左鍵的按鍵信息,當(dāng)為1時,表明左鍵按下,這時可以通過鼠標(biāo)是否按下的狀態(tài),調(diào)用相應(yīng)的功能。
3 系統(tǒng)實(shí)現(xiàn)
本系統(tǒng)主界面包括系統(tǒng)時間的顯示、電影海報(bào)排列、電影名、翻頁和結(jié)束按鈕,如圖1所示。點(diǎn)擊翻頁按鈕,可以進(jìn)入下一頁電影節(jié)目。點(diǎn)擊電影海報(bào)圖片進(jìn)入該影片的介紹欄,顯示該電影的詳細(xì)介紹,如圖2所示。點(diǎn)擊結(jié)束按鈕,程序進(jìn)入退出界面,3 s以后程序結(jié)束。
結(jié)語
本文主要介紹了在Linux操作系統(tǒng)下采用JXARM9-2410教學(xué)實(shí)驗(yàn)箱設(shè)計(jì)實(shí)現(xiàn)的電影列表產(chǎn)品。本系統(tǒng)實(shí)現(xiàn)了圖片和文字的顯示、鼠標(biāo)按鍵事件等功能,已經(jīng)完成了電影列表的基本功能。按鈕事件的實(shí)現(xiàn)為系統(tǒng)提供了交互功能,為后面IPTV的進(jìn)一步制作奠定了基礎(chǔ)。對于本系統(tǒng)后續(xù)研究設(shè)計(jì),仍有可以進(jìn)一步擴(kuò)展和改進(jìn)的地方,例如可以在本系統(tǒng)上擴(kuò)展USB功能、網(wǎng)絡(luò)通信功能和觸摸屏功能等,以進(jìn)一步完善上層操作界面的設(shè)計(jì)。作為學(xué)校實(shí)驗(yàn)室開放基金項(xiàng)目,本系統(tǒng)的實(shí)現(xiàn)與完成也給學(xué)院提供了更多的專業(yè)教學(xué)資料,有利于激勵本專業(yè)學(xué)生的學(xué)習(xí)積極性,提高教學(xué)質(zhì)量和水平。