You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

197 lines
5.9 KiB

#include "hifb.hpp"
HI_S32 g_hFrameBuffer;
HIFB_BUFFER_S g_stCanvasBuf;
void *g_BackBuffer;
static struct fb_bitfield s_r16 = {10, 5, 0};
static struct fb_bitfield s_g16 = {5, 5, 0};
static struct fb_bitfield s_b16 = {0, 5, 0};
static struct fb_bitfield s_a16 = {15, 1, 0};
HI_BOOL HiInitDisplay() {
HI_S32 s32Ret = HI_SUCCESS;
HI_U32 u32PicWidth = SCREEN_WIDTH;
HI_U32 u32PicHeight = SCREEN_HEIGHT;
SIZE_S stSize;
VO_LAYER VoLayer = 0;
VO_PUB_ATTR_S stPubAttr;
VO_VIDEO_LAYER_ATTR_S stLayerAttr;
HI_U32 u32VoFrmRate;
HI_BOOL bShow = HI_TRUE;
HIFB_LAYER_INFO_S stLayerInfo = {};
HIFB_POINT_S stPoint = {};
struct fb_var_screeninfo stVarInfo;
HIFB_COLORKEY_S stColorKey;
VB_CONF_S stVbConf;
HI_U32 u32BlkSize;
/******************************************
step 1: init variable
******************************************/
memset(&stVbConf, 0, sizeof(VB_CONF_S));
u32BlkSize = CEILING_2_POWER(u32PicWidth, SAMPLE_SYS_ALIGN_WIDTH) *
CEILING_2_POWER(u32PicHeight, SAMPLE_SYS_ALIGN_WIDTH) * 2;
stVbConf.u32MaxPoolCnt = 128;
stVbConf.astCommPool[0].u32BlkSize = u32BlkSize;
stVbConf.astCommPool[0].u32BlkCnt = 6;
/******************************************
step 2: mpp system init.
******************************************/
s32Ret = SAMPLE_COMM_SYS_Init(&stVbConf);
if (HI_SUCCESS != s32Ret) {
SAMPLE_PRT("system init failed with %d!\n", s32Ret);
return HI_FALSE;
}
/******************************************
step 3: start vo hd0.
*****************************************/
s32Ret = HI_MPI_VO_UnBindGraphicLayer(GRAPHICS_LAYER_HC0, SAMPLE_VO_DEV_DHD0);
if (HI_SUCCESS != s32Ret) {
SAMPLE_PRT("UnBindGraphicLayer failed with %d!\n", s32Ret);
return HI_FALSE;
}
s32Ret = HI_MPI_VO_BindGraphicLayer(GRAPHICS_LAYER_HC0, SAMPLE_VO_DEV_DHD0);
if (HI_SUCCESS != s32Ret) {
SAMPLE_PRT("BindGraphicLayer failed with %d!\n", s32Ret);
return HI_FALSE;
}
stPubAttr.enIntfSync = VO_OUTPUT_640x480_60;
stPubAttr.enIntfType = VO_INTF_HDMI;
stPubAttr.stSyncInfo.bSynm = HI_TRUE;
stPubAttr.u32BgColor = 0x000000;
stLayerAttr.bClusterMode = HI_FALSE;
stLayerAttr.bDoubleFrame = HI_FALSE;
stLayerAttr.enPixFormat = PIXEL_FORMAT_YUV_SEMIPLANAR_420;
u32VoFrmRate = 60;
stSize.u32Width = SCREEN_WIDTH;
stSize.u32Height = SCREEN_HEIGHT;
memcpy(&stLayerAttr.stImageSize, &stSize, sizeof(stSize));
stLayerAttr.u32DispFrmRt = 60;
stLayerAttr.stDispRect.s32X = 0;
stLayerAttr.stDispRect.s32Y = 0;
stLayerAttr.stDispRect.u32Width = stSize.u32Width;
stLayerAttr.stDispRect.u32Height = stSize.u32Height;
s32Ret = SAMPLE_COMM_VO_StartDev(SAMPLE_VO_DEV_DHD0, &stPubAttr);
if (HI_SUCCESS != s32Ret) {
SAMPLE_PRT("start vo dev failed with %d!\n", s32Ret);
return HI_FALSE;
}
s32Ret = SAMPLE_COMM_VO_StartLayer(VoLayer, &stLayerAttr);
if (HI_SUCCESS != s32Ret) {
SAMPLE_PRT("start vo layer failed with %d!\n", s32Ret);
return HI_FALSE;
}
if (stPubAttr.enIntfType & VO_INTF_HDMI) {
s32Ret = SAMPLE_COMM_VO_HdmiStart(stPubAttr.enIntfSync);
if (HI_SUCCESS != s32Ret) {
SAMPLE_PRT("start HDMI failed with %d!\n", s32Ret);
return HI_FALSE;
}
}
if ((g_hFrameBuffer = open("/dev/fb0", O_RDWR, NULL)) < 0) {
SAMPLE_PRT("failed to open /dev/fb0...\n");
return HI_FALSE;
}
/*all layer surport colorkey*/
stColorKey.bKeyEnable = HI_TRUE;
stColorKey.u32Key = 0x0;
if (ioctl(g_hFrameBuffer, FBIOPUT_COLORKEY_HIFB, &stColorKey) < 0) {
SAMPLE_PRT("FBIOPUT_COLORKEY_HIFB!\n");
return HI_FALSE;
}
s32Ret = ioctl(g_hFrameBuffer, FBIOGET_VSCREENINFO, &stVarInfo);
if (s32Ret < 0) {
SAMPLE_PRT("GET_VSCREENINFO failed!\n");
return HI_FALSE;
}
if (ioctl(g_hFrameBuffer, FBIOPUT_SCREEN_ORIGIN_HIFB, &stPoint) < 0) {
SAMPLE_PRT("set screen original show position failed!\n");
return HI_FALSE;
}
stVarInfo.transp = s_a16;
stVarInfo.red = s_r16;
stVarInfo.green = s_g16;
stVarInfo.blue = s_b16;
stVarInfo.bits_per_pixel = 16;
stVarInfo.activate = FB_ACTIVATE_NOW;
stVarInfo.xres = stVarInfo.xres_virtual = SCREEN_WIDTH;
stVarInfo.yres = stVarInfo.yres_virtual = SCREEN_HEIGHT;
if (ioctl(g_hFrameBuffer, FBIOPUT_VSCREENINFO, &stVarInfo) < 0) {
SAMPLE_PRT("PUT_VSCREENINFO failed!\n");
return HI_FALSE;
}
stLayerInfo.BufMode = HIFB_LAYER_BUF_ONE;
stLayerInfo.u32Mask = HIFB_LAYERMASK_BUFMODE;
if (ioctl(g_hFrameBuffer, FBIOPUT_LAYER_INFO, &stLayerInfo) < 0) {
SAMPLE_PRT("PUT_LAYER_INFO failed!\n");
return HI_FALSE;
}
if (ioctl(g_hFrameBuffer, FBIOPUT_SHOW_HIFB, &bShow) < 0) {
SAMPLE_PRT("FBIOPUT_SHOW_HIFB failed!\n");
return HI_FALSE;
}
/* allocate mmz memory for back buffer... */
if (HI_FAILURE == HI_MPI_SYS_MmzAlloc(&g_stCanvasBuf.stCanvas.u32PhyAddr,
&g_BackBuffer, NULL, NULL,
SCREEN_WIDTH * SCREEN_HEIGHT * 2)) {
SAMPLE_PRT("allocate memory (640*480*2 bytes) failed\n");
return HI_FALSE;
}
/* when we call RefreshScreen we will re-draw the entire screen... */
g_stCanvasBuf.UpdateRect.x = (SCREEN_WIDTH - SCALE_WIDTH) / 2;
g_stCanvasBuf.UpdateRect.y = 0;
g_stCanvasBuf.UpdateRect.w = SCALE_WIDTH;
g_stCanvasBuf.UpdateRect.h = SCALE_HEIGHT;
/* meta data about the back buffer... */
g_stCanvasBuf.stCanvas.u32Height = SCREEN_HEIGHT;
g_stCanvasBuf.stCanvas.u32Width = SCREEN_WIDTH;
g_stCanvasBuf.stCanvas.u32Pitch = SCREEN_WIDTH * 2;
g_stCanvasBuf.stCanvas.enFmt = HIFB_FMT_ARGB1555;
memset(g_BackBuffer, 0x00,
g_stCanvasBuf.stCanvas.u32Pitch * g_stCanvasBuf.stCanvas.u32Height);
/* finally open TDE so we can do hardware accelerated color conversions... */
s32Ret = HI_TDE2_Open();
if (s32Ret < 0) {
SAMPLE_PRT("HI_TDE2_Open failed :%d!\n", s32Ret);
return HI_FALSE;
}
return HI_TRUE;
}
void RefreshScreen() {
int arg = 0;
ioctl(g_hFrameBuffer, FBIO_WAITFORVSYNC, &arg);
ioctl(g_hFrameBuffer, FBIO_REFRESH, &g_stCanvasBuf);
}