嵌入式linux开发lcd设备驱动的学习

嵌入式系统中使用的linux OS的话,lcd的开发主要内容就是LCD设备驱动的移植,使用芯片SDK中现有的LCD框架做修改,在linux版本3.10之前没有使用dts和这之后使用的dts,还是有些区别的。主要修改调试的地方如:平台设备文件或者是dts节点内容,这需要根据具体使用的操作系统而定。以完成对LCD的驱动工作。

但是在这起之前还是有很多的基本概念需要清楚。

以下来自网络。

FrameBuffer 的原理:在linux系统中中LCD这类设备称为帧缓冲设备,英文frameBuffer设备。

用户可以将Framebuffer看成是显示内存的一个映像,将其映射到进程地址空间之后,就可以直接进行读写操作,而写操作可以立即反应在屏幕上。这种操作是抽象的,统一的。用户不必关心物理显存的位置、换页机制等等具体细节。这些都是由Framebuffer设备驱动来完成的。

framebuffer的设备文件一般是 /dev/fb0、/dev/fb1 等,framebuffer最多支持32个设备。framebuffer是个字符设备,主设备号为29,对应于/dev/fb%d设备文件。通常,使用如下方式(前面的数字表示次设备号)0 = /dev/fb0 第一个fb 设备1 = /dev/fb1 第二个fb 设备。 fb 也是一种普通的内存设备,可以读写其内容。例如,屏幕抓屏:cp /dev/fb0 myfilefb,注意,这个命令保存下来的仅是rgb数据,并不是图片格式,Windown下是打不开的。

对程序员和Linux系统来是,framebuffer设备与其他的文件没有区别,可以通过配置对framebuffer设备文件完成对硬件的参数设置,framebuffer映射可以通过read()和write()进行数据的读取,或者通过mmap()函数将内部数据映射到应用程序空间,通过ioctl()可以获得显示设备的一些固定信息(比如显示内存大小)、与显示模式相关的可变信息(比如分辨率、象素结构、每扫描线的字节宽度),以及伪彩色模式下的调色板信息等等,用mmap()函数把内存中的图像数据直接映射到framebuffer并显示出来耗时短、效率高。

Framebuffer对应的源文件在linux/drivers/video/目录下。总的抽象设备文件为fbcon.c,在这个目录下还有与各种显卡驱动相关的源文件。帧缓冲(FrameBuffer)驱动程序主要依靠4个数据结构。这些结构定义在 include/linux/fb.h程序内。它们分别是fb_info、fb_var_screeninfo、fb_fix_screeninfo和 fb_monospecs。后3个结构可以在用户空间访问,结构 fb_info只能在内核空间访问。其内部定义了struct fb_ops, 结构fb_ops成员就是由一系列Framebuffer 操作函数组成。下图是Framebuffer的简单层次图。

 

核心层的代码以fbmem.c为主,核心层包括许多与具体硬件无关的代码,并且提供了API给用户空间。用户空间使用系统调用,系统调用会使用相应的API函数,最后会调用驱动层实现功能。对于不同的设备,驱动层的代码将有所不同。

帧缓冲设备驱动有固定编程框架,首先定义一个帧缓冲结构,第二,填充这个结构,第三使用核心层提供注册函数注册这个结构,这样完成帧缓冲设备驱动的编写。


芯片LCD的硬件资源的分析,以s3c2440为例:

数据手册中描述S3C2440内部的LCD控制器:

  1. LCD控制器由REGBANK、LCDCDMA、TIMEGEN、VIDPRCS寄存器组成;
  2. REGBANK由17个可编程的寄存器组和一块256*16的调色板内存组成,它们用来配置LCD控制器的;
  3. LCDCDMA是一个专用的DMA,它能自动地把在侦内存中的视频数据传送到LCD驱动器,通过使用这个DMA通道,视频数据在不需要CPU的干预的情况下显示在LCD屏上;
  4. VIDPRCS接收来自LCDCDMA的数据,将数据转换为合适的数据格式,比如说4/8位单扫,4位双扫显示模式,然后通过数据端口VD[23:0]传送视频数据到LCD驱动器;
  5. TIMEGEN由可编程的逻辑组成,他生成LCD驱动器需要的控制信号,比如VSYNC、HSYNC、VCLK和LEND等等,而这些控制信号又与REGBANK寄存器组中的LCDCON1/2/3/4/5的配置密切相关,通过不同的配置,TIMEGEN就能产生这些信号的不同形态,从而支持不同的LCD驱动器(即不同的STN/TFT屏)。框图上控制器引出了很多线:数据线,控制线。这些接口占用的是GPC,GPD,这一点可以从数据手册第9章,GPIO章节中看到(也就是第276页第277页)。

lcd工作时序参数分析

要驱动一个TFT屏,首先我们得先认识一下LCD控制器的工作时序。

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

VSYNC :垂直同步信号(TFT)/帧同步信号(STN) ;

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

VCLK :象素时钟信号(TFT/STN) ;

VD[23:0]:LCD像素数据输出端口(TFT/STN  );

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

LEND :行结束信号(TFT)/SEC TFT信号;

上面时序图上各时钟延时参数的含义如下:(这些参数的值,LCD产生厂商会提供相应的数据手册)

VBPD(vertical back porch):表示在一帧图像开始时,垂直同步信号以后的无效的行数,对应驱动中的upper_margin;

VFBD(vertical front porch):表示在一帧图像结束后,垂直同步信号以前的无效的行数,对应驱动中的lower_margin;

VSPW(vertical sync pulse width):表示垂直同步脉冲的宽度,用行数计算,对应驱动中的vsync_len;

HBPD(horizontal back porch):表示从水平同步信号开始到一行的有效数据开始之间的VCLK的个数,对应驱动中的left_margin;

HFPD(horizontal front porth):表示一行的有效数据结束到下一个水平同步信号开始之间的VCLK的个数,对应驱动中的right_margin;

HSPW(horizontal sync pulse width):表示水平同步信号的宽度,用VCLK计算,对应驱动中的hsync_len;

对于以上这些参数的值将分别保存到REGBANK寄存器组中的LCDCON1/2/3/4/5寄存器中:(对寄存器的操作请查看S3c2440数据手册LCD部分)

LCDCON1:17 - 8位CLKVAL

         6 - 5位扫描模式(对于STN屏:4位单/双扫、8位单扫)

         4 - 1位色位模式(1BPP、8BPP、16BPP等)

LCDCON2:31 - 24位VBPD

         23 - 14位LINEVAL

         13 - 6位VFPD

         5 - 0位VSPW

LCDCON3:25 - 19位HBPD

         18 - 8位HOZVAL

         7 - 0位HFPD

LCDCON4:7 - 0位HSPW

LCDCON5:主要是配置以上信号的极性以及像素时钟的采样边沿的,这些参数要用s3c2440的时序和所使用的屏时序图进行对比。比如mini2440以前使用过一个屏TopPoly-TD035STED4,它的时序图如下:

这个图和s3c2440的lcd控制器正常时序图相比,可以发现VSYNC,HSYNC信号极性是相反的,VDEN信号是相同的,像素时钟采样时刻是上升沿。所以LCDCON5相应位就要配置为反转功能。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值