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
四、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
Linux Framebuffer 实验的更多相关文章
- Linux Framebuffer驱动剖析之一—软件需求
嵌入式企鹅圈将以本文作为2015年的终结篇,以回应第一篇<Linux字符设备驱动剖析>.嵌入式企鹅圈一直专注于嵌入式Linux和物联网IOT两方面的原创技术分享,稍后会发布嵌入式企鹅圈的2 ...
- Linux framebuffer测试程序
Linux framebuffer的框架非常简单, 对于应用程序就是操作一块内存(俗称帧缓存), 当然也有可能是双缓存, 一般用于高帧率场景, 一块帧在填充数据时, 另一块在显示, 接着对调过来, 那 ...
- Linux Framebuffer save as picture
/********************************************************************************* * Linux Framebuff ...
- Linux Framebuffer驱动剖析之中的一个—软件需求
嵌入式企鹅圈将以本文作为2015年的终结篇,以回应第一篇<Linux字符设备驱动剖析>.嵌入式企鹅圈一直专注于嵌入式Linux和物联网IOT双方面的原创技术分享,稍后会公布嵌入式企鹅圈的2 ...
- Linux Framebuffer驱动框架之二软件架构(未完待续)【转】
本文转载自:http://blog.csdn.net/gqb_driver/article/details/12918547 /************************************ ...
- Linux Framebuffer 驱动框架之一概念介绍及LCD硬件原理【转】
本文转载自:http://blog.csdn.net/liuxd3000/article/details/17464779 一.基本概念 帧缓冲(Framebuffer)是Linux系统为显示设备提供 ...
- Linux系统实验
前言:怎么感觉Linux运维和Linux系统实验没什么关系?该不会的还是不会(@@).记录一下几个实验吧. 本篇目录: 实验一 编程环境 实验二 文件读写 实验三 进程通信 实验一 编程环境√ 实验步 ...
- VirtualBox双网卡搭建Linux虚拟实验环境
VirtualBox中有如下几种网络连接方式: NAT(NAT到宿主机IP地址) NAT Network (NAT到宿主机所在的网段,即使用相同的网关和掩码) Bridged Adapter Inte ...
- 【原】Linux Raid 实验
本文参照以下两个链接,将实验重做了一遍,目的就是加深印象及提升实操能力 参照链接:http://www.opsers.org/base/learning-linux-the-day-that-the- ...
- 20135208 20135212 LINUX第一次实验报告
北京电子科技学院(BESTI) 实 验 报 告 课程:信息安全系统设计基础 班级: 201352 姓名:池彬宁 贺邦 学号:2013521 ...
随机推荐
- 第七十二篇:Vue组件的props
好家伙, 1.组件的props props是组件的自定义属性,在封装通用组件的时候,合理的使用props可以极大的提高组件的复用性 来假设一下,如果我们需要两个组件分别显示不同的值 目录结构如下: H ...
- 荣获 Neo4j Certified Professional
在学习 Neo4j 的过程中,偶然得知官方的认证考试,所以当时就决定通过这项考试,功夫不负有心人,我成功的拿到了Neo4j Certified Professional认证证书 关于认证途径,请访问链 ...
- KingbaseES 支持列加密
KINGBASE 列加密支持 sm4 和 rc4 加密算法,具体算法在 initdb 时指定,默认是 sm4.要使用列加密,必须 shared_preload_libraries = 'sysencr ...
- 在Ubuntu 主机上使用 Cockpit 管理容器
如果你管理着一台 Linux 服务器,那么你可能正在寻找一个可靠的管理工具.为了这个你可能已经看了 Webmin 和 cPanel 这类软件.但是,如果你正在寻找一种简单的方法来管理还包括了 Dock ...
- MySQL数据库-数据表(下)
分析:给 reader 表添加数据. INSERT INTO:插入数据,插入数据的时候会检查主键或者唯一索引,如果出现重复就会报错: 语法:INSERT INTO table_name VALUES ...
- vue通过插件实现PDF生成以及下载
第一步: 安装插件 npm install --save html2canvas //将html转换成图片 npm install jspdf --save //将图片生成pdf 第二步: 在需要的地 ...
- frp服务利用云主机实现Windows远程连接
frp服务利用云主机实现Windows远程连接 1.下载所需要的安装包 https://github.com/fatedier/frp/releases 下载 frp_0.44.0_linux_amd ...
- NOIP 2013 洛谷P1966 火柴排队 (树状数组求逆序对)
对于a[],b[]两个数组,我们应选取其中一个为基准,再运用树状数组求逆序对的方法就行了. 大佬博客:https://www.cnblogs.com/luckyblock/p/11482130.htm ...
- 2022.2.26A组总结&反思
今天的发挥比较奇妙.. T1:一眼dp+高斯消元,但是感觉细节比较多,然后先去做了T2,写完后回来推了一下就做出来了.比较裸,但是细节确实多,但是很可惜的一点是最后提交的代码没有判不合法,到手的100 ...
- Hbase之命令
Hbase之命令 -- 查询数据量 hbase org.apache.hadoop.hbase.mapreduce.RowCounter '{namespaceName:tablename}' cou ...