全部博文(10)
分类: LINUX
2014-07-21 14:00:20
LCD时序
重要的结构fb_var_screeninfo
struct fb_var_screeninfo {
__u32 xres; /*显存可视区域宽度,单位像素*/
__u32 yres; /*显存可视区域高度,单位像素*/
__u32 xres_virtual; /*显存的宽度,单位像素*/
__u32 yres_virtual; /*显存的高度,单位像素*/
__u32 xoffset; /* 显存可视区域左上角x方向偏移*/
__u32 yoffset; /* 显存可视区域左上角y方向偏移*/
__u32 bits_per_pixel; /* 每个像素在显存中所占的bit数*/
__u32 grayscale; /* 当使用非彩色时使用,一般不用 */
struct fb_bitfield red; /*指定一个像素中每个颜色分量的偏移和长度 */
struct fb_bitfield green; /* */
struct fb_bitfield blue;
struct fb_bitfield transp; /* transparency */
__u32 nonstd; /* 如果使用的是非标准的色彩格式,一般不用 */
__u32 activate; /* FB的开启策略?see FB_ACTIVATE_* */
__u32 height; /* height of picture in mm,好像也不用吧 */
__u32 width; /* width of picture in mm */
__u32 accel_flags; /* (OBSOLETE) see fb_info.flags */
/* Timing: All values in pixclocks, except pixclock (of course) */
__u32 pixclock; /* 像素时钟,单位皮秒,也就是每隔这个时间,控制器向LCD发出一个完整的像素数据*/
__u32 left_margin; /*水平前肩,单位(像素时钟个数)time from sync to picture */
__u32 right_margin; /*水平后肩,单位(像素时钟个数)time from picture to sync */
__u32 upper_margin; /* 垂直前肩,单位(像素时钟个数)time from sync to picture */
__u32 lower_margin; /*垂直后肩,单位(像素时钟个数)*/
__u32 hsync_len; /* 水平同步信号的有效电平的长度,单位(像素时钟个数)length of horizontal sync */
__u32 vsync_len; /*垂直同步信号的有效电平的长度,单位(像素时钟个数) length of vertical sync */
__u32 sync; /* 水平或垂直同步信号的有效电平see FB_SYNC_* */
__u32 vmode; /* 电子枪扫描模式,LCD显然是非交错扫描模式see FB_VMODE_* */
__u32 rotate; /* 显存旋转角度,一般不用angle we rotate counter clockwise */
__u32 reserved[5]; /* Reserved for future compatibility */
};
Linux对LCD的抽象如下图所示:
下图清晰的展现了各个时钟信号之间的关系,当然,这只是S3C2410开发板上的LCD,不同的LCD的时钟信号都不一样,但都没有太大区别:
在编写LCD控制器驱动的过程中,需要设置
pixclock
left_margin/right_margin
upper_margin/lower_margin
hsync_len/vsync_len
这些参数都是显示器的数据手册直接或间接给出的,除了pixclock。假如,我要输出60fps的帧率,那么1/pixclock=( left_margin+right_margin+hsync_len+xres)* ( upper_margin+lower_margin+ vsync_len+yres)*60,这样就计算出了pixclock,由于一般向LCD控制器寄存器中写入的是pixclock,而不是帧率,所以,实际的帧率并不一定严格等于60,因为在上面计算过程中pixclock可能会取整。