#导入word文档图片#linux下framebuffe(lcd)驱动编写

DS小龙哥 DS小龙哥     2022-11-29     282

关键词:

21.1 FrameBuffer 帧缓冲设备的原理

21.1.1 概念

linux系统中LCD这类设备称为帧缓冲设备,英文frameBuffer设备

frameBuffer 是出现在2.2.xx 内核当中的一种驱动程序接口。

帧缓冲(framebuffer)是Linux 系统为显示设备提供的一个接口,它将显示缓冲区抽象,屏蔽图像硬件的底层差异,允许上层应用程序在图形模式下直接对显示缓冲区进行读写操作。用户不必关心物理显示缓冲区的具体位置及存放方式,这些都由帧缓冲设备驱动本身来完成。

framebuffer机制模仿显卡的功能,将显卡硬件结构抽象为一系列的数据结构,可以通过framebuffer的读写直接对显存进行操作。用户可以将framebuffer看成是显存的一个映像,将其映射到进程空间后,就可以直接进行读写操作,写操作会直接反映在屏幕上。

21.1.2 帧缓冲的理解

用户可以将Framebuffer看成是显示内存的一个映像,将其映射到进程地址空间之后,就可以直接进行读写操作,而写操作可以立即反应在屏幕上。

这种操作是抽象的、统一的。用户不必关心物理显存的位置、换页机制等等具体细节。

这些都是由Framebuffer设备驱动来完成的。

21.1.3 了解帧缓冲设备文件

framebuffer的设备文件一般是/dev/fb0/dev/fb1等,最多支持32个设备

framebuffer是个字符设备,主设备号为29,对应于/dev/fb%d设备文件


通常,使用如下方式(前面的数字表示次设备号):

(次设备号)0 = /dev/fb0 第一个fb设备

(次设备号)1 = /dev/fb1 第二个fb 设备。


fb 也是一种普通的内存设备,可以读写其内容。

例如,屏幕抓屏:cp /dev/fb0 myfilefb;

注意,这个命令保存下来的仅是rgb数据,并不是图片格式,Window下是打不开的

(前提是framebuffer驱动里实现了read函数)


21.1.4 如何去操作这个设备文件

对程序员和Linux系统来说,framebuffer设备与其他的文件没有区别;可以通过配置对framebuffer设备文件完成对硬件的参数设置。

framebuffer映射操作

通过read()和write()进行数据的读取;

或者通过mmap()函数将内部数据映射到应用程序空间;

3)用mmap()函数把内存中的图像数据直接映射到framebuffer并显示出来,耗时短、效率高。

4)通过ioctl()可以获得显示设备的一些信息:

1-固定信息(比如显示内存大小)

2-显示模式相关的可变信息(比如分辨率、象素结构、每扫描线的字节宽度),以及伪彩色模式下的调色板信息等等;

21.2 LCD知识介绍

21.2.1了解LCD显示的色深

色深(BPP):一个像素使用多少个二进制位表示它的颜色。

一个像素使用 1 个二进制位表示它的颜色,可以有两种色,这种屏单色屏。

:一个像素使用 2 个二进制位表示它的颜色,可以有4种色,恢阶。

4BPP :

一个像素使用 8 个二进制位表示它的颜色,可以有256种色。

一个像素使用 16 个二进制位表示它的颜色,可以有65536种色,伪彩色。

这种等级 CPU一般使用这个级别的。

常用 RGB5551

一个像素使用 24 个二进制位表示它的颜色,可以有16M种色,真彩色。

RGB888

一个像素使用 32 个二进制位表示它的颜色。 增加了透明度控制。

ARGB888

所有颜色都由RGB三原色组成。通过调节三者比例程现不同颜色。

21.2.2 LCD屏的时序

要驱动一个TFT屏,首先来认识一下LCD工作时序图。在(芯片数据手册)Exynos 4412 SCP_Users Manual_Ver.0.10.00_Preliminary0.pdf的1816页,第41.3.11.2章节LCD RGB Interface Timing。

LCD的工作时序图如下:

#导入Word文档图片#


可以把LCD看成一个二维数据。从左到右,从上到下,一个点一点描绘(逐行扫描)。当最后一个点描绘完成,循环扫描。所有显示器显示图像的原理都是从上到下,从左到右的。

那么这幅图在LCD上的显示原理就是:

序号

名称

具体描述

1

像素

一副图像可以看做是一个矩形,由很多排列整齐的点一行一行组成。这些点称之为像素。

2

像素时钟信号

显示指针从矩形左上角第一行第一个点开始,一个点一个点的在LCD上显示;在上面的时序图上用时间线表示就为VCLK,我们称之为像素时钟信号。

3

1 line

当显示指针一直显示到矩形的右边就结束这一行,那么这一行的动作在上面的时序图中就称之为1 Line

4

行切换

接下来显示指针又回到矩形的左边从第二行开始显示;

注意,显示指针在从第一行的右边回到第二行的左边是需要一定的时间的。

我们称之为行切换

5

HSYNC

如此类推,显示指针就这样一行一行的显示至矩形的右下角才把一副图显示完成。因此,这一行一行的显示在时间线上看,就是时序图上的HSYNC。

6

然而,LCD的显示并不是对一副图像快速的显示一下,为了持续和稳定的在LCD上显示,就需要切换到另一幅图上(另一幅图可以和上一副图一样或者不一样,目的只是为了将图像持续的显示在LCD上)。那么这一副一副的图像就称之为

在时序图上就表示为1 Frame,因此从时序图上可以看出1 Line只是1 Frame中的一行;

7

帧切换

同样的,在帧与帧切换之间也是需要一定的时间的,我们称之为帧切换

8

VSYNC

那么LCD整个显示的过程在时间线上看,就可表示为时序图上的VSYNC

LCD提供的外部接口信号说明

(Synchronization:同步,vertical:垂直,horizontal:水平)

名称

具体描述

VSYNC

垂直同步信号(TFT)/帧同步信号(STN),标志新的一屏数据开始扫描。

HSYNC

水平同步信号(TFT)/行同步脉冲信号(STN)

VDEN

数据使能信号(TFT)/LCD驱动交流偏置信号(STN)

VD[23:0]

LCD像素数据输出端口(TFT/STN)

VCLK

象素时钟信号(TFT/STN)

LEND

行结束信号(TFT)/SEC TFT信号

上面时序图上各时钟延时参数的含义如下

(这些参数的值,LCD产生厂商会提供相应的数据手册)。

名称

对应驱动中变量

具体描述

VBPD

upper_margin

表示在一帧图像开始时,垂直同步信号以后的无效的行数。

VFBD

lower_margin

表示在一帧图像结束后,垂直同步信号以前的无效的行数。

VSPW

vsync_len

表示垂直同步脉冲的宽度,用行数计算。

HBPD

left_margin

表示从水平同步信号开始到一行的有效数据开始之间的VCLK的个数。

HFPD

right_margin

表示一行的有效数据结束到下一个水平同步信号开始之间的VCLK的个数。

HSPW

hsync_len

表示水平同步信号的宽度,用VCLK计算

它们的英文全称

VBPD(vertical back porch) :垂直后肩

VFBD(vertical front porch) :垂直前肩

VSPW(vertical sync pulse width):垂直同步脉冲宽度


HBPD(horizontal back porch):水平前肩

HFPD(horizontal front porth):水平后肩

HSPW(horizontal sync pulse width):水平同步脉冲宽度

LINEVAL: 屏实际高度-1。

HOZVAL: 屏实际宽度-1。

像素时钟信号:一个像素时钟(时间)扫描一个点。

帧:由行组成

行:由像素组成

扫描过程

发起帧同步信号-->行同步信号-->像素时钟信号 (三种信号是同步出现)。

21.2.3时序参数的值

以上参数都是由LCD屏厂家提供的。参考光盘资料:

Disk-A\\Datasheet\\LCD\\S700-AT070TN92.pdf


在以上文档的14页,我们一般用的是经典值。

#导入Word文档图片#


#导入Word文档图片#


除了以上的时序参数外,还要注意LCD控制器的默认时序极性LCD屏的时序极性是否相同,不同则配置为相同。(VSYNC,HSYNC,DEN,像素采样边沿)。


21.3 应用层FrameBuffer 帧缓冲设备编程(LCD屏编程)

在Linux 系统中LCD的应用程序编程是有特定编写模板的。下面我们就一步一步的来编写linux下的lcd应用程序。

21.7.1 编程步骤

(1) 打开/dev/fbX

fp = open ("/dev/fb0",O_RDWR);

Open的第一个参数:/dev/fbx,打开lcd设备文件,lcd设备文件在dev目录下都是以fb*存在的。

得到一个可代表这个设备文件的文件描述符。

(2) 获取可变参数、固定参数

  • 如:要获取可变参数

那么就定义一个变量来存放这个可变参数:

struct fb_var_screeninfo vinfo;


然后用ioctl接口实现数据的传递:

ioctl(fp,FBIOGET_VSCREENINFO,&vinfo)//可变参数

既然我们要获取参数,那么ioctl方向肯定是从内核到应用空间;

根据FBIOGET_VSCREENINFO命令,从fbX设备文件中获取对应的数据,存放在vinfo指向的结构中。

具体是什么结构的数据就看从内核传递上来是什么数据了。

FBIOGET_VSCREENINFO命令命名方式可以分解如下:

FB IO GET_V SCREEN INFO

这样就可以直观的看出来,是获取屏幕的可变信息。

如:要获取固定参数

同样也定义一个变量来存放这个固定参数:

struct fb_fix_screeninfo finfo; //固定参数


通过lcd驱动提供的iotcl接口获取:

ioctl(fp,FBIOGET_FSCREENINFO,&finfo)//固定参数


(3)计算屏幕大小(字节为单位)

计算屏幕大小是为了后面的mmap函数使用,这个屏幕大小是根据可变参数来计算的,公式如下:

屏幕内存大小 = 分辨率*(bpp/8)

(x方向分辨率)* (y方向分辨率)*(bpp/8)

屏幕的一个点就是x方向的32位数据和y方向的32数据构成。

其中Bpp/8意义是每一个像素占用了多少个字节。即32/8=4byte。

我们可以看出来,屏幕内存大小是以字节为单位的。

如:

screensize = vinfo.xres * vinfo.yres * vinfo.bits_per_pixel/8;

这个screensize有何用处呢,就是给mmap函数去映射空间时使用的。


(4)内存映射(mmap函数)

Linux下一切都是文件,我们在对Lcd设备文件操作就是对lcd屏进行了操作。

我们一般想到对屏的操作方法:

1- LCD操作可以像其他字符设备一样可以调用read,write,对lcd屏进行操作;

但是出于效率考虑,一般不这样操作。

#导入word文档图片#linux下时间处理相关函数介绍

​1.1Linux下RTC时间的读写分析​1.1.1系统时间与RTC时间​Linux系统下包含两个时间:系统时间和RTC时间。系统时间:是由主芯片的定时器进行维护的时间,一般情况下都会选择芯片上最高精度的定时器作为系统时间的定时基准,以... 查看详情

#导入word文档图片#linux下内核微线程tasklet

 内核微线程和内核定时器,共享工作队列一样,也可以用于推后执行某些代码。​tasklet(小任务)机制是中断处理下半部分最常用的一种方法,其使用也是非常简单的。​Tasklet内核的实现机制和内核定时器差不多,也是软... 查看详情

#导入word文档图片#linux下gdb调试工具的运用

一、GCC编译器的常用选项使用GCC编译器的时候,我们必须给出一系列必要的调用参数和文件名称。GCC编译器的调用参数大约有100多个,这里只介绍其中最基本、最常用的参数。GCC最基本的用法∶gcc[参数][文件名称]常用的参数如... 查看详情

#导入word文档图片#linux三剑客

linux三剑客​Linux中的三个命令awk、sed、grep在业界被称为“三剑客”,grep擅长查找,sed擅长取行和替换,awk擅长运算。​我们知道Linux下一切皆文件,对Linux的操作就是对文件的处理,那么怎么能更好的处理文件呢?这就要用到... 查看详情

#导入word文档图片#linux下i2c驱动架构全面分析

物理接线​I2C总线在物理连接上非常简单,分别由SDA(串行数据线)和SCL(串行时钟线)及上拉电阻组成。通信原理是通过对SCL和SDA线高低电平时序的控制,来产生I2C总线协议所需要的信号进行数据的传递。在总线空闲状态时,这两... 查看详情

#导入word文档图片#linux平台设备驱动模型

​16.1平台设备和驱动初识​16.1.1总线驱动模型简介​在Linux2.6的设备驱动模型中,关心总线、设备和驱动这3个实体,总线将设备和驱动绑定。在系统每注册一个设备的时候,会寻找与之匹配的驱动;相反的,在系统每注册一个... 查看详情

#导入word文档图片#根文件系统制作与挂载

开发环境介绍虚拟机版本:商业版11.1.0build-2496824发行版环境:Ubuntu_15.0432位嵌入式Linux内核版本:3.5交叉编译器arm-linux-gcc版本:4.5.11.1busybox介绍​BusyBox是一个集成了一百多个最常用linux命令和工具的软件。BusyBox包含了一些简单... 查看详情

#导入word文档图片#阻塞与非阻塞io操作

Linux内核版本:linux3.5​1.1简介​阻塞操作是指在执行设备操作时若不能获得资源则挂起进程,直到满足可操作的条件后再进行操作。被挂起的进程进入休眠状态,从CPU调度器的运行队列中移走,直到等待的条件被满足。而非阻... 查看详情

java添加水印到word文档

...本水印图片水印使用工具:FreeSpire.DocforJava(免费版)Jar导入:方法1:通过官网下载jar文件包。下载后,解压文件,并将lib文件夹下的Spire.Doc.jar文件导入java程序。参考如下导入效果:方法2:通过maven导入 查看详情

csdn的blog可以直接导入内含图片的word文档吗?

目前大部分的博客作者在用Word写博客这件事情上都会遇到以下3个痛点:1.所有博客平台关闭了文档发布接口,用户无法使用Word,WindowsLiveWriter等工具来发布博客。使用Word写博客需要在第三方博客平台注册帐号,且需要第三方博... 查看详情

如何把proe的三维图像导入到word文档中。

4个办法,一是拷屏后打开windows自带的画图软件中粘贴,框出需要的图像再复制,在绘图软件中新建文件,粘贴,保存为bmp或jpg图片。二是在proe中打开模型,菜单:文件-保存副本-格式选tiff或jpg,可保存成图片。三是用proe中的渲... 查看详情

如何用php和html做一个附件上传的页面?

...多种功能进行各种有效的自定义,具体如下:Excel工作表导入(V4.3)eWebEditor最新提供Excel工作表导入解决方案,支持Excel中图片、图表的导入并自动上传到服务器。并提供了是否使用VML格式的导入选项,如不使用VML格式,则在导入... 查看详情

急!!!word文档中:当文件收保护状态下,无法替换图片!

我在word文档中,“开发工具”---添加“图片内容控件”---“保护文档。”可是发现,当保护后图片内容控件无法替换图片?请教高手,能不能帮我想想办法,在文档保护的状态下,使用图片内容控件的同时,能够自由替换图片... 查看详情

如何将word中的图片和文字导入自己的博客中

参考技术A如何将word中的图片和文字导入自己的博客中方法一:首先,选中要截的图,选择保存为BMP或JPG格式。然后,将光标放到自己博客中要插入图片的位置,然后找到刚才保存的图片,上传,确定,插入即可。方法二:1、打... 查看详情

vba批量导入图片到多word文档并加标题(会飞的鱼)(代码片段)

感谢会飞的鱼大牛~1Publicfp$,obmappAsObject2Subkk()3文件夹浏览器4Application.ScreenUpdating=False5Setfso=CreateObject("scripting.filesystemobject")6Iffp=""ThenExitSub7Setff=fso.getfolder(fp)8Forx=1To179Documents.Add 查看详情

vue导出word文档,支持表格和图片(代码片段)

一、导入包npminstalldocxtemplaternpminstallpizzipnpminstalljszipnpminstalljszip-utilsnpminstallfile-savernpminstalldocxtemplater-image-module-freenpminstallangular-expressionsnpminstallimage-size二、utils 文件夹下添加 word.js 导出word的方法/**@Description:*@Version:1.0*&... 查看详情

vue导出word文档,支持表格和图片(代码片段)

一、导入包npminstalldocxtemplaternpminstallpizzipnpminstalljszipnpminstalljszip-utilsnpminstallfile-savernpminstalldocxtemplater-image-module-freenpminstallangular-expressionsnpminstallimage-size二、utils 文件夹下添加 word.js 导出word的方法/**@Description:*@Version:1.0*&... 查看详情

vue导出word文档,支持表格和图片(代码片段)

一、导入包npminstalldocxtemplaternpminstallpizzipnpminstalljszipnpminstalljszip-utilsnpminstallfile-savernpminstalldocxtemplater-image-module-freenpminstallangular-expressionsnpminstallimage-size二、utils 文件夹下添加 word.js 导出word的方法/**@Description:*@Version:1.0*&... 查看详情