嵌入式学习---Linux中的画面显示

framebuffer:帧缓冲、帧缓存

Linux内核为显示提供的一套应用程序接口(驱动内核支持)

**分辨率:**像素点的总和

像素点:

显示屏:800*600(横向有800个像素点,纵向有600个像素点)

显卡(显存(保存像素点的值))

RGB颜色模式:(8个bitR,8个bitG,8个bitB)

常用的有两种:

1.RGB888(PC,4412)

2.RGB565(S3C2440)

原理:

通过内存映射技术,向显存空间写入RGB值

操作步骤:

1.打开显示设备(/dev/fb0)

2.获取显示设备相关参数(分辨率、位深度)

3.建立内存映射

4.写入RGB颜色值

5.解除映射

6.关闭显示设备

代码实现:

cs 复制代码
#include<stdio.h>
#include "framebuffer.h"
#include <linux/fb.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <sys/ioctl.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include<math.h>
void *pmem;
struct fb_var_screeninfo vinf;

int init_fb(char *devname)
{
    int fd = open(devname,O_RDWR);
    if(-1 == fd)
    {
        perror("fail open ");
        return -1;
    }

    int ret = ioctl(fd,FBIOGET_VSCREENINFO,&vinf);
    if(-1 == ret)
    {
        perror("fail ioctl");
        return -1;
    }
    printf("xres = %d ,yres = %d\n",vinf.xres,vinf.yres);
    printf("xres_virtual = %d, yres_virtual = %d\n",vinf.xres_virtual,vinf.yres_virtual);
    printf("bits_per_pixel : %d\n",vinf.bits_per_pixel);

    size_t len = vinf.xres_virtual *vinf.yres_virtual *vinf.bits_per_pixel/8;
    pmem = mmap(NULL,len,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);
    if((void *)-1 == pmem)
    {
        perror("fail mmap");
        return -1;
    }

    return fd;

}

void draw_point(int x,int y,unsigned int col)
{
    if(x >= vinf.xres || y >= vinf.yres)
    {
        return;
    }
    if(vinf.bits_per_pixel == RGB888_FMT)
    {
        unsigned int *p = pmem;
        *(p + y* vinf.xres_virtual + x)= col;
    }
    else if(vinf.bits_per_pixel == RGB565_FMT)
    {
        unsigned short *p = pmem;
        *(p + y *vinf.xres_virtual + x)= col;
    }
    return;
}
int main(int argc,char*argv[])
{
    int fd_fb = init_fb("/dev/fb0");
    if(fd_fb == -1)
    {
        return -1;
    }
    draw_point(400,300,0x00ff0000);
    uninit_fb(fd_fb);

    return 0;
}
相关推荐
肖恩想要年薪百万22 分钟前
如何在idea中快速搭建一个Spring Boot项目?
java·数据库·spring boot·后端·学习·mysql·intellij-idea
虾球xz1 小时前
游戏引擎学习第205天
学习·游戏引擎
Love__Tay2 小时前
【学习笔记】Power BI 初级知识
笔记·学习·数据分析·powerbi
浪淘沙jkp3 小时前
大模型学习五:‌DeepSeek Janus-Pro-7B 多模态半精度本地部署指南:环境是腾讯cloudstudio高性能GPU 16G免费算力
学习·deepseek·janus-pro·janus-pro-7b
1111Alisa3 小时前
数据分析-Excel-学习笔记Day1
学习·数据分析·excel
落笔太慌张~4 小时前
【FPGA基础学习】状态机思想实现流水灯
学习·fpga开发
charlie1145141914 小时前
STM32F103C8T6单片机开发:简单说说单片机的外部GPIO中断(标准库)
stm32·单片机·嵌入式硬件·学习·教程·中断
和风化雨5 小时前
verilog学习--1、语言要素
学习
悄悄敲敲敲5 小时前
C++第14届蓝桥杯b组学习笔记
c++·学习·算法·蓝桥杯
代码AC不AC5 小时前
【数据结构】堆
c语言·数据结构·学习··深度剖析