Linux Framebuffer 实验
一、准备
- linux虚拟机或ARM开发板
- Ubuntu18.04
二、Framebuffer介绍
次笔记主要的目的是实验,所以我不介绍了,有需要的小伙伴可以去看下面博客
Linux LCD Frambuffer 基础介绍和使用:https://blog.51cto.com/u_13064014/5079683
Linux应用开发【第一章】Framebuffer应用开发:https://zhuanlan.zhihu.com/p/443120506
Linux Framebuffer 技术:https://zhuanlan.zhihu.com/p/496623603
为了能直观的看明白 Framebuffer 的原理,所以我从他们博客中引用了几张图片,如下所示:
-
LCD 显示原理
-
Framebuffer架构
从上面图中很容易看明白Framebuffer是怎么回事,接下来我们进行测试,分别在ubuntu和ARM开发板上进行测试。
三、Framebuffer 测试命令
为了方便测试 Framebuffer 可用,可以快速通过命令进行简单测试,如下所示:
-
清屏命令
dd if=/dev/zero of=/dev/fb0 dd if=/dev/zero of=/dev/fb0 bs=1024 count=768 -
截屏命令
dd if=/dev/fb0 of=fbfile cp /dev/fb0 fbfile 注意:这里的截屏其实就是拷贝 中的数据,所以只有当framebuffer中有数据存在时才能截屏成功
-
将保存的信息显示传回framebuffer
dd if=fbfile of=/dev/fb0 -
往屏幕的左上角画一个白色的像素点
echo -en '\xFF\xFF\xFF\x00' > /dev/fb0 -
花屏指令
cat /dev/urandom > /dev/fb0
四、Framebuffer 测试程序
fb_test_app.c文件
#include <stdio.h> #include <unistd.h> #include <fcntl.h> #include <string.h> #include <stdlib.h> #include <sys/ioctl.h> /* 显示屏相关头文件 */ #include <linux/fb.h> #include <sys/mman.h> typedef struct lcd_color { unsigned char bule; unsigned char green; unsigned char red; unsigned char alpha; } lcd_color; /** * 更新屏幕显示内存块信息,颜色格式为RGB8888 */ void screen_refresh(char *fbp, lcd_color color_buff, long screen_size) { for(int i=0; i < screen_size; i+=4) { *((lcd_color*)(fbp + i)) = color_buff; } usleep(1000*2000); } int main() { int fp = 0; int rgb_type = 0; long screen_size = 0; struct fb_var_screeninfo vinfo; struct fb_fix_screeninfo finfo; unsigned char *fbp = 0; fp = open("/dev/fb0", O_RDWR); if (fp < 0) { printf("Error : Can not open framebuffer device/n"); exit(1); } if (ioctl(fp, FBIOGET_FSCREENINFO, &finfo)) { printf("Error reading fixed information/n"); exit(2); } if (ioctl(fp, FBIOGET_VSCREENINFO, &vinfo)) { printf("Error reading variable information/n"); exit(3); } /* 打印获取的屏幕信息 */ printf("The mem is :%d\n", finfo.smem_len); printf("The line_length is :%d\n", finfo.line_length); printf("The xres is :%d\n", vinfo.xres); printf("The yres is :%d\n", vinfo.yres); printf("bits_per_pixel is :%d\n", vinfo.bits_per_pixel); /* 获取RGB的颜色颜色格式,比如RGB8888、RGB656 */ rgb_type = vinfo.bits_per_pixel / 8; /* 屏幕的像素点 */ screen_size = vinfo.xres * vinfo.yres * rgb_type; /* 映射 framebuffer 的缓冲空间,得到一个指向这块空间的指针 */ fbp =(unsigned char *) mmap (NULL, screen_size, PROT_READ | PROT_WRITE, MAP_SHARED, fp, 0); if (fbp == NULL) { printf ("Error: failed to map framebuffer device to memory./n"); exit (4); } /* 刷白屏 */ memset(fbp, 0xff, screen_size); usleep(1000*2000); /* 我的显示屏是RGDA的,所以县色格式为32为,注意自己的显示屏信息,对应修改 */ /* 刷红色 */ screen_refresh(fbp, (lcd_color){0, 0, 255, 255}, screen_size); /* 刷绿色 */ screen_refresh(fbp, (lcd_color){0, 255, 0, 255}, screen_size); /* 刷蓝色 */ screen_refresh(fbp, (lcd_color){255, 0, 0, 255}, screen_size); /* 解除映射 */ munmap (fbp, screen_size); close(fp); return 0; }
makefile 文件
out_file_name = "fb_test_app" all: fb_test_app.c # gcc $^ -o $(out_file_name) arm-linux-gnueabihf-gcc $^ -o $(out_file_name) .PHONY: clean clean: rm $(out_file_name)
五、ubuntu测试
-
驱动查看
测试之前先查看自己的虚拟机是否开启了Framebuffer驱动,在设备中可以看到fbx
的驱动,并且主设备号为29ls /dev/fb* -l -
关闭图形显示
因为在虚拟机中,不关闭图形显示会看不到现象,也有可能信息会被其他显示模块覆盖# 关闭图形显示 systemctl set-default multi-user.target reboot # 打开图形显示 systemctl set-default graphical.target reboot -
运行测试程序
./fb_test_app 注意:如果出现错误
Error : can not open framebuffer device
时,切换到root用户执行即可 -
测试结果
注意:这里显示的图像会把命令窗口给覆盖,所以看不到运行时打印的信息
六、ARM开发板测试
从图中可以看出执行后打印的信息,到此我们测试就算完成了,说明LCD的驱动是没问题的,可以进行GUI的开发。
注意:如果LCD的屏是RGB8888格式的,那么可能出现黑屏不显示的现象,这是需要适当调整一下数据格式,如下图所示:
参考链接
Linux LCD Frambuffer 基础介绍和使用:https://blog.51cto.com/u_13064014/5079683
Linux应用开发【第一章】Framebuffer应用开发:https://zhuanlan.zhihu.com/p/443120506
Linux Framebuffer 技术:https://zhuanlan.zhihu.com/p/496623603
本文来自博客园,作者:浇筑菜鸟,转载请注明原文链接:https://www.cnblogs.com/jzcn/p/16898249.html
如本博客的内容侵犯了你的权益,请与以下地址联系,本人获知后,马上删除。同时本人深表歉意,并致以崇高的谢意! cn_jiaozhu@qq.com
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)