Android display架构分析(3)

Android display架构分析(三)

转 http://hi.baidu.com/leowenj/blog/item/76411bf6237dc429bc31099f.html

 

Android display架构分析(三)

 

Kernel Space Display 架构介绍

Android display架构分析(3)

如上图所示,除了上层的图形应用程序外,和 Kernel 空间有关的包括 Linux FB 设备层以及和具体 HW 相关的驱动层,对应的源文件分别是 fb_mem.c msm_fb.c mddi_toshiba.c 。下面会一一介绍。

fb_mem.c 函数和数据结构介绍

这个文件包含了 Linux Fb 设备的所有接口,主要函数接口和数据结构如下:

A、Fb设备的文件操作接口

Android display架构分析(3)

B、3个重要的数据结构

   FrameBuffer 中有 3 个重要的结构体, fb.h 中定义,如下:

1) frame_var_screeninfo

该结构体定义了显卡的一些可变的特性,这些特性在程序运行期间可以由应用程序动态改变,比较典型的如 xrex yres 表示在显示屏上显示的真实分辨率、显示的 bit 数等,该结构体 user space 可以访问。

2) frame_fix_screeninfo

该结构体定义了显卡的一些固定的特性,这些特性在硬件初始化时就被定义了以后不可以更改。其中最重要的成员就是 smem_len smem_start ,前者指示显存的大小(目前程序中定义的显存大小为整屏数据 RGB565 大小的 2 倍) , 后者给出了显存的物理地址。该结构体 user space 可以访问。

Note smem_start 是显存的物理地址,应用程序是不可以直接访问的,必须通过 fb_ops 中的 mmp 函数映射成虚拟地址后,应用程序方可访问。

3) fb_info

FrameBuffer 中最重要的结构体,它只能在内核空间内访问。内部定义了 fb_ops 结构体(包含一系列 FrameBuffer 的操作函数, Open/read/write 、地址映射等) .

C、其他

   1)、一个重要的全局变量

struct fb_info *registered_fb[FB_MAX];

这变量记录了所有 fb_info 结构的实例, fb_info 结构描述显卡的当前状态,所有设备对应的 fb_info 结构都保存在这个数组中,当一个 FrameBuffer 设备驱动向系统注册自己时,其对应的 fb_info 结构就会添加到这个结构中,同时 num_registered_fb 为自动加 1

2)、注册framebuffer 函数

register_framebuffer(struct fb_info *fb_info);

unregister_framebuffer(struct fb_info *fb_info);

这两个是提供给下层 FrameBuffer 设备驱动的接口,设备驱动通过这两函数向系统注册或注销自己。几乎底层设备驱动所要做的所有事情就是填充 fb_info 结构然后向系统注册或注销它