童 凱,張紅雨
(成都電子科技大學 電子工程學院,四川 成都 611731)
在這個數字時代,數碼相機及各種電子拍照設備走入千家萬戶,越來越多的家庭都擁有自己美好的“數字回憶”,怎樣回顧這些讓人難忘的記憶呢?傳統的方式是將相片沖洗成實物,或者將數字資源上傳到PC觀看。但是這些數字資源往往數量巨大,沖洗成實物浪費資源,且使用起來極不方便。數碼相框以其便捷,可重復使用等特點,極大的滿足了人們在這一方面應用的需求。本設計提出了一種實現數碼相框的方案,并加強了網絡功能。
目前數碼相機生產的圖片格式大多為.jpg文件,顯示這些圖片需要進行JPEG解碼處理,同時為了顯示的流暢性,對圖片處理實時性有較高的要求。結合功能需求與性價比考慮,選用低功耗、高性能的32位ARM處理器S3C2440。
基于ARM920T體系結構的S3C2440嵌入式微處理器具有如下特點:16/32bit處理字長,ARM920T內核,擁有MMU與CACHE,IIS總線控制器,LCD控制器,ADC控制器,最高工作頻率達到400MHz,運算能力為440MIPS,能夠勝任圖像的處理任務;LCD控制器、ADC控制器為使用觸摸屏設備提供了方便,簡化了外圍電路的設計[1]。所以,硬件部分采用在S3C2440基礎上構建的一個具有網絡功能的嵌入式平臺。
軟件部分選擇較新的Linux2.6.30操作系統,Linux操作系統屬于開源免費的,可大大降低產品的開發成本。Linux操作系統遵守GPL開發原則,可找到豐富的驅動程序源碼以及庫函數,該系統還支持TCP/IP協議棧,可以有效降低開發難度,縮短開發周期[2]。完全滿足Web數碼相框的設計要求。
Qt是一個使用廣泛的面向對象編程的跨平臺圖形界面開發工具,擁有豐富的類庫、清晰的開發文檔。Qt/Embedded的API和Qt的API有著類似的接口,但是有針對嵌入式開發的特點進行的改進,包括手寫識別、選擇板和虛擬鍵盤等等。本設計使用Qt的QFtp類實現FTP客戶端用于傳輸圖片,使用QPixmap和QPainter類實現圖片的顯示以及調整。
觸摸屏接口電路主要包括兩部分,一是LCD顯示電路,二是 ADC轉換電路。本設計采用 480×272的 TFT LCD,S3C2440 LCD控制器能夠為TFT屏提供必要的控制信號,比如幀同步信號VFRAME,行同步信號 VLINE,時鐘信號VCLK等。圖2是LCD控制器的框圖,其中REGBANK是LCD控制寄存器組,包括了17個LCD控制寄存器以及一款256×16的調色板內存;LCDCDMA是其專用的DMA通道,可以自發地從總線上獲取圖片的數據;VIDPRCS將LCDCDMA中傳輸過來的數據轉換成特定的格式;TIMEGEN與LPC3600,LCC3600協調產生LCD屏所需的控制時序。S3C2440與LCD的硬件連線如圖3所示。

圖1 硬件系統方案圖Fig.1 Hardware system diagram

圖4 DM9000連線示意圖Fig.4 DM9000 connection diagram

圖2 S3C2440 LCD控制器框圖Fig.2 S3C2440 LCD controller

圖3 S3C2440與LCD的硬件連線圖Fig.3 S3C2440 with LCD’s hardware diagram
S3C2440提供了觸摸屏的觸控接口,向外提供4個控制信號引腳:nYPON、YMON 、nXPON、XMON,以及兩個中斷信號:INT_ADC,表示 AD轉換完成;INT_TC,表示觸摸屏被按下或拿起。通過這兩個信號的不同組合,可以表達出不同的觸摸動作,在應用程序端可以識別并進行處理。
網絡接口設計采用目前常見的DM9000芯片。該芯片是一款高度集成的,低成本的單片快速以太網控制器,包含10M/100M物理層,16KB SDRAM以及通用的處理器接口,支持遠端喚醒。S3C2440與DM9000之間采用地址線和數據線復用的方式,使用CMD信號來分辨他們。DM9000的訪問基址為 0x20000000(BANK4的基址)。nOE、nWE 分別控制讀/寫操作使能。完成一次數據的讀寫產一個中斷信號,接到EINT7。網絡接口設計如圖4所示。
Linux的低成本、強大的定制功能(內核可裁剪,網絡功能強大)以及良好的移植性能,使得Linux在嵌入式系統方面得到廣泛應用。搭建一個嵌入式linux系統通常需要以下幾個步驟:移植Bootloader;移植內核;構建根文件系統[3]。
3.1.1 移植Bootloader
使用Bootloader是為了在系統上電時,完成部分硬件設備的初始化,準備好軟件環境,最后調用操作系統。U-BOOT是一款常用的Bootloader,可以引導多種操作系統,支持多種架構的CPU。本設計采用的U-BOOT版本為1.1.6,主要完成的工作包括:修改SMDK2410板的系統時鐘、SDRAM時鐘設置方式,使其支持S3C2440芯片;新建nand_flash.c文件,修改對nand flash命令的支持,加入型號為 K9F1208U0B的nand flash的信息,添加配置的宏定義,然后在cpu/arm920t/s3c24x0/Makefile中的COBJS添加nand_flash.o項。
3.1.2 移植內核
內核移植的工作很多,這里只提出和本設計重點相關的幾個配置,配置LCD驅動寄存器;設置Bufferframe;添加對DM9000驅動的支持;選擇支持input子系統和yaffs子文件系統等,然后對該源碼進行針對目標平臺的交叉編譯(armlinux-),生成內核鏡像文件,最后將鏡像文件燒寫到目標平臺中。
3.1.3 構建根文件系統
根文件系統存放著Linux操作系統啟動必須的文件與程序,比如提供用于界面的shell程序,應用程序使用的庫,配置文件等等。通常使用工具集來構建根文件系統[4]。使用busybox工具集創建根文件系統主要包括以下步驟:獲取源代碼;配置,busybox中包含了數百個系統命令,嵌入式系統并不會完全使用到這些命令,可以篩選命令以減少根文件系統的大小;編譯,安裝;創建必要的目錄與文件,主要是etc目錄下對系統進行整體配置的文件inittab,默認啟動腳本rcS,掛載文件系統需要的fstab文件以及dev目錄下的設備文件。隨后使用mkyaffs2工具將整個根文件系統制作成yaffs映像文件。
3.2.1 通過QFtp類實現FTP客戶端功能
QFtp類提供了實現FTP通信的底層函數:connectToHost(), login(), close(), list(), cd(), get(), put(), remove(),mkdir(), rmdir(), rename()和 rawCommand(),以異步方式工作,當某個操作不能立即執行完的時候,馬上返回繼續執行下一條指令,通過發送signals來對執行結果進行通知。使用時封裝一個自己的FtpWindow類,然后將QFtp類作為private成員,這樣就可以調用QFtp類中的底層函數來實現FTP 通信[5]。

在FtpWindow類的構造函數 FtpWindow::FtpWindow()中設置GUI,設置好的客戶端界面如下所示:

圖5 FTP客戶端界面Fig.5 FTP client interface
然后通過信號與槽機制,設置按下各個功能按鈕后進行的操作。
connect (progressDialog, SIGNAL (canceled ()), this,SLOT(cancelDownload()));//取消下載
connect(connectButton, SIGNAL(clicked()), this, SLOT(connectToFtp()));//連接 FTP 服務器
connect (cdToParentButton, SIGNAL (clicked ()), this,SLOT(cdToParent()));//返回上層目錄
connect (downloadButton, SIGNAL (clicked ()), this,SLOT(downloadFile()));//下載文件
connect (quitButton, SIGNAL (clicked ()), this, SLOT(close()));//退出
輸入ftp服務器地址,調用connectToFtp函數,創建一個新的QFtp對象ftp,使用信號與槽機制,關聯listInfo信號與addToList函數:
connect (ftp, SIGNAL (listInfo (QUrlInfo)), this, SLOT(addToList(QUrlInfo)));
將輸入的服務器地址作為參數傳遞給QUrl對象,QUrl類含有對url地址進行解析的函數。它默認的ftp有效地址結構如下所示。

圖6 Ftp有效地址結構Fig.6 Ftp valid address structure
將解析出的參數傳遞給QFtp::connetToHost函數,連接主機。如果url中指定用戶名與密碼,使用QFtp::login(url.user(),url.password())進行登錄。登錄后,QFtp::list()將查詢服務器上的目錄,發出listInfo(const QUrlInfo&)信號觸發addToList函數為目錄下的每個文件及目錄創建一個QTreeWidgetItem對象,利用 QUrlInfo型參數對QTreeWidgetItem對象進行設置,完成后添加至FtpWindow::QTreeWidget對象filelist。在GUI界面就可以看到這些目錄項了。
當一個目錄項被雙擊時,將調用FtpWindow::processItem(),查詢isDirectory里關于該項的記錄,如果是目錄,就改變當前路徑,進入到新目錄,更新filelist。下載文件時,downloadFile()函數使用 QFtp::get()函數下載文件。FtpWindow::QTreeWidget對象獲取選定文件的文件名,在客戶端建立一個QFile對象使用該文件名作為參數,在本地目錄建立文件。
3.2.2 圖片顯示
Qt畫圖機制為屏幕顯示提供了統一的API接口,主要分為 3類:QPainter類,QPaintDevice類和 QPaintEngine類。QPainter類提供了畫圖操作的各種接口;QPaintDevie類提供了用于畫圖的空間,是所有可以用QPainter類進行繪圖的類的基類;QPaintEngine類類則是內部使用的抽象接口,是前面兩種類的橋梁[6]。
常用的畫圖容器有QPixmap,QImage。QPixmap是針對熒幕顯示圖像而設計并最佳化,依賴于所在平臺的原生繪圖引擎,所以一些效果的展現(比如反鋸齒),在不同的平臺上可能會有不一致的結果,并且無法提供個別像素的存取。QImage使用Qt自身的繪圖引擎,可在不同平臺上顯示相同的圖像效果,并可透過 setPixpel()、pixel()等方法,直接存取指定的像素。本設計采用的是QPixmap。
圖片顯示主要實現的功能包括:圖片顯示,縮放,翻轉。在圖片顯示主界面設置toolbar,設置相應功能的圖標,當我們按下這些圖標的時候,就可以通過信號與槽機制,調用到相應的功能函數,實現圖片的切換,縮放,翻轉功能。
顯示圖片:編譯Qt/Embedded時,在configure中指定我們需要顯示jpg,jpeg格式,就由Qt自身實現圖片的編解碼,而不需要借助第三方的軟件。調用QPainter::drawPixmap(int x,int y, int width, int height, const QPixmap&pixmap) 繪制需要的圖片,繪制時參數有多種。上述的參數表使用x,y指定顯示位置,width、height限定顯示的大小。可通過(QPixmap::load())::size()獲取加載圖片的尺寸可以進行優化設置。pixmap是繪圖容器,pixmap.load()從本地文件夾里加載需要顯示的圖片。
縮放:在播放圖片的時候,會因為比例和分辨率的問題而導致圖片不能全屏顯示,為了更好的展示圖片的細節,設計了圖片縮放功能。本設計指定,每按一次放大/縮小按鈕,邊框變化10%。以放大為例:


圖7 pixmap縮放模式Fig.7 Pixmap scale mode
Qt::IgnoreAspectRatio:忽略長寬比,按指定的大小縮放;
Qt::KeepAspectRatio:保持長寬比,并讓圖片在指定外框內盡量縮放;
Qt::KeepAspectRatioByExpanding:保持長寬比,以邊框的最小長度作為寬度進行縮放。
圖片的翻轉通過改變QPainter的作圖坐標系實現,常規情況下,QPainter作圖參照的坐標系是顯示器上的像素點。通過 QPainter::rotate(qreal angle)函數實現翻轉,angle 大于 0,順時鐘方向旋轉;小于0,逆時針方向旋轉。
本設計方案是基于Qt/Embedded的一種網絡數碼相框實現,使用QT類實現了數碼相框顯示圖片的功能,另外,本設計可通過FTP客戶端從服務器端實時更新資源,解決了嵌入式產品內存小帶來的不便。使用Qt/Embedded做開發,擁有大量的可用庫和清晰的指導文檔,便于實現功能的擴展。
[1]Samsung.S3C2440A 32-Bit CMOS Microcontroller User’s Manual[C]//Revision 1 Publication Number:21-S3-C2440A-072004,2004.
[2]徐英慧,馬忠梅,王磊,等.ARM9嵌入式系統設計---基于S3C2410與Linux[M].北京:北京航空航天大學出版社,2007.
[3]天嵌科技.基于天嵌科技的SKY2440/TQ2440的Linux系統移植手冊V4.5.2010.6.5[EB/OL].http://www.armbbs.net/forum.php mod=viewthread&tid=630&extra=page%3D2.
[4]韋東山.嵌入式Linux應用開發完全手冊[M].北京:人民郵電出版社,2008.
[5]Jasmin Blanchette, Mark Summerfield.C ++ GUI Programming with Qt4[M].Pretice Hall Ptr,2007.
[6]周潔.基于Qtopia的數碼相框軟件開發 [J].華東交通大學學報,2012,29(2):88-93.
ZHOU Jie.Digital album software development based on Qtopia[J].Journal of East China Jiaotong University,2012,29(2):88-93.