Chinaunix首页 | 论坛 | 博客
  • 博客访问: 356431
  • 博文数量: 197
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 303
  • 用 户 组: 普通用户
  • 注册时间: 2013-09-02 14:21
文章分类

全部博文(197)

文章存档

2014年(89)

2013年(108)

我的朋友

分类: 嵌入式

2014-03-10 17:46:16

这网站有更详细更权威的描述: http://www.linux-fbdev.org/HOWTO/2.html

    这些参数都是由以前的 CRT(阴极射线显像管)带过来的, TFT 液晶跟 CRT 显示方法根本不同, 至于为什么这些参数也会引入到 TFT , 我也不知道.

要理解这些参数, 得以 CRT 显示器的显示方法来理解.

CRT 侧面看是个漏斗状的真空的东东, 根部就是电子枪, 打出的电子撞击前面的玻璃面上的荧光物质, 荧光物发光. 控制电子枪按规律射出电子, 逐行的打到荧光物质上, 打完一行(也即扫描完一行), 就回头扫描下一行..... 扫描完一个显示屏所有的行后, 就是一幅完整的画面了, 称为一帧(frame), 扫描过程如果非常快, 人眼看到是一幅完整画面, 但实际是一个个点发不同光组成的. 扫描得慢时, 就会觉得闪烁了(以前听老师讲课, 说在他们的年代, 能明显看到一行一行刷过的壮观场景).

    一帧扫描完, 再回头从第一行开始继续扫描, 重复过程看到的就是持续在显示的画面了(实际上, 电子的运动轨迹是由磁场控制的, 电子枪没有机械的运动, 为好理解, 就当是电子枪做了机械运动吧).

OK, 大概如此, 更详细得找专业电工请教.

描述方式多数显示器选择从左上角开始, 从左至右, 到了右边界, 再偏转到左边界的下一行, 这是所谓的”Z”型扫描.
类似地扫描完最后一帧时
, 要偏转回左上角起始处, 准备扫描下一帧.

HSYNC 信号用于告诉电子枪该扫描下一行了, 即要转到下一行起始处了;

VSYNC 信号告诉电子枪该显示下一帧了, 即该转回左上角起始处了;

H for Horizontal, V for vertical.

在这里 Hsync, Vsync 两者各表示一种信号, 分别由 HSPW VSPW 两个参数确定信号持续时间, 也就是脉冲的宽度.

 

在扫描一行中, 首先

HSYNC 脉冲信号为高电平, 一发出此信号, 电子枪迅速移回左边界, 期间电子枪不发射电子.

HSYNC 信号持续时间上的某, 电子枪开始再次向右扫描了, HSYNC 信号结束, 表示该开始显示下一行的数据了, 电子枪又要开始发射电子.
HSYNC 信号结束与开始显示数据之间, 可以插入一段延时( HBPD 参数控制)让显示屏仍然不显示有效数据(效果就是黑色), 是为显示屏左边框.  
HFPD 结束, 电子枪才可以发射电子, 显示该行的有效数据.

显示完毕. 又该开始发出 HSYNC 信号了. 在一行中有效数据扫描完毕与 HSYNC 信号发出之间也插入一段延时 HFPD, 是为显示屏右边框,

之后, 就是重复过程了.

因此, 显示一行时序为:  HSPW -> HBPD -> 扫描数据 -> HFPD .

 

类似地, 垂直扫描一帧的时序:

VSPW -> VBPD -> 扫描有效行 -> VFPD .


为什么要有边框(vbpd, vfpd, hbpd, hfpd)? 按上边贴出网页的说法:
Usually, one doesn't use that feature nowadays, as we have tunable monitors that allow stretching the mode to the physical limits of the monitor.
我的理解是:确实是以前的显示器调整显示屏边界用的,而新的显示有调整能力了, 所以不再需要刻意关注了,但术语被保留了下来.
--------------------------------------------

对于 TFT LCD, 但这些参数作用是同样的. 但如何确定 ?  TFT LCD datasheet 中一定得标有.

如型号 WXCAT35-TG3  3.5 寸的液晶中有表如下:

对照下边的时序图(: 时序图的 Vsync, Hsync 信号(红框圈出的)跟上边讲的有点出入, 信号都是低电平,
而非高电平
, 因此编程时要设置信号反相, s3c244a LCDCON5INVLINE INVFRAME 即是干这活的):

 

tvp VSPW,

tvb VBPD,

tvf VFPD

thp HSPW

thb HBPD

thf HFPD

 

参考的时钟就是 CLK, 一个 CLK 时钟, 完成一个像素点的显示.

计算帧频率(刷新频率)的方法就是所有的像素点跟边沿(边框,hbpd 之类),同步脉冲的时间相加, 结果就是显示完整一帧所需时间, 其倒数即是帧频率.

 -----------------------------------------

Linux LCD 驱动

LCD 驱动主要得完成两部分, 一是跟 framebuffer 注册驱动; 二是设置 LCD 控制器的寄存器, 以适配 LCD.

struct fb_info  是关键, 有显示驱动的所有信息, 要拿此结构跟 framebuffer 注册, 代表着本驱动,  该结构定义在 ,
在驱动程序中, 主体部分就是实现 struct fb_info .
在该结构中, 以下定义的三个字段也是比较重要的, 要填一些数据入去:

 struct fb_var_screeninfo var;   /* Current var */

  struct fb_fix_screeninfo fix;   /* Current fix */

  struct fb_ops *fbops;

 

struct fb_fix_screeninfo 里定义的 pixclock 是像素点的周期, 单位是皮秒, 数值等于像素点显示频率的倒数. 如上图贴出的表格中, Dclk 那行中, 6.4 Mhz 就是频率, 频率倒数即为周期, 换算出来为 156250 ps, 约为表中给出的 156 ns.

 

驱动具体的实现, 要看开发板对应的驱动源码文件, 一般位于 kernel_src/drivers/video/

这部分最好看看 Sreekrishnan Venkateswaran 写的 Essential Linux Device Drivers 12章视频部分.

对于设置以及 LCD 的显示参数这些比较近硬件的,韦东山的 嵌入式 Linux 应用开发完全手册 可看看.

 

阅读(1759) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~