1/* 2 * Copyright (c) 2022 HiSilicon (Shanghai) Technologies CO., LIMITED. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16#ifndef __HIFB_H__ 17#define __HIFB_H__ 18 19#ifdef __HuaweiLite__ 20#include <fb.h> 21#include <linux/wait.h> 22#include "stdlib.h" 23#include <linux/workqueue.h> 24#include <linux/kernel.h> 25#include <linux/device.h> 26#include "liteos/fb.h" 27#else 28#include <linux/fb.h> 29#endif 30 31#include "hi_type.h" 32#include "hi_common.h" 33 34#ifdef __cplusplus 35#if __cplusplus 36extern "C" { 37#endif 38#endif /* __cplusplus */ 39 40#define IOC_TYPE_HIFB 'F' 41/* To obtain the colorkey of an overlay layer */ 42#define FBIOGET_COLORKEY_HIFB _IOR(IOC_TYPE_HIFB, 90, HIFB_COLORKEY_S) 43/* To set the colorkey of an overlay layer */ 44#define FBIOPUT_COLORKEY_HIFB _IOW(IOC_TYPE_HIFB, 91, HIFB_COLORKEY_S) 45/* To get the alpha of an overlay layer */ 46#define FBIOGET_ALPHA_HIFB _IOR(IOC_TYPE_HIFB, 92, HIFB_ALPHA_S) 47/* To set the alpha of an overlay layer */ 48#define FBIOPUT_ALPHA_HIFB _IOW(IOC_TYPE_HIFB, 93, HIFB_ALPHA_S) 49/* To get the origin of an overlay layer on the screen */ 50#define FBIOGET_SCREEN_ORIGIN_HIFB _IOR(IOC_TYPE_HIFB, 94, HIFB_POINT_S) 51/* To set the origin of an overlay layer on the screen */ 52#define FBIOPUT_SCREEN_ORIGIN_HIFB _IOW(IOC_TYPE_HIFB, 95, HIFB_POINT_S) 53/* To obtain the anti-flicker setting of an overlay layer */ 54#define FBIOGET_DEFLICKER_HIFB _IOR(IOC_TYPE_HIFB, 98, HIFB_DEFLICKER_S) 55/* To set the anti-flicker setting of an overlay layer */ 56#define FBIOPUT_DEFLICKER_HIFB _IOW(IOC_TYPE_HIFB, 99, HIFB_DEFLICKER_S) 57/* To wait for the vertical blanking region of an overlay layer */ 58#define FBIOGET_VBLANK_HIFB _IO(IOC_TYPE_HIFB, 100) 59/* To set the display state of an overlay layer */ 60#define FBIOPUT_SHOW_HIFB _IOW(IOC_TYPE_HIFB, 101, HI_BOOL) 61/* To obtain the display state of an overlay layer */ 62#define FBIOGET_SHOW_HIFB _IOR(IOC_TYPE_HIFB, 102, HI_BOOL) 63/* to obtain the capability of an overlay layer */ 64#define FBIOGET_CAPABILITY_HIFB _IOR(IOC_TYPE_HIFB, 103, HIFB_CAPABILITY_S) 65/* set the screen output size */ 66#define FBIOPUT_SCREENSIZE _IOW(IOC_TYPE_HIFB, 130, HIFB_SIZE_S) 67/* get the screen output size */ 68#define FBIOGET_SCREENSIZE _IOR(IOC_TYPE_HIFB, 131, HIFB_SIZE_S) 69 70/* To display multiple surfaces in turn and set the alpha and colorkey attributes */ 71#define FBIOFLIP_SURFACE _IOW(IOC_TYPE_HIFB, 132, HIFB_SURFACEEX_S) 72 73/* To set the compression function status of an overlay layer */ 74#define FBIOPUT_COMPRESSION_HIFB _IOW(IOC_TYPE_HIFB, 133, HI_BOOL) 75/* To obtain the compression function status of an overlay layer */ 76#define FBIOGET_COMPRESSION_HIFB _IOR(IOC_TYPE_HIFB, 134, HI_BOOL) 77 78/* To set the hdr function status of an overlay layer */ 79#define FBIOPUT_DYNAMIC_RANGE_HIFB _IOW(IOC_TYPE_HIFB, 139, HIFB_DYNAMIC_RANGE_E) 80/* To get the hdr function status of an overlay layer */ 81#define FBIOGET_DYNAMIC_RANGE_HIFB _IOR(IOC_TYPE_HIFB, 140, HIFB_DYNAMIC_RANGE_E) 82 83/* To create the layer */ 84#define FBIO_CREATE_LAYER _IO(IOC_TYPE_HIFB, 149) 85/* To destroy the layer */ 86#define FBIO_DESTROY_LAYER _IO(IOC_TYPE_HIFB, 150) 87 88typedef struct { 89 HI_U32 u32Width; 90 HI_U32 u32Height; 91} HIFB_SIZE_S; 92 93#ifndef __HuaweiLite__ 94static inline HI_U8 hifb_rgb(const struct fb_bitfield *pBit, HI_S32 color) 95{ 96 return ((HI_U8)((((HI_U32)color) >> pBit->offset) << (8 - pBit->length)) + /* 8 Digits to flip */ 97 ((HI_U8)(((HI_U32)(color) >> pBit->offset) << (8 - pBit->length)) >> pBit->length)); /* 8 Digits to flip */ 98} 99 100static inline HI_S32 hifb_color2key(const struct fb_var_screeninfo *pVar, HI_S32 color) 101{ 102 if (pVar->bits_per_pixel <= 8) { /* 8 left shift */ 103 return color; 104 } else { 105 HI_U8 r, g, b; 106 r = hifb_rgb(&pVar->red, color); 107 g = hifb_rgb(&pVar->green, color); 108 b = hifb_rgb(&pVar->blue, color); 109 return (r << 16) + (g << 8) + b; /* left shift altitude 16 8 */ 110 } 111} 112#endif 113 114typedef enum { 115 HIFB_DYNAMIC_RANGE_SDR8 = 0, 116 HIFB_DYNAMIC_RANGE_SDR10, 117 HIFB_DYNAMIC_RANGE_HDR10, 118 HIFB_DYNAMIC_RANGE_HLG, 119 HIFB_DYNAMIC_RANGE_SLF, 120 HIFB_DYNAMIC_RANGE_BUTT 121} HIFB_DYNAMIC_RANGE_E; 122 123typedef struct { 124 HI_BOOL bKeyEnable; /* colorkey enable flag */ 125 HI_U32 u32Key; /* colorkey value, maybe contains alpha */ 126} HIFB_COLORKEY_S; 127 128typedef struct { 129 HI_S32 x; 130 HI_S32 y; 131 HI_S32 w; 132 HI_S32 h; 133} HIFB_RECT; 134 135typedef struct { 136 HI_S32 s32XPos; /* horizontal position */ 137 HI_S32 s32YPos; /* vertical position */ 138} HIFB_POINT_S; 139 140typedef struct { 141 HI_U32 u32HDfLevel; /* horizontal deflicker level */ 142 HI_U32 u32VDfLevel; /* vertical deflicker level */ 143 HI_U8 ATTRIBUTE *pu8HDfCoef; /* horizontal deflicker coefficient */ 144 HI_U8 ATTRIBUTE *pu8VDfCoef; /* vertical deflicker coefficient */ 145} HIFB_DEFLICKER_S; 146 147/* Alpha info */ 148typedef struct { 149 HI_BOOL bAlphaEnable; /* alpha enable flag */ 150 HI_BOOL bAlphaChannel; /* alpha channel enable flag */ 151 HI_U8 u8Alpha0; /* alpha0 value, used in ARGB1555 */ 152 HI_U8 u8Alpha1; /* alpha1 value, used in ARGB1555 */ 153 HI_U8 u8GlobalAlpha; /* global alpha value */ 154 HI_U8 u8Reserved; 155} HIFB_ALPHA_S; 156 157typedef enum { 158 HIFB_FMT_RGB565 = 0, 159 HIFB_FMT_RGB888, /* RGB888 24bpp */ 160 161 HIFB_FMT_KRGB444, /* RGB444 16bpp */ 162 HIFB_FMT_KRGB555, /* RGB555 16bpp */ 163 HIFB_FMT_KRGB888, /* RGB888 32bpp */ 164 165 HIFB_FMT_ARGB4444, /* ARGB4444 */ 166 HIFB_FMT_ARGB1555, /* ARGB1555 */ 167 HIFB_FMT_ARGB8888, /* ARGB8888 */ 168 HIFB_FMT_ARGB8565, /* ARGB8565 */ 169 170 HIFB_FMT_RGBA4444, /* ARGB4444 */ 171 HIFB_FMT_RGBA5551, /* RGBA5551 */ 172 HIFB_FMT_RGBA5658, /* RGBA5658 */ 173 HIFB_FMT_RGBA8888, /* RGBA8888 */ 174 175 HIFB_FMT_BGR565, /* BGR565 */ 176 HIFB_FMT_BGR888, /* BGR888 */ 177 HIFB_FMT_ABGR4444, /* ABGR4444 */ 178 HIFB_FMT_ABGR1555, /* ABGR1555 */ 179 HIFB_FMT_ABGR8888, /* ABGR8888 */ 180 HIFB_FMT_ABGR8565, /* ABGR8565 */ 181 HIFB_FMT_KBGR444, /* BGR444 16bpp */ 182 HIFB_FMT_KBGR555, /* BGR555 16bpp */ 183 HIFB_FMT_KBGR888, /* BGR888 32bpp */ 184 185 HIFB_FMT_1BPP, /* clut1 */ 186 HIFB_FMT_2BPP, /* clut2 */ 187 HIFB_FMT_4BPP, /* clut4 */ 188 HIFB_FMT_8BPP, /* clut8 */ 189 HIFB_FMT_ACLUT44, /* AClUT44 */ 190 HIFB_FMT_ACLUT88, /* ACLUT88 */ 191 HIFB_FMT_PUYVY, /* UYVY */ 192 HIFB_FMT_PYUYV, /* YUYV */ 193 HIFB_FMT_PYVYU, /* YVYU */ 194 HIFB_FMT_YUV888, /* YUV888 */ 195 HIFB_FMT_AYUV8888, /* AYUV8888 */ 196 HIFB_FMT_YUVA8888, /* YUVA8888 */ 197 HIFB_FMT_BUTT 198} HIFB_COLOR_FMT_E; 199 200typedef struct { 201 HI_BOOL bKeyRgb; 202 HI_BOOL bKeyAlpha; /* whether support colorkey alpha */ 203 HI_BOOL bGlobalAlpha; /* whether support global alpha */ 204 HI_BOOL bCmap; /* whether support color map */ 205 HI_BOOL bHasCmapReg; /* whether has color map register */ 206 HI_BOOL bColFmt[HIFB_FMT_BUTT]; /* support which color format */ 207 HI_BOOL bVoScale; /* support vo scale */ 208 /* whether support a certain layer, for example:x5 HD support HIFB_SD_0 not support HIFB_SD_1 */ 209 HI_BOOL bLayerSupported; 210 HI_U32 u32MaxWidth; /* the max pixels per line */ 211 HI_U32 u32MaxHeight; /* the max lines */ 212 HI_U32 u32MinWidth; /* the min pixels per line */ 213 HI_U32 u32MinHeight; /* the min lines */ 214 HI_U32 u32VDefLevel; /* vertical deflicker level, 0 means vertical deflicker is unsupported */ 215 HI_U32 u32HDefLevel; /* horizontal deflicker level, 0 means horizontal deflicker is unsupported */ 216 HI_BOOL bDcmp; 217 HI_BOOL bPreMul; 218 HI_BOOL bGHDR; /* NEW Feature. Is GHDR supported. */ 219} HIFB_CAPABILITY_S; 220 221/* refresh mode */ 222typedef enum { 223 HIFB_LAYER_BUF_DOUBLE = 0x0, /* 2 display buf in fb */ 224 HIFB_LAYER_BUF_ONE = 0x1, /* 1 display buf in fb */ 225 HIFB_LAYER_BUF_NONE = 0x2, /* no display buf in fb,the buf user refreshed will be directly set to VO */ 226 HIFB_LAYER_BUF_DOUBLE_IMMEDIATE = 0x3, /* 2 display buf in fb, each refresh will be displayed */ 227 HIFB_LAYER_BUF_FENCE = 0x4, /* 2 display buf in fb with fence */ 228 HIFB_LAYER_BUF_BUTT 229} HIFB_LAYER_BUF_E; 230 231/* surface info */ 232typedef struct { 233 HI_U64 u64PhyAddr; /* start physical address */ 234 HI_U64 u64GBPhyAddr; 235 HI_U32 u32Width; /* width pixels */ 236 HI_U32 u32Height; /* height pixels */ 237 HI_U32 u32Pitch; /* line pixels */ 238 HIFB_COLOR_FMT_E enFmt; /* color format */ 239 HIFB_DYNAMIC_RANGE_E enDynamicRange; /* NEW dynamic range. */ 240} HIFB_SURFACE_S; 241 242typedef struct { 243 HI_U64 u64PhyAddr; 244 HIFB_ALPHA_S stAlpha; 245 HIFB_COLORKEY_S stColorkey; 246} HIFB_SURFACEEX_S; 247 248/* refresh surface info */ 249typedef struct { 250 HIFB_SURFACE_S stCanvas; 251 HIFB_RECT UpdateRect; /* refresh region */ 252} HIFB_BUFFER_S; 253 254/* cursor info */ 255typedef struct { 256 HIFB_SURFACE_S stCursor; 257 HIFB_POINT_S stHotPos; 258} HIFB_CURSOR_S; 259 260/* DDR detect zone info */ 261typedef struct { 262 HI_U32 u32StartSection; 263 HI_U32 u32ZoneNums; 264} HIFB_DDRZONE_S; 265 266/* cursor handle */ 267/* Attention:surface in cursor will be released by user */ 268#define FBIOPUT_CURSOR_INFO _IOW(IOC_TYPE_HIFB, 104, HIFB_CURSOR_S) 269#define FBIOGET_CURSOR_INFO _IOW(IOC_TYPE_HIFB, 105, HIFB_CURSOR_S) 270 271#define FBIOPUT_CURSOR_STATE _IOW(IOC_TYPE_HIFB, 106, HI_BOOL) 272#define FBIOGET_CURSOR_STATE _IOW(IOC_TYPE_HIFB, 107, HI_BOOL) 273 274#define FBIOPUT_CURSOR_POS _IOW(IOC_TYPE_HIFB, 108, HIFB_POINT_S) 275#define FBIOGET_CURSOR_POS _IOR(IOC_TYPE_HIFB, 109, HIFB_POINT_S) 276 277#define FBIOPUT_CURSOR_COLORKEY _IOR(IOC_TYPE_HIFB, 110, HIFB_COLORKEY_S) 278#define FBIOGET_CURSOR_COLORKEY _IOW(IOC_TYPE_HIFB, 111, HIFB_COLORKEY_S) 279#define FBIOPUT_CURSOR_ALPHA _IOR(IOC_TYPE_HIFB, 112, HIFB_ALPHA_S) 280#define FBIOGET_CURSOR_ALPHA _IOW(IOC_TYPE_HIFB, 113, HIFB_ALPHA_S) 281 282/* 283 * cursor will be separated from attached layer automatically if you attach cursor to another layer,that means 284 * cursor can be attached to only one layer at any time 285 */ 286#define FBIOPUT_CURSOR_ATTCHCURSOR _IOW(IOC_TYPE_HIFB, 114, HI_U32) 287#define FBIOPUT_CURSOR_DETACHCURSOR _IOW(IOC_TYPE_HIFB, 115, HI_U32) 288 289/* Auto means fb will choose a appropriate antiflicker level automatically according to the color info of map */ 290typedef enum { 291 HIFB_LAYER_ANTIFLICKER_NONE = 0x0, /* no antiflicker */ 292 HIFB_LAYER_ANTIFLICKER_LOW = 0x1, /* low level */ 293 HIFB_LAYER_ANTIFLICKER_MIDDLE = 0x2, /* middle level */ 294 HIFB_LAYER_ANTIFLICKER_HIGH = 0x3, /* high level */ 295 HIFB_LAYER_ANTIFLICKER_AUTO = 0x4, /* auto */ 296 HIFB_LAYER_ANTIFLICKER_BUTT 297} HIFB_LAYER_ANTIFLICKER_LEVEL_E; 298 299/* MIRROR mode */ 300typedef enum { 301 HIFB_MIRROR_NONE = 0x0, 302 HIFB_MIRROR_HORIZONTAL = 0x1, 303 HIFB_MIRROR_VERTICAL = 0x2, 304 HIFB_MIRROR_BOTH = 0x3, 305 HIFB_MIRROR_BUTT 306} HIFB_MIRROR_MODE_E; 307 308/* ROTATE mode */ 309typedef enum { 310 HIFB_ROTATE_NONE = 0x0, 311 HIFB_ROTATE_90 = 0x1, 312 HIFB_ROTATE_180 = 0x2, 313 HIFB_ROTATE_270 = 0x3, 314 HIFB_ROTATE_BUTT 315} HIFB_ROTATE_MODE_E; 316 317/* layer info maskbit */ 318typedef enum { 319 HIFB_LAYERMASK_BUFMODE = 0x1, /* BUFMODE bitmask */ 320 HIFB_LAYERMASK_ANTIFLICKER_MODE = 0x2, /* ANTIFLICKER_MODE bitmask */ 321 HIFB_LAYERMASK_POS = 0x4, /* the position bitmask */ 322 HIFB_LAYERMASK_CANVASSIZE = 0x8, /* canvassize bitmask */ 323 HIFB_LAYERMASK_DISPSIZE = 0x10, /* displaysize bitmask */ 324 HIFB_LAYERMASK_SCREENSIZE = 0x20, /* screensize bitmask */ 325 HIFB_LAYERMASK_BMUL = 0x40, /* pre-mult bitmask */ 326 HIFB_LAYERMASK_BUTT 327} HIFB_LAYER_INFO_MASKBIT; 328 329/* layer info */ 330typedef struct { 331 HIFB_LAYER_BUF_E BufMode; 332 HIFB_LAYER_ANTIFLICKER_LEVEL_E eAntiflickerLevel; 333 HI_S32 s32XPos; /* the x pos of origin point in screen */ 334 HI_S32 s32YPos; /* the y pos of origin point in screen */ 335 HI_U32 u32CanvasWidth; /* the width of canvas buffer */ 336 HI_U32 u32CanvasHeight; /* the height of canvas buffer */ 337 /* the width of display buf in fb.for 0 buf ,there is no display buf in fb, so it's effectless */ 338 HI_U32 u32DisplayWidth; 339 HI_U32 u32DisplayHeight; /* the height of display buf in fb. */ 340 HI_U32 u32ScreenWidth; /* the width of screen */ 341 HI_U32 u32ScreenHeight; /* the height of screen */ 342 HI_BOOL bPreMul; /* The data drawn in buf is premul data or not */ 343 HI_U32 u32Mask; /* param modify mask bit */ 344} HIFB_LAYER_INFO_S; 345 346/* To set the layer information */ 347#define FBIOPUT_LAYER_INFO _IOW(IOC_TYPE_HIFB, 120, HIFB_LAYER_INFO_S) 348/* To get the layer information */ 349#define FBIOGET_LAYER_INFO _IOR(IOC_TYPE_HIFB, 121, HIFB_LAYER_INFO_S) 350/* To get canvas buf */ 351#define FBIOGET_CANVAS_BUFFER _IOR(IOC_TYPE_HIFB, 123, HIFB_BUFFER_S) 352/* To refresh the displayed contents in extended mode */ 353#define FBIO_REFRESH _IOW(IOC_TYPE_HIFB, 124, HIFB_BUFFER_S) 354 355/* sync refresh */ 356#define FBIO_WAITFOR_FREFRESH_DONE _IO(IOC_TYPE_HIFB, 125) 357 358/* To set the mirror mode */ 359#define FBIOPUT_MIRROR_MODE _IOW(IOC_TYPE_HIFB, 126, HIFB_MIRROR_MODE_E) 360/* To get the mirror mode */ 361#define FBIOGET_MIRROR_MODE _IOW(IOC_TYPE_HIFB, 127, HIFB_MIRROR_MODE_E) 362 363/* To set the rotate mode */ 364#define FBIOPUT_ROTATE_MODE _IOW(IOC_TYPE_HIFB, 128, HIFB_ROTATE_MODE_E) 365/* To get the rotate mode */ 366#define FBIOGET_ROTATE_MODE _IOW(IOC_TYPE_HIFB, 129, HIFB_ROTATE_MODE_E) 367 368/* To set the DDR detect zone of an overlay layer */ 369#define FBIOPUT_MDDRDETECT_HIFB _IOW(IOC_TYPE_HIFB, 135, HIFB_DDRZONE_S) 370/* To get the DDR detect zone of an overlay layer */ 371#define FBIOGET_MDDRDETECT_HIFB _IOW(IOC_TYPE_HIFB, 136, HIFB_DDRZONE_S) 372 373#ifdef __HuaweiLite__ 374#define FBIOGET_SCREENINFO_HIFB 0x4600 375#define FBIOPUT_SCREENINFO_HIFB 0x4601 376#define FBIOPAN_DISPLAY_HIFB 0x4606 377 378struct hifb_info { 379 struct fb_vtable_s vtable; /* FB interfaces */ 380 struct fb_videoinfo_s vinfo; /* This structure descrides the overall video controller */ 381 struct fb_overlayinfo_s oinfo; /* This structure descrides one overlay */ 382#ifdef CONFIG_FB_CMAP 383 struct fb_cmap_s cmap; /* Current camp */ 384#endif 385 int activate; 386 void *par; /* Private data */ 387}; 388 389HI_S32 hifb_init(hi_void *pArgs); 390#endif 391 392#ifdef __cplusplus 393#if __cplusplus 394} 395#endif 396#endif /* __cplusplus */ 397 398#endif /* __HIFB_H__ */ 399