⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hrlnb0299.c

📁 0299的的驱动程序
💻 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 + -