文章目录

  • 1.测试流程和结果
    • 1.1 使能HDMI
    • 1.2 framebuffer操作流程
    • 1.3 测试结果
  • 2.测试过程详述
    • 2.1 编译源码
    • 2.2上传可执行文件
    • 2.3修改文件的权限,执行文件
  • 3.源码解释
    • 3.1 HDMI使用的颜色格式是ARGB
  • 4.源码工程链接

这部分linux笔记是记录我入门的过程,内容基本都是照着别人的文章,自己操作一遍,重走一次别人走过的路。
参考文章:
1.作者:闪耀大叔,文章《 嵌入式Linux入门-Framebuffer应用编程在Linux系统下画个点》。

1.测试流程和结果

1.1 使能HDMI

我前2天想把韦东山老师的《buildroot_dongshannezhastu》工程改成启动时有HDMI输出,结果没有成功。只能先利用上一篇文章的方法启动HDMI《linux笔记(6):东山哪吒D1H测试HDMI显示内置图片-命令行调试》。

1.2 framebuffer操作流程

1.打开设备节点:open(“/dev/fb0”, O_RDWR)

2.获取LCD参数:ioctl(fd_fb, FBIOGET_VSCREENINFO, &var)

3.映射Framebuffer:mmap(NULL , screen_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd_fb, 0)

4.操作Framebuffer

5.取消映射 munmap (fb_base, screen_size)

6.关闭设备节点 close(fd_fb)

1.3 测试结果

在屏幕上描出不同颜色:

2.测试过程详述

2.1 编译源码

把源码fb001 – https://gitee.com/huangweide001/linux-d1-h-test/tree/master/fb001 下载下来,进入工程,直接使用 make 命令编译。

2.2上传可执行文件

我上传应用程序到开发板的步骤是不是太复杂?

2.3修改文件的权限,执行文件

> chmod 777 test
> ./test
1.open /dev/fb0
2.get V Screen INFO
width:800,hight:1280,bits_per_pixel:32
3.get framebuffer base address
fb_base:0xf1f6f000
4.flush screen in different colors
5.draw 30 lines in different colors

3.源码解释

3.1 HDMI使用的颜色格式是ARGB

可以参考这个文章《ARGB与RGB区别及透明度和RGB颜色对照表》。
ARGB从表面看比RGB多了个A,也是一种色彩模式,是在RGB的基础上添加了Alpha(透明度)通道。透明度也是以0到255表示的,所以也是总共有256级,透明是0,不透明是255。
用十六进制的格式来表示ARGB就是:0xAARRGGBB。
东山哪吒开发板的HDMI驱动使用的是ARGB,如果直接使用RGB格式,相当于ARGB的透明格式,显示出来是黑色的。
比如上面的参考文章使用的是RGB格式:

我画30条线使用的30种颜色数据:

举个例子,要正常显示红色(0x00FF0000),要使表示透明度的字节不为0.上面的A=0xFF和A=0x7F都可以正常显示。

#include <stdio.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <string.h>
#include <linux/fb.h>
#include <unistd.h>static int fd_fb;
static struct fb_var_screeninfo var;    /* Current var */
static int screen_size;
static unsigned char *fb_base;
static unsigned int line_width;
static unsigned int pixel_width;void lcd_put_pixel(int x, int y, unsigned int color)
//传入的 color 表示颜色,它的格式永远是 0x00RRGGBB,即 RGB888。
//当 LCD 是 16bpp 时,要把 color 变量中的 R、 G、 B 抽出来再合并成 RGB565 格式。
{unsigned char *pen_8 = fb_base+y*line_width+x*pixel_width;//计算(x,y)坐标上像素对应的 Framebuffer 地址。unsigned short *pen_16;unsigned int *pen_32;unsigned int red, green, blue;pen_16 = (unsigned short *)pen_8;pen_32 = (unsigned int *)pen_8;switch (var.bits_per_pixel){//对于 8bpp, color 就不再表示 RBG 三原色了,这涉及调色板的概念, color 是调色板的值。case 8:{*pen_8 = color;break;}case 16:{//  R5 G6 B5 //先从 color 变量中把 R、 G、 B 抽出来。red = (color >> 16) & 0xff;green = (color >> 8) & 0xff;blue = (color >> 0) & 0xff;//把 red、 green、 blue 这三种 8 位颜色值,根据 RGB565 的格式,//只保留 red 中的高 5 位、 green 中的高 6 位、 blue 中的高 5 位,//组合成一个新的 16 位颜色值。color = ((red >> 3) << 11) | ((green >> 2) << 5) | (blue >> 3);//把新的 16 位颜色值写入 Framebuffer*pen_16 = color;break;}case 32:{//对于 32bpp,颜色格式跟 color 参数一致,可以直接写入Framebuffer*pen_32 = color;break;}default:{printf("can't surport %dbpp\n",var.bits_per_pixel);break;}}
}void    blushScreen2(unsigned int color)
{// 这里只考虑24色,也就是HDMI的情况unsigned int * p32=(unsigned int *)fb_base;unsigned int h,w;for(h=0;h<var.yres;h++)for(w=0;w<var.xres;w++){*p32= color;p32++;}
}
int main(int argc,int **argv)
{   int i;printf("1.open /dev/fb0\n");fd_fb = open("/dev/fb0", O_RDWR);if (fd_fb < 0){printf("can't open /dev/fb0\n");return -1;}    printf("2.get V Screen INFO\n");if (ioctl(fd_fb, FBIOGET_VSCREENINFO, &var)){printf("can't get var\n");return -1;}line_width = var.xres * var.bits_per_pixel / 8;pixel_width = var.bits_per_pixel / 8;screen_size = var.xres * var.yres * var.bits_per_pixel / 8;printf("width:%d,hight:%d,bits_per_pixel:%d\n",var.xres,var.yres,var.bits_per_pixel);printf("3.get framebuffer base address\n");fb_base = (unsigned char *)mmap(NULL , screen_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd_fb, 0);if (fb_base == (unsigned char *)-1){printf("can't mmap\n");return -1;}else{        printf("fb_base:0x%8x\n",fb_base);}unsigned char colorData[10]={0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99,0xff};unsigned int cData[30] = {0xFFFF0000,0xFF00FF00,0xFF0000FF,0xFFFFFF00,0xFFFF00FF,0xFF00FFFF,0xFF7F7F7F,0xFF007F7F,0xFF7F007F,0xFF7F7F00,//  0-9     FF开头0x7FFF0000,0x7F00FF00,0x7F0000FF,0x7FFFFF00,0x7FFF00FF,0x7F00FFFF,0x7F7F7F7F,0x7F007F7F,0x7F7F007F,0x7F7F7F00,//  10-19   7F开头0x00FF0000,0x0000FF00,0x000000FF,0x00FFFF00,0x00FF00FF,0x0000FFFF,0x007F7F7F,0x00007F7F,0x007F007F,0x007F7F00};//  20-29  00开头printf("4.flush screen in different colors\n");                      for(i = 0;i<10;i++){memset(fb_base,colorData[i],screen_size );sleep(1);//usleep(100*1000);}printf("5.draw 30 lines in different colors\n"); for (int j = 0; j < 30;j++){for (i = 0; i < 100; i++) {lcd_put_pixel(var.xres/3+i, var.yres/4+20*j+0, cData[j] );lcd_put_pixel(var.xres/3+i, var.yres/4+20*j+1, cData[j] );lcd_put_pixel(var.xres/3+i, var.yres/4+20*j+2, cData[j] );lcd_put_pixel(var.xres/3+i, var.yres/4+20*j+3, cData[j] );}}munmap (fb_base, screen_size);            close(fd_fb);return 0;
}

4.源码工程链接

源码工程fb001

可以控制显示后,下一步就是移植 lvgl ,请浏览下一篇文章《linux笔记(8):东山哪吒D1H移植lvgl(HDMI输出)》。

linux笔记(7):东山哪吒D1H使用framebuffer画直线(HDMI输出)相关推荐

  1. linux笔记(8):东山哪吒D1H移植lvgl(HDMI输出)

    文章目录 1. 下载,修改,编译源码 1.1下载源码 1.1.1新建一个`lvgl`目录,在该目录下下载源码 1.1.2 在`lvgl`目录下再建一个`myspace/lvgl_demo`目录,把参与 ...

  2. linux笔记(6):东山哪吒D1H测试HDMI显示内置图片-命令行调试

    文章目录 1.测试流程和结果 2.测试过程详解 2.1 挂载测试工具 1.2 设置参数 1.2.1设置name 1.2.2选择命令 1.2.3 设置命令参数 1.3 指定显示测试图片 1.4开启显示 ...

  3. 全志哪吒D1-H Tina Linux Ubuntu 22.04入门踩坑日记

    哪吒D1-H Tina Linux入门踩坑日记 系统环境 源码编译 mklibs-readelf的C++标准问题 m4的SIGSTKSZ问题 libfakeroot的_STAT_VER问题 read_ ...

  4. 【Linux笔记】LED驱动程序

    前言 上一篇我们分享了字符设备驱动框架:[Linux笔记]驱动基础篇,当时分享的是hello驱动程序. 学STM32我们从点灯开始,学Linux驱动我们自然也要点个灯来玩玩,尽量在从这些基础例程中榨取 ...

  5. linux中文麻酱字_【树】Linux笔记 1

    以下内容是参与[生信技能树-全球听第7期]的课程笔记,记录人:小瑛  ,有问题可在公众号后台留言 小白小白,请注意:笔记中出现的所有文件路径,仅作为参考,请勿模仿! 1. 登录服务器 1.1 Mac电 ...

  6. 【Linux笔记】CentOS下找不到eth0设备的解决方法

    [Linux笔记]CentOS下找不到eth0设备的解决方法 参考文章: (1)[Linux笔记]CentOS下找不到eth0设备的解决方法 (2)https://www.cnblogs.com/ly ...

  7. linux网络配置命令笔记,初学者学习linux笔记与练习-第二天。一些基本命令以及初级网络配置...

    菜鸟学习linux笔记与练习-----第二天.一些基本命令以及初级网络配置 基本命令 ??uname -a -s ??hostname显示主机名 若是要永久生效,则编辑以下文件 ??#vim /etc ...

  8. linux fb应用例子,Linux下利用framebuffer画点的程序小例子

    Linux下利用framebuffer画点的程序小例子: /* * ================================================================== ...

  9. 分享:玩Linux笔记(2) —— 神奇的curl工具

    玩Linux笔记(2) -- 神奇的curl工具 http://my.oschina.net/chihz/blog/96101

最新文章

  1. 报表统计-mysql存储过程
  2. 基于jQuery的图片异步加载和预加载实例
  3. LInux找不到动态链接库,./cyusb_linux: error while loading shared libraries: libcyusb.so: cannot open shared
  4. 解惑:如何使用html+css+js实现旋转相册,立方体相册等动画效果
  5. gradle 指定springcloud 版本_springcloud小技能:服务注册发现如何隔离
  6. linux通过spi和stm32通信,双STM32通过SPI进行通信
  7. 数据结构与算法 | 来来来,让我们重新认识一下什么是树
  8. java string 精度_Java 中的浮点数取精度方法
  9. JavaScript HTML DOM 事件(笔记)
  10. 小程序识别车牌php,微信小程序——车牌键盘输入js+css
  11. ArduinoUNO实战-第十七章-火焰传感器
  12. pdf如何转化成word文档?
  13. google广告分类
  14. php显示某年某月某日,C++_C++自定义函数判断某年某月某日是这一年中第几天,本文实例讲述了C++自定义函数 - phpStudy...
  15. 织梦dede canonical 标签页面设置(最新完美修改)
  16. dapi 基于Django的轻量级接口测试平台一
  17. xshell用rz上传文件,彻底解决乱码
  18. cmd 命令行执行 Python 脚本
  19. Tomcat目录结构
  20. 【电子设计大赛】2019 年全国大学生电子设计竞赛 仪器设备和主要元器件清单

热门文章

  1. qq里面cap字符_qq字符ari什么意思?
  2. 爬取原神同人社的pljj照片
  3. 一文理解什么是公民开发
  4. 免费白嫖 OCR 工具(专业版+简易版) 你适合哪个呢?
  5. 量子计算:当前阶段仍属于热炒概念
  6. 【实战】“TED”演讲——可视化分析
  7. RK3399平台开发系列讲解(中断篇)13.17、中断处理方式的汇总
  8. Springboot+vue+java企业员工绩效考核管理系统
  9. 思科模拟器教程-RIP、OSPF路由协议重发布
  10. vue 基于 Export2Excel.js 导出 Excel