RET_CODE OSDDrv_RegionWrite(HANDLE hDev,UINT8 uRegionId,VSCR *pVscr,struct OSDRect *rect) { struct osd_device *dev = (struct osd_device *)hDev; #ifdef GE_SIMULATE_OSD RET_CODE ret; GE_SIMU_MUTEX_LOCK(); ge_cmd_list_new(m_osddrv_ge_dev, m_cmd_list, GE_COMPILE_AND_EXECUTE); ret = ge_gma_set_region_to_cmd_list(m_osddrv_ge_dev, GMA_SW_LAYER_ID, uRegionId, m_cmd_list); if (ret != RET_SUCCESS) { GE_SIMU_MUTEX_UNLOCK(); return ret; } UINT32 byte_pitch = osddrv_get_pitch(pVscr->bColorMode, pVscr->vR.uWidth); UINT32 ptn_x, ptn_y; ptn_x = rect->uLeft - pVscr->vR.uLeft; ptn_y = rect->uTop - pVscr->vR.uTop; osal_cache_flush(pVscr->lpbScr + byte_pitch * ptn_y, byte_pitch * rect->uHeight); ge_cmd_list_hdl cmd_list = m_cmd_list; ge_base_addr_t base_addr; base_addr.color_format = (enum GE_PIXEL_FORMAT)osddrv_color_mode_to_ge(pVscr->bColorMode); base_addr.base_address = (UINT32)pVscr->lpbScr; base_addr.data_decoder = GE_DECODER_DISABLE; base_addr.pixel_pitch = pVscr->vR.uWidth; base_addr.modify_flags = GE_BA_FLAG_ADDR|GE_BA_FLAG_FORMAT|GE_BA_FLAG_PITCH; UINT32 cmd_hdl = ge_cmd_begin(m_osddrv_ge_dev, cmd_list, GE_DRAW_BITMAP); ge_set_base_addr(m_osddrv_ge_dev, cmd_hdl, GE_PTN, &base_addr); ge_set_wh(m_osddrv_ge_dev, cmd_hdl, GE_DST_PTN, rect->uWidth, rect->uHeight); ge_set_xy(m_osddrv_ge_dev, cmd_hdl, GE_DST, rect->uLeft, rect->uTop); ge_set_xy(m_osddrv_ge_dev, cmd_hdl, GE_PTN, ptn_x, ptn_y); ge_cmd_end(m_osddrv_ge_dev, cmd_hdl); ge_cmd_list_end(m_osddrv_ge_dev, cmd_list); GE_SIMU_MUTEX_UNLOCK(); return RET_SUCCESS; #endif if (dev == NULL) return RET_SUCCESS; /* If device not running, exit */ if ((dev->flags & HLD_DEV_STATS_UP) == 0) { return RET_FAILURE; } if (dev->region_write) { return dev->region_write(dev, uRegionId,pVscr,rect); } return !RET_SUCCESS; }
void* ali_memcpy(void *dest, const void *src, unsigned int len) { if(len == 0) { return dest; } //the source and destination overlap, this function does not ensure that the original source bytes in the overlapping region are copied before being overwritten. #ifdef DUAL_ENABLE #ifndef SEE_CPU if(osal_dual_is_private_address(dest)) { osal_cache_flush((void*)(src), len); if(*(unsigned char *)(src+len-1) != *(volatile unsigned char*)((UINT32)(src+len-1)|0xa0000000)) { libc_printf("len=%d\n", len); //make sure data is flushed into cache before send to SEE ASSERT(0); } hld_dev_memcpy(dest, ((UINT32)(src)&0xfffffff)|0xa0000000, len); return dest; } #endif #endif if (!((UINT32)dest&0xf) && !((UINT32)src&0xf) && (0x0f < len)) { MemCopy4(dest, src, len&0xfffffff0); if (len&0x0f) { UINT32 dwCount; UINT8 *DestBuf, *SrcBuf; DestBuf = (UINT8 *)dest + (len & 0xfffffff0); SrcBuf = (UINT8 *)src + (len & 0xfffffff0); for (dwCount = 0;dwCount < (len&0x0f);dwCount++) *(DestBuf + dwCount) = *(SrcBuf + dwCount); } } else if(!((UINT32)dest&0x3) && !((UINT32)src&0x3) && (0x03 < len)) { UINT32 dwCount, dwLen; UINT32 *DestBuf,*SrcBuf; UINT8 * DestBufByte, *SrcBufByte; dwLen = (len&0xfffffffc)>>2; DestBuf = (UINT32 *)dest; SrcBuf = (UINT32 *)src; for(dwCount=0;dwCount<dwLen;dwCount++) *(DestBuf+dwCount)=*(SrcBuf+dwCount); dwLen = len&0x3; DestBufByte = (UINT8 *)(dest + (dwCount<<2)); SrcBufByte = (UINT8 *)(src +(dwCount<<2)); for(dwCount=0;dwCount<dwLen;dwCount++) *(DestBufByte+dwCount)=*(SrcBufByte+dwCount); }
char* mp_flush_file_name(char *file) { osal_cache_flush(file, STRLEN(file)+1); if(file[STRLEN(file)-1] != *(volatile unsigned char*)((UINT32)(file+STRLEN(file)-1)|0xa0000000)) { //make sure data is flushed into cache before send to SEE ASSERT(0); } //pass uncache address to SEE to make sure SEE read correct filename //it seems SEE invalidate cache has problem??? file = (char *)((UINT32)(file)|0xa0000000); return file; }
RET_CODE OSDDrv_RegionWrite2(HANDLE hDev,UINT8 uRegionId,UINT8* pSrcData,UINT16 uSrcWidth,UINT16 uSrcHeight,struct OSDRect* pSrcRect,struct OSDRect* pDestRect) { struct osd_device *dev = (struct osd_device *)hDev; #ifdef GE_SIMULATE_OSD RET_CODE ret; ge_gma_region_t region_param; UINT32 vscr_width = 1920, vscr_height = 1080; // get from subtitle UINT32 reg_width, reg_height; GE_SIMU_MUTEX_LOCK(); ret = ge_gma_get_region_info(m_osddrv_ge_dev, GMA_SW_LAYER_ID, uRegionId, ®ion_param); if (ret != RET_SUCCESS) { GE_SIMU_MUTEX_UNLOCK(); return ret; } if (uSrcWidth > 1280) { vscr_width = 1920; vscr_height = 1080; } else if (uSrcWidth > 720) { vscr_width = 1280; vscr_height = 720; } else { vscr_width = 720; vscr_height = 576; } reg_width = region_param.region_w; reg_height = region_param.region_h; if (vscr_width > reg_width || vscr_height > reg_height) { region_param.region_x = 0; region_param.region_y = 0; region_param.region_w = vscr_width; region_param.region_h = vscr_height; region_param.bitmap_x = 0; region_param.bitmap_y = 0; region_param.bitmap_w = vscr_width; region_param.bitmap_h = vscr_height; region_param.pixel_pitch = vscr_width; region_param.bitmap_addr = 0; ret = ge_gma_delete_region(m_osddrv_ge_dev, GMA_SW_LAYER_ID, uRegionId); if (ret != RET_SUCCESS) { SDBBP(); } ret = ge_gma_create_region(m_osddrv_ge_dev, GMA_SW_LAYER_ID, uRegionId, ®ion_param); if (ret != RET_SUCCESS) { SDBBP(); return ret; } ret = ge_gma_scale(m_osddrv_ge_dev, GMA_SW_LAYER_ID, GE_VSCALE_TTX_SUBT, PAL); if (ret != RET_SUCCESS) { SDBBP(); } } ge_cmd_list_new(m_osddrv_ge_dev, m_cmd_list, GE_COMPILE_AND_EXECUTE); ret = ge_gma_set_region_to_cmd_list(m_osddrv_ge_dev, GMA_SW_LAYER_ID, uRegionId, m_cmd_list); if (ret != RET_SUCCESS) { GE_SIMU_MUTEX_UNLOCK(); return ret; } UINT32 byte_pitch = osddrv_get_pitch(OSD_256_COLOR, uSrcWidth); osal_cache_flush(pSrcData + byte_pitch * pSrcRect->uTop, byte_pitch * pSrcRect->uHeight); ge_cmd_list_hdl cmd_list = m_cmd_list; ge_base_addr_t base_addr; base_addr.color_format = (enum GE_PIXEL_FORMAT)osddrv_color_mode_to_ge(OSD_256_COLOR); base_addr.base_address = (UINT32)pSrcData; base_addr.data_decoder = GE_DECODER_DISABLE; base_addr.pixel_pitch = uSrcWidth; base_addr.modify_flags = GE_BA_FLAG_ADDR|GE_BA_FLAG_FORMAT|GE_BA_FLAG_PITCH; UINT32 cmd_hdl = ge_cmd_begin(m_osddrv_ge_dev, cmd_list, GE_DRAW_BITMAP); ge_set_base_addr(m_osddrv_ge_dev, cmd_hdl, GE_PTN, &base_addr); ge_set_wh(m_osddrv_ge_dev, cmd_hdl, GE_DST_PTN, pSrcRect->uWidth, pSrcRect->uHeight); ge_set_xy(m_osddrv_ge_dev, cmd_hdl, GE_DST, pDestRect->uLeft, pDestRect->uTop); ge_set_xy(m_osddrv_ge_dev, cmd_hdl, GE_PTN, pSrcRect->uLeft, pSrcRect->uTop); ge_cmd_end(m_osddrv_ge_dev, cmd_hdl); ge_cmd_list_end(m_osddrv_ge_dev, cmd_list); GE_SIMU_MUTEX_UNLOCK(); return RET_SUCCESS; #endif if (dev == NULL) return RET_SUCCESS; /* If device not running, exit */ if ((dev->flags & HLD_DEV_STATS_UP) == 0) { return RET_FAILURE; } if (dev->region_write2) { return dev->region_write2(dev, uRegionId,pSrcData,uSrcWidth,uSrcHeight,pSrcRect,pDestRect); } return !RET_SUCCESS; }