0 引言

Linux是一类Unix计算机操作系统的统称。Linux操作系统的内核的名字也是“Linux”。Linux操作系统也是自由软件和开放源代码发展中着名的例子。严格来讲,Linux这个词本身只表示Linux内核,但在实际上人们已经习惯了用Linux来形容整个基于Linux内核,并且使用GNU 工程各种工具和数据库的操作系统。

随着世界经济的迅速发展,液晶显示屏广泛应用于手机、PDA、金融终端等电子产品上,而在嵌入式电子领域,Linux操作系统占有越来越大的市场份额。因而本文提出在嵌入式Linux平台上实现液晶显示器的功能,详细叙述了液晶显示屏在SEP4020微处理器为基础的平台上的Framebuffer驱动程序设计。

1 液晶显示器原理

1.1 液晶显示器种类

液晶显示器(LCD)根据驱动方式可以分为静态驱动、简单矩阵驱动以及主动矩阵驱动三种。其中,简单矩阵型又可以再分为扭转向列(TN)和超扭转式向列型(STN)两种,而主动矩阵则以薄膜式晶体管(TFT)为主流。

LCD液晶投影机是液晶显示技术和投影技术相结合的产物,它利用了液晶的电光效应,通过电路控制液晶单元的透射率及反射率,从而产生不同灰度层次及多达1670万种色彩的靓丽图像。LCD投影机的主要成像器件是液晶板。LCD投影机的体积取决于液晶板的大小,液晶板越小,投影机的体积也就越小。

TN型技术是LCD中基本的,其他种类的LCD都以TN型为基础改进而得。TN型LCD显示质量很差,色彩单一、对比度低,反应速度很慢,故主要应用于简单的数字符与文字的显示,如电子表以及电子计算器等。STN LCD的显示原理与TN类似,区别在于TN型的液晶分子将入射光旋转90°,而STN可将入射光旋转180°到270°。STN改善了TN视角狭小的缺点,并提高了对比度,显示品质较TN高。

TFT型LCD中,晶体管矩阵依显示信号开启或者关闭液晶分子的电压,使液晶分子轴转向而成"亮"或者"暗"的对比,避免了显示器对电场效应的依靠。因此,TFTLCD显示质量较TN/STN更佳,画面显示对比度可达150:1以上,反应速度逼近30ms甚至更快,适用于PDA、笔记本电脑、数码相机、MP4等。

1.2 液晶显示器时序

图1为LCD的典型时序图。时序图中VFRAME为帧同步信号,VLINE为行同步信号,VCLK为像素时钟信号(用于锁存图像数据的像素时钟),VM为数据有效标志信号,VD为图像的数据信号。

作为帧同步信号的VFRAME,每发出一个脉冲,都意味着新的一屏图像数据开始发送。而作为行同步信号的VLINE,每发出一个脉冲都表明新的一行图像资料开始发送。在帧同步以及行同步的头尾都必须留有回扫时间。

1.3 LCD显示器的工作原理

从液晶显示器的结构来看,无论是笔记本电脑还是桌面系统,采用的LCD显示屏都是由不同部分组成的分层结构。LCD由两块玻璃板构成,厚约1mm,其间由包含有液晶材料的5μm均匀间隔隔开。因为液晶材料本身并不发光,所以在显示屏两边都设有作为光源的灯管,而在液晶显示屏背面有一块背光板(或称匀光板)和反光膜,背光板是由荧光物质组成的可以发射光线,其作用主要是提供均匀的背景光源。

背光板发出的光线在穿过层偏振过滤层之后进入包含成千上万液晶液滴的液晶层。液晶层中的液滴都被包含在细小的单元格结构中,一个或多个单元格构成屏幕上的一个像素。在玻璃板与液晶材料之间是透明的电极,电极分为行和列,在行与列的交叉点上,通过改变电压而改变液晶的旋光状态,液晶材料的作用类似于一个个小的光阀。在液晶材料周边是控制电路部分和驱动电路部分。当LCD中的电极产生电场时,液晶分子就会产生扭曲,从而将穿越其中的光线进行有规则的折射,然后经过第二层过滤层的过滤在屏幕上显示出来。

液晶显示技术也存在弱点和技术瓶颈,与CRT显示器相比亮度、画面均匀度、可视角度和反应时间上都存在明显的差距。其中反应时间和可视角度均取决于液晶面板的质量,画面均匀度和辅助光学模块有很大关系。

对于液晶显示器来说,亮度往往和他的背板光源有关。背板光源越亮,整个液晶显示器的亮度也会随之提高。而在早期的液晶显示器中,因为只使用2个冷光源灯管,往往会造成亮度不均匀等现象,同时明亮度也不尽人意。一直到后来使用4个冷光源灯管产品的推出,才有很大的改善。

由上便可看出,液晶面板的质量并不能完全代表液晶显示器的品质,没有出色的显示电路配合,再好的面板也不能做出性能优异的液晶显示器。随着LCD产品产量的增加、成本的下降,液晶显示器会大量普及。

2 硬件平台

本设计采用的硬件平台是基于东南大学国家专用集成电路系统工程中心研发的SEP4020微处理器的开发板。该处理器是使用0.18μ m标准CMOS的工艺设计,内嵌ASIX CORE(32位RISC内核兼容ARM720T,带8 kB指令数据cache和全功能MMU),采用冯诺依曼结构的一款微处理器。工作过程是LCDC使能后申请系统总线,获得总线使用权后读取需要显示的数据,数据经过相应算法的处理就得到满足时序要求的信号,送到LCDC显示驱动器。

LCDC使用内嵌的DMA方式进行数据操作,配备一个深度为16的32位FIFO用于缓存显示数据,支持1、2、4位的STN灰度显示和16位TFT彩色显示,分辨率软件可配置。相关的需要配置的寄存器有:

SSA为屏幕起始寄存器;SIZE为屏幕尺寸寄存器;PCR为面板配置寄存器;HCR为水平配置寄存器;VCR为垂直配置寄存器:PWMR为对比度控制器;LECR为使能控制寄存器;DMACR为DMA控制寄存器。

3 L i nux驱动软件设计实现

3.1 驱动结构体的介绍

3.1.1.fb_jnfo结构体

帧缓冲设备关键的一个数据结构体是fb info结构体,其中包含了关于帧缓冲设备属性和操作的完整描述,定义如下:

限于篇幅,只列出了部分成员,其中fb_var_screeninfo记录用户可以修改的显示控制器参数,包括屏幕分辨率和每个像素的比特数等;fb_fix_screeninfo记录用户不能修改的显示控制器参数;cmap为目前的颜色表;fb_ops为帧缓冲操作函数集;screen_base为帧缓冲的虚拟基地址;i oremapped的虚拟内存大小;pseudo_palette为伪16色的颜色表。

3.1.2.fb_ops结构体

本结构体为指向底层操作的函数的指针,这些函数是需要驱动程序开发人员编写填充的,部分成员定义如下

fb_check_var ()用于调整可变参数,并修整为硬件支持的值;fb_set_par()则根据屏幕参数设置具体读写LCD控制器的寄存器以使得LCD控制器进入相应的工作状态,使用户设置的屏幕参数在硬件上有效;f bsetcolreg ()成员函数实现伪颜色表和颜色表的填充。

3.1.3.fb_var_screeni nfo

本结构体定义了用户可以修改的显示控制器参数,部分成员如下:

本结构体中,xres为屏幕的水平像素数;yres为屏幕垂直宽度:bits_per_pixel定义每个像素由多少个位表示;pixclock定义了像素时钟;left_margin是表示行切换中从同步到绘图之间的延迟;right_margin表示行切换中从绘图到同步之间的延迟;upper_margin表示帧切换中从同步到绘图之间的延迟;lower_margin表示帧切换中从绘图到同步之间的延迟;hsyn_len表示水平同步的长度;vsync_len表示垂直同步的长度。

3.2 Linux帧缓冲设备的模块加载和卸载函数

由于LCD控制器被集成在SOC芯片上作为一个独立的硬件模块,也就是platform_device而存在,因此本驱动中包含平台驱动。首先我们要定义platform_driver结构体:

定义了此结构体之后,在帧缓冲设备的模块加载函数sep4020fb_init(void)中,我们只需要使用函数platform_driver_register(&sep4020fb_driver)注册平台驱动,而其余大部分的初始化工作移交到平台驱动的探测函数sep4020fb_probe中完成。

在函数sep4020fb_probe(struct platform_device*pdev)中,首先要申请SEP4020的帧缓冲信息结构体:structsep4020fb_info*info,在此结构体中,成员sep4020fb_ma c h_i n f o记录了seP4020帧缓存的机器信息,sep4020fb_hw包含了sep4020微处理器LCD控制器所涉及到的所有寄存器的信息,screen_dma表示帧缓存的物理地址,而screen_cpu代表了帧缓存的虚拟地址。之后要为sep4020fb_mach_info申请内存空间,申请完毕之后就要初始化fb_info结构体中的固定和可变参数,即填充fb_var_screeninfo var和fb_fix_screeninfo fix成员。首先通过fb_info一>fbops=&sep4020fb_ops将为sep4020微处理器定义的函数操作结构体赋予帧缓存信息结构体中对应的成员,sep4020fb_ops定义了指向底层操作的一系列函数。

完成可变参数和固定参数的填充之后,要为本驱动申请中断资源,具体函数为requestirq(irq,sep4020fb_irq,SA INTERRUPT,pdev一>name,info),irq为请求的中断号,sep4020fb_irq为中断处理服务子程序,SA_INTERRUPT表示为一个快速中断处理,在执行中断的过程中禁止所有在当前处理器上的其他中断。申请中断完毕之后,就要完成本驱动关键步骤,调用sep4020fb_map_video_memory()函数申请显示缓冲区。函数返回值为申请的帧缓存的起始位置的虚拟地址,fbi一>map_dma代表的是该位置的物理地址,fbi一>map_si ze为此内存区的大小。

完成上面的工作之后,驱动程序在就有了一块内存区域作为帧缓冲,向此区域写入数据就能显示在液晶屏上。后面还要调用sep4020fb_init_registers(info)函数初始化L C D控制器的寄存器;然后调用sep4020fb_check_var(&fbinfo一>var,fbinfo)检查可变参数,调用register_framebuffer(fbinfo)注册帧缓冲设备。

3.3 提供给应用程序的接口

本驱动设计定义了如下几个接口供应用程序调用:fb_ioctl,fb_blank,fb_fillrect.

部分代码如下:

sep4020_blank函数主要实现了将液晶屏清屏的功能。

sep4020fb_fillrect函数实现了填充液晶屏一块矩形区域的功能。

FBIOGET_FSCREENINFO表示用户获得屏幕的固定参数;

FBIOBLANK表示调用sep4020fb_blank函数清空液晶屏;

FBIOPUTCMAP表示设置屏幕的颜色表;

FBIOGETCMAP表示获得颜色表。

3.4 用户空间对帧缓冲设备进行访问

驱动程序经过编译并加载为模块后,成为/dev/fb0设备,在应用程序中,操作/dev/fb0一般遵循如下步骤:1)打开/dev/fb0设备文件;2)调用ioctl()操作取得屏幕的参数,如屏幕分辨率和每个像素所占的比特数,进而计算出显示缓冲区的大小;3)将屏幕缓冲区映射到用户空间;4)映射之后就可以向缓冲区写入或者读出数据,进行绘图了。

4 测试与结论

根据前面论述的步骤向屏幕缓冲区写入数据,将每个像素的值设为0xF0F0,在屏幕上显示如下图像:

测试结果显示,在本课题驱动模块的支持下,可以向屏幕缓冲区写入数据并正确地在屏幕上显示出来,工作完全正常。本文所提出的设计方案已经应用在本单位某产品上。

:

linux中fb0和fb1同时显示数据,Linux frame buffer驱动设计与实现相关推荐

  1. linux下读取ntfs数据,在Linux中读取NTFS分区上的数据

    在Linux中读取NTFS分区上的数据 在有些情况下,系统需要访问本地NTFS分区上的数据,也可能需要访问网络上NTFS文件格式的数据.而使用mount -t挂载文件系统时,系统报告不支持NTFS错误 ...

  2. linux驱动画点函数,​linux中使用gnuplot使您的数据可视化

    linux中使用gnuplot使您的数据可视化 基础 通过在 shell 命令提示符中输入 gnuplot 启动 gnuplot.您首先看到提示符号 >.该提示符是进入 gnuplot 的输入点 ...

  3. Linux中使用du -d n 显示当前文件目录下文件夹的大小

    Linux中使用du -d n 显示当前文件目录下文件夹的大小 du -d n 其中 du 代表disk usage 硬盘使用 d 代表directory n 代表显示当前目录下文件夹的层数 root ...

  4. ASP.NET Core 3.1 Web API和EF Core 5.0 中具有泛型存储库和UoW模式的域驱动设计实现方法

    目录 介绍 背景 领域驱动设计 存储库模式 工作单元模式 使用代码 创建空白解决方案和解决方案架构 添加和实现应用程序共享内核库 PageParam.cs 在Entity Framework Core ...

  5. Linux中如何使用Wireshark来分析数据包?

    学习分析网络数据包是一项强大的技能. 当连接到网络后,大多数情况下我们不会去考虑实现这一切的底层网络协议.现在,当你阅读本文时,计算机正在交换大量数据包并通过Internet进行传输. 要了解这些协议 ...

  6. Linux两个进程交换信息,如何在Linux中的进程之间交换二进制数据

    我需要创建一个可以进行无线网络扫描的linux应用程序,将结果放入一个结构中并以某种方式将其发送到另一个将使用该数据的主应用程序.我最初的想法是在主应用程序中创建一个管道,fork并通过execl启动 ...

  7. linux中安shell怎么传入参数,【linux】linux 下 shell命令 执行结果赋值给变量【两种方式】...

    方法1:[通用方法] 使用Tab键上面的反引号 例子如下: find命令 模糊查询在/apps/swapping目录下 查找 文件名中包含swapping并且以.jar结尾的文件 使用反引号 引住命令 ...

  8. linux中mkfs是什么命令,如何在Linux中使用mkfs命令[用于磁盘格式化]

    mkfs中的字母代表"制作文件系统".命令通常用于管理Linux中的存储设备,你可以将mkfs看作是将磁盘格式化为特定文件系统的命令行工具.mkfs -t [fs type] [t ...

  9. linux中fstab文件的作用,如何在Linux上写入fstab文件 | MOS86

    在Linux计算机上添加新的硬盘驱动器或固态驱动器? 您需要编辑fstab文件. 很多人觉得这个主意很吓人. 是的,至关重要的是您要正确,但掌握了正确的知识,这确实并不困难. 我们将引导您完成编辑fs ...

  10. linux中文件记录的时间参数,【Linux】stat命令查看文件的三个时间参数

     在Windows中创建一个文件都会有相应的创建时间,修改时间,访问时间来记录文件的一些属性.在Linux中也不例外,文件也有三个时间来记录文件的变动,这三个时间分别是Modification t ...

最新文章

  1. grape动态PHP结构(三)——API接口
  2. 一天搞定CSS: 清除浮动(float)--13
  3. 论文浅尝 - AAAI2020 | 小样本知识图谱补全
  4. flutter推荐路由器插件:go_router
  5. 编写iPhone应用程序有何不同
  6. JSP九大内置对象以及作用
  7. photoshop cc 2019 下载教程
  8. Flutter中使用connectivity实现网络检测
  9. segno-纯Python语言的二维码和微二维码生成器
  10. laravel安装barryvdh/laravel-snappy 笔记
  11. 云中和花木_王者荣耀:体验服英雄重大调整,云中君成野王,妲己射程加强,花木兰重回巅峰...
  12. LeetCode 【算法专栏】 【图】
  13. STM32L476rg 低功耗模式关系梳理以及stm32duino Lowpower库的调用关系梳理
  14. OFDM学习笔记(六)(峰均值问题)
  15. TexStudio提示:无法启动build view xelatex
  16. 【Python入门】Python的Dict容器一
  17. The producer group has been created before
  18. html 5 压缩zip,Zip
  19. 计算机网络双语常用词汇,计算机网络协议词汇Protocols
  20. 计算机病毒是在哪里产生的,计算机病毒如何产生

热门文章

  1. webpack项目使用eslint建立代码规范
  2. Swift中的Array数组遍历
  3. 新浪博客中特殊字符不显示的问题
  4. hdu 1907 John (Nim变形)
  5. rust投递箱连接箱子_海门市围板箱定制围板箱内衬
  6. 算法学习——递归和排列组合
  7. gc日志怎么看_JVM探秘:GC日志收集与分析
  8. OpenCV-图像处理(28、轮廓发现(find contour in your image))
  9. java json web token_一分钟简单了解JSON Web Token
  10. andpods授权码订单号分享_Axure 9.0学生免费授权申请详细步骤