Пример #1
0
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;
}
Пример #2
0
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);
	}
Пример #3
0
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;
}
Пример #4
0
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, &region_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, &region_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;
}