`
java-mans
  • 浏览: 11408116 次
文章分类
社区版块
存档分类
最新评论

LCD---那些年我们一起玩mini2440(arm9)裸机

 
阅读更多

LCD-liquidcrystal display 的简称,液晶显示器按驱动方式分为1.静态驱动2.简单矩阵驱动及3.主动矩阵驱动。

其中,简单矩阵又可分为1.扭转向列型(TN)和超转向列型(STN)两种,而主动矩阵驱动则以TFT为主。

TNSTN都采用场电压驱动方式,如果显示尺寸加大,中心部分对电机变化的反应时间就会变长,显示器的速度跟不上。为解决这个问题,主动矩阵驱动TFT被提出,他通过晶体管显示信号开启过关闭液晶分子的电压,从而避免了显示器对电场效应的依靠。

LCD一块屏显示图像不但需要LCD驱动器,还需要LCD控制器。很多主芯片cpu集成了LCD控制器。

依据显示原理:作为帧同步信号的vsync,每发出一个脉冲,都意味着新的一幅图像数据开始传送。而作为行同步信号的hsync,没发出一个脉冲,都表明新的一行图像资料开始发送。

LCD时序图

所有LCD显示图像的原理都是从上到下,从左到右的。一幅图像可以看做是一个矩形,由很多排列整齐的像素点一行一行组成,这些点称为像素。

VCLK:像素时钟信号

没发出一个脉冲信号,表示新的一个点图像数据开始传送。

LEND:行结束信号

帧缓冲

FrameBuffer从本质上讲是图形设备的硬件抽象。对开发者而言,FrameBuffer是一块显示缓存,往显示缓存中写入特定格式的数据就意味着向屏幕输出内容。通过不断的向framebuffer中写入数据,显示控制器就自动的从frame buffer中取数据并显示出来。

嵌入式中从内存中分一部分出来作为显存;所以frame buffer的实质就是显存;

帧缓冲设备

帧缓冲设备时非常典型的字符设备。帧缓冲设备对应的设备文件为/dev/fb*,如果系统有多个显示卡,Linux下还可支持多个帧缓冲设备,最多可达32个,分别为/dev/fb0/dev/fb31,而/dev/fb0则为当前缺省的帧缓冲设备,通常指向/dev/fb0帧缓冲设备为标准字符设备,主设备号为29,次设备号则从031.

实验内容:

1.清除LCD

使用命令:ddif=/dev/zero of=/dev/fb0 bs=240 count=320

(dd是用来拷贝文件的ifinfileof (outfile) bs :block size count:)

Bs=240 即,一个块为240个字节;count=320320个块

2.运行应用程序,画图

./LCD

3.清除LCD

使用命令:ddif=/dev/zero of=/dev/fb0 bs=240 count=320

1.显示图片

2.cat xx.bmp > /dev/fb0

总结:通过frame buffer我们可以去操作LCD的显示图像,即LCD显示图像来源于frame buffer,而/dev/fb0又是frame buffer的设备文件,所以操作/dev/fb0即是操作frame buffer

平台设备分类方法是:总线;

字符设备分类方法:功能

#include <unistd.h>

#include <stdio.h>

#include <fcntl.h>

#include <linux/fb.h>

#include <sys/mman.h>

 

int main () {

    int fp=0;

    struct fb_var_screeninfo vinfo;

    struct fb_fix_screeninfo finfo;

    long screensize=0;

    char *fbp = 0;

    int x = 0, y = 0;

    long location = 0;

    fp = open ("/dev/fb0",O_RDWR);//打开frame buffer设备文件

 

    if (fp < 0){

        printf("Error : Can not open framebuffer device\n");

        exit(1);

    }

 

    if (ioctl(fp,FBIOGET_FSCREENINFO,&finfo)){       //获取LCD的一些配置参数

        printf("Error reading fixed information\n");

        exit(2);

    }

    if (ioctl(fp,FBIOGET_VSCREENINFO,&vinfo)){

        printf("Error reading variable information\n");

        exit(3);

    }

 

    screensize = vinfo.xres * vinfo.yres * vinfo.bits_per_pixel / 8;   //单帧画面空间

    /*这就是把fp所指的文件中从开始到screensize大小的内容给映射出来,得到一个指向这块空间的指针*/

    fbp =(char *) mmap (0, screensize, PROT_READ | PROT_WRITE, MAP_SHARED, fp,0);//把显存映射到进程空间中来,fbp为映射地址

    if ((int) fbp == -1)

    {

         printf ("Error: failed to map framebuffer device to memory.\n");

         exit (4);

    }

    /*这是你想画的点的位置坐标,(0,0)点在屏幕左上角*/

       //画矩形

    for(x=100;x<150;x++)

   {

        for(y=100;y<150;y++)

       {

             location = x * (vinfo.bits_per_pixel / 8) + y  *  finfo.line_length;

 

             *(fbp + location) = 255;  /* 蓝色的色深 */  /*直接赋值来改变屏幕上某点的颜色*/

             *(fbp + location + 1) = 0; /* 绿色的色深*/   /*注明:这几个赋值是针对每像素四字节来设置的,如果针对每像素2字节,*/

             *(fbp + location + 2) = 0; /* 红色的色深*/   /*比如RGB565,则需要进行转化*/

             *(fbp + location + 3) = 0;  /* 是否透明*/ 

         } 

    }

    munmap (fbp, screensize); /*解除映射*/

    close (fp);    /*关闭文件*/

    return 0;

 

}

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics