T113学习之-lcd--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文件制作屏幕到了,之前的屏幕不知道哪步出错,一直点不亮,白瞎了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);//清个白屏试试
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· AI 智能体引爆开源社区「GitHub 热点速览」