phantom_api.c

来自「QPSK Tuner details, for conexant chipset」· C语言 代码 · 共 1,923 行 · 第 1/5 页

C
1,923
字号
        PHANTOM_DBG_SET_ERROR(PHANTOM_BAD_PARM);
        return(False);
    }
        
    /* retrieve  lock indicators */
    if (PHANTOM_GetLockIndicators(p_nim, p_lockinds) == False)  
    {
        return(False);
    }

    if (PHANTOM_GetLockState(p_nim, p_state) == False)  
    {
        return(False);
    }

    if (*p_state == PHANTOM_ACQ_LOCKED_AND_TRACKING)
    {
        if (PHANTOM_LLF_TunerBandwidthAdjust(p_nim, PHANTOM_TUNERBW_NARROW) == False) // do constant adjustments
        {
            return (False);
        }        
        p_nim->tuner_bw_adjust = True;

        if (p_nim->mpeg_clock_rate_adjust == True)
        {
            p_nim->mpeg_clock_rate_adjust = False;
            if (PHANTOM_ProgramOutputRate(p_nim) == False) 
            {
                return (False);
            }
        }
    }
    else if (*p_state == PHANTOM_ACQ_FADE)
    {
        if (p_nim->tuner_bw_adjust == True) // just do it the moment fade is detected
        {
            if (PHANTOM_LLF_TunerBandwidthAdjust(p_nim, PHANTOM_TUNERBW_OPEN) == False)
            {
                return (False);
            }
            p_nim->tuner_bw_adjust = False; 
        }
    }
	
    return(True);
}  /* PHANTOM_Monitor() */


/*******************************************************************************************************
 * PHANTOM_GetChipInfo()  
 * function to return PHANTOM_NIM info to caller 
 *******************************************************************************************************/
BOOL      
PHANTOM_GetChipInfo(PHANTOM_NIM*            p_nim,              /* pointer to PHANTOM_NIM */
                    char**          p_demod_string,     /* returns name of demod to caller */
                    unsigned long*  p_chip_version,     /* returns demod type (aka chip version) to caller */
                    unsigned long*  p_chip_id,
                    unsigned long*  p_board_version,
                    char**          p_firmware_version) /* returns user board-type info (aka board version) to caller */
{
	unsigned char index;     
	static char   firmware_ver[5];
    unsigned long firmware_version = 0;
    PHANTOM_DEMOD demod;

	PHANTOM_DBG_VALIDATE_NIM(p_nim);

    /* determine the type of demod, if possible */
    if (PHANTOM_DRIVER_CxType(p_nim, &demod, p_demod_string) == False)  
	{
		return(False);
	}

    /* Grab board type */
    if (PHANTOM_RegisterRead(p_nim, PHANTOM_SC_E8_BOARD_VERSION, p_board_version, PHANTOM_USE_DEMOD_HANDLE) != True)
    {
        return(False);
    }

    if (PHANTOM_RegisterRead(p_nim, PHANTOM_SC_FE_CHIP_VERSION, p_chip_version, PHANTOM_USE_DEMOD_HANDLE) != True)
    {
        return(False);
    }
    p_nim->chip_version = (unsigned char)*p_chip_version; 

    /* Get the chip ID */
    if (PHANTOM_RegisterRead(p_nim, PHANTOM_SC_FF_CHIP_TYPE, p_chip_id, PHANTOM_USE_DEMOD_HANDLE) != True)
    {
        return(False);
    }

    /* Get the firmware version */
	for (index = 0; index < 4; index++)
	{
		if (PHANTOM_LLF_UpdateFirmwareVersion(p_nim, index) == True)
		{
			if (PHANTOM_RegisterRead(p_nim, PHANTOM_P0_96_SW_VERSION, &firmware_version, PHANTOM_USE_DEMOD_HANDLE) != True)
			{
				return(False);
			}
			firmware_ver[index] = (char)firmware_version;
		}
		else
		{
			return(False);
		}
	}

    *p_firmware_version = &firmware_ver[0];

    return(True);
}  /* PHANTOM_GetChipInfo() */


/*******************************************************************************************************
 * BOOL  PHANTOM_GetDriverVersion() 
 * function to return driver version data to caller 
 * The version string buffer length should be PHANTOM_MAX_VERSION_LENGTH
 *******************************************************************************************************/
BOOL   
PHANTOM_GetDriverVersion(PHANTOM_NIM            *p_nim,            /* pointer to nim */
                         PHANTOM_DRIVER_VERSION *p_driver_version) /* pointer to address where version string struct will be stored */
{
    if (p_nim == 0 || p_driver_version == 0)  
    {
        return(False);
    }

    /* place a copy of the driver version into user-storage */
    memset(p_driver_version, 0, sizeof(PHANTOM_DRIVER_VERSION));
    strncpy(p_driver_version->version_str, PHANTOM_PRODUCT_VERSION_STRING, (sizeof(PHANTOM_DRIVER_VERSION)-1));

    /* extract the minor-version from the version string, save to nim */
    p_nim->version_minor = (int)(PHANTOM_VERSION_MINOR);

    return(True);
}  /* BOOL  PHANTOM_GetDriverVersion() */


/*******************************************************************************************************
 * PHANTOM_ReleaseEnvironment() 
 * Function to "close" an opened PHANTOM_NIM 
 *******************************************************************************************************/
BOOL  
PHANTOM_ReleaseEnvironment(PHANTOM_NIM *p_nim) /* pointer to opened PHANTOM_NIM */
{
	int index;
//FileClose(); // DEBUG
	/* release a previously-saved nim (gives example of how to pre-test nims) */
	if (PHANTOM_DRIVER_ValidNim(p_nim) == True)
	{
		for (index = 0; index < PHANTOM_MAX_NIMS; index++)
		{
			if (phantom_nim_list.nim[index] == p_nim)
			{
				/* release the nim from the stored list */
				phantom_nim_list.nim[index] = 0;

				/* clear the entire nim struct */
				memset(p_nim, 0, sizeof(PHANTOM_NIM));

				return(True);
			}
		}
	}
	return(False);
}  /* PHANTOM_ReleaseEnvironment() */


/*******************************************************************************************************
 * PHANTOM_SetOutputOptions() 
 * Function to set the demod MPEG output pins 
 *******************************************************************************************************/
BOOL      
PHANTOM_SetOutputOptions(PHANTOM_NIM       *p_nim,       /* pointer to nim */
                     PHANTOM_MPEG_OUT  *p_mpeg_out)  /* mpeg settings struct */
{
    unsigned char basic_settings;
    unsigned char mpeg_control_signal;
    unsigned char data_output;
    unsigned char clock_configuration;
    unsigned char tstate_config;

	/* validate nim and mpeg storage */
	PHANTOM_DBG_VALIDATE_NIM (p_nim);

	if (p_mpeg_out == 0)  
	{
		PHANTOM_DBG_SET_ERROR (PHANTOM_BADPTR);
		return(False);
	}

    //------------------------------------------------------
    basic_settings = 0x00;

	/* Output mode: LLF arg#1[0] */
	switch(p_mpeg_out->output_mode)
	{
        case PHANTOM_SERIAL_OUT_DATA0: case PHANTOM_SERIAL_OUT_DATA7: break;
		case PHANTOM_PARALLEL_OUT: basic_settings = 0x01; break;
		default: PHANTOM_DBG_SET_ERROR (PHANTOM_BAD_PARM); return (False);
	}  

	/* Clock parity mode: LLF arg#1[1] */
	switch(p_mpeg_out->clk_parity_mode)
	{
		case PHANTOM_CLK_CONTINUOUS: break;
		case PHANTOM_CLK_GAPPED:     basic_settings |= 0x02; break;
		default: PHANTOM_DBG_SET_ERROR (PHANTOM_BAD_PARM); return (False);
	}  

	/* Set TEI bit: LLF arg#1[2] */
	switch(p_mpeg_out->tei_bit)
	{
		case PHANTOM_TEI_BIT_NOT_SET: break;
		case PHANTOM_TEI_BIT_SET: basic_settings |= 0x04; break;
		default: PHANTOM_DBG_SET_ERROR(PHANTOM_BAD_PARM); return (False);
	}
    
    //------------------------------------------------------
    mpeg_control_signal = 0x00;

	/* Verify Start signal width. LLF arg#2[0] */
	switch(p_mpeg_out->start_signal_width)
	{
		case PHANTOM_BYTE_WIDE: break;
		case PHANTOM_BIT_WIDE:  mpeg_control_signal = 0x01; break;
		default: PHANTOM_DBG_SET_ERROR(PHANTOM_BAD_PARM); return (False);
	}  

    /* Start signal polarity: LLF arg#2[4] */
	switch(p_mpeg_out->start_signal_polarity)
	{
		case PHANTOM_ACTIVE_LOW: break;
		case PHANTOM_ACTIVE_HIGH: mpeg_control_signal |= 0x10; break;
		default: PHANTOM_DBG_SET_ERROR(PHANTOM_BAD_PARM); return (False);
	}  

	/* Valid signal polarity: LLF arg#2[5] */
	switch(p_mpeg_out->valid_signal_polarity)
	{
		case PHANTOM_ACTIVE_LOW: break;
		case PHANTOM_ACTIVE_HIGH: mpeg_control_signal |= 0x20; break;
		default: PHANTOM_DBG_SET_ERROR(PHANTOM_BAD_PARM); return (False);
	}  

	/* Valid signal active mode: LLF arg#2[1] */
	switch(p_mpeg_out->valid_signal_active_mode)
	{
		case PHANTOM_ENTIRE_PACKET: break;
		case PHANTOM_FIRST_BYTE: mpeg_control_signal |= 0x02; break;
		default: PHANTOM_DBG_SET_ERROR(PHANTOM_BAD_PARM); return(False);
	} 

	/* Fail signal polarity: LLF arg#2[6] */
	switch(p_mpeg_out->fail_signal_polarity)
	{
		case  PHANTOM_ACTIVE_LOW: break;
		case  PHANTOM_ACTIVE_HIGH: mpeg_control_signal |= 0x40; break;
		default: PHANTOM_DBG_SET_ERROR(PHANTOM_BAD_PARM);return(False);
	}  

	/* Fail signal active mode: LLF arg#2[2] */
	switch(p_mpeg_out->fail_signal_active_mode)
	{
		case PHANTOM_ENTIRE_PACKET:break;
		case PHANTOM_FIRST_BYTE: mpeg_control_signal |= 0x04; break;
		default: PHANTOM_DBG_SET_ERROR(PHANTOM_BAD_PARM); return(False);
	} 

    //------------------------------------------------------
    data_output = 0x00;
	/* Invalid data value. LLF arg#3[0] */
	switch (p_mpeg_out->null_data_value)
	{
		case PHANTOM_FIXED_NULL_DATA_LOW: break;
		case PHANTOM_FIXED_NULL_DATA_HIGH: data_output = 0x01; break;
		default: PHANTOM_DBG_SET_ERROR(PHANTOM_BAD_PARM); return(False);
	} 

    /* Invalid data mode: LLF arg#3[1] */
	switch (p_mpeg_out->null_data_mode)
	{
		case PHANTOM_FIXED_NULL_DATA_ENABLED:  data_output |= 0x02; break;
		case PHANTOM_FIXED_NULL_DATA_DISABLED: break;
		default: PHANTOM_DBG_SET_ERROR(PHANTOM_BAD_PARM); return(False);
	}  
  
	/* Insert sync byte (47h) mode: LLF arg#3[2] */
	switch(p_mpeg_out->insert_sync_byte)
	{	    
		case PHANTOM_SYNC_BYTE_INSERT: break;
		case PHANTOM_SYNC_BYTE_NOT_INSERT: data_output |= 0x04; break; // remove the sync byte
		default: PHANTOM_DBG_SET_ERROR(PHANTOM_BAD_PARM); return(False);
	}

	/* Serial mode output at RS_DATA0 or RS_DATA7: LLF arg#3[4] - bit3 is reserved */
	switch(p_mpeg_out->output_mode)
	{	    
		case PHANTOM_SERIAL_OUT_DATA0: data_output |= 0x10; break;
		case PHANTOM_SERIAL_OUT_DATA7: break; 
		default: break; // It is okay to break here.
	} 

    //------------------------------------------------------
    clock_configuration = 0x00;

	/* Invert clock mode. LLF arg#4[0] */
	switch(p_mpeg_out->invert_clk)
	{
		case PHANTOM_CHANGING_ON_RISING: break;
		case PHANTOM_CHANGING_ON_FALLING: clock_configuration = 0x01; break;
		default: PHANTOM_DBG_SET_ERROR(PHANTOM_BAD_PARM); return(False);
	}

    /* Shifted clock edge: LLF arg#4[1] */
	switch(p_mpeg_out->clk_out_edge)
	{
		case PHANTOM_CLKOUT_EDGE: break;
		case PHANTOM_CLKOUT_HOLD: clock_configuration |= 0x02; break;
		default: PHANTOM_DBG_SET_ERROR(PHANTOM_BAD_PARM); return(False);
	}  
   
    //------------------------------------------------------
    tstate_config = 0x00;

    /* MPEG tristate config: LLF arg#5[5:0] */
	switch(p_mpeg_out->tristate_config)
	{
		case PHANTOM_TSTATE_MPEG_OFF: break;
		case PHANTOM_TSTATE_MPEG_ON: tstate_config = 0x3F; break;
		default: PHANTOM_DBG_SET_ERROR(PHANTOM_BAD_PARM); return(False);
	}  

    //------------------------------------------------------
	/* Shadow the settings */
	memcpy(&p_nim->mpeg_out, p_mpeg_out, sizeof(PHANTOM_MPEG_OUT));

    if (p_mpeg_out->extra_clocks_between_packets != 0)
    {
        p_nim->mpeg_clock_rate_adjust = True;
    }
    else
    {
        p_nim->mpeg_clock_rate_adjust = False;
    }

	/* Call LLF to pass settings to firmware.*/
	if (PHANTOM_LLF_MPEGConfig( p_nim,
                        basic_settings,
                        mpeg_control_signal,
                        data_output,
                        clock_configuration,
                        tstate_config) == False)
	{
		return(False);
	}
	else
	{
		return(True);
	}
}  /* PHANTOM_SetOutputOptions() */


/*******************************************************************************************************
 * PHANTOM_GetSampleFrequency() 
 * function to read demod's current sample rate 
 *******************************************************************************************************/
BOOL           
PHANTOM_GetSampleFrequency(PHANTOM_NIM            *p_nim,        /* pointer to nim */
                       unsigned long  *p_sample_rate)/* returned sample rate */
{
    /* validate nim and mpeg storage */
	PHANTOM_DBG_VALIDATE_NIM(p_nim);

    /* return shadowed sample frequency */  

    *p_sample_rate = p_nim->sample_frequency;

    return (True);
}  /* PHANTOM_GetSampleFrequency() */



/*******************************************************************************************************

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?