Android有其完整的显示系统,上层显示系统提供系统图形的输出设备,java层的和和控件的外观和直接的图形接口的绘制都是通过显示系统呈现出来的。Android的底层显示系统与Android的Surface库部分有也着很强的联系。底层显示系统提供的是基本的显示输出设备的封装,Surface库部分是基于这个显示终端,提供了多个图层的支持以及图层间的效果等功能。如图所示的是Android显示系统的基于层次结构。

图1   Android显示系统的层次结构

在Android显示驱动中,存在一个名为Gralloc的硬件模块,这个硬件模块位于libui与显示设备驱动之间,这个Gralloc作为显示系统的硬件抽象层来使用。如图2所示。

图2   Gralloc与Framebuffer驱动之间的联系

Gralloc模块有存在形式是一个放置在/system/lib/hw中的动态库。系统的其他部分没有连接这个动态库,而是在运行的过程中使用dlopen和dlsym的方式动态地打开和取出符号来使用。Gralloc模块是一个可以移植的硬件抽象层。它是系统和显示设备的接口,以硬件模块的形式存在。Android系统通常使用framebuffer作为其驱动程序。但是如果使用Gralloc也可以不使用framebuffer设备。在上层,主要由libui库中的FramebufferNativeWindows.cpp部分是Gralloc模块的主要调用者。

libui是Android在本地层次一个框架性质的集成库,它不仅是现实的中枢,也是整个AndroidGUI系统的中枢。这个库提供了一些接口,由其他的库通过类继承方式来实现,而调用者只需要调用libui库的接口即可。libui库包含了颜色格式,Egl窗口(用户显示),按键及事件处理,Surface(显示界面),Overlay(显示叠加层接口),Camera(照相机接口)等多个方面的定义。

由于Android是基于Linux操作系统的,所以Android的底层显示设备驱动是framebuffer驱动。Framebuffer驱动是一个字符设备驱动,它采用了“文件层——驱动层”的接口方式。Linux为帧缓冲设备定义的驱动层接口为fb_info结构体。在文件层次上,用户调用file_operations结构体的函数操作,其中间接调用fb_ops结构体的函数来操作硬件。在向内核注册FB设备的时候,也注册了struct fb_ops的指针。当打开FB设备时,先调用fb_drivers[]的xxxfb_init()来初始化设备。framebuffer驱动在文件系统中的设备节点通常是/dev/fbX。

Framebuffer设备驱动在Linux内核源码中主要基于三个文件:

/include/linux/fb.h

/drivers/video/fbmem.h

/driver/video/xxxfb.c

fb.h主要是定义一些结构体和宏;fbmem.h实现了设备初始化、卸载和文件操作接口;xxxfb.c为自己添加的设备驱动文件(如 struct fb_info)实现了入口点函数xxxfb_init;xxxfb_setup。

framebuffer设备最关键的一个数据结构体是fb_info结构体,它包括了关于帧缓冲设备属性和操作的完整描述,这个结构体的定义如下(include/linux/fb.h):

struct fb_info {int node;int flags;struct mutex lock;        /* Lock for open/release/ioctl funcs */struct mutex mm_lock;        /* Lock for fb_mmap and smem_* fields */struct fb_var_screeninfo var;   /* Current var */struct fb_fix_screeninfo fix;  /* Current fix */struct fb_monspecs monspecs;   /* Current Monitor specs */struct work_struct queue;    /* Framebuffer event queue */struct fb_pixmap pixmap;   /* Image hardware mapper */struct fb_pixmap sprite; /* Cursor hardware mapper */struct fb_cmap cmap;        /* Current cmap */struct list_head modelist;      /* mode list */struct fb_videomode *mode; /* current mode */#ifdef CONFIG_FB_BACKLIGHT/* assigned backlight device *//* set before framebuffer registration, remove after unregister */struct backlight_device *bl_dev;/* Backlight level curve */struct mutex bl_curve_mutex;    u8 bl_curve[FB_BACKLIGHT_LEVELS];
#endif
#ifdef CONFIG_FB_DEFERRED_IOstruct delayed_work deferred_work;struct fb_deferred_io *fbdefio;
#endifstruct fb_ops *fbops;struct device *device;       /* This is the parent */struct device *dev;     /* This is this fb device */int class_flag;                    /* private sysfs flags */
#ifdef CONFIG_FB_TILEBLITTINGstruct fb_tile_ops *tileops;    /* Tile Blitting */
#endifchar __iomem *screen_base;    /* Virtual address */unsigned long screen_size; /* Amount of ioremapped VRAM or 0 */ void *pseudo_palette;      /* Fake palette of 16 colors */
#define FBINFO_STATE_RUNNING    0
#define FBINFO_STATE_SUSPENDED  1u32 state;         /* Hardware state i.e suspend */void *fbcon_par;                /* fbcon use-only private area *//* From here on everything is device dependent */void *par;/* we need the PCI or similiar aperture base/size notsmem_start/size as smem_start may just be an objectallocated inside the aperture so may not actually overlap */resource_size_t aperture_base;resource_size_t aperture_size;
};

fb_info的成员变量fbops为指向底层操作的函数的指针,这些函数是需要驱动程序开发人员编写的。

struct fb_ops {/* open/release and usage marking */struct module *owner;int (*fb_open)(struct fb_info *info, int user);int (*fb_release)(struct fb_info *info, int user);/* For framebuffers with strange non linear layouts or that do not* work with normal memory mapped access*/ssize_t (*fb_read)(struct fb_info *info, char __user *buf,size_t count, loff_t *ppos);ssize_t (*fb_write)(struct fb_info *info, const char __user *buf,size_t count, loff_t *ppos);/* checks var and eventually tweaks it to something supported,* DO NOT MODIFY PAR */int (*fb_check_var)(struct fb_var_screeninfo *var, struct fb_info *info);/* set the video mode according to info->var */int (*fb_set_par)(struct fb_info *info);/* set color register */int (*fb_setcolreg)(unsigned regno, unsigned red, unsigned green,unsigned blue, unsigned transp, struct fb_info *info);/* set color registers in batch */int (*fb_setcmap)(struct fb_cmap *cmap, struct fb_info *info);/* blank display */int (*fb_blank)(int blank, struct fb_info *info);/* pan display */int (*fb_pan_display)(struct fb_var_screeninfo *var, struct fb_info *info);/* Draws a rectangle */void (*fb_fillrect) (struct fb_info *info, const struct fb_fillrect *rect);/* Copy data from area to another */void (*fb_copyarea) (struct fb_info *info, const struct fb_copyarea *region);/* Draws a image to the display */void (*fb_imageblit) (struct fb_info *info, const struct fb_image *image);/* Draws cursor */int (*fb_cursor) (struct fb_info *info, struct fb_cursor *cursor);/* Rotates the display */void (*fb_rotate)(struct fb_info *info, int angle);/* wait for blit idle, optional */int (*fb_sync)(struct fb_info *info);/* perform fb specific ioctl (optional) */int (*fb_ioctl)(struct fb_info *info, unsigned int cmd,unsigned long arg);/* Handle 32bit compat ioctl (optional) */int (*fb_compat_ioctl)(struct fb_info *info, unsigned cmd,unsigned long arg);/* perform fb specific mmap */int (*fb_mmap)(struct fb_info *info, struct vm_area_struct *vma);/* save current hardware state */void (*fb_save_state)(struct fb_info *info);/* restore saved state */void (*fb_restore_state)(struct fb_info *info);/* get capability given var */void (*fb_get_caps)(struct fb_info *info, struct fb_blit_caps *caps,struct fb_var_screeninfo *var);/* teardown any resources to do with this framebuffer */void (*fb_destroy)(struct fb_info *info);
};

底层之旅——Android显示驱动(framebuffer)的分析相关推荐

  1. linux显示子系统-framebuffer架构分析

    目录 简介 驱动层 时序数据流 架构 应用层 实例 fb架构优劣势 参考文件 简介 FrameBuffer,帧缓冲,简称fb,也叫显存,下文以fb代表framebuffer.该子系统是内核针对显示系统 ...

  2. Android USB驱动源码分析(-)

    Android USB驱动中,上层应用协议里最重要的一个文件是android/kernel/drivers/usb/gadget/android.c.这个文件实现USB的上层应用协议. 首先包含了一些 ...

  3. Android USB驱动源码分析

    Android USB驱动中,上层应用协议里最重要的一个文件是android/kernel/drivers/usb/gadget/android.c.这个文件实现USB的上层应用协议. 首先包含了一些 ...

  4. android蓝牙底层通道,底层之旅——Android蓝牙系统分析

    蓝牙系统分为四个层次,内核层.BlueZ库.BlueTooth的适配库.BlueTooth的JNI部分.Java框架层.应用层.下面先来分析Android的蓝牙协议栈. Android的蓝牙协议栈采用 ...

  5. Android消息驱动Handler类分析

    Android系统中的消息驱动工作原理: 1.有一个消息队列,可以往这个消息队列中投递消息; 2.有一个消息循环,不断的从消息队列中取得消息,然后处理. 工作流程: 1.事件源将待处理的消息加入到消息 ...

  6. 全球及中国双稳态显示驱动IC行业研究及十四五规划分析报告

    [报告篇幅]:131 [报告图表数]:184 [报告出版时间]:2021年12月 报告摘要 2020年,全球双稳态显示驱动IC市场规模达到了 百万美元,预计2027年可以达到 百万美元,年复合增长率( ...

  7. 2021年全球双稳态显示驱动IC行业调研及趋势分析报告

    本文研究全球市场.主要地区和主要国家双稳态显示驱动IC的销量.销售收入等,同时也重点分析全球范围内主要厂商(品牌)竞争态势,双稳态显示驱动IC销量.价格.收入和市场份额等.针对过去五年(2016-20 ...

  8. android lcd驱动框架,LCD驱动及Framebuffer相关(转载)

    LCD驱动及Framebuffer相关 (2012-11-20 17:04) 标签:&nBSP; lcd驱动  framebuffer  io内存  分类: Android驱动模块相关 内容提 ...

  9. android系统平台显示驱动开发简要:Samsung LCD接口篇『三』

    平台信息: 内核:linux3.4.39 系统:android4.4  平台:S5P4418(cortex a9) 作者:瘋耔(欢迎转载,请注明作者) 欢迎指正错误,共同学习.共同进步!! 关注博主新 ...

最新文章

  1. More than one file was found with OS independent path 'META-INF/rxjava.properties
  2. C语言网络编程:TCP客户端实现
  3. 30~60k | 小鹏汽车3D视觉感知工程师/专家招聘(社招)
  4. Hive到SparkSql
  5. sharepoint 2010学习资源汇总
  6. mysql redis hbase_MySQL之基本介绍
  7. windows installer没有正确安装_电脑还可以这样禁止软件自动安装,后悔知道得太晚...
  8. YC StartupSchool 2018 2019 笔记
  9. 全网最快安装JDK17教程(windows版本)
  10. 【PHP学习】—PHP连接数据库实现表单页面的验证功能(七)
  11. MySQL 多表查询(Day43)
  12. Try Microsoft AutoCollage 2008
  13. java 处理clob_java读取clob字段的几种方法
  14. Swift笔记(一):可选类型、语法基础
  15. 省团团小程序被微信封禁
  16. 浏览器刷新vue为什么不会走beforeDestroy和destroyed生命周期
  17. FYI | OHBM/Brain 会议投稿指北
  18. strut1和strut2的区别
  19. 感悟篇:我在B端做数据分析(一)
  20. Java Word中的文本、图片替换功能

热门文章

  1. APP报毒的自查方法
  2. 做了996的网站优化,就来聊聊SEO网络优化
  3. 2017.08.20【NOIP提高组】模拟赛B组 【NOIP2014八校联考第4场第2试10.20】星球联盟(alliance)...
  4. 在聚宽平台上编写鳄鱼交易法则
  5. 计算机组成原理r3寄存器,计算机组成原理实验报告-寄存器的原理及操作
  6. 电力电子技术总结-电力电子器件1
  7. 教你如何使用blender+threejs搭建一个3d展厅平台 | 大帅老猿threejs特训
  8. 微型四轴DIY机架,轻巧稳固耐摔,通用720空心杯电机,9厘米轴距
  9. 永动机:空想与诈骗——收集一些趣味的永动机设计
  10. css3动画照片墙,css3照片墙动态效果