LinuxLCDFrambuffer基础介绍和使用方法

嵌入式ARM 2023-06-26 12:01

1、什么是Framebuffer?

Framebuffer 字面意思就是帧缓存的意思,即显存,里面保存着一帧图像。事实上,对于嵌入式系统而言,没有真正意义上的显存,Framebuffer 是通过内存模拟出来的。

LCD FrameBuffer 里的若干字节表示(具体根据驱动适配),LCD 屏幕上的一个像素点。

  • RGB888:32bpp,占4字节,分别是A8、R8、G8、B8,一般只用其中低24位,高8位表示透明度。
  • RGB565:16bpp,占2字节,分别是R5、G6、B5,比较常用的一种颜色。
  • RGB555:很少用。

假设LCD屏幕分辨率是800x600,每个像素占4字节,那么framebuffer 大小就是:

800 x 600 x 4 = 960000 字节

framebuffer 显示原理,如下图所示:

假设需要设置 LCD 中坐标(x,y)处像素的颜色,首要要找到这个像素对应的内存,然后根据它的 BPP 值设置颜色。

假设 fb_base 是 APP 执行 mmap 后得到的 Framebuffer 地址,如下图所示:

(x,y)像素起始地址=fb_base+(xres*bpp/8)y + xbpp/8

2、为什么要有Frambuffer?

思考一个问题,为什么要用Framebuffer?

上图为LCD 驱动框架图:

从软件层面分析:framebuffer 起着承上启下的作用,向上,为应用层提供通用系统调用(open(),ioctl(),mmap());向下,联接LCD控制器,之前对硬件进行操作。

从硬件层面分析:用户只需要将数据写到framebuffer,硬件会自动刷新到屏幕上。

3、常用接口和数据结构

3.1 常用接口

  1. 打开设备:open()系统调用。

通过 man 2 查看如下:

函数说明:


  1. ioctl 系统调用:

函数原型:

int ioctl(int fd, unsigned long request, ...);

函数说明:

  • fd :表示文件描述符;

  • request:表示与驱动程序交互的命令,用不同的命令控制驱动程序输出我们需要的数据。

  • … :表示可变参数arg,根据request命令,设备驱动程序返回输出的数据。

  • 返回值:打开成功返回文件描述符,失败将返回-1。

3)mmap 系统调用:

函数说明:

3.2 相关数据结构

fb_var_screeninfo:包含xres, yres, bits_per_pixel等信息,在后续会经常用到。

4、如何在LCD 上描点?

4.1 LCD 显示原理

当我们需要显示一个字母‘A’时,是通过判断点阵的每一个位数值状态,来填充颜色,达到显示字符效果。其中‘1’表示一种颜色,‘0’表示填充另一种颜色。

如下图[1]8*16的点阵,只要有这个点阵,我们就可以在LCD上面描点,达到显示字符的效果。

4.2 Framebuffer 操作说明

framebuffer 操作如下流程:

  • 打开设备(open)
  • 获取屏幕参数信息(ioctl)
  • 分配显存(mmap)
  • 描点/写数据
  • 释放资源(unmmap)
  • 关闭设备(close)
int fd_fb;
struct fb_var_screeninfo var; /* Current var */
int screen_size;
unsigned char *fbmem;
unsigned int line_width;
unsigned int pixel_width;

int main(int argc, char *argv[])
{
    /*Step1: 打开设备 */
    fd_fb = open("/dev/fb0", O_RDWR);
 if (fd_fb < 0)
 {
  printf("can't open /dev/fb0\n");
  return -1;
 }
    
    /*Step2:获取设备参数信息 
    * xres:x 方向总像素
    * yres:y 方向总像素
    * bits_per_pixel:每个像素占多少位
    */

 if (ioctl(fd_fb, FBIOGET_VSCREENINFO, &var))
 {
  printf("can't get var\n");
  return -1;
 }

    /* Step3: 计算线宽,分配显存 */
    /* line_width 每行占的字节 */
 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;
 fbmem = (unsigned char *)mmap(NULL , screen_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd_fb, 0);
 if (fbmem == (unsigned char *)-1)
 {
  printf("can't mmap\n");
  return -1;
 }

 /* Step4: 清屏: 全部设为黑色 */
 memset(fbmem, 0, screen_size);

   /* Step5: 描点 */
 lcd_put_ascii(var.xres/2, var.yres/2'A'); /*在屏幕中间显示8*16的字母A*/
 
    /* Step6:释放资源*/
 munmap(fbmem , screen_size);
    /* Step7:关闭设备 */
 close(fd_fb);
 
 return 0;     
}

4.3 描点实现

描点的关键是计算点(x,y)位置对应的地址,然后直接指向fbmem即可向frambuffer 写入数据。

/**********************************************************************
 * 函数名称:lcd_put_pixel
 * 功能描述: 在LCD指定位置上输出指定颜色(描点)
 * 输入参数:x坐标,y坐标,颜色
 * 输出参数: 无
 * 返 回 值: 会
 ***********************************************************************/
 
void lcd_put_pixel(int x, int y, unsigned int color)
{
  /* 
  * 最主要的就是fbmem 
  * 计算(x,y)位置的偏移,然后指向fbmem,这块直接映射到framebuffer 内存里
  */

  unsigned char *pen_8 = fbmem+y*line_width+x*pixel_width;
  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*/
    case 8:
    {
      *pen_8 = color;
      break;
    }
        /*16 bpp */
    case 16:
    {
      /* 565 */
      red   = (color >> 16) & 0xff;
      green = (color >> 8) & 0xff;
      blue  = (color >> 0) & 0xff;
      color = ((red >> 3) << 11) | ((green >> 2) << 5) | (blue >> 3);
      *pen_16 = color;
      break;
    }
    case 32:
    {
      *pen_32 = color;
      break;
    }
    default:
    {
      printf("can't surport %dbpp\n", var.bits_per_pixel);
      break;
    }
  }
}

4.4 向 LCD 写入 英文

写入英文的前提:

  • 描点函数已实现;
  • 具备该英文字符的点阵数据;
/**********************************************************************
 * 函数名称:lcd_put_ascii
 * 功能描述: 在LCD指定位置上显示一个8*16的字符
 * 输入参数:x坐标,y坐标,ascii码
 * 输出参数: 无
 * 返 回 值: 无
 ***********************************************************************/
 
void lcd_put_ascii(int x, int y, unsigned char c)
{
    /* fontdata_8x16 8x16 英文点阵数据 */
    unsigned char *dots = (unsigned char *)&fontdata_8x16[c*16];
    int i, b;
    unsigned char byte;

   /* 8 x 16 的点阵, 16行 8列*/
   for (i = 0; i < 16; i++)
   {
     byte = dots[i];
     for (b = 7; b >= 0; b--)
     {
       if (byte & (1<       {
         /* show */
         lcd_put_pixel(x+7-b, y+i, 0xffffff); /* 白 */
       }
       else
       {
         /* hide */
         lcd_put_pixel(x+7-b, y+i, 0); /* 黑 */
        }
        }
 }
}

END

来源:漫谈嵌入式

版权归原作者所有,如有侵权,请联系删除。

推荐阅读
你管这破玩意叫CPU?
RTOS实现双核MCU消息通信
入职Linux驱动工程师后,我才知道的真相…

→点关注,不迷路←

嵌入式ARM 关注这个时代最火的嵌入式ARM,你想知道的都在这里。
评论 (0)
  • 在印度与巴基斯坦的军事对峙情境下,歼10C的出色表现如同一颗投入平静湖面的巨石,激起层层涟漪,深刻印证了“质量大于数量”这一铁律。军事领域,技术优势就是决定胜负的关键钥匙。歼10C凭借先进的航电系统、强大的武器挂载能力以及卓越的机动性能,在战场上大放异彩。它能够精准捕捉目标,迅速发动攻击,以一敌多却毫不逊色。与之形成鲜明对比的是,单纯依靠数量堆砌的军事力量,在面对先进技术装备时,往往显得力不从心。这一现象绝非局限于军事范畴,在当今社会的各个领域,“质量大于数量”都已成为不可逆转的趋势。在科技行业
    curton 2025-05-11 19:09 262浏览
  • 在 AI 浪潮席卷下,厨电行业正经历着深刻变革。AWE 2025期间,万得厨对外首次发布了wan AiOS 1.0组织体超智能系统——通过AI技术能够帮助全球家庭实现从健康检测、膳食推荐,到食材即时配送,再到一步烹饪、营养总结的个性化健康膳食管理。这一创新之举并非偶然的个案,而是整个厨电行业大步迈向智能化、数字化转型浪潮的一个关键注脚,折射出全行业对 AI 赋能的热切渴求。前有标兵后有追兵,万得厨面临着高昂的研发成本与技术迭代压力,稍有懈怠便可能被后来者赶
    用户1742991715177 2025-05-11 22:44 180浏览
  • 文/Leon编辑/cc孙聪颖‍2025年1月至今,AI领域最出圈的除了DeepSeek,就是号称首个“通用AI Agent”(智能体)的Manus了,其邀请码一度被炒到8万元。很快,通用Agent就成为互联网大厂、AI独角兽们的新方向,迅速地“卷”了起来。国外市场,Open AI、Claude、微软等迅速推出Agent产品或构建平台,国内企业也在4月迅速跟进。4月,字节跳动、阿里巴巴、百度纷纷入局通用Agent市场,主打复杂的多任务、工作流功能,并对个人用户免费。腾讯则迅速更新腾讯元器的API接
    华尔街科技眼 2025-05-12 22:29 148浏览
  • ‌磁光克尔效应(Magneto-Optic Kerr Effect, MOKE)‌ 是指当线偏振光入射到磁性材料表面并反射后,其偏振状态(偏振面旋转角度和椭偏率)因材料的磁化强度或方向发生改变的现象。具体表现为:1、‌偏振面旋转‌:反射光的偏振方向相对于入射光发生偏转(克尔旋转角 θK)。2、‌椭偏率变化‌:反射光由线偏振变为椭圆偏振(克尔椭偏率 εK)。这一效应直接关联材料的磁化状态,是表征磁性材料(如铁磁体、反铁磁体)磁学性质的重要非接触式光学探测手段,广泛用于
    锦正茂科技 2025-05-12 11:02 297浏览
  •   基于 2025 年行业权威性与时效性,以下梳理国内知名软件定制开发企业,涵盖综合型、垂直领域及特色技术服务商:   华盛恒辉科技有限公司:是一家专注于高端软件定制开发服务和高端建设的服务机构,致力于为企业提供全面、系统的开发制作方案。在部队政企开发、建设到运营推广领域拥有丰富经验,在教育,工业,医疗,APP,管理,商城,人工智能,部队软件、工业软件、数字化转型、新能源软件、光伏软件、汽车软件,ERP,系统二次开发,CRM等领域有很多成功案例。   五木恒润科技有限公司:是一家专业的部队信
    华盛恒辉l58ll334744 2025-05-12 16:13 250浏览
  • 感谢面包板论坛组织的本次测评活动,本次测评的对象是STM32WL Nucleo-64板 (NUCLEO-WL55JC) ,该测试板专为LoRa™应用原型构建,基于STM32WL系列sub-GHz无线微控制器。其性能、功耗及特性组合经过精心挑选,支持通过Arduino® Uno V3连接,并利用ST morpho接头扩展STM32WL Nucleo功能,便于访问多种专用屏蔽。STM32WL Nucleo-64板集成STLINK-V3E调试器与编程器,无需额外探测器。该板配备全面的STM
    无言的朝圣 2025-05-13 09:47 151浏览
  •   电磁数据管理系统深度解析   北京华盛恒辉电磁数据管理系统作为专业的数据处理平台,旨在提升电磁数据的处理效率、安全性与可靠性。以下从功能架构、核心特性、应用场景及技术实现展开分析:   应用案例   目前,已有多个电磁数据管理系统在实际应用中取得了显著成效。例如,北京华盛恒辉和北京五木恒润电磁数据管理系统。这些成功案例为电磁数据管理系统的推广和应用提供了有力支持。   一、核心功能模块   数据采集与接入:实时接收天线、频谱仪等设备数据,兼容多协议接口,确保数据采集的全面性与实时性
    华盛恒辉l58ll334744 2025-05-13 10:59 271浏览
  •   定制软件开发公司推荐清单   在企业数字化转型加速的2025年,定制软件开发需求愈发多元复杂。不同行业、技术偏好与服务模式的企业,对开发公司的要求大相径庭。以下从技术赛道、服务模式及行业场景出发,为您提供适配的定制软件开发公司推荐及选择建议。   华盛恒辉科技有限公司:是一家专注于高端软件定制开发服务和高端建设的服务机构,致力于为企业提供全面、系统的开发制作方案。在部队政企开发、建设到运营推广领域拥有丰富经验,在教育,工业,医疗,APP,管理,商城,人工智能,部队软件、工业软件、数字化转
    华盛恒辉l58ll334744 2025-05-12 15:55 332浏览
  •   舰艇电磁兼容分析与整改系统平台解析   北京华盛恒辉舰艇电磁兼容分析与整改系统平台是保障海军装备作战效能的关键技术,旨在确保舰艇电子设备在复杂电磁环境中协同运行。本文从架构、技术、流程、价值及趋势五个维度展开解析。   应用案例   目前,已有多个舰艇电磁兼容分析与整改系统在实际应用中取得了显著成效。例如,北京华盛恒辉和北京五木恒润舰艇电磁兼容分析与整改系统。这些成功案例为舰艇电磁兼容分析与整改系统的推广和应用提供了有力支持。   一、系统架构:模块化智能体系   电磁环境建模:基
    华盛恒辉l58ll334744 2025-05-14 11:22 45浏览
  •   电磁数据展示系统平台解析   北京华盛恒辉电磁数据展示系统平台是实现电磁数据高效展示、分析与管理的综合性软件体系,以下从核心功能、技术特性、应用场景及发展趋势展开解读:   应用案例   目前,已有多个电磁数据展示系统在实际应用中取得了显著成效。例如,北京华盛恒辉和北京五木恒润电磁数据展示系统。这些成功案例为电磁数据展示系统的推广和应用提供了有力支持。   一、核心功能模块   数据采集与预处理   智能分析处理   集成频谱分析、时频变换等信号处理算法,自动提取时域频域特征;
    华盛恒辉l58ll334744 2025-05-13 10:20 361浏览
  • 在当下竞争激烈的 AI 赛道,企业高层的变动往往牵一发而动全身,零一万物近来就深陷这样的动荡漩涡。近日,零一万物联合创始人、技术副总裁戴宗宏离职创业的消息不胫而走。这位在大模型基础设施领域造诣颇深的专家,此前在华为云、阿里达摩院积累了深厚经验,在零一万物时更是带领团队短期内完成了千卡 GPU 集群等关键设施搭建,其离去无疑是重大损失。而这并非个例,自 2024 年下半年以来,李先刚、黄文灏、潘欣、曹大鹏等一众联创和早期核心成员纷纷出走。
    用户1742991715177 2025-05-13 21:24 108浏览
  • 在全球供应链紧张和国产替代需求推动下,国产存储芯片产业快速发展,形成设计到封测一体化的完整生态。北京君正、兆易创新、紫光国芯、东芯股份、普冉股份和佰维存储等六大上市公司在NOR/NAND Flash、DRAM、嵌入式存储等领域布局各具特色,推动国产替代提速。贞光科技代理的品牌紫光国芯,专注DRAM技术,覆盖嵌入式存储与模组解决方案,为多领域客户提供高可靠性产品。随着AI、5G等新兴应用兴起,国产存储厂商有望迎来新一轮增长。存储芯片分类与应用易失性与非易失性存储芯片易失性存储芯片(Volatile
    贞光科技 2025-05-12 16:05 200浏览
我要评论
0
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦