Android图形系统分析与移植--三、内核空间显示功能介绍
2011-07-14 19:40
609 查看
这里的Kernel空间(与Display相关)是Linux平台下的FB设备。
1、下面介绍一下FB设备。
FB即FrameBuffer的简称。FrameBuffer 是一种能够提取图形的硬件设备,是用户进入图形界面很好的接口。有了FrameBuffer,用户的应用程序不需要对底层驱动有深入了解就能够做出很好的图形。对于用户而言,它和/dev 下面的其他设备没有什么区别,用户可以把FrameBuffer 看成一块内存,既可以向这块内存中写入数据,也可以从这块内存中读取数据。
从用户的角度看,帧缓冲设备和其他位于/dev下面的设备类似,它是一个字符设备,通常主设备号是29,次设备号定义帧缓冲的个数。
在LINUX系统中,设备被当作文件来处理,所有的文件包括设备文件,Linux都提供了统一的操作函数接口。
1)、读写(read/write)接口,即读写屏幕缓冲区(应用程序不一定会调用该接口)
2)、映射(map)操作(用户空间不能直接访问显存物理空间,需map成虚拟地址后才可以)
由于Linux工作在保护模式,每个应用程序都有自己的虚拟地址空间,在应用程序中是不能直接访问物理缓冲区地址的。为此,Linux在文件操作file_operations结构中提供了mmap函数,可将文件的内容映射到用户空间。对于帧缓冲设备,则可通过映射操作,可将屏幕缓冲区的物理地址映射到用户空间的一段虚拟地址中,之后用户就可以通过读写这段虚拟地址访问屏幕缓冲区,在屏幕上绘图了。实际上,使用帧缓冲设备的应用程序都是通过映射操作来显示图形的。由于映射操作都是由内核来完成,下面我们将看到,帧缓冲驱动留给开发人员的工作并不多。
3)、I/O控制:对于帧缓冲设备,对设备文件的ioctl操作可读取/设置显示设备及屏幕的参数,如分辨率,显示颜色数,屏幕大小等等。ioctl的操作是由底层的驱动程序来完成。
2、内核空间显示架构介绍
Android内核空间显示架构如图1所示:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201911/04/7e0117783470e1ecc3510617a2707d35.gif)
如上图所示,除了上层的图形应用程序外,和内核空间有关的包括Linux FB设备层以及具体硬件相关的驱动层。其中Linux FB设备层相对应的源文件为fb_mem.c。这部分在下一节中再详细介绍。
3、显示数据分析
本部分研究一下应用层一下,显示数据的流程是怎么样的。
Android平台下实现了双缓冲机制之后显示数据是如何处理的,如图2所示。
![](https://oscdn.geek-share.com/Uploads/Images/Content/201911/04/7c9980502846d4913f00aee2d165d90e.gif)
同样上层也是调用FB API,不过这里其实把FB直接绕过了,相当于直接调用的是硬件的高通MDP PPP驱动,然后数据经PPP处理后再经MDDI接口送出到外围LCD组件。
1、下面介绍一下FB设备。
FB即FrameBuffer的简称。FrameBuffer 是一种能够提取图形的硬件设备,是用户进入图形界面很好的接口。有了FrameBuffer,用户的应用程序不需要对底层驱动有深入了解就能够做出很好的图形。对于用户而言,它和/dev 下面的其他设备没有什么区别,用户可以把FrameBuffer 看成一块内存,既可以向这块内存中写入数据,也可以从这块内存中读取数据。
从用户的角度看,帧缓冲设备和其他位于/dev下面的设备类似,它是一个字符设备,通常主设备号是29,次设备号定义帧缓冲的个数。
在LINUX系统中,设备被当作文件来处理,所有的文件包括设备文件,Linux都提供了统一的操作函数接口。
1)、读写(read/write)接口,即读写屏幕缓冲区(应用程序不一定会调用该接口)
2)、映射(map)操作(用户空间不能直接访问显存物理空间,需map成虚拟地址后才可以)
由于Linux工作在保护模式,每个应用程序都有自己的虚拟地址空间,在应用程序中是不能直接访问物理缓冲区地址的。为此,Linux在文件操作file_operations结构中提供了mmap函数,可将文件的内容映射到用户空间。对于帧缓冲设备,则可通过映射操作,可将屏幕缓冲区的物理地址映射到用户空间的一段虚拟地址中,之后用户就可以通过读写这段虚拟地址访问屏幕缓冲区,在屏幕上绘图了。实际上,使用帧缓冲设备的应用程序都是通过映射操作来显示图形的。由于映射操作都是由内核来完成,下面我们将看到,帧缓冲驱动留给开发人员的工作并不多。
3)、I/O控制:对于帧缓冲设备,对设备文件的ioctl操作可读取/设置显示设备及屏幕的参数,如分辨率,显示颜色数,屏幕大小等等。ioctl的操作是由底层的驱动程序来完成。
2、内核空间显示架构介绍
Android内核空间显示架构如图1所示:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201911/04/7e0117783470e1ecc3510617a2707d35.gif)
如上图所示,除了上层的图形应用程序外,和内核空间有关的包括Linux FB设备层以及具体硬件相关的驱动层。其中Linux FB设备层相对应的源文件为fb_mem.c。这部分在下一节中再详细介绍。
3、显示数据分析
本部分研究一下应用层一下,显示数据的流程是怎么样的。
Android平台下实现了双缓冲机制之后显示数据是如何处理的,如图2所示。
![](https://oscdn.geek-share.com/Uploads/Images/Content/201911/04/7c9980502846d4913f00aee2d165d90e.gif)
同样上层也是调用FB API,不过这里其实把FB直接绕过了,相当于直接调用的是硬件的高通MDP PPP驱动,然后数据经PPP处理后再经MDDI接口送出到外围LCD组件。
相关文章推荐
- Android图形系统分析与移植 -- 三、内核空间显示功能介绍
- Android图形系统的分析与移植 -- 二、Android显示系统软件架构分析
- Android图形系统的分析与移植--二、Android显示系统软件架构分析
- Android系统开发之触摸屏tslib移植(内核)和原理分析
- android系统开发(四)-触摸屏tslib移植(内核)和原理分析
- android系统开发(四)-触摸屏tslib移植(内核)和原理分析
- Android图形系统的分析与移植--一、Android GUI系统简介
- android系统开发(四)-触摸屏tslib移植(内核)和原理分析
- Android图形系统分析与移植--四、Surface Manager(Surface Flinger简介)
- Android图形系统的分析与移植--一、Android GUI系统简介
- Android图形系统分析与移植--五、Android FrameBuffer简介
- android系统开发(四)-触摸屏tslib移植(内核)和原理分析
- Android图形系统分析与移植--六、framebuffer研究
- Android图形系统分析与移植 -- 四、Surface Manager(Surface Flinger简介)
- Android图形系统的分析与移植--七、双缓冲framebuffer的实现
- android系统开发(四)-触摸屏tslib移植(内核)和原理分析
- Android图形系统分析与移植 -- 五、Android FrameBuffer
- Android图形系统分析与移植--六、framebuffer研究
- Android图形系统分析与移植--六、framebuffer研究
- Android图形系统的分析与移植 -- 六、双缓冲framebuffer的实现