文章目录
结构体
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 个。