现在的位置: 首页 > 综合 > 正文

framebuffer机制

2013年09月22日 ⁄ 综合 ⁄ 共 7296字 ⁄ 字号 评论关闭

 

s3c2440-lcd驱动与帧缓冲

注意:本文是主要参考《S3C2440LCD驱动详解》,《S3c2410_LCD驱动学习心得》,《嵌入式linux_Framebuffer驱动开发》部分直接搬过来。

一、帧缓冲机制

         在谈到lcd驱动时,先谈谈,帧缓冲机制,为什么呢?因为Linux系统是工作在保护模式下,所以用户态进程无法像DOS那要使用显卡BIOS里提供的中断调用来实现直接写屏蔽,Framebuffer是出现在linux 2.2及以后的一种驱动程序接口,它是一项重要技术,基本上都是用它来实现图形界面的。

下面是LCD驱动程序与应用程序以及帧缓冲机制的关系

应用程序要操作LCD,就操作设备节点(/dev/fb0由帧缓冲创建),fbmem.c是提供应用程序的操作接口,fbmem.c本身并不实现这些功能,这就需要下一层接口实现,就是XXXfb.c要实现的与lcd底层硬件相关的操作接口。具体可以参考s3c2410fb.c

帧缓冲技术是与LCD驱动混在一起从而形成帧缓冲LCD设备驱动程序,主要是由下面几个重要数据结构起关联。

 

1Struct fb_info

Struct fb_info这结构记录了帧缓冲设备的全部信息,包括设备的设置参数、状态、以及对底层硬件操作的函数指针。下面具体分析一下。

 其中比较重要的就是struct fb_var_screeninfo var;              struct fb_fix_screeninfo fix;

struct fb_ops *fbops;

下面各自分析一下

 

2struct fb_var_screeninfo

 

struct fb_var_screeninfo 主要是记录用户可以修改的控制器可变参数

 

3struct fb_fix_screeninfo

 

struct fb_fix_screeninfo fix;就是固定的控制器配置,比如屏幕缓冲区的物理地址和长度,定义如下:

 

4struct fb_ops

 

struct fb_ops,帧缓冲操作,关联硬件跟应用程序。

5、帧缓冲设备以及设备资源

LCD帧缓冲设备在Linux里是作为一个平台设备,在内核arch/arm/plat-s3c24xx/devs.c中定义LCD相关平台设备如下:

这里导出s3c_device_lcd是为了在arch/asm/mach-s3c2410/mach-smdk2410.c里的smdk2410_devices[](或者其它smdk2440_devices[])中添加到平台设备列表中。

下面准备分析具体实例,但分析前还要了解LCD的特性以及读写时序。

实在不如别人做得漂亮,做得详细,大家还是去看原文吧,我这里就不接了。

二、LCD的硬件知识

1. LCD工作的硬件需求:

   要使一块 LCD正常的显示文字或图像,不仅需要 LCD驱动器,而且还需要

相应的 LCD控制器。在通常情况下,生产厂商把LCD驱动器会以 COF/COG

的形式与 LCD玻璃基板制作在一起,而 LCD控制器则是由外部的电路来实现,

现在很多的 MCU内部都集成了 LCD控制器, S3C2410/2440 等。 通过LCD

控制器就可以产生LCD驱动器所需要的控制信号来控制STN/TFT 屏了。

 

2. S3C2440内部 LCD 控制器结构图:

 

我们根据数据手册来描述一下这个集成在 S3C2440 内部的 LCD控制器:

aLCD控制器由REGBANKLCDCDMATIMEGENVIDPRCS寄存器组

成;

bREGBANK 17个可编程的寄存器组和一块 256*16 的调色板内存组成,

它们用来配置 LCD控制器的;

cLCDCDMA是一个专用的 DMA,它能自动地把在侦内存中的视频数据传送

LCD驱动器,通过使用这个 DMA通道,视频数据在不需要 CPU的干预的情

况下显示在 LCD屏上;

dVIDPRCS接收来自 LCDCDMA的数据,将数据转换为合适的数据格式,比

如说 4/8 位单扫,4 位双扫显示模式,然后通过数据端口 VD[23:0]传送视频数

据到 LCD驱动器;

……

在这里我加上《S3c2410 LCD驱动学习心得》因为这里面分析如何确定驱动里的lcd配置参数写得很明白

S3C2410实验箱上的LCD是一款3.5TFT真彩LCD屏,分辩率为240*320,下图为该屏的时序要求。

1.3
通过对比图1.2和图1.3,我们不难看出:
VSPW+1=2 -> VSPW=1

VBPD+1=2 -> VBPD=1
LINVAL+1=320-> LINVAL=319
VFPD+1=3 -> VFPD=2
HSPW+1=4 -> HSPW=3
HBPD+1=7 -> HBPW=6
HOZVAL+1=240-> HOZVAL=239
HFPD+1=31 -> HFPD=30
以上各参数,除了LINVALHOZVAL

抱歉!评论已关闭.