HI_S32 SAMPLE_HIFB_LoadBmp(const char *filename, HI_U8 *pAddr) { OSD_SURFACE_S Surface; OSD_BITMAPFILEHEADER bmpFileHeader; OSD_BITMAPINFO bmpInfo; if (GetBmpInfo(filename,&bmpFileHeader,&bmpInfo) < 0) { printf("GetBmpInfo err!\n"); return HI_FAILURE; } Surface.enColorFmt = OSD_COLOR_FMT_RGB1555; CreateSurfaceByBitMap(filename,&Surface,pAddr); return HI_SUCCESS; }
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; }