Linux Framebuffer 实验

一、准备

  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 显示原理
    Linux Framebuffer 实验

  2. Framebuffer架构
    Linux Framebuffer 实验
    Linux 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 'xFFxFFxFFx00' > /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 :%dn", finfo.smem_len);     printf("The line_length is :%dn", finfo.line_length);     printf("The xres is :%dn", vinfo.xres);     printf("The yres is :%dn", vinfo.yres);     printf("bits_per_pixel is :%dn", 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. 测试结果
    Linux Framebuffer 实验
    Linux Framebuffer 实验

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

六、ARM开发板测试

Linux Framebuffer 实验
从图中可以看出执行后打印的信息,到此我们测试就算完成了,说明LCD的驱动是没问题的,可以进行GUI的开发。
注意:如果LCD的屏是RGB8888格式的,那么可能出现黑屏不显示的现象,这是需要适当调整一下数据格式,如下图所示:
Linux 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

发表评论

评论已关闭。

相关文章