FrameBuffer 结构分析

更新时间:
2024-03-14
下载文档

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 字节空间。
文档内容是否对您有所帮助?
有帮助
没帮助