Android4 0之顯示部分HAL

2021-06-19 18:11:18 字數 4031 閱讀 3282

一、原理分析

android中顯示屏裝置被抽象成乙個幀緩衝區;linux核心建立的"/dev/graphics/fb0"裝置、就是用來描述系統中的乙個幀緩衝區(也就是乙個顯示屏),android系統grallochal模組封裝了對幀緩衝區的所有訪問操作。

grallochal模組包含兩個裝置alloc和fb。

android應用程式通過su***ceflinger服務操作這兩個裝置,完成顯示;首先通過gralloc裝置申請乙個圖形緩衝區、並將該圖形緩衝區對映到應用程式的位址空間,然後通過fb裝置將前邊已經繪製好的圖形緩衝區渲染到幀緩衝區上去、完成顯示。

總結:1.grallochal模組中alloc裝置使用結構體alloc_device_t來描述;完成對圖形緩衝區的管理:

2.grallochal模組中fb裝置使用結構體framebuffer_device_t來描述;完成對linux核心幀緩衝區的管理。

成員函式setswapinterval用來設定幀緩衝區交換前後兩個圖形緩衝區的最小和最大時間間隔;

成員函式setupdaterect用來設定幀緩衝區的更新區域;

成員函式post用來將圖形緩衝區buffer的內容渲染到幀緩衝區中去,即顯示在裝置的顯示屏中去;

成員函式compositioncomplete用來通知fb裝置device,圖形緩衝區的組合工作已經完成,目前沒有使用這個成員函式。

二、服務端呼叫流程

1.整體流程

frameworks/base/services/su***ceflinger/su***ceflinger.cpp

status_t su***ceflinger::readytorun()
frameworks/base/services/su***ceflinger/displayhardware/displayhardware.cpp
displayhardware::displayhardware(

const sp& flinger,

uint32_t dpy)

: displayhardwarebase(flinger, dpy),

mflinger(flinger), mflags(0), mhwc(0)

void displayhardware::init(uint32_t dpy)

}

frameworks/base/libs/ui/framebuffernativewindow.cpp

framebuffernativewindow::framebuffernativewindow()

: base(), fbdev(0), grdev(0), mupdateondemand(false)

for (i = 0; i < mnumbuffers; i++)

}}}

2.fb裝置流程

hardware/libhardware/include/hardware/fb.h

static inline int framebuffer_open(const struct hw_module_t* module,

struct framebuffer_device_t** device)

hardware/mstar/gralloc/gralloc_module.cpp

struct private_module_t hal_module_info_sym = ,

},registerbuffer: gralloc_register_buffer,

unregisterbuffer: gralloc_unregister_buffer,

lock: gralloc_lock,

unlock: gralloc_unlock,

perform: null,

reserved_proc: ,

},framebuffer: null,

flags: 0,

numbuffers: 0,

buffermask: 0,

lock: pthread_mutex_initializer,

currentbuffer: null,

};static struct hw_module_methods_t gralloc_module_methods = ;

static int gralloc_device_open(const hw_module_t* module, const char* name, hw_device_t** device)

else if (!strcmp(name, gralloc_hardware_fb0))

return status;

}

hardware/mstar/gralloc/framebuffer_device.cpp
int framebuffer_device_open(hw_module_t const* module, const char* name,

hw_device_t** device)

static int init_frame_buffer(struct private_module_t* module)

int init_frame_buffer_locked(struct private_module_t* module)

; int fd = -1;

int i = 0;

char name[64];

while ((fd == -1) && device_template[i])

//獲得

struct fb_fix_screeninfo finfo;

if (fbdev_ioctl(fd, fbioget_fscreeninfo, &finfo) == -1)

return -errno;

struct fb_var_screeninfo info;

if (fbdev_ioctl(fd, fbioget_vscreeninfo, &info) == -1)

return -errno;

//設定

uint32_t flags = page_flip;

if (fbdev_ioctl(fd, fbioput_vscreeninfo, &info) == -1)

//對映framebuffer

size_t fbsize = round_up_to_page_size(finfo.smem_len);

void* vaddr = fbdev_mmap(0, fbsize, prot_read|prot_write, map_shared, fd, 0);

int hw_base = static_cast(unsigned(finfo.smem_start) & mask_miu_physaddress);

module->framebuffer = new private_handle_t(private_handle_t::priv_flags_framebuffer, fbsize, intptr_t(vaddr),

0, hw_base, channel, 0);

}

3.alloc裝置流程

其他呼叫同上,不再分析

hardware/mstar/gralloc/alloc_device.cpp

static int alloc_device_alloc(alloc_device_t* dev, int w, int h, int format, int usage, buffer_handle_t* phandle, int* pstride)

4.alloc渲染到fb

hardware/mstar/gralloc/framebuffer_device.cpp

static int fb_post(struct framebuffer_device_t* dev, buffer_handle_t buffer)

m->currentbuffer = buffer;

}esle

}

Android 4 0 事件系統

2013 01 31 15 13 295人閱讀收藏 舉報 事件系統簡介 1.android 事件系統,它解決的是如何將按鍵 滑鼠 觸屏訊息從收集到最終將之傳送到焦點視窗進行處理的問題 2.android 事件處理 流程分兩部分,一部分是從 framework 開始,如何 從底層讀取事件並分發 給ac...

android4 0上網設定

很多也問到為啥自己在家的pc機可以上網,而執行在pc機上面的android模擬器卻不能上網呢?是因為家裡的pc機的dns一般為 192.168.1.1,這個只是一般而言,不是絕對,這個得自己使用ipconfig all命令檢查下 而模擬器預設的dns為 10.0.2.3,那麼模擬器跟自己的pc就不在...

android 4 0開機啟動服務

網上找了幾個方法 第一,寫乙個很簡單的程式,就乙個activity,指此activity標題欄去掉,背景全透明,然後在此activity的oncreate將自己finish 掉,什麼都不用幹,只要在manifest.xml中申明開機服務就ok,然後在程式內部響應此開機服務。下面 就是這種方式 第二,...