【LCD 应用编程】获取LCD屏幕参数信息(分辨率、像素深度、RGB格式)

news2024/11/24 14:45:00

目录

一、LCD显示的基本原理

1、认识 FrameBuffer

2、理解LCD的分辨率和深度

二、接口函数 ioctl

1、函数声明

2、结构体介绍

三、获取LCD屏的信息(分辨率、深度)


一、LCD显示的基本原理

1、认识 FrameBuffer

FrameBuffer 是帧缓冲,可以看做是一块内存,帧缓冲是一种显示驱动接口,该接口屏蔽了显示设备(如LCD)硬件层面的实现。在应用层看来,显示设备就是一块内存,操作这块内存就相当于在操作显示设备

在Linux 系统中,显示设备也叫做 FrameBuffer 设备,LCD就是 FrameBuffer 设备,FrameBuffer 设备对应的设备文件为 /dev/fdX(X=0、1、2 ...),一般 /dev/fb0 代表LCD显示屏。应用程序读写 /dev/fbX 就相当于读写显示设备的显存(显示缓冲区)

2、理解LCD的分辨率和深度

说到显示设备或者图片,我们经常会提到 分辨率像素深度 的概念

  • 分辨率:一行有多少个像素点,一列有多少个像素点
  • 像素深度:每个像素点要用多少bit来表示

假设LCD 的分辨率是 800*480,每个像素点用 RGB565 来表示。

800*480每行有 800 个像素点,每列有 480 个像素点
RGB565

每个像素点由R、G、B三种颜色表示

        - R 占 5 bit

        - G 占 6 bit

        - B 占 5 bit

前面说到,显示设备其实可以看做是显示缓冲区,显示缓冲区的大小 = 分辨率 * 像素深度

二、接口函数 ioctl

1、函数声明

ioctl 的用途会根据其传入的参数发生变化,ioctl函数声明如下:

第一个参数是文件描述符,即FrameBuffer 设备对应的设备文件 /dev/fdX(X=0、1、2 ...)

第二个参数需传入一个宏,第二个参数决定了 ioctl 函数的用途

第二个参数含义
FBIOGET_VSCREENINFO获取 FrameBuffer 设备的可变参数信息
FBIOPUT_VSCREENINFO设置 FrameBuffer 设备的可变参数信息
FBIOGET_FSCREENINFO获取 FrameBuffer 设备的固有参数信息

第三个参数所传入的类型会随着第二个参数变化。

第二个参数第三个参数类型
FBIOGET_VSCREENINFOstruct fb_var_screeninfo *
FBIOPUT_VSCREENINFOstruct fb_var_screeninfo *
FBIOGET_FSCREENINFOstruct fb_fix_screeninfo *
// 获取设备可变参数信息
struct fb_var_screeninfo fb_var;
int fd = 0;
if((fd = open("/dev/fb0", O_RDWR) < 0))
{
    perror("open fb failed");
    exit(-1);
}

ioctl(fd, FBIOGET_VSCREENINFO, &fb_var);

 

2、结构体介绍

上面第三个参数中涉及到多种结构体 struct fb_var_screeninfostruct fb_fix_screeninfo ,我们如果要获取到可变参数的信息,势必需要了解对应结构体包含的成员变量。

struct fb_var_screeninfo

struct fb_var_screeninfo {
     __u32 xres; /* 可视区域,一行有多少个像素点,X 分辨率 */
     __u32 yres; /* 可视区域,一列有多少个像素点,Y 分辨率 */    

     __u32 bits_per_pixel; /* 每个像素点使用多少个 bit 来描述,也就是像素深度 bpp */
     __u32 grayscale; /* =0 表示彩色, =1 表示灰度, >1 表示 FOURCC 颜色 */
     /* 用于描述 R、G、B 三种颜色分量分别用多少位来表示以及它们各自的偏移量 */
     struct fb_bitfield red; /* Red 颜色分量色域偏移 */
     struct fb_bitfield green; /* Green 颜色分量色域偏移 */
     struct fb_bitfield blue; /* Blue 颜色分量色域偏移 */
     struct fb_bitfield transp; /* 透明度分量色域偏移 */
    
    // ... ...
};

其中 struct fb_bitfield 结构体的声明如下。下面的 “偏移量” 可以参考本文最后一部分的结果分析

struct fb_bitfield {
     __u32 offset; /* 偏移量 */
     __u32 length; /* 长度 */
     __u32 msb_right; /* != 0 : Most significant bit is right */
}   

struct fb_fix_screeninfo

struct fb_fix_screeninfo {
     char id[16]; /* 字符串形式的标识符 */
     unsigned long smem_start; /* 显存的起始地址(物理地址) */
     __u32 smem_len; /* 显存的长度 */
     __u32 type;
     __u32 type_aux;
     __u32 visual;
     __u16 xpanstep;
     __u16 ypanstep;
     __u16 ywrapstep;
     __u32 line_length; /* 一行的字节数 */
     unsigned long mmio_start; /* Start of Memory Mapped I/O(physical address) */
     __u32 mmio_len; /* Length of Memory Mapped I/O */
     __u32 accel; /* Indicate to driver which specific chip/card we have */
     __u16 capabilities;
     __u16 reserved[2];
};

 

三、获取LCD屏的信息(分辨率、深度)

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <linux/fb.h>

int main(int args, char **argv)
{
    struct fb_fix_screeninfo fb_fix;        // 固定参数信息
    struct fb_var_screeninfo fb_var;        // 可变参数信息

    int fd = open("/dev/fb0", O_RDWR);
    if (fd < 0)
    {
        perror("open fb failed");
        return -1;
    }

    ioctl(fd, FBIOGET_FSCREENINFO, &fb_fix);    // 获取固定参数信息
    ioctl(fd, FBIOGET_VSCREENINFO, &fb_var);    // 获取可变参数信息
    printf(    
        "分辨率:%d * %d \n"    \
        "像素深度:%d bit \n"   \
        "像素格式: R<%d %d> G<%d %d> B<%d %d>\n",  \
        fb_var.xres, fb_var.yres, \
        fb_var.bits_per_pixel, \
        fb_var.red.offset, fb_var.red.length,  \
        fb_var.green.offset, fb_var.green.length, \
        fb_var.blue.offset, fb_var.blue.length
    );

    close(fd);
    return 0;
}

分辨率:每行有 800 个像素点,每列有 480 个像素点

像素深度:用 16bit 来表示每个像素点

像素格式:使用的格式是 RGB565,红色(R)占 5 bit,绿色(G)占 6 bit,蓝色(B)占 5 bit

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/559954.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[VPX611]基于 6U VPX 总线架构的SATA3.0 高性能数据存储板

板卡概述 VPX611 是一款基于6UVPX 总线架构的高性能数据存储板&#xff0c;该板卡采用2 片XilinxKintex-7 系列FPGA 作为主控单元&#xff0c;FPGA 内嵌RAID 控制器&#xff0c;最大支持8 个mSATA 盘&#xff0c;最大存储容量可以达到8TByte&#xff0c;持续数据写入带宽可以达…

Scrum专业能力之Scrum框架和用敏捷思维管理产品

一、理解和应用Scrum框架 理解和应用Scrum框架&#xff0c;让团队和组织最多30天就可以迭代增量式交付可上线的具有价值的完工产品。成功地应用Scrum框架要求理解和应用Scrum价值观以及经验主义的原则&#xff0c;以便在处理产品交付的内在复杂性的同时&#xff0c;专业地向组…

浑元太极和领域驱动设计-UMLChina建模知识竞赛第4赛季第2轮

DDD领域驱动设计批评文集>> 《软件方法》强化自测题集>> 《软件方法》各章合集>> 参考潘加宇在《软件方法》和UMLChina公众号文章中发表的内容作答。在本文下留言回答&#xff0c;先全部答对者得分&#xff0c;本轮总分为3分。 1. [多选] 开发团队中&am…

在 Visual Studio 2022 中使用 GitHub Copilot chat

本文通过实际应用场景和示例代码展示了 GitHub Copilot Chat 在 Visual Studio 2022 中的优势和特点。最后&#xff0c;鼓励读者在实际工作中尝试使用 Copilot Chat&#xff0c;以提升开发效率和代码质量。希望这些信息和经验能为你在使用GitHub Copilot时提供帮助和启发。 1. …

openssh kex.c拒绝服务漏洞漏洞(CVE-2016-8858)处理

一、漏洞描述 OpenSSH&#xff08;OpenBSD Secure Shell&#xff09;是OpenBSD计划组所维护的一套用于安全访问远程计算机的连接工具。该工具是SSH协议的开源实现&#xff0c;支持对所有的传输进行加密&#xff0c;可有效阻止窃听、连接劫持以及其他网络级的攻击。OpenSSH 6.x版…

leetcode二叉树中的最大路径和(java)

二叉树中的最大路径和 leetcode 124题- 原题链接二叉树中的最大路径和 (hard)解题思路二叉树专题 leetcode 124题- 原题链接 leetcode 124 .二叉树的最大路径和 二叉树中的最大路径和 (hard) 二叉树中的 路径 被定义为一条节点序列&#xff0c;序列中每对相邻节点之间都存在一…

Selenium、JUnit、Appium…一网打尽,轻松掌握自动化测试工具

目录 前言&#xff1a; 一、 自动化测试原理 二、 自动化测试工具和技术 三、 自动化测试案例 四、 总结 前言&#xff1a; 自动化测试是现代软件开发中必不可少的组成部分&#xff0c;它可以让开发者快速、高效地测试软件&#xff0c;并确保其符合预期要求。在本文中&am…

工业开源网站

12、JCAE JAVA based environment for CAE applications. jCAE - Java Computer Aided Engineering 13、gCAD3D gCAD3D.org 14、boardcad http://www.boardcad.com/ 15、solvespace SolveSpace - parametric 3d CAD 16、DraftSight 不开源 2D CAD Drafting and 3D Design | Dra…

公司来了个00后卷王,卷的让人崩溃.....

前几天我们公司一下子也来了几个新人&#xff0c;这些年前人是真能熬啊&#xff0c;本来我们几个老油子都是每天稍微加会班就打算走了&#xff0c;这几个新人一直不走&#xff0c;搞得我们也不好走。 2023年春招已结过去了&#xff0c;最近内卷严重&#xff0c;各种跳槽裁员&a…

抖音矩阵系统源码开发技术分析

在这个过程中&#xff0c;开发人员使用了多种编程语言、框架和工具&#xff0c;包括 Python、Java、Hadoop、Spark 和 Kafka 等。他们还使用了不同的数据库技术&#xff0c;例如 MySQL 和 MongoDB。 整个开发过程通常分为四个主要阶段&#xff1a;需求分析、设计、开发和测试。…

数值计算 - 常用函数值计算方法

秦九韶算法 什么是秦九韶算法&#xff1f; 可以把多项式改写为便于递推的形式&#xff1a; 泰勒展开式 什么是泰勒展开式&#xff1f; 泰勒公式&#xff0c;也称泰勒展开式。是用一个函数在某点的信息&#xff0c;描述其附近取值的公式。如果函数足够平滑&#xff0c;在已知函…

网络作业8【计算机网络】

网络作业8【计算机网络】 前言推荐网络作业8一. 单选题&#xff08;共16题&#xff0c;60分&#xff09;二. 填空题&#xff08;共2题&#xff0c;20分&#xff09;三. 阅读理解&#xff08;共1题&#xff0c;20分&#xff09; 最后 前言 2023-5-23 16:54:08 以下内容源自《【…

最优化方法Python计算:一元函数搜索算法——牛顿法

设函数 f ( x ) f(x) f(x)&#xff0c;在 [ a , b ] [a,b] [a,b]上二阶连续可微且有唯一的最小值点 x 0 x_0 x0​。由于 f ( x ) f(x) f(x)是 [ a , b ] [a,b] [a,b]上的单峰函数&#xff0c;故 f ′ ′ ( x ) > 0 f(x)>0 f′′(x)>0&#xff0c; x ∈ ( a , b ) x\in…

实时频谱-2.2数字信号处理

数字信号处理&#xff08;DSP&#xff09;概念 数字信号处理(digital signal processing)&#xff0c;是以数字运算方法实现信号变换、滤波、检测、估值、调制解调以及快速算法等处理的一门学科。数字信号处理具有高精度、高可靠性、可程序控制、可时分复用、便于集成化等优点…

【Spring篇】AOP事务管理

&#x1f353;系列专栏:Spring系列专栏 &#x1f349;个人主页:个人主页 一、AOP事务管理 1.Spring事务简介 1.相关概念介绍 事务作用&#xff1a;在数据层保障一系列的数据库操作同成功同失败Spring事务作用&#xff1a;在数据层或 业务层 保障一系列的数据库操作同成功同失…

代码随想录 字符串 Java

文章目录 &#xff08;简单&#xff09;344. 反转字符串&#xff08;简单&#xff09;541. 反转字符串||&#xff08;简单&#xff09;剑指Offer 05. 替换空格&#xff08;中等&#xff09;151. 反转字符串中的单词&#xff08;简单&#xff09;剑指 Offer 58 - II. 左旋转字符…

word怎么转excel?一键转换并不难

在职场中&#xff0c;常常需要将 Word 文档转换为 Excel 表格&#xff0c;以便更好地管理和数据分析。本文将介绍两种 Word 转 Excel 的方法&#xff0c;以及如何在 Excel 中处理转换后的数据。 方法一&#xff1a;使用文本转换向导 使用Word的文本转换向导&#xff0c;将Word文…

第二篇、基于Arduino uno,用oled0.96寸屏幕显示数字和字符——结果导向

0、结果 说明&#xff1a;先来看看实际的结果&#xff0c;如果是你想要的&#xff0c;可以接着往下看。 1、外观 说明&#xff1a;本次使用的oled是0.96寸的&#xff0c;别的规格的屏幕不一定适用本教程&#xff0c;一般而言有显示白色、蓝色和蓝黄一起显示的。 2、连线 说…

SQL执行过程

1. select 语句执行过程 一条 select 语句的执行过程如上图所示 1、建立连接 连接器会校验你输入的用户名和密码是否正确&#xff0c;如果错误会返回提示&#xff0c;如果正确&#xff0c;连接器会查询当前用户对于的权限。连接器的作用就是校验用户权限 2、查询缓存 MySQL…

VPX通信基础理论

新型VPX(VITA 46)标准是自从VME引入后的25年来&#xff0c;对于VME总线架构的最重大也是最重要的改进。它将增加背板带宽&#xff0c;集成更多的I/O&#xff0c;扩展了格式布局。 目前&#xff0c;VME64x已经不能满足国防和航空领域越来越高的性能要求和更为恶劣环境下的应用。…