1 程序流程图。
2 sample例子
HI_S32 TDE_DrawGraphicSample()
{
HI_U32 u32Size;
HI_S32 s32Fd;
HI_U32 u32Times;
HI_U8* pu8Screen;
HI_U32 u32PhyAddr;
HI_S32 s32Ret = -1;
HI_U32 i = 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};
//HI_UNF_DISPLAY_SetEnable(HI_TRUE);
/* 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;
}
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);
memset(pu8Screen, 0xff, SCREEN_WIDTH*SCREEN_HEIGHT*4);
/* 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;
g_stBackGround.u32PhyAddr = g_stScreen[1].u32PhyAddr + g_stScreen[1].u32Stride * g_stScreen[1].u32Height;
TDE_CreateSurfaceByFile(BACKGROUND_NAME, &g_stBackGround, pu8Screen + ((HI_U32)g_stBackGround.u32PhyAddr - u32PhyAddr));
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], pu8Screen + ((HI_U32)g_stImgSur[i].u32PhyAddr - 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], pu8Screen + ((HI_U32)g_stImgSur[i].u32PhyAddr - 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)
{
TDE_PRINT("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_TDE2_Close();
//HI_UNF_DISPLAY_SetEnable(HI_FALSE);
return s32Ret;
}