linux驱动之LCD(无framebuffer)

Posted 『流浪的Coder』

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux驱动之LCD(无framebuffer)相关的知识,希望对你有一定的参考价值。

<简介>

a:什么是液晶
物质一般有三态,固态,气态,和液态。这只是一种比较大致的划分,但是有些物质介于液体和固体之间——液晶。一般固体的分子或原子都由固定的排列方式,但是液晶介于固体和液体之间,具有流动性和排列性,可以用磁场来改变液晶的排列方式。
b:LCD背光
场致发光(Electro-Luminescent),寿命5000-10000小时,常用于小型灰度LCD(俗称黑白)
冷阴极荧光灯(cold cathode fluorecsent lamp),寿命超过250000小时(原理:对填充惰性气体的密闭正空管通高压电,惰性气体电离产生紫光,紫光照射到荧光粉上产生可见关)。常作为彩色LCD的背光。
发光二极管(lightemitting diode),寿命超过100000小时。
 
c:LCD显示器分类
扭曲向列型(TN):只能显示黑白颜色
超扭曲向列型(STN):用于显示彩色 
双层超扭曲向列型(DSTN):用于显示彩色,显示的颜色比STN更加细腻
c-1:以上显示器都有一个共同的缺点就是,在小屏幕下表象良好,但是在屏幕较大时,液晶显示时间较慢
薄膜晶体型(TFT)
 
注意:
其中TN-LCD,STN-LCD,DSTN-LCD其显示原理基本相同,区别仅仅是扭曲的角度不同而已。
TFT-LCD使用的是一种和TN-LCD,STN-LCD,DSTN-LCD完全不同的显示原理
 
<LCD驱动主要完成的工作>
a:结构图
 
b:分析

b-1:大体寄存器功能

从上面结构图可以看出:整个lcd控制器大致可以由REGBANKLCDCDMATIMEGENVIDPRCS寄存器几个部分组成。

b-1-1:REGBANK17可编程的寄存器组和一块256*16的调色板内存组成,它们用来配置LCD控制器的

 

b-1-2:LCDCDMA是一个专用的DMA,它能自动地把在侦内存中的视频数据传送到LCD驱动器,通过使用这个DMA通道,视频数据在不需要 CPU的干预的情况下显示在LCD屏上

 

b-1-2:VIDPRCS接收来自LCDCDMA的数据,将数据转换为合适的数据格式,比如说4/8位单扫,4位双扫显示模式,然后通过数据端口VD[23:0]传送视频数据到LCD驱动器

 

b-1-3:TIMEGEN由可编程的逻辑组成,他生成LCD驱动器需要的控制信号,比如VSYNCHSYNCVCLKLEND等等,而这些控制信号又与REGBANK寄存器组中的LCDCON1/2/3/4/5的配置密切相关,通过不同的配置,TIMEGEN就能产生这些信号的不同形态,从而支持不同的LCD驱动器(即不同的STN/TFT)

 

c:LCD提供的外部接口信号:

c-1:VSYNC/VFRAME/STV:垂直同步信号(TFT)/帧同步信号(STN)/SEC TFT信号

c-2:HSYNC/VLINE/CPV:水平同步信号(TFT)/行同步脉冲信号(STN)/SEC TFT信号

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

c-4:VDEN/VM/TP:数据使能信号(TFT)/LCD驱动交流偏置信号(STN)/SEC TFT 信号

 

c-5:说明:

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

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

c-5-3:接下来显示指针又回到矩形的左边从第二行开始显示,注意,显示指针在从第一行的右边回到第二行的左边是需要一定的时间的,我们称之为行切换;

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

c-5-5:然而,LCD的显示并不是对一副图像快速的显示一下,为了持续和稳定的在LCD上显示,就需要切换到另一幅图上(另一幅图可以和上一副图一样或者不一样,目的只是为了将图像持续的显示在LCD)。那么这一副一副的图像就称之为帧,在时序图上就表示为1 Frame,因此从时序图上可以看出1 Line只是1 Frame中的一行;

c-5-6:同样的,在帧与帧切换之间也是需要一定的时间的,我们称之为帧切换,那么LCD整个显示的过程在时间线上看,就可表示为时序图上的VSYNC

下面是时序图:

 

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

行频和场频的计算

   行频 = VCLK /[HSPW1)(HSPD1)(HFPD1)(HOZVAL1)]

   场频 =行频 /[(VSPW1)(VBPD1)(VFPD1)(LINEVAL1)]

接下来了解下相关寄存器的字段结构:

  对于以上这些参数的值将分别保存到REGBANK寄存器组中的LCDCON1/2/3/4/5寄存器中

LCDCON1LINECNT18--27设置屏的行数,最大1024行,从LINECNT计数到0,真正要显示区域的大小是在LCDCON2中的LINEVAL设置;CLKVAL 8--17用于设置分频因子,STN: VCLK = HCLK / (CLKVAL x 2)  ( CLKVAL 2 )   TFT: VCLK = HCLK / [(CLKVAL+1) x 2]    ( CLKVAL  0 )   6 - 5位扫描模式(对于STN:4位单/双扫、8位单扫) 4 - 1位色位模式(1BPP8BPP16BPP)

LCDCON2:用于设置VBPD,LINEVAL,VFBD,VSPW,对于STNVBPDVFBD,VSPW值都为0

LCDCON3:功能类似LCDCON2,只是用于垂直方向的一些参数。

LCDCON5:用于查询和设置一些状态信息。

编程步骤:

1、打开LCD背光

LCD背光对应的GPIO设置为禁止上拉(GPxUP相应位写入1),选择output类型(GPxCON相应位写入01),输出为高电平(GPxDAT相应位写入1)

2、打开LCD电源

可以将GPG4选择为LCD_PWREN(GPGCON:9-8写入11),这时候LCD电源的打开/关闭可以通过LCDCON5:3来控制。

也可以自定义其他GPIO用作LCD电源开关,只需将此GPIO设置为禁止上拉(GPxUP相应位写入1),选择output类型(GPxCON相应位写入01),输出为高电平(GPxDAT相应位写入1)打开LCD电源。

3、设置其他信号线

其他信号线包括VD0-VD23VFRAMEVLINEVCLK等,分别在GPCCON,GPDCON中选择相应功能。

4、设置LCD的频率(VCLK)

LCDDatasheet上一般会写有一个推荐的频率,比如我使用的屏幕推荐频率为6.4M,我需要通过一些计算选择一个合适的CLKVAL以产生这个频率:

对于TFT LCDS3C2440提供的VCLK的计算公式为:

VCLK = HCLK / ((CLKVAL+1)*2)

可以得出:

CLKVAL = HCLK / (VCLK * 2) - 1

我的HCLK100Mhz(CPU运行在400Mhz, CLKDIV_VAL设置为5Fclk:Hclk:Pclk = 1:4:8)VCLK使用屏幕推荐的6.4M,得到:

CLKVAL = 100000000 / (6400000 * 2) - 1 = 6.8

选择最接近的整数值7,写入LCDCON1:17-8

(VCLK其实就是根据 每秒帧数*帧行数*行像素  计算出来的,帧行数和行像素需要包含空白数和同步数)

5、设置其他相关参数

LCD相关的参数主要还有这几个:

LINEVAL: LCD水平像素-1,如320-1 = 319

HOZVAL:  LCD垂直像素-1,如240-1 = 239

HFPD:    行开始前的VCLK

以上是关于linux驱动之LCD(无framebuffer)的主要内容,如果未能解决你的问题,请参考以下文章

linux驱动开发之framebuffer驱动介绍

Linux驱动开发: FrameBuffe(LCD)驱动开发

Linux 帧缓冲子系统详解:LCD介绍framebuffer驱动框架LCD驱动源码分析

#导入Word文档图片# Linux下FrameBuffe(LCD)驱动编写

4 linux lcd驱动框架分析

linux驱动之LCD