电子量产工具——2-2显示部分_Framebuffer编程
文章目录
软件总框架
一、使用场景
二、显示系统编程
1.数据结构抽象
抽象出两个结构体:
一个显示结构体
一个更新结构体
disp_manager.h
#ifndef _DISP_MANAGER_H
#define _DISP_MANAGER_H
typedef struct Region {
int iLeftUpX;
int iLeftUpY;
int iWidth;
int iHeigh;
}Region, *PRegion;
typedef struct DispOpr {
char *name;
int DeviceInit(void);
int DeviceExit(void);
char *GetBuffer(int *pXres, int *pYres, int *pBpp);
int FlushRegion(PRegion ptRegion, char *buffer);
struct DispOpr *ptNext;
};
#endif
2.Framebuffer编程
framebuffer.c
#include <sys/mman.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <linux/fb.h>
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#include <sys/ioctl.h>
#include "disp_manager.h"
static int fd_fb;
static struct fb_var_screeninfo var; /* Current var */
static int screen_size;
static unsigned char *fb_base;
static unsigned int line_width;
static unsigned int pixel_width;
static int FbDeviceInit(void)
{
fd_fb = open("/dev/fb0", O_RDWR);
if (fd_fb < 0)
{
printf("can't open /dev/fb0\n");
return -1;
}
if (ioctl(fd_fb, FBIOGET_VSCREENINFO, &var))
{
printf("can't get var\n");
return -1;
}
line_width = var.xres * var.bits_per_pixel / 8;
pixel_width = var.bits_per_pixel / 8;
screen_size = var.xres * var.yres * var.bits_per_pixel / 8;
fb_base = (unsigned char *)mmap(NULL , screen_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd_fb, 0);
if (fb_base == (unsigned char *)-1)
{
printf("can't mmap\n");
return -1;
}
return 0;
}
static int FbDeviceExit(void)
{
munmap(fb_base, screen_size);
close(fb_base);
return 0;
}
/* 可以返回LCD的framebuffer, 以后上层APP可以直接操作LCD, 可以不用 FbFlushRegion
* 也可以malloc返回一块无关的buffer, 要使用 FbFlushRegion
*
*/
static char *FbGetBuffer(int *pXres, int *pYres, int *pBpp)
{
*pXres = var.xres;
*pYres = var.yres;
*pBpp = var.bits_per_pixel;
return fb_base;
}
static int FbFlushRegion(PRegion ptRegion, char *buffer)
{
return 0;
}
static DispOpr g_tFramebufferOpr = {
.name = "fb",
.DeviceInit = FbDeviceInit,
.DeviceExit = FbDeviceExit,
.GetBuffer = FbGetBuffer,
.FlushRegion = FbFlushRegion,
};
三、总结
int FbDeviceInit(void);
设备初始化
int FbDeviceExit(void);
exit清除 munmap close
char *FbGetBuffer(int *pXres, int *pYres, int *pBpp);
1.上层APP在这个buffer中绘制图片
int FbFlushRegion(PRegion ptRegion, char *buffer);
2.可以更新某个区域,比如“按钮2”然后把该区域Flush到LCD或者WEB上
**