《精通linux设备驱动程序开发》——视频驱动程序
一、显示架构
1、PC系统的显示连接。(P247 图12-1)
2、VGA(视频图形阵列)是IBM提出的早期显示标准。VGA的分辨率是640X480,而更新的标准比如SVGA(高级视频图形阵列)和XGA(扩展图形阵列)分别支持更高的
800X600和1024X768的分辨率。嵌入式设备上常用具有320X240分辨率的QVGA面板。
3、视频电缆标准
1)、模拟显示器。
2)、数字平面显示器。
3)、与DVI(数字视频接口)规范兼容的显示器。
4)、与HDTV(高清电视)规范兼容的显示器。
4、嵌入式系统的显示连接。(P249 图12-2)
5、嵌入式系统的LVDS和DVI连接。(P249 图12-3)
二、Linux视频子系统
1、帧缓冲的概念解决了低可移植性和冗余代码导致的大量投入和维护开销的问题。从而开发成员可以以与平台无关的方式编写应用层和较高内核层的程序。(P250 图12-4)
2、Linux视频子系统。(P250 图12-5)
1)、此子系统包括底层显示驱动程序、中间层帧缓冲和控制台、高层虚拟终端驱动程序、X Windows的用户模式驱动程序和配置显示参数程序。
2)、X Windows GUI操作视频卡的方式有两种:或者使用适用于相应视频卡的内建用户空间驱动程序,或者工作在帧缓冲子系统之上。
3)、文本模式控制台工作在虚拟终端字符驱动程序之上。
三、显示参数
1、有时为了让设备能播放视频,在编写驱动程序的时候,只需要配置与显示面板的属性即可。
2、fbset命令来显示特性
1)、D:值表示dotclock,它是视频硬件在显示器上绘制像素的速率。
2)、值65.003MHz表示视频控制器绘制一个像素需要用时约15384ps,这个时间称为pixclock,是timings行中的第一个数值参数。
3)、geometry(几何形状)后面的数表示可视的分辨率为1024X768(SVGA),一个像素的信息需8bit来保存。
4)、H:后面的值是为水平扫描率,它是视频硬件每秒扫描的水平显示线数目,是pixclock乘以X次方向分辨率的积德倒数。
5)、V:值是整屏的刷新率,是pixclock、X方向分辨率、Y方向分辨率三者的积的倒数。
6)、视频控制器在每行结束时发一个水平同步脉冲(HSYNC),在每帧结束时发一个垂直同步脉冲(VSYNC)。
四、帧缓冲API
1、帧缓冲核心层向用户空间输出设备结点,一边应用程序能访问每个支持的视频设备。
2、struct fd_var_screeninfo结构体(视频卡的属性)
3、struct fd_fix_screeninfo结构体(视频硬件的固定信息)
4、struct fd_cmap结构体(颜色映射)
struct fd_cmap {
__u32 start;
__u32 len;
__u16 *read;
__u16 *green;
__u16 *blue;
__u16 *transp;
};
5、以硬件无关的方式清除显示屏(代码清单12-1)
五、帧缓冲驱动程序
一)、导航系统简介
1、一个Linux导航设备的显示系统。(P254 图12-6)
1)、工作过程:GPS接收机通过UART接口向SOC发送坐标数据流,应用程序根据收到的位置信息产生图像,并更新系统内存中的帧缓冲。帧缓冲驱动程序通过DMA方式将
这幅图像数据传输到作为SoC LCD控制器一部分的显示缓冲区,控制器将像素数据传输到QVGA LCD面板进行显示。
2、导航系统被设计成此结构:GPS应用程序运行在LCD控制器的底层帧缓冲驱动程序上。应用程序通过dev/ttySX从GPS接收机获得位置,这里的X是连接到接收机的UART
号。然后它将几何定位信息转换成图像,并将像素数据写入与LCD控制器相关的帧缓冲。
3、LCD控制器的寄存器。(P255 表12-1)
二)、数据结构
1、fd_info结构体
2、fd_ops结构体
三)、检查和设置参数
1、fd_check_var()方法执行变量的合法性检查。同时也设置合适的RGB格式。
2、fd_set_par()方法根据fd_check_var中的值设置LCD控制器的寄存器:
1)、HSYC_REG中的水平同步时间,左空边,右空边。
2)、VSYC_REG中的垂直同步时间,上空边,下空边。
3)、SIZE_REG中的可见区X、Y分辨率。
4)、MNA_REG中的DMA参数。
3、GPS应用程序试图将QVGA的分辨率改为50X50。
四)、屏幕消隐
1、fd_blank()方法支持显示消隐和去消隐,主要用于电源管理。
五)、加速方法
1、如果用户接口需要执行繁重的视频操作,可能就需要通过图形加速来获得可以接受的性能。
2、fd_imageblit()方法在显示器上画一幅图像,这个函数为驱动程序提供了一个能利用视频控制器所拥有的某些特别能力的机会,以加速这种操作。如果硬件不支持加速功
能,cfd_imageblit()就是帧缓冲核心为加速提供的通用库函数。
3、fd_copyarea()将屏幕的一个矩形区域复制到另一个区域。如果图形控制器没有任何可加速这个操作的能力,那么fd_copyarea()就为这个操作提供优化的方法。
4、fd_fillrect()方法能快速用像素行填充矩形区。cfd_fillrecf()方法则是这种操作的一个通用的非加速方法。
六)、从帧缓冲DMA
1、导航系统的LCD控制器包含了一个DMA引擎,其能从系统内存抓取图形帧。控制器将得到的图像数据发到显示面板。DMA的速率支撑了显示器的刷新率。
2、适合并发访问的禁止cache的帧缓冲区是从myfd_probe()中用dma_alloc_coherent()分配的。my_set_par()将这个已分配的DMA地址写入LCD控制器的DMA_REG寄存器。
3、当驱动程序启用DMA时,控制器就通过同步DMA方式从帧缓冲不断将像素数据转送到显示器。所以,当GPS应用程序映射帧缓冲并写入位置信息时,像素就会被绘制到
LCD上。
七)、对比度和背光
1、导航系统中的LCD控制器通过使用CONTRAST_REG寄存器来控制对比度。驱动程序通过myfd_ioctl()向用户空间提供这个寄存器接口。
2、导航系统的LCD面板通过背光照亮,处理器通过DPIO线控制背光,因此设置相应引脚的电平就可以开/关背光。内核通过sysfs结点将其抽象为一般背光接口。为了利用这
个接口,驱动程序必须实现backlight_ops结构体,而且该结构体中要包含获得和改变背光亮度的函数,然后通过调用backlight_device_regisiter将其注册到内核。
3、导航系统的帧缓冲驱动程序。(P260 代码清单12-2)
六、控制台驱动程序
一)、简介
1、控制台是用于显示内核产生的printk()消息的一种设备。控制台包含两层,顶层驱动程序以及负责高级操作的底层驱动程序。
2、控制台驱动程序主要使用两种接口定义的结构。顶层控制台驱动程序以struct console为主,它定义了基本操作,底层驱动程序以struct consw为主,它指定了高级操作。
2、两层控制台驱动程序的结构
二)、设备实例:手机
1、USB_UART上的控制台(代码清单12-3)
三)、启动logo
1、帧缓冲子系统的一个特色是可以启动logo。为了显示这个logo,在内核配置阶段启用CONFIG_LOGO选项并选择一个可用的logo。
2、CLUT224是常用的启动logo的图片形式,它支持224种颜色。一个CLUT224图片是包含以下两种结构的C文件。
1)、CLUT,它是一个224个RGB组的字符矩阵。每个3字节的CLUT单元是红、绿、蓝3种颜色的组合。
2)、数据矩阵,它的每个字节是CLUT表的索引,索引从32开始,一直到225结束。32指向CLUT表中的第一个单元。logo操作码从与数据矩阵每个索引对应的CLUT组创建
帧缓冲像素数据,图像显示由底层帧缓冲驱动程序的fd_inmagelit()方法完成。
3、其他支持logo格式包括16色的vga16和黑白的单色。scripts/目录下的脚本可将标准的PPM文件转换成支持的logo格式。
七、调试(略)
《精通linux设备驱动程序开发》——视频驱动程序相关推荐
- 《精通Linux设备驱动程序开发》——1.5 Linux发行版
本节书摘来自异步社区<精通Linux设备驱动程序开发>一书中的第1章,第1.5节,作者:[印]Sreekrishnan Venkateswaran(斯里克里斯汉 温卡特斯瓦兰)著,更多章节 ...
- 《精通Linux设备驱动程序开发》——1.7 编译内核
本节书摘来自异步社区<精通Linux设备驱动程序开发>一书中的第1章,第1.7节,作者:[印]Sreekrishnan Venkateswaran(斯里克里斯汉 温卡特斯瓦兰)著,更多章节 ...
- VxWorks设备驱动程序开发指南---驱动程序的分类
8D Spaces Reliability & Stability & Efficiency 目录视图 摘要视图 订阅 VxWorks设备驱动程序开发指南(三)---驱动程序的分类 2 ...
- VxWorks驱动程序开发指南--驱动程序的组织结构
8D Spaces Reliability & Stability & Efficiency 目录视图 摘要视图 订阅 VxWorks驱动程序开发指南(四)--驱动程序的组织结构 20 ...
- Linux设备驱动开发基础
1.驱动概述和开发环境搭建 1.1驱动设备的作用 对设备驱动最通俗的解释就是"驱动硬件设备行动".驱动与底层硬件直接打交道,按照硬件设备的具体工作方式,读写设备的寄存器,完成设备的 ...
- 《Linux设备驱动开发详解(第3版)》(即《Linux设备驱动开发详解:基于最新的Linux 4.0内核》)网购链接
<Linux设备驱动开发详解:基于最新的Linux 4.0内核> china-pub 天猫 dangdang 京东 China-pub 8月新书销售榜 推荐序一 技术日新月 ...
- 《Linux设备驱动开发详解 A》一一2.3 接口与总线
本节书摘来华章计算机出版社<Linux设备驱动开发详解 A>一书中的第2章,第2.3节,作者:宋宝华 更多章节内容可以访问云栖社区"华章计算机"公众号查看.1 2.3 ...
- Linux设备驱动开发概述
作者:宋宝华 email:author@linuxdriver.cn 在过去这些年,Linux已经成功应用于服务器和桌面系统,而近年来,随着嵌入式系统应用的持续升温,Linux也开始广泛应用于嵌入式领 ...
- Linux 设备驱动开发 —— 设备树在platform设备驱动中的使用
关与设备树的概念,我们在Exynos4412 内核移植(六)-- 设备树解析 里面已经学习过,下面看一下设备树在设备驱动开发中起到的作用 Device Tree是一种描述硬件的数据结构,设备树源(De ...
- linux 设备驱动 ppt,linux设备驱动开发详解讲座ppt
PPT内容 这是linux设备驱动开发详解讲座ppt下载,主要介绍了设备驱动简介:建立和运行模块:字符驱动:调试技术:并发和竞争:分配内存:硬件通讯:中断处理:块设备驱动,欢迎点击下载. 嵌入式Lin ...
最新文章
- Stack(栈)和Heap(堆)的区别
- Redis集群CentOS系统配置企业级数据备份方案以及数据恢复的操作(在开启AOF功能下恢复冷备RDB文件数据,保持AOF和RDB双开情况下恢复数据及错误的数据恢复步骤详解)
- 电机编码器调零步骤_编码器原理、霍尔应用原理、调整步骤三个方面进行解读编码器调试...
- 蓝桥杯 ADV-180 算法提高 陶陶摘苹果2
- logstash 吞吐量优化_logstash吞吐率优化
- 社会工程学之黑客番外——密码学
- python字典的key提取_python 字典操作提取key,value
- 星际争霸2Beta测试版单机模式已经破解
- RabbitMQ系列——Rabbitmq Plugin configuration unchanged. 解决方案
- C# 小数点后保留两位小数
- Problem Set 2 Hangman Game字谜游戏
- 闭上眼睛时,会感触到那清风拂过脸颊的柔
- dlink交换机(DLINK交换机灯)
- 机器学习实战:用网络摄像头预测年龄和性别
- USB接口HID类设备——1)理论知识
- android studio 引入vitamio,Android studio3.0导入vitamio结果报错,求大神看看问题怎么解决...
- 最近公共祖先 (Lowest common ancestor)
- 关于js的回调函数,同步回调与异步回调
- 网页中打开pdf、doc、ppt、xsl、sxw、ods、odp相关代码
- 头盔检测数据集和论文