欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

TQ210 屏幕颜色操作

程序员文章站 2022-05-28 21:55:31
...

一、LCD操作步骤

在应用程序中,操作/dev/fbn的一般步骤如下:

(1)    打开/dev/fbn设备文件。

open("/dev/fb0",O_RDWR); 

(2)    用ioctl()操作取得当前显示屏幕的参数,如屏幕分辨率、每个像素点的比特数。根据屏幕参数可计算屏幕缓冲区的大小。

ioctl函数是实现对设备的信息获取和设定,第一个参数为文件描述符,第二个参数为具体设备的参数,
对于framebuffer,参数在linux/fb.h中定义的。 获取framebuffer设备信息 
ioctl(int fb,FBIOGET_FSCREENINFO,&finfo); 获取应用程序可改变的参数(如设定的分辨率)
ioctl(int fb,FBIOGET_VSCREENINFO,&finfo); 获取固定的参数(如屏幕的分辨率,一般只是拿来看看)
      #define FBIOGET_FSCREENINFO 0x4600   //获取设备无关的数据信息fb_var_screeninfo
      #define FBIOPUT_VSCREENINFO 0x4601   //设定设备无关的数据信息
      #define FBIOGET_FSCREENINFO 0x4602   //获取设备无关的常值信息fb_fix_screeninfo
      #define FBIOGETCMAP  0x4604        //获取设备无关颜色表信息
      #define FBIOPUTCMAP  0x4605       //设定设备无关颜色表信息
      #define FBIOPAN_DISPLAY  0x4606
      #define FBIO_CURSOR      _IOWR ('F', 0x08, struct fb_cursor) 
 第三个参数是存放信息的结构体或者缓冲区 

(3)    用mmap()函数,将屏幕缓冲区映射到用户空间。

内存映射 mmap函数。头文件:sys/mman.h .常用用法:
mmap(0,screensize,PROT_RD |PROT_WR,MAP_SHARED,int fb,0)返回映射的首地址。 

(4)    映射后就可以直接读/写屏幕缓冲区,进行绘图和图片显示了。

(5)    使用完帧缓冲设备后需要将其释放。

(6)    关闭文件

TQ210 屏幕颜色操作

结构体 struct fb_var_screeninfo中存放了比较重要的部分

TQ210 屏幕颜色操作

虚拟画面一般会被默认设为(不一定的)可视画面的两倍,这种结构被称之为“双缓冲机制”,这样做的好处是可以一边显示,一边缓冲下一幅画面 。

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <sys/ioctl.h>
#include <unistd.h>
#include <signal.h>
#include <linux/fb.h>
#include <stdbool.h>

char* plcd = NULL;
bool terminated = false;
//typedef void (*sighandler_t)(int);
void sighandler(int sig) {
    switch (sig) {
    case SIGINT:
        terminated = true;
        break;
    }
}

void LCD_DrawPoint(unsigned long x, unsigned long y, int color)
{
    int *p = (int *)plcd;

    *( p + y * 800 + x ) = color;

}

//draw screen with color
void LCD_ClearScr(int color)
{
    unsigned long x, y;

    for (y = 0; y < 480; y++)
    {
        for (x = 0; x < 800; x++)
        {
            LCD_DrawPoint(x, y, color);
        }
    }
}

int main(int argc, char** argv) 
{
    printf("hello tq210\n");
    signal(SIGINT, sighandler);//sighandler_t signal(int signum, sighandler_t handler); 设置信号、并关联动作
    int fd = open("/dev/fb0", O_RDWR);
    if (fd == -1) {
        perror("open device error");
        exit(-1);
    }
    printf("open device %d\n", fd);

    /*
    2. get screen infomations
    */
    struct	fb_var_screeninfo fbinfo;
    int r = ioctl(fd, FBIOGET_VSCREENINFO, &fbinfo);
    if (r == -1)
    {
        perror("ioctl error:");
        return -1;
    }
    printf("resuation: %d x %d\n", fbinfo.xres, fbinfo.yres);
    printf("bits_per_pixel: %d bits\n", fbinfo.bits_per_pixel);
    printf("A: offset %d  length %d msb_rigth: %d\n ", fbinfo.transp.offset, 
        fbinfo.transp.length, fbinfo.transp.msb_right);
    printf("R: offset %d  length %d msb_rigth: %d\n ", fbinfo.red.offset, 
        fbinfo.red.length, fbinfo.red.msb_right);
    printf("G: offset %d  length %d msb_rigth: %d\n ", fbinfo.green.offset, 
        fbinfo.green.length, fbinfo.green.msb_right);
    printf("B: offset %d  length %d msb_rigth: %d\n ", fbinfo.blue.offset, 
        fbinfo.blue.length, fbinfo.blue.msb_right);

    /*
    3. mmap
    */
    plcd = mmap(NULL,
        ( fbinfo.xres * fbinfo.yres * ( fbinfo.bits_per_pixel / 8 ) ),
        PROT_WRITE,
        MAP_SHARED,
        fd,
        0
    );

    while (!terminated) {
        LCD_ClearScr(0xff);//blue
        sleep(2);
        LCD_ClearScr(0xff00);//green
        sleep(2);
        LCD_ClearScr(0xff0000);//red
        sleep(2);
    }

    munmap(plcd, fbinfo.xres * fbinfo.yres * ( fbinfo.bits_per_pixel / 8 ));
    close(fd);
    return 0;
}
相关标签: LCD 显示