📄 scrdrv.c
字号:
}
for(i=0; i<Instance->NbLnb; ++i)
{
Capability->SCRLNB_LO_Frequencies[i] = Instance->SCRLNB_LO_Frequencies[i];
}
}
else if(Instance->SCR_Mode == STTUNER_UBCHANGE)
{
/* make scr off*/
scr_scrdrv_Off (OpenParams, DemodHandle, Instance->SCRBPF);
Capability->SCR_Mode = STTUNER_UBCHANGE;
Capability->SCRBPF = Instance->SCRBPF;
Capability->Scr_App_Type = Instance->Scr_App_Type;
Capability->Number_of_SCR = Instance->NbScr;
Capability->Number_of_LNB = Instance->NbLnb;
Capability->LNBIndex = Instance->LNBIndex;
for(i=0; i<Instance->NbScr; ++i)
{
Capability->SCRBPFFrequencies[i] = Instance->SCRBPFFrequencies[i];
}
for(i=0; i<Instance->NbLnb; ++i)
{
Capability->SCRLNB_LO_Frequencies[i] = Instance->SCRLNB_LO_Frequencies[i];
}
}
}
/* finally (as nor more errors to check for, allocate handle */
Instance->TopLevelHandle = OpenParams->TopLevelHandle;
*Handle = (U32)Instance;
#ifdef STTUNER_DEBUG_MODULE_SATDRV_SCR
STTBX_Print(("%s opened ok\n", identity));
#endif
SEM_UNLOCK(Lock_InitTermOpenClose);
#endif
/******************************************MINIDRIVER*****************
************************************************************************
*************************************************************************/
#ifdef STTUNER_MINIDRIVER
/* now safe to lock semaphore */
SEM_LOCK(Lock_InitTermOpenClose);
/* check handle IS actually free */
if(SCRInstance->TopLevelHandle != STTUNER_MAX_HANDLES)
{
#ifdef STTUNER_DEBUG_MODULE_SATDRV_SCR
STTBX_Print(("%s fail driver instance already open\n", identity));
#endif
SEM_UNLOCK(Lock_InitTermOpenClose);
return(ST_ERROR_OPEN_HANDLE);
}
/* Check for free SCR, if not free return error*/
if(SCRInstance->SCR_Mode != STTUNER_SCR_MANUAL)
{
SEM_UNLOCK(Lock_InitTermOpenClose);
return ST_ERROR_FEATURE_NOT_SUPPORTED;
}
Capability->Number_of_SCR = SCRInstance->NbScr;
Capability->Number_of_LNB = SCRInstance->NbLnb;
for(i=0; i<SCRInstance->NbScr; ++i)
{
Capability->SCRBPFFrequencies[i] = SCRInstance->SCRBPFFrequencies[i];
}
for(i=0; i<SCRInstance->NbLnb; ++i)
{
Capability->SCRLNB_LO_Frequencies[i] = SCRInstance->SCRLNB_LO_Frequencies[i];
}
Capability->SCR_Mode = STTUNER_SCR_MANUAL;
Capability->LegacySupport = TRUE;
/* make scr1 off*/
scr_scrdrv_Off (OpenParams, DemodHandle, SCRInstance->SCRBPF);
/* finally (as nor more errors to check for, allocate handle */
SCRInstance->TopLevelHandle = OpenParams->TopLevelHandle;
*Handle = (U32)SCRInstance;
#ifdef STTUNER_DEBUG_MODULE_SATDRV_SCR
STTBX_Print(("%s opened ok\n", identity));
#endif
SEM_UNLOCK(Lock_InitTermOpenClose);
#endif
return(Error);
}
/* ----------------------------------------------------------------------------
Name: scr_scrdrv_Close()
Description:
Parameters:
Return Value:
---------------------------------------------------------------------------- */
ST_ErrorCode_t scr_scrdrv_Close(SCR_Handle_t Handle, SCR_CloseParams_t *CloseParams)
{
#ifdef STTUNER_DEBUG_MODULE_SATDRV_SCR
const char *identity = "STTUNER scr scr_scrdrv_Close()";
#endif
ST_ErrorCode_t Error = ST_NO_ERROR;
#ifndef STTUNER_MINIDRIVER
SCR_InstanceData_t *Instance;
/* private driver instance data */
Instance = SCR_GetInstFromHandle(Handle);
if(Installed == FALSE)
{
#ifdef STTUNER_DEBUG_MODULE_SATDRV_SCR
STTBX_Print(("%s fail driver not installed\n", identity));
#endif
return(STTUNER_ERROR_INITSTATE);
}
SEM_LOCK(Lock_InitTermOpenClose);
/* ---------- check that at least one init has taken place ---------- */
if(InstanceChainTop == NULL)
{
#ifdef STTUNER_DEBUG_MODULE_SATDRV_SCR
STTBX_Print(("%s fail nothing initalized\n", identity));
#endif
SEM_UNLOCK(Lock_InitTermOpenClose);
return(STTUNER_ERROR_INITSTATE);
}
if(Instance->TopLevelHandle == STTUNER_MAX_HANDLES)
{
#ifdef STTUNER_DEBUG_MODULE_SATDRV_SCR
STTBX_Print(("%s fail driver instance not open\n", identity));
#endif
SEM_UNLOCK(Lock_InitTermOpenClose);
return(ST_ERROR_OPEN_HANDLE);
}
Instance->TopLevelHandle = STTUNER_MAX_HANDLES;
#ifdef STTUNER_DEBUG_MODULE_SATDRV_SCR
STTBX_Print(("%s closed\n", identity));
#endif
SEM_UNLOCK(Lock_InitTermOpenClose);
#endif
#ifdef STTUNER_MINIDRIVER
SCRInstance->TopLevelHandle = STTUNER_MAX_HANDLES;
#endif
return(Error);
}
#ifndef STTUNER_MINIDRIVER
ST_ErrorCode_t scr_tone_enable_x(SCR_OpenParams_t *OpenParams, DEMOD_Handle_t DemodHandle, U32 ScrIndex,U32 ScrNb)
{
ST_ErrorCode_t Error = ST_NO_ERROR;
STTUNER_InstanceDbase_t *Inst;
U32 i=0;
Inst = STTUNER_GetDrvInst();
Error = scr_tone_enable(OpenParams, DemodHandle);
for(i=0;i<ScrNb;i++)
{
if(i!=ScrIndex)
{
scr_scrdrv_Off (OpenParams, DemodHandle, i);
}
}
return Error;
}
#endif
/* ----------------------------------------------------------------------------
Name: scr_scrdrv_IsLocked()
Description:
Checks the LK register i.e., are we demodulating a digital carrier.
Parameters:
IsLocked, pointer to area to store result (bool):
TRUE -- we are locked.
FALSE -- no lock.
Return Value:
---------------------------------------------------------------------------- */
ST_ErrorCode_t scr_scrdrv_IsLocked(SCR_Handle_t Handle, DEMOD_Handle_t DemodHandle, BOOL *IsLocked)
{
#ifdef STTUNER_DEBUG_MODULE_SATDRV_SCR
const char *identity = "STTUNER scr scr_scrdrv_IsLocked()";
#endif
ST_ErrorCode_t Error = ST_NO_ERROR;
/* read ststus through DiSEqC command->presently not supported*/
#ifdef STTUNER_DEBUG_MODULE_SATDRV_SCR
STTBX_Print(("%s IsLocked=%u\n", identity, *IsLocked));
#endif
return(Error);
}
#ifndef STTUNER_MINIDRIVER
/* ----------------------------------------------------------------------------
Name: SCR_GetInstFromHandle()
Description:
Get SCR Instance from SCR Handle
Parameters:
Handle -- SCR Handle
Return Value: Instance pointer
---------------------------------------------------------------------------- */
SCR_InstanceData_t *SCR_GetInstFromHandle(SCR_Handle_t Handle)
{
SCR_InstanceData_t *Instance;
Instance = (SCR_InstanceData_t *)Handle;
return(Instance);
}
#endif
/* ----------------------------------------------------------------------------
Name: scr_scrdrv_Off()
Description:
It's to put the SCR in off mode. Because during power on there are a lot of noise bands at the output.
Parameters:
OpenParams - To get the TopLevelHandle
DemodHandle -- Demod handle for DiSEqC operations.
LNBIndex -- LNB index number.
SCRBPF -- Which SCR to switch off.
Return Value:Error
---------------------------------------------------------------------------- */
ST_ErrorCode_t scr_scrdrv_Off (SCR_OpenParams_t *OpenParams, DEMOD_Handle_t DemodHandle, U8 SCRBPF)
{
STTUNER_DiSEqCSendPacket_t pDiSEqCSendPacket;
STTUNER_DiSEqCResponsePacket_t pDiSEqCResponsePacket;
LNB_Config_t LnbConfig;
ST_ErrorCode_t Error = ST_NO_ERROR;
unsigned char command_array[] = {0xE0, 0x10, 0x5A, 0x00, 0x00};
#ifndef STTUNER_MINIDRIVER
STTUNER_InstanceDbase_t *Inst;
Inst = STTUNER_GetDrvInst();
pDiSEqCSendPacket.DiSEqCCommandType = STTUNER_DiSEqC_COMMAND;
pDiSEqCSendPacket.uc_TotalNoOfBytes = 5;
command_array[3] |= (SCRBPF<<5);
pDiSEqCSendPacket.pFrmAddCmdData = &command_array[0];
pDiSEqCSendPacket.uc_msecBeforeNextCommand = 50;
LnbConfig.TopLevelHandle = OpenParams->TopLevelHandle;
LnbConfig.Status = LNB_STATUS_ON; /* Set the Satellite Dish LNB power to ON */
LnbConfig.Polarization = STTUNER_PLR_VERTICAL; /* Setup the Satellite Dish LNB Polarization */
LnbConfig.ToneState = STTUNER_LNB_TONE_OFF; /* Setup the require tone state */
/* Use semaphore not to distrub the SCR setting during DiSEqC- ST Commands */
SEM_LOCK(DiSEqC_Semaphore);
/* Invoke new configuration 13V*/
Error = (Inst[OpenParams->TopLevelHandle].Sat.Lnb.Driver->lnb_SetConfig)(Inst[OpenParams->TopLevelHandle].Sat.Lnb.DrvHandle, &LnbConfig);
/*18V*/
LnbConfig.Polarization = STTUNER_PLR_HORIZONTAL;
Error = (Inst[OpenParams->TopLevelHandle].Sat.Lnb.Driver->lnb_SetConfig)(Inst[OpenParams->TopLevelHandle].Sat.Lnb.DrvHandle, &LnbConfig);
task_delay(25 * (ST_GetClocksPerSecond() / 1000));
Error = (Inst[OpenParams->TopLevelHandle].Sat.Demod.Driver->demod_DiSEqC)(DemodHandle, &pDiSEqCSendPacket, &pDiSEqCResponsePacket );
task_delay(10 * (ST_GetClocksPerSecond() / 1000));
/*come back on 13V*/
LnbConfig.Polarization = STTUNER_PLR_VERTICAL;
Error = (Inst[OpenParams->TopLevelHandle].Sat.Lnb.Driver->lnb_SetConfig)(Inst[OpenParams->TopLevelHandle].Sat.Lnb.DrvHandle, &LnbConfig);
SEM_UNLOCK(DiSEqC_Semaphore);
#endif
/*****************************MINIDRIVER********************
*************************************************************
**************************************************************/
#ifdef STTUNER_MINIDRIVER
STTUNER_InstanceDbase_t *Inst;
Inst = STTUNER_GetDrvInst();
pDiSEqCSendPacket.DiSEqCCommandType = STTUNER_DiSEqC_COMMAND;
pDiSEqCSendPacket.uc_TotalNoOfBytes = 5;
command_array[3] = SCRBPF<<5;
pDiSEqCSendPacket.pFrmAddCmdData = &command_array[0];
pDiSEqCSendPacket.uc_msecBeforeNextCommand = 25;
LnbConfig.TopLevelHandle = OpenParams->TopLevelHandle;
LnbConfig.Status = LNB_STATUS_ON; /* Set the Satellite Dish LNB power to ON */
LnbConfig.Polarization = STTUNER_PLR_VERTICAL; /* Setup the Satellite Dish LNB Polarization */
LnbConfig.ToneState = STTUNER_LNB_TONE_OFF; /* Setup the require tone state */
/* Use semaphore not to distrub the SCR setting during DiSEqC- ST Commands */
SEM_LOCK(DiSEqC_Semaphore);
#ifdef STTUNER_DRV_SAT_STV0299
/* Invoke new configuration 13V*/
#ifdef STTUNER_DRV_SAT_LNB21
Error = lnb_lnb21_SetConfig(&LnbConfig);
#elif defined STTUNER_DRV_SAT_LNBH21
Error = lnb_lnbh21_SetConfig(&LnbConfig);
#else
Error = lnb_l0299_SetConfig(Inst[OpenParams->TopLevelHandle].Sat.Lnb.DrvHandle, &LnbConfig);
#endif
/*18V*/
LnbConfig.Polarization = STTUNER_PLR_HORIZONTAL;
#ifdef STTUNER_DRV_SAT_LNB21
Error = lnb_lnb21_SetConfig(&LnbConfig);
#elif defined STTUNER_DRV_SAT_LNBH21
Error = lnb_lnbh21_SetConfig(&LnbConfig);
#else
lnb_l0299_SetConfig(Inst[OpenParams->TopLevelHandle].Sat.Lnb.DrvHandle, &LnbConfig);
#endif
task_delay(10 * (ST_GetClocksPerSecond() / 1000));
Error = demod_d0299_DiSEqC(DemodHandle, &pDiSEqCSendPacket, &pDiSEqCResponsePacket );
task_delay(2 * (ST_GetClocksPerSecond() / 1000));
/*come back on 13V*/
LnbConfig.Polarization = STTUNER_PLR_VERTICAL;
#ifdef STTUNER_DRV_SAT_LNB21
Error = lnb_lnb21_SetConfig(&LnbConfig);
#elif defined STTUNER_DRV_SAT_LNBH21
Error = lnb_lnbh21_SetConfig(&LnbConfig);
#else
Error = lnb_l0299_SetConfig(Inst[OpenParams->TopLevelHandle].Sat.Lnb.DrvHandle, &LnbConfig);
#endif
#endif
#if defined(STTUNER_DRV_SAT_STV0399) || defined(STTUNER_DRV_SAT_STV0399E)
/* Invoke new configuration 13V*/
#ifdef STTUNER_DRV_SAT_LNB21
Error = lnb_lnb21_SetConfig(&LnbConfig);
#elif defined STTUNER_DRV_SAT_LNBH21
Error = lnb_lnbh21_SetConfig(&LnbConfig);
#else
Error = lnb_l0399_SetConfig(Inst[OpenParams->TopLevelHandle].Sat.Lnb.DrvHandle, &LnbConfig);
#endif
/*18V*/
LnbConfig.Polarization = STTUNER_PLR_HORIZONTAL;
#ifdef STTUNER_DRV_SAT_LNB21
Error = lnb_lnb21_SetConfig(&LnbConfig);
#elif defined STTUNER_DRV_SAT_LNBH21
Error = lnb_lnbh21_SetConfig(&LnbConfig);
#else
lnb_l0399_SetConfig(Inst[OpenParams->TopLevelHandle].Sat.Lnb.DrvHandle, &LnbConfig);
#endif
task_delay(10 * (ST_GetClocksPerSecond() / 1000));
Error = demod_d0399_DiSEqC(DemodHandle, &pDiSEqCSendPacket, &pDiSEqCResponsePacket );
task_delay(2 * (ST_GetClocksPerSecond() / 1000));
/*come back on 13V*/
LnbConfig.Polarization = STTUNER_PLR_VERTICAL;
#ifdef STTUNER_DRV_SAT_LNB21
Error = lnb_lnb21_SetConfig(&LnbConfig);
#elif defined STTUNER_DRV_SAT_LNBH21
Error = lnb_lnbh21_SetConfig(&LnbConfig);
#else
Error = lnb_l0399_SetConfig(Inst[OpenParams->TopLevelHandle].Sat.Lnb.DrvHandle, &LnbConfig);
#endif
#endif
SEM_UNLOCK(DiSEqC_Semaphore);
#endif
return(Error);
}
#ifndef STTUNER_MINIDRIVER
ST_ErrorCode_t scr_tone_enable(SCR_OpenParams_t *OpenParams, DEMOD_Handle_t DemodHandle)
{
STTUNER_DiSEqCSendPacket_t pDiSEqCSendPacket;
STTUNER_DiSEqCResponsePacket_t pDiSEqCResponsePacket;
LNB_Config_t LnbConfig;
ST_ErrorCode_t Error = ST_NO_ERROR;
unsigned char command_array [5] = {0xE0, 0x10, 0x5B, 0x00, 0x00};/* E0(Framing) 10/11(address) 5A/5B(command) data1(Sub_func = 0) data2 = 00*/
STTUNER_InstanceDbase_t *Inst;
Inst = STTUNER_GetDrvInst();
pDiSEqCSendPacket.DiSEqCCommandType = STTUNER_DiSEqC_COMMAND;
pDiSEqCSendPacket.uc_TotalNoOfBytes = 5;
LnbConfig.TopLevelHandle = OpenParams->TopLevelHandle;
LnbConfig.Status = LNB_STATUS_ON; /* Set the Satellite Dish LNB power to ON */
LnbConfig.Polarization = STTUNER_PLR_VERTICAL; /* Setup the Satellite Dish LNB Polarization */
LnbConfig.ToneState = STTUNER_LNB_TONE_OFF; /* Setup the require tone state */
pDiSEqCSendPacket.uc_msecBeforeNextCommand = 50;
pDiSEqCSendPacket.pFrmAddCmdData = &command_array[0];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -