Exemplo n.º 1
0
void i51adePortInitLogFile( void )
{
    iU16 logfilename[32]= {0};
    iU16 LDfilename[32]= {0};

    
    i51AdeOsFileAModeEnable();
    
    kal_wsprintf( logfilename , "%c:\\i51\\%s" , 
	   			 FS_GetDrive( FS_DRIVE_V_REMOVABLE , 1 , FS_NO_ALT_DRIVE ) , 
	  			 "i51.log" );

    kal_wsprintf( LDfilename , "%c:\\i51\\%d_%d.dat" , 
	   			 FS_GetDrive( FS_DRIVE_V_REMOVABLE , 1 , FS_NO_ALT_DRIVE ) , 
	  			 I51_KERNEL_P4_VERSION , I51_ADAPTER_P4_VERSION );
    

    if(i51AdeOsFileIsExist(logfilename))
    {
        i51LogFileisExist = iTRUE;
        
        if(i51AdeOsFileIsExist(LDfilename))
        {
            i51AdePortSysLogLoadData(LDfilename);
        }
        else
            i51AdeOsLog(0, "缺少日志数据库无法打印底层日志. 请下载版本号为 %d_%d 的日志数据库", I51_KERNEL_P4_VERSION, I51_ADAPTER_P4_VERSION);
    }
    else
    {//T卡中不存在,判断系统盘是否存在i51.log
        kal_wsprintf( logfilename , "%c:\\i51\\%s" , 
	   			 'C' , 
	  			 "i51.log" );

        kal_wsprintf( LDfilename , "%c:\\i51\\%d_%d.dat" , 
	   			 'C' , 
	  			 I51_KERNEL_P4_VERSION , I51_ADAPTER_P4_VERSION );

        if(i51AdeOsFileIsExist(logfilename))
        {
            i51LogFileisExist = iTRUE;
        
            if(i51AdeOsFileIsExist(LDfilename))
            {
                i51AdePortSysLogLoadData(LDfilename);
            }
            else
                i51AdeOsLog(0, "缺少日志数据库无法打印底层日志. 请下载版本号为 %d_%d 的日志数据库", I51_KERNEL_P4_VERSION, I51_ADAPTER_P4_VERSION);
        }
        
    }
    
    i51AdeOsFileAModeDisable();
}
Exemplo n.º 2
0
/*****************************************************************************
 * FUNCTION
 *  csb_frm_check_if_card_present
 * DESCRIPTION
 *
 * PARAMETERS
 *  
 * RETURNS
 *  void
 *****************************************************************************/
pBOOL csb_frm_check_if_card_present(void)
{
	/*----------------------------------------------------------------*/
    /* Local Variables                                                */
    /*----------------------------------------------------------------*/
	U32 drive;
	S32 status;
	pBOOL error_code = FALSE;

    /*----------------------------------------------------------------*/
    /* Code Body                                                      */
    /*----------------------------------------------------------------*/
	
	drive = FS_GetDrive(FS_DRIVE_V_REMOVABLE, 1, FS_NO_ALT_DRIVE);
    status = FS_GetDevStatus(drive, FS_MOUNT_STATE_ENUM);

	if(status >= 0)
	{
		error_code = TRUE;
		DisplayPopup((PU8) GetString(STR_GLOBAL_OK), IMG_GLOBAL_ERROR, 5, CSB_NOTIFY_DURATION, 0);
	}
	else
	{
		error_code = FALSE;
		DisplayPopup((PU8) GetString(STR_ID_CSB_NO_MEMORY_CARD), IMG_GLOBAL_ERROR, 5, CSB_NOTIFY_DURATION, 0);
	}

	return error_code;
}
Exemplo n.º 3
0
/**
 * Get Path for requested size
 */
kal_int16 FT_GetAvailableDrive(kal_int32 size)
{
#if !defined(__LOW_COST_SUPPORT_ULC__)
    kal_int16 drv_letter       = -1;
    kal_int16 i                = 0;
    kal_uint32 dev[4]          = {FS_DRIVE_I_SYSTEM, FS_DRIVE_V_NORMAL, FS_DRIVE_V_REMOVABLE, FS_DRIVE_V_EXTERNAL};
    kal_wchar *pathname        = NULL;
    pathname = (kal_wchar*)get_ctrl_buffer(FT_FAT_MAX_FULLPATH);
    if(pathname)
    {
        for(i=0;i<4;i++)
        {
            drv_letter = FS_GetDrive(dev[i], 1, FS_NO_ALT_DRIVE);
            if(drv_letter > 0)
            {
                kal_wsprintf(pathname, "%c:\\", drv_letter);
                if(size < FT_GetDiskFreeSpace(pathname))
                {
                    break;
                }
            }
        }
    }
    else
    {
        ASSERT(0);
    }
    free_ctrl_buffer(pathname);
    return drv_letter;
#else // #if !defined(__LOW_COST_SUPPORT_ULC__)
    return -1;
#endif // #if defined(__LOW_COST_SUPPORT_ULC__)
}
Exemplo n.º 4
0
void test_xmlgen(void)
{
    
    XG_HANDLE  hd;
    xg_attr_struct attrlist[2];
    char *data = NULL, *dtd=NULL;
    kal_wchar resultname[128];
    int  ret, len, driver;

    driver = FS_GetDrive(FS_DRIVE_V_NORMAL, 1, FS_DRIVE_I_SYSTEM);
    csd_wsprintf((kal_uint16*)resultname, "%c:\\xmlsample.txt",driver);    

    hd = xml_new_generator((kal_char*)resultname, 0);
    xml_generate_xmldecl(hd, 0, XML_ENCODING_UTF8);
    xml_generate_doctypedecl(hd, "bookshop", XG_DOCTYPE_SYSTEM, "bookshop.dtd");
    dtd = "<!ELEMENT greeting (#PCDATA)>";
    len = strlen(dtd);
//    xml_generate_doctypedecl_ex(hd, "bookshop", dtd, len);
  
    ret = xml_generate_stag(hd, "bookshop", NULL, 0);  /*  to generate:  <bookshop> */
 
    /* to generate: <book1>this is a book of computer</book1> */

    data = "test data";
    
    ret = xml_generate_inline_element(hd, "book1", data, strlen(data)); 
    

    ret = xml_generate_stag(hd, "contact", NULL, 0);
    
    /* to generate: <address street="Xi Dan Street"/> */
    attrlist[0].attrname = "street";
    attrlist[0].attrvalue = "Xi Dan Street";
    attrlist[1].attrname = "code";
    attrlist[1].attrvalue = "100022";
    ret = xml_generate_empty_element(hd, "address", attrlist, 2);
  
    /* to generate: <email>[![CDATA[[email protected]]]></email> */
    ret = xml_generate_stag(hd, "email", NULL, 0);
    data = " [email protected]";
    ret = xml_generate_cdata(hd, data, strlen(data));
   
    ret = xml_generate_etag(hd, "email");

    ret = xml_generate_stag(hd, "msn", NULL, 0);
    data = "*****@*****.**";
    ret = xml_generate_data(hd, data, strlen(data));
    ret = xml_generate_etag(hd, "msn");
  
    /* to generate: </contact> */
    ret = xml_generate_etag(hd, "contact");
    
    /* to generate: </sample> */
    ret = xml_generate_etag(hd, "bookshop");
  
    xml_close_generator(hd);
}
Exemplo n.º 5
0
void test_wbxmlgen(void)
{
    
    WG_HANDLE  hd;
    FS_HANDLE  fd;
    kal_char *dest = NULL;
    kal_wchar resultname[128];
    xg_attr_struct attrlist[2];
    char* data = NULL;
    kal_int32 ret, driver;
    kal_uint32 len, buf_len;

    driver = FS_GetDrive(FS_DRIVE_V_NORMAL, 1, FS_DRIVE_I_SYSTEM);
    kal_wsprintf((kal_uint16*)resultname, "%c:\\wbxmlsample.txt",driver); 

    hd = wbxml_new_generator((kal_char*)resultname, 0);
    wbxml_register_get_token_handler(hd, wbxml_test_get_tagtoken_hdlr, 
        wbxml_test_get_attrnametoken_hdlr, wbxml_test_get_attrvaluetoken_hdlr);
    ret = wbxml_generate_header(hd, 1, 0, "test publicid", WBXML_CHARSET_UTF_8);
 
    ret = wbxml_generate_stag(hd,"bookshop", 0, 0, 1);
 
    attrlist[0].attrname = "auther";
    attrlist[0].attrvalue = "Jonh";
    attrlist[1].attrname = "sex";
    attrlist[1].attrvalue = "male";    
    ret = wbxml_generate_stag(hd, "book1", attrlist, 2, 1);
 
    data = "book1:computer book";

     len = strlen(data);
 //   ret = wbxml_generate_data(hd, data, len+1, 0);
        ret = wbxml_generate_data(hd, data, len, 1);
//    ret = wbxml_generate_data(hd, (kal_char*)L"D:\\data", 0, 1);
    ret = wbxml_generate_etag(hd, "book1");
   
    data ="book2:artist book";
    len = strlen(data);
    ret = wbxml_generate_inline_element(hd, "book2", data, len+1, 0);
    
    attrlist[0].attrname = "city";
    attrlist[1].attrvalue = "Beijing";
    ret = wbxml_generate_empty_element(hd, "address", attrlist, 1);
    
    ret = wbxml_generate_etag(hd, "bookshop");
    len = wbxml_close_generator(hd);

    test_wbxmlp("wbxmlsample.txt", 0);

//    free_ctrl_buffer(dest);
}
Exemplo n.º 6
0
static void i51RunBootApp( iBOOL results )
{
    extern const unsigned char* i51SapGetAppBoot(void);
    extern const int i51SapGetAppBootSize(void);
    U16 filename[256];

    if(!results) return;

    
    kal_wsprintf( filename, "%c:\\i51CALLTIME", FS_GetDrive(FS_DRIVE_V_REMOVABLE, 1, FS_NO_ALT_DRIVE) );
    if (FS_GetAttributes (filename) >= 0)  
        i51SapAppBootPara[0]= 60; 
    else {
        kal_wsprintf( filename, "C:\\i51CALLTIME" );
        if (FS_GetAttributes (filename) >= 0) 
            i51SapAppBootPara[0]= 60; 
    } 

	i51KernelRunStaticApp ( L"AppBoot" , (unsigned char* )i51SapGetAppBoot () , (unsigned int )i51SapGetAppBootSize () , i51SapAppBootPara, 1, 0 ) ;	
}
Exemplo n.º 7
0
/*****************************************************************************
 * FUNCTION
 *  aud_vr_startup
 * DESCRIPTION
 *  initialize vr module
 * PARAMETERS
 *  void
 * RETURNS
 *  kal_bool
 *****************************************************************************/
kal_bool aud_vr_startup(void)
{
    /*----------------------------------------------------------------*/
    /* Local Variables                                                */
    /*----------------------------------------------------------------*/

    /*----------------------------------------------------------------*/
    /* Code Body                                                      */
    /*----------------------------------------------------------------*/
    vr_ctx.state = AUD_VR_STATE_IDLE;
    vr_ctx.src_mod = MOD_NIL;
    vr_ctx.db_drive = FS_GetDrive(FS_DRIVE_I_SYSTEM, 1, FS_NO_ALT_DRIVE);       /* system drive */
    /* vr_ctx.db_drive = FS_GetDrive(FS_DRIVE_V_NORMAL, 2, FS_DRIVE_V_NORMAL | FS_DRIVE_I_SYSTEM); // public drive */
    aud_vr_mutex_init(&vr_mutex, "VR mutex");

    if (!aud_vr_sd_startup())
    {
        return KAL_FALSE;
    }

    return KAL_TRUE;
}
static kal_bool process_gt818_ctp_cmd( kal_uint8 action, kal_uint32 data_len, kal_uint8 *data_str )
{
    kal_uint16 ret_len = 0;
    kal_uint16 i;
    kal_uint16 inlen;
    kal_uint16 offset;
    STS_CTRL_COMMAND_T cmd;
    DCL_HANDLE handle;
    kal_uint8 *ctp_buffer = NULL;
    kal_uint8 *result = NULL;
    
    ctp_buffer = (kal_uint8 *)get_ctrl_buffer( 1024 );
    
    if ( ctp_buffer == NULL )
        EXT_ASSERT(0, (int)ctp_buffer, 0, 0);
        
    cmd.u4Command = action;
    cmd.pVoid1 = (void *)data_str;
    cmd.pVoid2 = (void *)&result;
    
    handle = DclSTS_Open( DCL_TS, 0 );
    DclSTS_Control( handle, STS_CMD_COMMAND, (DCL_CTRL_DATA_T *)&cmd );   
    DclSTS_Close(handle);     
    
    if ( action == DCL_CTP_COMMAND_GET_VERSION )
        ret_len = 6;
        
    if ( action == DCL_CTP_COMMAND_GET_CONFIG )
        ret_len = 106;
            
    if ( action == DCL_CTP_COMMAND_GET_DIFF_DATA )
        ret_len = 162;      

    if ( action == DCL_CTP_COMMAND_GET_FW_BUFFER )
    {
        offset = data_str[0]*256 + data_str[1];
        inlen = data_str[2];
        memcpy( &result[offset], &data_str[3], inlen);
        
        if ( inlen != 128 )
        {
            #define GT818_FW_STRING  "ctp_firmware_rusklmeoxkwjadfjnklruo3"
            kal_int16   drv_letter;
            FS_HANDLE fs_handle;
            UINT writen;
            kal_wchar   CTP_FIRMWARE_PATH[64];
                    
            drv_letter = FS_GetDrive(FS_DRIVE_V_NORMAL, 2, FS_DRIVE_I_SYSTEM | FS_DRIVE_V_NORMAL);
            kal_wsprintf( CTP_FIRMWARE_PATH, "%c:\\%s", drv_letter, GT818_FW_STRING );    
            fs_handle = FS_Open( CTP_FIRMWARE_PATH, FS_CREATE_ALWAYS | FS_READ_WRITE );
            FS_Write(fs_handle, (kal_uint8 *) result , offset+inlen, &writen);
            FS_Close( fs_handle );
        }            
    }
    
    kal_sprintf( (kal_char *)ctp_buffer, "+EGCMD: " );
            
    for ( i = 0 ; i < ret_len ; i++ )
        kal_sprintf( (kal_char *)&ctp_buffer[strlen((char *)(ctp_buffer))], "%02X", result[i] );            
        
    rmmi_write_unsolicitedResultCode( ctp_buffer, strlen((kal_char *)(ctp_buffer)), KAL_TRUE, 1, NULL );    
    
    free_ctrl_buffer( ctp_buffer );
    
    return KAL_TRUE;
}
Exemplo n.º 9
0
/*
* Create a save as operation.
*
* Save as parameters:
*  file_name             Suggested user friendly name of the file.
*  mime_type             The mime type of file to save.
*  data_type             Tells if the data to save comes from a pipe, file or
*                        buffer. value must be one of the following constants:
*                          MSF_PCK_DATA_TYPE_FILE,
*                          MSF_PCK_DATA_TYPE_PIPE,
*                          MSF_PCK_DATA_TYPE_BUFFER
*  data                  The data that shall be written to file. This 
*                        parameter is only used when data comes from a 
*                        buffer.
*  data_len              The size of the data. This parameter is only used 
*                        when data comes from a buffer.
*  pathname              The name of the pipe or file. This parameter is only
*                        used when data comes from a pipe or a file.
*  screen                The screen that should be used for the dialog.
*  file_attrs            the file attributes that should be stored with the
*                        specified file.
*  bit_flag              MSF_SAS_ALLOW_OVERWRITE   -  if bit is set, the package will prompt
*                          the user about the replace and possibly replace the existing file.
*                        MSF_SAS_DO_NOT_SHOW_DIALOG   -  if bit is set, the package will not 
*                          allow the user to select position or name of the file to save, but
*                          the file will be saved to a temporary default position with a default
*                          name.
*                        MSM_SAS_NO_EXTERNAL_MEMORY - If this bit is set no folders on
*                          external memory will be possible to select as save destination.
* 
* Returns positive number denoting an id if ok and MSF_PACKAGE_ERROR otherwise.
*/
MSF_INT32
msf_sas_create_save_as (msf_pck_handle_t* handle,
                        const char* file_name,
                        const char* mime_type,
                        int   data_type,
                        void* data,
                        long  data_len,
                        const char *pathname,
                        const msf_pck_attr_list_t *file_attrs,
                        MsfScreenHandle screen,
                        MSF_INT32 bit_flag)
{
    msf_sas_handle_t* sas_handle = (msf_sas_handle_t*)handle;
    msf_sas_op_t      *op = get_new_op (sas_handle);

    op->data_type = data_type;
    op->data = data;
    op->data_len = data_len;
    op->screen = screen;

    op->mime_type = msf_cmmn_strdup (sas_handle->modid, mime_type);
    op->pathname = msf_cmmn_strdup (sas_handle->modid, pathname);
    op->dst_posix = msf_cmmn_strdup (sas_handle->modid, file_name);
    
    {
        char *path = WAP_DOWNLOAD_FOLDER;
        char *temp;
        char temp_ext[24] = "";
        kal_uint8 *dest_file;
        int r;

        msm_remove_files_under_dir(path);
        HDIa_fileMkDir(path);

        r = is_disk_space_enough(path , op->data_len);
        
        if(r < 0) /* File system error occurs. */
        {
    				HDIa_widgetExtShowPopup(
    					sas_handle->modid,
    					HDIa_widgetStringGetPredefined(MSF_STR_ID_DLG_SAVE_ERROR),
    					MsfError,
    					0);
    				op->status = MSF_SAS_RETURN_ERROR;
    				op->state = MSF_SAS_STATE_FINISHED;
            goto end;            
        }
        else if(r == 0)
        {
            // If there is no more space on public drive, see if we have memory card or not.
            sprintf(temp_ext, "%s%c:\\", HDI_EXTERNAL_PATH, FS_GetDrive(FS_DRIVE_V_REMOVABLE, 1, FS_NO_ALT_DRIVE));
            if(is_disk_space_enough(temp_ext, op->data_len) <= 0)
            {
                HDIa_widgetExtShowPopup(
                    sas_handle->modid,
                    HDIa_widgetStringGetPredefined(MSF_STR_ID_SAS_ERROR_FULL),
                    MsfError,
                    0);
                op->status = MSF_SAS_RETURN_ERROR;
                op->state = MSF_SAS_STATE_FINISHED;
                goto end;
            }
            else
            {
                path = temp_ext;
            }
        }

        temp = msf_cmmn_strcat(sas_handle->modid, path, file_name);

        dest_file = HDI_FileNameTranslate(temp);

        MSF_MEM_FREE(sas_handle->modid, temp);

        op->file_name = (char *)widget_ucs2_strdup(sas_handle->modid, dest_file);

        HDI_FileNameFree(dest_file);
    }

    if(data_type == MsfResourceFile)
    {
        handle_file_content(handle, op);
    }
    else if(data_type == MsfResourceBuffer)
    {
        handle_buffer_content(handle, op);
    }
    else if(data_type == MsfResourcePipe)
    {
        handle_pipe_content(handle, op);
    }

end:
    return op->id;
}
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;
}
Exemplo n.º 11
0
MM_ERROR_CODE_ENUM FdFeatureCtrl(FD_FEATURE_ENUM FeatureId,
									void* pParaIn, void* pParaOut,kal_uint16 ParaOutLen)
{    
	P_FD_SET_ENV_INFO_STRUCT pFdSetEnvInfo = (P_FD_SET_ENV_INFO_STRUCT) pParaIn;
	FD_SET_INFO_STRUCT FdSetInfo; 
	P_FD_SET_MEM_INFO_STRUCT pFdSetMemInfo = (P_FD_SET_MEM_INFO_STRUCT) pParaIn; 
	FD_SET_PROC_INFO_STRUCT FdSetProcInfo; 

	P_FD_GET_ENV_INFO_STRUCT pFdGetEnvInfo = (P_FD_GET_ENV_INFO_STRUCT) pParaOut;
	P_FD_RESULT_STRUCT pFdResult = (P_FD_RESULT_STRUCT) pParaOut;
   	PP_STATE_ENUM* pFdCheckState = (PP_STATE_ENUM*) pParaOut;	
	UTL_SWITCH_CACHE_STRUCT MemSwitch;

	switch (FeatureId)
	{
		case FD_FEATURE_GET_ENV_INFO:
			FdCoreGetInfo(pFdGetEnvInfo);
			pFdGetEnvInfo->WorkingBufSize=(kal_uint32) (FD_BUFFER_SIZE);
			//pFdGetEnvInfo->SrcImgFormat= pFdGetEnvInfo->SrcImgFormat;			
			gDstImageWidth=pFdGetEnvInfo->ImageWidth;
			gDstImageHeight=pFdGetEnvInfo->ImageHeight;
		break;
		
		case FD_FEATURE_SET_ENV_INFO:	
			FdSetInfo.pFdEnvInfo = pFdSetEnvInfo;
			FdSetInfo.fd_data1 = (void*)&g_fd_data_1;
			FdSetInfo.fd_data2 = (void*)&g_fd_data_2;
			FdSetInfo.FdLevelOption=gFdLevelOption;
			FdCoreSetInfo(&FdSetInfo);
			gSrcImageWidth=pFdSetEnvInfo->target_width;
			gSrcImageHeight=pFdSetEnvInfo->target_height;
			//gFdFrameIdx = 0;
			gFdStartTime = 0;
			kal_mem_set(&gFdResult, 0, sizeof(FD_RESULT_STRUCT));
			gFdState = FD_CONFIG_STATE;			
		break;

		case FD_FEATURE_SET_PROC_INFO:	
			gFdSetMemInfo.PpSrcBufAddr = pFdSetMemInfo->PpSrcBufAddr; 
			gFdSetMemInfo.PpSrcBufSize = pFdSetMemInfo->PpSrcBufSize; 
			gFdSetMemInfo.PpMemOpType = pFdSetMemInfo->PpMemOpType; 
			gFdSetMemInfo.PpProcBufAddr = pFdSetMemInfo->PpProcBufAddr; 
			gFdSetMemInfo.PpProcBufSize = pFdSetMemInfo->PpProcBufSize; 
			gFdSetMemInfo.PpProcFmt = pFdSetMemInfo->PpProcFmt;
			ASSERT(gFdSetMemInfo.PpProcBufSize>=FD_BUFFER_SIZE);

			//Non-cached memory -> cachecd memory
			MemSwitch.pMemAddr=&gFdSetMemInfo.PpProcBufAddr;
			MemSwitch.Size=(kal_uint32) (FD_BUFFER_SIZE);
			MemSwitch.CacheableFlag=KAL_TRUE;
			UtlFeatureCtrl(UTL_FEATURE_EXT_MEM_SWITCH_CACHE,&MemSwitch,NULL,NULL);

			FdSetProcInfo.ext_mem_start_addr =gFdSetMemInfo.PpProcBufAddr;
			FdSetProcInfo.ext_mem_size = (kal_uint32)FD_BUFFER_SIZE;
			FdSetProcInfo.SrcImgFormat =gFdSetMemInfo.PpProcFmt; 
			FdCoreSetProcInfo(&FdSetProcInfo);
			
			gFdState = FD_READY_STATE;
		break;
		
		case FD_FEATURE_GET_STATE:
			if((gFdState == FD_READY_STATE)||(gFdState == FD_CONFIG_STATE))
			{
				*pFdCheckState=PP_STATE_READY;
			}
			else
			{
				*pFdCheckState=PP_STATE_BUSY;
			}
		break;
		
		case FD_FEATURE_GET_RESULT:
			kal_mem_cpy(pFdResult, &gFdResult, sizeof(FD_RESULT_STRUCT));
		break;

		case FD_FEATURE_SET_LOG_INFO:			
			if (pParaOut) *(kal_uint32*)pParaOut = FD_LOG_BUFFER_SIZE;
#if (defined(FD_LOG_DEBUG_INFO))		       
			gFdFolderCount++;
			gFdfoldername[0] = FS_GetDrive(FS_DRIVE_V_REMOVABLE, 1, FS_NO_ALT_DRIVE); 
			gFdfoldername[7] = gFdFolderCount/10 +'0'; 
			gFdfoldername[8] = gFdFolderCount%10 +'0';
			gFdDirName = gFdfoldername;
			FS_CreateDir(gFdDirName); 
			kal_mem_cpy((void*)(gFdLogFilename), (void*)(gFdfoldername), sizeof(gFdfoldername)-2);
			gFdFileCount= 0;
			gFdLogSize = (kal_uint32)FD_LOG_BUFFER_SIZE; 
			gFdLogBuff = (P_FD_LOG_STRUCT) (*(kal_uint32*)pParaIn);
			gFdPrzBuff = (kal_uint8*)((int)(gFdLogBuff)+768);
#endif
		break;
		default:
		break;
	}
	return MM_ERROR_NONE;
}	/* FdFeatureControl() */