基本原理

通过 framebuffer ,应用程序用 mmap 把显存映射到应用程序虚拟地址空间,将要显示的数据写入这个内存空间就可以在屏幕上显示出来;

驱动程序分配系统内存作为显存;实现 file_operations 结构中的接口,为应用程序服务;实现 fb_ops 结构中的接口,控制和操作 LCD  控制器;

驱动程序将显存的起始地址和长度传给 LCD 控制器的寄存器 (一般由 fb_set_var 完成) , LDC 控制器会自动的将显存中的数据显示在

LCD 屏上。

写 framebuffer 驱动程序要做什么

简单的讲,framebuffer 驱动的功能就是分配一块内存作显存,然后对 LCD 控制器的寄存器作一些设置。

具体来说:

填充一个 fbinfo 结构

用 reigster_framebuffer (fbinfo*) 将 fbinfo 结构注册到内核

对于 fbinfo 结构,最主要的是它的 fs_ops 成员,需要针对具体设备实现 fs_ops 中的接口

考虑是否使用中断处理

考虑内存访问方式

显卡不自带显存的,分配系统内存作为显存

显卡自带显存的,用 I/O 内存接口进行访问 (request_mem_region / ioremap),

关于如何写驱动的参考资料,在网站 http: /linux-fbdev.sourceforge.net/HOWTO/index.html 可以找到

"Linux Frame buffer Driver Writing HOWTO"

什么是 frame buffer 设备

frame buffer

设备是图形硬件的抽象,它代表了图形硬件的侦缓冲区,允许应用程序通过指定的接口访问图形硬件。因此,应用程序不必关心底层硬件细节。

设备通过特定的设备节点访问,通常在 /dev 目录下,如 /dev/fb*。

更多关于 frame buffer device 的资料可以在以下两个文件中找到: linux

/Documentation/fb/framebuffer.txt 和 linux /Documentation/fb

/interal.txt,但这些资料内容不多,还需要看看结合代码具体分析。

Linux Frame Buffer 驱动程序层次结构

Frame Buffer 设备驱动可以从三个层次来看:

应用程序与系统调用;

适用于所有设备的通用代码,避免重复,包括 file_operations 结构、register/unregister framebuffer 接口等;

操作具体硬件的代码,主要是 fb_ops 结构。

在 Linux 内核中,Frame Buffer 设备驱动的源码主要在以下两个文件中,它们处于 frame buffer

驱动体系结构的中间层,它为上层的用户程序提供系统调用,也为底层特定硬件驱动提供了接口:

linux/inlcude/fb.h

linux/drivers/video/fbmem.c

数据结构

头文件 fb.h 定义了所有的数据结构:

fb_var_screeninfo:描述了一种显卡显示模式的所有信息,如宽、高、颜色深度等,不同的显示模式对应不同的信息;

fb_fix_screeninfo:定义了显卡信息,如 framebuffer 内存的起始地址,地址长度等;

fb_cmap:设备独立的 colormap 信息,可以通过 ioctl 的 FBIOGETCMAP 和 FBIOPUTCMAP 命令设置

colormap;

fb_info:包含当前 video card 的状态信息,只有 fb_info 对内核可见;

fb_ops : 应用程序使用 ioctl 系统调用操作底层的 LCD 硬件,fb_ops 结构中定义的方法用于支持这些操作;

这些结构相互之间的关系如下所示:

framebuffer

驱动主要数据结构

接口

fbmem.c 实现了所有驱动使用的通用代码,避免了重复。

全局变量:struct fb_info *registered_fb [FB_MAX]

int num_registered_fb;

这两个变量用于记录正在使用的 fb_info 结构实例。fb_info 代表 video card 的当前状态,所有的 fb_info

结构都放在数组中。当一个 frame buffer 在内核中登记时,一个新的 fb_info 结构被加入该数组,num_registered_fb 加

1。

fb_drivers 数组:static struct {

const char *name;

int (*init)(void);

int (*setup)(void);

} fb_drivers[] __initdata= { ....};

若 frame buffer 驱动程序是静态链接到内核中,一个新的 entry 必须要加到这个表中。 若该驱动程序是使用 insmod/rmmod

动态加载到内核,则不必关心这个结构。static struct file_operations fb_ops ={

owner: THIS_MODULE,

read: fb_read,

write: fb_write,

ioctl: fb_ioctl,

mmap: fb_mmap,

open: fb_open,

release: fb_release

};

这是用户应用程序的接口,fbmem.c 实现了这些函数。

register/unregister framebuffer:register_framebuffer(struct fb_info *fb_info)

unregister_framebuffer(struct fb_info *fb_info)

这是底层 frame buffer 设备驱动程序的接口。驱动程序使用这对函数实现注册和撤销操作。底层驱动程序的工作基本上是填充 fb_info

结构,然后注册它。

linux fb设备驱动,Linux FB 驱动讲解相关推荐

  1. linux设备和驱动匹配的方法,Linux使用设备树的i2c驱动与设备匹配方式

    Linux使用设备树的i2c驱动与设备匹配有3种方式: of_driver_match_device acpi_driver_match_device i2c_match_id 源码: static ...

  2. Linux dts设备树和platform驱动详解

    概念 小麦大叔 2019-05-06 22:56:31 12603 收藏 135 什么是设备树 dts(device tree)? 设备树(Device Tree)是描述计算机的特定硬件设备信息的数据 ...

  3. linux查看设备硬件,linux查看硬件信息及驱动设备相关整理

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 联系我登录 首页 业界新闻 技术文章 资源分享 微语 linux查看硬件信息及驱动设备相关整理[转] 蓝猫 发布于:2014-5-30 17:48 分类: ...

  4. 【基于Linux系统设备树的SPI驱动编写方法】

    文章目录 前言 一.SPI驱动编写 1.修改设备树  a.设备树文件是什么?  b.设备树怎么改? 2.编写驱动 二.完善和测试 1.编译和应用程序  a.编译 && 拷贝到开发板命令 ...

  5. 全志linux led驱动程序,芯灵思Sinlinx A64 linux通过设备树写LED驱动(附参考代码,未测试)...

    #include #include #include #include #include #include #include #include #include #include #include # ...

  6. Linux操作系统的设备独立性,Linux的设备管理

    一 设备管理 在计算机系统中,除了CPU和内存之外,其余的大部分硬件设备称为外部设备.外部设备包括常用的I/O(输入/输出)设备.外存设备以及终端设备等. 1.I/O设备的类型 ●按设备的所属关系可以 ...

  7. linux cdc设备驱动程序,Linux Kernel 'cdc-wdm' USB设备驱动程序堆缓冲区溢出漏洞

    发布日期:2013-03-14 更新日期:2013-03-19 受影响系统: Linux kernel 3.x Linux kernel 2.6.x 描述: --------------------- ...

  8. linux iic设备中断,Linux设备驱动之I2C架构分析(一)

    Linux设备驱动之I2C架构分析 一:前言 I2c是philips提出的外设总线.I2C只有两条线,一条串行数据线:SDA,一条是时钟线SCL.正因为这样,它方便了工程人员的布线.另外,I2C是一种 ...

  9. linux内核 设备列表,Linux 设备树(Device Tree)(转载)

    ARM Device Tree起源 Linus Torvalds在2011年3月17日的ARM Linux邮件列表宣称 "this whole ARM thing is a f*cking ...

  10. linux dvb设备信息,Linux DVB api 笔记

    Linux DVB interface Demux 用途:硬件解复用 设备路径: /dev/dvb/adapter0/demux0 数据类型: dmx_output_t typedef enum { ...

最新文章

  1. python批量爬取文档
  2. linux 检测日志文件内容变化
  3. 关于HTTP GET请求的url中文参数编码
  4. yii2 modal弹窗之ActiveForm ajax表单异步验证
  5. 解决:SyntaxError: Non-ASCII character ‘\xe8‘ in file 1.py on line 4, but no encoding declared;
  6. java mysql 文本导入数据语句_Java利用MYSQL LOAD DATA LOCAL INFILE实现大批量导入数据到MySQL...
  7. keyshot手机渲染教程_keyshot灯光渲染基础入门教程【英】
  8. 表格列求和_excel表格制作,Excel表格的基本操作,包含制作一个表格10方面的知识...
  9. 我们如何体验 Line 的生活方式
  10. 如何快速的入门Docker并且实现部署
  11. 读者试读怎么评价这本书
  12. Shell date连接mysql执行指令
  13. HTML 转 PDF的两种实现方式
  14. 从零开始学习OpenCL开发(二)一个最简单的示例与简单性能分析
  15. idea新建一个java项目_创建第一个Java项目(Create First Java Project)
  16. java实现图片base64写入本地
  17. 专利代理机构代理专利流程
  18. 企业为什么更青睐选择第三方短信平台?
  19. 安装配置Tomcat(CentOS7)
  20. OS X Mountain Lion 系统配置 Apache+Mysql+PHP 详细教程

热门文章

  1. windows和linux之间共享文件 samba的使用
  2. 计算机应用基础三次没有通过怎么办,计算机应用基础第三次作业
  3. avue 文字点击 弹窗_目前最好用的文字转语音、视频配音方法,一键合成,智能黑科技...
  4. java 新建pdf_java-如何关闭PDF文件以重新创建它? (正在...
  5. 逻辑代数01律的理解_第十课:四个基本子空间——MIT线性代数课程学习笔记
  6. 普中28335开发攻略_带你了解TI的DSP入门芯片TMS320F28335
  7. NPM ---- 安装yarn
  8. linux筛选方式,使用grep实现精确过滤的五种方法
  9. 自动化测试神器 之 python unittest 断言
  10. MySQL 修改字段类型或长度