t113-c-framebuffer-画点篇
1.linux-tina-编译篇2.tina环境布局与ssh篇3.t113-c-dts探索篇14.t113-c-dts学习篇25.t113-c-驱动ko制作与运行篇6.t113-c-内核驱动寻找问题篇7.t113-c-内核字符型设备驱动篇8.t113-c字符型驱动复盘(自动创建设备文件)9.t113-c-设备树-驱动调用篇(获取设备节点和属性)10.t113-c-led驱动篇(调用设备树)11.t113-c-spi驱动篇前篇12.T113学习之-lcd--framebuffer篇13.t113-c-udp篇
14.t113-c-framebuffer-画点篇
15.v831-T113-c-udp发送篇16.t113-c-i2s学习篇(cards)17.t113-c-i2s设备设置尝试18.t113-c-wpa_cli遇到问题19.t113-c-多点触摸20.t113-c-lvgl触摸接口接入21.t113-c-lvgl-animation之bug22.t113-c-lvgl-anim篇23.t113-shell文件制作本来今天是要结合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来判断是否到达所需要的位置,这样会每行比上一行少一个点数。解决办法如上图所示
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· AI 智能体引爆开源社区「GitHub 热点速览」