📄 hrlnb0299.c
字号:
#include <intrins.h> /* include _nop_() */
#include <reg390.h>
#include "hrtuner.h"
#if TUNER_FE_TYPE == TUNER_FE_STV0299
#include "tunerreg0299map.h"
#include "hri2c.h"
#include "hros.h"
#include "tunerreg0299.h"
#include "hros.h"
#include "hrpio.h"
#define LNB_ENABLE ((unsigned char)GPIO2)
#define LNB_13V_18V ((unsigned char)GPIO3)
static OS_EVENT *LNB_access = (HR_VOID *)0;
static LNB_Status_t LNB_Statue = 0;
static unsigned long LnbEnableHandle, Lnb1318vHandle;
LNB_Status_t L0299_GetLnbStatus(void) TUNERFUNCPOSTFIX
{
return LNB_Statue;
}
void L0299_WaitDiseqcIdle(unsigned char timeout) TUNERFUNCPOSTFIX
{
unsigned char i = 0;
while(HRI2c_GetOneRegister(STV0299_I2C_ADDRESS, R0299_DISEQCSTATUS) & 0x03 != 2)
{
TimeDelay(1);
if(i++ > timeout) break;
}
}
void L0299_WaitDiseqcFifo(unsigned char timeout) TUNERFUNCPOSTFIX
{
unsigned char i = 0;
while(HRI2c_GetOneRegister(STV0299_I2C_ADDRESS, R0299_DISEQCSTATUS) & 0x01)
{
TimeDelay(1);
if(i++ > timeout) break;
}
}
unsigned char L0299_SendDiseqcBurst(DISEQC_Minicmd_t burst) TUNERFUNCPOSTFIX
{
unsigned char val;
TimeDelay(16);
val = HRI2c_GetOneRegister(STV0299_I2C_ADDRESS, R0299_DISEQC);
HRI2c_RegisterSetField(STV0299_I2C_ADDRESS, R0299_DISEQC, 2, 3, 0x02); /* burst mode */
TimeDelay(16);
HRI2c_SetOneRegister(STV0299_I2C_ADDRESS, R0299_DISEQCFIFO, ((burst == SEC_MINI_A) ? 0x00 : 0xff));
TimeDelay(16);
HRI2c_SetOneRegister(STV0299_I2C_ADDRESS, R0299_DISEQC, val);
return FALSE;
}
unsigned char L0299_SendDiseqcMessage(DISEQC_MasterCommand_t *message) TUNERFUNCPOSTFIX
{
unsigned char i;
TimeDelay(16);
HRI2c_RegisterSetField(STV0299_I2C_ADDRESS, R0299_DISEQC, 2, 3, 0x06); /* DiSEqC mode */
HRI2c_RegisterSetField(STV0299_I2C_ADDRESS, R0299_DISEQC, 5, 1, 0x00);
for(i = 0; i < message->MessageLength; i++)
{
L0299_WaitDiseqcFifo(15);
HRI2c_SetOneRegister(STV0299_I2C_ADDRESS, R0299_DISEQCFIFO, message->DiseqcMessage[i]);
}
TimeDelay(16);
return FALSE;
}
void L0299_DiseqcCommand(DISEQC_FramingByte_t fb, DISEQC_AddressByte_t ab, DISEQC_CommandByte_t cb, unsigned char diseqc_data) TUNERFUNCPOSTFIX
{
DISEQC_MasterCommand_t command;
command.DiseqcMessage[0] = (unsigned char)fb;
command.DiseqcMessage[1] = (unsigned char)ab;
command.DiseqcMessage[2] = (unsigned char)cb & 0x7f;
if((unsigned char)cb & 0x80)
{
command.DiseqcMessage[3] = diseqc_data;
command.MessageLength = 4;
}
else
{
command.MessageLength = 3;
}
L0299_SendDiseqcMessage(&command);
}
unsigned char LNB_Ioctl(LNB_API_Command_t cmd, unsigned char arg) TUNERFUNCPOSTFIX
{
HR_OS_Obtain_Semaphore(LNB_access);
if(cmd == LNB_API_POWER_ON)
{
LNB_Statue |= (unsigned char)STATUS_POWER_ON_OFF;
HRPio_Clear(LnbEnableHandle);
}
else if(cmd == LNB_API_POWER_OFF)
{
LNB_Statue &= ~((unsigned char)STATUS_POWER_ON_OFF);
HRPio_Set(LnbEnableHandle);
}
else if(cmd == LNB_API_VERTICAL)
{
LNB_Statue |= (unsigned char)STATUS_POWER_13V_18V;
HRPio_Set(Lnb1318vHandle);
}
else if(cmd == LNB_API_HORIZONTAL)
{
LNB_Statue &= ~((unsigned char)STATUS_POWER_13V_18V);
HRPio_Clear(Lnb1318vHandle);
}
else if(cmd == DISEQC_API_TONE_ON)
{
LNB_Statue |= (unsigned char)STATUS_TONE_ON_OFF;
TimeDelay(16);
HRI2c_RegisterSetField(STV0299_I2C_ADDRESS, R0299_DISEQC, 1, 2, 0x03);
}
else if(cmd == DISEQC_API_TONE_OFF)
{
LNB_Statue &= ~((unsigned char)STATUS_TONE_ON_OFF);
TimeDelay(16);
HRI2c_RegisterSetField(STV0299_I2C_ADDRESS, R0299_DISEQC, 1, 2, 0x02);
}
else if(cmd == LNB_API_LOW_BAND)
{
LNB_Statue &= ~((unsigned char)STATUS_BAND_HIGH_LOW);
}
else if(cmd == LNB_API_HIGH_BAND)
{
LNB_Statue |= (unsigned char)STATUS_BAND_HIGH_LOW;
}
else if(cmd == DISEQC_API_LNB_1)
{
/* 0xf0 ~ 0xf3: LNB1 */
/* 0xf4 ~ 0xf7: LNB2 */
/* 0xf8 ~ 0xfb: LNB3 */
/* 0xfc ~ 0xff: LNB4 */
LNB_Statue |= (unsigned char)STATUS_LNB_PORT_A;
LNB_Statue &= ~((unsigned char)STATUS_LNB_PORT_B);
LNB_Statue &= ~((unsigned char)STATUS_LNB_PORT_C);
LNB_Statue &= ~((unsigned char)STATUS_LNB_PORT_D);
if((LNB_Statue & STATUS_POWER_13V_18V) && (!(LNB_Statue & STATUS_BAND_HIGH_LOW))) /* V-Lo */
{
arg = 0;
}
else if((LNB_Statue & STATUS_POWER_13V_18V) && (LNB_Statue & STATUS_BAND_HIGH_LOW)) /* V-Hi */
{
arg = 1;
}
else if((!(LNB_Statue & STATUS_POWER_13V_18V)) && (!(LNB_Statue &STATUS_BAND_HIGH_LOW))) /* H-Lo */
{
arg = 2;
}
else if((!(LNB_Statue & STATUS_POWER_13V_18V)) && (LNB_Statue & STATUS_BAND_HIGH_LOW)) /* H-Hi */
{
arg = 3;
}
L0299_DiseqcCommand(DISEQC_FRAME0, ANY_LNB, DISEQC_WRITE_N0, 0xf0 | arg);
TimeDelay(30);
}
else if(cmd == DISEQC_API_LNB_2)
{
LNB_Statue &= ~((unsigned char)STATUS_LNB_PORT_A);
LNB_Statue |= (unsigned char)STATUS_LNB_PORT_B;
LNB_Statue &= ~((unsigned char)STATUS_LNB_PORT_C);
LNB_Statue &= ~((unsigned char)STATUS_LNB_PORT_D);
if((LNB_Statue & STATUS_POWER_13V_18V) && (!(LNB_Statue &STATUS_BAND_HIGH_LOW)))
{
arg = 0;
}
else if((LNB_Statue & STATUS_POWER_13V_18V) && (LNB_Statue & STATUS_BAND_HIGH_LOW))
{
arg = 1;
}
else if((!(LNB_Statue & STATUS_POWER_13V_18V)) && (!(LNB_Statue &STATUS_BAND_HIGH_LOW)))
{
arg = 2;
}
else if((!(LNB_Statue & STATUS_POWER_13V_18V)) && (LNB_Statue & STATUS_BAND_HIGH_LOW))
{
arg = 3;
}
L0299_DiseqcCommand(DISEQC_FRAME0, ANY_LNB, DISEQC_WRITE_N0, 0xf0 | 0x04 | arg);
TimeDelay(30);
}
else if(cmd == DISEQC_API_LNB_3)
{
LNB_Statue &= ~((unsigned char)STATUS_LNB_PORT_A);
LNB_Statue &= ~((unsigned char)STATUS_LNB_PORT_B);
LNB_Statue |= (unsigned char)STATUS_LNB_PORT_C;
LNB_Statue &= ~((unsigned char)STATUS_LNB_PORT_D);
if((LNB_Statue & STATUS_POWER_13V_18V) && (!(LNB_Statue &STATUS_BAND_HIGH_LOW)))
{
arg = 0;
}
else if((LNB_Statue & STATUS_POWER_13V_18V) && (LNB_Statue & STATUS_BAND_HIGH_LOW))
{
arg = 1;
}
else if((!(LNB_Statue & STATUS_POWER_13V_18V)) && (!(LNB_Statue &STATUS_BAND_HIGH_LOW)))
{
arg = 2;
}
else if((!(LNB_Statue & STATUS_POWER_13V_18V)) && (LNB_Statue & STATUS_BAND_HIGH_LOW))
{
arg = 3;
}
L0299_DiseqcCommand(DISEQC_FRAME0, ANY_LNB, DISEQC_WRITE_N0, 0xf0 | 0x08 | arg);
TimeDelay(30);
}
else if(cmd == DISEQC_API_LNB_4)
{
LNB_Statue &= ~((unsigned char)STATUS_LNB_PORT_A);
LNB_Statue &= ~((unsigned char)STATUS_LNB_PORT_B);
LNB_Statue &= ~((unsigned char)STATUS_LNB_PORT_C);
LNB_Statue |= (unsigned char)STATUS_LNB_PORT_D;
if((LNB_Statue & STATUS_POWER_13V_18V) && (!(LNB_Statue &STATUS_BAND_HIGH_LOW)))
{
arg = 0;
}
else if((LNB_Statue & STATUS_POWER_13V_18V) && (LNB_Statue & STATUS_BAND_HIGH_LOW))
{
arg = 1;
}
else if((!(LNB_Statue & STATUS_POWER_13V_18V)) && (!(LNB_Statue &STATUS_BAND_HIGH_LOW)))
{
arg = 2;
}
else if((!(LNB_Statue & STATUS_POWER_13V_18V)) && (LNB_Statue & STATUS_BAND_HIGH_LOW))
{
arg = 3;
}
L0299_DiseqcCommand(DISEQC_FRAME0, ANY_LNB, DISEQC_WRITE_N0, 0xf0 | 0x0c | arg);
TimeDelay(30);
}
else if(cmd == DISEQC_API_BURST_A)
{
L0299_SendDiseqcBurst(SEC_MINI_A);
}
else if(cmd == DISEQC_API_BURST_B)
{
L0299_SendDiseqcBurst(SEC_MINI_B);
}
else if(cmd == DISEQC_API_LIMIT_OFF)
{
L0299_WaitDiseqcIdle(15);
L0299_DiseqcCommand(DISEQC_FRAME0, POLAR_AZIMUTH_POSITIONER, DISEQC_LIMITS_OFF, arg);
TimeDelay(40);
L0299_DiseqcCommand(DISEQC_FRAME0, POLAR_AZIMUTH_POSITIONER, DISEQC_LIMITS_OFF, arg);
}
else if(cmd == DISEQC_API_SET_EAST_LIMIT)
{
L0299_WaitDiseqcIdle(15);
L0299_DiseqcCommand(DISEQC_FRAME0, POLAR_AZIMUTH_POSITIONER, DISEQC_LIMIT_EAST, arg);
TimeDelay(40);
L0299_DiseqcCommand(DISEQC_FRAME0, POLAR_AZIMUTH_POSITIONER, DISEQC_LIMIT_EAST, arg);
}
else if(cmd == DISEQC_API_SET_WEST_LIMIT)
{
L0299_WaitDiseqcIdle(15);
L0299_DiseqcCommand(DISEQC_FRAME0, POLAR_AZIMUTH_POSITIONER, DISEQC_LIMIT_WEST, arg);
TimeDelay(40);
L0299_DiseqcCommand(DISEQC_FRAME0, POLAR_AZIMUTH_POSITIONER, DISEQC_LIMIT_WEST, arg);
}
else if(cmd == DISEQC_API_HALT_MOTER)
{
L0299_WaitDiseqcIdle(15);
L0299_DiseqcCommand(DISEQC_FRAME0, POLAR_AZIMUTH_POSITIONER, DISEQC_HALT, arg);
TimeDelay(40);
L0299_DiseqcCommand(DISEQC_FRAME0, POLAR_AZIMUTH_POSITIONER, DISEQC_HALT, arg);
}
else if(cmd == DISEQC_API_DRIVE_EAST)
{
if(arg & 0x80)
{
L0299_WaitDiseqcIdle(15);
L0299_DiseqcCommand(DISEQC_FRAME0, POLAR_AZIMUTH_POSITIONER, DISEQC_DRIVE_EAST, arg);
if(arg != 0xff)
{
TimeDelay(40);
L0299_DiseqcCommand(DISEQC_FRAME0, POLAR_AZIMUTH_POSITIONER, DISEQC_DRIVE_EAST, arg);
}
}
else
{
L0299_WaitDiseqcIdle(15);
L0299_DiseqcCommand(DISEQC_FRAME0, POLAR_AZIMUTH_POSITIONER, DISEQC_DRIVE_EAST, arg);
TimeDelay(40);
L0299_DiseqcCommand(DISEQC_FRAME0, POLAR_AZIMUTH_POSITIONER, DISEQC_DRIVE_EAST, arg);
OSTimeDly(OS_TICKS_PER_SEC * arg);
L0299_WaitDiseqcIdle(15);
L0299_DiseqcCommand(DISEQC_FRAME0, POLAR_AZIMUTH_POSITIONER, DISEQC_HALT, 0);
TimeDelay(40);
L0299_DiseqcCommand(DISEQC_FRAME0, POLAR_AZIMUTH_POSITIONER, DISEQC_HALT, 0);
}
}
else if(cmd == DISEQC_API_DRIVE_WEST)
{
if(arg & 0x80)
{
L0299_WaitDiseqcIdle(15);
L0299_DiseqcCommand(DISEQC_FRAME0, POLAR_AZIMUTH_POSITIONER, DISEQC_DRIVE_WEST, arg);
if(arg != 0xff)
{
TimeDelay(40);
L0299_DiseqcCommand(DISEQC_FRAME0, POLAR_AZIMUTH_POSITIONER, DISEQC_DRIVE_WEST, arg);
}
}
else
{
L0299_WaitDiseqcIdle(15);
L0299_DiseqcCommand(DISEQC_FRAME0, POLAR_AZIMUTH_POSITIONER, DISEQC_DRIVE_EAST, arg);
TimeDelay(40);
L0299_DiseqcCommand(DISEQC_FRAME0, POLAR_AZIMUTH_POSITIONER, DISEQC_DRIVE_EAST, arg);
OSTimeDly(OS_TICKS_PER_SEC * arg);
L0299_WaitDiseqcIdle(15);
L0299_DiseqcCommand(DISEQC_FRAME0, POLAR_AZIMUTH_POSITIONER, DISEQC_HALT, 0);
TimeDelay(40);
L0299_DiseqcCommand(DISEQC_FRAME0, POLAR_AZIMUTH_POSITIONER, DISEQC_HALT, 0);
}
}
else if(cmd == DISEQC_API_GOTO_SAT_NUM)
{
L0299_WaitDiseqcIdle(15);
L0299_DiseqcCommand(DISEQC_FRAME0, POLAR_AZIMUTH_POSITIONER, DISEQC_GOTO_NN, arg);
TimeDelay(40);
L0299_DiseqcCommand(DISEQC_FRAME0, POLAR_AZIMUTH_POSITIONER, DISEQC_GOTO_NN, arg);
}
else if(cmd == DISEQC_API_STORE_SAT_NUM)
{
L0299_WaitDiseqcIdle(15);
L0299_DiseqcCommand(DISEQC_FRAME0, POLAR_AZIMUTH_POSITIONER, DISEQC_STORE_NN, arg);
TimeDelay(40);
L0299_DiseqcCommand(DISEQC_FRAME0, POLAR_AZIMUTH_POSITIONER, DISEQC_STORE_NN, arg);
}
else if(cmd == DISEQC_API_RECALCULATE)
{
L0299_WaitDiseqcIdle(15);
L0299_DiseqcCommand(DISEQC_FRAME0, POLAR_AZIMUTH_POSITIONER, DISEQC_SET_POSNS, arg);
TimeDelay(40);
L0299_DiseqcCommand(DISEQC_FRAME0, POLAR_AZIMUTH_POSITIONER, DISEQC_SET_POSNS, arg);
}
else if(cmd == DISEQC_API_GOTO_REFERENCE)
{
L0299_WaitDiseqcIdle(15);
L0299_DiseqcCommand(DISEQC_FRAME0, POLAR_AZIMUTH_POSITIONER, DISEQC_GOTO_NN, 0x00);
TimeDelay(40);
L0299_DiseqcCommand(DISEQC_FRAME0, POLAR_AZIMUTH_POSITIONER, DISEQC_GOTO_NN, 0x00);
}
else
{
HR_OS_Release_Semaphore(LNB_access);
return TRUE;
}
HR_OS_Release_Semaphore(LNB_access);
return FALSE;
}
void L0299_ResumeCurrentStatus(void) TUNERFUNCPOSTFIX
{
if(LNB_Statue == 0)
{
return;
}
if(LNB_Statue & (unsigned char)STATUS_POWER_ON_OFF)
{
LNB_Ioctl(LNB_API_POWER_ON, 0);
}
if(LNB_Statue & (unsigned char)STATUS_LNB_PORT_A)
{
LNB_Ioctl(DISEQC_API_LNB_1, 0);
}
if(LNB_Statue & (unsigned char)STATUS_LNB_PORT_B)
{
LNB_Ioctl(DISEQC_API_LNB_2, 0);
}
if(LNB_Statue & (unsigned char)STATUS_LNB_PORT_C)
{
LNB_Ioctl(DISEQC_API_LNB_3, 0);
}
if(LNB_Statue & (unsigned char)STATUS_LNB_PORT_D)
{
LNB_Ioctl(DISEQC_API_LNB_4, 0);
}
if(LNB_Statue & (unsigned char)STATUS_TONE_ON_OFF)
{
LNB_Ioctl(DISEQC_API_TONE_ON, 0);
}
else
{
LNB_Ioctl(DISEQC_API_TONE_OFF, 0);
}
}
unsigned char L0299_Init(void) TUNERFUNCPOSTFIX
{
unsigned char tmp;
unsigned char arg = 0;
if(HRPio_Open(PIO_PORT_5_BIT_6, PIO_BIT_3STATE_OUTPUT, &LnbEnableHandle) != PIO_NO_ERROR)
{
return TRUE;
}
if(HRPio_Open(PIO_PORT_5_BIT_7, PIO_BIT_3STATE_OUTPUT, &Lnb1318vHandle) != PIO_NO_ERROR)
{
HRPio_Close(LnbEnableHandle);
return TRUE;
}
LNB_access = HR_OS_Create_Semaphore(1, HR_OPTION_SEM_GENERAL);
LNB_Ioctl(LNB_API_POWER_ON, arg);
LNB_Ioctl(LNB_API_HORIZONTAL, arg);
tmp = Reg0299_RegGetVCOFreq() / 128 / 22000;
HRI2c_SetOneRegister(STV0299_I2C_ADDRESS, R0299_F22FR, tmp);
if(Reg0299_RegGetF22Freq() != 22000)
{
return TRUE;
}
LNB_Ioctl(DISEQC_API_TONE_ON, arg);
return FALSE;
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -