电子量产工具——2-2显示部分_Framebuffer编程

电子量产工具——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上

**

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

点灯小哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值