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

正文內(nèi)容

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

2024-12-16 02:39 本頁(yè)面
 

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