t113-c-framebuffer-画点篇

发布时间 2023-07-28 21:35:31作者: 悠闲的小莫

本来今天是要结合udp的例子传输数据的,但是被一个数学逻辑搞了半天,记录一下避坑吧。

代码

#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>

uint32_t fb_line,fb_byte_per,fb_all_bit;
unsigned char *fb_base;
static struct fb_var_screeninfo var;

void lcd_flash(unsigned int  x,unsigned int y,int endx,int endy,unsigned int *buffer,unsigned int size)
{
    unsigned int i;
    unsigned int *fb_test=(unsigned int *)fb_base;
    fb_test+=x+fb_line*y/4;//fb_line*0/4;//
    for(i=0;i<size;i++)
    {
        *fb_test = buffer[i];
        if(!((i+1)%(endx+1))&&(i!=0)){
            fb_test+=(fb_line/4-endx);//800-239;//
        }
        else{
            fb_test++;
        }
        // if(i==239*2)
        // break;
       
    }
}

int main()
{
    unsigned int buf[240*240];
    int fb_handle;
    fb_handle = open("/dev/fb0",O_RDWR);
    if(fb_handle < 0)
    {
        return -1;
    }
    memset(buf,-1,sizeof(buf));
    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;
    }
    printf("bpp is %d\r\n all is %d\r\n x is %d y is %d\r\n",var.bits_per_pixel,var.xres*var.yres,var.xres,var.yres);
    lcd_flash(10,0,239,239,buf,240*240);
    //memset(fb_base, 0xf0, fb_all_bit);//清个白屏试试

}

 

避坑一:memset

所以初始化的时候只能设置为0不能随意设置

避坑二:任何时候不要把无符号和有符号混为一谈,特别是指针!

当使用指针的时候,如果是偏移地址数为有符号,而原本的地址为无符号的指针,那么就会产生意想不到的后果,在屏幕上的效果就是会导致原本控制一行的地址变成了控制两行或者多行的,我暂时叫他地址泄露。

同时,如果把有符号和无符号的数进行比较,有时候也会出现意想不到的bug,所以尽量把有符号和无符号数分开

避坑三:算法的错误

这个错误本不应该犯,找了半天才找到这个错误,比如0-9是10个数,那么不能用i%9来判断是否到达所需要的位置,这样会每行比上一行少一个点数。解决办法如上图所示