HI_S32 TDE_DrawGraphicSample() { HI_U32 u32Size; HI_S32 s32Fd; HI_U32 u32Times; HI_U8* pu8Screen; HI_U8* pu8BackGroundVir; HI_U32 u32PhyAddr; HI_S32 s32Ret = -1; HI_U32 i = 0; HI_BOOL bShow; HIFB_ALPHA_S stAlpha = {0}; struct fb_fix_screeninfo stFixInfo; struct fb_var_screeninfo stVarInfo; struct fb_bitfield stR32 = {10, 5, 0}; struct fb_bitfield stG32 = {5, 5, 0}; struct fb_bitfield stB32 = {0, 5, 0}; struct fb_bitfield stA32 = {15, 1, 0}; /* 1. open tde device */ HI_TDE2_Open(); /* 2. framebuffer operation */ s32Fd = open("/dev/fb0", O_RDWR); if (s32Fd == -1) { printf("open frame buffer device error\n"); goto FB_OPEN_ERROR; } stAlpha.bAlphaChannel = HI_FALSE; stAlpha.bAlphaEnable = HI_FALSE; if (ioctl(s32Fd, FBIOPUT_ALPHA_HIFB, &stAlpha) < 0) { printf("Put alpha info failed!\n"); goto FB_PROCESS_ERROR0; } /* get the variable screen info */ if (ioctl(s32Fd, FBIOGET_VSCREENINFO, &stVarInfo) < 0) { printf("Get variable screen info failed!\n"); goto FB_PROCESS_ERROR0; } stVarInfo.xres_virtual = SCREEN_WIDTH; stVarInfo.yres_virtual = SCREEN_HEIGHT*2; stVarInfo.xres = SCREEN_WIDTH; stVarInfo.yres = SCREEN_HEIGHT; stVarInfo.activate = FB_ACTIVATE_NOW; stVarInfo.bits_per_pixel = 16; stVarInfo.xoffset = 0; stVarInfo.yoffset = 0; stVarInfo.red = stR32; stVarInfo.green = stG32; stVarInfo.blue = stB32; stVarInfo.transp = stA32; if (ioctl(s32Fd, FBIOPUT_VSCREENINFO, &stVarInfo) < 0) { printf("process frame buffer device error\n"); goto FB_PROCESS_ERROR0; } if (ioctl(s32Fd, FBIOGET_FSCREENINFO, &stFixInfo) < 0) { printf("process frame buffer device error\n"); goto FB_PROCESS_ERROR0; } u32Size = stFixInfo.smem_len; u32PhyAddr = stFixInfo.smem_start; pu8Screen = mmap(NULL, u32Size, PROT_READ|PROT_WRITE, MAP_SHARED, s32Fd, 0); if (NULL == pu8Screen) { printf("mmap fb0 failed!\n"); goto FB_PROCESS_ERROR0; } memset(pu8Screen, 0x00, stFixInfo.smem_len); /* 3. create surface */ g_stScreen[0].enColorFmt = PIXFMT; g_stScreen[0].u32PhyAddr = u32PhyAddr; g_stScreen[0].u32Width = SCREEN_WIDTH; g_stScreen[0].u32Height = SCREEN_HEIGHT; g_stScreen[0].u32Stride = stFixInfo.line_length; g_stScreen[0].bAlphaMax255 = HI_TRUE; g_stScreen[1] = g_stScreen[0]; g_stScreen[1].u32PhyAddr = g_stScreen[0].u32PhyAddr + g_stScreen[0].u32Stride * g_stScreen[0].u32Height; /* allocate memory (720*576*2*N_IMAGES bytes) to save Images' infornation */ if (HI_FAILURE == HI_MPI_SYS_MmzAlloc(&(g_stBackGround.u32PhyAddr), ((void**)&pu8BackGroundVir), NULL, NULL, 720*576*2*N_IMAGES)) { TDE_PRINT("allocate memory (720*576*2*N_IMAGES bytes) failed\n"); goto FB_PROCESS_ERROR1; } TDE_CreateSurfaceByFile(BACKGROUND_NAME, &g_stBackGround, pu8BackGroundVir); g_stImgSur[0].u32PhyAddr = g_stBackGround.u32PhyAddr + g_stBackGround.u32Stride * g_stBackGround.u32Height; for(i = 0; i < N_IMAGES - 1; i++) { TDE_CreateSurfaceByFile(pszImageNames[i], &g_stImgSur[i], pu8BackGroundVir + ((HI_U32)g_stImgSur[i].u32PhyAddr - g_stBackGround.u32PhyAddr)); g_stImgSur[i+1].u32PhyAddr = g_stImgSur[i].u32PhyAddr + g_stImgSur[i].u32Stride * g_stImgSur[i].u32Height; } TDE_CreateSurfaceByFile(pszImageNames[i], &g_stImgSur[i], pu8BackGroundVir + ((HI_U32)g_stImgSur[i].u32PhyAddr - g_stBackGround.u32PhyAddr)); bShow = HI_TRUE; if (ioctl(s32Fd, FBIOPUT_SHOW_HIFB, &bShow) < 0) { fprintf (stderr, "Couldn't show fb\n"); goto FB_PROCESS_ERROR2; } g_s32FrameNum = 0; /* 3. use tde and framebuffer to realize rotational effect */ for (u32Times = 0; u32Times < 20; u32Times++) { circumrotate(u32Times%2); stVarInfo.yoffset = (u32Times%2)?0:576; /*set frame buffer start position*/ if (ioctl(s32Fd, FBIOPAN_DISPLAY, &stVarInfo) < 0) { TDE_PRINT("process frame buffer device error\n"); goto FB_PROCESS_ERROR2; } sleep(1); } s32Ret = 0; FB_PROCESS_ERROR2: HI_MPI_SYS_MmzFree(g_stBackGround.u32PhyAddr, pu8BackGroundVir); FB_PROCESS_ERROR1: munmap(pu8Screen, u32Size); FB_PROCESS_ERROR0: close(s32Fd); FB_OPEN_ERROR: HI_TDE2_Close(); return s32Ret; }
HI_S32 main(HI_VOID) { HI_U32 u32Size; HI_S32 s32Fd; HI_U32 u32Times; HI_U8* pu8Screen; HI_U32 u32PhyAddr; HI_S32 s32Ret = -1; HI_U32 i = 0; MPP_SYS_CONF_S struSysConf; HI_S32 s32ret; /* mpi sys init */ HI_MPI_SYS_Exit(); struSysConf.u32AlignWidth = 64; s32ret = HI_MPI_SYS_SetConf(&struSysConf); if (HI_SUCCESS != s32ret) { printf("HI_MPI_SYS_SetConf err\n"); return s32ret; } s32ret = HI_MPI_SYS_Init(); if (HI_SUCCESS != s32ret) { printf("HI_MPI_SYS_Init err\n"); return s32ret; } struct fb_fix_screeninfo stFixInfo; struct fb_var_screeninfo stVarInfo; struct fb_bitfield stR32 = {16, 8, 0}; struct fb_bitfield stG32 = {8, 8, 0}; struct fb_bitfield stB32 = {0, 8, 0}; struct fb_bitfield stA32 = {24, 8, 0}; /* 1. open tde device */ HI_API_TDE_Open(); /* 2. framebuffer operation */ s32Fd = open("/dev/fb/0", O_RDWR); if (s32Fd == -1) { printf("open frame buffer device error\n"); goto FB_OPEN_ERROR; } stVarInfo.xres_virtual = SCREEN_WIDTH; stVarInfo.yres_virtual = SCREEN_HEIGHT*2; stVarInfo.xres = SCREEN_WIDTH; stVarInfo.yres = SCREEN_HEIGHT; stVarInfo.activate = FB_ACTIVATE_FORCE; stVarInfo.bits_per_pixel = 32; stVarInfo.xoffset = 0; stVarInfo.yoffset = 0; stVarInfo.red = stR32; stVarInfo.green = stG32; stVarInfo.blue = stB32; stVarInfo.transp = stA32; if (ioctl(s32Fd, FBIOPUT_VSCREENINFO, &stVarInfo) < 0) { printf("process frame buffer device error\n"); goto FB_PROCESS_ERROR0; } if (ioctl(s32Fd, FBIOGET_FSCREENINFO, &stFixInfo) < 0) { printf("process frame buffer device error\n"); goto FB_PROCESS_ERROR0; } u32Size = stFixInfo.smem_len; if(u32Size < MIN_VIDEO_MEMORY) { printf("need more video memory to run the sample, the minimum size is %d\n", MIN_VIDEO_MEMORY); goto FB_PROCESS_ERROR0; } u32PhyAddr = stFixInfo.smem_start; pu8Screen = mmap(NULL, u32Size, PROT_READ|PROT_WRITE, MAP_SHARED, s32Fd, 0); memset(pu8Screen, 0xff, SCREEN_WIDTH*SCREEN_HEIGHT*4); /* 3. create surface */ g_stScreen[0].enColorFmt = PIXFMT; g_stScreen[0].pu8PhyAddr = (HI_U8*)u32PhyAddr; g_stScreen[0].u16Width = SCREEN_WIDTH; g_stScreen[0].u16Height = SCREEN_HEIGHT; g_stScreen[0].u16Stride = g_stScreen[0].u16Width * BPP; g_stScreen[1] = g_stScreen[0]; g_stScreen[1].pu8PhyAddr = g_stScreen[0].pu8PhyAddr + g_stScreen[0].u16Stride * g_stScreen[0].u16Height; g_stBackGround.pu8PhyAddr = g_stScreen[1].pu8PhyAddr + g_stScreen[1].u16Stride * g_stScreen[1].u16Height; CreateSurfaceByBitMap(BACKGROUND_NAME, &g_stBackGround, pu8Screen + ((HI_U32)g_stBackGround.pu8PhyAddr - u32PhyAddr)); g_stImgSur[0].pu8PhyAddr = g_stBackGround.pu8PhyAddr + g_stBackGround.u16Stride * g_stBackGround.u16Height; for(i = 0; i < N_IMAGES - 1; i++) { CreateSurfaceByBitMap(pszImageNames[i], &g_stImgSur[i], pu8Screen + ((HI_U32)g_stImgSur[i].pu8PhyAddr - u32PhyAddr)); g_stImgSur[i+1].pu8PhyAddr = g_stImgSur[i].pu8PhyAddr + g_stImgSur[i].u16Stride * g_stImgSur[i].u16Height; } CreateSurfaceByBitMap(pszImageNames[i], &g_stImgSur[i], pu8Screen + ((HI_U32)g_stImgSur[i].pu8PhyAddr - u32PhyAddr)); g_s32FrameNum = 0; /* 3. use tde and framebuffer to realize rotational effect */ for (u32Times = 0; u32Times < 1000; u32Times++) { circumrotate(u32Times%2); stVarInfo.yoffset = (u32Times%2)?0:576; /*set frame buffer start position*/ if (ioctl(s32Fd, FBIOPAN_DISPLAY, &stVarInfo) < 0) { printf("process frame buffer device error\n"); goto FB_PROCESS_ERROR1; } } s32Ret = 0; FB_PROCESS_ERROR1: munmap(pu8Screen, u32Size); FB_PROCESS_ERROR0: close(s32Fd); FB_OPEN_ERROR: HI_API_TDE_Close(); return s32Ret; }