首页 > 其他分享 >t113-c-framebuffer-画点篇

t113-c-framebuffer-画点篇

时间:2023-07-28 21:44:32浏览次数:26  
标签:符号 int 画点 unsigned 避坑 fb t113 framebuffer include

本来今天是要结合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来判断是否到达所需要的位置,这样会每行比上一行少一个点数。解决办法如上图所示

标签:符号,int,画点,unsigned,避坑,fb,t113,framebuffer,include
From: https://www.cnblogs.com/recodemo/p/17588928.html

相关文章

  • t113-c-udp篇
    之前学习了tcp发送数据,但是效果很不理想,那么试一下用udp会怎么样,学习一下udp是怎么用用的吧看例子例子是在百问网下载的,serverclient这个有点奇怪,有点看不懂#include<sys/types.h>/*SeeNOTES*/#include<sys/socket.h>#include<string.h>#include<sys......
  • t113-c-led驱动篇(调用设备树)
    既然已经学会了调用驱动,那么接下来简单点个灯查看led所在寄存器我板子的led所控制的是pd22,所在寄存器应该是0x02000098然而这和我在设备树上找到的地址有出入,很奇怪,那就不管这个了自己添加一个吧。自己在board.dts上加一个ledio:我们看见这里有个&pio,而pio又是在dtsi中的so......
  • t113-c-设备树-驱动调用篇(获取设备节点和属性)
    我们以pwm为例编写程序1.首先编写出入口函数//#include"linux/module.h"//#include"linux/fs.h"////#include"linux/stddef.h"//#include"linux/types.h"////#include"crypto/if_alg.h"#include"treecom.h"......
  • t113-c-内核字符型设备驱动篇
    那么既然ko的驱动已经可以运行,那么我们来写几个简单的操作设备树的内核驱动字符型设备驱动和应用层这俩种代码是分开的,设备驱动调用的是内核的地址,而应用层则是相当于虚拟地址,所以应用层传递参数的时候不能直接付给指针,要调用相对于的参数内核->驱动->应用驱动的编写找到sdk......
  • t113-c-内核驱动寻找问题篇
    第三次尝试经过demsg的查看,原来是内核版本不对的原因,因此我们需要根据韦东山老师的教程换一次内核经过不懈努力,好像过程很容易,但在最后栽了跟头boot区挂载失败,这怎么办呀并没有重复挂载查看mmcblk0分区的映射......
  • Framebuffer 应用编程中涉及的 API 函数
    论  坛:http://bbs.100ask.net/(学术答疑)公 众 号:百问科技版本日期作者说明V12020韦东山摘自《嵌入式Linux应用开发完全手册》本节程序的目的是:打开LCD设备节点,获取分辨率等参数,映射Framebuffer,最后实现描点函数。5.2.1open函数在Ubuntu中执行“man2open”,可以看到o......
  • 全志Tina Linux SPINAND UBI 离线烧录 开发指南 支持百问网T113 D1-H哪吒 DongshanPI-
    1概述编写目的:介绍SunxiSPINand烧写时的数据布局2名词解释词义UBIunsortedblockimagePEBphysicaleraseblockLEBlogicaleraseblockPEB和logicalblock关系1PEB=1logicalblock1logicalblock=2physicalblocks3总体数据布局ubi方案FLASH上的数据布局sys_pa......
  • t113-c-驱动ko制作与运行篇
    记录:tina的include文件在:/home/momo/T113/Tina-Linux/lichee/linux-5.4/include驱动文件:/home/momo/T113/Tina-Linux/lichee/linux-5.4/drivers而设备树文件在:/home/momo/T113/Tina-Linux/lichee/linux-5.4/arch/arm/boot/dtst113所用的设备树文件在:/home/momo/T113/Tina-Linu......
  • t113-c-dts学习篇2
    dts的makefile我们来到dts的makefile查看一下我们的板子所编译的代码,此代码表示如果sun8iw20就添加生成board.dtb,可能是因为这个变量还有其他参数吧所以用+=对于cell的更新补充其实这款i的cells都是指用多少位来表示地址和大小,并且单位是bytesdts和dtsi的共同跟文件dts和dt......
  • QT显示插件(LinuxFB)及其依赖的驱动(DRM/framebuffer)记录
    关键词:Framebuffer、linuxfb、DRM等等。 QT在Linux中支持多种显示插件,包括EGLFS、LinuxFB、DirectFB、Wayland等。可以通过--platfrom选项指定选择何种插件。比如:./analogclock--platformlinuxfb。QT支持多种显示插件,显示插件打开Linux内核fb设备,Linux内核中GPU/Display驱动......