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);//清个白屏试试
}