T113学习之-lcd--framebuffer篇

屏幕到了,之前的屏幕不知道哪步出错,一直点不亮,白瞎了160块钱。。。。

那么,学一下framebuffer吧

framebuffer介绍

这张图介绍的很清楚

使用的api

1.open

2.mmap

3.ioctl

前两个都学了,那么这个ioctl到底是什么呢

原链接在这

ioctl的概念

也就是说ioctl就是用来拓展open等函数搞不了的操作的

函数的api

这样我就想起来了,在spi的驱动和app中貌似有这样的例子

此外,还有宏定义的ioctl,当然这都是后话了

获取屏幕参数

这里我们了解到了可变和固定的参数,而我们真正关心的是可变的参数

既然知道了参数,我们来简单写一个framebuffer的程序吧

程序编写

简单创建一个文档

man 2 open查看open函数

简单地获取参数和映射一下

试一下清白屏幕

非常成功

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include "linux/fb.h"
#include <sys/ioctl.h>
#include <sys/mman.h>
#include <string.h>


int main()
{
    unsigned char *fb_base;
    uint32_t fb_line,fb_byte_per,fb_all_bit;
    static struct fb_var_screeninfo var;
    int fb_handle;
    fb_handle = open("/dev/fb0",O_RDWR);
    if(fb_handle < 0)
    {
        return -1;
    }
    if(ioctl(fb_handle,FBIOGET_VSCREENINFO,&var))//使用获取动态数据的标志符从驱动获取屏幕数据
    {
        return -1;
    }
    ////////获取屏幕的数据
    fb_line = var.xres * var.bits_per_pixel / 8;//长度
    fb_byte_per = var.bits_per_pixel / 8;
    fb_all_bit = var.xres * var.yres * var.bits_per_pixel / 8;//总贞数
    ////////对文件进行映射
    fb_base = (unsigned char *)mmap(NULL , fb_all_bit, PROT_READ | PROT_WRITE, MAP_SHARED, fb_handle, 0);
    if(fb_base == (unsigned char *)-1)
    {
        printf("failed to mmap");
        return -1;
    }
    memset(fb_base, 0xff, fb_all_bit);//清个白屏试试

}

 

posted @ 2023-07-26 21:28  悠闲的小莫  阅读(173)  评论(0编辑  收藏  举报