嵌入式企鹅圈将以本文作为2015年的终结篇,以回应第一篇《Linux字符设备驱动剖析》。嵌入式企鹅圈一直专注于嵌入式Linux和物联网IOT双方面的原创技术分享,稍后会公布嵌入式企鹅圈的2015年的年终总结和2016年的分享计划。

本系列文章将分析Linux Framebuffer驱动的作用(需求)、框架、接口实现和使用。

按笔者一直倡导的Linux学习理念—从软件需求的角度去理解Linux。对于Linux各个子系统,我们首先要理解其软件需求,从中自然会清楚其存在的价值和作用;接下来是理解子系统在Linux整个驱动框架中的层次、角色和怎样交互。最后是理解驱动的接口怎样实现软件需求,明白接口怎样在各种场景中使用。

一、Linux设备驱动和裸设备驱动的关系

理解framebuffer的软件需求之前。我们先理解Linux设备驱动和裸设备驱动的关系:

比如,对于LCD液晶屏,其能够由三星研发的SOC S5PV210(Cortex A8 arm核)的多媒体硬件模块所支持。而对于详细某种LCD液晶屏,涉及到分辨率、时延參数等不同。须要通过软件来设置相应的SOC多媒体硬件寄存器。以达到控制显示的目的。这个软件设置就是SOC编程。其无论是SOC上执行的是Linux。还是Windows。或者是IOS。软件设置的终于结果体现到寄存器上都是一样的。

一般地。嵌入式都是C语言开发,而高级处理器的寄存器是统一编址的,因此裸设备驱动外围设备的C语言代码基本是一样的。

在带操作系统执行时。为了安全考虑。系统一般分为用户态和内核态。那么,SOC编程是硬件编程,仅仅能在内核态完毕,而且须要向用户态程序提供一个接口以进行调用。

对于不同的操作系统而言。从用户态的接口開始到进行终于的SOC编程接口调用的过程中,会经过不同的软件层次。对于Linux操作系统,设备驱动的接口调用过程就是Linux设备驱动框架所决定的。详见《Linux字符设备驱动剖析》、《Linux 设备文件的创建和mdev》、《总线、设备和驱动》和《字符设备驱动、设备驱动模型、sysfs、平台设备驱动的关系》。

从上面分析能够看出。不论什么Linux设备驱动都有两个层次。一个是偏底层硬件的SOC寄存器编程,一个是偏上层应用的Linux子系统软件接口。前者负责和硬件的交互。后者负责跟上层应用交互。Linux为了给用户提供统一的编程接口,在全部的设备驱动之上再架设一层公共接口层,如全部驱动都能够通过open、read、write来进行操作,其是Linux设备驱动框架的组成部分。因此,一般地,Linux设备驱动都有三个层次。

当然。各个子系统内部还会通过分层来解耦内部的需求和实现。

二、LinuxFramebuffer的软件需求

Linux Framebuffer的需求就是驱动LCD屏显示。所以其自然也有两个层次。偏底层硬件的SOC寄存器编程和偏上层应用的写屏接口。本文的重点是为了分析Linux framebuffer驱动的偏上层应用的接口实现,而不是阐述怎样进行SOC编程,由于SOC编程是针对某个详细的SOC寄存器来进行的。

1.     LCD屏的驱动需求

SOC和LCD屏的连接示意图例如以下:

1) SOC编程是为了支持多种不同的LCD屏,以使该SOC的应用场景最大化。因此SOC的多媒体Display模块须要考虑不同的屏幕分辨率、位图深度、行切换和帧切换的时延等等。

这些參数的设置终于使得LCD控制器(硬件引擎)产生匹配的时钟和数据输出到LCD引脚上。这些设置的编程方式和其它字符设备(如鼠标、串口等)都是几乎相同的。

所以。LCD的驱动需求是通过寄存器设置支持各种不同的LCD屏。

2)唯一有一点不同的就是,LCD屏驱动器内部有个大的fifo(跟分辨率有关。可能是几百K字节,甚至M字节级)。Fifo中存放LCD屏的显示数据,LCD驱动器内部显示电路会自己主动将FIFO的数据刷新到LCD屏上。由于FIFIO非常大。通过CPU写总线的方式来将内存数据写到fifo的方式是不可行的,这样会加重CPU负担。现代高级SOC处理器都使用DMA的方式,由DMA直接将内存数据搬到FIFO。DMA能够理解为一个专职搬运工,与CPU、GPU一样是独立工作的。仅仅须要告诉它源地址、目的地址和长度就能够了。

源地址就是物理内存地址,目的地址就是FIFO映射地址。DMA工作不经过MMU,所以它仅仅认物理内存地址。

那么。LCD的还有一个驱动需求是CPU将用户数据写到DMA所认的物理内存地址上。CPU写好用户数据到物理内存地址上,显示专用DMA就自己主动搬运到显示FIFO上。

2.     LCD屏驱动的实现思路

从上面分析能够看出,LCD屏的设备驱动能够是一个字符设备驱动。第一个需求通过寄存器设置支持各种不同的LCD屏是非常easy实现的。而第二个需求通过write接口也是非常easy实现的。

写接口就是将用户图像数据(0-3G进程虚拟空间buffer, 相应实际的物理内存地址1)复制到内核虚拟地址空间(相应实际的物理内存地址2)。

一般地,我们在用户进程中是申请一块物理连续的内存块(返回地址是0-3G的进程虚拟地址空间),并将多个图像资源数据(如文字。图像等)放到这个内存中。我们把这次资源数据复制到内存块称为一次拷贝。

然后通过写接口复制到实际的显示物理内存,称为二次拷贝。

虚拟地址空间和物理地址空间的映射是通过MMU(内存管理单元)来进行映射和管理的。MMU机制请看《SoC嵌入式软件架构设计之二:内存管理单元的软、硬件协同设计》。简单的理解就是程序执行的空间是4G虚拟地址空间。而实际的物理内存可能是1G内存,代码和数据是真正存储在实际的物理内存上的。怎样通过虚拟地址找到相应的实际物理内存地址就是MMU的作用。

3.     Framebuffer的软件需求

从上面分析,图像数据显示要经历两次拷贝。那么,有没有方法做到一次拷贝就能够显示了呢?非常好。Framebuffer就是利用MMU机制来实现一次拷贝就可以显示。

它的显示示意图是:

可见,当用户图像数据buffer和内核虚拟地址空间buffer相应的都是同一块物理内存。当资源数据复制到用户图像数据buffer时。即是直接复制到显示物理内存了。

所以,framebuffer驱动最重要的功能就是给用户提供一个进程空间映射到实际的显示物理内存的接口(mmap)。

它跟进程间通信的共享变量的原理是一致的。

另外,考虑到一台设备可能要支持多个输出,比如HDMI接口、VGA,或者相似视频监控需求,一个屏幕上有好多个监控窗体。怎样更好地管理多个显示缓存。Framebuffer在内部进行了抽象,即其向上层应用统一抽象为一个字符主设备,而不同的窗体显示缓存即视为不同的字符从设备。Framebuffer支持多达32个从设备。

接下来会从代码级详细分析Linux Framebuffer驱动的框架组成、mmap和其它接口实现、接口使用场景。

透彻理解以上framebuffer驱动的软件需求,再来跟踪分析Linux Framebuffer驱动是不难的。

敬请关注兴许的分析文章!

很多其它嵌入式Linux和物联网原创技术分享请关注微信公众号:嵌入式企鹅圈

转载于:https://www.cnblogs.com/wzzkaifa/p/7116637.html

Linux Framebuffer驱动剖析之中的一个—软件需求相关推荐

  1. Linux Framebuffer驱动剖析之一—软件需求

    本系列文章将分析Linux Framebuffer驱动的作用(需求).框架.接口实现和使用.按笔者一直倡导的Linux学习理念-从软件需求的角度去理解Linux,对于Linux各个子系统,我们首先要理 ...

  2. 知乎问答-如何做一个软件需求分析师

    这个问题很大,这篇不想再去重复一个软件需求分析员的知识体系结构,而是挑重点来谈下成为一个合格的软件需求分析人员的关键点. 我原来对软件需求的定义或描述更多是偏于对现实世界的定义,而对软件架构的描述为现 ...

  3. Linux设备驱动剖析之IIC(四)

    558行,又重试2次. 560行,调用s3c24xx_i2c_doxfer函数: 00000482 static int s3c24xx_i2c_doxfer(struct s3c24xx_i2c * ...

  4. 《Linux 设备驱动开发详解(第2版)》——1.4 Linux设备驱动

    本节书摘来自异步社区<Linux 设备驱动开发详解(第2版)>一书中的第1章,第1.1节,作者:宋宝华著,更多章节内容可以访问云栖社区"异步社区"公众号查看 1.4 L ...

  5. Linux PCI驱动框架分析:(Peripheral Component Interconnect,外部设备互联)

    <DPDK 20.05 | rte_pci_bus思维导图 | 第一版> <linux系统下:IO端口,内存,PCI总线 的 读写(I/O)操作> <Linux指令:ls ...

  6. Linux设备驱动开发基础

    1.驱动概述和开发环境搭建 1.1驱动设备的作用 对设备驱动最通俗的解释就是"驱动硬件设备行动".驱动与底层硬件直接打交道,按照硬件设备的具体工作方式,读写设备的寄存器,完成设备的 ...

  7. Linux设备驱动开发笔记

    0 Linux 操作系统知识 Linux是一个操作系统. 优点: 免费: 丰富的文档和社区支持: 跨平台移植: 源代码开放: 有许多免费开源软件. 家用电脑用Windows,服务器端用Linux. 操 ...

  8. linux v4l2系统详解,Linux摄像头驱动学习之:(一)V4L2_框架分析

    这段时间开始搞安卓camera底层驱动了,把以前的的Linux视频驱动回顾一下,本篇主要概述一下vfl2(video for linux 2). 一. V4L2框架: video for linux ...

  9. Linux PCIe驱动框架分析(第二章)

    目录 项目背景 1. 概述 2. 数据结构 3. 流程分析 3.1 设备驱动模型 3.2 初始化 3.2.1 pci_bus_match 3.2.2 pci_device_probe 3.3 枚举 项 ...

最新文章

  1. python中内置的四种数值类型为_浅谈python语言四种数值类型
  2. WinCE设置多国语言支持
  3. linux系统适合电脑小白吗,linux小白说说用linux的感受
  4. Inconsistent behavior between text type in Webclient UI and backend customizing
  5. [转]IPython介绍
  6. [Java网络编程基础]网络编程概述,三要素,IP地址
  7. Shell 字符串截取
  8. php实现飘窗,JS实现网站图片飘窗效果,JavaScript悬浮广告(附详细代码)
  9. (转)淘淘商城系列——引用dubbo服务
  10. element ui border表头设置背景颜色
  11. hdu1243 最长公共子序列(LCS)
  12. Deeping Learning学习与感悟——《深度学习工程师》_2
  13. 关于你看得懂看不懂的罗永浩
  14. ipad4越狱显示服务器维修,iPad越狱后怎么恢复出厂设置及恢复中所出现问题的解决方法...
  15. 洛谷P3097 - [USACO13DEC]最优挤奶Optimal Milking
  16. Scrum如何拥抱变化
  17. js 获取浏览器屏幕的宽度和高度
  18. 评论:雨林木风Linux 意义和目的是什么?
  19. SpringApplication.run(MyApplication.class, args)运行流程源码分析
  20. 震惊!这个链接里面竟然有

热门文章

  1. 积分图像追踪目标 (一)
  2. 我的docker随笔3:实现加速器,加快拉取镜像速度
  3. Unable to establish loopback connection异常解决
  4. python从其他文件导入模块_Python模块可以使用其他文件的导入吗?
  5. 【算法】剑指 Offer 47. 礼物的最大价值
  6. 【Flink】flink sql的并行度怎么单独设置
  7. 【guava】guava 11.0.2 版本 key 肯能丢数据的bug
  8. 【elasticsearch】elasticsearch 7 index.lifecycle.rollover_alias does not point to index
  9. 【Elasticsearch】bulk default_local reports failures when export documents
  10. 【Flink】大数据分析常用去重算法分析『HyperLogLog 篇』