lcd相关参数的复习
一、LCD与SOC的硬件连接
LCD一般会需要SOC通过硬件电路提供如下几个信号:
(1)屏幕背光
(2)[23:0]并行数据总线
(3)HSYNC:水平同步信号(行同步),作为一行数据开始的标志,是一个脉冲信号
(4)VSYNC:帧同步信号,作为一帧数据开始的标志,是一个脉冲信号
(5)VDEN:高电平时,表示正在传输有效数据
(6)VCLK:像素时钟
以上的(3)、(4)、(6)都需要根据具体使用的LCD的数据手册中提供的参数进行计算;
(1)HSYNC(脉冲宽度)=HSPW(数据手册提供)+1;单位为vclk
(2)VSYNC(脉冲宽度)=VSPW(数据手册提供)+1;单位为HSVNC
(3)VCLK(像素时钟)=数组手册中一行的长度(One Horizontal LINE)*一帧的行数*帧同步信号(典型值为60)
例如:
在800*480的lcd中,VCLK的值为:
VCLK=(800+256)*(480+45)*60=33.264Mhz
数据均来自于LCD数据手册
二、LCD提供给驱动框架的信息
LCD固有的6个参数:
(1)HSPW:脉冲宽度
(2)HBPD:行有效信号前肩,行有效信息前有HBPD+1个无效像素信息
(3)HFPD:行有效信号后肩,行有效信息后有HFPD+1个无效像素信息
(4)VSPW:脉冲宽度
(5)VBPD:帧有效信号前肩,帧有效信息前有VBPD+1行无效像素信息
(6)VFPD:帧有效信号后肩,帧有效信息前有VFPD+1行无效像素信息
一行信息的组成:
HSYNC(HSPW+1)+(HBPD+1)+行有效信息(分辨率个像素)+(HFPD+1)
一帧信息的组成:
VSYNC(VSPW+1)+(VBPD+1)+帧有效信息+(VFPD+1)
三、关于famebuffer
framebuffer可以简单理解为显存的代名词,指的是任意一段存储空间,可以指向显存,也可以指向内存,只需要在内存分配后将其设置到显卡的相关寄存器中即可。它是内核使用代码构建出来的设备文件,为应用层将数据放进显存提供便利。可以对framebuffer进行不同的配置,支持VGA和hdmi等。
从驱动角度来看,framebuffer构建出来的设备fb是一个字符设备,在创建fb的同时,还创建了一个类sys/class/graphics。
LCD驱动所做的工作,就是初始化LCD控制器、申请内存、建立显存与LCD驱动器的映射关系。这样应用程序只需要将需要显示的图像丢进frambuffer,硬件就可以自动完成显示。
应用层与内核的数据交换方式:
(1)使用copy_from_user和copy_to_user;适用于小数据量
(2)使用mmap(用于图像显示,大数据量)
四,framebuffer框架介绍
1、drivers/video/fbmem.c(驱动框架代码)
主要任务:
(1)创建graphic类
(2)注册字符设备fb驱动
(3)提供register_framebuffer(struct fb_info *fb_info)/unregister_frambuffer(struct fb_info *fb_info)给具体的framebuffer驱动调用来注册fb。
framebuffer使用struct fb_info描述framebuffer设备,使用struct file_operations fb_fops来描述设备驱动实现的操作。
五、驱动介绍
针对于s5pv210,其lcd的驱动在s3cfb.c这个文件中,纵观其代码,我们可以发现lcd驱动是基于platform平台总线进行开发的,那自然就会有platform_device和platform_driver的存在。其中platform_device是在内核初始化的时候进行注册的,所以当对应的驱动注册时,会按照名字进行匹配,成功后就会自动执行驱动中的probe函数。
(1)设备注册
struct s3c_platform_fb
这个结构体是fb的platform_data结构体,是platform设备的私有数据。这个数据存储在platform_device.device.platform_data中存储,需要在mach文件红进行填充,然后在probe函数中通过传参platform_device指针取出来。
struct s3cfb_lcd(可以设置分辨率),如果是移植新的开发板,修改这个结构体即可。这个结构体包含了分辨率、色深、时序信号灯和具体硬件有关的信息。
platform_device的信息(platform_data)会在mach_210.c中的smdkc110_machine_init函数中进行注册,platform_data是调用s3cfb_set_platdat()函数进行设置,参数即为我们所使用的lcd屏幕的结构体 struct s3c_platform_fb的一个对象。这个结构体中的.lcd成员所指向的结构体ek070tn93(struct s3cfb_lcd的一个实例),这个结构体就包含了lcd的时序信息在里面。
这也是具体的硬件所在。