FrameBuffer 结构分析
SylixOS 中 FrameBuffer 结构层次如下图所示。
SylixOS 中 FrameBuffer 结构层次大致由三部分构成。
- Application:应用程序层,指用户开发的 GUI 程序。所有的 GUI 应用程序都调用 Graphic Device 层中提供的统一接口,以此对 FrameBuffer 进行控制。
- Graphic Device:图形显示设备层,是 SylixOS 提供的 gMemDev 设备抽象。
- Display Driver:硬件显示接口层,指具体的硬件显示设备或接口。
SylixOS 中的 FrameBuffer 设备是标准的字符设备,其设备结构体 LW_GM_DEVICE 定义位于“libsylixos/SylixOS/system/device/graph”下。 LW_GM_DEVICE 结构体作为所有绘图函数的第一个参数,其详细描述如下:
#include <SylixOS.h>
typedef struct {
LW_DEV_HDR GMDEV_devhdrHdr; /* IO 设备头 */
PLW_GM_FILEOPERATIONS GMDEV_gmfileop; /* 设备操作函数集 */
ULONG GMDEV_ulMapFlags; /* 内存映射选项 */
PVOID GMDEV_pvReserved[8]; /* 保留配置字 */
} LW_GM_DEVICE;
typedef LW_GM_DEVICE *PLW_GM_DEVICE;
- GMDEV_devhdrHdr:字符设备标准 IO 设备头。
- GMDEV_gmfileop:指向图形显示设备的操作函数。
- GMDEV_ulMapFlags:图形显示设备节点调用 mmap 进行内存映射时的映射选项。
- GMDEV_pvReserved[8]:系统保留的 32 字节配置字,不必设置。
图形显示设备的操作函数如下:
#include <SylixOS.h>
typedef struct gmem_file_operations {
FUNCPTR GMFO_pfuncOpen;
FUNCPTR GMFO_pfuncClose;
FUNCPTR GMFO_pfuncIoctl;
INT (*GMFO_pfuncGetVarInfo) (LONG lDev, PLW_GM_VARINFO pgmvi);
INT (*GMFO_pfuncSetVarInfo) (LONG lDev,
const PLW_GM_VARINFO pgmvi);
INT (*GMFO_pfuncGetScrInfo) (LONG lDev, PLW_GM_SCRINFO pgmsi);
INT (*GMFO_pfuncGetPhyInfo) (LONG lDev, PLW_GM_PHYINFO pgmphy);
INT (*GMFO_pfuncGetMode) (LONG lDev, ULONG *pulMode);
INT (*GMFO_pfuncSetMode) (LONG lDev, ULONG ulMode);
INT (*GMFO_pfuncSetPalette) (LONG lDev,
UINT uiStart,
UINT uiLen,
ULONG *pulRed,
ULONG *pulGreen,
ULONG *pulBlue);
INT (*GMFO_pfuncGetPalette) (LONG lDev,
UINT uiStart,
UINT uiLen,
ULONG *pulRed,
ULONG *pulGreen,
ULONG *pulBlue);
INT (*GMFO_pfuncSetPixel) (LONG lDev,
INT iX,
INT iY,
ULONG ulColor);
INT (*GMFO_pfuncGetPixel) (LONG lDev,
INT iX,
INT iY,
ULONG *pulColor);
INT (*GMFO_pfuncSetColor) (LONG lDev, ULONG ulColor);
INT (*GMFO_pfuncSetAlpha) (LONG lDev, ULONG ulAlpha);
INT (*GMFO_pfuncDrawHLine) (LONG lDev,
INT iX0,
INT iY,
INT IX1);
INT (*GMFO_pfuncDrawVLine) (LONG lDev,
INT iX,
INT iY0,
INT IY1);
INT (*GMFO_pfuncFillRect) (LONG lDev,
INT iX0,
INT iY0,
INT iX1,
INT iY1);
} LW_GM_FILEOPERATIONS;
typedef LW_GM_FILEOPERATIONS *PLW_GM_FILEOPERATIONS;
- GMFO_pfuncOpen:打开显示设备,打开设备之后即获得了显示设备的操作权限。
- GMFO_pfuncClose:关闭显示设备,关闭设备之后即释放了显示设备的操作权限。
- GMFO_pfuncIoctl:显示设备I/O控制,FrameBuffer 驱动设备应提供如下表所示的 ioctl 命令接口。
io 命令类型 | 含义 |
---|---|
LW_GM_GET_VARINFO | 调用驱动 GMFO_pfuncGetVarInfo 获取显示规格 |
LW_GM_SET_VARINFO | 调用驱动 GMFO_pfuncSetVarInfo 设置显示规格 |
LW_GM_GET_SCRINFO | 调取驱动 GMFO_pfuncGetScrInfo 获取显示属性 |
LW_GM_GET_PHYINFO | 调用驱动 GMFO_pfuncGetPhyInfo 获取显示物理特性 |
LW_GM_GET_MODE | 调用驱动 GMFO_pfuncGetMode 获取显示模式 |
LW_GM_SET_MODE | 调用驱动 GMFO_pfuncSetMode 设置显示模式 |
- GMFO_pfuncGetVarInfo:获取显示规格,第二个参数为获取到的显示规格信息的 LW_GM_VARINFO 结构体变量。
- GMFO_pfuncSetVarInfo:设置显示规格,第二个参数为需要设置的显示规格信息的 LW_GM_VARINFO 结构体变量。
- GMFO_pfuncGetScrInfo:获取显示属性,第二个参数为获取到的显示属性的 LW_GM_SCRINFO 结构体变量。
- GMFO_pfuncGetPhyInfo:获取显示物理特性,第二个参数为获取到的显示物理特性的 LW_GM_PHYINFO 结构体变量。
- GMFO_pfuncGetMode:获取显示模式。
- GMFO_pfuncSetMode:设置显示模式。
- GMFO_pfuncSetPalette:设置调色板。
- GMFO_pfuncGetPalette:获取调色板。
以下接口为 2D 加速使能时使用的接口 (仅当 GMVI_bHardwareAccelerate 为 LW_TRUE 时有效)。
注:使能 2D 加速的前提是芯片提供了 2D 加速控制器,并且以下接口通过 2D 加速控制器实现。
- GMFO_pfuncSetPixel:绘制一个像素。
- GMFO_pfuncGetPixel:获取一个像素。
- GMFO_pfuncSetColor:设置当前绘图前景色。
- GMFO_pfuncSetAlpha:设置当前绘图透明度。
- GMFO_pfuncDrawHLine:绘制一条水平线。
- GMFO_pfuncDrawVLine:绘制一条垂直线。
- GMFO_pfuncFillRect:填充矩形区域。
显示规格描述的是 FrameBuffer 上显示区域相关的数据,包括可视区域大小、每个像素点的色彩模式,显示规格结构体 LW_GM_VARINFO 的详细描述如下:
#include <SylixOS.h>
typedef struct {
ULONG GMVI_ulXRes; /* 可视区域 */
ULONG GMVI_ulYRes;
ULONG GMVI_ulXResVirtual; /* 虚拟区域 */
ULONG GMVI_ulYResVirtual;
ULONG GMVI_ulXOffset; /* 显示区域偏移 */
ULONG GMVI_ulYOffset;
ULONG GMVI_ulBitsPerPixel; /* 每个像素的数据位数 */
ULONG GMVI_ulBytesPerPixel; /* 每个像素的存储字节数 */
/* 有些图形处理器DMA为了对齐 */
/* 使用了填补无效字节 */
ULONG GMVI_ulGrayscale; /* 灰度等级 */
ULONG GMVI_ulRedMask; /* 红色掩码 */
ULONG GMVI_ulGreenMask; /* 绿色掩码 */
ULONG GMVI_ulBlueMask; /* 蓝色掩码 */
ULONG GMVI_ulTransMask; /* 透明度掩码 */
LW_GM_BITFIELD GMVI_gmbfRed; /* bitfield in gmem */
LW_GM_BITFIELD GMVI_gmbfGreen;
LW_GM_BITFIELD GMVI_gmbfBlue;
LW_GM_BITFIELD GMVI_gmbfTrans;
BOOL GMVI_bHardwareAccelerate; /* 是否使用硬件加速 */
ULONG GMVI_ulMode; /* 显示模式 */
ULONG GMVI_ulStatus; /* 显示器状态 */
} LW_GM_VARINFO;
typedef LW_GM_VARINFO *PLW_GM_VARINFO;
- GMVI_ulXRes:FrameBuffer 可视区域的宽度。
- GMVI_ulYRes:FrameBuffer 可视区域的高度。
- GMVI_ulXResVirtual:FrameBuffer 虚拟区域的宽度。
- GMVI_ulYResVirtual:FrameBuffer 虚拟区域的高度。
- GMVI_ulXOffset:FrameBuffer 可视区域在水平方向的偏移。
- GMVI_ulYOffset:FrameBuffer 可视区域在竖直方向的偏移。
- GMVI_ulBitsPerPixel:每个像素点占用的比特位数。
- GMVI_ulBytesPerPixel:每个像素占用的字节数。
- GMVI_ulGrayscale:每个像素的灰度等级,即一个像素最多可以表示成多少种颜色。
- GMVI_ulRedMask:每个像素中红色位的掩码。
- GMVI_ulGreenMask:每个像素中绿色位的掩码。
- GMVI_ulBlueMask:每个像素中蓝色位的掩码。
- GMVI_ulTransMask:每个像素中透明位的掩码。
- GMVI_gmbfRed:每个像素中红色位的掩码,以 LW_GM_BITFIELD 类型表示。
- GMVI_gmbfGreen:每个像素中绿色位的掩码,以 LW_GM_BITFIELD 类型表示。
- GMVI_gmbfBlue:每个像素中蓝色位的掩码,以 LW_GM_BITFIELD 类型表示。
- GMVI_gmbfTrans:每个像素中透明位的掩码,以 LW_GM_BITFIELD 类型表示。
- GMVI_bHardwareAccelerate:是否使用硬件加速。
- GMVI_ulMode:显示模式。
- GMVI_ulStatus:显示器状态。
LW_GM_BITFIELD 以掩码起始位、掩码位长度和大小端来表示一个颜色或透明的掩码,其结构如下:
typedef struct {
UINT32 GMBF_uiOffset; /* beginning of bitfield */
UINT32 GMBF_uiLength; /* length of bitfield */
UINT32 GMBF_uiMsbRight; /* !=0:Most significant bit is */
/* right */
} LW_GM_BITFIELD;
显示属性描述的是显示设备驱动相关信息,如设备 ID、FrameBuffer 内存大小等,显示属性结构体 LW_GM_SCRINFO 如下:
#include <SylixOS.h>
typedef struct {
PCHAR GMSI_pcName; /* 显示器名称 */
ULONG GMSI_ulId; /* ID */
size_t GMSI_stMemSize; /* framebuffer 内存大小 */
size_t GMSI_stMemSizePerLine; /* 每一行的内存大小 */
caddr_t GMSI_pcMem; /* 显示内存(需要驱动程序映射) */
} LW_GM_SCRINFO;
typedef LW_GM_SCRINFO *PLW_GM_SCRINFO;
- GMSI_pcName:显示器名称,一般应定义为类似“/dev/fb0”的设备节点名。
- GMSI_ulId:显示设备的 ID,当有多台显示设备时,作为唯一性标识。
- GMSI_stMemSize:FrameBuffer 的大小,其大小应为最大高度 × 最大宽度 × 每个像素所占字节数。
- GMSI_stMemSizePerLine:每一行的内存大小,其大小应为最大宽度 × 每个像素所占字节数。
- GMSI_pcMem:FrameBuffer 内存的基址,该基址应为 DMA 内存申请的内存地址。
显示物理特性描述的是物理显示设备,如 LCD 屏幕、HDMI 显示屏的物理特性,显示物理特性结构体 LW_GM_PHYINFO 如下:
#include <SylixOS.h>
typedef struct {
UINT GMPHY_uiXmm; /* 横向毫米数 */
UINT GMPHY_uiYmm; /* 纵向毫米数 */
UINT GMPHY_uiDpi; /* 每英寸像素数 */
ULONG GMPHY_ulReserve[16]; /* 保留 */
} LW_GM_PHYINFO;
typedef LW_GM_PHYINFO *PLW_GM_PHYINFO;
- GMPHY_uiXmm:显示器的横向毫米数。
- GMPHY_uiYmm:显示器的纵向毫米数。
- GMPHY_uiDpi:显示器每英寸中的像素个数。
- GMPHY_ulReserve:系统保留的 64 字节空间。