void ctp_cypress_cy8ctma340_power(kal_bool ON)
{
	static kal_bool power_status = KAL_FALSE;
	kal_bool sleep, wakeup;
	
	if(ON == power_status) //do not turn on/off pmu ldo again.
		return;
	power_status = ON;
	
	if(gpio_ctp_power_enable_pin != 0xFF)
	{
		DclGPIO_Control(ctp_gpio_power_handle, GPIO_CMD_SET_MODE_0, NULL);
		DclGPIO_Control(ctp_gpio_power_handle, GPIO_CMD_SET_DIR_OUT, NULL);
	}
	if(gpio_ctp_reset_pin != 0xFF)
	{
		DclGPIO_Control(ctp_gpio_reset_handle, GPIO_CMD_SET_MODE_0, NULL);
		DclGPIO_Control(ctp_gpio_reset_handle, GPIO_CMD_SET_DIR_OUT, NULL);
	}
	if(ON)
	{
		wakeup = CTP_I2C_write_byte(HST_MODE_ADDR, HST_MODE_NORMAL); //toggle the controller.
		if(gpio_ctp_power_enable_pin != 0xFF)
			DclGPIO_Control(ctp_gpio_power_handle, GPIO_CMD_WRITE_HIGH, NULL);
		ctp_i2c_udelay(1000);
		if(gpio_ctp_reset_pin != 0xFF)
			DclGPIO_Control(ctp_gpio_reset_handle, GPIO_CMD_WRITE_LOW, NULL);
		ctp_i2c_udelay(10000);
		if(gpio_ctp_reset_pin != 0xFF)
			DclGPIO_Control(ctp_gpio_reset_handle, GPIO_CMD_WRITE_HIGH, NULL);
		drv_trace2(TRACE_GROUP_10, CTP_CAPACITIVE_POWER, ON, wakeup);
	}
	else
	{
		sleep = CTP_I2C_write_byte(HST_MODE_ADDR, HST_MODE_DEEP_SLEEP); //toggle the controller.
		drv_trace2(TRACE_GROUP_10, CTP_CAPACITIVE_POWER, ON, sleep);
		if(!sleep)
		{
			if(gpio_ctp_power_enable_pin != 0xFF)
				DclGPIO_Control(ctp_gpio_power_handle, GPIO_CMD_WRITE_LOW, NULL);
			drv_trace0(TRACE_GROUP_10, CTP_CAPACITIVE_POWER_DOWN);
		}
	}
	ctp_i2c_power_on(ON, CTP_I2C_LDO, 0);
}
static void VideoH264DecFreeDisp(void *ptr)
{
    if (ptr == NULL)
    {
        ASSERT(0);
        return;
    }
    if (rH264SwCtrl.pfnOutputOneFrame)
    {
        drv_trace2(TRACE_GROUP_10,OPEN_API_OUTPUTFRAME, (kal_uint32)ptr,1);
        rH264SwCtrl.pfnOutputOneFrame((kal_uint32)ptr, KAL_TRUE);
    }
}
static kal_uint8 is_equal( kal_uint8 *src , kal_uint8 *dst , kal_int32 len )
{
    kal_int32 i;
    
    for( i = 0 ; i < len ; i++ )
    {
        if ( src[i] != dst[i] )
        {
            drv_trace2( TRACE_GROUP_7, CTP_GOODIX_DWN_MEMCMP_TRACE, src[i], dst[i]);
            return 0;
        }
    }
    
    return 1;
}
void VideoH264DecSetParam(OPEN_API_PARAM_TYPE_T rType, void *pParam, kal_uint32 u4Size)
{
    if (pParam == NULL)
    {
        ASSERT(0);
        return;
    }
    drv_trace2(TRACE_GROUP_10,OPEN_API_ENTERVIDEOH264DECGETPARAM,rType,*((kal_uint32*)pParam));
    switch (rType)
    {
    case OPEN_API_PARAM_FLUSH_BUFFER_CMD:
        VideoH264DecOutputPic((kal_uint32)H264SW_OPENAPI_EOF);
        break;
    default:
        ASSERT(0);
        break;
    }
}
static void VideoH264DecOutputPic(kal_uint32 u4FlushBuffer)
{
    H264SwDecPicture rDecPic;
    kal_uint32 u4OutAddr;

    if (!rH264SwCtrl.pfnOutputOneFrame)
    {
        ASSERT(0);
        return;
    }

    while (H264SwDecNextPicture(rH264SwCtrl.prH264DecInst, &rDecPic,
                                                u4FlushBuffer) == H264SWDEC_PIC_RDY)
    {
   	kal_bool fgError = KAL_FALSE;
        drv_trace1(TRACE_GROUP_8, H264DEC_OUTPUT_IDR, rDecPic.isIdrPicture);
        if (rDecPic.isEOF) break;
        if (rH264SwCtrl.fgFrmBufferSwitch == KAL_TRUE)
        {
            if (rH264SwCtrl.fgFrmBufferCacheable == KAL_TRUE)
            {
                u4OutAddr = OpenAPIExtBufferCacheableSwitch((kal_uint32)rDecPic.pOutputPicture,
                                                                rH264SwCtrl.u4BufferSize, OPEN_API_NON_CACHEABLE);
            }
            else
            {
                u4OutAddr = OpenAPIExtBufferCacheableSwitch((kal_uint32)rDecPic.pOutputPicture,
                                                                rH264SwCtrl.u4BufferSize, OPEN_API_CACHEABLE);
            }
        }
        else
        {
            u4OutAddr = (kal_uint32)rDecPic.pOutputPicture;
        }
        if (rDecPic.nbrOfErrMBs > 0)
        {
            fgError = KAL_TRUE;
        }
        drv_trace4(TRACE_GROUP_8, H264DEC_DISPLAY_INFO, u4OutAddr, rDecPic.displayWidth, 
                            rDecPic.displayHeight, u4FlushBuffer);
        drv_trace2(TRACE_GROUP_10,OPEN_API_OUTPUTFRAME, u4OutAddr,0);
        rH264SwCtrl.pfnOutputOneFrame(u4OutAddr, fgError);
    }
}
static kal_uint8 gt818_reset( void )
{
    kal_uint8 ret = 1;
    kal_uint8 retry_count = 0;

    outbuf[0] = 1;
    outbuf[1] = 1;

    DclGPIO_Control(rst_handle, GPIO_CMD_WRITE_HIGH, NULL);
    kal_sleep_task(5);
    DclGPIO_Control(rst_handle, GPIO_CMD_WRITE_LOW, NULL);
    kal_sleep_task(5);
    DclGPIO_Control(rst_handle, GPIO_CMD_WRITE_HIGH, NULL);
    kal_sleep_task(120);

search_i2c:
    //gt818_i2c_write( guitar_i2c_address, 0x00FF, outbuf, 1 );

    //kal_sleep_task( 12 );

    gt818_i2c_read( guitar_i2c_address, 0x00FF, inbuf, 1 );

    if ( inbuf[0] != 0x55 )
    {
        drv_trace2( TRACE_GROUP_7, CTP_GOODIX_DWN_REGISTER_TRACE, 0x00FF, inbuf[0] );
        kal_sleep_task(10);
        
        if ( retry_count < 10 )
        {
            retry_count++;
            goto search_i2c;
        }
        else
        {
            ASSERT(0);
        }
    }

    drv_trace1( TRACE_GROUP_7, CTP_GOODIX_DWN_DETECT_ADDR_TRACE, guitar_i2c_address );
    kal_sleep_task(120);
    return ret;	
}
/*------------------------------------------------------------------------------

    Function name:  H264SwDecMalloc

    Purpose:
        Example implementation of H264SwDecMalloc function. Prototype of this
        function is given in H264SwDecApi.h. This implementation uses
        library function malloc for allocation of memory.

------------------------------------------------------------------------------*/
static void *VideoH264DecMalloc(unsigned int size)
{
    void *ptr = NULL;
    kal_uint32 u4Size;

    if (rH264SwCtrl.pAdmId == NULL)
    {
        ASSERT(0);
    }
    u4Size = H264_ROUND_UP_TO_POWER_OF_TWO(size, 4);

    ptr =  kal_adm_alloc(rH264SwCtrl.pAdmId, u4Size);
    if (ptr == NULL)
    {
        kal_uint32 u4LeftSize = kal_adm_get_total_left_size(rH264SwCtrl.pAdmId);
        EXT_ASSERT(0, u4LeftSize, (kal_uint32)size, 0);
    }
    drv_trace2(TRACE_GROUP_10,OPEN_API_SW_GETMEMORY,size,(kal_uint32)ptr);
    return ptr;
}
VIDEO_ENCODER_CODEC_ERROR_T MPEG4HWEncEncodeOneUnit(VIDEO_BUFFERHEADER_TYPE_T *prBufferHeader)
{
    VIDEO_ENCODER_CODEC_ERROR_T eRet = VIDEO_ENCODER_CODEC_ERROR_NONE;
//    kal_uint8* pu1Buffer;
    kal_uint8* pu1StartAddr;
    kal_uint8* pu1EndAddr;
    kal_uint8* pu1WritePtr;
    kal_uint8* pu1ReadAddr;
    kal_uint8* pu1NextWritePtr;
    kal_uint32 u4AvailLen, u4BuffLen;
    kal_uint32 u4NextAvailLen;
    kal_uint8* pu1Addr;

    ASSERT(rpMPEG4HWEncDriver);

    if(prBufferHeader)
        video_dbg_trace(VIDEO_DBG_OWNER_ENCODER, VIDEO_DBG_HWENCV2_ENCODEONEUNIT, (kal_uint32) prBufferHeader->pu1Buffer);

    if(!prBufferHeader && !rMPEG4HWEncCtrl.pu1YUV)
        return VIDEO_ENCODER_CODEC_ERROR_NONE;

    if(!mpeg4_encore_check_encoder_status() ||
       !mepg4_encore_check_bits_buffer_status())
    {
        //return VIDEO_ENCODER_CODEC_PAUSE_ENCODE; //hw in use
        ASSERT(0);
    }

    VideoEncoderAllocateBitstreamBuffer(&pu1StartAddr, &pu1EndAddr, &pu1WritePtr, &pu1ReadAddr, &u4BuffLen);
    ASSERT(KAL_FALSE == VideoCommIsExtBufferCacheable((kal_uint32)pu1StartAddr, ROUND_UP_TO_POWER_OF_TWO(u4BuffLen,CPU_CACHE_LINE_SIZE)));

    if ((kal_uint32)pu1ReadAddr <= (kal_uint32)pu1WritePtr)
    {
        u4AvailLen = (kal_uint32)pu1EndAddr - (kal_uint32)pu1WritePtr;
        pu1Addr = pu1EndAddr;
#if 0
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
#endif
    }
    else  // (u4WP < u4RP)
    {
        u4AvailLen = (kal_uint32)pu1ReadAddr - (kal_uint32)pu1WritePtr;
        pu1Addr = pu1ReadAddr;
    }
    VideoEncoderQueryBitstreamNewWP((pu1WritePtr+u4AvailLen), &pu1NextWritePtr, &u4NextAvailLen);

    if( (rMPEG4HWEncCtrl.eScenario == VIDEO_ENCODER_SCENARIO_VT && u4AvailLen <ENC_MIN_BUF_SIZE_VT) ||
        (rMPEG4HWEncCtrl.eScenario == VIDEO_ENCODER_SCENARIO_ENCODER && u4AvailLen < ENC_MAX_VOP_SIZE) )
    {
        // next free buffer is not continuous
        if (pu1NextWritePtr != pu1WritePtr+1)
        {
            VideoEncoderUpdateBitstreamWP((pu1WritePtr+u4AvailLen), 0);
        }

        VideoEncoderAllocateBitstreamBuffer(&pu1StartAddr, &pu1EndAddr, &pu1WritePtr, &pu1ReadAddr, &u4BuffLen);
        if ((kal_uint32)pu1ReadAddr <= (kal_uint32)pu1WritePtr)
        {
            u4AvailLen = (kal_uint32)pu1EndAddr - (kal_uint32)pu1WritePtr;
            pu1Addr = pu1EndAddr;
        }
        else  // (u4WP < u4RP)
        {
            u4AvailLen = (kal_uint32)pu1ReadAddr - (kal_uint32)pu1WritePtr;
            pu1Addr = pu1ReadAddr;
        }

       if( (rMPEG4HWEncCtrl.eScenario == VIDEO_ENCODER_SCENARIO_VT && u4AvailLen <ENC_MIN_BUF_SIZE_VT) ||
           (rMPEG4HWEncCtrl.eScenario == VIDEO_ENCODER_SCENARIO_ENCODER && u4AvailLen < ENC_MAX_VOP_SIZE) )
       {
            MPEG4EncCallbackEncPause(pu1StartAddr);
            drv_trace1(TRACE_GROUP_10, MPEG4HWENC_ENCODE_BUF_NOT_ENOUGH, u4AvailLen);
            return VIDEO_ENCODER_CODEC_BS_BUFFER_NOT_ENOUGH;
       }
    }

    rMPEG4HWEncCtrl.pu1Buffer = prBufferHeader->pu1Buffer;
    rMPEG4HWEncCtrl.u8TimeStamp = prBufferHeader->u8TimeStamp;
    rMPEG4HWEncCtrl.pu1YUV = 0;

    drv_trace2(TRACE_GROUP_10, MPEG4HWENC_ENCODE, (kal_uint32)(rMPEG4HWEncCtrl.pu1Buffer), rMPEG4HWEncCtrl.u8TimeStamp);

    rpMPEG4HWEncDriver->encode( rMPEG4HWEncCtrl.pu1Buffer, rMPEG4HWEncCtrl.u8TimeStamp, pu1WritePtr, pu1Addr);

    return eRet;
}
VIDEO_ENCODER_CODEC_ERROR_T MPEG4HWEncSetParameter(VIDEO_ENCODER_PARAM_TYPE_T eCmd, void *pParam)
{
    VIDEO_ENCODER_CODEC_ERROR_T eRet = VIDEO_ENCODER_CODEC_ERROR_NONE;

    ASSERT(rpMPEG4HWEncDriver);

    switch(eCmd)
    {
    case VENC_PARAM_WIDTH:
        rpMPEG4HWEncDriver->set_param(MPEG4_ENCORE_PARAM_WIDTH, pParam);
        drv_trace2(TRACE_GROUP_10, MPEG4HWENC_SET_PARAM, eCmd, *(kal_uint32*)pParam);
        break;

    case VENC_PARAM_HEIGHT:
        rpMPEG4HWEncDriver->set_param(MPEG4_ENCORE_PARAM_HEIGHT, pParam);
        drv_trace2(TRACE_GROUP_10, MPEG4HWENC_SET_PARAM, eCmd, *(kal_uint32*)pParam);
        break;

    case VENC_PARAM_BITRATE:
        rpMPEG4HWEncDriver->set_param(MPEG4_ENCORE_PARAM_BITRATE, pParam);
        drv_trace2(TRACE_GROUP_10, MPEG4HWENC_SET_PARAM, eCmd, *(kal_uint32*)pParam);
        break;

    case VENC_PARAM_FRAME_RATE:
        rMPEG4HWEncCtrl.u4FrameRate = *(kal_uint32*)(pParam);
        rpMPEG4HWEncDriver->set_param(MPEG4_ENCORE_PARAM_FRAME_RATE, pParam);
        drv_trace2(TRACE_GROUP_10, MPEG4HWENC_SET_PARAM, eCmd, *(kal_uint32*)pParam);
        break;

    case VENC_PARAM_GEN_HEADER_FRM_RATE:
        rMPEG4HWEncCtrl.u4GenHeaderFrameRate = *(kal_uint32*)(pParam);
        rpMPEG4HWEncDriver->set_param(MPEG4_ENCORE_TIME_INCREMENT, pParam);
        drv_trace2(TRACE_GROUP_10, MPEG4HWENC_SET_PARAM, eCmd, *(kal_uint32*)pParam);
        break;

    case VENC_PARAM_SYNC_INTERVAL:
        if(!*(kal_uint32*)(pParam))
            *(kal_uint32*)(pParam) = ENC_DEFAULT_INTRA_PERIOD;
        rpMPEG4HWEncDriver->set_param(MPEG4_ENCORE_SYNC_INTERVAL, pParam);
        drv_trace2(TRACE_GROUP_10, MPEG4HWENC_SET_PARAM, eCmd, *(kal_uint32*)pParam);
        break;

    case VENC_PARAM_MAX_PKG_SIZE:
        rMPEG4HWEncCtrl.u4MaxPktSize = *(kal_uint32*)(pParam);
        rpMPEG4HWEncDriver->set_param(MPEG4_ENCORE_PARAM_MAX_PKG_SIZE, pParam);
        drv_trace2(TRACE_GROUP_10, MPEG4HWENC_SET_PARAM, eCmd, *(kal_uint32*)pParam);
        break;

    case VENC_PARAM_SHORT_HEADER:
        rpMPEG4HWEncDriver->set_param(MPEG4_ENCORE_PARAM_SHORT_HEADER, pParam);
        drv_trace2(TRACE_GROUP_10, MPEG4HWENC_SET_PARAM, eCmd, *(kal_bool*)pParam);
        break;

    case VENC_PARAM_FORCE_ENCODE_I:
        rpMPEG4HWEncDriver->set_param(MPEG4_ENCORE_FORCE_ENCODE_I, pParam);
        drv_trace2(TRACE_GROUP_10, MPEG4HWENC_SET_PARAM, eCmd, *(kal_uint32*)pParam);
        break;

    case VENC_PARAM_QUALITY:
        rMPEG4HWEncCtrl.eQuality = *(VIDEO_ENCODER_QUALITY_T*)(pParam);
        drv_trace2(TRACE_GROUP_10, MPEG4HWENC_SET_PARAM_QUALITY, eCmd, rMPEG4HWEncCtrl.eQuality);
        break;

    case VENC_PARAM_SCENARIO:
        {
        MPEG4_ENCORE_SCENARIO eScenario;
        rMPEG4HWEncCtrl.eScenario = *(VIDEO_ENCODER_SCENARIO_T*)(pParam);
        drv_trace2(TRACE_GROUP_10, MPEG4HWENC_SET_PARAM_SCENARIO, eCmd, rMPEG4HWEncCtrl.eScenario);
        switch(rMPEG4HWEncCtrl.eScenario)
        {
        case VIDEO_ENCODER_SCENARIO_ENCODER:
            eScenario = MPEG4_ENCORE_SCENARIO_REC;
            rpMPEG4HWEncDriver->set_param(MPEG4_ENCORE_PARAM_SCENARIO, (void *)&eScenario);
            break;

        case VIDEO_ENCODER_SCENARIO_VT:
            eScenario = MPEG4_ENCORE_SCENARIO_VT;
            rpMPEG4HWEncDriver->set_param(MPEG4_ENCORE_PARAM_SCENARIO, (void *)&eScenario);
            break;

        default:
            ASSERT(0);
            break;
        }
        break;
        }

    case VENC_PARAM_CODEC_TYPE:
	{
	kal_bool fgShortHeader = KAL_FALSE;			
        rMPEG4HWEncCtrl.eCodecType = *(VIDEO_ENCODER_CODEC_T*)(pParam);
	if(rMPEG4HWEncCtrl.eCodecType == ENCODER_CODEC_TYPE_H263)
	{
            fgShortHeader = KAL_TRUE;
	}
	else if(rMPEG4HWEncCtrl.eCodecType == ENCODER_CODEC_TYPE_MPEG4)
	{

	}
	else
	{
		    ASSERT(0);
	}		
        rpMPEG4HWEncDriver->set_param(MPEG4_ENCORE_PARAM_SHORT_HEADER, &fgShortHeader);						
			
        drv_trace2(TRACE_GROUP_10, MPEG4HWENC_SET_PARAM_CODEC_TYPE, eCmd, rMPEG4HWEncCtrl.eCodecType);
        break;
    	}

    case VENC_PARAM_ROTATE:
        eRet = VIDEO_ENCODER_CODEC_PARAM_NOT_SUPPORT;
        break;

#if 1
    case VENC_PARAM_SET_CALLBACK:
        {
        VIDEO_ENCODER_ADAPT_CALLBACK_T* prCallbacks = (VIDEO_ENCODER_ADAPT_CALLBACK_T*)(pParam);
        ASSERT(prCallbacks->pfnReleaseFrame);
        ASSERT(prCallbacks->pfnEncoderPaused);
        ASSERT(prCallbacks->pfnGenBitstream);
        rMPEG4HWEncCtrl.pfYUVDone  = prCallbacks->pfnReleaseFrame;
        rMPEG4HWEncCtrl.pfEncPause = prCallbacks->pfnEncoderPaused;
        rMPEG4HWEncCtrl.pfBITSDone = prCallbacks->pfnGenBitstream;
        drv_trace2(TRACE_GROUP_10, MPEG4HWENC_SET_PARAM, eCmd, 1);
        }
        break;
#else
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
#endif

    default:
        eRet = VIDEO_ENCODER_CODEC_PARAM_NOT_SUPPORT;
        break;
    }

    return eRet;
}
VIDEO_ENCODER_CODEC_ERROR_T MPEG4HWEncGetParameter(VIDEO_ENCODER_PARAM_TYPE_T eCmd, void* pParam)
{
    VIDEO_ENCODER_CODEC_ERROR_T eRet = VIDEO_ENCODER_CODEC_ERROR_NONE;
    VIDEO_ENC_MEMORY_T *prMemorySize;

    switch(eCmd)
    {
    case VENC_PARAM_MEMORY_REQUIREMENT:
        prMemorySize = (VIDEO_ENC_MEMORY_T*)pParam;
        switch(rMPEG4HWEncCtrl.eScenario)
        {
        case VIDEO_ENCODER_SCENARIO_ENCODER:
            prMemorySize->u4ExternalSize = ENC_MAX_EXT_MEMORY(ENC_MAX_FRAME_WIDTH, ENC_MAX_FRAME_HEIGHT) + ENC_MAX_RESUME_BUFFER_SIZE + CPU_CACHE_LINE_SIZE_MINE;
            prMemorySize->u4InternalSize = ENC_MAX_INT_MEMORY(ENC_MAX_FRAME_WIDTH, ENC_MAX_FRAME_HEIGHT);
            break;

        case VIDEO_ENCODER_SCENARIO_VT:
            prMemorySize->u4ExternalSize = ENC_MAX_EXT_MEMORY(ENC_MAX_FRAME_WIDTH_VT, ENC_MAX_FRAME_HEIGHT_VT) + ENC_MAX_RESUME_BUFFER_SIZE_VT + CPU_CACHE_LINE_SIZE_MINE;
            prMemorySize->u4InternalSize = ENC_MAX_INT_MEMORY(ENC_MAX_FRAME_WIDTH_VT, ENC_MAX_FRAME_HEIGHT_VT);
            break;

        default:
            ASSERT(0);
            break;
        }
        break;

    case VENC_PARAM_BITSTREAM_IN_CACHE:
        *(kal_bool*)pParam = KAL_FALSE;
        break;

    case VENC_PARAM_FRM_BUFFER_ALIGNMENT:
        *(kal_uint32*)pParam = ENC_YUV_BUFFER_ALIGNED_BYTES;
        break;

    case VENC_PARAM_HOLD_RES_TILL_RELEASE_FRM:
        switch(rMPEG4HWEncCtrl.eScenario)
        {
        case VIDEO_ENCODER_SCENARIO_ENCODER:
            *(kal_bool*)pParam = KAL_FALSE;
            break;
        case VIDEO_ENCODER_SCENARIO_VT:
            *(kal_bool*)pParam = KAL_TRUE;
            break;

        default:
            ASSERT(0);
            break;

        }
        break;

    case VENC_PARAM_IS_BLOCKBASED_YUV:
        *(kal_bool*)pParam = KAL_TRUE;
        break;

    default:
        //ASSERT(0);
        eRet = VIDEO_ENCODER_CODEC_PARAM_NOT_SUPPORT;
        break;
    }

    drv_trace2(TRACE_GROUP_10, MPEG4HWENC_GET_PARAM, eCmd, *(kal_uint32*)pParam);

    return eRet;
}
示例#11
0
/*
* FUNCTION
*	   bmt_charge_start
*
* DESCRIPTION                                                           
*   	This function is to start charging algorithm.
*
* CALLS  
*
* PARAMETERS
*	   None
*	
* RETURNS
*	   None
*
* GLOBALS AFFECTED
*     None
*/
void bmt_charge_start(void)
{
#if defined(__EVB__) && defined(__MTK_INTERNAL__)
/* under construction !*/
#elif defined(__DRV_BMT_NO_CHARGING__)
   return;
#else //#if defined(__EVB__)
  
#if defined(__DRV_BMT_PRECHARGE_TO_FULL_DIRECTLY__)
	double adc;
#endif //#if defined(__DRV_BMT_PRECHARGE_TO_FULL_DIRECTLY__)
    DCL_STATUS adc_status;
	ADC_CTRL_MODIFY_PARAM_T adc_para;   
#if defined(MT6236) || defined(MT6252)
   
  	PMU_CTRL_CHR_SET_CHR_CURRENT set_chr_current;
#endif

//#ifdef __DRV_BMT_SW_POLLING_CHARGER_OV__
//	kal_set_timer(bmt_sw_polling_timerId, (kal_timer_func_ptr)bmt_sw_polling_ov, NULL,43 ,	0);
//#endif //#ifdef __DRV_BMT_SW_POLLING_CHARGER_OV__


   BMT_Charge(KAL_FALSE);
   BMT.pmictrl_state = PMIC_CHARGEOFF;
#if defined(__DRV_BMT_PRECHARGE_TO_FULL_DIRECTLY__)
	if(g_battery_pre_voltage == 0)
	  BMT_Current_Voltage(DCL_VBAT_ADC_CHANNEL, &g_battery_pre_voltage,&adc);
	BMT.bat_state = CHR_PRE_FULL_CHECK;
#else //defined(__DRV_BMT_PRECHARGE_TO_FULL_DIRECTLY__)
   BMT.bat_state = CHR_PRE;
#endif //defined(__DRV_BMT_PRECHARGE_TO_FULL_DIRECTLY__)
   BMT.VBAT_UEM= VBAT_UEM_CHR_IN_FISRT;
   low_charger_count = 0;
   low_current_count = 0;
   low_temper_count = 0;
   over_temper_count = 0;
#if defined(DRV_BMT_HW_PRECC_WORKAROUND)
    SW_Workaround_Flag = KAL_TRUE;
    HW_Plug_Status = bmt_chr_uninit; 
    Manual_Disable_Charge_Flag = KAL_FALSE;
#endif
#if defined(DRV_BMT_HIGH_VCHG_ADAPTIVE_CHARGE_CURRENT_SUPPORT)
   First_Time_Charge_Enable = KAL_TRUE;
   bmt_high_vchg_current = 0xFFFFFFF;
   Pre_VCharge_AVG = 0;
   Cur_VCharge_MAX = 0;
#endif

   
	bmt_enable_sleepmode(KAL_FALSE);

 //  #ifdef MTK_SLEEP_ENABLE
 //  L1SM_SleepDisable(bmt_sm_handle);
 //  #endif
		

      adc_para.u4Period = 1;
	  adc_para.u1EvaluateCount = 1;
	  adc_status = DclSADC_Control(bmt_adc_handle, ADC_CMD_MODIFY_PARAM, (DCL_CTRL_DATA_T *)&adc_para);
	  if(adc_status != STATUS_OK)
	  {
			ASSERT(0);
	  }   	
	 
	  adc_status = DclSADC_Control(bmt_adc_handle, ADC_CMD_START_MEASURE, NULL);
	  if(adc_status != STATUS_OK)
	  {
			ASSERT(0);  		
	  }	      
	
#ifdef __BMT_CHARGE_GUARD_TIME__
	bmt_set_guardtimer(KAL_TICKS_1_MIN*BMT_CHARGE_GUARD_TIME_PERIOD);
	drv_trace2(TRACE_GROUP_10, BMT_SAFETY_AND_GUARD_TIMER_START_TRC, BMT_TOTAL_CHARGE_TIME, BMT_CHARGE_GUARD_TIME_PERIOD);
#else // __BMT_CHARGE_GUARD_TIME__

#if defined(DRV_BMT_HIGH_VCHG_ADAPTIVE_CHARGE_CURRENT_SUPPORT)
    bmt_safety_timer_config = KAL_FALSE;
#else
	stack_start_timer(&ChargeTimeout_timer, 0, KAL_TICKS_1_MIN*BMT_TOTAL_CHARGE_TIME);
	drv_trace1(TRACE_GROUP_10, BMT_SAFETY_TIMER_START_TRC, BMT_TOTAL_CHARGE_TIME);
	SaftyTimer_Flag = BMT_SAFETY_TIMER_ON; 
#endif //#if defined(DRV_BMT_HIGH_VCHG_ADAPTIVE_CHARGE_CURRENT_SUPPORT)

#endif // __BMT_CHARGE_GUARD_TIME__
	
   

#if defined(MT6236)  || defined(MT6252)
    
    set_chr_current.current = PMU_CHARGE_CURRENT_200_00_MA; // Pre-CC 200mA
    DclPMU_Control(bmt_PmuHandler, CHR_SET_CHR_CURRENT, (DCL_CTRL_DATA_T *)&set_chr_current);
                  
#else   
   bmt_set_chr_current();
#endif
   
   #if defined(PMIC_CHARGE_WDT)  // Defined in pmic_features.h
   bmt_charge_enable_wdt(KAL_TRUE);
   #endif // #if defined(PMIC_CHARGE_WDT)
   
   drv_trace0(TRACE_GROUP_10, BMT_CHARGING_START_TRC);
#endif//#if defined(__EVB__)
}
void VideoH264DecGetParam(OPEN_API_PARAM_TYPE_T rType, void *pParam, kal_uint32 u4Size)
{
    H264SwDecInfo rDecInfo;
    H264SwDecCapability rDecCap;
    kal_uint32 *pu4Param;
    OPEN_API_MEM_INFO_T *prMemInfo;

    if (pParam == NULL)
    {
        ASSERT(0);
        return;
    }

    switch(rType)
    {
    case OPEN_API_PARAM_WIDTH:
        if ((u4Size != sizeof(kal_uint32)) || (!rH264SwCtrl.fgIsCodecInit))
        {
            ASSERT(0);
        }
        pu4Param = (kal_uint32 *)pParam;
        ASSERT(pu4Param);
        if (rH264SwCtrl.u2FrameWidth)
        {
            *pu4Param = (kal_uint32)rH264SwCtrl.u2FrameWidth;
        }
        else
        {
            if (H264SwDecGetInfo(rH264SwCtrl.prH264DecInst, &rDecInfo) != H264SWDEC_OK)
            {
                drv_trace1(TRACE_GROUP_8, H264DEC_ARGUMENT_ERROR, __LINE__);
                ASSERT(0);   
                *pu4Param = 0;
            }
            *pu4Param = rDecInfo.picWidth;        
        }
        break;
    case OPEN_API_PARAM_HEIGHT:
        if ((u4Size != sizeof(kal_uint32)) || (!rH264SwCtrl.fgIsCodecInit))
        {
            ASSERT(0);
        }
        pu4Param = (kal_uint32 *)pParam;
        ASSERT(pu4Param);
        if (rH264SwCtrl.u2FrameHeight)
        {
            *pu4Param = (kal_uint32)rH264SwCtrl.u2FrameHeight;
        }
        else
        {
            if (H264SwDecGetInfo(rH264SwCtrl.prH264DecInst, &rDecInfo) != H264SWDEC_OK)
            {
                drv_trace1(TRACE_GROUP_8, H264DEC_ARGUMENT_ERROR, __LINE__);
                ASSERT(0);                
                *pu4Param = 0;
            }
            *pu4Param = rDecInfo.picHeight;
        }
        break;
    case OPEN_API_PARAM_REAL_WIDTH:
        if ((u4Size != sizeof(kal_uint32)) || (!rH264SwCtrl.fgIsCodecInit))
        {
            ASSERT(0);
        }
        pu4Param = (kal_uint32 *)pParam;
        ASSERT(pu4Param);
        *pu4Param = (rH264SwCtrl.fgCropping) ? (kal_uint32)rH264SwCtrl.u2RealWidth:
                                                                    (kal_uint32)rH264SwCtrl.u2FrameWidth;
        break;
    case OPEN_API_PARAM_REAL_HEIGHT:
        if ((u4Size != sizeof(kal_uint32)) || (!rH264SwCtrl.fgIsCodecInit))
        {
            ASSERT(0);
        }
        pu4Param = (kal_uint32 *)pParam;
        ASSERT(pu4Param);
        *pu4Param = (rH264SwCtrl.fgCropping) ? (kal_uint32)rH264SwCtrl.u2RealHeight :
                                                                    (kal_uint32)rH264SwCtrl.u2FrameHeight;
        break;
    case OPEN_API_PARAM_MEM_INFO:
        if (H264SWDEC_OK != H264SwDecQueryCapability(&rDecCap, H264SW_QVGA))
        {
            ASSERT(0);       
        }
        
        if (u4Size != sizeof(OPEN_API_MEM_INFO_T))
        {
            ASSERT(0);
        }
        prMemInfo = (OPEN_API_MEM_INFO_T *)pParam;
        ASSERT(prMemInfo);
#if defined(DRV_FEATURE__MM_INTMEM_IF)        
        prMemInfo->u4IntMemSize = 0;
#else
        prMemInfo->u4IntMemSize = rDecCap.intMemSize;
#endif
        prMemInfo->u4ExtMemSize = rDecCap.extMemSize;
        prMemInfo->fgExtCacheable = KAL_TRUE;
        break;
    default:
        ASSERT(0);
        break;
    }
    drv_trace2(TRACE_GROUP_10,OPEN_API_ENTERVIDEOH264DECGETPARAM,rType,*((kal_uint32*)pu4Param));
}
H264_DECODE_STATUS_CODE_T VideoH264DecNALu(VIDEO_DECODE_PARAM_T *prParam)
{
    H264SwDecInput rDecInput;
    H264SwDecOutput rDecOutput;
    H264SwDecReturnBs rBsInfo;
    H264SwDecInfo rDecInfo;
    H264SwDecRet rDecResult = H264SWDEC_OK;
    kal_bool fgNotSupport = KAL_FALSE;
    //kal_bool fgCurBsBufferCacheable;
    kal_bool fgAgain = KAL_FALSE;
    kal_bool fgCurrentBsCacheable = KAL_FALSE;

    if ((prParam == NULL) || (!rH264SwCtrl.fgIsCodecInit))
    {
        drv_trace1(TRACE_GROUP_8, H264DEC_ARGUMENT_ERROR, __LINE__);
        ASSERT(0);
        return H264_STATUS_ERROR;
    }
    

    if (prParam->u4AddrOfNALu == 0)
    {
        drv_trace1(TRACE_GROUP_8, H264DEC_ARGUMENT_ERROR, __LINE__);
        ASSERT(0);
        return H264_STATUS_ERROR;        
    }

    drv_trace4(TRACE_GROUP_10,OPEN_API_ENTERVIDEOH264DECNALU, prParam->u4AddrOfNALu,prParam->u4LengthOfNALu,
        ((*((kal_uint8*)prParam->u4AddrOfNALu))>>5)&0x3,(*((kal_uint8*)prParam->u4AddrOfNALu))&0x1F);
    
    fgCurrentBsCacheable = OpenAPIIsExtBufferCacheable(prParam->u4AddrOfNALu, prParam->u4LengthOfNALu);

    if (fgCurrentBsCacheable)
    {
        //ASSERT(0);
        //return H264_STATUS_ERROR;
        if (rH264SwCtrl.fgBsBufferCacheable)
        {
            rDecInput.pStream = (u8 *)prParam->u4AddrOfNALu;
        }
        else
        {
            rDecInput.pStream = (u8 *)OpenAPIExtBufferCacheableSwitchAlignMemory((kal_uint32)prParam->u4AddrOfNALu,
                prParam->u4LengthOfNALu, OPEN_API_NON_CACHEABLE);
        }            
    }
    else
    {
        if (rH264SwCtrl.fgBsBufferCacheable)
        {
            rDecInput.pStream = (u8 *)OpenAPIExtBufferCacheableSwitchAlignMemory((kal_uint32)prParam->u4AddrOfNALu,
                                                                                                        prParam->u4LengthOfNALu, OPEN_API_CACHEABLE);
        }
        else
        {
            rDecInput.pStream = (u8 *)prParam->u4AddrOfNALu;
        }
    }

    rBsInfo.pBsAddr = (u8 *)prParam->u4AddrOfNALu;
    rBsInfo.BsTotalLen = prParam->u4LengthOfNALu;
    rBsInfo.NaluCnt = 1;
    rBsInfo.totalNalu = 1;
    rDecInput.dataLen = prParam->u4LengthOfNALu;
    rDecInput.pBsBuffer = &rBsInfo;

    /* decode one decoding unit */
    do
    {
        rDecResult = H264SwDecDecode(rH264SwCtrl.prH264DecInst, &rDecInput, &rDecOutput);
        drv_trace2(TRACE_GROUP_8, H264DEC_DECODE_RESULT, rDecResult, rDecInput.dataLen);
        VideoH264DecOutputPic(0);
        switch(rDecResult)
        {
        case H264SWDEC_PIC_RDY_BUFF_NOT_EMPTY:            
            //decoding a frame, but buffer is too long, or below
            if (rDecOutput.pStrmCurrPos == rDecInput.pStream)
            {
                //only flush pic after change sps; need decoding next slice
                fgAgain = KAL_TRUE;
                break;
            }
            // do not break for the following action
        case H264SWDEC_PIC_RDY:
            //output pic            
            return H264_STATUS_DECODE_OK;
        case H264SWDEC_HDRS_RDY_BUFF_NOT_EMPTY:
            if (H264SwDecGetInfo(rH264SwCtrl.prH264DecInst, &rDecInfo) != H264SWDEC_OK)
            {
                drv_trace1(TRACE_GROUP_8, H264DEC_ARGUMENT_ERROR, __LINE__);
                ASSERT(0);
                return H264_STATUS_ERROR;
            }
            drv_trace4(TRACE_GROUP_8, H264DEC_BITSTREAM_INFO, rDecInfo.picWidth, rDecInfo.picHeight,
                             rDecInfo.maxDpb, rDecInfo.profile);

            //we do not support to change resolution
            if (((rDecInfo.picWidth != rH264SwCtrl.u2FrameWidth) && rH264SwCtrl.u2FrameWidth)
                || ((rDecInfo.picHeight != rH264SwCtrl.u2FrameHeight) && rH264SwCtrl.u2FrameHeight))
            {
                drv_trace0(TRACE_GROUP_8, H264DEC_SUPPORT_ERROR);
                fgNotSupport = KAL_TRUE;
            }

            if (fgNotSupport)
            {
                drv_trace0(TRACE_GROUP_8, H264DEC_SUPPORT_ERROR);
               H264SwDecReturnBitstream(&rBsInfo);
               return H264_STATUS_ERROR;
            }
            drv_trace0(TRACE_GROUP_8, H264DEC_CHANGE_SPS);
            rH264SwCtrl.u2FrameHeight = (kal_uint16)rDecInfo.picHeight;
            rH264SwCtrl.u2FrameWidth = (kal_uint16)rDecInfo.picWidth;
            rH264SwCtrl.u4BufferSize = (((kal_uint32)rH264SwCtrl.u2FrameHeight *
                                                    (kal_uint32)rH264SwCtrl.u2FrameWidth) *3) >> 1;
            rH264SwCtrl.fgCropping = (rDecInfo.croppingFlag == 0) ? KAL_FALSE : KAL_TRUE;
            rH264SwCtrl.u2RealHeight = (kal_uint16)rDecInfo.cropParams.cropOutHeight;
            rH264SwCtrl.u2RealWidth = (kal_uint16)rDecInfo.cropParams.cropOutWidth;
            fgAgain = KAL_TRUE;
            break;
        case H264SWDEC_STRM_PROCESSED:
            return H264_STATUS_OK;
        case H264SWDEC_PARAM_ERR:
            drv_trace1(TRACE_GROUP_8, H264DEC_ARGUMENT_ERROR, __LINE__);
            ASSERT(0);
            return H264_STATUS_ERROR;
        case H264SWDEC_PARAMSET_ERROR:
            return H264_STATUS_SPS_ERROR;
        case H264SWDEC_STRM_ERR:
            fgAgain = KAL_FALSE;
            //return H264_STATUS_DECODE_ERROR;
            break;
        default:
            drv_trace0(TRACE_GROUP_8, H264DEC_DECODE_ERROR);
            return H264_STATUS_ERROR;
        }
    }while(fgAgain == KAL_TRUE);

    //ASSERT(0);

    return H264_STATUS_OK;
}
VIDEO_DECODER_CODEC_ERROR_T H264HwDecoderStartAdapt(VIDEO_BUFFERHEADER_TYPE_T *prBufferHeader)
{    
    VIDEO_DECODER_CODEC_ERROR_T rRet = VIDEO_DECODER_CODEC_ERROR_NONE;    
    H264_DECODER_INPUT_PARAM_T *prInputParam;
    H264_DECODER_PAYLOAD_INFO_T *prPayload;
    kal_uint32 u4PayloadCnt = 0;
    //kal_bool fgNotSupport = KAL_FALSE;
    kal_bool fgCurBsBufferCacheable;
    H264_DECODE_STATUS_CODE_T eResult = H264_STATUS_OK;
    VIDEO_DECODE_PARAM_T rDecParam;
    H264_HW_DEC_RETURN_BS_T *prReturnBs = NULL;
    kal_uint32 u4Addr, u4Length;
    kal_uint32 u4Width, u4Height, u4RealWidth, u4RealHeight;
    kal_uint16 Idx;

    if (prBufferHeader == NULL)
    {
        drv_trace1(TRACE_GROUP_8, H264HWDEC_ARGUMENT_ERROR, __LINE__);
        ASSERT(0);

        return VIDEO_DECODER_CODEC_ERROR;
    }
    
    prInputParam = (H264_DECODER_INPUT_PARAM_T *)prBufferHeader->pPrivateData;

    if ((prInputParam == NULL) || (prBufferHeader->pu1Buffer == NULL) || (prBufferHeader->u4BuffSize == 0))
    {
        drv_trace1(TRACE_GROUP_8, H264HWDEC_ARGUMENT_ERROR, __LINE__);
        ASSERT(0);

        return VIDEO_DECODER_CODEC_ERROR;
    }

    prPayload = prInputParam->pu1PayloadAddress;
    if ((prPayload == NULL) || (prInputParam->u4PayloadNumber == 0))
    {
        drv_trace1(TRACE_GROUP_8, H264HWDEC_ARGUMENT_ERROR, __LINE__);
        ASSERT(0);

        return VIDEO_DECODER_CODEC_ERROR;
    }

    drv_trace1(TRACE_GROUP_8, H264HWDEC_PAYLOAD_INFO, prInputParam->u4PayloadNumber);

    if ((prPayload[0].u4Length != 0) && (prPayload[0].u4Length <= prBufferHeader->u4BuffSize))
    {
        fgCurBsBufferCacheable = VideoCommIsExtBufferCacheable(prPayload[0].u4Address, prPayload[0].u4Length);
    }
    else
    {
        fgCurBsBufferCacheable = rH264HwDecCtrl.fgBsBufferCacheable;
    }

    for (Idx = 0; Idx < H264_HW_RETURN_BS_NUM; Idx++)
    {
        if (rH264HwReturnBs[Idx].fgUsed == KAL_FALSE)
        {
            rH264HwReturnBs[Idx].fgUsed = KAL_TRUE;
            prReturnBs = &rH264HwReturnBs[Idx];
            prReturnBs->BsTotalLen = prBufferHeader->u4BuffSize;
            prReturnBs->pBsAddr = prBufferHeader->pu1Buffer;
            //prReturnBs.totalNalu = prInputParam->u4PayloadNumber;            
            break;
        }
    }
    if (Idx == H264_HW_RETURN_BS_NUM)
    {
        ASSERT(0);
        return VIDEO_DECODER_CODEC_ERROR;
    }

    rH264HwDecCtrl.u2GetPicInOneTrigger = 0;

    do
    {   

        u4Addr = prPayload[u4PayloadCnt].u4Address;
        u4Length = prPayload[u4PayloadCnt].u4Length;        
        if ((u4Length > prBufferHeader->u4BuffSize) || (u4Length == 0))
        {
            drv_trace2(TRACE_GROUP_8, H264HWDEC_ABNORMAL_NALU_SIZE, u4Length, prBufferHeader->u4BuffSize);
            if (u4Length > prBufferHeader->u4BuffSize)
            {
                u4Length = 0;          //huge nalu size, error bitstream, don't decoding, only count nalu num
            }
        }            
        
        if (rH264HwDecCtrl.fgBsBufferCacheable)
        {
            if ((fgCurBsBufferCacheable == KAL_FALSE) && (u4Length != 0))
            {
                u4Addr = VideoCommExtBufferCacheableSwitchAlignMemory(u4Addr , u4Length, VIDEO_CACHEABLE);
            }
        }
        else
        {
            if ((fgCurBsBufferCacheable == KAL_TRUE) && (u4Length != 0))
            {
                u4Addr = VideoCommExtBufferCacheableSwitchAlignMemory(u4Addr , u4Length, VIDEO_NON_CACHEABLE);
            }
        }

        //rReturnBs.NaluCnt = u4PayloadCnt + 1;        
        rDecParam.u4AddrOfNALu = u4Addr;
        rDecParam.u4LengthOfNALu = u4Length;
        rDecParam.pReseved = (void *)prReturnBs;
        
        /* decode one decoding unit */
        eResult = VideoH264DecNALu(&rDecParam);
        drv_trace2(TRACE_GROUP_8, H264HWDEC_DECODE_RESULT, eResult, u4Length);

        switch(eResult)
        {
        case H264_STATUS_OK:
        case H264_STATUS_DECODE_OK:
            if ((!rH264HwDecCtrl.u2FrameWidth) && (!rH264HwDecCtrl.u2FrameHeight))
            {
                H264_DECODER_CUSTOM_SETTING_T rCustomSetting;
                VideoH264DecGetParam(OPEN_API_PARAM_WIDTH, &u4Width, sizeof(kal_uint32));
                VideoH264DecGetParam(OPEN_API_PARAM_HEIGHT, &u4Height, sizeof(kal_uint32));
                VideoH264DecGetParam(OPEN_API_PARAM_REAL_WIDTH, &u4RealWidth, sizeof(kal_uint32));
                VideoH264DecGetParam(OPEN_API_PARAM_REAL_HEIGHT, &u4RealHeight, sizeof(kal_uint32));
                rH264HwDecCtrl.u2FrameHeight = (kal_uint16)u4Height;
                rH264HwDecCtrl.u2FrameWidth = (kal_uint16)u4Width;
                rH264HwDecCtrl.u4BufferSize = ((u4Width * u4Height) *3) >> 1;    
                VideoDecoderGetCustomSetting(&rCustomSetting);

                if ((rH264HwDecCtrl.u2FrameHeight > rCustomSetting.u4MaxHeight) || 
                    (rH264HwDecCtrl.u2FrameWidth > rCustomSetting.u4MaxWidth))
                {
                    H264HwDecoderReturnBitstream((kal_uint32)prReturnBs);
                    
                    return VIDEO_DECODER_CODEC_ERROR_NOT_SUPPORT;
                }
                /* Error handle */
                if (u4Width == 0 || u4Height == 0)
                {
                    return VIDEO_DECODER_CODEC_ERROR_NOT_SUPPORT;
                }
                
                //First slice, set yuv buffer
                VideoDecoderSetYUVBuffer(&u4Width, &u4Height, 4, 0, 0);

                if ((u4Width != u4RealWidth) || (u4Height != u4RealHeight))
                {
                    rH264HwDecCtrl.fgCropping = KAL_TRUE;
                }
                else
                {
                    rH264HwDecCtrl.fgCropping = KAL_FALSE;
                }
            }
            u4PayloadCnt++;
            break;        
        case H264_STATUS_SPS_ERROR:
        case H264_STATUS_PPS_ERROR:
            drv_trace1(TRACE_GROUP_8, H264HWDEC_HEADER_ERROR, __LINE__);       
            H264HwDecoderReturnBitstream((kal_uint32)prReturnBs);
            return VIDEO_DECODER_CODEC_ERROR_NOT_SUPPORT;
        case H264_STATUS_ERROR:
        case H264_STATUS_DECODE_ERROR:
        default:
            drv_trace0(TRACE_GROUP_8, H264HWDEC_DECODE_ERROR);
            VIDEO_WARNING(VIDEO_DBG_OWNER_DECODER);
            u4PayloadCnt++;
            break;
        }       
    }while(u4PayloadCnt < prInputParam->u4PayloadNumber);

    //Send a AU boundary to trigger current frame decoding
    rDecParam.u4AddrOfNALu = (kal_uint32)_au1H264DummyDelimiter;
    rDecParam.u4LengthOfNALu = H264_HW_DUMMY_DELIMITER_LENGTH;
    rDecParam.pReseved = NULL;        
    eResult = VideoH264DecNALu(&rDecParam);
    //FIXME: in unsync mode, it can't return bitstream here!!!
    //H264HwDecoderReturnBitstream((kal_uint32)&rReturnBs);

    return rRet;
}
static kal_uint8 gt818_update_firmware( kal_uint8 *nvram, kal_uint16 length )
{
    kal_uint8 ret,err,retry_time;
    kal_uint16 cur_code_addr;
    kal_uint16 cur_frame_num, total_frame_num;
	
    if( length > TPD_NVRAM_LEN - NVRAM_BOOT_SECTOR_LEN )
    {
        drv_trace2( TRACE_GROUP_7, CTP_GOODIX_DWN_CHECK_IMAGE_SIZE_TRACE, length, TPD_NVRAM_LEN - NVRAM_BOOT_SECTOR_LEN );
        downloader_errno = 1;
        return 0;
    }
    	  
    retry_time = 5;
             
    CTP_DWN_DEBUG_LINE_TRACE();
    do
    {
        err = 0;

        //ret = gt818_i2c_write( guitar_i2c_address, NVRAM_UPDATE_START_ADDR, nvram, length );
        ret = gt818_i2c_write( guitar_i2c_address, NVRAM_UPDATE_START_ADDR, nvram, length );	

        if ( ret == 0 )
        {
            CTP_DWN_DEBUG_LINE_TRACE();
            err = 1;
        }
			
    } while ( err == 1 && (--retry_time) > 0 );
    //} while ( 1 );        		        

    if( err == 1 )
    {
        downloader_errno = 2;
        CTP_DWN_DEBUG_LINE_TRACE();
        return 0;
    }
    
#if 0
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
#else

    total_frame_num = length;

    for ( cur_frame_num = 0 ; cur_frame_num < total_frame_num ; cur_frame_num++ )        // read out all the code
    {

        cur_code_addr = NVRAM_UPDATE_START_ADDR + cur_frame_num;
        retry_time=5;
   
        do
        {
            err = 0;
            ret = gt818_i2c_read( guitar_i2c_address, cur_code_addr, inbuf, 1);
        
            if ( ret == 0 )
            {
                err = 1;
            }
        
            if( is_equal( &nvram[cur_frame_num], inbuf, 1 ) == 0 )
            {
                err = 1;
            }
        } while ( err == 1 && (--retry_time) > 0 );
    
        if( err == 1 )
        {
            break;
        }    
    }

#endif
    CTP_DWN_DEBUG_LINE_TRACE();
    
    if( err == 1 )
    {
        downloader_errno = 3;
        CTP_DWN_DEBUG_LINE_TRACE();
        return 0;
    }

    ret = gt818_nvram_store();
    
    kal_sleep_task( 5 );

    if( ret == 0 )
    {
        downloader_errno = 4;
        CTP_DWN_DEBUG_LINE_TRACE();
        return 0;
    }
    
    ret = gt818_nvram_recall();

    kal_sleep_task( 5 );
    
    if( ret == 0 )
    {
        downloader_errno = 5;
        CTP_DWN_DEBUG_LINE_TRACE();
        return 0;
    }

    return 1;
}
static kal_int32 gt818_downloader_probe( kal_uint16 cur_ver, kal_uint8 *firmware_ptr )
{
	  //TODO: process file
    //struct file *fp;
    kal_uint32 rlen;	
    kal_uint16 length;
    kal_uint16 retry = 0;
    FS_HANDLE handle;
    int ret = 0;
    ctp_firmware_info_t *fw_info = (ctp_firmware_info_t *)firmware_ptr;    
    unsigned char *data_ptr = &(fw_info->data);
    kal_wchar   CTP_FIRMWARE_PATH[64];
    kal_int16   drv_letter;
    kal_bool    delete_firmware = KAL_FALSE;
    
    CTP_DWN_DEBUG_LINE_TRACE();
    
    length = 0;

    drv_letter = FS_GetDrive(FS_DRIVE_V_NORMAL, 2, FS_DRIVE_I_SYSTEM | FS_DRIVE_V_NORMAL); // phone memory
    kal_wsprintf( CTP_FIRMWARE_PATH, "%c:\\%s", drv_letter, GT818_FW_STRING );
    ret = FS_CheckFile(CTP_FIRMWARE_PATH);
    if(ret < 0)
    {
        drv_letter = FS_GetDrive( FS_DRIVE_V_REMOVABLE, 1, FS_NO_ALT_DRIVE );  //SD Card
        kal_wsprintf( CTP_FIRMWARE_PATH, "%c:\\%s", drv_letter, GT818_FW_STRING );
    }
    else
    {
        delete_firmware = KAL_TRUE; // need delete firmware after update
    }

    handle = FS_Open( CTP_FIRMWARE_PATH, FS_READ_ONLY );

    if ( handle >= 0 ) // file system first
    {        	
        do
        {
            rlen  = 0;

            ret = FS_Read( handle, &data_ptr[length], 256, &rlen );

            length += rlen;

            if ( rlen != 256 )
            {
                CTP_DWN_DEBUG_LINE_TRACE();
                break;
            } 
            else
            {
                drv_trace1( TRACE_GROUP_7, CTP_GOODIX_DWN_READ_IMAGE_TRACE, rlen);
            }

        } while ( 1 );

        FS_Close( handle );
    }
    else
    {
        const int MAGIC_NUMBER_1 = 0x4D454449;
        const int MAGIC_NUMBER_2 = 0x4154454B;
        unsigned short checksum = 0;
        int i;
        
        drv_trace2( TRACE_GROUP_7, CTP_GOODIX_DWN_MAGIC_NUM_TRACE, fw_info->magic_number_1, fw_info->magic_number_2 );
        drv_trace2( TRACE_GROUP_7, CTP_GOODIX_DWN_MAGIC_NUM_TRACE, MAGIC_NUMBER_1, MAGIC_NUMBER_2 );
        drv_trace2( TRACE_GROUP_7, CTP_GOODIX_DWN_VERSION_TRACE, cur_ver, fw_info->version );
        drv_trace2( TRACE_GROUP_7, CTP_GOODIX_DWN_IMAGE_INFO_TRACE, fw_info->length, fw_info->checksum );
        
        if ( fw_info->magic_number_1 != MAGIC_NUMBER_1 && fw_info->magic_number_2 != MAGIC_NUMBER_2 )
        {
            CTP_DWN_DEBUG_LINE_TRACE();
            goto exit_downloader;
        }
        if ( cur_ver >= fw_info->version )
        {
            CTP_DWN_DEBUG_LINE_TRACE();
            goto exit_downloader;
        }
        
        // check if it is the same chip version
        if ( get_chip_version( cur_ver ) != get_chip_version( fw_info->version ) )
        {
            CTP_DWN_DEBUG_LINE_TRACE();
            goto exit_downloader;        
        }
        
        for ( i = 0 ; i < fw_info->length ; i++ )
            checksum += data_ptr[i];
        
        checksum = checksum%0xFFFF;

        if ( checksum != fw_info->checksum )
        {
            CTP_DWN_DEBUG_LINE_TRACE();
            goto exit_downloader;
        }

        length = fw_info->length;

    }
 
    while ( gt818_update_proc( data_ptr, length ) == 0 && retry < 2 ) retry++;

    if ( (handle >= 0)  && delete_firmware) //delete firmware when firmware in phone memory
        FS_Delete( CTP_FIRMWARE_PATH );
    //free_ctrl_buffer( nvram );
    ret = 1;

exit_downloader:

    return ret;
}
VIDEO_ENCODER_CODEC_ERROR_T MPEG4HWEncOpen(void)
{
    VIDEO_ENCODER_CODEC_ERROR_T eRet = VIDEO_ENCODER_CODEC_ERROR_NONE;
    MPEG4_ENCORE_SCENARIO eScenario;
    kal_bool fgrCacheable;
    MPEG4_ENCORE_MEM_INFO *rMPEG4Mem = &rMPEG4HWEncCtrl.rMPEG4Mem;

    kal_mem_set(rMPEG4Mem, 0, sizeof(MPEG4_ENCORE_MEM_INFO));

    rpMPEG4HWEncDriver = GetMPEG4HWEncDriverHandle();

    ASSERT(rMPEG4HWEncCtrl.eScenario!=VIDEO_ENCODER_SCENARIO_NONE);

    switch(rMPEG4HWEncCtrl.eScenario)
    {
    case VIDEO_ENCODER_SCENARIO_ENCODER:
        eScenario = MPEG4_ENCORE_SCENARIO_REC;
        rpMPEG4HWEncDriver->set_param(MPEG4_ENCORE_PARAM_SCENARIO, (void *)&eScenario);
        rMPEG4Mem->int_mem_size = ENC_MAX_INT_MEMORY(ENC_MAX_FRAME_WIDTH, ENC_MAX_FRAME_HEIGHT)+8;
        rMPEG4Mem->ext_mem_size = ENC_MAX_EXT_MEMORY(ENC_MAX_FRAME_WIDTH, ENC_MAX_FRAME_HEIGHT)+8;
        rMPEG4Mem->res_mem_size = ENC_MAX_RESUME_BUFFER_SIZE;
        break;
    case VIDEO_ENCODER_SCENARIO_VT:
        eScenario = MPEG4_ENCORE_SCENARIO_VT;
        rpMPEG4HWEncDriver->set_param(MPEG4_ENCORE_PARAM_SCENARIO, (void *)&eScenario);
        rMPEG4Mem->int_mem_size = ENC_MAX_INT_MEMORY(ENC_MAX_FRAME_WIDTH_VT, ENC_MAX_FRAME_HEIGHT_VT)+8;
        rMPEG4Mem->ext_mem_size = ENC_MAX_EXT_MEMORY(ENC_MAX_FRAME_WIDTH_VT, ENC_MAX_FRAME_HEIGHT_VT)+8;
        rMPEG4Mem->res_mem_size = ENC_MAX_RESUME_BUFFER_SIZE_VT;
        break;
    default :
        ASSERT(0);
        break;
    }

    rMPEG4Mem->int_mem_addr = (kal_uint8 *)VideoEncoderGetIntMem(rMPEG4Mem->int_mem_size);
    ASSERT(rMPEG4Mem->int_mem_addr);
    rMPEG4Mem->int_mem_addr = (kal_uint8 *)(((kal_uint32)rMPEG4Mem->int_mem_addr + 7) & 0xfffffff8);

    rMPEG4Mem->ext_mem_addr = (kal_uint8 *)VideoEncoderMallocAligned(rMPEG4Mem->ext_mem_size);
    ASSERT(rMPEG4Mem->ext_mem_addr);
    rMPEG4Mem->ext_mem_addr = (kal_uint8 *)(((kal_uint32)rMPEG4Mem->ext_mem_addr + 7) & 0xfffffff8);
    fgrCacheable = VideoCommIsExtBufferCacheable((kal_uint32)rMPEG4Mem->ext_mem_addr, rMPEG4Mem->ext_mem_size);
    if(fgrCacheable)
    {
        rMPEG4Mem->ext_mem_addr = (kal_uint8*)VideoCommExtBufferCacheableSwitchAlignMemory(
            (kal_uint32)rMPEG4Mem->ext_mem_addr, rMPEG4Mem->ext_mem_size, VIDEO_NON_CACHEABLE);
    }

    rMPEG4Mem->res_mem_addr = (kal_uint8 *)VideoEncoderMallocAligned(rMPEG4Mem->res_mem_size);
    ASSERT(rMPEG4Mem->res_mem_addr);
    fgrCacheable = VideoCommIsExtBufferCacheable((kal_uint32)rMPEG4Mem->res_mem_addr, rMPEG4Mem->res_mem_size);
    if(fgrCacheable)
    {
        rMPEG4Mem->res_mem_addr = (kal_uint8*)VideoCommExtBufferCacheableSwitchAlignMemory(
            (kal_uint32)rMPEG4Mem->res_mem_addr, rMPEG4Mem->res_mem_size, VIDEO_NON_CACHEABLE);
    }

    rpMPEG4HWEncDriver->open(rMPEG4Mem);

    drv_trace2(TRACE_GROUP_10, MPEG4HWENC_OPEN, rMPEG4Mem->int_mem_size, rMPEG4Mem->ext_mem_size);

    return eRet;
}
DCL_STATUS DclSKBD_Control(DCL_HANDLE handle, DCL_CTRL_CMD cmd, DCL_CTRL_DATA_T *data)
{
   switch (cmd)
   {
	case KBD_CMD_SET_LONG_PRESS_TIME:
		{
			SKBD_CTRL_TIME_T* prCtrlSLP;
			prCtrlSLP = &(data->rKBDCtrTime);
                   KBD.longpress_timeout = prCtrlSLP->u4Tick;
			break;
		}
	
	case KBD_CMD_SET_REPEAT_PRESS_TIME:
		{
			SKBD_CTRL_TIME_T* prCtrlTime ;
			prCtrlTime = &(data->rKBDCtrTime);
                   KBD.repeat_time = prCtrlTime->u4Tick;
			break;
		}
	
	case KBD_CMD_SET_DETECTION_MODE:
		{
			SKBD_CTRL_MODE_T* prCtrlMode;
			prCtrlMode = &(data->rKBDCtrMode);
			prCtrlMode->bFlag = (DCL_BOOL)kbd_SetDetectionMode((kbd_key_det_mode)prCtrlMode->Det_Mode);
			break;
		}
	
	case KBD_CMD_GET_KEY_DATA:
		{
			kal_bool fg ;
			//kbd_data keydata;
			SKBD_CTRL_KEYDATA_T* prCtrlData ;
			prCtrlData = &(data->rKBDCtrGetData);
			fg = Kbd_GetKeyDatas((kbd_data*)prCtrlData);
			
			if(KAL_FALSE == fg)
				return STATUS_BUFFER_EMPTY;
			break;
		}

	
	case KBD_CMD_PEEK_KEY_DATA:
		{
			kal_bool fg;
			SKBD_CTRL_PEEKDATA_T* prCtrlData1;
			prCtrlData1 = &(data->rKBDCtrPeekData);
			fg = Kbd_PeekKeyDatas((kbd_data*)prCtrlData1->keydata, (kal_bool)prCtrlData1->specify_read, (kal_uint32)prCtrlData1->read_pointer,  (kal_uint32*)prCtrlData1->current_read_pointer);
			if(KAL_FALSE == fg)
			return STATUS_BUFFER_EMPTY;
			break;
		}
	
	case KBD_CMD_GET_DETECTION_MODE:
		{
			SKBD_CTRL_MODE_T* prCtrlMode1;
			prCtrlMode1 = &(data->rKBDCtrMode);
                    prCtrlMode1->Det_Mode = kbd_key_detection_mode;
			break;
		}

	case KBD_CMD_CTRL_KEY_SUPPORT:
		{
			SKBD_CTRL_KEYSUPPORT_T* pCtrl = &(data->rKBDCtrlKeySupport);
			pCtrl->fgIKBS =  kbd_IsKeySupported(pCtrl->uKey);
			break;
		}
	case KBD_CMD_CTRL_KEY_MULTIPLE:
		{
			SKBD_CTRL_MULTIKEY_T* pCtrl = &(data->rKBDCtrlMultiple);
			pCtrl->fgIMK =  kbd_IsKeymutiple(pCtrl->uKey);
			
			break;
		}
	case KBD_CMD_GET_KEY_EVENT_CNT:
		{
                    kal_uint8 left;
			SKBD_CTRL_KEY_CNT_T* pCtrl = &(data->rKBDCtrkeyCnt);
			kbdbuffer_get_roomleft(left);
                   pCtrl->keycnt = (kbd_buffer_size - left - 1);

			break;
		}
	case KBD_CMD_PUT_KEY_DATA:
		{
			SKBD_CTRL_PUTKEY_T* PtrlData;
			PtrlData = &(data->rKBDCtrPutKey);
		        kbd_SendKey(PtrlData->keydata);
			break;
		}
	case KBD_CMD_FIND_TWO_STEP:
		{
			SKBD_CTRL_FIND_TWO_STEP_T* pctrldata;
			pctrldata = &(data->rKBDCtrlFindTwoStepKey);
			#ifdef __KBD_2STEP_KEY_SUPPORT__
                  *(pctrldata->number)=1;
                *(pctrldata->two_step)=DEVICE_KEY_FUNCTION;
#else
                *(pctrldata->two_step)=0;
#endif
#if !defined(LOW_COST_SUPPORT)
                drv_trace2(TRACE_GROUP_10, KBD_2STEP_KEY_QUERY, *(pctrldata->two_step),  *(pctrldata->number));
#endif // #if !defined(LOW_COST_SUPPORT)
		}
	     break;
	
		default:
			break;
}
   	return STATUS_OK;
}
kal_bool _VideoDecoderScenarioTypeChecking(VIDEO_DECODER_MGR_T *prDecoderMGR, VIDEO_DECODER_CODEC_T eCodec, VIDEO_DECODER_SCENARIO_T eScenario)
{
    VIDEO_DECODER_MGR_DNZ_T* prVDMgrDNZ = &prDecoderMGR->rVDMgrDNZ;
    prVDMgrDNZ->eScenario = eScenario;

    switch (eCodec)
    {
#ifdef __VE_MPEG4_DEC_SW_SUPPORT__
    case VIDEO_CODEC_MPEG4:
    {
        prVDMgrDNZ->eCodec = CODEC_MPEG4;

        switch (eScenario)
        {
        case VIDEO_SCENARIO_PLAYER:
        case VIDEO_SCENARIO_KMV:
            prVDMgrDNZ->prCodecAPI = GetVideoDecoderAdapterHandle(VADP_CODEC_MPEG4, VADP_PLAYER);
            break;

#ifdef __VE_VIDEO_VT_SUPPORT__
        case VIDEO_SCENARIO_VT:
            prVDMgrDNZ->prCodecAPI = GetVideoDecoderAdapterHandle(VADP_CODEC_MPEG4, VADP_VIDEOCALL);
            break;
#endif

        case VIDEO_SCENARIO_QVGA:
            prVDMgrDNZ->prCodecAPI = GetVideoDecoderAdapterHandle(VADP_CODEC_MPEG4, VADP_QVGA);
            break;

        case VIDEO_SCENARIO_QVGA_MPEG4SP:
            prVDMgrDNZ->prCodecAPI = GetVideoDecoderAdapterHandle(VADP_CODEC_MPEG4, VADP_QVGA_MPEG4SP);
            break;

        // preview
        case VIDEO_SCENARIO_PREVIEW:
        case VIDEO_SCENARIO_PREVIEW_KMV:
            prVDMgrDNZ->prCodecAPI = GetVideoDecoderAdapterHandle(VADP_CODEC_MPEG4, VADP_PREVIEW);
            break;

        case VIDEO_SCENARIO_QCIF:
            prVDMgrDNZ->prCodecAPI = GetVideoDecoderAdapterHandle(VADP_CODEC_MPEG4, VADP_QCIF);
            break;

        case VIDEO_SCENARIO_VGA:
            prVDMgrDNZ->prCodecAPI = GetVideoDecoderAdapterHandle(VADP_CODEC_MPEG4, VADP_VGA);
            break;

        case VIDEO_SCENARIO_CIF:
            prVDMgrDNZ->prCodecAPI = GetVideoDecoderAdapterHandle(VADP_CODEC_MPEG4, VADP_CIF);
            break;

        case VIDEO_SCENARIO_UPTOCIF:
            prVDMgrDNZ->prCodecAPI = GetVideoDecoderAdapterHandle(VADP_CODEC_MPEG4, VADP_UPTOCIF);
            break;

        case VIDEO_SCENARIO_UPTOQVGA:
            prVDMgrDNZ->prCodecAPI = GetVideoDecoderAdapterHandle(VADP_CODEC_MPEG4, VADP_UPTOQVGA);
            break;


        default:
            drv_trace4(TRACE_GROUP_10, VDEC_GET_HDLR, eCodec, eScenario, VIDEO_ERROR_UNDEFINED, 0);
            return KAL_FALSE;
        }
    }
    break;

    case VIDEO_CODEC_H263:
    {
        prVDMgrDNZ->eCodec = CODEC_H263;

        switch (eScenario)
        {
        case VIDEO_SCENARIO_PLAYER:
        case VIDEO_SCENARIO_KMV:
            prVDMgrDNZ->prCodecAPI = GetVideoDecoderAdapterHandle(VADP_CODEC_H263,VADP_PLAYER);
            break;

#ifdef __VE_VIDEO_VT_SUPPORT__
        case VIDEO_SCENARIO_VT:
            prVDMgrDNZ->prCodecAPI = GetVideoDecoderAdapterHandle(VADP_CODEC_H263, VADP_VIDEOCALL);
            break;
#endif

        case VIDEO_SCENARIO_QVGA:
            prVDMgrDNZ->prCodecAPI = GetVideoDecoderAdapterHandle(VADP_CODEC_H263, VADP_QVGA);
            break;

        case VIDEO_SCENARIO_QVGA_MPEG4SP:
            prVDMgrDNZ->prCodecAPI = GetVideoDecoderAdapterHandle(VADP_CODEC_H263, VADP_QVGA_MPEG4SP);
            break;

        // preview
        case VIDEO_SCENARIO_PREVIEW:
            prVDMgrDNZ->prCodecAPI = GetVideoDecoderAdapterHandle(VADP_CODEC_H263, VADP_PREVIEW);
            break;

        case VIDEO_SCENARIO_QCIF:
            prVDMgrDNZ->prCodecAPI = GetVideoDecoderAdapterHandle(VADP_CODEC_H263, VADP_QCIF);
            break;

        case VIDEO_SCENARIO_VGA:
            prVDMgrDNZ->prCodecAPI = GetVideoDecoderAdapterHandle(VADP_CODEC_H263, VADP_VGA);
            break;

        case VIDEO_SCENARIO_CIF:
            prVDMgrDNZ->prCodecAPI = GetVideoDecoderAdapterHandle(VADP_CODEC_H263, VADP_CIF);
            break;

        case VIDEO_SCENARIO_UPTOCIF:
            prVDMgrDNZ->prCodecAPI = GetVideoDecoderAdapterHandle(VADP_CODEC_H263, VADP_UPTOCIF);
            break;

        case VIDEO_SCENARIO_UPTOQVGA:
            prVDMgrDNZ->prCodecAPI = GetVideoDecoderAdapterHandle(VADP_CODEC_H263, VADP_UPTOQVGA);
            break;

        default:
            drv_trace4(TRACE_GROUP_10, VDEC_GET_HDLR, eCodec, eScenario, VIDEO_ERROR_UNDEFINED, 0);
            return KAL_FALSE;
        }
    }
    break;
#endif

#ifdef __VE_MPEG4_DEC_HW_SUPPORT__
    case VIDEO_CODEC_MPEG4:
    {
        prVDMgrDNZ->eCodec = CODEC_MPEG4;

        prVDMgrDNZ->prCodecAPI = GetMPEG4HwDecoderHandler(eScenario);
    }
    break;

    case VIDEO_CODEC_H263:
    {
        prVDMgrDNZ->eCodec = CODEC_H263;

        prVDMgrDNZ->prCodecAPI = GetMPEG4HwDecoderHandler(eScenario);
    }
    break;
#endif

#ifdef __VE_H264_DEC_SW_SUPPORT__
    case VIDEO_CODEC_H264:
    {
        prVDMgrDNZ->eCodec = CODEC_H264;

        switch (eScenario)
        {
        case VIDEO_SCENARIO_PLAYER:
        case VIDEO_SCENARIO_KMV:
            prVDMgrDNZ->prCodecAPI = GetVideoDecoderAdapterHandle(VADP_CODEC_H264, VADP_PLAYER);
            break;

        case VIDEO_SCENARIO_QVGA:
            prVDMgrDNZ->prCodecAPI = GetVideoDecoderAdapterHandle(VADP_CODEC_H264, VADP_QVGA);
            break;

        case VIDEO_SCENARIO_QVGA_MPEG4SP:
            prVDMgrDNZ->prCodecAPI = GetVideoDecoderAdapterHandle(VADP_CODEC_H264, VADP_QVGA_MPEG4SP);
            break;

        // preview
        case VIDEO_SCENARIO_PREVIEW:
        case VIDEO_SCENARIO_PREVIEW_KMV:
            prVDMgrDNZ->prCodecAPI = GetVideoDecoderAdapterHandle(VADP_CODEC_H264, VADP_PREVIEW);
            break;

        case VIDEO_SCENARIO_QCIF:
            prVDMgrDNZ->prCodecAPI = GetVideoDecoderAdapterHandle(VADP_CODEC_H264, VADP_QCIF);
            break;

        case VIDEO_SCENARIO_VGA:
            prVDMgrDNZ->prCodecAPI = GetVideoDecoderAdapterHandle(VADP_CODEC_H264, VADP_VGA);
            break;

        case VIDEO_SCENARIO_CIF:
            prVDMgrDNZ->prCodecAPI = GetVideoDecoderAdapterHandle(VADP_CODEC_H264, VADP_CIF);
            break;

        case VIDEO_SCENARIO_UPTOCIF:
            prVDMgrDNZ->prCodecAPI = GetVideoDecoderAdapterHandle(VADP_CODEC_H264, VADP_UPTOCIF);
            break;

        case VIDEO_SCENARIO_UPTOQVGA:
            prVDMgrDNZ->prCodecAPI = GetVideoDecoderAdapterHandle(VADP_CODEC_H264, VADP_UPTOQVGA);
            break;

        default:
            drv_trace4(TRACE_GROUP_10, VDEC_GET_HDLR, eCodec, eScenario, VIDEO_ERROR_UNDEFINED, 0);
            return KAL_FALSE;
        }
    }
    break;
#endif

#ifdef __VE_H264_DEC_HW_SUPPORT__
    case VIDEO_CODEC_H264:
    {
        prVDMgrDNZ->eCodec = CODEC_H264;

        prVDMgrDNZ->prCodecAPI = GetH264HwDecoderHandler(eScenario);
    }
    break;
#endif

#ifdef __VE_RV_DEC_SW_SUPPORT__
    case VIDEO_CODEC_RV9_10:
    {
        prVDMgrDNZ->eCodec = CODEC_RV9_10;

        switch (eScenario)
        {
        case VIDEO_SCENARIO_PLAYER:
            prVDMgrDNZ->prCodecAPI = GetVideoDecoderAdapterHandle(VADP_CODEC_RV9_10, VADP_PLAYER);
            break;

        case VIDEO_SCENARIO_QVGA:
            prVDMgrDNZ->prCodecAPI = GetVideoDecoderAdapterHandle(VADP_CODEC_RV9_10, VADP_QVGA);
            break;

        case VIDEO_SCENARIO_QVGA_MPEG4SP:
            prVDMgrDNZ->prCodecAPI = GetVideoDecoderAdapterHandle(VADP_CODEC_RV9_10, VADP_QVGA_MPEG4SP);
            break;

        // preview
        case VIDEO_SCENARIO_PREVIEW:
            prVDMgrDNZ->prCodecAPI = GetVideoDecoderAdapterHandle(VADP_CODEC_RV9_10, VADP_PREVIEW);
            break;

        case VIDEO_SCENARIO_QCIF:
            prVDMgrDNZ->prCodecAPI = GetVideoDecoderAdapterHandle(VADP_CODEC_RV9_10, VADP_QCIF);
            break;

        case VIDEO_SCENARIO_VGA:
            prVDMgrDNZ->prCodecAPI = GetVideoDecoderAdapterHandle(VADP_CODEC_RV9_10, VADP_VGA);
            break;

        case VIDEO_SCENARIO_CIF:
            prVDMgrDNZ->prCodecAPI = GetVideoDecoderAdapterHandle(VADP_CODEC_RV9_10, VADP_CIF);
            break;

        case VIDEO_SCENARIO_UPTOCIF:
            prVDMgrDNZ->prCodecAPI = GetVideoDecoderAdapterHandle(VADP_CODEC_RV9_10, VADP_UPTOCIF);
            break;

        case VIDEO_SCENARIO_UPTOQVGA:
            prVDMgrDNZ->prCodecAPI = GetVideoDecoderAdapterHandle(VADP_CODEC_RV9_10, VADP_UPTOQVGA);
            break;

        default:
            drv_trace4(TRACE_GROUP_10, VDEC_GET_HDLR, eCodec, eScenario, VIDEO_ERROR_UNDEFINED, 0);
            return KAL_FALSE;
        }
    }
    break;
#endif

#ifdef __VE_MJPEG_DEC_SW_SUPPORT__
    case VIDEO_CODEC_MJPEG:
    {
        prVDMgrDNZ->eCodec = CODEC_MJPEG;

        switch (eScenario)
        {
        case VIDEO_SCENARIO_PLAYER:
            prVDMgrDNZ->prCodecAPI = GetMJPEGDecoderHandler(eScenario);
            if (prVDMgrDNZ->prCodecAPI == NULL)
            {
                drv_trace4(TRACE_GROUP_10, VDEC_GET_HDLR, eCodec, eScenario, VIDEO_ERROR_UNDEFINED, 0);
                return KAL_FALSE;
            }
            break;

        case VIDEO_SCENARIO_QVGA:
            prVDMgrDNZ->prCodecAPI = GetMJPEGDecoderHandler(eScenario);
            if (prVDMgrDNZ->prCodecAPI == NULL)
            {
                drv_trace4(TRACE_GROUP_10, VDEC_GET_HDLR, eCodec, eScenario, VIDEO_ERROR_UNDEFINED, 0);
                return KAL_FALSE;
            }
            break;

        case VIDEO_SCENARIO_QVGA_MPEG4SP:
            prVDMgrDNZ->prCodecAPI = GetMJPEGDecoderHandler(eScenario);
            if (prVDMgrDNZ->prCodecAPI == NULL)
            {
                drv_trace4(TRACE_GROUP_10, VDEC_GET_HDLR, eCodec, eScenario, VIDEO_ERROR_UNDEFINED, 0);
                return KAL_FALSE;
            }
            break;

        // preview
        case VIDEO_SCENARIO_PREVIEW:
            prVDMgrDNZ->prCodecAPI = GetMJPEGDecoderHandler(eScenario);
            if (prVDMgrDNZ->prCodecAPI == NULL)
            {
                drv_trace4(TRACE_GROUP_10, VDEC_GET_HDLR, eCodec, eScenario, VIDEO_ERROR_UNDEFINED, 0);
                return KAL_FALSE;
            }
            break;

        case VIDEO_SCENARIO_QCIF:
            prVDMgrDNZ->prCodecAPI = GetMJPEGDecoderHandler(eScenario);
            if (prVDMgrDNZ->prCodecAPI == NULL)
            {
                drv_trace4(TRACE_GROUP_10, VDEC_GET_HDLR, eCodec, eScenario, VIDEO_ERROR_UNDEFINED, 0);
                return KAL_FALSE;
            }
            break;

        case VIDEO_SCENARIO_VGA:
            prVDMgrDNZ->prCodecAPI = GetMJPEGDecoderHandler(eScenario);
            if (prVDMgrDNZ->prCodecAPI == NULL)
            {
                drv_trace4(TRACE_GROUP_10, VDEC_GET_HDLR, eCodec, eScenario, VIDEO_ERROR_UNDEFINED, 0);
                return KAL_FALSE;
            }
            break;

        case VIDEO_SCENARIO_CIF:
            prVDMgrDNZ->prCodecAPI = GetMJPEGDecoderHandler(eScenario);
            if (prVDMgrDNZ->prCodecAPI == NULL)
            {
                drv_trace4(TRACE_GROUP_10, VDEC_GET_HDLR, eCodec, eScenario, VIDEO_ERROR_UNDEFINED, 0);
                return KAL_FALSE;
            }
            break;

        case VIDEO_SCENARIO_UPTOQVGA:
            prVDMgrDNZ->prCodecAPI = GetMJPEGDecoderHandler(eScenario);
            if (prVDMgrDNZ->prCodecAPI == NULL)
            {
                drv_trace4(TRACE_GROUP_10, VDEC_GET_HDLR, eCodec, eScenario, VIDEO_ERROR_UNDEFINED, 0);
                return KAL_FALSE;
            }
            break;

        case VIDEO_SCENARIO_UPTOCIF:
            prVDMgrDNZ->prCodecAPI = GetMJPEGDecoderHandler(eScenario);
            if (prVDMgrDNZ->prCodecAPI == NULL)
            {
                drv_trace4(TRACE_GROUP_10, VDEC_GET_HDLR, eCodec, eScenario, VIDEO_ERROR_UNDEFINED, 0);
                return KAL_FALSE;
            }
            break;


        default:
            drv_trace4(TRACE_GROUP_10, VDEC_GET_HDLR, eCodec, eScenario, VIDEO_ERROR_UNDEFINED, 0);
            return KAL_FALSE;
        }
    }
    break;
#endif

#ifdef __VE_VP8_DEC_SW_SUPPORT__
    case VIDEO_CODEC_VP8:
    {
        prVDMgrDNZ->eCodec = CODEC_VP8;

        switch (eScenario)
        {
        case VIDEO_SCENARIO_PLAYER:
            prVDMgrDNZ->prCodecAPI = GetVideoDecoderAdapterHandle(VADP_CODEC_VP8, VADP_PLAYER);
            break;

        case VIDEO_SCENARIO_QVGA:
            prVDMgrDNZ->prCodecAPI = GetVideoDecoderAdapterHandle(VADP_CODEC_VP8, VADP_QVGA);
            break;

        case VIDEO_SCENARIO_QVGA_MPEG4SP:
            prVDMgrDNZ->prCodecAPI = GetVideoDecoderAdapterHandle(VADP_CODEC_VP8, VADP_QVGA_MPEG4SP);
            break;

        // preview
        case VIDEO_SCENARIO_PREVIEW:
            prVDMgrDNZ->prCodecAPI = GetVideoDecoderAdapterHandle(VADP_CODEC_VP8, VADP_PREVIEW);
            break;

        case VIDEO_SCENARIO_QCIF:
            prVDMgrDNZ->prCodecAPI = GetVideoDecoderAdapterHandle(VADP_CODEC_VP8, VADP_QCIF);
            break;

        case VIDEO_SCENARIO_VGA:
            prVDMgrDNZ->prCodecAPI = GetVideoDecoderAdapterHandle(VADP_CODEC_VP8, VADP_VGA);
            break;

        case VIDEO_SCENARIO_CIF:
            prVDMgrDNZ->prCodecAPI = GetVideoDecoderAdapterHandle(VADP_CODEC_VP8, VADP_CIF);
            break;

        case VIDEO_SCENARIO_UPTOCIF:
            prVDMgrDNZ->prCodecAPI = GetVideoDecoderAdapterHandle(VADP_CODEC_VP8, VADP_UPTOCIF);
            break;

        case VIDEO_SCENARIO_UPTOQVGA:
            prVDMgrDNZ->prCodecAPI = GetVideoDecoderAdapterHandle(VADP_CODEC_VP8, VADP_UPTOQVGA);
            break;

        default:
            drv_trace4(TRACE_GROUP_10, VDEC_GET_HDLR, eCodec, eScenario, VIDEO_ERROR_UNDEFINED, 0);
            return KAL_FALSE;
        }
    }
    break;
#endif



    default:
        drv_trace4(TRACE_GROUP_10, VDEC_GET_HDLR, eCodec, eScenario, VIDEO_ERROR_UNDEFINED, 0);
        return KAL_FALSE;
    }

    if (NULL == prVDMgrDNZ->prCodecAPI)
    {
        drv_trace2(TRACE_GROUP_10, VDEC_FAIL_GET_HDLR, eCodec, eScenario);
        return KAL_FALSE;
    }

    return KAL_TRUE;
}