一種在移動終端中模擬lcd顯示的模擬器及實現(xiàn)方法
【專利摘要】本發(fā)明公開一種在移動終端中模擬LCD顯示的模擬器及實現(xiàn)方法,其中,包括模擬驅(qū)動及模擬LCD的模擬UI,所述模擬驅(qū)動用于提供給應(yīng)用程序及模擬UI接口,所述應(yīng)用程序及模擬UI通過mmap方法直接訪問設(shè)備內(nèi)存來對模擬驅(qū)動進(jìn)行讀寫,由應(yīng)用程序?qū)幼髦噶钔ㄟ^接口寫入到模擬驅(qū)動中,所述模擬UI用于通過該接口從所述模擬驅(qū)動中讀取到動作指令,并對所述動作指令進(jìn)行模擬,實現(xiàn)模擬LCD的功能。通過本發(fā)明,應(yīng)用程序就能忽略運行在模擬器與真實硬件上的差別,使應(yīng)用程序能夠獨立于硬件進(jìn)行開發(fā),而又不需要在后期修改,所以大大提高了軟件開發(fā)效率。
【專利說明】-種在移動終端中模擬LCD顯示的模擬器及實現(xiàn)方法
【技術(shù)領(lǐng)域】
[0001] 本發(fā)明涉及模擬軟件領(lǐng)域,尤其涉及一種在移動終端中模擬LCD顯示的模擬器及 實現(xiàn)方法。
【背景技術(shù)】
[0002] 在移動終端的初期開發(fā)階段,由于移動終端的硬件還沒有完全準(zhǔn)備好,軟件特別 是上層應(yīng)用程序就無法進(jìn)行開發(fā)和調(diào)試,這導(dǎo)致軟件開發(fā)效率降低,影響了整個項目的開 發(fā)進(jìn)度。
[0003] 因此,現(xiàn)有技術(shù)還有待于改進(jìn)和發(fā)展。
【發(fā)明內(nèi)容】
[0004] 鑒于上述現(xiàn)有技術(shù)的不足,本發(fā)明的目的在于提供一種在移動終端中模擬IXD顯 示的模擬器及實現(xiàn)方法,旨在解決現(xiàn)有的移動終端軟件無法在前期進(jìn)行測試導(dǎo)致開發(fā)效率 低的問題。
[0005] 本發(fā)明的技術(shù)方案如下: 一種在移動終端中模擬LCD顯示的模擬器,其中,包括模擬驅(qū)動及模擬LCD的模擬Π , 所述模擬驅(qū)動用于提供給應(yīng)用程序及模擬Π 接口,所述應(yīng)用程序及模擬Π 通過mmap方法 直接訪問設(shè)備內(nèi)存來對模擬驅(qū)動進(jìn)行讀寫,由應(yīng)用程序?qū)幼髦噶钔ㄟ^接口寫入到模擬驅(qū) 動中,所述模擬UI用于通過該接口從所述模擬驅(qū)動中讀取到動作指令,并對所述動作指令 進(jìn)行模擬,實現(xiàn)模擬LCD的功能。
[0006] 所述在移動終端中模擬硬件設(shè)備的模擬器,其中,所述模擬驅(qū)動提供的接口包括 用于打開IXD、關(guān)閉IXD、將IXD內(nèi)存空間映射到用戶態(tài)及控制IXD顯示信息的接口。
[0007] 所述在移動終端中模擬硬件設(shè)備的模擬器,其中,所述控制LCD顯示信息的接口 定義了用于表示LCD顯示信息的數(shù)據(jù)結(jié)構(gòu)。
[0008] 所述在移動終端中模擬硬件設(shè)備的模擬器,其中,所述數(shù)據(jù)結(jié)構(gòu)包括LCD的固定 信息以及可變參數(shù)信息。
[0009] 所述在移動終端中模擬硬件設(shè)備的模擬器,其中,所述固定信息包括LCD的行長、 存儲區(qū)域的大小以及IXD的framebuffer的類型。
[0010] 所述在移動終端中模擬硬件設(shè)備的模擬器,其中,所述可變參數(shù)信息包括可見區(qū) 域的長和寬、每點所占用的字節(jié)數(shù)以及三基色的屬性。
[0011] 一種如上所述模擬器的實現(xiàn)方法,其中,包括步驟: 設(shè)置一模擬器包括模擬驅(qū)動及模擬UI,所述模擬驅(qū)動提供給應(yīng)用程序及模擬Π 接口, 所述應(yīng)用程序及模擬UI通過_ap方法直接訪問設(shè)備內(nèi)存來對模擬驅(qū)動進(jìn)行讀寫,由應(yīng)用 程序?qū)幼髦噶钔ㄟ^接口寫入到模擬驅(qū)動中,所述模擬Π 用于通過該接口從所述模擬驅(qū) 動中讀取到動作指令,并對所述動作指令進(jìn)行模擬,實現(xiàn)模擬LCD的功能。
[0012] 所述的模擬器的實現(xiàn)方法,其中,實現(xiàn)_ap方法之前,模擬驅(qū)動向內(nèi)核申請一組 設(shè)備內(nèi)存,設(shè)備內(nèi)存的數(shù)組里存放每個頁面的起始地址。
[0013] 所述的模擬器的實現(xiàn)方法,其中,應(yīng)用程序在調(diào)用_ap方法時,模擬驅(qū)動為內(nèi)核 提供函數(shù)調(diào)用,用來對設(shè)備內(nèi)存進(jìn)行操作。
[0014] 所述的模擬器的實現(xiàn)方法,其中,模擬Π 通過_ap方法直接將設(shè)備內(nèi)存映射到用 戶進(jìn)程的地址空間中,并每隔預(yù)定時間將內(nèi)存數(shù)據(jù)顯示到模擬器的界面上。
[0015] 有益效果:本發(fā)明通過提供一個模擬器,來模擬IXD顯示的功能,這樣與IXD顯示 相關(guān)的軟件就能在該模擬器上進(jìn)行開發(fā)測試,而模擬器最終會由真實硬件替代,但是模擬 器提供給應(yīng)用程序的接口與在真實硬件上的是一樣的,所以應(yīng)用程序就能忽略運行在模擬 器與真實硬件上的差別,使應(yīng)用程序能夠獨立于硬件進(jìn)行開發(fā),而又不需要在后期修改,所 以大大提高了軟件開發(fā)效率。
【專利附圖】
【附圖說明】
[0016] 圖1為本發(fā)明一種在移動終端中模擬LCD顯示的模擬器較佳實施例的結(jié)構(gòu)框圖。
[0017] 圖2為本發(fā)明一種在移動終端中模擬LCD顯示的模擬器實現(xiàn)方法較佳實施例的流 程圖。
【具體實施方式】
[0018] 本發(fā)明提供一種在移動終端中模擬LCD顯示的模擬器及實現(xiàn)方法,為使本發(fā)明的 目的、技術(shù)方案及效果更加清楚、明確,以下對本發(fā)明進(jìn)一步詳細(xì)說明。應(yīng)當(dāng)理解,此處所描 述的具體實施例僅僅用以解釋本發(fā)明,并不用于限定本發(fā)明。
[0019] 請參閱圖1,圖1為本發(fā)明一種在移動終端中模擬LCD顯示的模擬器較佳實施例的 結(jié)構(gòu)框圖,如圖所示,該模擬器100包括模擬驅(qū)動120及模擬LCD的模擬Π 110,所述模擬 驅(qū)動120用于提供給應(yīng)用程序200及模擬Π 110接口,所述應(yīng)用程序200及模擬Π 110 通過_ap方法直接訪問設(shè)備內(nèi)存來對模擬驅(qū)動120進(jìn)行讀寫,由應(yīng)用程序200將動作指令 通過接口寫入到模擬驅(qū)動中,所述模擬Π 110用于通過該接口從所述模擬驅(qū)動120中讀取 到動作指令,并對所述動作指令進(jìn)行模擬,實現(xiàn)模擬LCD的功能。
[0020] 在本發(fā)明實施例中,模擬驅(qū)動120與實際驅(qū)動的區(qū)別就是模擬驅(qū)動120不需要直 接控制實際的硬件,只需讓模擬Π 110定時來取IXD顯示內(nèi)容數(shù)據(jù)就可以顯示出來。
[0021] 但模擬驅(qū)動120提供給應(yīng)用程序的接口需要與實際驅(qū)動提供的接口一致,以便應(yīng) 用程序200在后續(xù)實際硬件中能正常運行。
[0022] 該模擬驅(qū)動120是標(biāo)準(zhǔn)的Linux framebuffer (內(nèi)核當(dāng)中一種驅(qū)動程序接口)驅(qū) 動,Linux抽象出framebuffer這個設(shè)備來供用戶態(tài)進(jìn)程實現(xiàn)直接寫屏,可將framebuffer 看成是顯示內(nèi)存的一個映像,將其映射到進(jìn)程地址空間之后,就可以讀寫,而寫操作可立即 反映在屏幕上。由于LCD在更新顯示畫面的時候會涉及大塊的數(shù)據(jù),所以為了讓應(yīng)用程序 能夠快速并且簡單地訪問LCD的內(nèi)存,模擬驅(qū)動120提供了 mmap方法,mmap方法允許直接 將設(shè)備內(nèi)存映射到用戶進(jìn)程的地址空間中,提供給用戶進(jìn)程直接訪問設(shè)備內(nèi)存的能力,這 意味著,通過_ap方法,應(yīng)用程序只要在分配的地址范圍內(nèi)進(jìn)行讀寫,實際上就是對LCD設(shè) 備的訪問。
[0023] 為了實現(xiàn)_8?的方法,模擬驅(qū)動120首先根據(jù)IXD的大小和深度向內(nèi)核申請一組 Memory page (設(shè)備內(nèi)存),即數(shù)組: VideoMemPageTab [VIDEO_MEM_PAGE_NUMBER],在該設(shè)備內(nèi)存的數(shù)組里存放的是每個 page (存儲頁)的起始地址(內(nèi)核邏輯地址),相關(guān)的定義如下: #define WIDTH 480 #define HEIGHT 720 #define BPP 16 // bits per pixel #define LINE_LEN ((((WIDTH * BPP + 7)/ 8) + 31) / 32 * 32) // length of a line in bytes #define VIDEO_MEM_SIZE (HEIGHT * LINE_LEN) #define VIDEO_MEM_PAGE_NUMBER ( ((VIDEO_MEM_SIZE - 1) ? PAGE_SHIFT) + 1) static unsigned long VideoMemPageTab[VIDEO_MEM_PAGE_NUMBER]; 申請的設(shè)備內(nèi)存是在裝載模擬驅(qū)動、初始化模塊的時候申請的,模擬驅(qū)動共申請了 64 頁的空間,即VIDEO_MEM_PAGE_NUMBER的值最終為64,相關(guān)的代碼如下: int init_module(void) { for (i = 0; i < VIDEO_MEM_PAGE_NUMBER; i++) { VideoMemPageTab[i] = -get_free_page(GFP_KERNEL); } } 應(yīng)用程序調(diào)用_ap方法時,模擬驅(qū)動為內(nèi)核提供了以下vm_operations_struct結(jié)構(gòu) 中的函數(shù)調(diào)用,用來對設(shè)備內(nèi)存進(jìn)行操作,并使用nopage的方法為用戶態(tài)程序建立需要的 頁表: struct vm_operations_struct lcd_vm_ops = { open: lcd_vma_open, close: lcd_vma_close, nopage: lcd_vma_nopage, //當(dāng)用戶進(jìn)程訪問當(dāng)前不在內(nèi)存中的VMA頁 面時,調(diào)用此方法 }; 在本發(fā)明實施例中,所述模擬驅(qū)動提供的接口包括用于打開LCD、關(guān)閉LCD、將LCD內(nèi)存 空間映射到用戶態(tài)及控制LCD顯示信息的接口。
[0024] 其中打開IXD的接口,其控制方式是open〇,打開的設(shè)備名為/dev/fbO ;關(guān)閉IXD 的接口,其控制方式是close (),關(guān)閉的設(shè)備名為/dev/fbO ;將LCD內(nèi)存空間映射到用戶態(tài), 其控制方式即mmap(),映射后直接對映射后的用戶態(tài)空間進(jìn)行操作相當(dāng)于直接對內(nèi)核的 IXD framebuffer進(jìn)行操作,因此在IXD打開的狀態(tài)下,相當(dāng)于直接對IXD進(jìn)行操作; 控制IXD顯示信息的接口,其控制方式為ioctl (),其中該接口定義了用于表示IXD顯 示信息的數(shù)據(jù)結(jié)構(gòu)。其中,ioctl命令中,F(xiàn)BI0GET_FSCREENINF0表示獲取framebuffer的 固定信息,固定信息存放在struct fb_fix_screeninfo的數(shù)據(jù)結(jié)構(gòu)中,ioctl的第三個參數(shù) 是此數(shù)據(jù)結(jié)構(gòu)的指針;FBIOGET_VSCREENINFO表示獲取fi'amebuffei'的可變參數(shù)信息,可 變參數(shù)信息存放在struct fb_var_screeninfo的數(shù)據(jù)結(jié)構(gòu)中,ioctl的第3個參數(shù)是此數(shù) 據(jù)結(jié)構(gòu)的指針。
[0025] IXD的固定信息的數(shù)據(jù)結(jié)構(gòu)的具體定義如下: struct fb-fix-screeninfo { char id[16] ; /木 identification string eg 〃onetouch〃 木/ unsigned long smem-start; /* Start of frame buffer mem (physical address) -u32 smem-len; /* Length of frame buffer mem */ -u32 type; /* see FB-TYPE-* */ -u32 visual; see FB^ISUAL^ */ 一u32 line_length; /氺 length of a line in bytes 氺/ unsigned long mmio_start; /* Start of Memory Mapped I/O (physical address) -u32 mmio_len; /* Length of Memory Mapped I/O */ }; 固定信息包括:line_length為IXD的行長,即存儲一行顯示數(shù)據(jù)所需要的字節(jié)數(shù); smem_len為framebuffer存儲區(qū)域的大?。籺ype為framebuffer的類型(目前固定為 FB_TYPE_PACKED_PIXELS) ;visual 為 framebuffer 的顯示類型(目前固定為 FB_VISUAL_ TRUEC0L0R,即高彩色)。
[0026] 可變參數(shù)信息的數(shù)據(jù)結(jié)構(gòu)定義如下: struct fb_var_screeninfo { 一u32 xres; /氺 visible resolution 氺/ -u32 yres; */ _u32 bits_per_pixel; /氺 16bit 氺/ struct fb_bitfield red; /* bitfield in fb mem if true color,氺/ struct fb_bitfield green; /氺 else only length is significant 氺/ struct fb_bitfield blue; } 可變參數(shù)信息包括:xres為可見區(qū)域的長;yres為可見區(qū)域的寬;bits_per_pixel為 每點所占用的bit數(shù);red/green/blue為紅/綠/藍(lán)三基色的屬性(包括在數(shù)據(jù)中的起始 bit, bit 數(shù)等)。
[0027] 模擬Π實現(xiàn)的主要相關(guān)文件是led h和led cpp。
[0028] 模擬Π通過mmap直接將設(shè)備內(nèi)存映射到用戶進(jìn)程的地址空間中,然后設(shè)定一定 時器,每隔預(yù)定時間(例如〇. Is)將設(shè)備內(nèi)存中的數(shù)據(jù)顯示到模擬器的界面上。
[0029] 在led. h申明了以下幾個重要的成員函數(shù):刷新LCD函數(shù)、打開LCD設(shè)備函數(shù)、刷 新LCD界面函數(shù)、關(guān)閉LCD設(shè)備函數(shù),具體相關(guān)代碼如下 : class TUniLCD : public QObject { protected: virtual void timerEvent (QTimerEvent ^e) ; // 處理定時器超時,調(diào)用刷新 LCD函數(shù) private: int openFBO ; //打開IXD設(shè)備,并將設(shè)備內(nèi)存映射到用戶進(jìn)程的地址空間 void refreshLCDO ; // 刷新 LCD 界面 closeFBO ; // 關(guān)閉 LCD 設(shè)備 } 基于上述模擬器,本發(fā)明還提供一種所述模擬器的實現(xiàn)方法,如圖2所示,其包括步 驟: 5101、 設(shè)置一模擬器包括模擬驅(qū)動及模擬UI,所述模擬驅(qū)動提供給應(yīng)用程序及模擬Π 接口; 5102、 所述應(yīng)用程序及模擬Π 通過_ap方法直接訪問設(shè)備內(nèi)存來對模擬驅(qū)動進(jìn)行讀 與; 5103、 由應(yīng)用程序?qū)幼髦噶钔ㄟ^接口寫入到模擬驅(qū)動中,所述模擬Π 用于通過該接 口從所述模擬驅(qū)動中讀取到動作指令,并對所述動作指令進(jìn)行模擬,實現(xiàn)模擬LCD的功能。
[0030] 進(jìn)一步,實現(xiàn)_ap方法之前,模擬驅(qū)動向內(nèi)核申請一組設(shè)備內(nèi)存,設(shè)備內(nèi)存的數(shù) 組里存放每個頁面的起始地址。
[0031] 進(jìn)一步,應(yīng)用程序在調(diào)用mmap方法時,模擬驅(qū)動為內(nèi)核提供函數(shù)調(diào)用,用來對設(shè) 備內(nèi)存進(jìn)行操作。
[0032] 進(jìn)一步,模擬Π 通過mmap方法直接將設(shè)備內(nèi)存映射到用戶進(jìn)程的地址空間中,并 每隔預(yù)定時間將內(nèi)存數(shù)據(jù)顯示到模擬器的界面上。
[0033] 關(guān)于上述方法的具體技術(shù)細(xì)節(jié)在前面的模擬器中已有詳述,故不再贅述。
[0034] 綜上所述,本發(fā)明通過提供一個模擬器,來模擬IXD顯示的功能,這樣與IXD顯示 相關(guān)的軟件就能在該模擬器上進(jìn)行開發(fā)測試,而模擬器最終會由真實硬件替代,但是模擬 器提供給應(yīng)用程序的接口與在真實硬件上的是一樣的,所以應(yīng)用程序就能忽略運行在模擬 器與真實硬件上的差別,使應(yīng)用程序能夠獨立于硬件進(jìn)行開發(fā),而又不需要在后期修改,所 以大大提高了軟件開發(fā)效率。
[0035] 應(yīng)當(dāng)理解的是,本發(fā)明的應(yīng)用不限于上述的舉例,對本領(lǐng)域普通技術(shù)人員來說,可 以根據(jù)上述說明加以改進(jìn)或變換,所有這些改進(jìn)和變換都應(yīng)屬于本發(fā)明所附權(quán)利要求的保 護(hù)范圍。
【權(quán)利要求】
1. 一種在移動終端中模擬IXD顯示的模擬器,其特征在于,包括模擬驅(qū)動及模擬IXD的 模擬UI,所述模擬驅(qū)動用于提供給應(yīng)用程序及模擬Π 接口,所述應(yīng)用程序及模擬Π 通過 _ap方法直接訪問設(shè)備內(nèi)存來對模擬驅(qū)動進(jìn)行讀寫,由應(yīng)用程序?qū)幼髦噶钔ㄟ^接口寫入 到模擬驅(qū)動中,所述模擬UI用于通過該接口從所述模擬驅(qū)動中讀取到動作指令,并對所述 動作指令進(jìn)行模擬,實現(xiàn)模擬LCD的功能。
2. 根據(jù)權(quán)利要求1所述在移動終端中模擬硬件設(shè)備的模擬器,其特征在于,所述模擬 驅(qū)動提供的接口包括用于打開IXD、關(guān)閉IXD、將IXD內(nèi)存空間映射到用戶態(tài)及控制IXD顯 示信息的接口。
3. 根據(jù)權(quán)利要求2所述在移動終端中模擬硬件設(shè)備的模擬器,其特征在于,所述控制 IXD顯示信息的接口定義了用于表示IXD顯示信息的數(shù)據(jù)結(jié)構(gòu)。
4. 根據(jù)權(quán)利要求3所述在移動終端中模擬硬件設(shè)備的模擬器,其特征在于,所述數(shù)據(jù) 結(jié)構(gòu)包括LCD的固定信息以及可變參數(shù)信息。
5. 根據(jù)權(quán)利要求4所述在移動終端中模擬硬件設(shè)備的模擬器,其特征在于,所述固定 信息包括IXD的行長、存儲區(qū)域的大小以及IXD的framebuffer的類型。
6. 根據(jù)權(quán)利要求4所述在移動終端中模擬硬件設(shè)備的模擬器,其特征在于,所述可變 參數(shù)信息包括可見區(qū)域的長和寬、每點所占用的字節(jié)數(shù)以及三基色的屬性。
7. -種如權(quán)利要求1至6任一項所述模擬器的實現(xiàn)方法,其特征在于,包括步驟: 設(shè)置一模擬器包括模擬驅(qū)動及模擬Π ,所述模擬驅(qū)動提供給應(yīng)用程序及模擬Π 接口, 所述應(yīng)用程序及模擬UI通過_ap方法直接訪問設(shè)備內(nèi)存來對模擬驅(qū)動進(jìn)行讀寫,由應(yīng)用 程序?qū)幼髦噶钔ㄟ^接口寫入到模擬驅(qū)動中,所述模擬Π 用于通過該接口從所述模擬驅(qū) 動中讀取到動作指令,并對所述動作指令進(jìn)行模擬,實現(xiàn)模擬LCD的功能。
8. 根據(jù)權(quán)利要求7所述的模擬器的實現(xiàn)方法,其特征在于,實現(xiàn)_ap方法之前,模擬驅(qū) 動向內(nèi)核申請一組設(shè)備內(nèi)存,設(shè)備內(nèi)存的數(shù)組里存放每個頁面的起始地址。
9. 根據(jù)權(quán)利要求7所述的模擬器的實現(xiàn)方法,其特征在于,應(yīng)用程序在調(diào)用mmap方法 時,模擬驅(qū)動為內(nèi)核提供函數(shù)調(diào)用,用來對設(shè)備內(nèi)存進(jìn)行操作。
10. 根據(jù)權(quán)利要求7所述的模擬器的實現(xiàn)方法,其特征在于,模擬Π 通過_ap方法直 接將設(shè)備內(nèi)存映射到用戶進(jìn)程的地址空間中,并每隔預(yù)定時間將內(nèi)存數(shù)據(jù)顯示到模擬器的 界面上。
【文檔編號】G06F11/36GK104156310SQ201410371537
【公開日】2014年11月19日 申請日期:2014年7月31日 優(yōu)先權(quán)日:2014年7月31日
【發(fā)明者】吳奇峰 申請人:Tcl通訊(寧波)有限公司