freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

基于嵌入式linux電表采集終端顯示模塊設計論文(編輯修改稿)

2024-12-16 02:39 本頁面
 

【文章內(nèi)容簡介】 沖區(qū),通過參數(shù)k可以設置。ASCII mode(XLATE)模式:識別各種鍵盤碼的組合,轉(zhuǎn)換為TTY終端代碼放入緩沖區(qū),通過參數(shù)a可以設置。UTF8 mode(Unicode)模式:Unicode模式基本上與XLATE相同,只不過可以通過數(shù)字小鍵盤間接輸入Unicode代碼,通過參數(shù)u可以設置。4.電表終端顯示模塊的設計與實現(xiàn)自20世紀80年代以來,隨著液晶屏幕成本的降低,各種嵌入式圖形消費產(chǎn)品和工業(yè)設備逐步獲得了廣泛的應用,從面向?qū)I(yè)人員的高端產(chǎn)品逐步轉(zhuǎn)變成為面向普通消費者和普通技術人員的低端產(chǎn)品。作為人機交互的紐帶,圖形用戶界面(GUI)的重要性越來越凸現(xiàn)出來??紤]到實際應用的專用性以及消費類產(chǎn)品對成本的敏感性,由桌面PC操作系統(tǒng)演變來的Windows CE /QT Embedded等嵌入式操作系統(tǒng)所提供的GU I所要求的資源普遍較高。Mini GU I等GU I系統(tǒng)雖然專為嵌入式系統(tǒng)設計,但開發(fā)使用需要考慮較多瑣碎的細節(jié)。因此本文從實際應用出發(fā),在上文完成的framebuffer驅(qū)動和小鍵盤驅(qū)動基礎上,開發(fā)了一套適合電表采集終端顯示信息的圖形界面。framebuffer小鍵盤framebuffer,小鍵盤設備驅(qū)動通用APIopenreadwriteclose圖形界面 電表終端圖形界面系統(tǒng)結(jié)構(gòu) framebuffer驅(qū)動實現(xiàn)幀緩沖設備對應的設備文件是/dev/fb*。如果系統(tǒng)有多個顯卡,Linux還支持多個幀緩沖設備,最多可達32個,即/dev/fb0~/dev/fb31。而/dev/fb則為當前缺省的幀緩沖設備,通常指向/dev/fb0。當然在嵌入式系統(tǒng)中支持一個顯示設備就夠了。幀緩沖設備為標準字符設備,主設備號為29,次設備號則從0到31。分別對應/dev/fb0~/dev/fb31。幀緩沖設備采用“文件層驅(qū)動層”的接口方式。在文件層為之定義了以下數(shù)據(jù)結(jié)構(gòu)。Static struct file_operations fb_fops={ower: THIS_MODULE,read: fb_read, /*讀操作*/write: fb_write, /*寫操作*/ioct1: fb_ioct1, /*I/O操作*/mmap: fb_mmap, /*映射操作*/open: fb_open, /*打開操作*/release: fb_release, /*關閉操作*/}其成員函數(shù)都在linux/driver/video/,其中的函數(shù)對具體的硬件進行操作,對寄存器進行設置,對顯示緩沖進行映射。主要結(jié)構(gòu)體還有以下幾個。struct fb_fix_screeninfo:記錄了幀緩沖設備和指定顯示模式的不可修改信息。它包含了屏幕緩沖區(qū)的物理地址和長度。 struct fb_var_screeninfo:記錄了幀緩沖設備和指定顯示模式的可修改信息。它包括顯示屏幕的分辨率、每個像素的比特數(shù)和一些時序變量。其中變量xres定義了屏幕一行所占的像素數(shù),yres定義了屏幕一列所占的像素數(shù),bits_per_pixel定義了每個像素用多少個位來表示。 struct fb_info:Linux為幀緩沖設備定義的驅(qū)動層接口。它不僅包含了底層函數(shù),而且還有記錄設備狀態(tài)的數(shù)據(jù)。每個幀緩沖設備都與一個fb_info結(jié)構(gòu)相對應。其中成員變量modename為設備名稱,fontname為顯示字體,fbops為指向底層操作的函數(shù)的指針。 LCD驅(qū)動開發(fā)的主要工作包括如下三個步驟:初始化函數(shù)首先初始化LCD控制器,通過寫寄存器設置顯示模式和顏色數(shù),然后分配LCD顯示緩沖區(qū)。在Linux中可以用kmalloc()函數(shù)分配一段連續(xù)的空間。緩沖區(qū)大小為:點陣行數(shù)點陣列數(shù)用于表示一個像素的比特數(shù)/8。緩沖區(qū)通常分配在大容量的片外SDRAM中,起始地址保存在LCD控制寄存器中。本文采用的LCD顯示方式為240320,16位彩色,則需要分配的顯示緩沖區(qū)為2403202=150kb。最后是初始化一個fb_info結(jié)構(gòu),填充其中的成員變量,并調(diào)用register_framebuffer(amp。fb_info),將fb_info登記入內(nèi)核。編寫結(jié)構(gòu)fb_info中函數(shù)指針fb_ops對應的成員函數(shù),對于嵌入式系統(tǒng)的簡單實現(xiàn),只需要下列三個函數(shù)就可以了。struct fb_ops{…… int (*fb_get_fix)(struct fb_fix_screeninfo *fix, int con, struct fb_info *info)。int (*fb_get_var)(struct fb_var_screeninfo *var, int con, struct fb_info *info)。int (*fb_set_var)(struct fb_var_screeninfo *var, int con, struct fb_info *info)。……}struct fb_ops在include/linux/。這些函數(shù)都是用來設置/獲取fb_info結(jié)構(gòu)中的成員變量的。當應用程序?qū)υO備文件進行ioctl操作時候會調(diào)用它們。對于fb_get_fix(),應用程序傳入的是fb_fix_screeninfo結(jié)構(gòu),在函數(shù)中對其成員變量賦值,主要是smem_start(緩沖區(qū)起始地址)和smem_len(緩沖區(qū)長度),最終返回給應用程序。而fb_set_var()函數(shù)的傳入?yún)?shù)是fb_var_screeninfo,函數(shù)中需要對xres、yres和bits_per_pixel賦值。 實現(xiàn)顯示設備的主要操作。讀/寫(read/write)/dev/fb:相當于讀/寫屏幕緩沖區(qū)。 映射(map)操作:由于Linux工作在內(nèi)核保護模式,每個應用程序都有自己的虛擬地址空間,在應用程序中是不能直接訪問物理緩沖區(qū)地址的。為此,Linux在文件操作 file_operations結(jié)構(gòu)中提供了mmap函數(shù),可將文件的內(nèi)容映射到用戶空間。對于幀緩沖設備,則可通過映射操作,可將屏幕緩沖區(qū)的物理地址映射到用戶空間的一段虛擬地址中,之后用戶就可以通過讀寫這段虛擬地址訪問屏幕緩沖區(qū),在屏幕上繪圖了。 I/O控制:對于幀緩沖設備,對設備文件的ioctl操作可讀取/設置顯示設備及屏幕的參數(shù),如分辨率、顯示顏色數(shù)和屏幕大小等。ioctl的操作是由底層的驅(qū)動程序來完成的。在應用程序中,操作/dev/fb的一般步驟如下:打開/dev/fb設備文件;用ioctrl操作取得當前顯示屏幕的參數(shù),如屏幕分辨率和每個像素的比特數(shù),根據(jù)屏幕參數(shù)可計算屏幕緩沖區(qū)的大?。粚⑵聊痪彌_區(qū)映射到用戶空間;映射后即可直接讀寫屏幕緩沖區(qū),進行繪圖和圖片顯示了。 加載LCD驅(qū)動編寫模塊化驅(qū)動程序,有以下幾個關鍵的函數(shù)。 s3c2410fb_init(void)//當模塊被載入時執(zhí)行 s3c2410fb_exit(void)//當模塊被移出內(nèi)核空間時被執(zhí)行 s3c2410fb_ioctl(struct*inode, struct*file, unsigned int cmd, unsigned longarg) //其他功能 每當裝配設備驅(qū)動程序時,系統(tǒng)自動調(diào)用初始化模塊s3c2410fb_init(void)。另一個必須提供的函數(shù)是s3c2410fb_exit(void),它在模塊被卸載時調(diào)用,負責進行設備驅(qū)動程序的工作。執(zhí)行insmod ,執(zhí)行rmmod s3c2410fb命令即可從內(nèi)核中刪除LCD驅(qū)動。 小鍵盤驅(qū)動實現(xiàn) 初始化s3c2410_keypad_init()函數(shù)是鍵盤代碼執(zhí)行的入口點。s3c2410_keypad_init ()在對鍵盤的工作模式及其他參數(shù)進行配置后,調(diào)用HW_keypad_init()。對于上層來說,s3c2410_keypad_init()是一個統(tǒng)一的接口,對于不同體系結(jié)構(gòu)或同體系下的不同開發(fā)板,它們的HW_keypad_init()的實現(xiàn)代碼是不同的,它就是進行鍵盤的硬件初始化功能。然后將keyboard tasklet加入到tasklet鏈表中。至此鍵盤驅(qū)動的初始化工作已經(jīng)完成。 響應按鍵 如何處理鍵盤事件是鍵盤驅(qū)動中最為重要的一部分。當有按鍵事件產(chǎn)生時,則用鍵盤中斷處理函數(shù),也就是IRQ_keypad_interrupt(),它會調(diào)用到HR_del_pre_scancode()并調(diào)用handle_scancode()函數(shù)。handle_scancode()這個函數(shù)完成按鍵處理的過程,它的功能是與TY設備通訊,keymap表裝入,按鍵處理。handle_scancode()處理的結(jié)果就是把按鍵發(fā)給相應的處理函數(shù),這些函數(shù)基本上都會調(diào)用put_queue()函數(shù)。這個函數(shù)就是將處理函數(shù)的結(jié)果發(fā)送到TY或者console進行顯示。 轉(zhuǎn)化按鍵掃描碼 在完成鍵盤的初始化之后,就需要完成對鍵盤掃描碼的轉(zhuǎn)化。這里調(diào)用函數(shù)pckdb_translate,實現(xiàn)了scancode和keycode之間的轉(zhuǎn)換。 通用按鍵處理在完成鍵盤掃描碼轉(zhuǎn)換之后就可以進行按鍵處理。 圖形引擎的設計 全局變量的定義static unsigned char* _lGUI_pFrameBuffer。static struct fb_fix_screeninfo _lGUI_fInfo。static struct fb_var_screeninfo _lGUI_vInfo。static int _lGUI_iFrameWidth。static int _lGUI_iFrameHeight。其中_lGUI_pFrameBuffer是用來將framebuffer映射到用戶空間,_lGUI_fInfo,_lGUI_vInfo分別用來存儲framebuffer的不可變信息和可變信息。 圖形引擎初始化_lGUI_iFrameBuffer = open (/dev/fb0, O_RDWR)。ioctl (_lGUI_iFrameBuffer, FBIOGET_VSCREENINFO, amp。_lGUI_vInfo)。_lGUI_iFrameHeight=。_lGUI_iFrameWidth=。_lGUI_pFrameBuffer =mmap (NULL, _lGUI_iBufferSize, PROT_READ | PROT_WRITE, MAP_SHARED, _lGUI_iFrameBuffer, 0)。打開fb0,并將framebuffer映射到用戶空間字符數(shù)組,首地址存放在_lGUI_pFrameBuffer中。使用mmap函數(shù)使用戶空間的一段內(nèi)存關聯(lián)到設備內(nèi)存(framebuffer)上。無論何時,只要程序在分配的地址范圍內(nèi)進行讀取或者寫入,實際上就是對設備的訪問,使用 mmap 可以既快速又簡單地訪問顯示卡的內(nèi)存。對于象這樣的性能要求比較嚴格的應用來說,直接訪問能給我們提供很大不同。 基本圖元設計1. 點的繪制void inline lGUI_SetPixel_Direct( int x, int y, COLORREF color){ unsigned char* pDest。 pDest = _lGUI_pFrameBuffer + _lGUI_iLineSize * y + (x * _lGUI_iBytesPerPixel)。 if(_lGUI_iBytesPerPixel == 3){ *pDest = B(color)。 *(pDest+1) = G(color)。 *(pDest+2) = R(color)。 } else *((PCOLORREF)pDest)=color。}首先計算將要畫點的地址。點x、y表示點位于LCD顯示屏上的第x行,第y列,由此計算映射到用戶空間的字符數(shù)組的偏移量,加上字符數(shù)組首地址既是要畫點的地址pDest。然后根據(jù)定義的顏色結(jié)構(gòu),將pDest強制類型轉(zhuǎn)換為定義的顏色類型指針,最后在pDest指向的地址里賦值。這樣避免了因顏色定義的不同而修改程序,提高了程序的移植性。2. 直線的繪制直線由點構(gòu)成,更精確的說,直線是由靠近這條線的像素構(gòu)成。這就引出一個問題,究近哪些點算是靠近一條直線;哪些點不算是靠近一條直線,這必須使用一種算法作為依據(jù)。本文使用簡單的直線方程算法。我們使用公式y(tǒng) = kx + b來作為繪圖的依據(jù),那么就需要分3種情況:水平直線,斜率為0;垂直直線,斜率為無窮大(或者說k不存在);普通直線。假設我們已經(jīng)知道直線的起始坐標點(Xbegin,Ybegin)和終點(Xend,Yend),x,y,是當前的坐標點,如果我們通過增加x反算出y的方法的話,這個公式就可以很容易轉(zhuǎn)換為偽代碼。LineMode 為直線的類型:水平,垂直,普通if Xbegin == Xend then LineMode = 水平elseif Ybegin = Yend??then LineMode = 垂直else k = (Yend Ybegin) / (Xend Xbegin)switch LineModecase 水平for x = Xbegin to Xend在x,Ybegin處畫點case 垂直for y = Ybegin to Yend在Ebegin,y處畫點default:for x = Xbegin to Xend{y = kx + b在x,y處畫點}3. 其他圖元的繪
點擊復制文檔內(nèi)容
黨政相關相關推薦
文庫吧 www.dybbs8.com
備案圖片鄂ICP備17016276號-1