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

正文內容

基于armlinux的lcd驅動設計畢業(yè)設計說明書-資料下載頁

2025-06-23 05:39本頁面
  

【正文】 :5:5:1,另一種是5:6:5。后一種模式最為常用,它的含義是表示64K種色彩的16bit RGB資料中,紅色(R)占了5bit,綠色(G)占了6bit,蘭色(B)占了5bitINVVCLK , INVLINE , INVFRAME , INVVD :通過前面的時序圖,我們知道,CPU的LCD控制器輸出的時序默認是正脈沖,而LCD需要VSYNC(VFRAME)、VLINE(HSYNC)均為負 脈沖,因此 INVLINE 和 INVFRAME 必須設為“1 ”,即選擇反相輸出。INVVDEN , INVPWREN , INVLEND 的功能同前面的類似。PWREN 為LCD電源使能控制。在CPU LCD控制器的輸出信號中,有一個電源使能管腳LCD_PWREN,用來做為LCD屏電源的開關信號。ENLEND 對普通的TFT屏無效,可以不考慮。BSWP 和 HWSWP 為字節(jié)(Byte)或半字(HalfWord)交換使能。由于不同的GUI對FrameBuffer(顯示緩沖區(qū))的管理不同,必要時需要通過調整 BSWP 和 HWSWP 來適應GUI。 REGBANK 是LCD控制器的寄存器組,用來對LCD控制器的各項參數進行設置。而 LCDCDMA 則是LCD控制器專用的DMA信道,負責將視頻資料從系統總線(System Bus)上取來,通過 VIDPRCS 從VD[23:0]發(fā)送給LCD屏。同時 TIMEGEN 和 LPC3600 負責產生 LCD屏所需要的控制時序,例如VSYNC、HSYNC、VCLK、VDEN,然后從 VIDEO MUX 送給LCD屏。 LCD驅動內核層次分析要進行LCD驅動的實現,首先要對LCD在內核中的層次結構了解清楚。在內核中LCD的現實操作是通過往FrameBuffer中寫數據來現實的,該FrameBuffer在LCD的驅動實現中起著中間層的作用,即存在于LCD設備和LCD應用程序之間。 FrameBuffer的介紹Linux 是工作在保護模式下,所以用戶態(tài)進程是無法像DOS那樣使用顯卡BIOS里提供的中斷調用來實現直接寫屏,Lin仿顯卡的功能,將顯ux抽象出 FrameBuffer這個設備來供用戶態(tài)進程實現直接寫屏。Framebuffer機制??ㄓ布Y構抽象掉,可以通過Framebuffer的讀寫直接對顯存進行操作。用戶可以將Framebuffer看成是顯示內存的一個映像,將其映射到進程地址空間之后,就可以直接進行讀寫操作,而寫操作可以立即反應在屏幕上。這種操作是抽象的,統一的。用戶不必關心物理顯存的位置、換頁機制等等具體細節(jié)。這些都是由Framebuffer設備驅動來完成的。在 Linux系統下。Linux為了開發(fā)FrameBuffer程序的方便,使用了分層結構。 處于Framebuffer設備驅動技術的中心位置。它為上層應用程序提供系統調用,也為下一層的特定硬件驅動提供接口;那些底層硬件驅動需要用到這兒的接口來向系統內核注冊它們自己。 FrameBuffer主要結構圖 為所有支持FrameBuffer的設備驅動提供了通用的接口,避免重復工作。 FrameBuffer的數據結構在FrameBuffer中,fb_info可以說是最重要的一個結構體,它是Linux為幀緩沖設備定義的驅動層接口。它不僅包含了底層函數,而且還有記錄設備狀態(tài)的數據。每個幀緩沖設備都與一個fb_info結構相對應。fb_info的主要成員如下struct fb_info {int node。struct fb_var_screeninfo var。 /* Current var */struct fb_fix_screeninfo fix。 /* Current fix */struct fb_videomode *mode。 /* current mode */struct fb_ops *fbops。struct device *device。 /* This is the parent */struct device *dev。 /* This is this fb device */char __iomem *screen_base。 /* Virtual address */unsigned long screen_size。 /* Amount of ioremapped VRAM or 0 */ …………}。其 中node成員域標示了特定的FrameBuffer,實際上也就是一個FrameBuffer設備的次設備號。fb_var_screeninfo結構 體成員記錄用戶可修改的顯示控制器參數,包括屏幕分辨率和每個像素點的比特數。fb_var_screeninfo中的xres定義屏幕一行有多少個點, yres定義屏幕一列有多少個點, bits_per_pixel定義每個點用多少個字節(jié)表示。其他域見以下代碼注釋。struct fb_var_screeninfo {__u32 xres。 /* visible resolution */__u32 yres。__u32 xoffset。 /* offset from virtual to visible */__u32 yoffset。 /* resolution */__u32 bits_per_pixel。 /* bits/pixel */__u32 pixclock。 /* pixel clock in ps (pico seconds) */__u32 left_margin。 /* time from sync to picture */__u32 right_margin。 /* time from picture to sync */__u32 hsync_len。 /* length of horizontal sync */__u32 vsync_len。 /* length of vertical sync */…………}。在fb_info結構體中,fb_fix_screeninfo中記錄用戶不能修改的顯示控制器的參數,如屏幕緩沖區(qū)的物理地址,長度。當對幀緩沖設備進行映射操作的時候,就是從fb_fix_screeninfo中取得緩沖區(qū)物理地址的。struct fb_fix_screeninfo {char id[16]。 /* identification string eg TT Builtin */unsigned long smem_start。 /* Start of frame buffer mem (physical address) */__u32 smem_len。 /* Length of frame buffer mem */unsigned long mmio_start。 /* Start of Mem Mapped I/O(physical address) */__u32 mmio_len。 /* Length of Memory Mapped I/O */…………}。fb_info 還有一個很重要的域就是fb_ops。它是提供給底層設備驅動的一個接口。通常我們編寫字符驅動的時候,要填寫一個file_operations結構 體,并使用register_chrdev()注冊之,以告訴Linux如何操控驅動。當我們編寫一個FrameBuffer的時候,就要依照Linux FrameBuffer編程的套路,填寫fb_ops結構體。這個fb_ops也就相當于通常的file_operations結構體。struct fb_ops {int (*fb_open)(struct fb_info *info, int user)。int (*fb_release)(struct fb_info *info, int user)。ssize_t (*fb_read)(struct file *file, char __user *buf, size_t count, loff_t *ppos)。ssize_t (*fb_write)(struct file *file, const char __user *buf, size_t count,loff_t *ppos)。int (*fb_set_par)(struct fb_info *info)。int (*fb_setcolreg)(unsigned regno, unsigned red, unsigned green,unsigned blue, unsigned transp, struct fb_info *info)。int (*fb_setcmap)(struct fb_cmap *cmap, struct fb_info *info)int (*fb_mmap)(struct fb_info *info, struct vm_area_struct *vma)?!瓆上面的結構體,根據函數的名字就可以看出它的作用,這里不在一一說明。下圖給出了Linux FrameBuffer的總體結構,作為這一部分的總結。Linux FrameBuffer的總體結構圖 FrameBuffer對驅動的統一管理 實現了Linux FrameBuffer的中間層,任何一個FrameBuffer驅動,在系統初始化時,即需要調用 register_framebuffer()函數,在這個過程中,設備驅動的信息將會存放入名稱為registered_fb數組中,這個數組定義為struct fb_info *registered_fb[FB_MAX]。int num_registered_fb。它是類型為fb_info的數組,另外num_register_fb則存放了注冊過的設備數量。我們分析一下register_framebuffer的代碼。int register_framebuffer(struct fb_info *fb_info){int i。struct fb_event event。struct fb_videomode mode。 if (num_registered_fb == FB_MAX) return ENXIO。 /* 超過最大數量 */num_registered_fb++。for (i = 0 。 i FB_MAX。 i++)if (!registered_fb[i]) break。 /* 找到空余的數組空間 */fb_infonode = i。fb_infodev = device_create(fb_class, fb_infodevice,MKDEV(FB_MAJOR, i), fb%d, i)。 /* 為設備建立設備節(jié)點 */if (IS_ERR(fb_infodev)) {…………} else{fb_init_device(fb_info)。 /* 初始化改設備 */}…………return 0。}從上面的代碼可知,當FrameBuffer驅動進行注冊的時候,它將驅動的fb_info結構體記錄到全局數組registered_fb中,并動態(tài)建立 設備節(jié)點,進行設備的初始化。注意,這里建立的設備節(jié)點的次設備號就是該驅動信息在registered_fb存放的位置,即數組下標i 。在完成注冊之后。 實現消息分派。當用戶嘗試使用一個特定的FrameBuffer時,?我們知道,Linux是通過主設備號和次設備號,對設備進行唯一標識。,程序分配給它們的主設備號是一樣的,而次設備號是不一樣的。于是我們就可以通過用戶指明的次設備號,來覺得具體該調用哪一個FrameBuffer驅動。下面通過分析 ()函數來說明。(注:一般我們寫FrameBuffer驅動不需要實現open函數,這里只是說明函數流程。)static int fb_open(struct inode *inode, struct file *file){int fbidx = iminor(inode)。struct fb_info *info。int res。/* 得到真正驅動的函數指針 */if (!(info = registered_fb[fbidx])) return ENODEV。 if (infofbopsfb_open) {res = infofbopsfb_open(info,1)。 //調用驅動的open()if (res) module_put(infofbopsowner)。}return res。}當 用戶打開一個FrameBuffer設備的時,將調用這里的fb_open()函數。傳進來的inode就是欲打開設備的設備號,包括主設備和次設備號。 fb_open函數首先通過iminor()函數取得次設備號,然后查全局數組registered_fb得到設備的fb_info信息,而這里面存放了 設備的操作函數集fb_ops。這樣,我們就可以調用具體驅動的fb_open() 函數,實現open的操作。下面給出了一個LCD驅動的open() 函數的調用流程圖,用以說明上面的步驟。open() 函數的調用流程圖 LCD驅動實現代碼分析分三步進行LCD驅動的實現,在內核中只要設置好結構體fb_info的LCD相關信息,然后提交到內核即可。所以第一步就是設置fb_info結構體;第二步設置于LCD相關的硬件信息,即設置LCD的輸出引腳和相關的寄存器;第三步,注冊fb_info結構體進行提交到內核。這樣在Linux下對LCD驅動的實現就完成了,下面是這三個步驟的實現詳
點擊復制文檔內容
電大資料相關推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1