一、准备

  1. linux虚拟机或ARM开发板
  2. 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 的原理,所以我从他们博客中引用了几张图片,如下所示:

  1. LCD 显示原理

  2. Framebuffer架构



从上面图中很容易看明白Framebuffer是怎么回事,接下来我们进行测试,分别在ubuntu和ARM开发板上进行测试。

三、Framebuffer 测试命令

为了方便测试 Framebuffer 可用,可以快速通过命令进行简单测试,如下所示:

  1. 清屏命令

    dd if=/dev/zero of=/dev/fb0
    dd if=/dev/zero of=/dev/fb0 bs=1024 count=768
  2. 截屏命令

    dd if=/dev/fb0 of=fbfile
    cp /dev/fb0 fbfile

    注意:这里的截屏其实就是拷贝 中的数据,所以只有当framebuffer中有数据存在时才能截屏成功

  3. 将保存的信息显示传回framebuffer

    dd if=fbfile of=/dev/fb0
  4. 往屏幕的左上角画一个白色的像素点

    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测试

  1. 驱动查看

    测试之前先查看自己的虚拟机是否开启了Framebuffer驱动,在设备中可以看到 fbx的驱动,并且主设备号为29

    ls /dev/fb* -l
  2. 关闭图形显示

    因为在虚拟机中,不关闭图形显示会看不到现象,也有可能信息会被其他显示模块覆盖

    # 关闭图形显示
    systemctl set-default multi-user.target
    reboot # 打开图形显示
    systemctl set-default graphical.target
    reboot
  3. 运行测试程序

    ./fb_test_app

    注意:如果出现错误Error : can not open framebuffer device 时,切换到root用户执行即可

  4. 测试结果



    注意:这里显示的图像会把命令窗口给覆盖,所以看不到运行时打印的信息

六、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 实验的更多相关文章

  1. Linux Framebuffer驱动剖析之一—软件需求

    嵌入式企鹅圈将以本文作为2015年的终结篇,以回应第一篇<Linux字符设备驱动剖析>.嵌入式企鹅圈一直专注于嵌入式Linux和物联网IOT两方面的原创技术分享,稍后会发布嵌入式企鹅圈的2 ...

  2. Linux framebuffer测试程序

    Linux framebuffer的框架非常简单, 对于应用程序就是操作一块内存(俗称帧缓存), 当然也有可能是双缓存, 一般用于高帧率场景, 一块帧在填充数据时, 另一块在显示, 接着对调过来, 那 ...

  3. Linux Framebuffer save as picture

    /********************************************************************************* * Linux Framebuff ...

  4. Linux Framebuffer驱动剖析之中的一个—软件需求

    嵌入式企鹅圈将以本文作为2015年的终结篇,以回应第一篇<Linux字符设备驱动剖析>.嵌入式企鹅圈一直专注于嵌入式Linux和物联网IOT双方面的原创技术分享,稍后会公布嵌入式企鹅圈的2 ...

  5. Linux Framebuffer驱动框架之二软件架构(未完待续)【转】

    本文转载自:http://blog.csdn.net/gqb_driver/article/details/12918547 /************************************ ...

  6. Linux Framebuffer 驱动框架之一概念介绍及LCD硬件原理【转】

    本文转载自:http://blog.csdn.net/liuxd3000/article/details/17464779 一.基本概念 帧缓冲(Framebuffer)是Linux系统为显示设备提供 ...

  7. Linux系统实验

    前言:怎么感觉Linux运维和Linux系统实验没什么关系?该不会的还是不会(@@).记录一下几个实验吧. 本篇目录: 实验一 编程环境 实验二 文件读写 实验三 进程通信 实验一 编程环境√ 实验步 ...

  8. VirtualBox双网卡搭建Linux虚拟实验环境

    VirtualBox中有如下几种网络连接方式: NAT(NAT到宿主机IP地址) NAT Network (NAT到宿主机所在的网段,即使用相同的网关和掩码) Bridged Adapter Inte ...

  9. 【原】Linux Raid 实验

    本文参照以下两个链接,将实验重做了一遍,目的就是加深印象及提升实操能力 参照链接:http://www.opsers.org/base/learning-linux-the-day-that-the- ...

  10. 20135208 20135212 LINUX第一次实验报告

    北京电子科技学院(BESTI) 实     验    报     告 课程:信息安全系统设计基础                     班级: 201352 姓名:池彬宁 贺邦 学号:2013521 ...

随机推荐

  1. Linux配置bond模式 双网卡绑定步骤

    什么是bond 网卡bond是通过多张网卡绑定为一个逻辑网卡,实现本地网卡的冗余,带宽扩容和负载均衡,在生产场景中是一种常用的技术.Kernels 2.4.12及以后的版本均供bonding模块,以前 ...

  2. KingbaseES 查询计划剖析

    概述:了解KingbaseES查询计划对于开发人员和数据库管理员来说都是一项关键技能.这可能是优化SQL查询的第一件事,也是验证优化的SQL查询是否确实实现期望结果的方式. 1.KingbaseES数 ...

  3. Windows Server体验之应用兼容性按需功能

    Windows Server默认仅能支持几个有图形界面的应用包括注册表编辑器regedit.记事本notepad.任务管理器taskmgr.时间设置control timedate.cpl.区域设置c ...

  4. 2021年1月-第02阶段-前端基础-HTML+CSS阶段-Day01

    HTML5 第一天 一.什么是 HTML5 1.HTML5 的概念与定义 定义:HTML5 定义了 HTML 标准的最新版本,是对 HTML 的第五次重大修改,号称下一代的 HTML 两个概念: 是一 ...

  5. logstash知识点

    Logstash是位于Data和Elasticsearch之间的一个中间件.Logstash是一个功能强大的工具,可与各种部署集成. 它提供了大量插件. 它从数据源实时地把数据进行采集,可帮助您解析, ...

  6. 使用Prometheus和Grafana监控nacos集群

    官方文档:https://nacos.io/zh-cn/docs/monitor-guide.html 按照部署文档搭建好Nacos集群 配置application.properties文件,暴露me ...

  7. shell分割字符串并赋值给变量

    假如变量var的值为:num=12,也即var="num=12",现在想把 12赋值给变量id awk 的-F 后跟上要分割字符串时的指定分隔符 awk中$0是要分割的字符串,$1 ...

  8. MySQL 安装(二进制版)

    MySQL 的安装方式一般分为三种,二进制版本.编译版本.RPM 包.比较常见的是二进制版本安装,方便简单,相对于编译安装,如果不是追求极致性能,使用起来差别不大.本次教程以二进制版本为例,系统为 c ...

  9. Mysql三种日志(binlog,redolog,undolog)的作用和区别

    Mysql有三种很重要的日志也是面试经常涉及到的考点,分别是 binlog .redo log和undo log, 这里面binlog 是server层实现的日志,而redo log 和undo lo ...

  10. 制造企业有可能自行开发ERP系统吗?

    当然可以啊! 生产企业对于ERP的需求是一直存在的,但市场上多为标准化的产品,与企业的个性化需求矛盾着. 有很多制造企业自行开发ERP系统啊!只是各个企业成效不同而已,毕竟不同企业的IT开发能力不同而 ...