framebuffer 子系統分析

2021-07-08 10:54:41 字數 3615 閱讀 2910

fb_info->screen_base = dma_alloc_writecombine(fbi->dev, map_size,

&map_dma, gfp_kernel);

fb_info->screen_base  是framebuffer起始虛擬位址,也就是mmap後程式寫入fb的位址,該位址會直接寫入到fb_info->fix.smem_start指向的實體地址。

在使用者空間的su***ceflinger把資料寫入screen_base時候,改資料通過dma直接對映到smem_start,lcd控制器就能讀到資料。

fb_info

->fb_fix_screeninfo->smem_start位址 是lcd直接讀的實體地址,在lcd初始化的時候會通過函式設定:

static void s3c2410fb_set_lcdaddr(struct fb_info *info)

1、頁對齊記憶體大小:dma_map_size = page_align(my_data_size + page_size);

my_data_size是你想分配的大小.

2、呼叫

a = dma_alloc_writecombine(b,c,d,gfp_kernel);

含義:

a: 記憶體的虛擬起始位址,在核心要用此位址來操作所分配的記憶體

b: struct device指標,可以平台初始化裡指定,主要是dma_mask之類,可參考framebuffer

c: 實際分配大小,傳入dma_map_size即可

d: 返回的記憶體實體地址,dma就可以用。

所以,a和d是一一對應的,只不過,a是虛擬位址,而d是實體地址。對任意乙個操作都將改變緩衝區內容。當然要注意操作環境。

參見s3c2410 lcd驅動中的函式s3c2410fb_map_video_memory():

unsigned map_size = page_align(info->fix.smem_len);

info->screen_base = dma_alloc_writecombine(fbi->dev, map_size,&map_dma, gfp_kernel);

★lcd(liquid crystal display,液晶顯示器)概述:可分為依驅動方式之靜態驅動(static)、單純矩陣驅動(****** matrix)以及主動矩陣驅動(active matrix)三種。而其中單純矩陣型又是俗稱的被動式(passive),可分為扭轉向列型(twisted nematic,簡稱tn)和超扭轉式向列型(super twisted nematic,簡稱stn)兩種;而主動矩陣型則以薄膜式電晶體型(thin film transistor,簡稱tft)為目前主流。

★s3c2410內建lcd控制器詳解:一塊lcd屏顯示影象,不但需要lcd驅動器,還需要有相應的lcd控制器。通常lcd驅動器會以cof/cog的形式與lcd玻璃基板製做在一起,而lcd控制器則有外部電路來實現。而s3c2410內部已經整合了lcd控制器,因此可以很方便地去控制各種型別的lcd屏,例如:stn和tft屏。由於tft屏將是今後應用的主流,因此重點介紹tft屏。

★lcd控制器的暫存器:lcd控制器邏輯示意圖如下所示

●regbank---lcd控制器的暫存器組,含17個暫存器及一塊256x16的調色盤記憶體,用來設定各項引數。lcd控制暫存器:lcdcon1~lcdcon5(lcdcon1用於選擇lcd型別、設定畫素時鐘、使能lcd訊號的輸出等;lcdcon2用於設定垂直方向各訊號的時間引數;lcdcon3用於設定水平方向各訊號的時間引數;lcdcon4對tft只用來設定hsync訊號的脈衝寬度;lcdcon5用於設定各個控制訊號的極性,並可從中讀到一些狀態資訊);幀記憶體位址暫存器:lcdsaddr1~lcdsaddr3(幀記憶體可以很大,而真正要顯示的區域被稱為視口(view point),這3個暫存器用於確定幀記憶體的起始位址,定位視口在幀記憶體中的位置);臨時調色盤暫存器:tpal(對輸出一幀單色影象,可以在tpal暫存器中設定這個顏色值,然後使能tpal暫存器,這種方法可以避免修改整個調色盤或幀緩衝區);其他暫存器(lcd中斷、專用stn lcd及專用sec(samsung electronics company) tft lcd)。

●lcdcdma---lcd控制器專用的dma通道。可自動從系統匯流排(system bus)上取到影象資料,使得顯示影象時不需要cpu的干涉(vidprcs將lcddma中的資料組合成特定的格式,然後從vd[23:0]傳送給lcd屏;同時timegen和lpc3600(三星tft專用)負責產生lcd屏所需要的控制時序)。lcdcdma中含有兩個fifo:fifoh容量為16個字,fifol容量為12個字,雙掃方式兩者分別對應上/下半屏資料,單掃方式只用到fifoh。fifo為空或其中資料減少到設定的閾值時lcddma自動發起dma傳輸從記憶體中獲得影象資料。

★lcd控制器可以支援單色(1bpp)、4級灰度(2bpp)、16級灰度(4bpp)、256色(8bpp)的調色盤顯示模式、64k(16bpp)和16m(24bpp)非調色盤顯示模式。影象資料的儲存格式:

●16m(24bpp)色---使用24位的資料來表示乙個畫素的顏色,每種原色使用8位。lcd控制器從記憶體中獲得某個畫素的24位顏色值後,直接通過vd[23:0]資料線傳送給lcd,為了方便dma傳輸,記憶體中使用4位元組來表示乙個畫素(其中3位元組從高到低分別表示紅、綠、藍,剩餘的1位元組無效,此位元組為最低位元組還是最高位元組是可以由bpp24bl值選擇的)。

●64k(16bpp)色---使用16位的資料來表示乙個畫素的顏色,資料格式分5:6:5(高5位表示紅色,中間6位表示綠色,最低5位表示藍色)和5:5:5:1(從高到低依次為紅:綠:藍:透明度,故又稱rgba)兩種,4個位元組可以表示2個16bpp的畫素,高2位元組還是低2位元組表示第一畫素可以通過hwswp值決定。

●256(8bpp)色---使用8位的資料來表示乙個畫素的顏色,直接用其表示對應的3原色的值時顯示能力太弱,故引進調色盤(palette,就是一塊記憶體,可以對每個索引值設定顏色,可以使用16bpp或24bpp),用這8位資料表示其在調色盤中的索引值,s3c2410/s3c2440中的調色盤是一塊256x16的記憶體,使用16bpp的格式表示256色(8bpp)顯示模式下各個索引值的顏色,這樣即使使用256色的顯示模式,最終顯示在lcd資料匯流排上的仍是16bpp的資料。乙個4位元組可以表示4個8bpp的畫素,位元組與畫素的對應順序可通過bswp值設定。

1、fb_info

[cpp]view plain

copy

struct

fb_info  ranges[0];  

} *apertures;  

};  

幀緩衝裝置中最關鍵的資料結構就是fb_info,其中記錄了裝置的全部資訊,包括裝置的設定引數、狀態以及操作函式指標,每乙個幀緩衝裝置必須對應乙個fb_info結構體。

2、fb_var_screeninfo 和 fb_fix_screeninfo

[cpp]view plain

copy

struct

fb_var_screeninfo ;  

[cpp]view plain

copy

struct

fb_fix_screeninfo ;  

framebuffer 子系統分析

come from struct fb info ranges 0 apertures struct fb var screeninfo struct fb fix screeninfo 這兩個結構體分別記錄了顯示器可以修改和不可修改的資訊,這些資料成員需要在驅動程式中初始化。其中fix.visua...

input輸入子系統分析

1.檢視input子系統支援哪些裝置 cat proc bus input devices 2.應用程式如何使用 fd mouse open dev input event0 o rdwr event1表示滑鼠事件,input下的裝置檔案主裝置號都為13,如下圖所示 根據開啟裝置的主裝置號為13,知...

pinctrl子系統分析(一)

pinctrl子系統分析 一 pinctrl子系統分析 二 pinctrl子系統分析 三 許多soc的內部都包含了pin控制器,通過pin控制器,我們可以匹配引腳的狀態和功能特性。在了解pinctrl子系統之前,我們先來了解一些基本的概念。soc的很多引腳都可以配置成不同的功能,如a1和a2兩個引腳...