Linux 帧缓冲 北京博创兴业科技有限公司
LCD简介 主讲人:张笑天 zhangxt_uptech@126.com
LCD 简介 液晶显示是一种被动的显示,它不能发光,只能使用周围环境的光。它显示图案或字符只需很小能量。液晶显示所用的液晶材料是一种兼有液态和固体双重性质的有机物,它的棒状结构在液晶盒内一般平行排列,但在电场作用下能改变其排列方向
LCD 的背光 EL(场致发光):2000-3000小时 LED光源:50000小时 成本低、寿命长、支流供电,发光电压低、体积小 CCFL(冷阴极荧光灯):60000小时 需要高压交流,体积大
LCD的显示方式 反射型LCD:底偏光片后面加了一块反射板,它一般在户外和光线良好的办公室使用。
LCD驱动方式 一种是带有LCD扫描芯片的LCD模块 一种是通过LCD控制器,直接扫描LCD屏。 比如:S3C2410处理器,带有LCD控制器,显示缓存和系统内存公用。可以支持STN(彩色/灰度)和TFT两种模式的LCD TFT模式下最多支持18位色,800x600分辨率。
嵌入式处理器与LCD的连接 有LCD控制器的嵌入式处理器 LCD LCD控制信号线 嵌入式处理器 LCD模块 数据总线 寄存器选择 使能信号
S3C2410的LCD扫描模式 4/8位,单/双扫描模式,CSTN 最多256级灰度 显示缓冲区支持15、16、24位TFT模式 支持RGB格式
典型的LCD模式信号线 LDD<17:0>,数据线 L_PCLK,点时钟 L_LCLK,行频 L_FCLK,帧频 L_BIAS,CSTN的AC信号,TFT的开启信号
4位单扫STN模式
8位CSTN屏幕点阵:320x240
8位单扫描CSTN模式
TFT常见信号线 VSYNC——帧同步信号(垂直) HSYNC——行同步信号(水平) VCLK——时钟 VDEN——数据有效控制
16位单扫描TFT模式 列0 列1 行0 LDD[15:0] 行1
显示缓冲与显示点的对应 4位单扫描显示缓冲的对应关系 1个字节存储两个点的信息 16级灰度
8位单扫描显示缓冲的对应关系 标准映射: 1个字节存储1个点的信息 可以是用调色板 RGB 7 6 5 4 3 2 1 R[2:0] R[2:0] G[2:0] B[1:0] BGR 7 6 5 4 3 2 1 B[1:0] G[2:0] R[2:0] 1个字节存储1个点的信息 可以是用调色板
16/15位显示缓冲的对应关系
Linux framebuffer
Framebuffer的结构 在Linux系统下,把显示缓冲区映射给用户空间 应用程序直接操作显示缓冲区(mmap) Linux中,有对framebuffer的专门支持,提供系统的ioctl X86下就有支持,软件容易移植
Framebuffer的应用 Linux的framebuffer接口提供给用户访问显示设备的通用接口 通过mmap映射显示缓冲给用户 不包括任何绘图接口
Framebuffer使用练习 常用接口 重要结构体: 在fb.h文件中定义了下列结构: fb_info 、fb_fix_screeninfo、fb_var_screeninfo、fb_cmap等 /usr/src/linux-2.4.20-8/include/linux/fb.h /usr/src/linux-2.4.20-8/drivers/video/fbmem.c /usr/src/linux-2.4.20-8/drivers/video/fbcmap.c
常用接口 在fbmem.c文件中定义了对framebuffer的操作 static struct file_operations fb_fops = { owner: THIS_MODULE, read: fb_read, write: fb_write, ioctl: fb_ioctl, mmap: fb_mmap, open: fb_open, release: fb_release, #ifdef HAVE_ARCH_FB_UNMAPPED_AREA get_unmapped_area: get_fb_unmapped_area, #endif };
常用接口 mmap 说明: #include <sys/mman.h> 一般情况下是将设备内存映射到用户空间 #include <sys/mman.h> void * mmap(void *start, size_t length, int prot , int flags, int fd, off_t offset);
常用接口 常用的ioctl if (ioctl(fb, FBIOGET_VSCREENINFO, &fb_vinfo)) { printf("Can't get VSCREENINFO: %s\n", strerror(errno)); close(fb); return -1; } if (ioctl(fb, FBIOGET_FSCREENINFO, &fb_finfo)) { printf("Can't get FSCREENINFO: %s\n", strerror(errno)); return 1; }
感谢您参加博创嵌入式教学培训!