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) 关闭文件
结构体 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;
}
上一篇: JQuery实现图片高亮突出展示
下一篇: MySQL安装之“V5.6”_MySQL