//the para including fb address,fb width,fb height,source x/y offset,screen window __s32 BSP_disp_sprite_block_request(__u32 sel, __disp_sprite_block_para_t *para) { __s32 id = 0; __disp_sprite_block_para_t cur_para; list_head_t * node = NULL; __u32 cpu_sr; if((para->scn_win.width != 8) && (para->scn_win.width != 16) && (para->scn_win.width != 32) && (para->scn_win.width != 64) && (para->scn_win.width != 128) && (para->scn_win.width != 256) && (para->scn_win.width != 512)) { DE_WRN("BSP_disp_sprite_block_request,scn_win width invalid:%d\n",para->scn_win.width); return DIS_NULL; } if((para->scn_win.height != 8) && (para->scn_win.height != 16) && (para->scn_win.height != 32) && (para->scn_win.height != 64) && (para->scn_win.height != 128) && (para->scn_win.height != 256) && (para->scn_win.height != 512) && (para->scn_win.height != 1024)) { DE_WRN("BSP_disp_sprite_block_request,scn_win height invalid:%d\n",para->scn_win.height); return DIS_NULL; } node = List_Add_Sprite_Block(sel, para); if(node == NULL) { return (__s32)NULL; } id = node->data->id; node->data->address = (__u32)para->fb.addr[0]; node->data->size.width = para->fb.size.width; node->data->src_win.x = para->src_win.x; node->data->src_win.y = para->src_win.y; node->data->scn_win.x = para->scn_win.x; node->data->scn_win.y = para->scn_win.y; node->data->scn_win.width = para->scn_win.width; node->data->scn_win.height = para->scn_win.height; memcpy(&cur_para,para,sizeof(__disp_sprite_block_para_t)); cur_para.scn_win.y = -2000; DE_BE_Sprite_Block_Set_Next_Id(sel, node->prev->data->id, id); sprite_set_sprite_block_para(sel, id, 0, para); OSAL_IrqLock(&cpu_sr); gsprite[sel].block_status[id] |= SPRITE_BLOCK_USED; gsprite[sel].block_num ++; OSAL_IrqUnLock(cpu_sr); return Sprite_Id_To_Hid(sel, id); }
static __s32 sprite_set_sprite_block_para(__u32 sel, __u32 id, __u32 next_id, __disp_sprite_block_para_t * para) { __u32 bpp, addr; bpp = de_format_to_bpp(gsprite[sel].format); addr = DE_BE_Offset_To_Addr((__u32)para->fb.addr[0] ,para->fb.size.width, para->src_win.x, para->src_win.y, bpp); DE_BE_Sprite_Block_Set_fb(sel, id, (__u32)OSAL_VAtoPA((void*)addr), para->fb.size.width*(bpp>>3)); DE_BE_Sprite_Block_Set_Pos(sel, id, para->scn_win.x, para->scn_win.y); DE_BE_Sprite_Block_Set_Size(sel, id, para->scn_win.width, para->scn_win.height); DE_BE_Sprite_Block_Set_Next_Id(sel, id, next_id); OSAL_CacheRangeFlush((void*)para->fb.addr[0], (para->fb.size.width * para->scn_win.height * bpp + 7)/8,CACHE_CLEAN_FLUSH_D_CACHE_REGION); return 0; }
static __s32 sprite_set_sprite_block_para(__u32 sel, __u32 id, __u32 next_id, __disp_sprite_block_para_t *para) { __u32 bpp, addr; bpp = DE_BE_Format_To_Bpp(gsprite[sel].format); addr = DE_BE_Offset_To_Addr((__u32) para->fb.addr[0], para->fb.size.width, para->src_win.x, para->src_win.y, bpp); DE_BE_Sprite_Block_Set_fb(sel, id, __phys_to_bus(addr), para->fb.size.width * (bpp >> 3)); DE_BE_Sprite_Block_Set_Pos(sel, id, para->scn_win.x, para->scn_win.y); DE_BE_Sprite_Block_Set_Size(sel, id, para->scn_win.width, para->scn_win.height); DE_BE_Sprite_Block_Set_Next_Id(sel, id, next_id); return 0; }