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 + -
显示快捷键?