TQ210 屏幕颜色操作

一、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)    关闭文件

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

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

#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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值