函数字典 · 设备控制

结构体

fb_var_screeninfo:描述图形显示硬件的变量信息

struct fb_var_screeninfo {
	__u32 xres;			/* 可见分辨率 */
	__u32 yres;
	__u32 xres_virtual;		/* 虚拟分辨率 */
	__u32 yres_virtual;
	__u32 xoffset;			/* 虚拟到可见的偏移量 */
	__u32 yoffset;			/* 分辨率高度 */

	__u32 bits_per_pixel;	/* 每像素使用的位数 */
	__u32 grayscale;		/* 0 = 彩色, 1 = 灰度, >1 = FOURCC */
	struct fb_bitfield red; 	 /* 颜色位字段信息(适用于真彩色)*/
	struct fb_bitfield green;
	struct fb_bitfield blue;
	struct fb_bitfield transp;	 /* 透明度 */

	__u32 nonstd;			/* != 0 非标准的像素格式 */

	__u32 activate;			/* 查看 FB_ACTIVATE_* 值*/

	__u32 height;			/* 图片高度(mm单位)*/
    __u32 width;			/* 图片宽度(mm单位)*/

    __u32 accel_flags;	    /* (已过时)请参考 fb_info.flags*/

    /* 时间信息:所有值以 pixclock 为单位,除了 pixclock 本身 */
    __u32 pixclock;		    /* 像素时钟(皮秒单位)*/
    __u32 left_margin;	    /* 从同步到图片的时间 */
    __u32 right_margin;	    /* 从图片到同步的时间 */
    __u32 upper_margin;	    /* 从同步到图片的时间 */
    __u32 lower_margin;
    __u32 hsync_len;	    /* 水平同步脉冲长度 */
    __u32 vsync_len;	    /* 垂直同步脉冲长度 */
    __u32 sync;			    /* 查看 FB_SYNC_* 值*/
    __u32 vmode;			    /* 查看 FB_VMODE_* 值*/
    __u32 rotate;		    /* 逆时针旋转角度 */
    __u32 colorspace;	    /* 基于 FOURCC 的颜色空间模式 */
    __u32 reserved[4];	    /* 保留以备将来兼容性 */
};

fb_fix_screeninfo:描述固定屏幕信息

struct fb_fix_screeninfo {
    char id[16];                   /* 标识字符串,例如 "TT Builtin" */
    unsigned long smem_start;      /* 帧缓冲内存的起始地址(物理地址) */
    __u32 smem_len;                /* 帧缓冲内存的长度 */
    __u32 type;                    /* 参见 FB_TYPE_* */
    __u32 type_aux;                /* 分层平面的交错间隔 */
    __u32 visual;                  /* 参见 FB_VISUAL_* */
    __u16 xpanstep;                /* 硬件横向滚动步长,如果不支持则为零 */
    __u16 ypanstep;                /* 硬件纵向滚动步长,如果不支持则为零 */
    __u16 ywrapstep;               /* 硬件纵向包装步长,如果不支持则为零 */
    __u32 line_length;             /* 每行字节长度 */
    unsigned long mmio_start;      /* 内存映射 I/O 的起始地址(物理地址) */
    __u32 mmio_len;                /* 内存映射 I/O 的长度 */
    __u32 accel;                   /* 指示驱动程序特定的芯片/卡类型 */
    __u16 capabilities;            /* 参见 FB_CAP_* */
    __u16 reserved[2];             /* 保留以备将来兼容性 */
};

命令部分

/* 帧缓冲定义 */
#define FB_MAX       32   /* 目前足够使用 */

/* ioctl 命令 */
#define FBIOGET_VSCREENINFO     0x4600      /* 获取可变屏幕信息 */
#define FBIOPUT_VSCREENINFO     0x4601      /* 设置可变屏幕信息 */
#define FBIOGET_FSCREENINFO     0x4602      /* 获取固定屏幕信息 */

函数部分

ioctl:设备控制操作

/*
 * 函数名称: ioctl
 * 头文件: <sys/ioctl.h>
 * 函数声明: int ioctl(int fd, unsigned long request, ...);
 * 函数描述: 对打开的设备进行控制操作。
 * 参数:
 *     - fd: 设备的文件描述符
 *     - request: 控制操作的请求码
 *     - ...: 可选参数,与请求码相关的控制参数
 *
 * 返回值:
 *     成功时,返回0;失败时,返回-1,并设置errno。
 *
 * 注意事项:
 *     - 根据控制操作的不同,可选参数的类型和含义也不同。
 *     - 控制操作的请求码和参数通常要根据设备的特定要求进行设置。
 *
 * 使用示例:
 *     int fd = open("/dev/device", O_RDWR);
 *     if (fd == -1) {
 *         perror("open");
 *     }
 *     int result = ioctl(fd, IOCTRL_REQUEST_CODE, ...); // 对设备进行控制操作
 *     if (result == -1) {
 *         perror("ioctl");
 *         close(fd);
 *     }
 *     close(fd);
 *
 */

举例

获取可见区屏幕大小

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

int main()
{
    int lcd = open("/dev/fb0", O_RDWR);
    if (lcd == -1)
    {
        perror("打开显示器失败!");
        return -1;
    }

    struct fb_var_screeninfo var;

    if (ioctl(lcd, FBIOGET_VSCREENINFO, &var) == -1)
    {
        perror("获取LCD硬件信息失败!");
        return -1;
    }
    else
    {
        printf("获取LCD硬件信息成功!\nLCD宽:%d\tLCD高:%d\n", var.xres,
               var.yres);
    }

    if (close(lcd) == -1)
    {
        perror("关闭显示器!");
        return -1;
    }

    return 0;
}

在这里插入图片描述

获取显存大小

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

int main()
{
    int lcd = open("/dev/fb0", O_RDWR);
    if (lcd == -1)
    {
        perror("打开显示器失败!");
        return -1;
    }

    struct fb_fix_screeninfo fix;

    if (ioctl(lcd, FBIOGET_FSCREENINFO, &fix) == -1)
    {
        perror("获取LCD硬件信息失败!");
        return -1;
    }
    else
    {
        printf("获取LCD硬件信息成功,其显存大小是:%d字节\n", fix.smem_len);
    }

    if (close(lcd) == -1)
    {
        perror("关闭显示器!");
        return -1;
    }
    return 0;
}

在这里插入图片描述
  我所使用的开发板为GEC6818,其LCD屏幕1个像素由4个字节表示,那么虚拟屏幕共有:4608000 ÷ ( 800 × 480 × 4 ) = 3 个。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值