提交SMOD ATSC IMX APP版本 V122

This commit is contained in:
2026-07-16 14:35:59 +08:00
commit 7601c270d5
485 changed files with 255032 additions and 0 deletions
@@ -0,0 +1,605 @@
/*------------------------------------------------------------------------------
Copyright 2016-2017 Sony Semiconductor Solutions Corporation
Last Updated : 2017/11/30
Modification ID : 253a4918e2da2cf28a9393596fa16f25024e504d
------------------------------------------------------------------------------*/
#include "sony_common.h"
#include "sony_lnbc.h"
#include "allegro_a8290.h"
/*----------------------------------------------------------------------------
Static Functions
----------------------------------------------------------------------------*/
static sony_result_t create_1st_byte (sony_lnbc_t * pLnbc,
sony_lnbc_transmit_mode_t transmitMode,
sony_lnbc_tone_t tone,
uint8_t * pData);
static sony_result_t create_2nd_byte (sony_lnbc_t * pLnbc,
uint8_t isEnable,
sony_lnbc_voltage_t voltage,
uint8_t * pData);
static sony_result_t allegro_a8290_Initialize (sony_lnbc_t * pLnbc);
static sony_result_t allegro_a8290_SetConfig (sony_lnbc_t * pLnbc,
sony_lnbc_config_id_t configId,
int32_t value);
static sony_result_t allegro_a8290_SetVoltage (sony_lnbc_t * pLnbc,
sony_lnbc_voltage_t voltage);
static sony_result_t allegro_a8290_SetTone (sony_lnbc_t * pLnbc,
sony_lnbc_tone_t tone);
static sony_result_t allegro_a8290_SetTransmitMode (sony_lnbc_t * pLnbc,
sony_lnbc_transmit_mode_t mode);
static sony_result_t allegro_a8290_Sleep (sony_lnbc_t * pLnbc);
static sony_result_t allegro_a8290_WakeUp (sony_lnbc_t * pLnbc);
static sony_result_t allegro_a8290_GetDiagStatus (sony_lnbc_t * pLnbc,
uint32_t * pStatus,
uint32_t * pStatusSupported);
/*----------------------------------------------------------------------------
Functions
----------------------------------------------------------------------------*/
sony_result_t allegro_a8290_Create (sony_lnbc_t * pLnbc,
uint8_t i2cAddress,
sony_i2c_t * pI2c)
{
SONY_TRACE_ENTER ("allegro_a8290_Create");
if ((!pLnbc) || (!pI2c)){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
pLnbc->i2cAddress = i2cAddress;
pLnbc->pI2c = pI2c;
pLnbc->Initialize = allegro_a8290_Initialize;
pLnbc->SetConfig = allegro_a8290_SetConfig;
pLnbc->SetVoltage = allegro_a8290_SetVoltage;
pLnbc->SetTone = allegro_a8290_SetTone;
pLnbc->SetTransmitMode = allegro_a8290_SetTransmitMode;
pLnbc->Sleep = allegro_a8290_Sleep;
pLnbc->WakeUp = allegro_a8290_WakeUp;
pLnbc->GetDiagStatus = allegro_a8290_GetDiagStatus;
pLnbc->isInternalTone = 0;
pLnbc->lowVoltage = ALLEGRO_A8290_CONFIG_VOLTAGE_LOW_13_042V; /* Default value */
pLnbc->highVoltage = ALLEGRO_A8290_CONFIG_VOLTAGE_HIGH_18_042V; /* Default value */
pLnbc->state = SONY_LNBC_STATE_UNKNOWN;
pLnbc->voltage = SONY_LNBC_VOLTAGE_LOW;
pLnbc->tone = SONY_LNBC_TONE_AUTO;
pLnbc->transmitMode = SONY_LNBC_TRANSMIT_MODE_TX;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
static sony_result_t allegro_a8290_Initialize (sony_lnbc_t * pLnbc)
{
uint8_t data = 0;
sony_result_t result = SONY_RESULT_OK;
SONY_TRACE_ENTER ("allegro_a8290_Initialize");
if (!pLnbc){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
pLnbc->state = SONY_LNBC_STATE_UNKNOWN;
pLnbc->voltage = SONY_LNBC_VOLTAGE_LOW;
if (pLnbc->tone != SONY_LNBC_TONE_AUTO) {
pLnbc->tone = SONY_LNBC_TONE_OFF;
}
if (pLnbc->transmitMode != SONY_LNBC_TRANSMIT_MODE_AUTO) {
pLnbc->transmitMode = SONY_LNBC_TRANSMIT_MODE_TX;
}
/* Read once */
if (pLnbc->pI2c->Read(pLnbc->pI2c, pLnbc->i2cAddress, &data, 1, SONY_I2C_START_EN|SONY_I2C_STOP_EN) != SONY_RESULT_OK){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
/* 1st byte */
result = create_1st_byte (pLnbc, pLnbc->transmitMode, pLnbc->tone, &data);
if (result != SONY_RESULT_OK){SONY_TRACE_RETURN(result);}
if (pLnbc->pI2c->Write(pLnbc->pI2c, pLnbc->i2cAddress, &data, 1, SONY_I2C_START_EN|SONY_I2C_STOP_EN) != SONY_RESULT_OK){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
/* 2nd byte */
result = create_2nd_byte (pLnbc, 0, pLnbc->voltage, &data);
if (result != SONY_RESULT_OK){SONY_TRACE_RETURN(result);}
if (pLnbc->pI2c->Write(pLnbc->pI2c, pLnbc->i2cAddress, &data, 1, SONY_I2C_START_EN|SONY_I2C_STOP_EN) != SONY_RESULT_OK){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
pLnbc->state = SONY_LNBC_STATE_SLEEP;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
static sony_result_t allegro_a8290_SetConfig (sony_lnbc_t * pLnbc,
sony_lnbc_config_id_t configId,
int32_t value)
{
sony_result_t result = SONY_RESULT_OK;
SONY_TRACE_ENTER ("allegro_a8290_SetConfig");
if (!pLnbc){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
if ((pLnbc->state != SONY_LNBC_STATE_ACTIVE) &&
(pLnbc->state != SONY_LNBC_STATE_SLEEP)) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_SW_STATE);
}
switch(configId)
{
case SONY_LNBC_CONFIG_ID_TONE_INTERNAL:
if((value != 0) && (value != 1)){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_RANGE);
} else {
pLnbc->isInternalTone = value;
result = allegro_a8290_SetTone (pLnbc, pLnbc->tone);
if (result != SONY_RESULT_OK){
SONY_TRACE_RETURN (result);
}
}
break;
case SONY_LNBC_CONFIG_ID_LOW_VOLTAGE:
if ((value != ALLEGRO_A8290_CONFIG_VOLTAGE_LOW_13_042V) &&
(value != ALLEGRO_A8290_CONFIG_VOLTAGE_LOW_14_042V)){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_RANGE);
} else {
pLnbc->lowVoltage = value;
result = allegro_a8290_SetVoltage (pLnbc, pLnbc->voltage);
if (result != SONY_RESULT_OK){
SONY_TRACE_RETURN (result);
}
}
break;
case SONY_LNBC_CONFIG_ID_HIGH_VOLTAGE:
if ((value != ALLEGRO_A8290_CONFIG_VOLTAGE_HIGH_18_042V) &&
(value != ALLEGRO_A8290_CONFIG_VOLTAGE_HIGH_19_042V)){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_RANGE);
} else {
pLnbc->highVoltage = value;
result = allegro_a8290_SetVoltage (pLnbc, pLnbc->voltage);
if (result != SONY_RESULT_OK){
SONY_TRACE_RETURN (result);
}
}
break;
default:
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
static sony_result_t allegro_a8290_SetVoltage (sony_lnbc_t * pLnbc,
sony_lnbc_voltage_t voltage)
{
sony_result_t result = SONY_RESULT_OK;
uint8_t data = 0;
SONY_TRACE_ENTER ("allegro_a8290_SetVoltage");
if (!pLnbc){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
if ((pLnbc->state != SONY_LNBC_STATE_ACTIVE) &&
(pLnbc->state != SONY_LNBC_STATE_SLEEP)) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_SW_STATE);
}
/* 2nd byte */
result = create_2nd_byte (pLnbc, 1, voltage, &data);
if (result != SONY_RESULT_OK){SONY_TRACE_RETURN(result);}
if (pLnbc->state == SONY_LNBC_STATE_ACTIVE) {
if (pLnbc->pI2c->Write(pLnbc->pI2c, pLnbc->i2cAddress, &data, 1, SONY_I2C_START_EN|SONY_I2C_STOP_EN) != SONY_RESULT_OK){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
}
pLnbc->voltage = voltage;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
static sony_result_t allegro_a8290_SetTone (sony_lnbc_t * pLnbc,
sony_lnbc_tone_t tone)
{
sony_result_t result = SONY_RESULT_OK;
uint8_t data = 0;
SONY_TRACE_ENTER ("allegro_a8290_SetTone");
if (!pLnbc){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
if ((pLnbc->state != SONY_LNBC_STATE_ACTIVE) &&
(pLnbc->state != SONY_LNBC_STATE_SLEEP)) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_SW_STATE);
}
/* 1st byte */
result = create_1st_byte (pLnbc, pLnbc->transmitMode, tone, &data);
if (result != SONY_RESULT_OK){SONY_TRACE_RETURN(result);}
if (pLnbc->state == SONY_LNBC_STATE_ACTIVE) {
if (pLnbc->pI2c->Write(pLnbc->pI2c, pLnbc->i2cAddress, &data, 1, SONY_I2C_START_EN|SONY_I2C_STOP_EN) != SONY_RESULT_OK){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
}
pLnbc->tone = tone;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
static sony_result_t allegro_a8290_SetTransmitMode (sony_lnbc_t * pLnbc,
sony_lnbc_transmit_mode_t mode)
{
sony_result_t result = SONY_RESULT_OK;
uint8_t data = 0;
SONY_TRACE_ENTER ("allegro_a8290_SetTransmitMode");
if (!pLnbc){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
if ((pLnbc->state != SONY_LNBC_STATE_ACTIVE) &&
(pLnbc->state != SONY_LNBC_STATE_SLEEP)) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_SW_STATE);
}
/* 1st byte */
result = create_1st_byte (pLnbc, mode, pLnbc->tone, &data);
if (result != SONY_RESULT_OK){SONY_TRACE_RETURN(result);}
if (pLnbc->state == SONY_LNBC_STATE_ACTIVE) {
if (pLnbc->pI2c->Write(pLnbc->pI2c, pLnbc->i2cAddress, &data, 1, SONY_I2C_START_EN|SONY_I2C_STOP_EN) != SONY_RESULT_OK){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
}
pLnbc->transmitMode = mode;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
static sony_result_t allegro_a8290_Sleep (sony_lnbc_t * pLnbc)
{
sony_result_t result = SONY_RESULT_OK;
uint8_t data = 0;
SONY_TRACE_ENTER ("allegro_a8290_Sleep");
if (!pLnbc) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
switch(pLnbc->state)
{
case SONY_LNBC_STATE_ACTIVE:
/* Continue */
break;
case SONY_LNBC_STATE_SLEEP:
/* Do nothing */
SONY_TRACE_RETURN (SONY_RESULT_OK);
case SONY_LNBC_STATE_UNKNOWN:
default:
/* Error */
SONY_TRACE_RETURN (SONY_RESULT_ERROR_SW_STATE);
}
/* 2nd byte */
result = create_2nd_byte (pLnbc, 0, pLnbc->voltage, &data);
if (result != SONY_RESULT_OK){SONY_TRACE_RETURN(result);}
if (pLnbc->pI2c->Write(pLnbc->pI2c, pLnbc->i2cAddress, &data, 1, SONY_I2C_START_EN|SONY_I2C_STOP_EN) != SONY_RESULT_OK){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
pLnbc->state = SONY_LNBC_STATE_SLEEP;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
static sony_result_t allegro_a8290_WakeUp (sony_lnbc_t * pLnbc)
{
sony_result_t result = SONY_RESULT_OK;
uint8_t data = 0;
SONY_TRACE_ENTER ("allegro_a8290_WakeUp");
if (!pLnbc){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
switch(pLnbc->state)
{
case SONY_LNBC_STATE_ACTIVE:
/* Do nothing */
SONY_TRACE_RETURN (SONY_RESULT_OK);
case SONY_LNBC_STATE_SLEEP:
/* Continue */
break;
case SONY_LNBC_STATE_UNKNOWN:
default:
/* Error */
SONY_TRACE_RETURN (SONY_RESULT_ERROR_SW_STATE);
}
/* 1st byte */
result = create_1st_byte (pLnbc, pLnbc->transmitMode, pLnbc->tone, &data);
if (result != SONY_RESULT_OK){SONY_TRACE_RETURN(result);}
if (pLnbc->pI2c->Write(pLnbc->pI2c, pLnbc->i2cAddress, &data, 1, SONY_I2C_START_EN|SONY_I2C_STOP_EN) != SONY_RESULT_OK){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
/* 2nd byte */
result = create_2nd_byte (pLnbc, 1, pLnbc->voltage, &data);
if (result != SONY_RESULT_OK){SONY_TRACE_RETURN(result);}
if (pLnbc->pI2c->Write(pLnbc->pI2c, pLnbc->i2cAddress, &data, 1, SONY_I2C_START_EN|SONY_I2C_STOP_EN) != SONY_RESULT_OK){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
pLnbc->state = SONY_LNBC_STATE_ACTIVE;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
static sony_result_t allegro_a8290_GetDiagStatus (sony_lnbc_t * pLnbc,
uint32_t * pStatus,
uint32_t * pStatusSupported)
{
uint8_t data = 0;
SONY_TRACE_ENTER ("allegro_a8290_GetDiagStatus");
if ((!pLnbc) || (!pStatus)) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
if (pStatusSupported) {
*pStatusSupported = SONY_LNBC_DIAG_STATUS_LNBCDISABLE | SONY_LNBC_DIAG_STATUS_OVERCURRENT
| SONY_LNBC_DIAG_STATUS_VOUTOUTOFRANGE | SONY_LNBC_DIAG_STATUS_THERMALSHUTDOWN
| SONY_LNBC_DIAG_STATUS_VINOUTOFRANGE;
}
if (pLnbc->pI2c->Read (pLnbc->pI2c, pLnbc->i2cAddress, &data, 1, SONY_I2C_START_EN|SONY_I2C_STOP_EN) != SONY_RESULT_OK){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
/* Status Register 1
* +---------+---------+---------+---------+---------+---------+---------+---------+
* | VUV | TSD | - | PNG | - | OCP | - | DIS |
* +---------+---------+---------+---------+---------+---------+---------+---------+
*
* Status Register 2
* +---------+---------+---------+---------+---------+---------+---------+---------+
* | - | - | - | - | - | TDET | - | CAD |
* +---------+---------+---------+---------+---------+---------+---------+---------+
* Note: To activate CAD (cable disconnected) bit, the user must set this IC
* to cable disconnect test mode.
* This means status register 2 is unnecessary to read.
*/
*pStatus = 0;
if (data & 0x01) {
*pStatus |= SONY_LNBC_DIAG_STATUS_LNBCDISABLE;
}
if (data & 0x04) {
*pStatus |= SONY_LNBC_DIAG_STATUS_OVERCURRENT;
}
if (data & 0x10) {
*pStatus |= SONY_LNBC_DIAG_STATUS_VOUTOUTOFRANGE;
}
if (data & 0x40) {
*pStatus |= SONY_LNBC_DIAG_STATUS_THERMALSHUTDOWN;
}
if (data & 0x80) {
*pStatus |= SONY_LNBC_DIAG_STATUS_VINOUTOFRANGE;
}
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
static sony_result_t create_1st_byte (sony_lnbc_t * pLnbc,
sony_lnbc_transmit_mode_t transmitMode,
sony_lnbc_tone_t tone,
uint8_t * pData)
{
SONY_TRACE_ENTER ("create_1st_byte");
if ((!pLnbc) || (!pData)){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
/*
* +-----+-----+-----+-----+-----+-----+-----+-----+
* | I1 | I0 |BFC2 | - | - |CADT |TGATE|TMODE|
* +-----+-----+-----+-----+-----+-----+-----+-----+
* | 1 | 0 | ? | 0 | 0 | 0 | ? | ? |
* +-----+-----+-----+-----+-----+-----+-----+-----+
*/
*pData = 0x80;
/*
* +-----+-----+-----+-----+-----+-----+-----+-----+
* | I1 | I0 |BFC2 | - | - |CADT |TGATE|TMODE|
* +-----+-----+-----+-----+-----+-----+-----+-----+
* | 1 | 0 | 1/0 | 0 | 0 | 0 | ? | ? |
* +-----+-----+-----+-----+-----+-----+-----+-----+
*/
switch(transmitMode)
{
case SONY_LNBC_TRANSMIT_MODE_TX:
/* BFC2 = 1 */
*pData |= 0x20;
break;
case SONY_LNBC_TRANSMIT_MODE_RX:
case SONY_LNBC_TRANSMIT_MODE_AUTO:
/* BFC2 = 0 */
break;
default:
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
/*
* +-----+-----+-----+-----+-----+-----+-----+-----+
* | I1 | I0 |BFC2 | - | - |CADT |TGATE|TMODE|
* +-----+-----+-----+-----+-----+-----+-----+-----+
* | 1 | 0 | 1/0 | 0 | 0 | 0 | 1/0 | ? |
* +-----+-----+-----+-----+-----+-----+-----+-----+
*/
switch(tone)
{
case SONY_LNBC_TONE_ON:
case SONY_LNBC_TONE_AUTO:
/* TGATE = 1 */
*pData |= 0x02;
break;
case SONY_LNBC_TONE_OFF:
/* TGATE = 0 */
break;
default:
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
/*
* +-----+-----+-----+-----+-----+-----+-----+-----+
* | I1 | I0 |BFC2 | - | - |CADT |TGATE|TMODE|
* +-----+-----+-----+-----+-----+-----+-----+-----+
* | 1 | 0 | 1/0 | 0 | 0 | 0 | 1/0 | 1/0 |
* +-----+-----+-----+-----+-----+-----+-----+-----+
*/
if (pLnbc->isInternalTone){
/* TMODE = 1 */
*pData |= 0x01;
}
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
static sony_result_t create_2nd_byte (sony_lnbc_t * pLnbc,
uint8_t isEnable,
sony_lnbc_voltage_t voltage,
uint8_t * pData)
{
SONY_TRACE_ENTER ("create_2nd_byte");
if ((!pLnbc) || (!pData)){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
/*
* +-----+-----+-----+-----+-----+-----+-----+-----+
* | I1 | I0 | ENB | ODT |VSEL3|VSEL2|VSEL1|VSEL0|
* +-----+-----+-----+-----+-----+-----+-----+-----+
* | 0 | 0 | ? | 1 | ? | ? | ? | ? |
* +-----+-----+-----+-----+-----+-----+-----+-----+
*/
*pData = 0x10;
/*
* +-----+-----+-----+-----+-----+-----+-----+-----+
* | I1 | I0 | ENB | ODT |VSEL3|VSEL2|VSEL1|VSEL0|
* +-----+-----+-----+-----+-----+-----+-----+-----+
* | 0 | 0 | 1/0 | 1 | ? | ? | ? | ? |
* +-----+-----+-----+-----+-----+-----+-----+-----+
*/
if (isEnable){
/* ENB = 1 */
*pData |= 0x20;
}
/*
* +-----+-----+-----+-----+-----+-----+-----+-----+
* | I1 | I0 | ENB | ODT |VSEL3|VSEL2|VSEL1|VSEL0|
* +-----+-----+-----+-----+-----+-----+-----+-----+
* | 0 | 0 | 1/0 | 1 | 1/0 | 1/0 | 1/0 | 1/0 |
* +-----+-----+-----+-----+-----+-----+-----+-----+
*/
switch(voltage)
{
case SONY_LNBC_VOLTAGE_LOW:
switch(pLnbc->lowVoltage)
{
case ALLEGRO_A8290_CONFIG_VOLTAGE_LOW_13_042V:
/* 13.042V : 0001 */
*pData |= 0x01;
break;
case ALLEGRO_A8290_CONFIG_VOLTAGE_LOW_14_042V:
/* 14.042V : 0100 */
*pData |= 0x04;
break;
default:
SONY_TRACE_RETURN (SONY_RESULT_ERROR_SW_STATE);
}
break;
case SONY_LNBC_VOLTAGE_HIGH:
switch(pLnbc->highVoltage)
{
case ALLEGRO_A8290_CONFIG_VOLTAGE_HIGH_18_042V:
/* 18.042V : 1000 */
*pData |= 0x08;
break;
case ALLEGRO_A8290_CONFIG_VOLTAGE_HIGH_19_042V:
/* 19.042V : 1011 */
*pData |= 0x0B;
break;
default:
SONY_TRACE_RETURN (SONY_RESULT_ERROR_SW_STATE);
}
break;
case SONY_LNBC_VOLTAGE_AUTO:
SONY_TRACE_RETURN (SONY_RESULT_ERROR_NOSUPPORT);
default:
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
@@ -0,0 +1,67 @@
/*------------------------------------------------------------------------------
Copyright 2016 Sony Semiconductor Solutions Corporation
Last Updated : 2016/06/24
Modification ID : 3b74e280b7ad8ce430b6a9419ac53e8f2e3737f9
------------------------------------------------------------------------------*/
/**
@file allegro_a8290.h
This file provides the functions to control A8290(Allegro).
*/
/*----------------------------------------------------------------------------*/
#ifndef ALLEGRO_A8290_H
#define ALLEGRO_A8290_H
#include "sony_common.h"
#include "sony_lnbc.h"
/**
@brief Use 13.042V for low level output voltage.
If you would like to use 13.042V as "Low level voltage",
please set this parameter by sony_lnbc_t::SetConfig(SONY_LNBC_CONFIG_ID_LOW_VOLTAGE, value).
*/
#define ALLEGRO_A8290_CONFIG_VOLTAGE_LOW_13_042V 0
/**
@brief Use 14.042V for low level output voltage.
If you would like to use 14.042V as "Low level voltage",
please set this parameter by sony_lnbc_t::SetConfig(SONY_LNBC_CONFIG_ID_LOW_VOLTAGE, value).
*/
#define ALLEGRO_A8290_CONFIG_VOLTAGE_LOW_14_042V 1
/**
@brief Use 18.042V for high level output voltage.
If you would like to use 18.042V as "High level voltage",
please set this parameter by sony_lnbc_t::SetConfig(SONY_LNBC_CONFIG_ID_HIGH_VOLTAGE, value).
*/
#define ALLEGRO_A8290_CONFIG_VOLTAGE_HIGH_18_042V 10
/**
@brief Use 19.042V for high level output voltage.
If you would like to use 19.042V as "High level voltage",
please set this parameter by sony_lnbc_t::SetConfig(SONY_LNBC_CONFIG_ID_HIGH_VOLTAGE, value).
*/
#define ALLEGRO_A8290_CONFIG_VOLTAGE_HIGH_19_042V 11
/*------------------------------------------------------------------------------
Functions
------------------------------------------------------------------------------*/
/**
@brief Create a instance for A8290(Allegro).
@param pLnbc LNB controller driver instance.
@param i2cAddress I2C address.
@param pI2c I2C instance.
@return SONY_RESULT_OK if successful.
*/
sony_result_t allegro_a8290_Create (sony_lnbc_t * pLnbc,
uint8_t i2cAddress,
sony_i2c_t * pI2c);
#endif /* ALLEGRO_A8290_H */
@@ -0,0 +1,477 @@
/*------------------------------------------------------------------------------
Copyright 2016-2017 Sony Semiconductor Solutions Corporation
Last Updated : 2017/11/30
Modification ID : 253a4918e2da2cf28a9393596fa16f25024e504d
------------------------------------------------------------------------------*/
#include "sony_common.h"
#include "sony_lnbc.h"
#include "allegro_a8303.h"
/*------------------------------------------------------------------------------
Static Functions
------------------------------------------------------------------------------*/
static sony_result_t allegro_a8303_Initialize (sony_lnbc_t * pLnbc);
static sony_result_t allegro_a8303_SetConfig (sony_lnbc_t * pLnbc,
sony_lnbc_config_id_t configId,
int32_t value);
static sony_result_t allegro_a8303_SetVoltage (sony_lnbc_t * pLnbc,
sony_lnbc_voltage_t voltage);
static sony_result_t allegro_a8303_SetTone (sony_lnbc_t * pLnbc,
sony_lnbc_tone_t tone);
static sony_result_t allegro_a8303_SetTransmitMode (sony_lnbc_t * pLnbc,
sony_lnbc_transmit_mode_t mode);
static sony_result_t allegro_a8303_Sleep (sony_lnbc_t * pLnbc);
static sony_result_t allegro_a8303_WakeUp (sony_lnbc_t * pLnbc);
static sony_result_t allegro_a8303_GetDiagStatus (sony_lnbc_t * pLnbc,
uint32_t * pStatus,
uint32_t * pStatusSupported);
static sony_result_t create_data (sony_lnbc_t * pLnbc,
uint8_t isEnable,
sony_lnbc_voltage_t voltage,
uint8_t * pData);
/*------------------------------------------------------------------------------
Functions
------------------------------------------------------------------------------*/
sony_result_t allegro_a8303_Create (sony_lnbc_t * pLnbc,
uint8_t i2cAddress,
sony_i2c_t * pI2c)
{
SONY_TRACE_ENTER ("allegro_a8303_Create");
if ((!pI2c) || (!pLnbc)){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
pLnbc->i2cAddress = i2cAddress;
pLnbc->pI2c = pI2c;
pLnbc->Initialize = allegro_a8303_Initialize;
pLnbc->SetConfig = allegro_a8303_SetConfig;
pLnbc->SetVoltage = allegro_a8303_SetVoltage;
pLnbc->SetTone = allegro_a8303_SetTone;
pLnbc->SetTransmitMode = allegro_a8303_SetTransmitMode;
pLnbc->Sleep = allegro_a8303_Sleep;
pLnbc->WakeUp = allegro_a8303_WakeUp;
pLnbc->GetDiagStatus = allegro_a8303_GetDiagStatus;
pLnbc->isInternalTone = 1; /* Fixed to 1 */
pLnbc->lowVoltage = ALLEGRO_A8303_CONFIG_VOLTAGE_LOW_13_333V; /* Default value */
pLnbc->highVoltage = ALLEGRO_A8303_CONFIG_VOLTAGE_HIGH_18_667V; /* Default value */
pLnbc->state = SONY_LNBC_STATE_UNKNOWN;
pLnbc->voltage = SONY_LNBC_VOLTAGE_LOW;
pLnbc->tone = SONY_LNBC_TONE_AUTO;
/* A8303 do not have any I2C register to change TX/RX. */
pLnbc->transmitMode = SONY_LNBC_TRANSMIT_MODE_AUTO;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
static sony_result_t allegro_a8303_Initialize (sony_lnbc_t * pLnbc)
{
uint8_t data = 0;
sony_result_t result = SONY_RESULT_OK;
SONY_TRACE_ENTER ("allegro_a8303_Initialize");
if (!pLnbc){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
pLnbc->state = SONY_LNBC_STATE_UNKNOWN;
pLnbc->voltage = SONY_LNBC_VOLTAGE_LOW;
pLnbc->tone = SONY_LNBC_TONE_AUTO; /* Auto is only supported */
if (pLnbc->transmitMode != SONY_LNBC_TRANSMIT_MODE_AUTO) {
pLnbc->transmitMode = SONY_LNBC_TRANSMIT_MODE_TX;
}
data = 0x00;
if (pLnbc->pI2c->Write (pLnbc->pI2c, pLnbc->i2cAddress, &data, 1, SONY_I2C_START_EN | SONY_I2C_STOP_EN) != SONY_RESULT_OK){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
if (pLnbc->pI2c->Read (pLnbc->pI2c, pLnbc->i2cAddress, &data, 1, SONY_I2C_START_EN | SONY_I2C_STOP_EN) != SONY_RESULT_OK){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
data = 0x00;
if (pLnbc->pI2c->Write (pLnbc->pI2c, pLnbc->i2cAddress, &data, 1, SONY_I2C_START_EN | SONY_I2C_STOP_EN) != SONY_RESULT_OK){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
if (pLnbc->pI2c->Read (pLnbc->pI2c, pLnbc->i2cAddress, &data, 1, SONY_I2C_START_EN | SONY_I2C_STOP_EN) != SONY_RESULT_OK){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
result = create_data (pLnbc, 0, pLnbc->voltage, &data);
if (result != SONY_RESULT_OK){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
if (pLnbc->pI2c->WriteOneRegister (pLnbc->pI2c, pLnbc->i2cAddress, 0x00, data) != SONY_RESULT_OK){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
pLnbc->state = SONY_LNBC_STATE_SLEEP;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
static sony_result_t allegro_a8303_SetConfig (sony_lnbc_t * pLnbc,
sony_lnbc_config_id_t configId,
int32_t value)
{
sony_result_t result = SONY_RESULT_OK;
SONY_TRACE_ENTER ("allegro_a8303_SetConfig");
if (!pLnbc){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
if ((pLnbc->state != SONY_LNBC_STATE_ACTIVE) &&
(pLnbc->state != SONY_LNBC_STATE_SLEEP)) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_SW_STATE);
}
switch(configId)
{
case SONY_LNBC_CONFIG_ID_TONE_INTERNAL:
if (value == 1) {
pLnbc->isInternalTone = value;
} else if (value == 0) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_NOSUPPORT);
} else {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_RANGE);
}
break;
case SONY_LNBC_CONFIG_ID_LOW_VOLTAGE:
if ((value != ALLEGRO_A8303_CONFIG_VOLTAGE_LOW_13_333V) &&
(value != ALLEGRO_A8303_CONFIG_VOLTAGE_LOW_14_333V)){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_RANGE);
} else {
pLnbc->lowVoltage = value;
result = allegro_a8303_SetVoltage (pLnbc, pLnbc->voltage);
if (result != SONY_RESULT_OK){
SONY_TRACE_RETURN (result);
}
}
break;
case SONY_LNBC_CONFIG_ID_HIGH_VOLTAGE:
if ((value != ALLEGRO_A8303_CONFIG_VOLTAGE_HIGH_18_667V) &&
(value != ALLEGRO_A8303_CONFIG_VOLTAGE_HIGH_19_667V)){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_RANGE);
} else {
pLnbc->highVoltage = value;
result = allegro_a8303_SetVoltage (pLnbc, pLnbc->voltage);
if (result != SONY_RESULT_OK){
SONY_TRACE_RETURN (result);
}
}
break;
default:
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
static sony_result_t allegro_a8303_SetVoltage (sony_lnbc_t * pLnbc,
sony_lnbc_voltage_t voltage)
{
uint8_t data = 0;
sony_result_t result = SONY_RESULT_OK;
SONY_TRACE_ENTER ("allegro_a8303_SetVoltage");
if (!pLnbc){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
if ((pLnbc->state != SONY_LNBC_STATE_ACTIVE) &&
(pLnbc->state != SONY_LNBC_STATE_SLEEP)) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_SW_STATE);
}
result = create_data (pLnbc, 1, voltage, &data);
if (result != SONY_RESULT_OK){
SONY_TRACE_RETURN (result);
}
if (pLnbc->state == SONY_LNBC_STATE_ACTIVE) {
if (pLnbc->pI2c->WriteOneRegister (pLnbc->pI2c, pLnbc->i2cAddress, 0x00, data) != SONY_RESULT_OK){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
}
pLnbc->voltage = voltage;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
static sony_result_t allegro_a8303_SetTone (sony_lnbc_t * pLnbc,
sony_lnbc_tone_t tone)
{
SONY_TRACE_ENTER ("allegro_a8303_SetTone");
if (!pLnbc){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
if ((pLnbc->state != SONY_LNBC_STATE_ACTIVE) &&
(pLnbc->state != SONY_LNBC_STATE_SLEEP)) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_SW_STATE);
}
switch(tone)
{
case SONY_LNBC_TONE_ON:
case SONY_LNBC_TONE_OFF:
/* A8303 doesn't support this function. */
SONY_TRACE_RETURN (SONY_RESULT_ERROR_NOSUPPORT);
break;
case SONY_LNBC_TONE_AUTO:
break;
default:
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
pLnbc->tone = tone;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
static sony_result_t allegro_a8303_SetTransmitMode (sony_lnbc_t * pLnbc,
sony_lnbc_transmit_mode_t mode)
{
SONY_TRACE_ENTER ("allegro_a8303_SetTransmitMode");
if (!pLnbc){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
if ((pLnbc->state != SONY_LNBC_STATE_ACTIVE) &&
(pLnbc->state != SONY_LNBC_STATE_SLEEP)){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_SW_STATE);
}
pLnbc->transmitMode = mode;
/* A8303 doesn't need to control something. */
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
static sony_result_t allegro_a8303_Sleep (sony_lnbc_t * pLnbc)
{
uint8_t data = 0;
sony_result_t result = SONY_RESULT_OK;
SONY_TRACE_ENTER ("allegro_a8303_Sleep");
if (!pLnbc){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
switch(pLnbc->state)
{
case SONY_LNBC_STATE_ACTIVE:
/* Continue */
break;
case SONY_LNBC_STATE_SLEEP:
/* Do nothing */
SONY_TRACE_RETURN (SONY_RESULT_OK);
case SONY_LNBC_STATE_UNKNOWN:
default:
/* Error */
SONY_TRACE_RETURN (SONY_RESULT_ERROR_SW_STATE);
}
result = create_data (pLnbc, 0, pLnbc->voltage, &data);
if (result != SONY_RESULT_OK){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
if (pLnbc->pI2c->WriteOneRegister (pLnbc->pI2c, pLnbc->i2cAddress, 0x00, data) != SONY_RESULT_OK){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
pLnbc->state = SONY_LNBC_STATE_SLEEP;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
static sony_result_t allegro_a8303_WakeUp (sony_lnbc_t * pLnbc)
{
uint8_t data = 0;
sony_result_t result = SONY_RESULT_OK;
SONY_TRACE_ENTER ("allegro_a8303_WakeUp");
if (!pLnbc){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
switch(pLnbc->state)
{
case SONY_LNBC_STATE_ACTIVE:
/* Do nothing */
SONY_TRACE_RETURN (SONY_RESULT_OK);
case SONY_LNBC_STATE_SLEEP:
/* Continue */
break;
case SONY_LNBC_STATE_UNKNOWN:
default:
/* Error */
SONY_TRACE_RETURN (SONY_RESULT_ERROR_SW_STATE);
}
result = create_data (pLnbc, 1, pLnbc->voltage, &data);
if (result != SONY_RESULT_OK){
SONY_TRACE_RETURN (result);
}
if (pLnbc->pI2c->WriteOneRegister (pLnbc->pI2c, pLnbc->i2cAddress, 0x00, data) != SONY_RESULT_OK){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
pLnbc->state = SONY_LNBC_STATE_ACTIVE;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
static sony_result_t allegro_a8303_GetDiagStatus (sony_lnbc_t * pLnbc,
uint32_t * pStatus,
uint32_t * pStatusSupported)
{
uint8_t data = 0;
SONY_TRACE_ENTER ("allegro_a8303_GetDiagStatus");
if ((!pLnbc) || (!pStatus)) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
if (pStatusSupported) {
*pStatusSupported = SONY_LNBC_DIAG_STATUS_LNBCDISABLE | SONY_LNBC_DIAG_STATUS_OVERCURRENT
| SONY_LNBC_DIAG_STATUS_VOUTOUTOFRANGE | SONY_LNBC_DIAG_STATUS_THERMALSHUTDOWN
| SONY_LNBC_DIAG_STATUS_VINOUTOFRANGE;
}
if (pLnbc->pI2c->Write (pLnbc->pI2c, pLnbc->i2cAddress, &data, 1, SONY_I2C_START_EN|SONY_I2C_STOP_EN) != SONY_RESULT_OK){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
/* Cannot use repeated start */
if (pLnbc->pI2c->Read (pLnbc->pI2c, pLnbc->i2cAddress, &data, 1, SONY_I2C_START_EN|SONY_I2C_STOP_EN) != SONY_RESULT_OK){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
/* STATUS register
* +---------+---------+---------+---------+---------+---------+---------+---------+
* | UVLO | TSD | TDET | PNG | TRIMS | OCP | CPOK | DIS |
* +---------+---------+---------+---------+---------+---------+---------+---------+
*/
*pStatus = 0;
if (data & 0x01) {
*pStatus |= SONY_LNBC_DIAG_STATUS_LNBCDISABLE;
}
if (data & 0x04) {
*pStatus |= SONY_LNBC_DIAG_STATUS_OVERCURRENT;
}
if (data & 0x10) {
*pStatus |= SONY_LNBC_DIAG_STATUS_VOUTOUTOFRANGE;
}
if (data & 0x40) {
*pStatus |= SONY_LNBC_DIAG_STATUS_THERMALSHUTDOWN;
}
if (data & 0x80) {
*pStatus |= SONY_LNBC_DIAG_STATUS_VINOUTOFRANGE;
}
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
static sony_result_t create_data (sony_lnbc_t * pLnbc,
uint8_t isEnable,
sony_lnbc_voltage_t voltage,
uint8_t * pData)
{
SONY_TRACE_ENTER ("create_data");
if ((!pLnbc) || (!pData)) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
*pData = 0;
if (isEnable){
*pData |= 0x08;
}
switch(voltage)
{
case SONY_LNBC_VOLTAGE_LOW:
switch(pLnbc->lowVoltage)
{
case ALLEGRO_A8303_CONFIG_VOLTAGE_LOW_13_333V:
/* 13.333V */
*pData |= 0x00;
break;
case ALLEGRO_A8303_CONFIG_VOLTAGE_LOW_14_333V:
/* 14.333V */
*pData |= 0x02;
break;
default:
SONY_TRACE_RETURN (SONY_RESULT_ERROR_SW_STATE);
}
break;
case SONY_LNBC_VOLTAGE_HIGH:
switch(pLnbc->highVoltage)
{
case ALLEGRO_A8303_CONFIG_VOLTAGE_HIGH_18_667V:
/* 18.667V */
*pData |= 0x04;
break;
case ALLEGRO_A8303_CONFIG_VOLTAGE_HIGH_19_667V:
/* 19.667V */
*pData |= 0x06;
break;
default:
SONY_TRACE_RETURN (SONY_RESULT_ERROR_SW_STATE);
}
break;
default:
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
@@ -0,0 +1,67 @@
/*------------------------------------------------------------------------------
Copyright 2016 Sony Semiconductor Solutions Corporation
Last Updated : 2016/06/24
Modification ID : 3b74e280b7ad8ce430b6a9419ac53e8f2e3737f9
------------------------------------------------------------------------------*/
/**
@file allegro_a8303.h
This file provides the functions to control A8303(Allegro).
*/
/*----------------------------------------------------------------------------*/
#ifndef ALLEGRO_A8303_H
#define ALLEGRO_A8303_H
#include "sony_common.h"
#include "sony_lnbc.h"
/**
@brief Use 13.333V for low level output voltage.
If you would like to use 13.333V as "Low level voltage",
please set this parameter by sony_lnbc_t::SetConfig(SONY_LNBC_CONFIG_ID_LOW_VOLTAGE, value).
*/
#define ALLEGRO_A8303_CONFIG_VOLTAGE_LOW_13_333V 0
/**
@brief Use 14.333V for low level output voltage.
If you would like to use 14.333V as "Low level voltage",
please set this parameter by sony_lnbc_t::SetConfig(SONY_LNBC_CONFIG_ID_LOW_VOLTAGE, value).
*/
#define ALLEGRO_A8303_CONFIG_VOLTAGE_LOW_14_333V 1
/**
@brief Use 18.667V for high level output voltage.
If you would like to use 18.667V as "High level voltage",
please set this parameter by sony_lnbc_t::SetConfig(SONY_LNBC_CONFIG_ID_HIGH_VOLTAGE, value).
*/
#define ALLEGRO_A8303_CONFIG_VOLTAGE_HIGH_18_667V 10
/**
@brief Use 19.667V for high level output voltage.
If you would like to use 19.667V as "High level voltage",
please set this parameter by sony_lnbc_t::SetConfig(SONY_LNBC_CONFIG_ID_HIGH_VOLTAGE, value).
*/
#define ALLEGRO_A8303_CONFIG_VOLTAGE_HIGH_19_667V 11
/*------------------------------------------------------------------------------
Functions
------------------------------------------------------------------------------*/
/**
@brief Create a instance for A8303(Allegro).
@param pLnbc LNB controller driver instance.
@param i2cAddress I2C address.
@param pI2c I2C instance.
@return SONY_RESULT_OK if successful.
*/
sony_result_t allegro_a8303_Create (sony_lnbc_t * pLnbc,
uint8_t i2cAddress,
sony_i2c_t * pI2c);
#endif /* ALLEGRO_A8303_H */
@@ -0,0 +1,475 @@
/*------------------------------------------------------------------------------
Copyright 2016-2017 Sony Semiconductor Solutions Corporation
Last Updated : 2017/11/30
Modification ID : 253a4918e2da2cf28a9393596fa16f25024e504d
------------------------------------------------------------------------------*/
#include "sony_common.h"
#include "sony_lnbc.h"
#include "allegro_a8303_1.h"
/*------------------------------------------------------------------------------
Static Functions
------------------------------------------------------------------------------*/
static sony_result_t allegro_a8303_1_Initialize (sony_lnbc_t * pLnbc);
static sony_result_t allegro_a8303_1_SetConfig (sony_lnbc_t * pLnbc,
sony_lnbc_config_id_t configId,
int32_t value);
static sony_result_t allegro_a8303_1_SetVoltage (sony_lnbc_t * pLnbc,
sony_lnbc_voltage_t voltage);
static sony_result_t allegro_a8303_1_SetTone (sony_lnbc_t * pLnbc,
sony_lnbc_tone_t tone);
static sony_result_t allegro_a8303_1_SetTransmitMode (sony_lnbc_t * pLnbc,
sony_lnbc_transmit_mode_t mode);
static sony_result_t allegro_a8303_1_Sleep (sony_lnbc_t * pLnbc);
static sony_result_t allegro_a8303_1_WakeUp (sony_lnbc_t * pLnbc);
static sony_result_t allegro_a8303_1_GetDiagStatus (sony_lnbc_t * pLnbc,
uint32_t * pStatus,
uint32_t * pStatusSupported);
static sony_result_t create_data (sony_lnbc_t * pLnbc,
uint8_t isEnable,
sony_lnbc_voltage_t voltage,
uint8_t * pData);
/*------------------------------------------------------------------------------
Functions
------------------------------------------------------------------------------*/
sony_result_t allegro_a8303_1_Create (sony_lnbc_t * pLnbc,
uint8_t i2cAddress,
sony_i2c_t * pI2c)
{
SONY_TRACE_ENTER ("allegro_a8303_1_Create");
if ((!pI2c) || (!pLnbc)){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
pLnbc->i2cAddress = i2cAddress;
pLnbc->pI2c = pI2c;
pLnbc->Initialize = allegro_a8303_1_Initialize;
pLnbc->SetConfig = allegro_a8303_1_SetConfig;
pLnbc->SetVoltage = allegro_a8303_1_SetVoltage;
pLnbc->SetTone = allegro_a8303_1_SetTone;
pLnbc->SetTransmitMode = allegro_a8303_1_SetTransmitMode;
pLnbc->Sleep = allegro_a8303_1_Sleep;
pLnbc->WakeUp = allegro_a8303_1_WakeUp;
pLnbc->GetDiagStatus = allegro_a8303_1_GetDiagStatus;
pLnbc->isInternalTone = 1; /* Fixed to 1 */
pLnbc->lowVoltage = ALLEGRO_A8303_1_CONFIG_VOLTAGE_LOW_13_333V; /* Default value */
pLnbc->highVoltage = ALLEGRO_A8303_1_CONFIG_VOLTAGE_HIGH_18_667V; /* Default value */
pLnbc->state = SONY_LNBC_STATE_UNKNOWN;
pLnbc->voltage = SONY_LNBC_VOLTAGE_LOW;
pLnbc->tone = SONY_LNBC_TONE_AUTO;
/* A8303-1 do not have any I2C register to change TX/RX. */
pLnbc->transmitMode = SONY_LNBC_TRANSMIT_MODE_AUTO;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
static sony_result_t allegro_a8303_1_Initialize (sony_lnbc_t * pLnbc)
{
uint8_t data = 0;
sony_result_t result = SONY_RESULT_OK;
SONY_TRACE_ENTER ("allegro_a8303_1_Initialize");
if (!pLnbc){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
pLnbc->state = SONY_LNBC_STATE_UNKNOWN;
pLnbc->voltage = SONY_LNBC_VOLTAGE_LOW;
pLnbc->tone = SONY_LNBC_TONE_AUTO; /* Auto is only supported */
if (pLnbc->transmitMode != SONY_LNBC_TRANSMIT_MODE_AUTO) {
pLnbc->transmitMode = SONY_LNBC_TRANSMIT_MODE_TX;
}
data = 0x00;
if (pLnbc->pI2c->Write (pLnbc->pI2c, pLnbc->i2cAddress, &data, 1, SONY_I2C_START_EN | SONY_I2C_STOP_EN) != SONY_RESULT_OK){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
if (pLnbc->pI2c->Read (pLnbc->pI2c, pLnbc->i2cAddress, &data, 1, SONY_I2C_START_EN | SONY_I2C_STOP_EN) != SONY_RESULT_OK){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
data = 0x00;
if (pLnbc->pI2c->Write (pLnbc->pI2c, pLnbc->i2cAddress, &data, 1, SONY_I2C_START_EN | SONY_I2C_STOP_EN) != SONY_RESULT_OK){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
if (pLnbc->pI2c->Read (pLnbc->pI2c, pLnbc->i2cAddress, &data, 1, SONY_I2C_START_EN | SONY_I2C_STOP_EN) != SONY_RESULT_OK){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
result = create_data (pLnbc, 0, pLnbc->voltage, &data);
if (result != SONY_RESULT_OK){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
if (pLnbc->pI2c->WriteOneRegister (pLnbc->pI2c, pLnbc->i2cAddress, 0x00, data) != SONY_RESULT_OK){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
pLnbc->state = SONY_LNBC_STATE_SLEEP;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
static sony_result_t allegro_a8303_1_SetConfig (sony_lnbc_t * pLnbc,
sony_lnbc_config_id_t configId,
int32_t value)
{
sony_result_t result = SONY_RESULT_OK;
SONY_TRACE_ENTER ("allegro_a8303_1_SetConfig");
if (!pLnbc){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
if ((pLnbc->state != SONY_LNBC_STATE_ACTIVE) &&
(pLnbc->state != SONY_LNBC_STATE_SLEEP)) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_SW_STATE);
}
switch(configId)
{
case SONY_LNBC_CONFIG_ID_TONE_INTERNAL:
if (value == 1) {
pLnbc->isInternalTone = value;
} else if (value == 0) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_NOSUPPORT);
} else {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_RANGE);
}
break;
case SONY_LNBC_CONFIG_ID_LOW_VOLTAGE:
if ((value != ALLEGRO_A8303_1_CONFIG_VOLTAGE_LOW_11_667V) &&
(value != ALLEGRO_A8303_1_CONFIG_VOLTAGE_LOW_13_333V) &&
(value != ALLEGRO_A8303_1_CONFIG_VOLTAGE_LOW_13_667V) &&
(value != ALLEGRO_A8303_1_CONFIG_VOLTAGE_LOW_14_333V) &&
(value != ALLEGRO_A8303_1_CONFIG_VOLTAGE_LOW_15_667V)){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_RANGE);
} else {
pLnbc->lowVoltage = value;
result = allegro_a8303_1_SetVoltage (pLnbc, pLnbc->voltage);
if (result != SONY_RESULT_OK){
SONY_TRACE_RETURN (result);
}
}
break;
case SONY_LNBC_CONFIG_ID_HIGH_VOLTAGE:
if ((value != ALLEGRO_A8303_1_CONFIG_VOLTAGE_HIGH_18_667V) &&
(value != ALLEGRO_A8303_1_CONFIG_VOLTAGE_HIGH_19_000V) &&
(value != ALLEGRO_A8303_1_CONFIG_VOLTAGE_HIGH_19_667V)){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_RANGE);
} else {
pLnbc->highVoltage = value;
result = allegro_a8303_1_SetVoltage (pLnbc, pLnbc->voltage);
if (result != SONY_RESULT_OK){
SONY_TRACE_RETURN (result);
}
}
break;
default:
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
static sony_result_t allegro_a8303_1_SetVoltage (sony_lnbc_t * pLnbc,
sony_lnbc_voltage_t voltage)
{
uint8_t data = 0;
sony_result_t result = SONY_RESULT_OK;
SONY_TRACE_ENTER ("allegro_a8303_1_SetVoltage");
if (!pLnbc){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
if ((pLnbc->state != SONY_LNBC_STATE_ACTIVE) &&
(pLnbc->state != SONY_LNBC_STATE_SLEEP)) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_SW_STATE);
}
result = create_data (pLnbc, 1, voltage, &data);
if (result != SONY_RESULT_OK){
SONY_TRACE_RETURN (result);
}
if (pLnbc->state == SONY_LNBC_STATE_ACTIVE) {
if (pLnbc->pI2c->WriteOneRegister (pLnbc->pI2c, pLnbc->i2cAddress, 0x00, data) != SONY_RESULT_OK){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
}
pLnbc->voltage = voltage;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
static sony_result_t allegro_a8303_1_SetTone (sony_lnbc_t * pLnbc,
sony_lnbc_tone_t tone)
{
SONY_TRACE_ENTER ("allegro_a8303_1_SetTone");
if (!pLnbc){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
if ((pLnbc->state != SONY_LNBC_STATE_ACTIVE) &&
(pLnbc->state != SONY_LNBC_STATE_SLEEP)) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_SW_STATE);
}
switch(tone)
{
case SONY_LNBC_TONE_ON:
case SONY_LNBC_TONE_OFF:
/* A8303_1 doesn't support this function. */
SONY_TRACE_RETURN (SONY_RESULT_ERROR_NOSUPPORT);
break;
case SONY_LNBC_TONE_AUTO:
break;
default:
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
pLnbc->tone = tone;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
static sony_result_t allegro_a8303_1_SetTransmitMode (sony_lnbc_t * pLnbc,
sony_lnbc_transmit_mode_t mode)
{
SONY_TRACE_ENTER ("allegro_a8303_1_SetTransmitMode");
if (!pLnbc){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
if ((pLnbc->state != SONY_LNBC_STATE_ACTIVE) &&
(pLnbc->state != SONY_LNBC_STATE_SLEEP)) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_SW_STATE);
}
pLnbc->transmitMode = mode;
/* A8303_1 doesn't need to control something. */
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
static sony_result_t allegro_a8303_1_Sleep (sony_lnbc_t * pLnbc)
{
uint8_t data = 0;
sony_result_t result = SONY_RESULT_OK;
SONY_TRACE_ENTER ("allegro_a8303_1_Sleep");
if (!pLnbc){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
switch(pLnbc->state)
{
case SONY_LNBC_STATE_ACTIVE:
/* Continue */
break;
case SONY_LNBC_STATE_SLEEP:
/* Do nothing */
SONY_TRACE_RETURN (SONY_RESULT_OK);
case SONY_LNBC_STATE_UNKNOWN:
default:
/* Error */
SONY_TRACE_RETURN (SONY_RESULT_ERROR_SW_STATE);
}
result = create_data (pLnbc, 0, pLnbc->voltage, &data);
if (result != SONY_RESULT_OK){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
if (pLnbc->pI2c->WriteOneRegister (pLnbc->pI2c, pLnbc->i2cAddress, 0x00, data) != SONY_RESULT_OK){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
pLnbc->state = SONY_LNBC_STATE_SLEEP;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
static sony_result_t allegro_a8303_1_WakeUp (sony_lnbc_t * pLnbc)
{
uint8_t data = 0;
sony_result_t result = SONY_RESULT_OK;
SONY_TRACE_ENTER ("allegro_a8303_1_WakeUp");
if (!pLnbc){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
switch(pLnbc->state)
{
case SONY_LNBC_STATE_ACTIVE:
/* Do nothing */
SONY_TRACE_RETURN (SONY_RESULT_OK);
case SONY_LNBC_STATE_SLEEP:
/* Continue */
break;
case SONY_LNBC_STATE_UNKNOWN:
default:
/* Error */
SONY_TRACE_RETURN (SONY_RESULT_ERROR_SW_STATE);
}
result = create_data (pLnbc, 1, pLnbc->voltage, &data);
if (result != SONY_RESULT_OK){
SONY_TRACE_RETURN (result);
}
if (pLnbc->pI2c->WriteOneRegister (pLnbc->pI2c, pLnbc->i2cAddress, 0x00, data) != SONY_RESULT_OK){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
pLnbc->state = SONY_LNBC_STATE_ACTIVE;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
static sony_result_t allegro_a8303_1_GetDiagStatus (sony_lnbc_t * pLnbc,
uint32_t * pStatus,
uint32_t * pStatusSupported)
{
uint8_t data = 0;
SONY_TRACE_ENTER ("allegro_a8303_1_GetDiagStatus");
if ((!pLnbc) || (!pStatus)) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
if (pStatusSupported) {
*pStatusSupported = SONY_LNBC_DIAG_STATUS_LNBCDISABLE | SONY_LNBC_DIAG_STATUS_OVERCURRENT
| SONY_LNBC_DIAG_STATUS_VOUTOUTOFRANGE | SONY_LNBC_DIAG_STATUS_THERMALSHUTDOWN
| SONY_LNBC_DIAG_STATUS_VINOUTOFRANGE;
}
if (pLnbc->pI2c->Write (pLnbc->pI2c, pLnbc->i2cAddress, &data, 1, SONY_I2C_START_EN|SONY_I2C_STOP_EN) != SONY_RESULT_OK){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
/* Cannot use repeated start */
if (pLnbc->pI2c->Read (pLnbc->pI2c, pLnbc->i2cAddress, &data, 1, SONY_I2C_START_EN|SONY_I2C_STOP_EN) != SONY_RESULT_OK){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
/* STATUS register
* +---------+---------+---------+---------+---------+---------+---------+---------+
* | UVLO | TSD | TDET | PNG | TRIMS | OCP | CPOK | DIS |
* +---------+---------+---------+---------+---------+---------+---------+---------+
*/
*pStatus = 0;
if (data & 0x01) {
*pStatus |= SONY_LNBC_DIAG_STATUS_LNBCDISABLE;
}
if (data & 0x04) {
*pStatus |= SONY_LNBC_DIAG_STATUS_OVERCURRENT;
}
if (data & 0x10) {
*pStatus |= SONY_LNBC_DIAG_STATUS_VOUTOUTOFRANGE;
}
if (data & 0x40) {
*pStatus |= SONY_LNBC_DIAG_STATUS_THERMALSHUTDOWN;
}
if (data & 0x80) {
*pStatus |= SONY_LNBC_DIAG_STATUS_VINOUTOFRANGE;
}
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
static sony_result_t create_data (sony_lnbc_t * pLnbc,
uint8_t isEnable,
sony_lnbc_voltage_t voltage,
uint8_t * pData)
{
SONY_TRACE_ENTER ("create_data");
if ((!pLnbc) || (!pData)) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
*pData = 0;
if (isEnable){
*pData |= 0x08;
}
switch(voltage)
{
case SONY_LNBC_VOLTAGE_LOW:
switch(pLnbc->lowVoltage)
{
case ALLEGRO_A8303_1_CONFIG_VOLTAGE_LOW_11_667V:
case ALLEGRO_A8303_1_CONFIG_VOLTAGE_LOW_13_333V:
case ALLEGRO_A8303_1_CONFIG_VOLTAGE_LOW_13_667V:
case ALLEGRO_A8303_1_CONFIG_VOLTAGE_LOW_14_333V:
case ALLEGRO_A8303_1_CONFIG_VOLTAGE_LOW_15_667V:
*pData |= pLnbc->lowVoltage;
break;
default:
SONY_TRACE_RETURN (SONY_RESULT_ERROR_SW_STATE);
}
break;
case SONY_LNBC_VOLTAGE_HIGH:
switch(pLnbc->highVoltage)
{
case ALLEGRO_A8303_1_CONFIG_VOLTAGE_HIGH_18_667V:
case ALLEGRO_A8303_1_CONFIG_VOLTAGE_HIGH_19_000V:
case ALLEGRO_A8303_1_CONFIG_VOLTAGE_HIGH_19_667V:
*pData |= pLnbc->highVoltage;
break;
default:
SONY_TRACE_RETURN (SONY_RESULT_ERROR_SW_STATE);
}
break;
default:
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
@@ -0,0 +1,99 @@
/*------------------------------------------------------------------------------
Copyright 2016 Sony Semiconductor Solutions Corporation
Last Updated : 2016/06/24
Modification ID : 3b74e280b7ad8ce430b6a9419ac53e8f2e3737f9
------------------------------------------------------------------------------*/
/**
@file allegro_a8303_1.h
This file provides the functions to control A8303_1(Allegro).
*/
/*----------------------------------------------------------------------------*/
#ifndef ALLEGRO_A8303_1_H
#define ALLEGRO_A8303_1_H
#include "sony_common.h"
#include "sony_lnbc.h"
/**
@brief Use 11.667V for low level output voltage.
If you would like to use 11.667V as "Low level voltage",
please set this parameter by sony_lnbc_t::SetConfig(SONY_LNBC_CONFIG_ID_LOW_VOLTAGE, value).
*/
#define ALLEGRO_A8303_1_CONFIG_VOLTAGE_LOW_11_667V 7
/**
@brief Use 13.333V for low level output voltage.
If you would like to use 13.333V as "Low level voltage",
please set this parameter by sony_lnbc_t::SetConfig(SONY_LNBC_CONFIG_ID_LOW_VOLTAGE, value).
*/
#define ALLEGRO_A8303_1_CONFIG_VOLTAGE_LOW_13_333V 0
/**
@brief Use 13.667V for low level output voltage.
If you would like to use 13.667V as "Low level voltage",
please set this parameter by sony_lnbc_t::SetConfig(SONY_LNBC_CONFIG_ID_LOW_VOLTAGE, value).
*/
#define ALLEGRO_A8303_1_CONFIG_VOLTAGE_LOW_13_667V 1
/**
@brief Use 14.333V for low level output voltage.
If you would like to use 14.333V as "Low level voltage",
please set this parameter by sony_lnbc_t::SetConfig(SONY_LNBC_CONFIG_ID_LOW_VOLTAGE, value).
*/
#define ALLEGRO_A8303_1_CONFIG_VOLTAGE_LOW_14_333V 2
/**
@brief Use 15.667V for low level output voltage.
If you would like to use 15.667V as "Low level voltage",
please set this parameter by sony_lnbc_t::SetConfig(SONY_LNBC_CONFIG_ID_LOW_VOLTAGE, value).
*/
#define ALLEGRO_A8303_1_CONFIG_VOLTAGE_LOW_15_667V 3
/**
@brief Use 18.667V for high level output voltage.
If you would like to use 18.667V as "High level voltage",
please set this parameter by sony_lnbc_t::SetConfig(SONY_LNBC_CONFIG_ID_HIGH_VOLTAGE, value).
*/
#define ALLEGRO_A8303_1_CONFIG_VOLTAGE_HIGH_18_667V 4
/**
@brief Use 19.000V for high level output voltage.
If you would like to use 19.000V as "High level voltage",
please set this parameter by sony_lnbc_t::SetConfig(SONY_LNBC_CONFIG_ID_HIGH_VOLTAGE, value).
*/
#define ALLEGRO_A8303_1_CONFIG_VOLTAGE_HIGH_19_000V 5
/**
@brief Use 19.667V for high level output voltage.
If you would like to use 19.667V as "High level voltage",
please set this parameter by sony_lnbc_t::SetConfig(SONY_LNBC_CONFIG_ID_HIGH_VOLTAGE, value).
*/
#define ALLEGRO_A8303_1_CONFIG_VOLTAGE_HIGH_19_667V 6
/*------------------------------------------------------------------------------
Functions
------------------------------------------------------------------------------*/
/**
@brief Create a instance for A8303_1(Allegro).
@param pLnbc LNB controller driver instance.
@param i2cAddress I2C address.
@param pI2c I2C instance.
@return SONY_RESULT_OK if successful.
*/
sony_result_t allegro_a8303_1_Create (sony_lnbc_t * pLnbc,
uint8_t i2cAddress,
sony_i2c_t * pI2c);
#endif /* ALLEGRO_A8303_1_H */
@@ -0,0 +1,494 @@
/*------------------------------------------------------------------------------
Copyright 2016-2017 Sony Semiconductor Solutions Corporation
Last Updated : 2017/11/30
Modification ID : 253a4918e2da2cf28a9393596fa16f25024e504d
------------------------------------------------------------------------------*/
#include "sony_common.h"
#include "sony_lnbc.h"
#include "allegro_a8304.h"
/*------------------------------------------------------------------------------
Static Functions
------------------------------------------------------------------------------*/
static sony_result_t allegro_a8304_Initialize (sony_lnbc_t * pLnbc);
static sony_result_t allegro_a8304_SetConfig (sony_lnbc_t * pLnbc,
sony_lnbc_config_id_t configId,
int32_t value);
static sony_result_t allegro_a8304_SetVoltage (sony_lnbc_t * pLnbc,
sony_lnbc_voltage_t voltage);
static sony_result_t allegro_a8304_SetTone (sony_lnbc_t * pLnbc,
sony_lnbc_tone_t tone);
static sony_result_t allegro_a8304_SetTransmitMode (sony_lnbc_t * pLnbc,
sony_lnbc_transmit_mode_t mode);
static sony_result_t allegro_a8304_Sleep (sony_lnbc_t * pLnbc);
static sony_result_t allegro_a8304_WakeUp (sony_lnbc_t * pLnbc);
static sony_result_t allegro_a8304_GetDiagStatus (sony_lnbc_t * pLnbc,
uint32_t * pStatus,
uint32_t * pStatusSupported);
static sony_result_t create_data (sony_lnbc_t * pLnbc,
uint8_t isEnable,
sony_lnbc_voltage_t voltage,
uint8_t * pData);
/*------------------------------------------------------------------------------
Functions
------------------------------------------------------------------------------*/
sony_result_t allegro_a8304_Create (sony_lnbc_t * pLnbc,
uint8_t i2cAddress,
sony_i2c_t * pI2c)
{
SONY_TRACE_ENTER ("allegro_a8304_Create");
if ((!pI2c) || (!pLnbc)){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
pLnbc->i2cAddress = i2cAddress;
pLnbc->pI2c = pI2c;
pLnbc->Initialize = allegro_a8304_Initialize;
pLnbc->SetConfig = allegro_a8304_SetConfig;
pLnbc->SetVoltage = allegro_a8304_SetVoltage;
pLnbc->SetTone = allegro_a8304_SetTone;
pLnbc->SetTransmitMode = allegro_a8304_SetTransmitMode;
pLnbc->Sleep = allegro_a8304_Sleep;
pLnbc->WakeUp = allegro_a8304_WakeUp;
pLnbc->GetDiagStatus = allegro_a8304_GetDiagStatus;
pLnbc->isInternalTone = 1; /* Fixed to 1 */
pLnbc->lowVoltage = ALLEGRO_A8304_CONFIG_VOLTAGE_LOW_13_333V; /* Default value */
pLnbc->highVoltage = ALLEGRO_A8304_CONFIG_VOLTAGE_HIGH_18_667V; /* Default value */
pLnbc->state = SONY_LNBC_STATE_UNKNOWN;
pLnbc->voltage = SONY_LNBC_VOLTAGE_LOW;
pLnbc->tone = SONY_LNBC_TONE_AUTO;
pLnbc->transmitMode = SONY_LNBC_TRANSMIT_MODE_TX;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
static sony_result_t allegro_a8304_Initialize (sony_lnbc_t * pLnbc)
{
uint8_t data = 0;
sony_result_t result = SONY_RESULT_OK;
SONY_TRACE_ENTER ("allegro_a8304_Initialize");
if (!pLnbc){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
pLnbc->state = SONY_LNBC_STATE_UNKNOWN;
pLnbc->voltage = SONY_LNBC_VOLTAGE_LOW;
pLnbc->tone = SONY_LNBC_TONE_AUTO; /* Auto is only supported */
pLnbc->transmitMode = SONY_LNBC_TRANSMIT_MODE_TX; /* RX is not supported */
data = 0x00;
if (pLnbc->pI2c->Write (pLnbc->pI2c, pLnbc->i2cAddress, &data, 1, SONY_I2C_START_EN | SONY_I2C_STOP_EN) != SONY_RESULT_OK){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
if (pLnbc->pI2c->Read (pLnbc->pI2c, pLnbc->i2cAddress, &data, 1, SONY_I2C_START_EN | SONY_I2C_STOP_EN) != SONY_RESULT_OK){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
data = 0x00;
if (pLnbc->pI2c->Write (pLnbc->pI2c, pLnbc->i2cAddress, &data, 1, SONY_I2C_START_EN | SONY_I2C_STOP_EN) != SONY_RESULT_OK){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
if (pLnbc->pI2c->Read (pLnbc->pI2c, pLnbc->i2cAddress, &data, 1, SONY_I2C_START_EN | SONY_I2C_STOP_EN) != SONY_RESULT_OK){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
result = create_data (pLnbc, 0, pLnbc->voltage, &data);
if (result != SONY_RESULT_OK){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
if (pLnbc->pI2c->WriteOneRegister (pLnbc->pI2c, pLnbc->i2cAddress, 0x00, data) != SONY_RESULT_OK){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
pLnbc->state = SONY_LNBC_STATE_SLEEP;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
static sony_result_t allegro_a8304_SetConfig (sony_lnbc_t * pLnbc,
sony_lnbc_config_id_t configId,
int32_t value)
{
sony_result_t result = SONY_RESULT_OK;
SONY_TRACE_ENTER ("allegro_a8304_SetConfig");
if (!pLnbc){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
if ((pLnbc->state != SONY_LNBC_STATE_ACTIVE) &&
(pLnbc->state != SONY_LNBC_STATE_SLEEP)) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_SW_STATE);
}
switch(configId)
{
case SONY_LNBC_CONFIG_ID_TONE_INTERNAL:
if ((value != 0) && (value != 1)){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_RANGE);
} else {
pLnbc->isInternalTone = value;
result = allegro_a8304_SetVoltage (pLnbc, pLnbc->voltage);
if (result != SONY_RESULT_OK){
SONY_TRACE_RETURN (result);
}
}
break;
case SONY_LNBC_CONFIG_ID_LOW_VOLTAGE:
if ((value != ALLEGRO_A8304_CONFIG_VOLTAGE_LOW_13_333V) &&
(value != ALLEGRO_A8304_CONFIG_VOLTAGE_LOW_14_333V)){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_RANGE);
} else {
pLnbc->lowVoltage = value;
result = allegro_a8304_SetVoltage (pLnbc, pLnbc->voltage);
if (result != SONY_RESULT_OK){
SONY_TRACE_RETURN (result);
}
}
break;
case SONY_LNBC_CONFIG_ID_HIGH_VOLTAGE:
if ((value != ALLEGRO_A8304_CONFIG_VOLTAGE_HIGH_18_667V) &&
(value != ALLEGRO_A8304_CONFIG_VOLTAGE_HIGH_19_667V)){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_RANGE);
} else {
pLnbc->highVoltage = value;
result = allegro_a8304_SetVoltage (pLnbc, pLnbc->voltage);
if (result != SONY_RESULT_OK){
SONY_TRACE_RETURN (result);
}
}
break;
default:
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
static sony_result_t allegro_a8304_SetVoltage (sony_lnbc_t * pLnbc,
sony_lnbc_voltage_t voltage)
{
uint8_t data = 0;
sony_result_t result = SONY_RESULT_OK;
SONY_TRACE_ENTER ("allegro_a8304_SetVoltage");
if (!pLnbc){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
if ((pLnbc->state != SONY_LNBC_STATE_ACTIVE) &&
(pLnbc->state != SONY_LNBC_STATE_SLEEP)) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_SW_STATE);
}
result = create_data (pLnbc, 1, voltage, &data);
if (result != SONY_RESULT_OK){
SONY_TRACE_RETURN (result);
}
if (pLnbc->state == SONY_LNBC_STATE_ACTIVE) {
if (pLnbc->pI2c->WriteOneRegister (pLnbc->pI2c, pLnbc->i2cAddress, 0x00, data) != SONY_RESULT_OK){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
}
pLnbc->voltage = voltage;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
static sony_result_t allegro_a8304_SetTone (sony_lnbc_t * pLnbc,
sony_lnbc_tone_t tone)
{
SONY_TRACE_ENTER ("allegro_a8304_SetTone");
if (!pLnbc){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
if ((pLnbc->state != SONY_LNBC_STATE_ACTIVE) &&
(pLnbc->state != SONY_LNBC_STATE_SLEEP)) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_SW_STATE);
}
switch(tone)
{
case SONY_LNBC_TONE_ON:
case SONY_LNBC_TONE_OFF:
/* A8304 doesn't support this function. */
SONY_TRACE_RETURN (SONY_RESULT_ERROR_NOSUPPORT);
break;
case SONY_LNBC_TONE_AUTO:
break;
default:
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
pLnbc->tone = tone;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
static sony_result_t allegro_a8304_SetTransmitMode (sony_lnbc_t * pLnbc,
sony_lnbc_transmit_mode_t mode)
{
SONY_TRACE_ENTER ("allegro_a8304_SetTransmitMode");
if (!pLnbc){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
if ((pLnbc->state != SONY_LNBC_STATE_ACTIVE) &&
(pLnbc->state != SONY_LNBC_STATE_SLEEP)) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_SW_STATE);
}
switch(mode)
{
case SONY_LNBC_TRANSMIT_MODE_TX:
/* Do nothing */
break;
case SONY_LNBC_TRANSMIT_MODE_RX:
case SONY_LNBC_TRANSMIT_MODE_AUTO:
SONY_TRACE_RETURN (SONY_RESULT_ERROR_NOSUPPORT);
break;
default:
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
pLnbc->transmitMode = mode;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
static sony_result_t allegro_a8304_Sleep (sony_lnbc_t * pLnbc)
{
uint8_t data = 0;
sony_result_t result = SONY_RESULT_OK;
SONY_TRACE_ENTER ("allegro_a8304_Sleep");
if (!pLnbc){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
switch(pLnbc->state)
{
case SONY_LNBC_STATE_ACTIVE:
/* Continue */
break;
case SONY_LNBC_STATE_SLEEP:
/* Do nothing */
SONY_TRACE_RETURN (SONY_RESULT_OK);
case SONY_LNBC_STATE_UNKNOWN:
default:
/* Error */
SONY_TRACE_RETURN (SONY_RESULT_ERROR_SW_STATE);
}
result = create_data (pLnbc, 0, pLnbc->voltage, &data);
if (result != SONY_RESULT_OK){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
if (pLnbc->pI2c->WriteOneRegister (pLnbc->pI2c, pLnbc->i2cAddress, 0x00, data) != SONY_RESULT_OK){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
pLnbc->state = SONY_LNBC_STATE_SLEEP;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
static sony_result_t allegro_a8304_WakeUp (sony_lnbc_t * pLnbc)
{
uint8_t data = 0;
sony_result_t result = SONY_RESULT_OK;
SONY_TRACE_ENTER ("allegro_a8304_WakeUp");
if (!pLnbc){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
switch(pLnbc->state)
{
case SONY_LNBC_STATE_ACTIVE:
/* Do nothing */
SONY_TRACE_RETURN (SONY_RESULT_OK);
case SONY_LNBC_STATE_SLEEP:
/* Continue */
break;
case SONY_LNBC_STATE_UNKNOWN:
default:
/* Error */
SONY_TRACE_RETURN (SONY_RESULT_ERROR_SW_STATE);
}
result = create_data (pLnbc, 1, pLnbc->voltage, &data);
if (result != SONY_RESULT_OK){
SONY_TRACE_RETURN (result);
}
if (pLnbc->pI2c->WriteOneRegister (pLnbc->pI2c, pLnbc->i2cAddress, 0x00, data) != SONY_RESULT_OK){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
pLnbc->state = SONY_LNBC_STATE_ACTIVE;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
static sony_result_t allegro_a8304_GetDiagStatus (sony_lnbc_t * pLnbc,
uint32_t * pStatus,
uint32_t * pStatusSupported)
{
uint8_t data = 0;
SONY_TRACE_ENTER ("allegro_a8304_GetDiagStatus");
if ((!pLnbc) || (!pStatus)) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
if (pStatusSupported) {
*pStatusSupported = SONY_LNBC_DIAG_STATUS_LNBCDISABLE | SONY_LNBC_DIAG_STATUS_OVERCURRENT
| SONY_LNBC_DIAG_STATUS_VOUTOUTOFRANGE | SONY_LNBC_DIAG_STATUS_THERMALSHUTDOWN
| SONY_LNBC_DIAG_STATUS_VINOUTOFRANGE;
}
if (pLnbc->pI2c->Write (pLnbc->pI2c, pLnbc->i2cAddress, &data, 1, SONY_I2C_START_EN|SONY_I2C_STOP_EN) != SONY_RESULT_OK){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
/* Cannot use repeated start */
if (pLnbc->pI2c->Read (pLnbc->pI2c, pLnbc->i2cAddress, &data, 1, SONY_I2C_START_EN|SONY_I2C_STOP_EN) != SONY_RESULT_OK){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
/* STATUS register
* +---------+---------+---------+---------+---------+---------+---------+---------+
* | UVLO | TSD | - | PNG | - | OCP | CPOK | DIS |
* +---------+---------+---------+---------+---------+---------+---------+---------+
*/
*pStatus = 0;
if (data & 0x01) {
*pStatus |= SONY_LNBC_DIAG_STATUS_LNBCDISABLE;
}
if (data & 0x04) {
*pStatus |= SONY_LNBC_DIAG_STATUS_OVERCURRENT;
}
if (data & 0x10) {
*pStatus |= SONY_LNBC_DIAG_STATUS_VOUTOUTOFRANGE;
}
if (data & 0x40) {
*pStatus |= SONY_LNBC_DIAG_STATUS_THERMALSHUTDOWN;
}
if (data & 0x80) {
*pStatus |= SONY_LNBC_DIAG_STATUS_VINOUTOFRANGE;
}
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
static sony_result_t create_data (sony_lnbc_t * pLnbc,
uint8_t isEnable,
sony_lnbc_voltage_t voltage,
uint8_t * pData)
{
SONY_TRACE_ENTER ("create_data");
if ((!pLnbc) || (!pData)) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
*pData = 0;
if (isEnable){
*pData |= 0x10;
}
if (!pLnbc->isInternalTone){
/* TMODE = 1 */
*pData |= 0x20;
}
switch(voltage)
{
case SONY_LNBC_VOLTAGE_LOW:
switch(pLnbc->lowVoltage)
{
case ALLEGRO_A8304_CONFIG_VOLTAGE_LOW_13_333V:
/* 13.333V */
*pData |= 0x02;
break;
case ALLEGRO_A8304_CONFIG_VOLTAGE_LOW_14_333V:
/* 14.333V */
*pData |= 0x05;
break;
default:
SONY_TRACE_RETURN (SONY_RESULT_ERROR_SW_STATE);
}
break;
case SONY_LNBC_VOLTAGE_HIGH:
switch(pLnbc->highVoltage)
{
case ALLEGRO_A8304_CONFIG_VOLTAGE_HIGH_18_667V:
/* 18.667V */
*pData |= 0x0B;
break;
case ALLEGRO_A8304_CONFIG_VOLTAGE_HIGH_19_667V:
/* 19.667V */
*pData |= 0x0E;
break;
default:
SONY_TRACE_RETURN (SONY_RESULT_ERROR_SW_STATE);
}
break;
default:
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
@@ -0,0 +1,67 @@
/*------------------------------------------------------------------------------
Copyright 2016 Sony Semiconductor Solutions Corporation
Last Updated : 2016/06/24
Modification ID : 3b74e280b7ad8ce430b6a9419ac53e8f2e3737f9
------------------------------------------------------------------------------*/
/**
@file allegro_a8304.h
This file provides the functions to control A8304(Allegro).
*/
/*----------------------------------------------------------------------------*/
#ifndef ALLEGRO_A8304_H
#define ALLEGRO_A8304_H
#include "sony_common.h"
#include "sony_lnbc.h"
/**
@brief Use 13.333V for low level output voltage.
If you would like to use 13.333V as "Low level voltage",
please set this parameter by sony_lnbc_t::SetConfig(SONY_LNBC_CONFIG_ID_LOW_VOLTAGE, value).
*/
#define ALLEGRO_A8304_CONFIG_VOLTAGE_LOW_13_333V 0
/**
@brief Use 14.333V for low level output voltage.
If you would like to use 14.333V as "Low level voltage",
please set this parameter by sony_lnbc_t::SetConfig(SONY_LNBC_CONFIG_ID_LOW_VOLTAGE, value).
*/
#define ALLEGRO_A8304_CONFIG_VOLTAGE_LOW_14_333V 1
/**
@brief Use 18.667V for high level output voltage.
If you would like to use 18.667V as "High level voltage",
please set this parameter by sony_lnbc_t::SetConfig(SONY_LNBC_CONFIG_ID_HIGH_VOLTAGE, value).
*/
#define ALLEGRO_A8304_CONFIG_VOLTAGE_HIGH_18_667V 10
/**
@brief Use 19.667V for high level output voltage.
If you would like to use 19.667V as "High level voltage",
please set this parameter by sony_lnbc_t::SetConfig(SONY_LNBC_CONFIG_ID_HIGH_VOLTAGE, value).
*/
#define ALLEGRO_A8304_CONFIG_VOLTAGE_HIGH_19_667V 11
/*------------------------------------------------------------------------------
Functions
------------------------------------------------------------------------------*/
/**
@brief Create a instance for A8304(Allegro).
@param pLnbc LNB controller driver instance.
@param i2cAddress I2C address.
@param pI2c I2C instance.
@return SONY_RESULT_OK if successful.
*/
sony_result_t allegro_a8304_Create (sony_lnbc_t * pLnbc,
uint8_t i2cAddress,
sony_i2c_t * pI2c);
#endif /* ALLEGRO_A8304_H */
@@ -0,0 +1,672 @@
/*------------------------------------------------------------------------------
Copyright 2016-2017 Sony Semiconductor Solutions Corporation
Last Updated : 2017/11/30
Modification ID : 253a4918e2da2cf28a9393596fa16f25024e504d
------------------------------------------------------------------------------*/
#include "sony_common.h"
#include "sony_lnbc.h"
#include "intersil_isl9492.h"
/*----------------------------------------------------------------------------
Static Functions
----------------------------------------------------------------------------*/
static sony_result_t create_1st_byte (sony_lnbc_t * pLnbc,
sony_lnbc_tone_t tone,
sony_lnbc_transmit_mode_t mode,
uint8_t * pData);
static sony_result_t create_2nd_byte (sony_lnbc_t * pLnbc,
sony_lnbc_voltage_t voltage,
uint8_t * pData);
static sony_result_t create_3rd_byte (sony_lnbc_t * pLnbc,
uint8_t isEnable,
sony_lnbc_voltage_t voltage,
uint8_t * pData);
static sony_result_t intersil_isl9492_Initialize (sony_lnbc_t * pLnbc);
static sony_result_t intersil_isl9492_SetConfig (sony_lnbc_t * pLnbc,
sony_lnbc_config_id_t configId,
int32_t value);
static sony_result_t intersil_isl9492_SetVoltage (sony_lnbc_t * pLnbc,
sony_lnbc_voltage_t voltage);
static sony_result_t intersil_isl9492_SetTone (sony_lnbc_t * pLnbc,
sony_lnbc_tone_t tone);
static sony_result_t intersil_isl9492_SetTransmitMode (sony_lnbc_t * pLnbc,
sony_lnbc_transmit_mode_t mode);
static sony_result_t intersil_isl9492_Sleep (sony_lnbc_t * pLnbc);
static sony_result_t intersil_isl9492_WakeUp (sony_lnbc_t * pLnbc);
static sony_result_t intersil_isl9492_GetDiagStatus (sony_lnbc_t * pLnbc,
uint32_t * pStatus,
uint32_t * pStatusSupported);
/*----------------------------------------------------------------------------
Functions
----------------------------------------------------------------------------*/
sony_result_t intersil_isl9492_Create (sony_lnbc_t * pLnbc,
uint8_t i2cAddress,
sony_i2c_t * pI2c)
{
SONY_TRACE_ENTER ("intersil_isl9492_Create");
if ((!pLnbc) || (!pI2c)){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
pLnbc->i2cAddress = i2cAddress;
pLnbc->pI2c = pI2c;
pLnbc->Initialize = intersil_isl9492_Initialize;
pLnbc->SetConfig = intersil_isl9492_SetConfig;
pLnbc->SetVoltage = intersil_isl9492_SetVoltage;
pLnbc->SetTone = intersil_isl9492_SetTone;
pLnbc->SetTransmitMode = intersil_isl9492_SetTransmitMode;
pLnbc->Sleep = intersil_isl9492_Sleep;
pLnbc->WakeUp = intersil_isl9492_WakeUp;
pLnbc->GetDiagStatus = intersil_isl9492_GetDiagStatus;
pLnbc->isInternalTone = 0;
pLnbc->lowVoltage = INTERSIL_ISL9492_CONFIG_VOLTAGE_LOW_13_5V; /* Default value */
pLnbc->highVoltage = INTERSIL_ISL9492_CONFIG_VOLTAGE_HIGH_18_5V; /* Default value */
pLnbc->state = SONY_LNBC_STATE_UNKNOWN;
pLnbc->voltage = SONY_LNBC_VOLTAGE_LOW;
pLnbc->tone = SONY_LNBC_TONE_AUTO;
pLnbc->transmitMode = SONY_LNBC_TRANSMIT_MODE_TX;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
static sony_result_t intersil_isl9492_Initialize (sony_lnbc_t * pLnbc)
{
sony_result_t result = SONY_RESULT_OK;
uint8_t data = 0;
SONY_TRACE_ENTER ("intersil_isl9492_Initialize");
if (!pLnbc) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
pLnbc->state = SONY_LNBC_STATE_UNKNOWN;
if (pLnbc->voltage != SONY_LNBC_VOLTAGE_AUTO) {
pLnbc->voltage = SONY_LNBC_VOLTAGE_LOW;
}
if (pLnbc->tone != SONY_LNBC_TONE_AUTO) {
pLnbc->tone = SONY_LNBC_TONE_OFF;
}
if (pLnbc->transmitMode != SONY_LNBC_TRANSMIT_MODE_AUTO) {
pLnbc->transmitMode = SONY_LNBC_TRANSMIT_MODE_TX;
}
result = create_1st_byte (pLnbc, pLnbc->tone, pLnbc->transmitMode, &data);
if (result != SONY_RESULT_OK){SONY_TRACE_RETURN (result);}
if (pLnbc->pI2c->Write(pLnbc->pI2c, pLnbc->i2cAddress, &data, 1, SONY_I2C_START_EN|SONY_I2C_STOP_EN) != SONY_RESULT_OK){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
result = create_2nd_byte (pLnbc, pLnbc->voltage, &data);
if (result != SONY_RESULT_OK){SONY_TRACE_RETURN (result);}
if (pLnbc->pI2c->Write(pLnbc->pI2c, pLnbc->i2cAddress, &data, 1, SONY_I2C_START_EN|SONY_I2C_STOP_EN) != SONY_RESULT_OK){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
result = create_3rd_byte (pLnbc, 0, pLnbc->voltage, &data);
if (result != SONY_RESULT_OK){SONY_TRACE_RETURN (result);}
if (pLnbc->pI2c->Write(pLnbc->pI2c, pLnbc->i2cAddress, &data, 1, SONY_I2C_START_EN|SONY_I2C_STOP_EN) != SONY_RESULT_OK){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
pLnbc->state = SONY_LNBC_STATE_SLEEP;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
static sony_result_t intersil_isl9492_SetConfig (sony_lnbc_t * pLnbc,
sony_lnbc_config_id_t configId,
int32_t value)
{
sony_result_t result = SONY_RESULT_OK;
SONY_TRACE_ENTER ("intersil_isl9492_SetConfig");
if (!pLnbc){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
if ((pLnbc->state != SONY_LNBC_STATE_ACTIVE) &&
(pLnbc->state != SONY_LNBC_STATE_SLEEP)) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_SW_STATE);
}
switch(configId)
{
case SONY_LNBC_CONFIG_ID_TONE_INTERNAL:
if ((value != 0) && (value != 1)){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_RANGE);
} else {
pLnbc->isInternalTone = value;
result = intersil_isl9492_SetTone (pLnbc, pLnbc->tone);
if (result != SONY_RESULT_OK){
SONY_TRACE_RETURN (result);
}
}
break;
case SONY_LNBC_CONFIG_ID_LOW_VOLTAGE:
if ((value != INTERSIL_ISL9492_CONFIG_VOLTAGE_LOW_13_5V) &&
(value != INTERSIL_ISL9492_CONFIG_VOLTAGE_LOW_14_2V)){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_RANGE);
} else {
pLnbc->lowVoltage = value;
result = intersil_isl9492_SetVoltage (pLnbc, pLnbc->voltage);
if (result != SONY_RESULT_OK){
SONY_TRACE_RETURN (result);
}
}
break;
case SONY_LNBC_CONFIG_ID_HIGH_VOLTAGE:
if ((value != INTERSIL_ISL9492_CONFIG_VOLTAGE_HIGH_18_5V) &&
(value != INTERSIL_ISL9492_CONFIG_VOLTAGE_HIGH_20_0V)){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_RANGE);
} else {
pLnbc->highVoltage = value;
result = intersil_isl9492_SetVoltage (pLnbc, pLnbc->voltage);
if (result != SONY_RESULT_OK){
SONY_TRACE_RETURN (result);
}
}
break;
default:
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
static sony_result_t intersil_isl9492_SetVoltage (sony_lnbc_t * pLnbc,
sony_lnbc_voltage_t voltage)
{
sony_result_t result = SONY_RESULT_OK;
uint8_t data = 0;
SONY_TRACE_ENTER ("intersil_isl9492_SetVoltage");
if (!pLnbc){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
if ((pLnbc->state != SONY_LNBC_STATE_ACTIVE) &&
(pLnbc->state != SONY_LNBC_STATE_SLEEP)) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_SW_STATE);
}
if (pLnbc->voltage == SONY_LNBC_VOLTAGE_AUTO){
switch(voltage)
{
case SONY_LNBC_VOLTAGE_AUTO:
/* Do nothing */
break;
case SONY_LNBC_VOLTAGE_LOW:
case SONY_LNBC_VOLTAGE_HIGH:
result = create_2nd_byte (pLnbc, voltage, &data);
if (result != SONY_RESULT_OK){SONY_TRACE_RETURN (result);}
if (pLnbc->state == SONY_LNBC_STATE_ACTIVE) {
if (pLnbc->pI2c->Write(pLnbc->pI2c, pLnbc->i2cAddress, &data, 1, SONY_I2C_START_EN|SONY_I2C_STOP_EN) != SONY_RESULT_OK){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
}
break;
default:
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
} else if ((pLnbc->voltage == SONY_LNBC_VOLTAGE_LOW) || (pLnbc->voltage == SONY_LNBC_VOLTAGE_HIGH)){
switch(voltage)
{
case SONY_LNBC_VOLTAGE_AUTO:
/* Low/High -> Auto */
result = create_2nd_byte (pLnbc, voltage, &data);
if (result != SONY_RESULT_OK){SONY_TRACE_RETURN (result);}
if (pLnbc->state == SONY_LNBC_STATE_ACTIVE) {
if (pLnbc->pI2c->Write(pLnbc->pI2c, pLnbc->i2cAddress, &data, 1, SONY_I2C_START_EN|SONY_I2C_STOP_EN) != SONY_RESULT_OK){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
}
break;
case SONY_LNBC_VOLTAGE_LOW:
case SONY_LNBC_VOLTAGE_HIGH:
/* Do nothing */
break;
default:
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
} else {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_SW_STATE);
}
result = create_3rd_byte (pLnbc, 1, voltage, &data);
if (result != SONY_RESULT_OK){SONY_TRACE_RETURN (result);}
if (pLnbc->state == SONY_LNBC_STATE_ACTIVE) {
if (pLnbc->pI2c->Write(pLnbc->pI2c, pLnbc->i2cAddress, &data, 1, SONY_I2C_START_EN|SONY_I2C_STOP_EN) != SONY_RESULT_OK){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
}
pLnbc->voltage = voltage;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
static sony_result_t intersil_isl9492_SetTone (sony_lnbc_t * pLnbc,
sony_lnbc_tone_t tone)
{
sony_result_t result = SONY_RESULT_OK;
uint8_t data = 0;
SONY_TRACE_ENTER ("intersil_isl9492_SetTone");
if (!pLnbc){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
if ((pLnbc->state != SONY_LNBC_STATE_ACTIVE) &&
(pLnbc->state != SONY_LNBC_STATE_SLEEP)) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_SW_STATE);
}
result = create_1st_byte (pLnbc, tone, pLnbc->transmitMode, &data);
if (result != SONY_RESULT_OK){SONY_TRACE_RETURN (result);}
if (pLnbc->state == SONY_LNBC_STATE_ACTIVE) {
if (pLnbc->pI2c->Write(pLnbc->pI2c, pLnbc->i2cAddress, &data, 1, SONY_I2C_START_EN|SONY_I2C_STOP_EN) != SONY_RESULT_OK){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
}
pLnbc->tone = tone;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
static sony_result_t intersil_isl9492_SetTransmitMode (sony_lnbc_t * pLnbc,
sony_lnbc_transmit_mode_t mode)
{
sony_result_t result = SONY_RESULT_OK;
uint8_t data = 0;
SONY_TRACE_ENTER ("intersil_isl9492_SetTransmitMode");
if (!pLnbc){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
if ((pLnbc->state != SONY_LNBC_STATE_ACTIVE) &&
(pLnbc->state != SONY_LNBC_STATE_SLEEP)) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_SW_STATE);
}
result = create_1st_byte (pLnbc, pLnbc->tone, mode, &data);
if (result != SONY_RESULT_OK){SONY_TRACE_RETURN (result);}
if (pLnbc->state == SONY_LNBC_STATE_ACTIVE) {
if (pLnbc->pI2c->Write(pLnbc->pI2c, pLnbc->i2cAddress, &data, 1, SONY_I2C_START_EN|SONY_I2C_STOP_EN) != SONY_RESULT_OK){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
}
pLnbc->transmitMode = mode;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
static sony_result_t intersil_isl9492_Sleep (sony_lnbc_t * pLnbc)
{
sony_result_t result = SONY_RESULT_OK;
uint8_t data = 0;
SONY_TRACE_ENTER ("intersil_isl9492_Sleep");
if (!pLnbc){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
switch(pLnbc->state)
{
case SONY_LNBC_STATE_ACTIVE:
/* Continue */
break;
case SONY_LNBC_STATE_SLEEP:
/* Do nothing */
SONY_TRACE_RETURN (SONY_RESULT_OK);
case SONY_LNBC_STATE_UNKNOWN:
default:
/* Error */
SONY_TRACE_RETURN (SONY_RESULT_ERROR_SW_STATE);
}
result = create_3rd_byte (pLnbc, 0, pLnbc->voltage, &data);
if (result != SONY_RESULT_OK){SONY_TRACE_RETURN (result);}
if (pLnbc->pI2c->Write(pLnbc->pI2c, pLnbc->i2cAddress, &data, 1, SONY_I2C_START_EN|SONY_I2C_STOP_EN) != SONY_RESULT_OK){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
pLnbc->state = SONY_LNBC_STATE_SLEEP;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
static sony_result_t intersil_isl9492_WakeUp (sony_lnbc_t * pLnbc)
{
sony_result_t result = SONY_RESULT_OK;
uint8_t data = 0;
SONY_TRACE_ENTER ("intersil_isl9492_WakeUp");
if (!pLnbc){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
switch(pLnbc->state)
{
case SONY_LNBC_STATE_ACTIVE:
/* Do nothing */
SONY_TRACE_RETURN (SONY_RESULT_OK);
case SONY_LNBC_STATE_SLEEP:
/* Continue */
break;
case SONY_LNBC_STATE_UNKNOWN:
default:
/* Error */
SONY_TRACE_RETURN (SONY_RESULT_ERROR_SW_STATE);
}
result = create_1st_byte (pLnbc, pLnbc->tone, pLnbc->transmitMode, &data);
if (result != SONY_RESULT_OK){SONY_TRACE_RETURN (result);}
if (pLnbc->pI2c->Write(pLnbc->pI2c, pLnbc->i2cAddress, &data, 1, SONY_I2C_START_EN|SONY_I2C_STOP_EN) != SONY_RESULT_OK){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
result = create_2nd_byte (pLnbc, pLnbc->voltage, &data);
if (result != SONY_RESULT_OK){SONY_TRACE_RETURN (result);}
if (pLnbc->pI2c->Write(pLnbc->pI2c, pLnbc->i2cAddress, &data, 1, SONY_I2C_START_EN|SONY_I2C_STOP_EN) != SONY_RESULT_OK){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
result = create_3rd_byte (pLnbc, 1, pLnbc->voltage, &data);
if (result != SONY_RESULT_OK){SONY_TRACE_RETURN (result);}
if (pLnbc->pI2c->Write(pLnbc->pI2c, pLnbc->i2cAddress, &data, 1, SONY_I2C_START_EN|SONY_I2C_STOP_EN) != SONY_RESULT_OK){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
pLnbc->state = SONY_LNBC_STATE_ACTIVE;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
static sony_result_t intersil_isl9492_GetDiagStatus (sony_lnbc_t * pLnbc,
uint32_t * pStatus,
uint32_t * pStatusSupported)
{
uint8_t data = 0;
SONY_TRACE_ENTER ("intersil_isl9492_GetDiagStatus");
if ((!pLnbc) || (!pStatus)) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
if (pStatusSupported) {
*pStatusSupported = SONY_LNBC_DIAG_STATUS_BACKBIAS | SONY_LNBC_DIAG_STATUS_OVERCURRENT
| SONY_LNBC_DIAG_STATUS_VOUTOUTOFRANGE | SONY_LNBC_DIAG_STATUS_CABLEOPEN
| SONY_LNBC_DIAG_STATUS_THERMALSHUTDOWN;
}
if (pLnbc->pI2c->Read (pLnbc->pI2c, pLnbc->i2cAddress, &data, 1, SONY_I2C_START_EN|SONY_I2C_STOP_EN) != SONY_RESULT_OK){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
/* Status Register (SR1)
* +---------+---------+---------+---------+---------+---------+---------+---------+
* | SR1H | SR1M | SR1L | OTF | CABF | OUVF | OLF | BCF |
* +---------+---------+---------+---------+---------+---------+---------+---------+
*/
*pStatus = 0;
if (data & 0x01) {
*pStatus |= SONY_LNBC_DIAG_STATUS_BACKBIAS;
}
if (data & 0x02) {
*pStatus |= SONY_LNBC_DIAG_STATUS_OVERCURRENT;
}
if (data & 0x04) {
*pStatus |= SONY_LNBC_DIAG_STATUS_VOUTOUTOFRANGE;
}
if (data & 0x08) {
*pStatus |= SONY_LNBC_DIAG_STATUS_CABLEOPEN;
}
if (data & 0x10) {
*pStatus |= SONY_LNBC_DIAG_STATUS_THERMALSHUTDOWN;
}
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
static sony_result_t create_1st_byte (sony_lnbc_t * pLnbc,
sony_lnbc_tone_t tone,
sony_lnbc_transmit_mode_t mode,
uint8_t * pData)
{
SONY_TRACE_ENTER ("create_1st_byte");
if ((!pLnbc) || (!pData)){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
/* SR2
* +-----+-----+-----+-----+-----+-----+-----+-----+
* |SR2H |SR2M |SR2L | ENT |MSEL | TTH |Res* |Res* |
* +-----+-----+-----+-----+-----+-----+-----+-----+
* | 0 | 0 | 1 | ? | ? | ? | 0 | 0 |
* +-----+-----+-----+-----+-----+-----+-----+-----+
* ENT = 0 : Tone OFF ( or auto )
* = 1 : Tone ON
*
* MSEL = 0 : Envelope (internal tone) / I2C control
* = 1 : PWM (external tone)
*
* TTH = 0 : RX mode
* = 1 : TX mode
*/
*pData = 0x20;
switch(tone)
{
case SONY_LNBC_TONE_OFF:
case SONY_LNBC_TONE_AUTO:
/* ENT = 0 */
break;
case SONY_LNBC_TONE_ON:
/* ENT = 1 */
*pData |= 0x10;
break;
default:
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
switch(tone)
{
case SONY_LNBC_TONE_AUTO:
if (pLnbc->isInternalTone){
/* MSEL = 0 */
} else {
/* MSEL = 1 */
*pData |= 0x08;
}
break;
case SONY_LNBC_TONE_OFF:
case SONY_LNBC_TONE_ON:
/* MSEL = 0 */
break;
default:
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
switch(mode)
{
case SONY_LNBC_TRANSMIT_MODE_TX:
/* TTH = 1 */
*pData |= 0x04;
break;
case SONY_LNBC_TRANSMIT_MODE_RX:
case SONY_LNBC_TRANSMIT_MODE_AUTO:
/* TTH = 0 */
break;
default:
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
static sony_result_t create_2nd_byte (sony_lnbc_t * pLnbc,
sony_lnbc_voltage_t voltage,
uint8_t * pData)
{
SONY_TRACE_ENTER ("create_2nd_byte");
if ((!pLnbc) || (!pData)){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
/* SR3
* +-----+-----+-----+-----+-----+-----+-----+-----+
* |SR3H |SR3M |SR3L |Res* |VSPEN| DCL |ISELH|ISELL|
* +-----+-----+-----+-----+-----+-----+-----+-----+
* | 0 | 1 | 0 | 0 | ? | 0 | 0 | 0 |
* +-----+-----+-----+-----+-----+-----+-----+-----+
* VSPEN = 0 : TXEN enable
* = 1 : TXEN disable
*/
*pData = 0x40;
switch(voltage)
{
case SONY_LNBC_VOLTAGE_LOW:
case SONY_LNBC_VOLTAGE_HIGH:
/* VSPEN = 1 */
*pData |= 0x08;
break;
case SONY_LNBC_VOLTAGE_AUTO:
/* VSPEN = 0 */
break;
default:
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
static sony_result_t create_3rd_byte (sony_lnbc_t * pLnbc,
uint8_t isEnable,
sony_lnbc_voltage_t voltage,
uint8_t * pData)
{
SONY_TRACE_ENTER ("create_3rd_byte");
if ((!pLnbc) || (!pData)){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
/* SR4
* +-----+-----+-----+-----+-----+-----+-----+-----+
* |SR4H |SR4M |SR4L | EN |DLIN |Res* |VTOP |VBOT |
* +-----+-----+-----+-----+-----+-----+-----+-----+
* | 0 | 1 | 1 | ? | ? | 0 | ? | ? |
* +-----+-----+-----+-----+-----+-----+-----+-----+
* EN = 0 : SLEEP
* = 1 : ACTIVE
*
* DLIN = 0 : SLEEP
* = 1 : ACTIVE
*
* VTOP = 0 : Others
* = 1 : (Auto & HIGH-20V) / (High)
*
* VBOT = 0 : Others
* = 1 : (Auto & LOW-14V) / (Low & LOW-14V) / (High & HIGH-20V)
*/
*pData = 0x60;
if (isEnable){
/* EN = 1, DLIN = 1 */
*pData |= 0x18;
}
if ((voltage == SONY_LNBC_VOLTAGE_AUTO) && (pLnbc->highVoltage == INTERSIL_ISL9492_CONFIG_VOLTAGE_HIGH_20_0V)){
/* VTOP = 1 */
*pData |= 0x02;
} else if (voltage == SONY_LNBC_VOLTAGE_HIGH){
/* VTOP = 1 */
*pData |= 0x02;
} else {
/* VTOP = 0 */
}
if ((voltage == SONY_LNBC_VOLTAGE_AUTO) && (pLnbc->lowVoltage == INTERSIL_ISL9492_CONFIG_VOLTAGE_LOW_14_2V)){
/* VBOT = 1 */
*pData |= 0x01;
} else if ((voltage == SONY_LNBC_VOLTAGE_LOW) && (pLnbc->lowVoltage == INTERSIL_ISL9492_CONFIG_VOLTAGE_LOW_14_2V)){
/* VBOT = 1 */
*pData |= 0x01;
} else if ((voltage == SONY_LNBC_VOLTAGE_HIGH) && (pLnbc->highVoltage == INTERSIL_ISL9492_CONFIG_VOLTAGE_HIGH_20_0V)){
/* VBOT = 1 */
*pData |= 0x01;
} else {
/* VBOT = 0 */
}
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
@@ -0,0 +1,67 @@
/*------------------------------------------------------------------------------
Copyright 2016 Sony Semiconductor Solutions Corporation
Last Updated : 2016/06/24
Modification ID : 3b74e280b7ad8ce430b6a9419ac53e8f2e3737f9
------------------------------------------------------------------------------*/
/**
@file intersil_isl9492.h
This file provides the functions to control ISL9492(Intersil).
*/
/*----------------------------------------------------------------------------*/
#ifndef INTERSIL_ISL9492_H
#define INTERSIL_ISL9492_H
#include "sony_common.h"
#include "sony_lnbc.h"
/**
@brief Use 13.5V for low level output voltage.
If you would like to use 13.5V as "Low level voltage",
please set this parameter by sony_lnbc_t::SetConfig(SONY_LNBC_CONFIG_ID_LOW_VOLTAGE, value).
*/
#define INTERSIL_ISL9492_CONFIG_VOLTAGE_LOW_13_5V 0
/**
@brief Use 14.2V for low level output voltage.
If you would like to use 14.2V as "Low level voltage",
please set this parameter by sony_lnbc_t::SetConfig(SONY_LNBC_CONFIG_ID_LOW_VOLTAGE, value).
*/
#define INTERSIL_ISL9492_CONFIG_VOLTAGE_LOW_14_2V 1
/**
@brief Use 18.5V for high level output voltage.
If you would like to use 18.5V as "High level voltage",
please set this parameter by sony_lnbc_t::SetConfig(SONY_LNBC_CONFIG_ID_HIGH_VOLTAGE, value).
*/
#define INTERSIL_ISL9492_CONFIG_VOLTAGE_HIGH_18_5V 10
/**
@brief Use 20.0V for high level output voltage.
If you would like to use 20.0V as "High level voltage",
please set this parameter by sony_lnbc_t::SetConfig(SONY_LNBC_CONFIG_ID_HIGH_VOLTAGE, value).
*/
#define INTERSIL_ISL9492_CONFIG_VOLTAGE_HIGH_20_0V 11
/*------------------------------------------------------------------------------
Functions
------------------------------------------------------------------------------*/
/**
@brief Create a instance for ISL9492(Intersil).
@param pLnbc LNB controller driver instance.
@param i2cAddress I2C address.
@param pI2c I2C instance.
@return SONY_RESULT_OK if successful.
*/
sony_result_t intersil_isl9492_Create (sony_lnbc_t * pLnbc,
uint8_t i2cAddress,
sony_i2c_t * pI2c);
#endif /* INTERSIL_ISL9492_H */
@@ -0,0 +1,478 @@
/*------------------------------------------------------------------------------
Copyright 2016-2017 Sony Semiconductor Solutions Corporation
Last Updated : 2017/11/30
Modification ID : 253a4918e2da2cf28a9393596fa16f25024e504d
------------------------------------------------------------------------------*/
#include "sony_common.h"
#include "sony_lnbc.h"
#include "mps_mp8126.h"
/*----------------------------------------------------------------------------
Static Functions
----------------------------------------------------------------------------*/
static sony_result_t mps_mp8126_Initialize (sony_lnbc_t * pLnbc);
static sony_result_t mps_mp8126_SetConfig (sony_lnbc_t * pLnbc,
sony_lnbc_config_id_t configId,
int32_t value);
static sony_result_t mps_mp8126_SetVoltage (sony_lnbc_t * pLnbc,
sony_lnbc_voltage_t voltage);
static sony_result_t mps_mp8126_SetTone (sony_lnbc_t * pLnbc,
sony_lnbc_tone_t tone);
static sony_result_t mps_mp8126_SetTransmitMode (sony_lnbc_t * pLnbc,
sony_lnbc_transmit_mode_t mode);
static sony_result_t mps_mp8126_Sleep (sony_lnbc_t * pLnbc);
static sony_result_t mps_mp8126_WakeUp (sony_lnbc_t * pLnbc);
/*----------------------------------------------------------------------------
Functions
----------------------------------------------------------------------------*/
sony_result_t mps_mp8126_Create (sony_lnbc_t * pLnbc,
sony_demod_t * pDemod,
sony_demod_gpio_pin_t voltagePinId,
sony_demod_gpio_pin_t linedropPinId,
sony_demod_gpio_pin_t enablePinId,
mps_mp8126_t * pMP8126)
{
SONY_TRACE_ENTER ("mps_mp8126_Create");
if ((!pLnbc) || (!pDemod) || (!pMP8126)) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
pLnbc->i2cAddress = 0;
pLnbc->pI2c = NULL;
pLnbc->Initialize = mps_mp8126_Initialize;
pLnbc->SetConfig = mps_mp8126_SetConfig;
pLnbc->SetVoltage = mps_mp8126_SetVoltage;
pLnbc->SetTone = mps_mp8126_SetTone;
pLnbc->SetTransmitMode = mps_mp8126_SetTransmitMode;
pLnbc->Sleep = mps_mp8126_Sleep;
pLnbc->WakeUp = mps_mp8126_WakeUp;
pLnbc->GetDiagStatus = NULL; /* Not supported */
pLnbc->user = (void *)pMP8126;
pLnbc->isInternalTone = 0;
pLnbc->lowVoltage = MPS_MP8126_CONFIG_VOLTAGE_LOW_13V; /* Default value */
pLnbc->highVoltage = MPS_MP8126_CONFIG_VOLTAGE_HIGH_18V; /* Default value */
pLnbc->state = SONY_LNBC_STATE_UNKNOWN;
pLnbc->voltage = SONY_LNBC_VOLTAGE_LOW;
pLnbc->tone = SONY_LNBC_TONE_AUTO;
pLnbc->transmitMode = SONY_LNBC_TRANSMIT_MODE_TX;
pMP8126->pDemod = pDemod;
pMP8126->voltagePinId = voltagePinId;
pMP8126->linedropPinId = linedropPinId;
pMP8126->enablePinId = enablePinId;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
static sony_result_t mps_mp8126_Initialize (sony_lnbc_t * pLnbc)
{
sony_result_t result = SONY_RESULT_OK;
mps_mp8126_t * pMP8126;
SONY_TRACE_ENTER ("mps_mp8126_Initialize");
if ((!pLnbc) || (!pLnbc->user)) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
pLnbc->state = SONY_LNBC_STATE_UNKNOWN;
if (pLnbc->voltage != SONY_LNBC_VOLTAGE_AUTO) {
pLnbc->voltage = SONY_LNBC_VOLTAGE_LOW;
}
pLnbc->tone = SONY_LNBC_TONE_AUTO; /* Auto is only supported */
pLnbc->transmitMode = SONY_LNBC_TRANSMIT_MODE_TX; /* RX is not supported */
pMP8126 = (mps_mp8126_t *)(pLnbc->user);
result = sony_demod_GPIOSetConfig (pMP8126->pDemod, pMP8126->enablePinId, 1, SONY_DEMOD_GPIO_MODE_OUTPUT);
if (result != SONY_RESULT_OK) {
SONY_TRACE_RETURN (result);
}
/* Disable the LNBC. */
result = sony_demod_GPIOWrite (pMP8126->pDemod, pMP8126->enablePinId, 0);
if (result != SONY_RESULT_OK) {
SONY_TRACE_RETURN (result);
}
if (pLnbc->voltage == SONY_LNBC_VOLTAGE_AUTO) {
result = sony_demod_GPIOSetConfig (pMP8126->pDemod, pMP8126->voltagePinId, 1, SONY_DEMOD_GPIO_MODE_DISEQC_TX_EN);
if (result != SONY_RESULT_OK) {
SONY_TRACE_RETURN (result);
}
result = sony_demod_GPIOSetConfig (pMP8126->pDemod, pMP8126->linedropPinId, 1, SONY_DEMOD_GPIO_MODE_OUTPUT);
if (result != SONY_RESULT_OK) {
SONY_TRACE_RETURN (result);
}
/* In auto mode, linedrop cannot be controlled by every SetVoltage call. So set fixed value. */
if ((pLnbc->lowVoltage == MPS_MP8126_CONFIG_VOLTAGE_LOW_14V) || (pLnbc->highVoltage == MPS_MP8126_CONFIG_VOLTAGE_HIGH_19V)) {
/* Set LineDrop Pin to high state. */
result = sony_demod_GPIOWrite (pMP8126->pDemod, pMP8126->linedropPinId, 1);
if (result != SONY_RESULT_OK) {
SONY_TRACE_RETURN (result);
}
} else {
/* Set LineDrop Pin to low state. */
result = sony_demod_GPIOWrite (pMP8126->pDemod, pMP8126->linedropPinId, 0);
if (result != SONY_RESULT_OK) {
SONY_TRACE_RETURN (result);
}
}
} else {
result = sony_demod_GPIOSetConfig (pMP8126->pDemod, pMP8126->voltagePinId, 1, SONY_DEMOD_GPIO_MODE_OUTPUT);
if (result != SONY_RESULT_OK) {
SONY_TRACE_RETURN (result);
}
result = sony_demod_GPIOSetConfig (pMP8126->pDemod, pMP8126->linedropPinId, 1, SONY_DEMOD_GPIO_MODE_OUTPUT);
if (result != SONY_RESULT_OK) {
SONY_TRACE_RETURN (result);
}
/* Set Voltage Pin to low state. */
result = sony_demod_GPIOWrite (pMP8126->pDemod, pMP8126->voltagePinId, 0);
if (result != SONY_RESULT_OK) {
SONY_TRACE_RETURN (result);
}
/* Set LineDrop Pin to low state. */
result = sony_demod_GPIOWrite (pMP8126->pDemod, pMP8126->linedropPinId, 0);
if (result != SONY_RESULT_OK) {
SONY_TRACE_RETURN (result);
}
}
pLnbc->state = SONY_LNBC_STATE_SLEEP;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
static sony_result_t mps_mp8126_SetConfig (sony_lnbc_t * pLnbc,
sony_lnbc_config_id_t configId,
int32_t value)
{
sony_result_t result = SONY_RESULT_OK;
SONY_TRACE_ENTER ("mps_mp8126_SetConfig");
if ((!pLnbc) || (!pLnbc->user)) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
if ((pLnbc->state != SONY_LNBC_STATE_ACTIVE) &&
(pLnbc->state != SONY_LNBC_STATE_SLEEP)) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_SW_STATE);
}
switch(configId)
{
case SONY_LNBC_CONFIG_ID_TONE_INTERNAL:
if (value == 0) {
pLnbc->isInternalTone = value;
} else if (value == 1) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_NOSUPPORT);
} else {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_RANGE);
}
break;
case SONY_LNBC_CONFIG_ID_LOW_VOLTAGE:
if ((value != MPS_MP8126_CONFIG_VOLTAGE_LOW_13V) &&
(value != MPS_MP8126_CONFIG_VOLTAGE_LOW_14V)) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_RANGE);
} else {
pLnbc->lowVoltage = value;
result = mps_mp8126_SetVoltage (pLnbc, pLnbc->voltage);
if (result != SONY_RESULT_OK) {
SONY_TRACE_RETURN (result);
}
}
break;
case SONY_LNBC_CONFIG_ID_HIGH_VOLTAGE:
if ((value != MPS_MP8126_CONFIG_VOLTAGE_HIGH_18V) &&
(value != MPS_MP8126_CONFIG_VOLTAGE_HIGH_19V)) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_RANGE);
} else {
pLnbc->highVoltage = value;
result = mps_mp8126_SetVoltage (pLnbc, pLnbc->voltage);
if (result != SONY_RESULT_OK) {
SONY_TRACE_RETURN (result);
}
}
break;
default:
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
SONY_TRACE_RETURN (result);
}
static sony_result_t mps_mp8126_SetVoltage (sony_lnbc_t * pLnbc,
sony_lnbc_voltage_t voltage)
{
sony_result_t result = SONY_RESULT_OK;
mps_mp8126_t * pMP8126;
SONY_TRACE_ENTER ("mps_mp8126_SetVoltage");
if ((!pLnbc) || (!pLnbc->user)) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
pMP8126 = (mps_mp8126_t *)(pLnbc->user);
if ((pLnbc->state != SONY_LNBC_STATE_ACTIVE) &&
(pLnbc->state != SONY_LNBC_STATE_SLEEP)) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_SW_STATE);
}
switch(voltage)
{
case SONY_LNBC_VOLTAGE_LOW:
if (pLnbc->voltage == SONY_LNBC_VOLTAGE_AUTO) {
/* Configure voltage GPIO pin as an output. */
result = sony_demod_GPIOSetConfig (pMP8126->pDemod, pMP8126->voltagePinId, 1, SONY_DEMOD_GPIO_MODE_OUTPUT);
if (result != SONY_RESULT_OK) {
SONY_TRACE_RETURN (result);
}
}
if (pLnbc->lowVoltage == MPS_MP8126_CONFIG_VOLTAGE_LOW_13V) {
result = sony_demod_GPIOWrite (pMP8126->pDemod, pMP8126->linedropPinId, 0);
if (result != SONY_RESULT_OK) {
SONY_TRACE_RETURN (result);
}
} else if (pLnbc->lowVoltage == MPS_MP8126_CONFIG_VOLTAGE_LOW_14V) {
result = sony_demod_GPIOWrite (pMP8126->pDemod, pMP8126->linedropPinId, 1);
if (result != SONY_RESULT_OK) {
SONY_TRACE_RETURN (result);
}
} else {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
result = sony_demod_GPIOWrite (pMP8126->pDemod, pMP8126->voltagePinId, 0);
if (result != SONY_RESULT_OK) {
SONY_TRACE_RETURN (result);
}
break;
case SONY_LNBC_VOLTAGE_HIGH:
if (pLnbc->voltage == SONY_LNBC_VOLTAGE_AUTO) {
/* Configure voltage GPIO pin as an output. */
result = sony_demod_GPIOSetConfig (pMP8126->pDemod, pMP8126->voltagePinId, 1, SONY_DEMOD_GPIO_MODE_OUTPUT);
if (result != SONY_RESULT_OK) {
SONY_TRACE_RETURN (result);
}
}
if (pLnbc->highVoltage == MPS_MP8126_CONFIG_VOLTAGE_HIGH_18V) {
result = sony_demod_GPIOWrite (pMP8126->pDemod, pMP8126->linedropPinId, 0);
if (result != SONY_RESULT_OK) {
SONY_TRACE_RETURN (result);
}
} else if (pLnbc->highVoltage == MPS_MP8126_CONFIG_VOLTAGE_HIGH_19V) {
result = sony_demod_GPIOWrite (pMP8126->pDemod, pMP8126->linedropPinId, 1);
if (result != SONY_RESULT_OK) {
SONY_TRACE_RETURN (result);
}
} else {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
result = sony_demod_GPIOWrite (pMP8126->pDemod, pMP8126->voltagePinId, 1);
if (result != SONY_RESULT_OK) {
SONY_TRACE_RETURN (result);
}
break;
case SONY_LNBC_VOLTAGE_AUTO:
/* In auto mode, linedrop cannot be controlled by every SetVoltage call. So set fixed value. */
if ((pLnbc->lowVoltage == MPS_MP8126_CONFIG_VOLTAGE_LOW_14V) || (pLnbc->highVoltage == MPS_MP8126_CONFIG_VOLTAGE_HIGH_19V)) {
/* Set LineDrop Pin to high state. */
result = sony_demod_GPIOWrite (pMP8126->pDemod, pMP8126->linedropPinId, 1);
if (result != SONY_RESULT_OK) {
SONY_TRACE_RETURN (result);
}
} else {
/* Set LineDrop Pin to low state. */
result = sony_demod_GPIOWrite (pMP8126->pDemod, pMP8126->linedropPinId, 0);
if (result != SONY_RESULT_OK) {
SONY_TRACE_RETURN (result);
}
}
/* Configure voltage GPIO pin as DISEQC TX. */
result = sony_demod_GPIOSetConfig (pMP8126->pDemod, pMP8126->voltagePinId, 1, SONY_DEMOD_GPIO_MODE_DISEQC_TX_EN);
if (result != SONY_RESULT_OK) {
SONY_TRACE_RETURN (result);
}
break;
default:
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
pLnbc->voltage = voltage;
SONY_TRACE_RETURN (result);
}
static sony_result_t mps_mp8126_SetTone (sony_lnbc_t * pLnbc,
sony_lnbc_tone_t tone)
{
SONY_TRACE_ENTER ("mps_mp8126_SetTone");
if (!pLnbc) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
if ((pLnbc->state != SONY_LNBC_STATE_ACTIVE) &&
(pLnbc->state != SONY_LNBC_STATE_SLEEP)) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_SW_STATE);
}
switch(tone)
{
case SONY_LNBC_TONE_OFF:
case SONY_LNBC_TONE_ON:
SONY_TRACE_RETURN (SONY_RESULT_ERROR_NOSUPPORT);
break;
case SONY_LNBC_TONE_AUTO:
/* Do nothing */
break;
default:
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
pLnbc->tone = tone;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
static sony_result_t mps_mp8126_SetTransmitMode (sony_lnbc_t * pLnbc,
sony_lnbc_transmit_mode_t mode)
{
SONY_TRACE_ENTER ("mps_mp8126_SetTransmitMode");
if (!pLnbc) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
if ((pLnbc->state != SONY_LNBC_STATE_ACTIVE) &&
(pLnbc->state != SONY_LNBC_STATE_SLEEP)) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_SW_STATE);
}
switch(mode)
{
case SONY_LNBC_TRANSMIT_MODE_TX:
/* Do nothing */
break;
case SONY_LNBC_TRANSMIT_MODE_RX:
case SONY_LNBC_TRANSMIT_MODE_AUTO:
SONY_TRACE_RETURN (SONY_RESULT_ERROR_NOSUPPORT);
break;
default:
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
pLnbc->transmitMode = mode;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
static sony_result_t mps_mp8126_Sleep (sony_lnbc_t * pLnbc)
{
sony_result_t result = SONY_RESULT_OK;
mps_mp8126_t * pMP8126;
SONY_TRACE_ENTER ("mps_mp8126_Sleep");
if ((!pLnbc) || (!pLnbc->user)) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
pMP8126 = (mps_mp8126_t *)(pLnbc->user);
switch(pLnbc->state)
{
case SONY_LNBC_STATE_ACTIVE:
result = sony_demod_GPIOWrite (pMP8126->pDemod, pMP8126->enablePinId, 0);
if (result != SONY_RESULT_OK) {
SONY_TRACE_RETURN (result);
}
break;
case SONY_LNBC_STATE_SLEEP:
/* Do nothing */
SONY_TRACE_RETURN (SONY_RESULT_OK);
case SONY_LNBC_STATE_UNKNOWN:
default:
/* Error */
SONY_TRACE_RETURN (SONY_RESULT_ERROR_SW_STATE);
}
pLnbc->state = SONY_LNBC_STATE_SLEEP;
SONY_TRACE_RETURN (result);
}
static sony_result_t mps_mp8126_WakeUp (sony_lnbc_t * pLnbc)
{
sony_result_t result = SONY_RESULT_OK;
mps_mp8126_t * pMP8126;
SONY_TRACE_ENTER ("mps_mp8126_WakeUp");
if ((!pLnbc) || (!pLnbc->user)) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
pMP8126 = (mps_mp8126_t *)(pLnbc->user);
switch(pLnbc->state)
{
case SONY_LNBC_STATE_ACTIVE:
/* Do nothing */
SONY_TRACE_RETURN (SONY_RESULT_OK);
case SONY_LNBC_STATE_SLEEP:
result = sony_demod_GPIOWrite (pMP8126->pDemod, pMP8126->enablePinId, 1);
if (result != SONY_RESULT_OK) {
SONY_TRACE_RETURN (result);
}
break;
case SONY_LNBC_STATE_UNKNOWN:
default:
/* Error */
SONY_TRACE_RETURN (SONY_RESULT_ERROR_SW_STATE);
}
pLnbc->state = SONY_LNBC_STATE_ACTIVE;
SONY_TRACE_RETURN (result);
}
@@ -0,0 +1,87 @@
/*------------------------------------------------------------------------------
Copyright 2016 Sony Semiconductor Solutions Corporation
Last Updated : 2016/06/24
Modification ID : 3b74e280b7ad8ce430b6a9419ac53e8f2e3737f9
------------------------------------------------------------------------------*/
/**
@file mps_mp8126.h
This file provides the functions to control MP8126(MPS).
*/
/*----------------------------------------------------------------------------*/
#ifndef MPS_MP8126_H
#define MPS_MP8126_H
#include "sony_common.h"
#include "sony_lnbc.h"
#include "sony_demod.h"
/**
@brief Use 13V for low level output voltage.
If you would like to use 13V as "Low level voltage",
please set this parameter by sony_lnbc_t::SetConfig(SONY_LNBC_CONFIG_ID_LOW_VOLTAGE, value).
*/
#define MPS_MP8126_CONFIG_VOLTAGE_LOW_13V 0
/**
@brief Use 14V for low level output voltage.
If you would like to use 14V as "Low level voltage",
please set this parameter by sony_lnbc_t::SetConfig(SONY_LNBC_CONFIG_ID_LOW_VOLTAGE, value).
*/
#define MPS_MP8126_CONFIG_VOLTAGE_LOW_14V 1
/**
@brief Use 18V for high level output voltage.
If you would like to use 18V as "High level voltage",
please set this parameter by sony_lnbc_t::SetConfig(SONY_LNBC_CONFIG_ID_HIGH_VOLTAGE, value).
*/
#define MPS_MP8126_CONFIG_VOLTAGE_HIGH_18V 10
/**
@brief Use 19V for high level output voltage.
If you would like to use 19V as "High level voltage",
please set this parameter by sony_lnbc_t::SetConfig(SONY_LNBC_CONFIG_ID_HIGH_VOLTAGE, value).
*/
#define MPS_MP8126_CONFIG_VOLTAGE_HIGH_19V 11
/*------------------------------------------------------------------------------
Structs
------------------------------------------------------------------------------*/
/**
@brief structure for MPS MP8126 LNBC.
*/
typedef struct mps_mp8126_t {
sony_demod_t * pDemod; /**< Instance of the demodulator. */
sony_demod_gpio_pin_t voltagePinId; /**< Demodulator GPIO ID connected to LNBC 13V/18V pin. */
sony_demod_gpio_pin_t linedropPinId; /**< Demodulator GPIO ID connected to LNBC LINEDROP pin. */
sony_demod_gpio_pin_t enablePinId; /**< Demodulator GPIO ID connected to LNBC EN pin. */
} mps_mp8126_t;
/*------------------------------------------------------------------------------
Functions
------------------------------------------------------------------------------*/
/**
@brief Create a instance for MP8126(MPS).
@param pLnbc LNB controller driver instance.
@param pDemod Demodulator driver instance.
@param voltagePinId Demodulator GPIO ID to control LNBC 13V/18V pin.
@param linedropPinId Demodulator GPIO ID to control LNBC LINEDROP pin.
@param enablePinId Demodulator GPIO ID to control LNBC EN pin.
@param pMP8126 MPS MP8126 LNBC (mps_mp8126_t) instance.
@return SONY_RESULT_OK if successful.
*/
sony_result_t mps_mp8126_Create (sony_lnbc_t * pLnbc,
sony_demod_t * pDemod,
sony_demod_gpio_pin_t voltagePinId,
sony_demod_gpio_pin_t linedropPinId,
sony_demod_gpio_pin_t enablePinId,
mps_mp8126_t * pMP8126);
#endif /* MPS_MP8126_H */
@@ -0,0 +1,217 @@
/*------------------------------------------------------------------------------
Copyright 2016-2017 Sony Semiconductor Solutions Corporation
Last Updated : 2017/11/30
Modification ID : 253a4918e2da2cf28a9393596fa16f25024e504d
------------------------------------------------------------------------------*/
/**
@file sony_lnbc.h
This file provides the LNB controller control interface.
*/
/*----------------------------------------------------------------------------*/
#ifndef SONY_LNBC_H
#define SONY_LNBC_H
#include "../../sony_common.h"
#include "../../sony_i2c.h"
/**
@brief Definition of the state of the driver.
*/
typedef enum {
SONY_LNBC_STATE_UNKNOWN, /**< Unknown */
SONY_LNBC_STATE_SLEEP, /**< Sleep */
SONY_LNBC_STATE_ACTIVE /**< Active */
} sony_lnbc_state_t;
/**
@brief Definition of the voltage.
*/
typedef enum {
SONY_LNBC_VOLTAGE_LOW, /**< Low voltage. */
SONY_LNBC_VOLTAGE_HIGH, /**< High voltage. */
SONY_LNBC_VOLTAGE_AUTO, /**< Control voltage by demodulator. (For single cable, using TXEN) */
} sony_lnbc_voltage_t;
/**
@brief Definition of the tone state.
*/
typedef enum {
SONY_LNBC_TONE_OFF, /**< Not output tone signal. */
SONY_LNBC_TONE_ON, /**< Output tone signal. */
SONY_LNBC_TONE_AUTO, /**< Control tone by demodulator. (Default) */
} sony_lnbc_tone_t;
/**
@brief Transmit mode.
*/
typedef enum {
SONY_LNBC_TRANSMIT_MODE_TX, /**< TX mode. */
SONY_LNBC_TRANSMIT_MODE_RX, /**< RX mode. */
SONY_LNBC_TRANSMIT_MODE_AUTO, /**< Control transmit mode by demodulator. (For receiving DiSEqC2.x reply) */
} sony_lnbc_transmit_mode_t;
/**
@brief Config ID for SetConfig API.
*/
typedef enum {
SONY_LNBC_CONFIG_ID_TONE_INTERNAL, /**< Tone mode (0: External tone, 1: Internal tone). */
SONY_LNBC_CONFIG_ID_LOW_VOLTAGE, /**< Definition of voltage for "Low voltage". */
SONY_LNBC_CONFIG_ID_HIGH_VOLTAGE /**< Definition of voltage for "High voltage". */
} sony_lnbc_config_id_t;
/*
* LNB controller diagnostic status bit definitions used for GetDiagStatus return value.
*/
#define SONY_LNBC_DIAG_STATUS_THERMALSHUTDOWN 0x00000001 /**< Thermal shutdown triggered. */
#define SONY_LNBC_DIAG_STATUS_OVERCURRENT 0x00000002 /**< Over current protection triggered. */
#define SONY_LNBC_DIAG_STATUS_CABLEOPEN 0x00000004 /**< Cable is not connected. */
#define SONY_LNBC_DIAG_STATUS_VOUTOUTOFRANGE 0x00000008 /**< Output voltage is out of range. */
#define SONY_LNBC_DIAG_STATUS_VINOUTOFRANGE 0x00000010 /**< Input voltage is out of range. */
#define SONY_LNBC_DIAG_STATUS_BACKBIAS 0x00000020 /**< Back bias is detected. */
#define SONY_LNBC_DIAG_STATUS_LNBCDISABLE 0x00010000 /**< LNB controller is now disabled. */
/**
@brief Definition of the LNB controller driver API.
*/
typedef struct sony_lnbc_t {
/* ======== Following members are NOT cleared by Initialize ======== */
uint8_t i2cAddress; /**< I2C address. */
sony_i2c_t * pI2c; /**< I2C driver instance. */
int32_t isInternalTone; /**< Tone mode flag. (0: External tone, 1: Internal tone) */
int32_t lowVoltage; /**< Definition of low voltage. */
int32_t highVoltage; /**< Definition of high voltage. */
void * user; /**< User defined data. */
/* ======== Following members are cleared by Initialize (Temporary information) ======== */
/*
* NOTE : voltage == SONY_LNBC_VOLTAGE_AUTO,
* tone == SONY_LNBC_TONE_AUTO,
* transmitMode == SONY_LNBC_TRANSMIT_MODE_AUTO
* cases should not be cleared by Initialize API if they are supported.
*/
sony_lnbc_state_t state; /**< The state of this driver */
sony_lnbc_voltage_t voltage; /**< Current voltage. */
sony_lnbc_tone_t tone; /**< Current tone status. */
sony_lnbc_transmit_mode_t transmitMode; /**< Current transmit mode. */
/* ======== Following function pointer members are NOT cleared by Initialize ======== */
/**
@brief Initialize the LNB controller.
When user call this API, the LNB controller's state is following.
- Voltage : Low
- Tone : Auto (Control tone by demodulator)
- TransmitMode : TX mode
@param pLnbc Instance of the LNB controller driver.
@return SONY_RESULT_OK if successful.
*/
sony_result_t (*Initialize) (struct sony_lnbc_t * pLnbc);
/**
@brief Configure to LNB controller
The parameters set by this API are initialized to default value by Initialize API.
@param pLnbc Instance of the LNB controller driver.
@param configId Configure parameter ID.
@param value The parameter value.
@return SONY_RESULT_OK if successful.
*/
sony_result_t (*SetConfig) (struct sony_lnbc_t * pLnbc, sony_lnbc_config_id_t configId, int32_t value);
/**
@brief Set voltage.
Control output voltage. (switching low voltage (about 13V) and high voltage (about 18V))
Normally, voltage should be controlled explicitly by this API
and SONY_LNBC_VOLTAGE_AUTO should NOT be used.
SONY_LNBC_VOLTAGE_AUTO can be used only for single cable 1,
using TXEN signal from demodulator GPIO pins.
@param pLnbc Instance of the LNB controller driver.
@param voltage Voltage to set.
@return SONY_RESULT_OK if successful.
*/
sony_result_t (*SetVoltage) (struct sony_lnbc_t * pLnbc, sony_lnbc_voltage_t voltage);
/**
@brief Set tone mode.
Control tone output enable/disable.
This API is NOT called from integ/demod part of code.
All integ APIs assumes that SONY_LNBC_TONE_AUTO is always set.
This means that demodulator DSQOUT pin should be connected to the LNB controller
and all LNB controller can control tone ON/OFF by DSQOUT signal.
@param pLnbc Instance of the LNB controller driver.
@param tone Tone mode.
@return SONY_RESULT_OK if successful.
*/
sony_result_t (*SetTone) (struct sony_lnbc_t * pLnbc, sony_lnbc_tone_t tone);
/**
@brief Set transmit mode.
Switch TX (transmit) mode and RX (receive) mode.
Note that to use RX mode, the LNB controller has to support DiSEqC2.X feature.
SONY_LNBC_TRANSMIT_MODE_AUTO can be used if the LNB controller can switch TX/RX without calling this API.
- If the LNB controller can switch TX/RX by RXEN signal from demodulator.
RXEN output from GPIO pin setting will be necessary.
- If the LNB controller can switch TX/RX automatically by DSQOUT signal from demodulator.
@param pLnbc Instance of the LNB controller driver.
@param mode Transmit mode.
@return SONY_RESULT_OK if successful.
*/
sony_result_t (*SetTransmitMode) (struct sony_lnbc_t * pLnbc, sony_lnbc_transmit_mode_t mode);
/**
@brief Sleep the LNB controller.
@param pLnbc Instance of the LNB controller driver.
@return SONY_RESULT_OK if successful.
*/
sony_result_t (*Sleep) (struct sony_lnbc_t * pLnbc);
/**
@brief Return from sleep the LNB controller.
When user call this API, the LNB controller's state is kept before sleep.
@param pLnbc Instance of the LNB controller driver.
@return SONY_RESULT_OK if successful.
*/
sony_result_t (*WakeUp) (struct sony_lnbc_t * pLnbc);
/**
@brief Read LNB controller diagnostic status.
Depend on LNB controller, supported status monitor is different.
Please check each LNB controller driver code in detail.
@param pLnbc Instance of the LNB controller driver.
@param pStatus ORed value of SONY_LNBC_DIAG_STATUS_XXX.
@param pStatusSupported ORed value of supported SONY_LNBC_DIAG_STATUS_XXX. (NULL can be used)
@return SONY_RESULT_OK if successful.
*/
sony_result_t (*GetDiagStatus) (struct sony_lnbc_t * pLnbc, uint32_t * pStatus, uint32_t * pStatusSupported);
} sony_lnbc_t;
#endif /* SONY_LNBC_H */
@@ -0,0 +1,499 @@
/*------------------------------------------------------------------------------
Copyright 2016-2017 Sony Semiconductor Solutions Corporation
Last Updated : 2017/11/30
Modification ID : 253a4918e2da2cf28a9393596fa16f25024e504d
------------------------------------------------------------------------------*/
#include "sony_common.h"
#include "sony_lnbc.h"
#include "st_lnbh23.h"
/*------------------------------------------------------------------------------
Static Functions
------------------------------------------------------------------------------*/
static sony_result_t create_1st_byte (sony_lnbc_t * pLnbc,
uint8_t isEnable,
uint8_t pcl,
sony_lnbc_voltage_t voltage,
sony_lnbc_tone_t tone,
sony_lnbc_transmit_mode_t mode,
uint8_t * pData);
static sony_result_t st_lnbh23_Initialize (sony_lnbc_t * pLnbc);
static sony_result_t st_lnbh23_SetConfig (sony_lnbc_t * pLnbc,
sony_lnbc_config_id_t configId,
int32_t value);
static sony_result_t st_lnbh23_SetVoltage (sony_lnbc_t * pLnbc,
sony_lnbc_voltage_t voltage);
static sony_result_t st_lnbh23_SetTone (sony_lnbc_t * pLnbc,
sony_lnbc_tone_t tone);
static sony_result_t st_lnbh23_SetTransmitMode (sony_lnbc_t * pLnbc,
sony_lnbc_transmit_mode_t mode);
static sony_result_t st_lnbh23_Sleep (sony_lnbc_t * pLnbc);
static sony_result_t st_lnbh23_WakeUp (sony_lnbc_t * pLnbc);
static sony_result_t st_lnbh23_GetDiagStatus (sony_lnbc_t * pLnbc,
uint32_t * pStatus,
uint32_t * pStatusSupported);
/*------------------------------------------------------------------------------
Functions
------------------------------------------------------------------------------*/
sony_result_t st_lnbh23_Create (sony_lnbc_t * pLnbc,
uint8_t i2cAddress,
sony_i2c_t * pI2c)
{
SONY_TRACE_ENTER ("st_lnbh23_Create");
if ((!pLnbc) || (!pI2c)){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
pLnbc->i2cAddress = i2cAddress;
pLnbc->pI2c = pI2c;
pLnbc->Initialize = st_lnbh23_Initialize;
pLnbc->SetConfig = st_lnbh23_SetConfig;
pLnbc->SetVoltage = st_lnbh23_SetVoltage;
pLnbc->SetTone = st_lnbh23_SetTone;
pLnbc->SetTransmitMode = st_lnbh23_SetTransmitMode;
pLnbc->Sleep = st_lnbh23_Sleep;
pLnbc->WakeUp = st_lnbh23_WakeUp;
pLnbc->GetDiagStatus = st_lnbh23_GetDiagStatus;
pLnbc->isInternalTone = 0; /* Not used */
pLnbc->lowVoltage = ST_LNBH23_CONFIG_VOLTAGE_LOW_13_4V; /* Default value */
pLnbc->highVoltage = ST_LNBH23_CONFIG_VOLTAGE_HIGH_18_5V; /* Default value */
pLnbc->state = SONY_LNBC_STATE_UNKNOWN;
pLnbc->voltage = SONY_LNBC_VOLTAGE_LOW;
pLnbc->tone = SONY_LNBC_TONE_AUTO;
pLnbc->transmitMode = SONY_LNBC_TRANSMIT_MODE_TX;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
static sony_result_t st_lnbh23_Initialize (sony_lnbc_t * pLnbc)
{
sony_result_t result = SONY_RESULT_OK;
uint8_t data = 0;
SONY_TRACE_ENTER ("st_lnbh23_Initialize");
if (!pLnbc){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
pLnbc->state = SONY_LNBC_STATE_UNKNOWN;
pLnbc->voltage = SONY_LNBC_VOLTAGE_LOW;
if (pLnbc->tone != SONY_LNBC_TONE_AUTO) {
pLnbc->tone = SONY_LNBC_TONE_OFF;
}
if (pLnbc->transmitMode != SONY_LNBC_TRANSMIT_MODE_AUTO) {
pLnbc->transmitMode = SONY_LNBC_TRANSMIT_MODE_TX;
}
result = create_1st_byte (pLnbc, 0, 0, pLnbc->voltage, pLnbc->tone, pLnbc->transmitMode, &data);
if (result != SONY_RESULT_OK){SONY_TRACE_RETURN (result);}
if (pLnbc->pI2c->Write (pLnbc->pI2c, pLnbc->i2cAddress, &data, 1, (SONY_I2C_START_EN|SONY_I2C_STOP_EN)) != SONY_RESULT_OK){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
pLnbc->state = SONY_LNBC_STATE_SLEEP;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
static sony_result_t st_lnbh23_SetConfig (sony_lnbc_t * pLnbc,
sony_lnbc_config_id_t configId,
int32_t value)
{
sony_result_t result = SONY_RESULT_OK;
SONY_TRACE_ENTER ("st_lnbh23_SetConfig");
if (!pLnbc){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
if ((pLnbc->state != SONY_LNBC_STATE_ACTIVE) &&
(pLnbc->state != SONY_LNBC_STATE_SLEEP)) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_SW_STATE);
}
switch(configId)
{
case SONY_LNBC_CONFIG_ID_TONE_INTERNAL:
/* This parameter is not available */
SONY_TRACE_RETURN (SONY_RESULT_ERROR_NOSUPPORT);
case SONY_LNBC_CONFIG_ID_LOW_VOLTAGE:
if ((value != ST_LNBH23_CONFIG_VOLTAGE_LOW_13_4V) &&
(value != ST_LNBH23_CONFIG_VOLTAGE_LOW_14_4V)){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_RANGE);
} else {
pLnbc->lowVoltage = value;
result = st_lnbh23_SetVoltage (pLnbc, pLnbc->voltage);
if (result != SONY_RESULT_OK){
SONY_TRACE_RETURN (result);
}
}
break;
case SONY_LNBC_CONFIG_ID_HIGH_VOLTAGE:
if ((value != ST_LNBH23_CONFIG_VOLTAGE_HIGH_18_5V) &&
(value != ST_LNBH23_CONFIG_VOLTAGE_HIGH_19_5V)){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_RANGE);
} else {
pLnbc->highVoltage = value;
result = st_lnbh23_SetVoltage (pLnbc, pLnbc->voltage);
if (result != SONY_RESULT_OK){
SONY_TRACE_RETURN (result);
}
}
break;
default:
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
static sony_result_t st_lnbh23_SetVoltage (sony_lnbc_t * pLnbc,
sony_lnbc_voltage_t voltage)
{
sony_result_t result = SONY_RESULT_OK;
uint8_t data[2] = {0, 0};
SONY_TRACE_ENTER ("st_lnbh23_SetVoltage");
if (!pLnbc){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
if ((pLnbc->state != SONY_LNBC_STATE_ACTIVE) &&
(pLnbc->state != SONY_LNBC_STATE_SLEEP)) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_SW_STATE);
}
result = create_1st_byte (pLnbc, 1, 0, voltage, pLnbc->tone, pLnbc->transmitMode, &data[1]);
if (result != SONY_RESULT_OK){SONY_TRACE_RETURN (result);}
if (pLnbc->state == SONY_LNBC_STATE_ACTIVE) {
/* TTX should be "0" at changing voltage. */
data[0] = (uint8_t)(data[1] & 0xBF);
if (pLnbc->pI2c->Write (pLnbc->pI2c, pLnbc->i2cAddress, &data[0], 1, (SONY_I2C_START_EN|SONY_I2C_STOP_EN)) != SONY_RESULT_OK){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
if (data[0] != data[1]){
if (pLnbc->pI2c->Write (pLnbc->pI2c, pLnbc->i2cAddress, &data[1], 1, (SONY_I2C_START_EN|SONY_I2C_STOP_EN)) != SONY_RESULT_OK){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
}
}
pLnbc->voltage = voltage;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
static sony_result_t st_lnbh23_SetTone (sony_lnbc_t * pLnbc,
sony_lnbc_tone_t tone)
{
sony_result_t result = SONY_RESULT_OK;
uint8_t data = 0;
SONY_TRACE_ENTER ("st_lnbh23_SetTone");
if (!pLnbc){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
if ((pLnbc->state != SONY_LNBC_STATE_ACTIVE) &&
(pLnbc->state != SONY_LNBC_STATE_SLEEP)) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_SW_STATE);
}
result = create_1st_byte (pLnbc, 1, 0, pLnbc->voltage, tone, pLnbc->transmitMode, &data);
if (result != SONY_RESULT_OK){SONY_TRACE_RETURN (result);}
if (pLnbc->state == SONY_LNBC_STATE_ACTIVE) {
if (pLnbc->pI2c->Write (pLnbc->pI2c, pLnbc->i2cAddress, &data, 1, (SONY_I2C_START_EN|SONY_I2C_STOP_EN)) != SONY_RESULT_OK){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
}
pLnbc->tone = tone;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
static sony_result_t st_lnbh23_SetTransmitMode (sony_lnbc_t * pLnbc,
sony_lnbc_transmit_mode_t mode)
{
sony_result_t result = SONY_RESULT_OK;
uint8_t data = 0;
SONY_TRACE_ENTER ("st_lnbh23_SetTransmitMode");
if (!pLnbc){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
if ((pLnbc->state != SONY_LNBC_STATE_ACTIVE) &&
(pLnbc->state != SONY_LNBC_STATE_SLEEP)) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_SW_STATE);
}
result = create_1st_byte (pLnbc, 1, 0, pLnbc->voltage, pLnbc->tone, mode, &data);
if (result != SONY_RESULT_OK){SONY_TRACE_RETURN (result);}
if (pLnbc->state == SONY_LNBC_STATE_ACTIVE) {
if (pLnbc->pI2c->Write (pLnbc->pI2c, pLnbc->i2cAddress, &data, 1, (SONY_I2C_START_EN|SONY_I2C_STOP_EN)) != SONY_RESULT_OK){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
}
pLnbc->transmitMode = mode;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
static sony_result_t st_lnbh23_Sleep (sony_lnbc_t * pLnbc)
{
sony_result_t result = SONY_RESULT_OK;
uint8_t data = 0;
SONY_TRACE_ENTER ("st_lnbh23_Sleep");
if (!pLnbc){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
switch(pLnbc->state)
{
case SONY_LNBC_STATE_ACTIVE:
/* Do nothing */
break;
case SONY_LNBC_STATE_SLEEP:
SONY_TRACE_RETURN (SONY_RESULT_OK);
case SONY_LNBC_STATE_UNKNOWN:
default:
SONY_TRACE_RETURN (SONY_RESULT_ERROR_SW_STATE);
}
result = create_1st_byte (pLnbc, 0, 0, pLnbc->voltage, pLnbc->tone, pLnbc->transmitMode, &data);
if (result != SONY_RESULT_OK){SONY_TRACE_RETURN (result);}
if (pLnbc->pI2c->Write (pLnbc->pI2c, pLnbc->i2cAddress, &data, 1, (SONY_I2C_START_EN|SONY_I2C_STOP_EN)) != SONY_RESULT_OK){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
pLnbc->state = SONY_LNBC_STATE_SLEEP;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
static sony_result_t st_lnbh23_WakeUp (sony_lnbc_t * pLnbc)
{
sony_result_t result = SONY_RESULT_OK;
uint8_t data = 0;
SONY_TRACE_ENTER ("st_lnbh23_WakeUp");
if (!pLnbc){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
switch(pLnbc->state)
{
case SONY_LNBC_STATE_ACTIVE:
SONY_TRACE_RETURN (SONY_RESULT_OK);
case SONY_LNBC_STATE_SLEEP:
/* Do nothing */
break;
case SONY_LNBC_STATE_UNKNOWN:
default:
SONY_TRACE_RETURN (SONY_RESULT_ERROR_SW_STATE);
}
result = create_1st_byte (pLnbc, 1, 0, pLnbc->voltage, pLnbc->tone, pLnbc->transmitMode, &data);
if (result != SONY_RESULT_OK){SONY_TRACE_RETURN (result);}
if (pLnbc->pI2c->Write (pLnbc->pI2c, pLnbc->i2cAddress, &data, 1, (SONY_I2C_START_EN|SONY_I2C_STOP_EN)) != SONY_RESULT_OK){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
pLnbc->state = SONY_LNBC_STATE_ACTIVE;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
static sony_result_t st_lnbh23_GetDiagStatus (sony_lnbc_t * pLnbc,
uint32_t * pStatus,
uint32_t * pStatusSupported)
{
uint8_t data = 0;
SONY_TRACE_ENTER ("st_lnbh23_GetDiagStatus");
if ((!pLnbc) || (!pStatus)) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
if (pStatusSupported) {
*pStatusSupported = SONY_LNBC_DIAG_STATUS_OVERCURRENT | SONY_LNBC_DIAG_STATUS_THERMALSHUTDOWN
| SONY_LNBC_DIAG_STATUS_VOUTOUTOFRANGE | SONY_LNBC_DIAG_STATUS_CABLEOPEN;
}
if (pLnbc->pI2c->Read (pLnbc->pI2c, pLnbc->i2cAddress, &data, 1, SONY_I2C_START_EN|SONY_I2C_STOP_EN) != SONY_RESULT_OK){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
/* Diagnostic received data
* +---------+---------+---------+---------+---------+---------+---------+---------+
* | IMON | VMON | TMON | LLC | VSEL | EN | OTF | OLF |
* +---------+---------+---------+---------+---------+---------+---------+---------+
*/
*pStatus = 0;
if (data & 0x01) {
*pStatus |= SONY_LNBC_DIAG_STATUS_OVERCURRENT;
}
if (data & 0x02) {
*pStatus |= SONY_LNBC_DIAG_STATUS_THERMALSHUTDOWN;
}
if (data & 0x40) {
*pStatus |= SONY_LNBC_DIAG_STATUS_VOUTOUTOFRANGE;
}
if (data & 0x80) {
*pStatus |= SONY_LNBC_DIAG_STATUS_CABLEOPEN;
}
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
static sony_result_t create_1st_byte (sony_lnbc_t * pLnbc,
uint8_t isEnable,
uint8_t pcl,
sony_lnbc_voltage_t voltage,
sony_lnbc_tone_t tone,
sony_lnbc_transmit_mode_t mode,
uint8_t * pData)
{
/*
* +-----+-----+-----+-----+-----+-----+-----+-----+
* | PCL | TTX | TEN | LLC | VSEL| EN |ITEST| AUX |
* +-----+-----+-----+-----+-----+-----+-----+-----+
* | ? | ? | ? | ? | ? | ? | 0 | 0 |
* +-----+-----+-----+-----+-----+-----+-----+-----+
*/
SONY_TRACE_ENTER ("create_1st_byte");
if ((!pLnbc) || (!pData)){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
if (isEnable){
*pData = 0x04;
} else {
/* Set "0" to all bit. */
*pData = 0;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
if (pcl){
*pData |= (uint8_t)0x80;
}
switch(mode)
{
case SONY_LNBC_TRANSMIT_MODE_TX:
*pData |= 0x40;
break;
case SONY_LNBC_TRANSMIT_MODE_RX:
case SONY_LNBC_TRANSMIT_MODE_AUTO:
/* Do nothing */
break;
default:
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
switch(tone)
{
case SONY_LNBC_TONE_AUTO:
case SONY_LNBC_TONE_OFF:
/* Do nothing */
break;
case SONY_LNBC_TONE_ON:
*pData |= 0x20;
break;
default:
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
switch(voltage)
{
case SONY_LNBC_VOLTAGE_LOW:
switch(pLnbc->lowVoltage)
{
case ST_LNBH23_CONFIG_VOLTAGE_LOW_13_4V:
/* Do nothing */
break;
case ST_LNBH23_CONFIG_VOLTAGE_LOW_14_4V:
*pData |= 0x10;
break;
default:
SONY_TRACE_RETURN (SONY_RESULT_ERROR_SW_STATE);
}
break;
case SONY_LNBC_VOLTAGE_HIGH:
switch(pLnbc->highVoltage)
{
case ST_LNBH23_CONFIG_VOLTAGE_HIGH_18_5V:
*pData |= 0x08;
break;
case ST_LNBH23_CONFIG_VOLTAGE_HIGH_19_5V:
*pData |= 0x18;
break;
default:
SONY_TRACE_RETURN (SONY_RESULT_ERROR_SW_STATE);
}
break;
case SONY_LNBC_VOLTAGE_AUTO:
SONY_TRACE_RETURN (SONY_RESULT_ERROR_NOSUPPORT);
default:
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
@@ -0,0 +1,67 @@
/*------------------------------------------------------------------------------
Copyright 2016 Sony Semiconductor Solutions Corporation
Last Updated : 2016/06/24
Modification ID : 3b74e280b7ad8ce430b6a9419ac53e8f2e3737f9
------------------------------------------------------------------------------*/
/**
@file st_lnbh23.h
This file provides the functions to control LNBH23(ST).
*/
/*----------------------------------------------------------------------------*/
#ifndef ST_LNBH23_H
#define ST_LNBH23_H
#include "sony_common.h"
#include "sony_lnbc.h"
/**
@brief Use 13.4V for low level output voltage.
If you would like to use 13.4V as "Low level voltage",
please set this parameter by sony_lnbc_t::SetConfig(SONY_LNBC_CONFIG_ID_LOW_VOLTAGE, value).
*/
#define ST_LNBH23_CONFIG_VOLTAGE_LOW_13_4V 0
/**
@brief Use 14.4V for low level output voltage.
If you would like to use 14.4V as "Low level voltage",
please set this parameter by sony_lnbc_t::SetConfig(SONY_LNBC_CONFIG_ID_LOW_VOLTAGE, value).
*/
#define ST_LNBH23_CONFIG_VOLTAGE_LOW_14_4V 1
/**
@brief Use 18.5V for high level output voltage.
If you would like to use 18.5V as "High level voltage",
please set this parameter by sony_lnbc_t::SetConfig(SONY_LNBC_CONFIG_ID_HIGH_VOLTAGE, value).
*/
#define ST_LNBH23_CONFIG_VOLTAGE_HIGH_18_5V 10
/**
@brief Use 19.5V for high level output voltage.
If you would like to use 19.5V as "High level voltage",
please set this parameter by sony_lnbc_t::SetConfig(SONY_LNBC_CONFIG_ID_HIGH_VOLTAGE, value).
*/
#define ST_LNBH23_CONFIG_VOLTAGE_HIGH_19_5V 11
/*------------------------------------------------------------------------------
Functions
------------------------------------------------------------------------------*/
/**
@brief Create a instance for LNBH23(ST).
@param pLnbc LNB controller driver instance.
@param i2cAddress I2C address.
@param pI2c I2C instance.
@return SONY_RESULT_OK if successful.
*/
sony_result_t st_lnbh23_Create (sony_lnbc_t * pLnbc,
uint8_t i2cAddress,
sony_i2c_t * pI2c);
#endif /* ST_LNBH23_H */
@@ -0,0 +1,448 @@
/*------------------------------------------------------------------------------
Copyright 2016-2018 Sony Semiconductor Solutions Corporation
Last Updated : 2018/07/27
Modification ID : ff73ffebff57618d6a5aa6e2aa9eb009b86060d1
------------------------------------------------------------------------------*/
#include "sony_common.h"
#include "sony_lnbc.h"
#include "st_lnbh29.h"
/*------------------------------------------------------------------------------
Static Functions
------------------------------------------------------------------------------*/
static sony_result_t st_lnbh29_Initialize (sony_lnbc_t * pLnbc);
static sony_result_t st_lnbh29_SetConfig (sony_lnbc_t * pLnbc,
sony_lnbc_config_id_t configId,
int32_t value);
static sony_result_t st_lnbh29_SetVoltage (sony_lnbc_t * pLnbc,
sony_lnbc_voltage_t voltage);
static sony_result_t st_lnbh29_SetTone (sony_lnbc_t * pLnbc,
sony_lnbc_tone_t tone);
static sony_result_t st_lnbh29_SetTransmitMode (sony_lnbc_t * pLnbc,
sony_lnbc_transmit_mode_t mode);
static sony_result_t st_lnbh29_Sleep (sony_lnbc_t * pLnbc);
static sony_result_t st_lnbh29_WakeUp (sony_lnbc_t * pLnbc);
static sony_result_t st_lnbh29_GetDiagStatus (sony_lnbc_t * pLnbc,
uint32_t * pStatus,
uint32_t * pStatusSupported);
static sony_result_t create_data (sony_lnbc_t * pLnbc,
sony_lnbc_voltage_t voltage,
uint8_t * pData);
/*------------------------------------------------------------------------------
Functions
------------------------------------------------------------------------------*/
sony_result_t st_lnbh29_Create (sony_lnbc_t * pLnbc,
uint8_t i2cAddress,
sony_i2c_t * pI2c)
{
SONY_TRACE_ENTER ("st_lnbh29_Create");
if ((!pI2c) || (!pLnbc)){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
pLnbc->i2cAddress = i2cAddress;
pLnbc->pI2c = pI2c;
pLnbc->Initialize = st_lnbh29_Initialize;
pLnbc->SetConfig = st_lnbh29_SetConfig;
pLnbc->SetVoltage = st_lnbh29_SetVoltage;
pLnbc->SetTone = st_lnbh29_SetTone;
pLnbc->SetTransmitMode = st_lnbh29_SetTransmitMode;
pLnbc->Sleep = st_lnbh29_Sleep;
pLnbc->WakeUp = st_lnbh29_WakeUp;
pLnbc->GetDiagStatus = st_lnbh29_GetDiagStatus;
pLnbc->isInternalTone = 1; /* Fixed to 1 */
pLnbc->lowVoltage = ST_LNBH29_CONFIG_VOLTAGE_LOW_13_0V; /* Default value */
pLnbc->highVoltage = ST_LNBH29_CONFIG_VOLTAGE_HIGH_18_150V; /* Default value */
pLnbc->state = SONY_LNBC_STATE_UNKNOWN;
pLnbc->voltage = SONY_LNBC_VOLTAGE_LOW;
pLnbc->tone = SONY_LNBC_TONE_AUTO;
pLnbc->transmitMode = SONY_LNBC_TRANSMIT_MODE_TX;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
static sony_result_t st_lnbh29_Initialize (sony_lnbc_t * pLnbc)
{
uint8_t data = 0;
SONY_TRACE_ENTER ("st_lnbh29_Initialize");
if (!pLnbc){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
pLnbc->state = SONY_LNBC_STATE_UNKNOWN;
pLnbc->voltage = SONY_LNBC_VOLTAGE_LOW;
pLnbc->tone = SONY_LNBC_TONE_AUTO; /* Auto is only supported */
pLnbc->transmitMode = SONY_LNBC_TRANSMIT_MODE_TX; /* RX is not supported */
if (pLnbc->pI2c->WriteOneRegister (pLnbc->pI2c, pLnbc->i2cAddress, 0x01, data) != SONY_RESULT_OK){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
pLnbc->state = SONY_LNBC_STATE_SLEEP;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
static sony_result_t st_lnbh29_SetConfig (sony_lnbc_t * pLnbc,
sony_lnbc_config_id_t configId,
int32_t value)
{
sony_result_t result = SONY_RESULT_OK;
SONY_TRACE_ENTER ("st_lnbh29_SetConfig");
if (!pLnbc){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
if ((pLnbc->state != SONY_LNBC_STATE_ACTIVE) &&
(pLnbc->state != SONY_LNBC_STATE_SLEEP)) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_SW_STATE);
}
switch(configId)
{
case SONY_LNBC_CONFIG_ID_TONE_INTERNAL:
if (value == 1) {
pLnbc->isInternalTone = value;
} else if (value == 0) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_NOSUPPORT);
} else {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_RANGE);
}
break;
case SONY_LNBC_CONFIG_ID_LOW_VOLTAGE:
if ((value != ST_LNBH29_CONFIG_VOLTAGE_LOW_13_0V) &&
(value != ST_LNBH29_CONFIG_VOLTAGE_LOW_13_667V)){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_RANGE);
} else {
pLnbc->lowVoltage = value;
result = st_lnbh29_SetVoltage (pLnbc, pLnbc->voltage);
if (result != SONY_RESULT_OK){
SONY_TRACE_RETURN (result);
}
}
break;
case SONY_LNBC_CONFIG_ID_HIGH_VOLTAGE:
if ((value != ST_LNBH29_CONFIG_VOLTAGE_HIGH_18_150V) &&
(value != ST_LNBH29_CONFIG_VOLTAGE_HIGH_18_817V)){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_RANGE);
} else {
pLnbc->highVoltage = value;
result = st_lnbh29_SetVoltage (pLnbc, pLnbc->voltage);
if (result != SONY_RESULT_OK){
SONY_TRACE_RETURN (result);
}
}
break;
default:
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
static sony_result_t st_lnbh29_SetVoltage (sony_lnbc_t * pLnbc,
sony_lnbc_voltage_t voltage)
{
uint8_t data = 0;
sony_result_t result = SONY_RESULT_OK;
SONY_TRACE_ENTER ("st_lnbh29_SetVoltage");
if (!pLnbc){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
if ((pLnbc->state != SONY_LNBC_STATE_ACTIVE) &&
(pLnbc->state != SONY_LNBC_STATE_SLEEP)) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_SW_STATE);
}
result = create_data (pLnbc, voltage, &data);
if (result != SONY_RESULT_OK){
SONY_TRACE_RETURN (result);
}
if (pLnbc->state == SONY_LNBC_STATE_ACTIVE) {
if (pLnbc->pI2c->WriteOneRegister (pLnbc->pI2c, pLnbc->i2cAddress, 0x01, data) != SONY_RESULT_OK){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
}
pLnbc->voltage = voltage;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
static sony_result_t st_lnbh29_SetTone (sony_lnbc_t * pLnbc,
sony_lnbc_tone_t tone)
{
SONY_TRACE_ENTER ("st_lnbh29_SetTone");
if (!pLnbc){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
if ((pLnbc->state != SONY_LNBC_STATE_ACTIVE) &&
(pLnbc->state != SONY_LNBC_STATE_SLEEP)) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_SW_STATE);
}
switch(tone)
{
case SONY_LNBC_TONE_ON:
case SONY_LNBC_TONE_OFF:
/* ST LNBH29 doesn't support this function. */
SONY_TRACE_RETURN (SONY_RESULT_ERROR_NOSUPPORT);
break;
case SONY_LNBC_TONE_AUTO:
break;
default:
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
pLnbc->tone = tone;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
static sony_result_t st_lnbh29_SetTransmitMode (sony_lnbc_t * pLnbc,
sony_lnbc_transmit_mode_t mode)
{
SONY_TRACE_ENTER ("st_lnbh29_SetTransmitMode");
if (!pLnbc){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
if ((pLnbc->state != SONY_LNBC_STATE_ACTIVE) &&
(pLnbc->state != SONY_LNBC_STATE_SLEEP)) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_SW_STATE);
}
switch(mode)
{
case SONY_LNBC_TRANSMIT_MODE_TX:
/* Do nothing */
break;
case SONY_LNBC_TRANSMIT_MODE_RX:
case SONY_LNBC_TRANSMIT_MODE_AUTO:
SONY_TRACE_RETURN (SONY_RESULT_ERROR_NOSUPPORT);
break;
default:
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
pLnbc->transmitMode = mode;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
static sony_result_t st_lnbh29_Sleep (sony_lnbc_t * pLnbc)
{
uint8_t data = 0;
SONY_TRACE_ENTER ("st_lnbh29_Sleep");
if (!pLnbc){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
switch(pLnbc->state)
{
case SONY_LNBC_STATE_ACTIVE:
/* Continue */
break;
case SONY_LNBC_STATE_SLEEP:
/* Do nothing */
SONY_TRACE_RETURN (SONY_RESULT_OK);
case SONY_LNBC_STATE_UNKNOWN:
default:
/* Error */
SONY_TRACE_RETURN (SONY_RESULT_ERROR_SW_STATE);
}
if (pLnbc->pI2c->WriteOneRegister (pLnbc->pI2c, pLnbc->i2cAddress, 0x01, data) != SONY_RESULT_OK){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
pLnbc->state = SONY_LNBC_STATE_SLEEP;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
static sony_result_t st_lnbh29_WakeUp (sony_lnbc_t * pLnbc)
{
uint8_t data = 0;
sony_result_t result = SONY_RESULT_OK;
SONY_TRACE_ENTER ("st_lnbh29_WakeUp");
if (!pLnbc){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
switch(pLnbc->state)
{
case SONY_LNBC_STATE_ACTIVE:
/* Do nothing */
SONY_TRACE_RETURN (SONY_RESULT_OK);
case SONY_LNBC_STATE_SLEEP:
/* Continue */
break;
case SONY_LNBC_STATE_UNKNOWN:
default:
/* Error */
SONY_TRACE_RETURN (SONY_RESULT_ERROR_SW_STATE);
}
result = create_data (pLnbc, pLnbc->voltage, &data);
if (result != SONY_RESULT_OK){
SONY_TRACE_RETURN (result);
}
if (pLnbc->pI2c->WriteOneRegister (pLnbc->pI2c, pLnbc->i2cAddress, 0x01, data) != SONY_RESULT_OK){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
pLnbc->state = SONY_LNBC_STATE_ACTIVE;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
static sony_result_t st_lnbh29_GetDiagStatus (sony_lnbc_t * pLnbc,
uint32_t * pStatus,
uint32_t * pStatusSupported)
{
uint8_t data = 0;
SONY_TRACE_ENTER ("st_lnbh29_GetDiagStatus");
if ((!pLnbc) || (!pStatus)) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
if (pStatusSupported) {
*pStatusSupported = SONY_LNBC_DIAG_STATUS_OVERCURRENT | SONY_LNBC_DIAG_STATUS_THERMALSHUTDOWN
| SONY_LNBC_DIAG_STATUS_VOUTOUTOFRANGE | SONY_LNBC_DIAG_STATUS_VINOUTOFRANGE
| SONY_LNBC_DIAG_STATUS_BACKBIAS;
}
if (pLnbc->pI2c->ReadRegister (pLnbc->pI2c, pLnbc->i2cAddress, 0x00, &data, 1) != SONY_RESULT_OK){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
/* STATUS register
* +---------+---------+---------+---------+---------+---------+---------+---------+
* | N/A | N/A | N/A | PDO | PNG | VMON | OTF | OLF |
* +---------+---------+---------+---------+---------+---------+---------+---------+
*/
*pStatus = 0;
if (data & 0x01) {
*pStatus |= SONY_LNBC_DIAG_STATUS_OVERCURRENT;
}
if (data & 0x02) {
*pStatus |= SONY_LNBC_DIAG_STATUS_THERMALSHUTDOWN;
}
if (data & 0x04) {
*pStatus |= SONY_LNBC_DIAG_STATUS_VOUTOUTOFRANGE;
}
if (data & 0x08) {
*pStatus |= SONY_LNBC_DIAG_STATUS_VINOUTOFRANGE;
}
if (data & 0x10) {
*pStatus |= SONY_LNBC_DIAG_STATUS_BACKBIAS;
}
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
static sony_result_t create_data (sony_lnbc_t * pLnbc,
sony_lnbc_voltage_t voltage,
uint8_t * pData)
{
SONY_TRACE_ENTER ("create_data");
if ((!pLnbc) || (!pData)) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
*pData = 0;
switch(voltage)
{
case SONY_LNBC_VOLTAGE_LOW:
switch(pLnbc->lowVoltage)
{
case ST_LNBH29_CONFIG_VOLTAGE_LOW_13_0V:
/* 13.0V */
*pData |= 0x01;
break;
case ST_LNBH29_CONFIG_VOLTAGE_LOW_13_667V:
/* 13.667V */
*pData |= 0x03;
break;
default:
SONY_TRACE_RETURN (SONY_RESULT_ERROR_SW_STATE);
}
break;
case SONY_LNBC_VOLTAGE_HIGH:
switch(pLnbc->highVoltage)
{
case ST_LNBH29_CONFIG_VOLTAGE_HIGH_18_150V:
/* 18.150V */
*pData |= 0x05;
break;
case ST_LNBH29_CONFIG_VOLTAGE_HIGH_18_817V:
/* 18.817V */
*pData |= 0x07;
break;
default:
SONY_TRACE_RETURN (SONY_RESULT_ERROR_SW_STATE);
}
break;
default:
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
@@ -0,0 +1,67 @@
/*------------------------------------------------------------------------------
Copyright 2016 Sony Semiconductor Solutions Corporation
Last Updated : 2016/06/24
Modification ID : 3b74e280b7ad8ce430b6a9419ac53e8f2e3737f9
------------------------------------------------------------------------------*/
/**
@file st_lnbh29.h
This file provides the functions to control LNBH29(ST).
*/
/*----------------------------------------------------------------------------*/
#ifndef ST_LNBH29_H
#define ST_LNBH29_H
#include "sony_common.h"
#include "sony_lnbc.h"
/**
@brief Use 13.333V for low level output voltage.
If you would like to use 13.0V as "Low level voltage",
please set this parameter by sony_lnbc_t::SetConfig(SONY_LNBC_CONFIG_ID_LOW_VOLTAGE, value).
*/
#define ST_LNBH29_CONFIG_VOLTAGE_LOW_13_0V 0
/**
@brief Use 13.667V for low level output voltage.
If you would like to use 13.667V as "Low level voltage",
please set this parameter by sony_lnbc_t::SetConfig(SONY_LNBC_CONFIG_ID_LOW_VOLTAGE, value).
*/
#define ST_LNBH29_CONFIG_VOLTAGE_LOW_13_667V 1
/**
@brief Use 18.150V for high level output voltage.
If you would like to use 18.150V as "High level voltage",
please set this parameter by sony_lnbc_t::SetConfig(SONY_LNBC_CONFIG_ID_HIGH_VOLTAGE, value).
*/
#define ST_LNBH29_CONFIG_VOLTAGE_HIGH_18_150V 10
/**
@brief Use 18.817V for high level output voltage.
If you would like to use 18.817V as "High level voltage",
please set this parameter by sony_lnbc_t::SetConfig(SONY_LNBC_CONFIG_ID_HIGH_VOLTAGE, value).
*/
#define ST_LNBH29_CONFIG_VOLTAGE_HIGH_18_817V 11
/*------------------------------------------------------------------------------
Functions
------------------------------------------------------------------------------*/
/**
@brief Create a instance for LNBH29(ST).
@param pLnbc LNB controller driver instance.
@param i2cAddress I2C address.
@param pI2c I2C instance.
@return SONY_RESULT_OK if successful.
*/
sony_result_t st_lnbh29_Create (sony_lnbc_t * pLnbc,
uint8_t i2cAddress,
sony_i2c_t * pI2c);
#endif /* ST_LNBH29_H */
@@ -0,0 +1,524 @@
/*------------------------------------------------------------------------------
Copyright 2017 Sony Semiconductor Solutions Corporation
Last Updated : 2017/11/30
Modification ID : 253a4918e2da2cf28a9393596fa16f25024e504d
------------------------------------------------------------------------------*/
#include "sony_common.h"
#include "sony_lnbc.h"
#include "ti_tps65235.h"
/*----------------------------------------------------------------------------
Static Functions
----------------------------------------------------------------------------*/
static sony_result_t create_1st_byte (sony_lnbc_t * pLnbc,
sony_lnbc_voltage_t voltage,
uint8_t * pData);
static sony_result_t create_2nd_byte (sony_lnbc_t * pLnbc,
uint8_t isEnable,
sony_lnbc_transmit_mode_t mode,
uint8_t * pData);
static sony_result_t ti_tps65235_Initialize (sony_lnbc_t * pLnbc);
static sony_result_t ti_tps65235_SetConfig (sony_lnbc_t * pLnbc,
sony_lnbc_config_id_t configId,
int32_t value);
static sony_result_t ti_tps65235_SetVoltage (sony_lnbc_t * pLnbc,
sony_lnbc_voltage_t voltage);
static sony_result_t ti_tps65235_SetTone (sony_lnbc_t * pLnbc,
sony_lnbc_tone_t tone);
static sony_result_t ti_tps65235_SetTransmitMode (sony_lnbc_t * pLnbc,
sony_lnbc_transmit_mode_t mode);
static sony_result_t ti_tps65235_Sleep (sony_lnbc_t * pLnbc);
static sony_result_t ti_tps65235_WakeUp (sony_lnbc_t * pLnbc);
static sony_result_t ti_tps65235_GetDiagStatus (sony_lnbc_t * pLnbc,
uint32_t * pStatus,
uint32_t * pStatusSupported);
/*----------------------------------------------------------------------------
Functions
----------------------------------------------------------------------------*/
sony_result_t ti_tps65235_Create (sony_lnbc_t * pLnbc,
uint8_t i2cAddress,
sony_i2c_t * pI2c)
{
SONY_TRACE_ENTER ("ti_tps65235_Create");
if ((!pLnbc) || (!pI2c)){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
pLnbc->i2cAddress = i2cAddress;
pLnbc->pI2c = pI2c;
pLnbc->Initialize = ti_tps65235_Initialize;
pLnbc->SetConfig = ti_tps65235_SetConfig;
pLnbc->SetVoltage = ti_tps65235_SetVoltage;
pLnbc->SetTone = ti_tps65235_SetTone;
pLnbc->SetTransmitMode = ti_tps65235_SetTransmitMode;
pLnbc->Sleep = ti_tps65235_Sleep;
pLnbc->WakeUp = ti_tps65235_WakeUp;
pLnbc->GetDiagStatus = ti_tps65235_GetDiagStatus;
pLnbc->isInternalTone = 0;
pLnbc->lowVoltage = TI_TPS65235_CONFIG_VOLTAGE_LOW_13_4V; /* Default value */
pLnbc->highVoltage = TI_TPS65235_CONFIG_VOLTAGE_HIGH_18_2V; /* Default value */
pLnbc->state = SONY_LNBC_STATE_UNKNOWN;
pLnbc->voltage = SONY_LNBC_VOLTAGE_LOW;
pLnbc->tone = SONY_LNBC_TONE_AUTO;
pLnbc->transmitMode = SONY_LNBC_TRANSMIT_MODE_TX;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
static sony_result_t ti_tps65235_Initialize (sony_lnbc_t * pLnbc)
{
sony_result_t result = SONY_RESULT_OK;
uint8_t data = 0;
SONY_TRACE_ENTER ("ti_tps65235_Initialize");
if (!pLnbc) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
pLnbc->state = SONY_LNBC_STATE_UNKNOWN;
pLnbc->voltage = SONY_LNBC_VOLTAGE_LOW;
pLnbc->tone = SONY_LNBC_TONE_AUTO; /* Auto is only supported */
if (pLnbc->transmitMode != SONY_LNBC_TRANSMIT_MODE_AUTO) {
pLnbc->transmitMode = SONY_LNBC_TRANSMIT_MODE_TX;
}
result = create_1st_byte (pLnbc, pLnbc->voltage, &data);
if (result != SONY_RESULT_OK){SONY_TRACE_RETURN (result);}
if (pLnbc->pI2c->WriteOneRegister (pLnbc->pI2c, pLnbc->i2cAddress, 0x00, data) != SONY_RESULT_OK){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
result = create_2nd_byte (pLnbc, 0, pLnbc->transmitMode, &data);
if (result != SONY_RESULT_OK){SONY_TRACE_RETURN (result);}
if (pLnbc->pI2c->WriteOneRegister (pLnbc->pI2c, pLnbc->i2cAddress, 0x01, data) != SONY_RESULT_OK){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
pLnbc->state = SONY_LNBC_STATE_SLEEP;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
static sony_result_t ti_tps65235_SetConfig (sony_lnbc_t * pLnbc,
sony_lnbc_config_id_t configId,
int32_t value)
{
sony_result_t result = SONY_RESULT_OK;
SONY_TRACE_ENTER ("ti_tps65235_SetConfig");
if (!pLnbc){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
if ((pLnbc->state != SONY_LNBC_STATE_ACTIVE) &&
(pLnbc->state != SONY_LNBC_STATE_SLEEP)) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_SW_STATE);
}
switch(configId)
{
case SONY_LNBC_CONFIG_ID_LOW_VOLTAGE:
if ((value != TI_TPS65235_CONFIG_VOLTAGE_LOW_13_4V) &&
(value != TI_TPS65235_CONFIG_VOLTAGE_LOW_14_6V)){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_RANGE);
} else {
pLnbc->lowVoltage = value;
result = ti_tps65235_SetVoltage (pLnbc, pLnbc->voltage);
if (result != SONY_RESULT_OK){
SONY_TRACE_RETURN (result);
}
}
break;
case SONY_LNBC_CONFIG_ID_HIGH_VOLTAGE:
if ((value != TI_TPS65235_CONFIG_VOLTAGE_HIGH_18_2V) &&
(value != TI_TPS65235_CONFIG_VOLTAGE_HIGH_19_4V)){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_RANGE);
} else {
pLnbc->highVoltage = value;
result = ti_tps65235_SetVoltage (pLnbc, pLnbc->voltage);
if (result != SONY_RESULT_OK){
SONY_TRACE_RETURN (result);
}
}
break;
case SONY_LNBC_CONFIG_ID_TONE_INTERNAL:
SONY_TRACE_RETURN (SONY_RESULT_OK); /* Internal/External tone is controlled by EXTM pin. No need to set register.
External: gated by EXTM logic pulse, Internal: gated by EXTM logic envelop */
default:
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
static sony_result_t ti_tps65235_SetVoltage (sony_lnbc_t * pLnbc,
sony_lnbc_voltage_t voltage)
{
sony_result_t result = SONY_RESULT_OK;
uint8_t data = 0;
SONY_TRACE_ENTER ("ti_tps65235_SetVoltage");
if (!pLnbc){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
if ((pLnbc->state != SONY_LNBC_STATE_ACTIVE) &&
(pLnbc->state != SONY_LNBC_STATE_SLEEP)) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_SW_STATE);
}
result = create_1st_byte (pLnbc, voltage, &data);
if (result != SONY_RESULT_OK){SONY_TRACE_RETURN (result);}
if (pLnbc->state == SONY_LNBC_STATE_ACTIVE) {
if (pLnbc->pI2c->WriteOneRegister (pLnbc->pI2c, pLnbc->i2cAddress, 0x00, data) != SONY_RESULT_OK){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
}
pLnbc->voltage = voltage;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
static sony_result_t ti_tps65235_SetTone (sony_lnbc_t * pLnbc,
sony_lnbc_tone_t tone)
{
SONY_TRACE_ENTER ("ti_tps65235_SetTone");
if (!pLnbc){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
if ((pLnbc->state != SONY_LNBC_STATE_ACTIVE) &&
(pLnbc->state != SONY_LNBC_STATE_SLEEP)) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_SW_STATE);
}
switch(tone)
{
case SONY_LNBC_TONE_OFF:
case SONY_LNBC_TONE_ON:
SONY_TRACE_RETURN (SONY_RESULT_ERROR_NOSUPPORT);
case SONY_LNBC_TONE_AUTO:
/* Do nothing */
break;
default:
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
pLnbc->tone = tone;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
static sony_result_t ti_tps65235_SetTransmitMode (sony_lnbc_t * pLnbc,
sony_lnbc_transmit_mode_t mode)
{
sony_result_t result = SONY_RESULT_OK;
uint8_t data = 0;
SONY_TRACE_ENTER ("ti_tps65235_SetTransmitMode");
if (!pLnbc){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
if ((pLnbc->state != SONY_LNBC_STATE_ACTIVE) &&
(pLnbc->state != SONY_LNBC_STATE_SLEEP)) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_SW_STATE);
}
result = create_2nd_byte (pLnbc, 1, mode, &data);
if (result != SONY_RESULT_OK){SONY_TRACE_RETURN (result);}
if (pLnbc->state == SONY_LNBC_STATE_ACTIVE) {
if (pLnbc->pI2c->WriteOneRegister (pLnbc->pI2c, pLnbc->i2cAddress, 0x01, data) != SONY_RESULT_OK){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
}
pLnbc->transmitMode = mode;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
static sony_result_t ti_tps65235_Sleep (sony_lnbc_t * pLnbc)
{
sony_result_t result = SONY_RESULT_OK;
uint8_t data = 0;
SONY_TRACE_ENTER ("ti_tps65235_Sleep");
if (!pLnbc){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
switch(pLnbc->state)
{
case SONY_LNBC_STATE_ACTIVE:
/* Continue */
break;
case SONY_LNBC_STATE_SLEEP:
/* Do nothing */
SONY_TRACE_RETURN (SONY_RESULT_OK);
case SONY_LNBC_STATE_UNKNOWN:
default:
/* Error */
SONY_TRACE_RETURN (SONY_RESULT_ERROR_SW_STATE);
}
result = create_2nd_byte (pLnbc, 0, pLnbc->transmitMode, &data);
if (result != SONY_RESULT_OK){SONY_TRACE_RETURN (result);}
if (pLnbc->pI2c->WriteOneRegister (pLnbc->pI2c, pLnbc->i2cAddress, 0x01, data) != SONY_RESULT_OK){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
pLnbc->state = SONY_LNBC_STATE_SLEEP;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
static sony_result_t ti_tps65235_WakeUp (sony_lnbc_t * pLnbc)
{
sony_result_t result = SONY_RESULT_OK;
uint8_t data = 0;
SONY_TRACE_ENTER ("ti_tps65235_WakeUp");
if (!pLnbc){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
switch(pLnbc->state)
{
case SONY_LNBC_STATE_ACTIVE:
/* Do nothing */
SONY_TRACE_RETURN (SONY_RESULT_OK);
case SONY_LNBC_STATE_SLEEP:
/* Continue */
break;
case SONY_LNBC_STATE_UNKNOWN:
default:
/* Error */
SONY_TRACE_RETURN (SONY_RESULT_ERROR_SW_STATE);
}
result = create_1st_byte (pLnbc, pLnbc->voltage, &data);
if (result != SONY_RESULT_OK){SONY_TRACE_RETURN (result);}
if (pLnbc->pI2c->WriteOneRegister (pLnbc->pI2c, pLnbc->i2cAddress, 0x00, data) != SONY_RESULT_OK){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
result = create_2nd_byte (pLnbc, 1, pLnbc->transmitMode, &data);
if (result != SONY_RESULT_OK){SONY_TRACE_RETURN (result);}
if (pLnbc->pI2c->WriteOneRegister (pLnbc->pI2c, pLnbc->i2cAddress, 0x01, data) != SONY_RESULT_OK){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
pLnbc->state = SONY_LNBC_STATE_ACTIVE;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
static sony_result_t ti_tps65235_GetDiagStatus (sony_lnbc_t * pLnbc,
uint32_t * pStatus,
uint32_t * pStatusSupported)
{
uint8_t data = 0;
SONY_TRACE_ENTER ("ti_tps65235_GetDiagStatus");
if ((!pLnbc) || (!pStatus)) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
if (pStatusSupported) {
*pStatusSupported = SONY_LNBC_DIAG_STATUS_VOUTOUTOFRANGE | SONY_LNBC_DIAG_STATUS_CABLEOPEN
| SONY_LNBC_DIAG_STATUS_OVERCURRENT | SONY_LNBC_DIAG_STATUS_THERMALSHUTDOWN;
}
if (pLnbc->pI2c->ReadRegister (pLnbc->pI2c, pLnbc->i2cAddress, 0x02, &data, 1) != SONY_RESULT_OK){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
/* Status Register
* +---------+---------+---------+---------+---------+---------+----------+----------+
* | Reserve |TDETGOOD | LDO_ON | T125 | TSD | OCP |CABLE_GOOD|VOUT_GOOD |
* +---------+---------+---------+---------+---------+---------+----------+----------+
*/
*pStatus = 0;
if (!(data & 0x01)) {
*pStatus |= SONY_LNBC_DIAG_STATUS_VOUTOUTOFRANGE;
}
if (!(data & 0x02)) {
*pStatus |= SONY_LNBC_DIAG_STATUS_CABLEOPEN;
}
if (data & 0x04) {
*pStatus |= SONY_LNBC_DIAG_STATUS_OVERCURRENT;
}
if (data & 0x08) {
*pStatus |= SONY_LNBC_DIAG_STATUS_THERMALSHUTDOWN;
}
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
static sony_result_t create_1st_byte (sony_lnbc_t * pLnbc,
sony_lnbc_voltage_t voltage,
uint8_t * pData)
{
SONY_TRACE_ENTER ("create_1st_byte");
if ((!pLnbc) || (!pData)){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
/* Control Register 1
* +-------+-------+-------+-------+-------+-------+-------+---------+
* |I2C_CON|PWM/PSM| - | VSET3 | VSET2 | VSET1 | VSET0 |EXTM_TONE|
* +-------+-------+-------+-------+-------+-------+-------+---------+
* | ? | 1 | 0 | ? | ? | ? | ? | 0 |
* +-------+-------+-------+-------+-------+-------+-------+---------+
* I2C_CON = 0 : I2C control disabled
* 1 : I2C control enabled
*
* +------+------+------+------+------+
* |VSET3 |VSET2 |VSET1 |VSET0 |LNB(V)|
* +------+------+------+------+------+
* | 0 | 1 | 0 | 0 | 13.4 |
* +------+------+------+------+------+
* | 0 | 1 | 1 | 0 | 14.6 |
* +------+------+------+------+------+
* | 1 | 1 | 0 | 0 | 18.2 |
* +------+------+------+------+------+
* | 1 | 1 | 1 | 0 | 19.4 |
* +------+------+------+------+------+
*/
*pData = 0x40;
switch(voltage)
{
case SONY_LNBC_VOLTAGE_LOW:
case SONY_LNBC_VOLTAGE_HIGH:
/* I2C_CON = 1 */
*pData |= 0x80;
break;
case SONY_LNBC_VOLTAGE_AUTO:
SONY_TRACE_RETURN (SONY_RESULT_ERROR_NOSUPPORT);
default:
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
if ((voltage == SONY_LNBC_VOLTAGE_LOW) && (pLnbc->lowVoltage == TI_TPS65235_CONFIG_VOLTAGE_LOW_13_4V)){
/* VSET[3:0] = 0x4 */
*pData |= (0x4 << 1);
} else if ((voltage == SONY_LNBC_VOLTAGE_LOW) && (pLnbc->lowVoltage == TI_TPS65235_CONFIG_VOLTAGE_LOW_14_6V)){
/* VSET[3:0] = 0x6 */
*pData |= (0x6 << 1);
} else if ((voltage == SONY_LNBC_VOLTAGE_HIGH) && (pLnbc->highVoltage == TI_TPS65235_CONFIG_VOLTAGE_HIGH_18_2V)){
/* VSET[3:0] = 0xC */
*pData |= (0xC << 1);
} else if ((voltage == SONY_LNBC_VOLTAGE_HIGH) && (pLnbc->highVoltage == TI_TPS65235_CONFIG_VOLTAGE_HIGH_19_4V)){
/* VSET[3:0] = 0xE */
*pData |= (0xE << 1);
} else {
/* VSET[3:0] = 0x4 */
*pData |= (0x4 << 1);
}
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
static sony_result_t create_2nd_byte (sony_lnbc_t * pLnbc,
uint8_t isEnable,
sony_lnbc_transmit_mode_t mode,
uint8_t * pData)
{
SONY_TRACE_ENTER ("create_2nd_byte");
if ((!pLnbc) || (!pData)){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
/* Control Register 2
* +---------+---------+---------+---------+---------+---------+---------+----------+
* | TONEAMP | TIMER | l_SW | FSET | EN |DOUTMODE |TONE_AUTO|TONE_TRANS|
* +---------+---------+---------+---------+---------+---------+---------+----------+
* | 0 | 0 | 0 | 1 | ? | 0 | ? | ? |
* +---------+---------+---------+---------+---------+---------+---------+----------+
* EN = 0 : LNB output disabled
* 1 : LNB output voltage Enabled
* TONE_AUTO = 0 : GDR (External bypass FET control) is controlled by TONE_TRANS
* 1 : GDR (External bypass FET control) is automatically controlled by 22kHz tones transmit
* TONE_TRANS = 0 : GDR output with VLNB voltage. Bypass FET is OFF for tone receiving from satellite,
* 1 : GDR output with VCP voltage. Bypass FET is ON for tone transmit from TPS65235,
*/
*pData = 0x10;
if (isEnable){
/* EN = 1 */
*pData |= 0x08;
}
switch(mode)
{
case SONY_LNBC_TRANSMIT_MODE_TX:
/* TONE_TRANS = 1 */
*pData |= 0x01;
break;
case SONY_LNBC_TRANSMIT_MODE_RX:
/* TONE_TRANS = 0 */
break;
case SONY_LNBC_TRANSMIT_MODE_AUTO:
/* TONE_AUTO = 1 */
*pData |= 0x02;
break;
default:
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
@@ -0,0 +1,67 @@
/*------------------------------------------------------------------------------
Copyright 2017 Sony Semiconductor Solutions Corporation
Last Updated : 2017/11/30
Modification ID : 253a4918e2da2cf28a9393596fa16f25024e504d
------------------------------------------------------------------------------*/
/**
@file ti_tps65235.h
This file provides the functions to control TPS65235(TI).
*/
/*----------------------------------------------------------------------------*/
#ifndef TI_TPS65235_H
#define TI_TPS65235_H
#include "sony_common.h"
#include "sony_lnbc.h"
/**
@brief Use 13.4V for low level output voltage.
If you would like to use 13.4V as "Low level voltage",
please set this parameter by sony_lnbc_t::SetConfig(SONY_LNBC_CONFIG_ID_LOW_VOLTAGE, value).
*/
#define TI_TPS65235_CONFIG_VOLTAGE_LOW_13_4V 0
/**
@brief Use 14.6V for low level output voltage.
If you would like to use 14.6V as "Low level voltage",
please set this parameter by sony_lnbc_t::SetConfig(SONY_LNBC_CONFIG_ID_LOW_VOLTAGE, value).
*/
#define TI_TPS65235_CONFIG_VOLTAGE_LOW_14_6V 1
/**
@brief Use 18.2V for high level output voltage.
If you would like to use 18.2V as "High level voltage",
please set this parameter by sony_lnbc_t::SetConfig(SONY_LNBC_CONFIG_ID_HIGH_VOLTAGE, value).
*/
#define TI_TPS65235_CONFIG_VOLTAGE_HIGH_18_2V 10
/**
@brief Use 19.4V for high level output voltage.
If you would like to use 19.4V as "High level voltage",
please set this parameter by sony_lnbc_t::SetConfig(SONY_LNBC_CONFIG_ID_HIGH_VOLTAGE, value).
*/
#define TI_TPS65235_CONFIG_VOLTAGE_HIGH_19_4V 11
/*------------------------------------------------------------------------------
Functions
------------------------------------------------------------------------------*/
/**
@brief Create a instance for TPS65235(TI).
@param pLnbc LNB controller driver instance.
@param i2cAddress I2C address.
@param pI2c I2C instance.
@return SONY_RESULT_OK if successful.
*/
sony_result_t ti_tps65235_Create (sony_lnbc_t * pLnbc,
uint8_t i2cAddress,
sony_i2c_t * pI2c);
#endif /* TI_TPS65235_H */
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,313 @@
/*------------------------------------------------------------------------------
Copyright 2016 Sony Semiconductor Solutions Corporation
Last Updated : 2016/06/24
Modification ID : 3b74e280b7ad8ce430b6a9419ac53e8f2e3737f9
------------------------------------------------------------------------------*/
/**
@file sony_demod_sat_device_ctrl.h
This file provide satellite device control function for demodulator.
*/
/*----------------------------------------------------------------------------*/
#ifndef SONY_DEMOD_SAT_DEVICE_CONTROL_H
#define SONY_DEMOD_SAT_DEVICE_CONTROL_H
#include "../sony_common.h"
#include "../sony_demod.h"
/**
@brief Definition of length of DiSEqC / Single cable message.
*/
#define SONY_DISEQC_MESSAGE_LENGTH 12
/**
@brief Message structure for DiSEqC / Single cable message.
*/
typedef struct {
uint8_t data[SONY_DISEQC_MESSAGE_LENGTH]; /**< Data of the message. */
uint8_t length; /**< Length of the message. */
} sony_diseqc_message_t;
/**
@brief DSQOUT signal mode.
*/
typedef enum {
SONY_DSQOUT_MODE_PWM, /**< Output PWM signal from demodulator. */
SONY_DSQOUT_MODE_ENVELOPE /**< Output envelope signal from demodulator. */
} sony_dsqout_mode_t;
/**
@brief RXEN signal mode.
*/
typedef enum {
SONY_RXEN_MODE_NORMAL, /**< Normal mode. (Output "1" during device waits reply from slave device.) */
SONY_RXEN_MODE_INV, /**< Inverted mode. (Output "0" during device waits reply from slave device.) */
SONY_RXEN_MODE_FIXED_LOW, /**< Fixed to low always. */
SONY_RXEN_MODE_FIXED_HIGH /**< Fixed to high always. */
} sony_rxen_mode_t;
/**
@brief TXEN signal mode.
*/
typedef enum {
SONY_TXEN_MODE_NORMAL, /**< Normal mode. (Output "1" during device sends DiSEqC command.) */
SONY_TXEN_MODE_INV, /**< Inverted mode. (Output "0" during device sends DiSEqC command.) */
SONY_TXEN_MODE_FIXED_LOW, /**< Fixed to low always. */
SONY_TXEN_MODE_FIXED_HIGH /**< Fixed to high always. */
} sony_txen_mode_t;
/**
@brief Tone burst mode.
*/
typedef enum {
SONY_TONEBURST_MODE_OFF, /**< Not send tone burst. */
SONY_TONEBURST_MODE_A, /**< "0" Tone burst. (Satellite A) */
SONY_TONEBURST_MODE_B /**< "1" Data burst. (Satellite B) */
} sony_toneburst_mode_t;
/*------------------------------------------------------------------------------
Functions
------------------------------------------------------------------------------*/
/**
@brief Enable/disable satellite device ctrl function.
Setup DSQOUT/DSQIN pin enable/disable.
@param pDemod Demodulator instance.
@param enable Enable/disable setting.
- 0: Disable
- 1: Enable
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_demod_sat_device_ctrl_Enable (sony_demod_t * pDemod, uint8_t enable);
/**
@brief Configure for "DSQOUT" signal.
@param pDemod Demodulator instance.
@param mode DSQOUT signal mode. (Default value is PWM)
@param toneFreqKHz Tone signal frequency. Currently, only 22(KHz) and 44(KHz) are supported.
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_demod_sat_device_ctrl_DSQOUTSetting (sony_demod_t * pDemod,
sony_dsqout_mode_t mode,
uint8_t toneFreqKHz);
/**
@brief Configure for "RXEN" signal.
@param pDemod Demodulator instance.
@param mode RXEN signal mode.
@param posDelay Positive delay in ms.
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_demod_sat_device_ctrl_RXENSetting (sony_demod_t * pDemod,
sony_rxen_mode_t mode,
uint8_t posDelay);
/**
@brief Configure for "TXEN" signal.
@param pDemod Demodulator instance.
@param mode TXEN signal mode.
@param posDelay Positive delay in ms.
@param negDelay Negative delay in ms.
@return
*/
sony_result_t sony_demod_sat_device_ctrl_TXENSetting (sony_demod_t * pDemod,
sony_txen_mode_t mode,
uint8_t posDelay,
uint8_t negDelay);
/**
@brief Output tone signal.
Tone signal output status is changed after calling this function immediately.
@param pDemod Demodulator instance.
@param isEnable Continuous tone mode.
- 0: Disable (Not output)
- 1: Enable (Output)
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_demod_sat_device_ctrl_OutputTone (sony_demod_t * pDemod,
uint8_t isEnable);
/**
@brief Set "Tone burst" mode to demodulator.
Tone burst signal outputs after calling sony_demod_sat_device_ctrl_StartTransmit() function.
@param pDemod Demodulator instance.
@param toneBurstMode Tone burst mode.
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_demod_sat_device_ctrl_SetToneBurst (sony_demod_t * pDemod,
sony_toneburst_mode_t toneBurstMode);
/**
@brief Set DiSEqC command to demodulator.
DiSEqC commands outputs after calling sony_demod_sat_device_ctrl_StartTransmit() function.
@param pDemod Demodulator instance.
@param isEnable DiSEqC command mode.
- 0: Disable (Not output any DiSEqC command)
- 1: Enable (Output)
@param pCommand1 The address of 1st DiSEqC command.
@param count1 Transmitting count for 1st DiSEqC command.
@param pCommand2 The address of 2nd DiSEqC command.
(NULL if you want to transmit only one DiSEqC command.)
@param count2 Transmitting count for 2nd DiSEqC command.
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_demod_sat_device_ctrl_SetDiseqcCommand (sony_demod_t * pDemod,
uint8_t isEnable,
sony_diseqc_message_t * pCommand1,
uint8_t count1,
sony_diseqc_message_t * pCommand2,
uint8_t count2);
/**
@brief Set TxIdle time.
- DiSEqC command.
- Tone burst.
@param pDemod Demodulator instance.
@param idleTimeMs Idle time in ms.
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_demod_sat_device_ctrl_SetTxIdleTime (sony_demod_t * pDemod,
uint8_t idleTimeMs);
/**
@brief Set RxIdle time.
- DiSEqC command with reply.
@param pDemod Demodulator instance.
@param idleTimeMs Idle time in ms.
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_demod_sat_device_ctrl_SetRxIdleTime (sony_demod_t * pDemod,
uint8_t idleTimeMs);
/**
@brief Set repeat to repeat time between each command.
@param pDemod Demodulator instance.
@param r2rTime Idle time in ms.
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_demod_sat_device_ctrl_SetR2RTime (sony_demod_t * pDemod,
uint32_t r2rTime);
/**
@brief Set DiSEqC reply parameters.
@param pDemod Demodulator instance.
@param isEnable DiSEqC reply mode.
- 0: No reply mode.
- 1: Reply mode.
@param replyTimeoutMs Reply timeout time in ms.
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_demod_sat_device_ctrl_SetDiseqcReplyMode (sony_demod_t * pDemod,
uint8_t isEnable,
uint16_t replyTimeoutMs);
/**
@brief Start transmit sequence.
@param pDemod Demodulator instance.
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_demod_sat_device_ctrl_StartTransmit (sony_demod_t * pDemod);
/**
@brief Get transmit status.
@param pDemod Demodulator instance.
@param pStatus Transmit status.
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_demod_sat_device_ctrl_GetTransmitStatus (sony_demod_t * pDemod,
uint8_t * pStatus);
/**
@brief Get reply message.
@param pDemod Demodulator instance.
@param pReplyMessage Reply message instance.
@return SONY_RESULT_OK if successful and pMessage is valid.
*/
sony_result_t sony_demod_sat_device_ctrl_GetReplyMessage (sony_demod_t * pDemod,
sony_diseqc_message_t * pReplyMessage);
/**
@brief Get RXEN mode
@param pDemod Demodulator instance.
@param pIsEnable RXEN mode.
- 0: Disable
- 1: Enable
@return SONY_RESULT_OK if successful and pIsEnable is valid.
*/
sony_result_t sony_demod_sat_device_ctrl_GetRXENMode (sony_demod_t * pDemod,
uint8_t * pIsEnable);
/**
@brief Get TXEN mode
@param pDemod Demodulator instance.
@param pIsEnable TXEN mode.
- 0: Disable
- 1: Enable
@return SONY_RESULT_OK if successful and pIsEnable is valid.
*/
sony_result_t sony_demod_sat_device_ctrl_GetTXENMode (sony_demod_t * pDemod,
uint8_t * pIsEnable);
/**
@brief Set DiSEqC reply mask setting.
@param pDemod Demodulator instance.
@param pattern Pattern to allow receive as 1st byte of reply message.
@param mask Mask for pattern data.
@return SONY_RESULT_OK if successful and pIsEnable is valid.
*/
sony_result_t sony_demod_sat_device_ctrl_SetDiseqcReplyMask (sony_demod_t * pDemod,
uint8_t pattern,
uint8_t mask);
/**
@brief Change the single cable mode of demod driver.
@param pDemod Demodulator instance.
@param enable Single cable mode.
- 0: Disable
- 1: Enable
@return SONY_RESULT_OK if successful and pIsEnable is valid.
*/
sony_result_t sony_demod_sat_device_ctrl_EnableSinglecable (sony_demod_t * pDemod,
uint8_t enable);
#endif /* SONY_DEMOD_SAT_DEVICE_CONTROL_H */
+54
View File
@@ -0,0 +1,54 @@
/*------------------------------------------------------------------------------
Copyright 2016 Sony Semiconductor Solutions Corporation
Last Updated : 2016/06/24
Modification ID : 3b74e280b7ad8ce430b6a9419ac53e8f2e3737f9
------------------------------------------------------------------------------*/
/**
@file sony_diseqc_command.h
This file provides definitions for DiSEqC command.
*/
/*----------------------------------------------------------------------------*/
#ifndef SONY_DISEQC_COMMAND_H
#define SONY_DISEQC_COMMAND_H
#include "sony_demod_sat_device_ctrl.h"
/**
@brief Definition of framing byte for DiSEqC message.
*/
typedef enum sony_diseqc_framing_t {
SONY_DISEQC_FRAMING_MASTER_NO_REPLY_FIRST = 0xE0, /**< Command from master, no reply required. (first transmission) */
SONY_DISEQC_FRAMING_MASTER_NO_REPLY_REPEATED = 0xE1, /**< Command from master, no reply required. (repeated transmission) */
SONY_DISEQC_FRAMING_MASTER_REPLY_FIRST = 0xE2, /**< Command from master, reply required. (first transmission) */
SONY_DISEQC_FRAMING_MASTER_REPLY_REPEATED = 0xE3, /**< Command from master, reply required. (repeated transmission) */
SONY_DISEQC_FRAMING_SLAVE_REPLY_OK = 0xE4, /**< Reply from slave, command OK, no errors detected. */
SONY_DISEQC_FRAMING_SLAVE_REPLY_CMD_UNSUPPORTED = 0xE5, /**< Reply from slave, command not supported. */
SONY_DISEQC_FRAMING_SLAVE_REPLY_ERR_PARITY = 0xE6, /**< Reply from slave, parity error detected. */
SONY_DISEQC_FRAMING_SLAVE_REPLY_CMD_UNKNOWN = 0xE7 /**< Reply from slave, command not recoginised/unknown. Request repeat. */
} sony_diseqc_framing_t;
/**
@brief Definition of address byte for DiSEqC message.
*/
typedef enum sony_diseqc_address_t {
SONY_DISEQC_ADDRESS_ALL_DEVICES = 0x00, /**< Any device (Master to all devices) */
SONY_DISEQC_ADDRESS_ALL_LNB_SMATV_SWITCHER = 0x10, /**< Any LNB, Switcher or SMATV (Master to all...) */
SONY_DISEQC_ADDRESS_LNB_DEVICE = 0x11, /**< LNB devices. */
SONY_DISEQC_ADDRESS_LNB_WITH_LOOP_THROUGH = 0x12, /**< LNB with loop-through switching. */
SONY_DISEQC_ADDRESS_SWITCHER_DEVICE_DC_BLK = 0x14, /**< Switcher (inc. DC blocking) */
SONY_DISEQC_ADDRESS_SWITCHER_DEVICE_DC_LOOP = 0x15, /**< Switcher with DC loop through. */
SONY_DISEQC_ADDRESS_SMATV_DEVICE = 0x18, /**< SMATV devices. */
SONY_DISEQC_ADDRESS_ANY_POLARISER = 0x20, /**< Any Polariser (Master to all Polarisers) */
SONY_DISEQC_ADDRESS_LIN_POL_CONTROLLER = 0x21, /**< Linear Polarisation Controller. */
SONY_DISEQC_ADDRESS_ANY_POSITIONER = 0x30, /**< Any Positioner (Master to all Positioners) */
SONY_DISEQC_ADDRESS_POLAR_POSITIONER = 0x31, /**< Polar/Azimuth Positioner. */
SONY_DISEQC_ADDRESS_ELEVATION_POSITIONER = 0x32, /**< Elevation Positioner. */
SONY_DISEQC_ADDRESS_ANY_INSTALLER_AID = 0x40, /**< Any Installer Aid (Master to all Installer Aids). */
SONY_DISEQC_ADDRESS_SIGNAL_STRENGTH_ANALOGUE = 0x41, /**< Signal strength 0 Analogue value. */
SONY_DISEQC_ADDRESS_ANY_INTELLI_SLAVES = 0x70, /**< Any Intelligent Slave Interfaces (Master to all) */
SONY_DISEQC_ADDRESS_SUBSCRIBER_CONTROLLED_HEADENDS = 0x71 /**< Interface for subscriber controlled headends. */
} sony_diseqc_address_t;
#endif /* SONY_DISEQC_COMMAND_H */
@@ -0,0 +1,288 @@
/*------------------------------------------------------------------------------
Copyright 2016-2018 Sony Semiconductor Solutions Corporation
Last Updated : 2018/12/13
Modification ID : e402a4dcb0e51a00c34b174334c082c1211eebf1
------------------------------------------------------------------------------*/
#include "sony_diseqc_command_1_0.h"
/*------------------------------------------------------------------------------
Functions
------------------------------------------------------------------------------*/
sony_result_t sony_diseqc_command_Reset (sony_diseqc_message_t * pMessage,
sony_diseqc_framing_t framing,
sony_diseqc_address_t address)
{
int32_t index = 0;
SONY_TRACE_ENTER ("sony_diseqc_command_Reset");
if (!pMessage){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
for(index = 0; index < SONY_DISEQC_MESSAGE_LENGTH; index++){
pMessage->data[index] = 0;
}
pMessage->data[0] = (uint8_t)framing;
pMessage->data[1] = (uint8_t)address;
pMessage->data[2] = 0x00;
pMessage->length = 3;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
sony_result_t sony_diseqc_command_Standby (sony_diseqc_message_t * pMessage,
sony_diseqc_framing_t framing,
sony_diseqc_address_t address)
{
int32_t index = 0;
SONY_TRACE_ENTER ("sony_diseqc_command_Standby");
if (!pMessage){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
for(index = 0; index < SONY_DISEQC_MESSAGE_LENGTH; index++){
pMessage->data[index] = 0;
}
pMessage->data[0] = (uint8_t)framing;
pMessage->data[1] = (uint8_t)address;
pMessage->data[2] = 0x02;
pMessage->length = 3;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
sony_result_t sony_diseqc_command_PowerOn (sony_diseqc_message_t * pMessage,
sony_diseqc_framing_t framing,
sony_diseqc_address_t address)
{
int32_t index = 0;
SONY_TRACE_ENTER ("sony_diseqc_command_PowerOn");
if (!pMessage){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
for(index = 0; index < SONY_DISEQC_MESSAGE_LENGTH; index++){
pMessage->data[index] = 0;
}
pMessage->data[0] = (uint8_t)framing;
pMessage->data[1] = (uint8_t)address;
pMessage->data[2] = 0x03;
pMessage->length = 3;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
sony_result_t sony_diseqc_command_SetLo (sony_diseqc_message_t * pMessage,
sony_diseqc_framing_t framing,
sony_diseqc_address_t address)
{
int32_t index = 0;
SONY_TRACE_ENTER ("sony_diseqc_command_SetLo");
if (!pMessage){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
for(index = 0; index < SONY_DISEQC_MESSAGE_LENGTH; index++){
pMessage->data[index] = 0;
}
pMessage->data[0] = (uint8_t)framing;
pMessage->data[1] = (uint8_t)address;
pMessage->data[2] = 0x20;
pMessage->length = 3;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
sony_result_t sony_diseqc_command_SetVR (sony_diseqc_message_t * pMessage,
sony_diseqc_framing_t framing,
sony_diseqc_address_t address)
{
int32_t index = 0;
SONY_TRACE_ENTER ("sony_diseqc_command_SetVR");
if (!pMessage){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
for(index = 0; index < SONY_DISEQC_MESSAGE_LENGTH; index++){
pMessage->data[index] = 0;
}
pMessage->data[0] = (uint8_t)framing;
pMessage->data[1] = (uint8_t)address;
pMessage->data[2] = 0x21;
pMessage->length = 3;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
sony_result_t sony_diseqc_command_SetPosA (sony_diseqc_message_t * pMessage,
sony_diseqc_framing_t framing,
sony_diseqc_address_t address)
{
int32_t index = 0;
SONY_TRACE_ENTER ("sony_diseqc_command_SetPosA");
if (!pMessage){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
for(index = 0; index < SONY_DISEQC_MESSAGE_LENGTH; index++){
pMessage->data[index] = 0;
}
pMessage->data[0] = (uint8_t)framing;
pMessage->data[1] = (uint8_t)address;
pMessage->data[2] = 0x22;
pMessage->length = 3;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
sony_result_t sony_diseqc_command_SetSOA (sony_diseqc_message_t * pMessage,
sony_diseqc_framing_t framing,
sony_diseqc_address_t address)
{
int32_t index = 0;
SONY_TRACE_ENTER ("sony_diseqc_command_SetSOA");
if (!pMessage){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
for(index = 0; index < SONY_DISEQC_MESSAGE_LENGTH; index++){
pMessage->data[index] = 0;
}
pMessage->data[0] = (uint8_t)framing;
pMessage->data[1] = (uint8_t)address;
pMessage->data[2] = 0x23;
pMessage->length = 3;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
sony_result_t sony_diseqc_command_SetHi (sony_diseqc_message_t * pMessage,
sony_diseqc_framing_t framing,
sony_diseqc_address_t address)
{
int32_t index = 0;
SONY_TRACE_ENTER ("sony_diseqc_command_SetHi");
if (!pMessage){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
for(index = 0; index < SONY_DISEQC_MESSAGE_LENGTH; index++){
pMessage->data[index] = 0;
}
pMessage->data[0] = (uint8_t)framing;
pMessage->data[1] = (uint8_t)address;
pMessage->data[2] = 0x24;
pMessage->length = 3;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
sony_result_t sony_diseqc_command_SetHL (sony_diseqc_message_t * pMessage,
sony_diseqc_framing_t framing,
sony_diseqc_address_t address)
{
int32_t index = 0;
SONY_TRACE_ENTER ("sony_diseqc_command_SetHL");
if (!pMessage){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
for(index = 0; index < SONY_DISEQC_MESSAGE_LENGTH; index++){
pMessage->data[index] = 0;
}
pMessage->data[0] = (uint8_t)framing;
pMessage->data[1] = (uint8_t)address;
pMessage->data[2] = 0x25;
pMessage->length = 3;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
sony_result_t sony_diseqc_command_SetPosB (sony_diseqc_message_t * pMessage,
sony_diseqc_framing_t framing,
sony_diseqc_address_t address)
{
int32_t index = 0;
SONY_TRACE_ENTER ("sony_diseqc_command_SetPosB");
if (!pMessage){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
for(index = 0; index < SONY_DISEQC_MESSAGE_LENGTH; index++){
pMessage->data[index] = 0;
}
pMessage->data[0] = (uint8_t)framing;
pMessage->data[1] = (uint8_t)address;
pMessage->data[2] = 0x26;
pMessage->length = 3;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
sony_result_t sony_diseqc_command_SetSOB (sony_diseqc_message_t * pMessage,
sony_diseqc_framing_t framing,
sony_diseqc_address_t address)
{
int32_t index = 0;
SONY_TRACE_ENTER ("sony_diseqc_command_SetSOB");
if (!pMessage){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
for(index = 0; index < SONY_DISEQC_MESSAGE_LENGTH; index++){
pMessage->data[index] = 0;
}
pMessage->data[0] = (uint8_t)framing;
pMessage->data[1] = (uint8_t)address;
pMessage->data[2] = 0x27;
pMessage->length = 3;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
sony_result_t sony_diseqc_command_WriteN0 (sony_diseqc_message_t * pMessage,
sony_diseqc_framing_t framing,
sony_diseqc_address_t address,
uint8_t data)
{
int32_t index = 0;
SONY_TRACE_ENTER ("sony_diseqc_command_WriteN0");
if (!pMessage){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
for(index = 0; index < SONY_DISEQC_MESSAGE_LENGTH; index++){
pMessage->data[index] = 0;
}
pMessage->data[0] = (uint8_t)framing;
pMessage->data[1] = (uint8_t)address;
pMessage->data[2] = 0x38;
pMessage->data[3] = data;
pMessage->length = 4;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
@@ -0,0 +1,180 @@
/*------------------------------------------------------------------------------
Copyright 2016-2018 Sony Semiconductor Solutions Corporation
Last Updated : 2018/12/13
Modification ID : e402a4dcb0e51a00c34b174334c082c1211eebf1
------------------------------------------------------------------------------*/
/**
@file sony_diseqc_command_1_0.h
This file provides functions for generating "DiSEqC1.0" commands.
*/
/*----------------------------------------------------------------------------*/
#ifndef SONY_DISEQC_COMMAND_1_0_H
#define SONY_DISEQC_COMMAND_1_0_H
#include "sony_common.h"
#include "sony_diseqc_command.h"
/*------------------------------------------------------------------------------
Functions
------------------------------------------------------------------------------*/
/**
@brief Create DiSEqC command to reset DiSEqC microcontroller.
@param pMessage The message instance.
@param framing Framing byte.
@param address Address byte.
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_diseqc_command_Reset (sony_diseqc_message_t * pMessage,
sony_diseqc_framing_t framing,
sony_diseqc_address_t address);
/**
@brief Create DiSEqC command to switch peripheral power supply off.
@param pMessage The message instance.
@param framing Framing byte.
@param address Address byte.
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_diseqc_command_Standby (sony_diseqc_message_t * pMessage,
sony_diseqc_framing_t framing,
sony_diseqc_address_t address);
/**
@brief Create DiSEqC command to switch peripheral power supply on.
@param pMessage The message instance.
@param framing Framing byte.
@param address Address byte.
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_diseqc_command_PowerOn (sony_diseqc_message_t * pMessage,
sony_diseqc_framing_t framing,
sony_diseqc_address_t address);
/**
@brief Create DiSEqC command to select the Low Local Oscillator frequency.
@param pMessage The message instance.
@param framing Framing byte.
@param address Address byte.
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_diseqc_command_SetLo (sony_diseqc_message_t * pMessage,
sony_diseqc_framing_t framing,
sony_diseqc_address_t address);
/**
@brief Create DiSEqC command select Vertical Polarisation (or Right circular).
@param pMessage The message instance.
@param framing Framing byte.
@param address Address byte.
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_diseqc_command_SetVR (sony_diseqc_message_t * pMessage,
sony_diseqc_framing_t framing,
sony_diseqc_address_t address);
/**
@brief Create DiSEqC command select Satellite position A (or position C).
@param pMessage The message instance.
@param framing Framing byte.
@param address Address byte.
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_diseqc_command_SetPosA (sony_diseqc_message_t * pMessage,
sony_diseqc_framing_t framing,
sony_diseqc_address_t address);
/**
@brief Create DiSEqC command to select Switch Option A (e.g. positions A/B).
@param pMessage The message instance.
@param framing Framing byte.
@param address Address byte.
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_diseqc_command_SetSOA (sony_diseqc_message_t * pMessage,
sony_diseqc_framing_t framing,
sony_diseqc_address_t address);
/**
@brief Create DiSEqC command to select the High Local Oscillator frequency.
@param pMessage The message instance.
@param framing Framing byte.
@param address Address byte.
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_diseqc_command_SetHi (sony_diseqc_message_t * pMessage,
sony_diseqc_framing_t framing,
sony_diseqc_address_t address);
/**
@brief Create DiSEqC command to select Horizontal Polarisation (or Left circular).
@param pMessage The message instance.
@param framing Framing byte.
@param address Address byte.
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_diseqc_command_SetHL (sony_diseqc_message_t * pMessage,
sony_diseqc_framing_t framing,
sony_diseqc_address_t address);
/**
@brief Create DiSEqC command to select Satellite position B (or position D).
@param pMessage The message instance.
@param framing Framing byte.
@param address Address byte.
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_diseqc_command_SetPosB (sony_diseqc_message_t * pMessage,
sony_diseqc_framing_t framing,
sony_diseqc_address_t address);
/**
@brief Create DiSEqC command to select Switch Option B (e.g. positions C/D).
@param pMessage The message instance.
@param framing Framing byte.
@param address Address byte.
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_diseqc_command_SetSOB (sony_diseqc_message_t * pMessage,
sony_diseqc_framing_t framing,
sony_diseqc_address_t address);
/**
@brief Create DiSEqC command to write to Port group 0 (Committed switches).
@param pMessage The message instance.
@param framing Framing byte.
@param address Address byte.
@param data Data to send.
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_diseqc_command_WriteN0 (sony_diseqc_message_t * pMessage,
sony_diseqc_framing_t framing,
sony_diseqc_address_t address,
uint8_t data);
#endif /* SONY_DISEQC_COMMAND_1_0_H */
@@ -0,0 +1,284 @@
/*------------------------------------------------------------------------------
Copyright 2016-2018 Sony Semiconductor Solutions Corporation
Last Updated : 2018/12/13
Modification ID : e402a4dcb0e51a00c34b174334c082c1211eebf1
------------------------------------------------------------------------------*/
#include "sony_diseqc_command_1_1.h"
/*----------------------------------------------------------------------------
Static Functions
----------------------------------------------------------------------------*/
static uint32_t dectobcd(uint32_t decimal);
/*----------------------------------------------------------------------------
Functions
----------------------------------------------------------------------------*/
sony_result_t sony_diseqc_command_SetS1A (sony_diseqc_message_t * pMessage,
sony_diseqc_framing_t framing,
sony_diseqc_address_t address)
{
int32_t index = 0;
SONY_TRACE_ENTER ("sony_diseqc_command_SetS1A");
if (!pMessage){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
for(index = 0; index < SONY_DISEQC_MESSAGE_LENGTH; index++){
pMessage->data[index] = 0;
}
pMessage->data[0] = (uint8_t)framing;
pMessage->data[1] = (uint8_t)address;
pMessage->data[2] = 0x28;
pMessage->length = 3;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
sony_result_t sony_diseqc_command_SetS2A (sony_diseqc_message_t * pMessage,
sony_diseqc_framing_t framing,
sony_diseqc_address_t address)
{
int32_t index = 0;
SONY_TRACE_ENTER ("sony_diseqc_command_SetS2A");
if (!pMessage){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
for(index = 0; index < SONY_DISEQC_MESSAGE_LENGTH; index++){
pMessage->data[index] = 0;
}
pMessage->data[0] = (uint8_t)framing;
pMessage->data[1] = (uint8_t)address;
pMessage->data[2] = 0x29;
pMessage->length = 3;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
sony_result_t sony_diseqc_command_SetS3A (sony_diseqc_message_t * pMessage,
sony_diseqc_framing_t framing,
sony_diseqc_address_t address)
{
int32_t index = 0;
SONY_TRACE_ENTER ("sony_diseqc_command_SetS3A");
if (!pMessage){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
for(index = 0; index < SONY_DISEQC_MESSAGE_LENGTH; index++){
pMessage->data[index] = 0;
}
pMessage->data[0] = (uint8_t)framing;
pMessage->data[1] = (uint8_t)address;
pMessage->data[2] = 0x2A;
pMessage->length = 3;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
sony_result_t sony_diseqc_command_SetS4A (sony_diseqc_message_t * pMessage,
sony_diseqc_framing_t framing,
sony_diseqc_address_t address)
{
int32_t index = 0;
SONY_TRACE_ENTER ("sony_diseqc_command_SetS4A");
if (!pMessage){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
for(index = 0; index < SONY_DISEQC_MESSAGE_LENGTH; index++){
pMessage->data[index] = 0;
}
pMessage->data[0] = (uint8_t)framing;
pMessage->data[1] = (uint8_t)address;
pMessage->data[2] = 0x2B;
pMessage->length = 3;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
sony_result_t sony_diseqc_command_SetS1B (sony_diseqc_message_t * pMessage,
sony_diseqc_framing_t framing,
sony_diseqc_address_t address)
{
int32_t index = 0;
SONY_TRACE_ENTER ("sony_diseqc_command_SetS1B");
if (!pMessage){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
for(index = 0; index < SONY_DISEQC_MESSAGE_LENGTH; index++){
pMessage->data[index] = 0;
}
pMessage->data[0] = (uint8_t)framing;
pMessage->data[1] = (uint8_t)address;
pMessage->data[2] = 0x2C;
pMessage->length = 3;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
sony_result_t sony_diseqc_command_SetS2B (sony_diseqc_message_t * pMessage,
sony_diseqc_framing_t framing,
sony_diseqc_address_t address)
{
int32_t index = 0;
SONY_TRACE_ENTER ("sony_diseqc_command_SetS2B");
if (!pMessage){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
for(index = 0; index < SONY_DISEQC_MESSAGE_LENGTH; index++){
pMessage->data[index] = 0;
}
pMessage->data[0] = (uint8_t)framing;
pMessage->data[1] = (uint8_t)address;
pMessage->data[2] = 0x2D;
pMessage->length = 3;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
sony_result_t sony_diseqc_command_SetS3B (sony_diseqc_message_t * pMessage,
sony_diseqc_framing_t framing,
sony_diseqc_address_t address)
{
int32_t index = 0;
SONY_TRACE_ENTER ("sony_diseqc_command_SetS3B");
if (!pMessage){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
for(index = 0; index < SONY_DISEQC_MESSAGE_LENGTH; index++){
pMessage->data[index] = 0;
}
pMessage->data[0] = (uint8_t)framing;
pMessage->data[1] = (uint8_t)address;
pMessage->data[2] = 0x2E;
pMessage->length = 3;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
sony_result_t sony_diseqc_command_SetS4B (sony_diseqc_message_t * pMessage,
sony_diseqc_framing_t framing,
sony_diseqc_address_t address)
{
int32_t index = 0;
SONY_TRACE_ENTER ("sony_diseqc_command_SetS4B");
if (!pMessage){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
for(index = 0; index < SONY_DISEQC_MESSAGE_LENGTH; index++){
pMessage->data[index] = 0;
}
pMessage->data[0] = (uint8_t)framing;
pMessage->data[1] = (uint8_t)address;
pMessage->data[2] = 0x2F;
pMessage->length = 3;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
sony_result_t sony_diseqc_command_WriteN1 (sony_diseqc_message_t * pMessage,
sony_diseqc_framing_t framing,
sony_diseqc_address_t address,
uint8_t data)
{
int32_t index = 0;
SONY_TRACE_ENTER ("sony_diseqc_command_WriteN1");
if (!pMessage){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
for(index = 0; index < SONY_DISEQC_MESSAGE_LENGTH; index++){
pMessage->data[index] = 0;
}
pMessage->data[0] = (uint8_t)framing;
pMessage->data[1] = (uint8_t)address;
pMessage->data[2] = 0x39;
pMessage->data[3] = data;
pMessage->length = 4;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
sony_result_t sony_diseqc_command_WriteFreq (sony_diseqc_message_t * pMessage,
sony_diseqc_framing_t framing,
sony_diseqc_address_t address,
uint32_t frequency)
{
int32_t index = 0;
uint32_t data = 0;
SONY_TRACE_ENTER ("sony_diseqc_command_WriteFreq");
if (!pMessage){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
for(index = 0; index < SONY_DISEQC_MESSAGE_LENGTH; index++){
pMessage->data[index] = 0;
}
pMessage->data[0] = (uint8_t)framing;
pMessage->data[1] = (uint8_t)address;
pMessage->data[2] = 0x58;
frequency = (frequency + 50) / 100;
data = dectobcd(frequency);
if ((data >> 24) & 0xFF){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
pMessage->data[3] = (uint8_t)((data >> 16) & 0xFF);
pMessage->data[4] = (uint8_t)((data >> 8) & 0xFF);
pMessage->data[5] = (uint8_t)( data & 0xFF);
if (pMessage->data[5] == 0x00){
/* Don't send 6th byte data(data[5]). */
pMessage->length = 5;
} else {
/* Send 6th byte data(data[5]). */
pMessage->length = 6;
}
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
/*----------------------------------------------------------------------------
Static Functions
----------------------------------------------------------------------------*/
static uint32_t dectobcd(uint32_t decimal)
{
uint32_t bcd = 0;
uint8_t r = 0;
uint8_t index = 0;
for (index = 0; index < 8 ; index++)
{
r = (uint8_t)(decimal % 10) ;
decimal /= 10 ;
bcd |= ((uint32_t)(r & 0x0F) << (int32_t)(4 * index)) ;
}
return bcd;
}
@@ -0,0 +1,156 @@
/*------------------------------------------------------------------------------
Copyright 2016-2018 Sony Semiconductor Solutions Corporation
Last Updated : 2018/12/13
Modification ID : e402a4dcb0e51a00c34b174334c082c1211eebf1
------------------------------------------------------------------------------*/
/**
@file sony_diseqc_command_1_1.h
This file provides functions for generating "DiSEqC1.1" commands.
*/
/*----------------------------------------------------------------------------*/
#ifndef SONY_DISEQC_COMMAND_1_1_H
#define SONY_DISEQC_COMMAND_1_1_H
#include "sony_common.h"
#include "sony_diseqc_command.h"
/*------------------------------------------------------------------------------
Functions
------------------------------------------------------------------------------*/
/**
@brief Create DiSEqC command to select switch S1 input A (deselect input B).
@param pMessage The message instance.
@param framing Framing byte.
@param address Address byte.
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_diseqc_command_SetS1A (sony_diseqc_message_t * pMessage,
sony_diseqc_framing_t framing,
sony_diseqc_address_t address);
/**
@brief Create DiSEqC command to select switch S2 input A (deselect input B).
@param pMessage The message instance.
@param framing Framing byte.
@param address Address byte.
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_diseqc_command_SetS2A (sony_diseqc_message_t * pMessage,
sony_diseqc_framing_t framing,
sony_diseqc_address_t address);
/**
@brief Create DiSEqC command to select switch S3 input A (deselect input B).
@param pMessage The message instance.
@param framing Framing byte.
@param address Address byte.
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_diseqc_command_SetS3A (sony_diseqc_message_t * pMessage,
sony_diseqc_framing_t framing,
sony_diseqc_address_t address);
/**
@brief Create DiSEqC command to select switch S4 input A (deselect input B).
@param pMessage The message instance.
@param framing Framing byte.
@param address Address byte.
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_diseqc_command_SetS4A (sony_diseqc_message_t * pMessage,
sony_diseqc_framing_t framing,
sony_diseqc_address_t address);
/**
@brief Create DiSEqC command to select switch S1 input B (deselect input A).
@param pMessage The message instance.
@param framing Framing byte.
@param address Address byte.
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_diseqc_command_SetS1B (sony_diseqc_message_t * pMessage,
sony_diseqc_framing_t framing,
sony_diseqc_address_t address);
/**
@brief Create DiSEqC command to select switch S2 input B (deselect input A).
@param pMessage The message instance.
@param framing Framing byte.
@param address Address byte.
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_diseqc_command_SetS2B (sony_diseqc_message_t * pMessage,
sony_diseqc_framing_t framing,
sony_diseqc_address_t address);
/**
@brief Create DiSEqC command to select switch S3 input B (deselect input A).
@param pMessage The message instance.
@param framing Framing byte.
@param address Address byte.
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_diseqc_command_SetS3B (sony_diseqc_message_t * pMessage,
sony_diseqc_framing_t framing,
sony_diseqc_address_t address);
/**
@brief Create DiSEqC command to select switch S4 input B (deselect input A).
@param pMessage The message instance.
@param framing Framing byte.
@param address Address byte.
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_diseqc_command_SetS4B (sony_diseqc_message_t * pMessage,
sony_diseqc_framing_t framing,
sony_diseqc_address_t address);
/**
@brief Create DiSEqC command to write to Port group 1 (Uncommitted switches).
@param pMessage The message instance.
@param framing Framing byte.
@param address Address byte.
@param data Data to send.
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_diseqc_command_WriteN1 (sony_diseqc_message_t * pMessage,
sony_diseqc_framing_t framing,
sony_diseqc_address_t address,
uint8_t data);
/**
@brief Create DiSEqC command to write channel frequency (BCD string).
@param pMessage The message instance.
@param framing Framing byte.
@param address Address byte.
@param frequency Frequency in KHz.
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_diseqc_command_WriteFreq (sony_diseqc_message_t * pMessage,
sony_diseqc_framing_t framing,
sony_diseqc_address_t address,
uint32_t frequency);
#endif /* SONY_DISEQC_COMMAND_1_1_H */
@@ -0,0 +1,342 @@
/*------------------------------------------------------------------------------
Copyright 2016-2018 Sony Semiconductor Solutions Corporation
Last Updated : 2018/12/13
Modification ID : e402a4dcb0e51a00c34b174334c082c1211eebf1
------------------------------------------------------------------------------*/
#include "sony_diseqc_command_1_2.h"
/*------------------------------------------------------------------------------
Static Functions
------------------------------------------------------------------------------*/
static sony_result_t generateDriveXData(sony_diseqc_motor_mode_t mode,
uint8_t amount,
uint8_t * pData);
/*------------------------------------------------------------------------------
Functions
------------------------------------------------------------------------------*/
sony_result_t sony_diseqc_command_WriteA0 (sony_diseqc_message_t * pMessage,
sony_diseqc_framing_t framing,
sony_diseqc_address_t address,
uint8_t data)
{
int32_t index = 0;
SONY_TRACE_ENTER ("sony_diseqc_command_WriteA0");
if (!pMessage){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
for(index = 0; index < SONY_DISEQC_MESSAGE_LENGTH; index++){
pMessage->data[index] = 0;
}
pMessage->data[0] = (uint8_t)framing;
pMessage->data[1] = (uint8_t)address;
pMessage->data[2] = 0x48;
pMessage->data[3] = data;
pMessage->length = 4;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
sony_result_t sony_diseqc_command_WriteA1 (sony_diseqc_message_t * pMessage,
sony_diseqc_framing_t framing,
sony_diseqc_address_t address,
uint8_t data)
{
int32_t index = 0;
SONY_TRACE_ENTER ("sony_diseqc_command_WriteA1");
if (!pMessage){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
for(index = 0; index < SONY_DISEQC_MESSAGE_LENGTH; index++){
pMessage->data[index] = 0;
}
pMessage->data[0] = (uint8_t)framing;
pMessage->data[1] = (uint8_t)address;
pMessage->data[2] = 0x49;
pMessage->data[3] = data;
pMessage->length = 4;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
sony_result_t sony_diseqc_command_Halt (sony_diseqc_message_t * pMessage,
sony_diseqc_framing_t framing,
sony_diseqc_address_t address)
{
int32_t index = 0;
SONY_TRACE_ENTER ("sony_diseqc_command_Halt");
if (!pMessage){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
for(index = 0; index < SONY_DISEQC_MESSAGE_LENGTH; index++){
pMessage->data[index] = 0;
}
pMessage->data[0] = (uint8_t)framing;
pMessage->data[1] = (uint8_t)address;
pMessage->data[2] = 0x60;
pMessage->length = 3;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
sony_result_t sony_diseqc_command_LimitsOff (sony_diseqc_message_t * pMessage,
sony_diseqc_framing_t framing,
sony_diseqc_address_t address)
{
int32_t index = 0;
SONY_TRACE_ENTER ("sony_diseqc_command_LimitsOff");
if (!pMessage){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
for(index = 0; index < SONY_DISEQC_MESSAGE_LENGTH; index++){
pMessage->data[index] = 0;
}
pMessage->data[0] = (uint8_t)framing;
pMessage->data[1] = (uint8_t)address;
pMessage->data[2] = 0x63;
pMessage->length = 3;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
sony_result_t sony_diseqc_command_LimitE (sony_diseqc_message_t * pMessage,
sony_diseqc_framing_t framing,
sony_diseqc_address_t address)
{
int32_t index = 0;
SONY_TRACE_ENTER ("sony_diseqc_command_LimitE");
if (!pMessage){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
for(index = 0; index < SONY_DISEQC_MESSAGE_LENGTH; index++){
pMessage->data[index] = 0;
}
pMessage->data[0] = (uint8_t)framing;
pMessage->data[1] = (uint8_t)address;
pMessage->data[2] = 0x66;
pMessage->length = 3;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
sony_result_t sony_diseqc_command_LimitW (sony_diseqc_message_t * pMessage,
sony_diseqc_framing_t framing,
sony_diseqc_address_t address)
{
int32_t index = 0;
SONY_TRACE_ENTER ("sony_diseqc_command_LimitW");
if (!pMessage){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
for(index = 0; index < SONY_DISEQC_MESSAGE_LENGTH; index++){
pMessage->data[index] = 0;
}
pMessage->data[0] = (uint8_t)framing;
pMessage->data[1] = (uint8_t)address;
pMessage->data[2] = 0x67;
pMessage->length = 3;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
sony_result_t sony_diseqc_command_DriveEast (sony_diseqc_message_t * pMessage,
sony_diseqc_framing_t framing,
sony_diseqc_address_t address,
sony_diseqc_motor_mode_t mode,
uint8_t amount)
{
int32_t index = 0;
sony_result_t result = SONY_RESULT_OK;
SONY_TRACE_ENTER ("sony_diseqc_command_DriveEast");
if (!pMessage){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
for(index = 0; index < SONY_DISEQC_MESSAGE_LENGTH; index++){
pMessage->data[index] = 0;
}
pMessage->data[0] = (uint8_t)framing;
pMessage->data[1] = (uint8_t)address;
pMessage->data[2] = 0x68;
result = generateDriveXData(mode, amount, &pMessage->data[3]);
if (result != SONY_RESULT_OK){SONY_TRACE_RETURN (result);}
pMessage->length = 4;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
sony_result_t sony_diseqc_command_DriveWest (sony_diseqc_message_t * pMessage,
sony_diseqc_framing_t framing,
sony_diseqc_address_t address,
sony_diseqc_motor_mode_t mode,
uint8_t amount)
{
int32_t index = 0;
sony_result_t result = SONY_RESULT_OK;
SONY_TRACE_ENTER ("sony_diseqc_command_DriveWest");
if (!pMessage){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
for(index = 0; index < SONY_DISEQC_MESSAGE_LENGTH; index++){
pMessage->data[index] = 0;
}
pMessage->data[0] = (uint8_t)framing;
pMessage->data[1] = (uint8_t)address;
pMessage->data[2] = 0x69;
result = generateDriveXData(mode, amount, &pMessage->data[3]);
if (result != SONY_RESULT_OK){SONY_TRACE_RETURN (result);}
pMessage->length = 4;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
sony_result_t sony_diseqc_command_Storenn (sony_diseqc_message_t * pMessage,
sony_diseqc_framing_t framing,
sony_diseqc_address_t address,
uint8_t posNumber)
{
int32_t index = 0;
SONY_TRACE_ENTER ("sony_diseqc_command_Storenn");
if (!pMessage){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
for(index = 0; index < SONY_DISEQC_MESSAGE_LENGTH; index++){
pMessage->data[index] = 0;
}
pMessage->data[0] = (uint8_t)framing;
pMessage->data[1] = (uint8_t)address;
pMessage->data[2] = 0x6A;
pMessage->data[3] = posNumber;
pMessage->length = 4;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
sony_result_t sony_diseqc_command_Gotonn (sony_diseqc_message_t * pMessage,
sony_diseqc_framing_t framing,
sony_diseqc_address_t address,
uint8_t posNumber)
{
int32_t index = 0;
SONY_TRACE_ENTER ("sony_diseqc_command_Gotonn");
if (!pMessage){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
for(index = 0; index < SONY_DISEQC_MESSAGE_LENGTH; index++){
pMessage->data[index] = 0;
}
pMessage->data[0] = (uint8_t)framing;
pMessage->data[1] = (uint8_t)address;
pMessage->data[2] = 0x6B;
pMessage->data[3] = posNumber;
pMessage->length = 4;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
sony_result_t sony_diseqc_command_SetPosns (sony_diseqc_message_t * pMessage,
sony_diseqc_framing_t framing,
sony_diseqc_address_t address,
uint8_t * pData,
uint8_t length)
{
int32_t index = 0;
SONY_TRACE_ENTER ("sony_diseqc_command_SetPosns");
if ((!pMessage) || (!pData)){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
for(index = 0; index < SONY_DISEQC_MESSAGE_LENGTH; index++){
pMessage->data[index] = 0;
}
pMessage->data[0] = (uint8_t)framing;
pMessage->data[1] = (uint8_t)address;
pMessage->data[2] = 0x6F;
if (length == 1){
pMessage->data[3] = *pData;
pMessage->length = 4;
} else if (length == 3){
pMessage->data[3] = *(pData);
pMessage->data[4] = *(pData + 1);
pMessage->data[5] = *(pData + 2);
pMessage->length = 6;
} else {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
/*------------------------------------------------------------------------------
Static Functions
------------------------------------------------------------------------------*/
static sony_result_t generateDriveXData(sony_diseqc_motor_mode_t mode,
uint8_t amount,
uint8_t * pData)
{
SONY_TRACE_ENTER ("generateDriveXData");
if (!pData) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
switch(mode)
{
case SONY_DISEQC_MOTOR_MODE_STEPPED:
if((amount > 128) || (amount == 0)){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_RANGE);
} else {
*pData = (uint8_t)((0xFF - amount) + 1);
}
break;
case SONY_DISEQC_MOTOR_MODE_TIMED:
if((amount > 127) || (amount == 0)){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_RANGE);
} else {
*pData = amount;
}
break;
case SONY_DISEQC_MOTOR_MODE_NONSTOP:
/* amount value is ignored. */
*pData = 0;
break;
default:
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
@@ -0,0 +1,196 @@
/*------------------------------------------------------------------------------
Copyright 2016-2018 Sony Semiconductor Solutions Corporation
Last Updated : 2018/12/13
Modification ID : e402a4dcb0e51a00c34b174334c082c1211eebf1
------------------------------------------------------------------------------*/
/**
@file sony_diseqc_command_1_2.h
This file provides functions for generating "DiSEqC1.2" commands.
*/
/*----------------------------------------------------------------------------*/
#ifndef SONY_DISEQC_COMMAND_1_2_H
#define SONY_DISEQC_COMMAND_1_2_H
#include "sony_common.h"
#include "sony_diseqc_command.h"
/**
@brief Mode for motor control command.
This is used by sony_diseqc_command_DriveEast() and sony_diseqc_command_DriveWest().
*/
typedef enum {
SONY_DISEQC_MOTOR_MODE_STEPPED, /**< amount is "step size". */
SONY_DISEQC_MOTOR_MODE_TIMED, /**< amount is "timeout time" in ms. */
SONY_DISEQC_MOTOR_MODE_NONSTOP /**< amount is ignored. */
} sony_diseqc_motor_mode_t;
/*------------------------------------------------------------------------------
Functions
------------------------------------------------------------------------------*/
/**
@brief Create DiSEqC command to write Analogue value A0 (e.g. Skew).
@param pMessage The message instance.
@param framing Framing byte.
@param address Address byte.
@param data Data to send.
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_diseqc_command_WriteA0 (sony_diseqc_message_t * pMessage,
sony_diseqc_framing_t framing,
sony_diseqc_address_t address,
uint8_t data);
/**
@brief Create DiSEqC command to write Analogue value A1.
@param pMessage The message instance.
@param framing Framing byte.
@param address Address byte.
@param data Data to send.
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_diseqc_command_WriteA1 (sony_diseqc_message_t * pMessage,
sony_diseqc_framing_t framing,
sony_diseqc_address_t address,
uint8_t data);
/**
@brief Create DiSEqC command to stop Positioner movement.
@param pMessage The message instance.
@param framing Framing byte.
@param address Address byte.
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_diseqc_command_Halt (sony_diseqc_message_t * pMessage,
sony_diseqc_framing_t framing,
sony_diseqc_address_t address);
/**
@brief Create DiSEqC command to disable Limits.
@param pMessage The message instance.
@param framing Framing byte.
@param address Address byte.
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_diseqc_command_LimitsOff (sony_diseqc_message_t * pMessage,
sony_diseqc_framing_t framing,
sony_diseqc_address_t address);
/**
@brief Create DiSEqC command to set East Limit (& Enable recommended).
@param pMessage The message instance.
@param framing Framing byte.
@param address Address byte.
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_diseqc_command_LimitE (sony_diseqc_message_t * pMessage,
sony_diseqc_framing_t framing,
sony_diseqc_address_t address);
/**
@brief Create DiSEqC command to set West Limit (& Enable recommended).
@param pMessage The message instance.
@param framing Framing byte.
@param address Address byte.
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_diseqc_command_LimitW (sony_diseqc_message_t * pMessage,
sony_diseqc_framing_t framing,
sony_diseqc_address_t address);
/**
@brief Create DiSEqC command to drive Motor East (with optional timeout/steps).
@param pMessage The message instance.
@param framing Framing byte.
@param address Address byte.
@param mode Motor mode.
@param amount The amount of motor moving.
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_diseqc_command_DriveEast (sony_diseqc_message_t * pMessage,
sony_diseqc_framing_t framing,
sony_diseqc_address_t address,
sony_diseqc_motor_mode_t mode,
uint8_t amount);
/**
@brief Create DiSEqC command to drive Motor West (with optional timeout/steps).
@param pMessage The message instance.
@param framing Framing byte.
@param address Address byte.
@param mode Motor mode.
@param amount The amount of motor moving.
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_diseqc_command_DriveWest (sony_diseqc_message_t * pMessage,
sony_diseqc_framing_t framing,
sony_diseqc_address_t address,
sony_diseqc_motor_mode_t mode,
uint8_t amount);
/**
@brief Create DiSEqC command to store Satellite Position & Enable Limits.
@param pMessage The message instance.
@param framing Framing byte.
@param address Address byte.
@param posNumber Position number.
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_diseqc_command_Storenn (sony_diseqc_message_t * pMessage,
sony_diseqc_framing_t framing,
sony_diseqc_address_t address,
uint8_t posNumber);
/**
@brief Create DiSEqC command to drive Motor to Satellite Position nn.
@param pMessage The message instance.
@param framing Framing byte.
@param address Address byte.
@param posNumber Position number.
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_diseqc_command_Gotonn (sony_diseqc_message_t * pMessage,
sony_diseqc_framing_t framing,
sony_diseqc_address_t address,
uint8_t posNumber);
/**
@brief Create DiSEqC command to (re-) calculate Satellite Positions.
@param pMessage The message instance.
@param framing Framing byte.
@param address Address byte.
@param pData Address of the data buffer.
@param length Length of the data buffer.
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_diseqc_command_SetPosns (sony_diseqc_message_t * pMessage,
sony_diseqc_framing_t framing,
sony_diseqc_address_t address,
uint8_t * pData,
uint8_t length);
#endif /* SONY_DISEQC_COMMAND_1_2_H */
@@ -0,0 +1,405 @@
/*------------------------------------------------------------------------------
Copyright 2016-2018 Sony Semiconductor Solutions Corporation
Last Updated : 2018/12/13
Modification ID : e402a4dcb0e51a00c34b174334c082c1211eebf1
------------------------------------------------------------------------------*/
#include "sony_diseqc_command_2_0.h"
/*------------------------------------------------------------------------------
Functions
------------------------------------------------------------------------------*/
sony_result_t sony_diseqc_command_ClrReset (sony_diseqc_message_t * pMessage,
sony_diseqc_framing_t framing,
sony_diseqc_address_t address)
{
int32_t index = 0;
SONY_TRACE_ENTER ("sony_diseqc_command_ClrReset");
if (!pMessage){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
for(index = 0; index < SONY_DISEQC_MESSAGE_LENGTH; index++){
pMessage->data[index] = 0;
}
pMessage->data[0] = (uint8_t)framing;
pMessage->data[1] = (uint8_t)address;
pMessage->data[2] = 0x01;
pMessage->length = 3;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
sony_result_t sony_diseqc_command_SetContend (sony_diseqc_message_t * pMessage,
sony_diseqc_framing_t framing,
sony_diseqc_address_t address)
{
int32_t index = 0;
SONY_TRACE_ENTER ("sony_diseqc_command_SetContend");
if (!pMessage){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
for(index = 0; index < SONY_DISEQC_MESSAGE_LENGTH; index++){
pMessage->data[index] = 0;
}
pMessage->data[0] = (uint8_t)framing;
pMessage->data[1] = (uint8_t)address;
pMessage->data[2] = 0x04;
pMessage->length = 3;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
sony_result_t sony_diseqc_command_Contend (sony_diseqc_message_t * pMessage,
sony_diseqc_framing_t framing,
sony_diseqc_address_t address)
{
int32_t index = 0;
SONY_TRACE_ENTER ("sony_diseqc_command_Contend");
if (!pMessage){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
for(index = 0; index < SONY_DISEQC_MESSAGE_LENGTH; index++){
pMessage->data[index] = 0;
}
pMessage->data[0] = (uint8_t)framing;
pMessage->data[1] = (uint8_t)address;
pMessage->data[2] = 0x05;
pMessage->length = 3;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
sony_result_t sony_diseqc_command_ClrContend (sony_diseqc_message_t * pMessage,
sony_diseqc_framing_t framing,
sony_diseqc_address_t address)
{
int32_t index = 0;
SONY_TRACE_ENTER ("sony_diseqc_command_ClrContend");
if (!pMessage){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
for(index = 0; index < SONY_DISEQC_MESSAGE_LENGTH; index++){
pMessage->data[index] = 0;
}
pMessage->data[0] = (uint8_t)framing;
pMessage->data[1] = (uint8_t)address;
pMessage->data[2] = 0x06;
pMessage->length = 3;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
sony_result_t sony_diseqc_command_Address (sony_diseqc_message_t * pMessage,
sony_diseqc_framing_t framing,
sony_diseqc_address_t address)
{
int32_t index = 0;
SONY_TRACE_ENTER ("sony_diseqc_command_Address");
if (!pMessage){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
for(index = 0; index < SONY_DISEQC_MESSAGE_LENGTH; index++){
pMessage->data[index] = 0;
}
pMessage->data[0] = (uint8_t)framing;
pMessage->data[1] = (uint8_t)address;
pMessage->data[2] = 0x07;
pMessage->length = 3;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
sony_result_t sony_diseqc_command_MoveC (sony_diseqc_message_t * pMessage,
sony_diseqc_framing_t framing,
sony_diseqc_address_t address,
uint8_t data)
{
int32_t index = 0;
SONY_TRACE_ENTER ("sony_diseqc_command_MoveC");
if (!pMessage){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
for(index = 0; index < SONY_DISEQC_MESSAGE_LENGTH; index++){
pMessage->data[index] = 0;
}
pMessage->data[0] = (uint8_t)framing;
pMessage->data[1] = (uint8_t)address;
pMessage->data[2] = 0x08;
pMessage->data[3] = data;
pMessage->length = 4;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
sony_result_t sony_diseqc_command_Move (sony_diseqc_message_t * pMessage,
sony_diseqc_framing_t framing,
sony_diseqc_address_t address,
uint8_t data)
{
int32_t index = 0;
SONY_TRACE_ENTER ("sony_diseqc_command_Move");
if (!pMessage){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
for(index = 0; index < SONY_DISEQC_MESSAGE_LENGTH; index++){
pMessage->data[index] = 0;
}
pMessage->data[0] = (uint8_t)framing;
pMessage->data[1] = (uint8_t)address;
pMessage->data[2] = 0x09;
pMessage->data[3] = data;
pMessage->length = 4;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
sony_result_t sony_diseqc_command_Status (sony_diseqc_message_t * pMessage,
sony_diseqc_framing_t framing,
sony_diseqc_address_t address)
{
int32_t index = 0;
SONY_TRACE_ENTER ("sony_diseqc_command_Status");
if (!pMessage){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
for(index = 0; index < SONY_DISEQC_MESSAGE_LENGTH; index++){
pMessage->data[index] = 0;
}
pMessage->data[0] = (uint8_t)framing;
pMessage->data[1] = (uint8_t)address;
pMessage->data[2] = 0x10;
pMessage->length = 3;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
sony_result_t sony_diseqc_command_Config (sony_diseqc_message_t * pMessage,
sony_diseqc_framing_t framing,
sony_diseqc_address_t address)
{
int32_t index = 0;
SONY_TRACE_ENTER ("sony_diseqc_command_Config");
if (!pMessage){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
for(index = 0; index < SONY_DISEQC_MESSAGE_LENGTH; index++){
pMessage->data[index] = 0;
}
pMessage->data[0] = (uint8_t)framing;
pMessage->data[1] = (uint8_t)address;
pMessage->data[2] = 0x11;
pMessage->length = 3;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
sony_result_t sony_diseqc_command_Switch0 (sony_diseqc_message_t * pMessage,
sony_diseqc_framing_t framing,
sony_diseqc_address_t address)
{
int32_t index = 0;
SONY_TRACE_ENTER ("sony_diseqc_command_Switch0");
if (!pMessage){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
for(index = 0; index < SONY_DISEQC_MESSAGE_LENGTH; index++){
pMessage->data[index] = 0;
}
pMessage->data[0] = (uint8_t)framing;
pMessage->data[1] = (uint8_t)address;
pMessage->data[2] = 0x14;
pMessage->length = 3;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
sony_result_t sony_diseqc_command_Switch1 (sony_diseqc_message_t * pMessage,
sony_diseqc_framing_t framing,
sony_diseqc_address_t address)
{
int32_t index = 0;
SONY_TRACE_ENTER ("sony_diseqc_command_Switch1");
if (!pMessage){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
for(index = 0; index < SONY_DISEQC_MESSAGE_LENGTH; index++){
pMessage->data[index] = 0;
}
pMessage->data[0] = (uint8_t)framing;
pMessage->data[1] = (uint8_t)address;
pMessage->data[2] = 0x15;
pMessage->length = 3;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
sony_result_t sony_diseqc_command_ReadA0 (sony_diseqc_message_t * pMessage,
sony_diseqc_framing_t framing,
sony_diseqc_address_t address)
{
int32_t index = 0;
SONY_TRACE_ENTER ("sony_diseqc_command_ReadA0");
if (!pMessage){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
for(index = 0; index < SONY_DISEQC_MESSAGE_LENGTH; index++){
pMessage->data[index] = 0;
}
pMessage->data[0] = (uint8_t)framing;
pMessage->data[1] = (uint8_t)address;
pMessage->data[2] = 0x40;
pMessage->length = 3;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
sony_result_t sony_diseqc_command_ReadA1 (sony_diseqc_message_t * pMessage,
sony_diseqc_framing_t framing,
sony_diseqc_address_t address)
{
int32_t index = 0;
SONY_TRACE_ENTER ("sony_diseqc_command_ReadA1");
if (!pMessage){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
for(index = 0; index < SONY_DISEQC_MESSAGE_LENGTH; index++){
pMessage->data[index] = 0;
}
pMessage->data[0] = (uint8_t)framing;
pMessage->data[1] = (uint8_t)address;
pMessage->data[2] = 0x41;
pMessage->length = 3;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
sony_result_t sony_diseqc_command_LOstring (sony_diseqc_message_t * pMessage,
sony_diseqc_framing_t framing,
sony_diseqc_address_t address)
{
int32_t index = 0;
SONY_TRACE_ENTER ("sony_diseqc_command_LOstring");
if (!pMessage){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
for(index = 0; index < SONY_DISEQC_MESSAGE_LENGTH; index++){
pMessage->data[index] = 0;
}
pMessage->data[0] = (uint8_t)framing;
pMessage->data[1] = (uint8_t)address;
pMessage->data[2] = 0x50;
pMessage->length = 3;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
sony_result_t sony_diseqc_command_LOnow (sony_diseqc_message_t * pMessage,
sony_diseqc_framing_t framing,
sony_diseqc_address_t address)
{
int32_t index = 0;
SONY_TRACE_ENTER ("sony_diseqc_command_LOnow");
if (!pMessage){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
for(index = 0; index < SONY_DISEQC_MESSAGE_LENGTH; index++){
pMessage->data[index] = 0;
}
pMessage->data[0] = (uint8_t)framing;
pMessage->data[1] = (uint8_t)address;
pMessage->data[2] = 0x51;
pMessage->length = 3;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
sony_result_t sony_diseqc_command_LOLo (sony_diseqc_message_t * pMessage,
sony_diseqc_framing_t framing,
sony_diseqc_address_t address)
{
int32_t index = 0;
SONY_TRACE_ENTER ("sony_diseqc_command_LOLo");
if (!pMessage){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
for(index = 0; index < SONY_DISEQC_MESSAGE_LENGTH; index++){
pMessage->data[index] = 0;
}
pMessage->data[0] = (uint8_t)framing;
pMessage->data[1] = (uint8_t)address;
pMessage->data[2] = 0x52;
pMessage->length = 3;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
sony_result_t sony_diseqc_command_LOHi (sony_diseqc_message_t * pMessage,
sony_diseqc_framing_t framing,
sony_diseqc_address_t address)
{
int32_t index = 0;
SONY_TRACE_ENTER ("sony_diseqc_command_LOHi");
if (!pMessage){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
for(index = 0; index < SONY_DISEQC_MESSAGE_LENGTH; index++){
pMessage->data[index] = 0;
}
pMessage->data[0] = (uint8_t)framing;
pMessage->data[1] = (uint8_t)address;
pMessage->data[2] = 0x53;
pMessage->length = 3;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
@@ -0,0 +1,247 @@
/*------------------------------------------------------------------------------
Copyright 2016-2018 Sony Semiconductor Solutions Corporation
Last Updated : 2018/12/13
Modification ID : e402a4dcb0e51a00c34b174334c082c1211eebf1
------------------------------------------------------------------------------*/
/**
@file sony_diseqc_command_2_0.h
This file provides functions for generating "DiSEqC2.0" commands.
*/
/*----------------------------------------------------------------------------*/
#ifndef SONY_DISEQC_COMMAND_2_0_H
#define SONY_DISEQC_COMMAND_2_0_H
#include "sony_common.h"
#include "sony_diseqc_command.h"
/*------------------------------------------------------------------------------
Functions
------------------------------------------------------------------------------*/
/**
@brief Create DiSEqC command to clear the "Reset" flag.
@param pMessage The message instance.
@param framing Framing byte.
@param address Address byte.
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_diseqc_command_ClrReset (sony_diseqc_message_t * pMessage,
sony_diseqc_framing_t framing,
sony_diseqc_address_t address);
/**
@brief Create DiSEqC command to set Contention flag.
@param pMessage The message instance.
@param framing Framing byte.
@param address Address byte.
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_diseqc_command_SetContend (sony_diseqc_message_t * pMessage,
sony_diseqc_framing_t framing,
sony_diseqc_address_t address);
/**
@brief Create DiSEqC command to return address only if Contention flag is set.
@param pMessage The message instance.
@param framing Framing byte.
@param address Address byte.
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_diseqc_command_Contend (sony_diseqc_message_t * pMessage,
sony_diseqc_framing_t framing,
sony_diseqc_address_t address);
/**
@brief Create DiSEqC command to clear Contention flag.
@param pMessage The message instance.
@param framing Framing byte.
@param address Address byte.
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_diseqc_command_ClrContend (sony_diseqc_message_t * pMessage,
sony_diseqc_framing_t framing,
sony_diseqc_address_t address);
/**
@brief Create DiSEqC command to return address unless Contention flag is set.
@param pMessage The message instance.
@param framing Framing byte.
@param address Address byte.
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_diseqc_command_Address (sony_diseqc_message_t * pMessage,
sony_diseqc_framing_t framing,
sony_diseqc_address_t address);
/**
@brief Create DiSEqC command to change address only if Contention flag is set.
@param pMessage The message instance.
@param framing Framing byte.
@param address Address byte.
@param data Data to send.
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_diseqc_command_MoveC (sony_diseqc_message_t * pMessage,
sony_diseqc_framing_t framing,
sony_diseqc_address_t address,
uint8_t data);
/**
@brief Create DiSEqC command to change address unless Contention flag is set.
@param pMessage The message instance.
@param framing Framing byte.
@param address Address byte.
@param data Data to send.
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_diseqc_command_Move (sony_diseqc_message_t * pMessage,
sony_diseqc_framing_t framing,
sony_diseqc_address_t address,
uint8_t data);
/**
@brief Create DiSEqC command to read Status register flags.
@param pMessage The message instance.
@param framing Framing byte.
@param address Address byte.
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_diseqc_command_Status (sony_diseqc_message_t * pMessage,
sony_diseqc_framing_t framing,
sony_diseqc_address_t address);
/**
@brief Create DiSEqC command to read Configuration flags (peripheral hardware).
@param pMessage The message instance.
@param framing Framing byte.
@param address Address byte.
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_diseqc_command_Config (sony_diseqc_message_t * pMessage,
sony_diseqc_framing_t framing,
sony_diseqc_address_t address);
/**
@brief Create DiSEqC command to read Switching state flags (Committed port).
@param pMessage The message instance.
@param framing Framing byte.
@param address Address byte.
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_diseqc_command_Switch0 (sony_diseqc_message_t * pMessage,
sony_diseqc_framing_t framing,
sony_diseqc_address_t address);
/**
@brief Create DiSEqC command to read Switching state flags (Uncommitted port).
@param pMessage The message instance.
@param framing Framing byte.
@param address Address byte.
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_diseqc_command_Switch1 (sony_diseqc_message_t * pMessage,
sony_diseqc_framing_t framing,
sony_diseqc_address_t address);
/**
@brief Create DiSEqC command to read Analogue value A0.
@param pMessage The message instance.
@param framing Framing byte.
@param address Address byte.
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_diseqc_command_ReadA0 (sony_diseqc_message_t * pMessage,
sony_diseqc_framing_t framing,
sony_diseqc_address_t address);
/**
@brief Create DiSEqC command to read Analogue value A1.
@param pMessage The message instance.
@param framing Framing byte.
@param address Address byte.
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_diseqc_command_ReadA1 (sony_diseqc_message_t * pMessage,
sony_diseqc_framing_t framing,
sony_diseqc_address_t address);
/**
@brief Create DiSEqC command to read current frequency [Reply = BCD string].
@param pMessage The message instance.
@param framing Framing byte.
@param address Address byte.
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_diseqc_command_LOstring (sony_diseqc_message_t * pMessage,
sony_diseqc_framing_t framing,
sony_diseqc_address_t address);
/**
@brief Create DiSEqC command to read current frequency table entry number.
@param pMessage The message instance.
@param framing Framing byte.
@param address Address byte.
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_diseqc_command_LOnow (sony_diseqc_message_t * pMessage,
sony_diseqc_framing_t framing,
sony_diseqc_address_t address);
/**
@brief Create DiSEqC command to read Lo frequency table entry number.
@param pMessage The message instance.
@param framing Framing byte.
@param address Address byte.
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_diseqc_command_LOLo (sony_diseqc_message_t * pMessage,
sony_diseqc_framing_t framing,
sony_diseqc_address_t address);
/**
@brief Create DiSEqC command to read Hi frequency table entry number.
@param pMessage The message instance.
@param framing Framing byte.
@param address Address byte.
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_diseqc_command_LOHi (sony_diseqc_message_t * pMessage,
sony_diseqc_framing_t framing,
sony_diseqc_address_t address);
#endif /* SONY_DISEQC_COMMAND_2_0_H */
@@ -0,0 +1,33 @@
/*------------------------------------------------------------------------------
Copyright 2016-2018 Sony Semiconductor Solutions Corporation
Last Updated : 2018/12/13
Modification ID : e402a4dcb0e51a00c34b174334c082c1211eebf1
------------------------------------------------------------------------------*/
#include "sony_diseqc_command_2_2.h"
/*------------------------------------------------------------------------------
Functions
------------------------------------------------------------------------------*/
sony_result_t sony_diseqc_command_PosStat (sony_diseqc_message_t * pMessage,
sony_diseqc_framing_t framing,
sony_diseqc_address_t address)
{
int32_t index = 0;
SONY_TRACE_ENTER ("sony_diseqc_command_PosStat");
if (!pMessage){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
for(index = 0; index < SONY_DISEQC_MESSAGE_LENGTH; index++){
pMessage->data[index] = 0;
}
pMessage->data[0] = (uint8_t)framing;
pMessage->data[1] = (uint8_t)address;
pMessage->data[2] = 0x64;
pMessage->length = 3;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
@@ -0,0 +1,35 @@
/*------------------------------------------------------------------------------
Copyright 2016-2018 Sony Semiconductor Solutions Corporation
Last Updated : 2018/12/13
Modification ID : e402a4dcb0e51a00c34b174334c082c1211eebf1
------------------------------------------------------------------------------*/
/**
@file sony_diseqc_command_2_2.h
This file provides functions for generating "DiSEqC2.2" commands.
*/
/*----------------------------------------------------------------------------*/
#ifndef SONY_DISEQC_COMMAND_2_2_H
#define SONY_DISEQC_COMMAND_2_2_H
#include "sony_common.h"
#include "sony_diseqc_command.h"
/*------------------------------------------------------------------------------
Functions
------------------------------------------------------------------------------*/
/**
@brief Create DiSEqC command to read Positioner Status Register.
@param pMessage The message instance.
@param framing Framing byte.
@param address Address byte.
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_diseqc_command_PosStat (sony_diseqc_message_t * pMessage,
sony_diseqc_framing_t framing,
sony_diseqc_address_t address);
#endif /* SONY_DISEQC_COMMAND_2_2_H */
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,449 @@
/*------------------------------------------------------------------------------
Copyright 2016-2018 Sony Semiconductor Solutions Corporation
Last Updated : 2018/12/13
Modification ID : e402a4dcb0e51a00c34b174334c082c1211eebf1
------------------------------------------------------------------------------*/
/**
@file sony_integ_sat_device_ctrl.h
This file provide functions which control satellite device.
*/
/*----------------------------------------------------------------------------*/
#ifndef SONY_INTEG_SAT_DEVICE_CTRL_H
#define SONY_INTEG_SAT_DEVICE_CTRL_H
#include "../sony_integ.h"
#include "sony_demod_sat_device_ctrl.h"
#include "sony_singlecable_command.h"
#include "sony_singlecable2_command.h"
/**
@brief LNB controller wakeup time in ms.
The time that LNB controller wake up.
In common, LNB controller needs time to output stable voltage after waking up.
In addition, connected DiSEqC / Single Cable switches may need additional time to start up.
The user can change it depends on LNB controller and other situation.
*/
#define SONY_INTEG_SAT_DEVICE_CTRL_LNBC_WAKEUP_TIME_MS 500
/**
@brief Device voltage change time in ms.
The time between "return from sony_lnbc_t::SetVoltage()" and completing voltage change.
This value depends on the LNB controller device, circuit, etc.
Please confirm with your implementation/environment and change it accordingly.
*/
#define SONY_INTEG_SAT_DEVICE_CTRL_DEVICE_VOLTAGE_CHANGE_TIME 15
/**
@brief Pre transmission wait time defined in DiSEqC1 standard.
For one shot DiSEqC transmissions, the required wait time is >15ms, whilst for repeated messages the required wait time is >25ms.
This timing definition is used for both transmission modes so the greater of the two times has been used.
Please refer to "DiSEqC Update and Recommendations for Implementation Version 2.1" Figure 3 for more information.
There is no need to modify this value.
*/
#define SONY_INTEG_SAT_DEVICE_CTRL_DISEQC1_SPEC_PRE_TX_WAIT 26
/**
@brief Pre transmission wait time defined in DiSEqC2 standard.
This value is selected as the same value as pre transmission wait time defined in DiSEqC1 standard,
because there is no clear timing description about DiSEqC2 in DiSEqC standard documents.
There is no need to modify this value.
*/
#define SONY_INTEG_SAT_DEVICE_CTRL_DISEQC2_SPEC_PRE_TX_WAIT 26
/**
@brief HW setting for wait time between each event(DiSEqC command, tone burst and continuous tone) in ms for DiSEqC1 sequence.
If SONY_INTEG_SAT_DEVICE_CTRL_DEVICE_VOLTAGE_CHANGE_TIME is set correctly,
then there is no need to modify this value.
*/
#define SONY_INTEG_SAT_DEVICE_CTRL_DISEQC1_TXIDLE_MS (SONY_INTEG_SAT_DEVICE_CTRL_DISEQC1_SPEC_PRE_TX_WAIT + SONY_INTEG_SAT_DEVICE_CTRL_DEVICE_VOLTAGE_CHANGE_TIME)
/**
@brief HW setting for wait time between each event(DiSEqC command, tone burst and continuous tone) in ms for DiSEqC2 sequence.
If SONY_INTEG_SAT_DEVICE_CTRL_DEVICE_VOLTAGE_CHANGE_TIME is set correctly,
then there is no need to modify this value.
*/
#define SONY_INTEG_SAT_DEVICE_CTRL_DISEQC2_TXIDLE_MS (SONY_INTEG_SAT_DEVICE_CTRL_DISEQC2_SPEC_PRE_TX_WAIT + SONY_INTEG_SAT_DEVICE_CTRL_DEVICE_VOLTAGE_CHANGE_TIME)
/**
@brief HW setting for wait time between finish to receive reply message and start continuous tone.
There is no need to modify this value.
*/
#define SONY_INTEG_SAT_DEVICE_CTRL_DISEQC2_RXIDLE_MS 5
/**
@brief HW setting for wait time between finish to receive reply message and start continuous tone.
There is no need to modify this value.
*/
#define SONY_INTEG_SAT_DEVICE_CTRL_SINGLECABLE_RXIDLE_MS 5
/**
@brief HW setting for wait time between each event(Voltage change and Single cable command) in ms for Single cable sequence.
This value(X) should be "4 < X < 22" from Singlecable standard EN50494.
And it should be "X > SONY_INTEG_SAT_DEVICE_CTRL_DEVICE_VOLTAGE_CHANGE_TIME".
*/
#define SONY_INTEG_SAT_DEVICE_CTRL_SINGLECABLE_TXIDLE_MS ((SONY_INTEG_SAT_DEVICE_CTRL_DEVICE_VOLTAGE_CHANGE_TIME < 5) ? 5 : SONY_INTEG_SAT_DEVICE_CTRL_DEVICE_VOLTAGE_CHANGE_TIME)
#if SONY_INTEG_SAT_DEVICE_CTRL_DEVICE_VOLTAGE_CHANGE_TIME >= 22
#error "SONY_INTEG_SAT_DEVICE_CTRL_DEVICE_VOLTAGE_CHANGE_TIME exceeds single cable standard timing requirement."
#endif /* SONY_INTEG_SAT_DEVICE_CTRL_DEVICE_VOLTAGE_CHANGE_TIME >= 22 */
/**
@brief HW setting for wait time between repeated DiSEqC1 messages (Repeat To Repeat Time) in ms.
This value specifies time between the end of the first message and the start of the repeated message.
There is no need to modify this value.
*/
#define SONY_INTEG_SAT_DEVICE_CTRL_DISEQC1_R2R_TIME_MS 400
/**
@brief HW setting for wait time between repeated Single cable messages (Repeat To Repeat Time) in ms.
This value specifies time between the end of the first message and the top of the repeated message.
There is no need to modify this value.
*/
#define SONY_INTEG_SAT_DEVICE_CTRL_SINGLECABLE_R2R_TIME_MS 0
/**
@brief HW setting for DiSEqC2 reply wait time out(RTO) in ms.
There is no need to modify this value.
*/
#define SONY_INTEG_SAT_DEVICE_CTRL_DISEQC2_RTO_TIME_MS 400
/**
@brief HW setting for Singlecable2 reply wait time out(RTO) in ms.
There is no need to modify this value.
*/
#define SONY_INTEG_SAT_DEVICE_CTRL_SINGLECABLE2REPLY_RTO_TIME_MS 100
/**
@brief Polling interval for sony_integ_sat_device_ctrl_TransmitToneBurst() in ms.
*/
#define SONY_INTEG_DISEQC_TB_POL 100
/**
@brief Polling interval for sony_integ_sat_device_ctrl_TransmitDiseqcCommand()
and sony_integ_sat_device_ctrl_TransmitDiseqcCommandWithReply() in ms.
*/
#define SONY_INTEG_DISEQC_DISEQC_TRANSMIT_POL 10
/**
@brief Polling interval for sony_integ_sat_device_ctrl_TransmitSinglecableCommand() in ms.
*/
#define SONY_INTEG_DISEQC_SINGLECABLE_TRANSMIT_POL 10
/**
@brief Version of single cable standard
*/
typedef enum {
SONY_SINGLECABLE_VERSION_1_EN50494, /**< Single cable 1 (EN50494) */
SONY_SINGLECABLE_VERSION_2_EN50607, /**< Single cable 2 (EN50607) */
SONY_SINGLECABLE_VERSION_UNKNOWN
} sony_singlecable_version_t;
/**
@brief Parameters for tuning in single cable environment.
*/
typedef struct {
sony_integ_t * pInteg; /**< Integ part. */
sony_tuner_t * pTunerReal; /**< Tuner instance. */
sony_singlecable_version_t version; /**< Single cable version. */
sony_singlecable_address_t address; /**< Address byte. */
sony_singlecable_bank_t bank; /**< Signal bank. */
uint8_t ubSlot; /**< UB slot number. (1-8) */
uint32_t ubSlotFreqKHz; /**< UB slot center frequency in KHz. */
uint8_t enableMDUMode; /**< MDU mode enable/disable. */
uint8_t PINCode; /**< PIN Code for MDU commands. */
uint8_t scd2_ubSlot; /**< UB slot number. (1-32) (for SCD2) */
uint32_t scd2_ubSlotFreqMHz; /**< UB slot center frequency in *MHz*. (for SCD2) */
uint8_t scd2_uncommittedSwitches; /**< Uncommitted switches setting. (for SCD2) */
uint8_t scd2_committedSwitches; /**< Committed switches setting. (for SCD2) */
uint8_t scd2_enableMDUMode; /**< MDU mode enable/disable. (for SCD2) */
uint8_t scd2_PINCode; /**< PIN Code for MDU commands. (for SCD2) */
/**
* Pointer to the function which sends the DiSEqC message by the other demodulator.
* If this is null, this demodulator will send the DiSEqC message for the single cable control.
* This will be used for the case when there is only one LNB controller shared between multiple tuners.
*/
sony_result_t (*pTransmitByOtherDemod)(sony_diseqc_message_t * pMessage);
} sony_integ_singlecable_tuner_data_t;
/**
@brief The data for single cable sequence.
*/
typedef struct {
sony_tuner_t tunerSinglecable; /**< Tuner instance for single cable. */
sony_integ_singlecable_tuner_data_t tunerSinglecableData; /**< Single cable tuner data. */
} sony_integ_singlecable_data_t;
/*------------------------------------------------------------------------------
Functions
------------------------------------------------------------------------------*/
/**
@brief Enable/disable satellite device control function.
@note LNB controller will be set to Active/Sleep state.
Note that satellite device control functions like ::sony_integ_sat_device_ctrl_SetVoltageTone
automatically enable satellite device control function.
@param pInteg The integration part instance.
@param enable Enable/disable setting.
- 0: Disable
- 1: Enable
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_integ_sat_device_ctrl_Enable (sony_integ_t * pInteg, uint8_t enable);
/**
@brief Change voltage and tone.
@note LNB controller and satellite device control function will be automatically enabled.
@param pInteg The integration part instance which already created.
@param isVoltageHigh Voltage.
- 0: Low voltage.
- 1: High voltage.
@param isContinuousToneOn Continuous tone state.
- 0: Don't output continuous tone.
- 1: Output continuous tone.
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_integ_sat_device_ctrl_SetVoltageTone (sony_integ_t * pInteg,
uint8_t isVoltageHigh,
uint8_t isContinuousToneOn);
/**
@brief Transmit a tone burst.
@note LNB controller and satellite device control function will be automatically enabled.
This API does following flow.
- Stop continuous tone.
- Change voltage.
- Output tone burst.
- Output continuous tone if required.
@param pInteg The integration part instance which already created.
@param isVoltageHigh Voltage.
- 0: Low voltage.
- 1: High voltage.
@param toneBurstMode Tone burst mode.
@param isContinuousToneOn Continuout tone value.
- 0: Don't output continuous tone.
- 1: Output continuous tone.
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_integ_sat_device_ctrl_TransmitToneBurst (sony_integ_t * pInteg,
uint8_t isVoltageHigh,
sony_toneburst_mode_t toneBurstMode,
uint8_t isContinuousToneOn);
/**
@brief Transmit DiSEqC command.
@note LNB controller and satellite device control function will be automatically enabled.
This API does following flow.
- Stop continuous tone.
- Change voltage.
- Output DiSEqC command1.
- Output DiSEqC command2 if required.
- (Repeat DiSEqC commands if required.)
- Output tone burst.
- Output continuous tone if required.
@param pInteg The integration part instance which already created.
@param isVoltageHigh Voltage.
- 0: Low voltage.
- 1: High voltage.
@param toneBurstMode Tone burst mode.
@param isContinuousToneOn Continuout tone value.
- 0: Don't output continuous tone.
- 1: Output continuous tone.
@param pCommand1 1st DiSEqC command.
@param repeatCount1 Repeat count for 1st DiSEqC command.
@param pCommand2 2nd DiSEqC command.
@param repeatCount2 Repeat count for 2nd DiSEqC command.
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_integ_sat_device_ctrl_TransmitDiseqcCommand (sony_integ_t * pInteg,
uint8_t isVoltageHigh,
sony_toneburst_mode_t toneBurstMode,
uint8_t isContinuousToneOn,
sony_diseqc_message_t * pCommand1,
uint8_t repeatCount1,
sony_diseqc_message_t * pCommand2,
uint8_t repeatCount2);
/**
@brief Transmit DiSEqC command and receive reply from device.
@note LNB controller and satellite device control function will be automatically enabled.
This API does following flow.
- Stop continuous tone.
- Change voltage.
- Output DiSEqC command.
- Receive reply message from slave device.
- Output tone burst.
- Output continuous tone if required.
@param pInteg The integration part instance which already created.
@param isVoltageHigh Voltage.
- 0: Low voltage.
- 1: High voltage.
@param toneBurstMode Tone burst mode.
@param isContinuousToneOn Continuout tone value.
- 0: Don't output continuous tone.
- 1: Output continuous tone.
@param pCommand DiSEqC command.
@param pReply DiSEqC reply from slave device.
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_integ_sat_device_ctrl_TransmitDiseqcCommandWithReply (sony_integ_t * pInteg,
uint8_t isVoltageHigh,
sony_toneburst_mode_t toneBurstMode,
uint8_t isContinuousToneOn,
sony_diseqc_message_t * pCommand,
sony_diseqc_message_t * pReply);
/**
@brief Transmit a single cable command.
@note LNB controller and satellite device control function will be automatically enabled.
@param pInteg The integration part instance which already created.
@param pCommand The single cable command instance.
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_integ_sat_device_ctrl_TransmitSinglecableCommand (sony_integ_t * pInteg,
sony_diseqc_message_t * pCommand);
/**
@brief Transmit a single cable2 command.
@note LNB controller and satellite device control function will be automatically enabled.
@param pInteg The integration part instance which already created.
@param pCommand The single cable command instance.
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_integ_sat_device_ctrl_TransmitSinglecable2Command (sony_integ_t * pInteg,
sony_diseqc_message_t * pCommand);
/**
@brief Transmit a single cable2 command and receive reply from device.
@note LNB controller and satellite device control function will be automatically enabled.
@param pInteg The integration part instance which already created.
@param pCommand The single cable command instance.
@param pReply Reply from slave device.
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_integ_sat_device_ctrl_TransmitSinglecable2CommandWithReply (sony_integ_t * pInteg,
sony_diseqc_message_t * pCommand,
sony_diseqc_message_t * pReply);
/**
@brief Enable Single cable mode.
If the Single cable mode is set, Tune, TuneSRS, BlindScan functions automatically
generate and send single cable commands.
sony_integ_sat_device_ctrl_SetSinglecableTunerParams or sony_integ_sat_device_ctrl_SetSinglecable2TunerParams
should be called before calling Tune, TuneSRS, BlindScan functions.
@param pInteg The integration part instance which already created.
@param pSinglecableData The data for single cable mode.
Note that this instance should be kept allocated while single cable function is enabled.
@param pTransmitByOtherDemod User registered callback is required only when the LNB controller
is controlled by the other demodulator. This allows the user to
transmit the single cable commands to the LNBC through the other
demodulator while taking care of the multi-threaded situations.
Set this parameter to NULL, when the LNB controller is controlled
by the current demodulator.
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_integ_sat_device_ctrl_EnableSinglecable (sony_integ_t * pInteg,
sony_integ_singlecable_data_t * pSinglecableData,
sony_result_t (*pTransmitByOtherDemod)(sony_diseqc_message_t * pMessage));
/**
@brief Disable Single cable mode.
@param pInteg The integration part instance which already created.
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_integ_sat_device_ctrl_DisableSinglecable (sony_integ_t * pInteg);
/**
@brief Change tuning parameters for single cable command.
@param pInteg The integration part instance.
@param address Address byte.
@param bank Signal bank.
@param ubSlot UB slot number. (1-8)
@param ubSlotFreqKHz UB slot center frequency in KHz.
@param enableMDUMode Enable/Disable MDU mode.
- 0: Disable.
- 1: Enable.
@param PINCode The valid Pin Code for MDU commands. This value is ignored when the argument enableMDUMode is 0.
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_integ_sat_device_ctrl_SetSinglecableTunerParams (sony_integ_t * pInteg,
sony_singlecable_address_t address,
sony_singlecable_bank_t bank,
uint8_t ubSlot,
uint32_t ubSlotFreqKHz,
uint8_t enableMDUMode,
uint8_t PINCode);
/**
@brief Change tuning parameters for SingleCable2 command.
@param pInteg The integration part instance.
@param ubSlot UB slot number. (1-32)
@param ubSlotFreqMHz UB slot center frequency in *MHz*.
@param uncommittedSwitches Uncommitted switches setting.
@param committedSwitches Committed switches setting.
@param enableMDUMode Enable/Disable MDU mode.
- 0: Disable.
- 1: Enable.
@param PINCode The valid Pin Code for MDU commands. This value is ignored when the argument enableMDUMode is 0.
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_integ_sat_device_ctrl_SetSinglecable2TunerParams (sony_integ_t * pInteg,
uint8_t ubSlot,
uint32_t ubSlotFreqMHz,
uint8_t uncommittedSwitches,
uint8_t committedSwitches,
uint8_t enableMDUMode,
uint8_t PINCode);
#endif /* SONY_INTEG_SAT_DEVICE_CTRL_H */
@@ -0,0 +1,270 @@
/*------------------------------------------------------------------------------
Copyright 2016 Sony Semiconductor Solutions Corporation
Last Updated : 2016/06/24
Modification ID : 3b74e280b7ad8ce430b6a9419ac53e8f2e3737f9
------------------------------------------------------------------------------*/
#include "sony_common.h"
#include "sony_demod_sat_device_ctrl.h"
#include "sony_singlecable_command.h"
/*------------------------------------------------------------------------------
Static Functions
------------------------------------------------------------------------------*/
static sony_result_t addPINCode (sony_diseqc_message_t * pMessage,
uint8_t pin);
/*------------------------------------------------------------------------------
Functions
------------------------------------------------------------------------------*/
sony_result_t sony_singlecable2_command_ODU_Channel_change (sony_diseqc_message_t * pMessage,
uint8_t userbandId,
uint32_t ifFreqMHz,
uint8_t uncommittedSwitches,
uint8_t committedSwitches)
{
int32_t index = 0;
uint16_t T = 0;
SONY_TRACE_ENTER ("sony_singlecable2_command_ODU_Channel_change");
if (!pMessage){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
if ((userbandId < 1) || (userbandId > 32) || (uncommittedSwitches > 0x0F) || (committedSwitches > 0x0F)) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_RANGE);
}
for(index = 0; index < SONY_DISEQC_MESSAGE_LENGTH; index++){
pMessage->data[index] = 0;
}
if (ifFreqMHz <= 9) {
/* Special value */
T = (uint16_t)ifFreqMHz;
} else {
/* Calculation T */
T = (uint16_t)(ifFreqMHz - 100);
}
if (T > 0x7FF){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_RANGE);
}
pMessage->data[0] = 0x70;
pMessage->data[1] = (uint8_t)(((userbandId - 1) << 3) | ((T >> 8) & 0x07));
pMessage->data[2] = (uint8_t)(T & 0xFF);
pMessage->data[3] = (uint8_t)((uncommittedSwitches << 4) | (committedSwitches));
pMessage->length = 4;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
sony_result_t sony_singlecable2_command_ODU_Channel_change_PIN (sony_diseqc_message_t * pMessage,
uint8_t userbandId,
uint32_t ifFreqMHz,
uint8_t uncommittedSwitches,
uint8_t committedSwitches,
uint8_t pin)
{
sony_result_t result = SONY_RESULT_OK;
SONY_TRACE_ENTER ("sony_singlecable2_command_ODU_Channel_change_PIN");
if (!pMessage){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
if ((userbandId < 1) || (userbandId > 32)) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_RANGE);
}
result = sony_singlecable2_command_ODU_Channel_change (pMessage, userbandId, ifFreqMHz, uncommittedSwitches, committedSwitches);
if (result != SONY_RESULT_OK){
SONY_TRACE_RETURN (result);
}
/* Overwrite command ID */
pMessage->data[0] = 0x71;
result = addPINCode (pMessage, pin);
if (result != SONY_RESULT_OK){
SONY_TRACE_RETURN (result);
}
SONY_TRACE_RETURN (result);
}
sony_result_t sony_singlecable2_command_ODU_PowerOFF (sony_diseqc_message_t * pMessage,
uint8_t userbandId)
{
sony_result_t result = SONY_RESULT_OK;
SONY_TRACE_ENTER ("sony_singlecable2_command_ODU_PowerOFF");
if (!pMessage){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
if ((userbandId < 1) || (userbandId > 32)) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_RANGE);
}
result = sony_singlecable2_command_ODU_Channel_change (pMessage, userbandId, 0, 0, 0);
SONY_TRACE_RETURN (result);
}
sony_result_t sony_singlecable2_command_ODU_PowerOFF_PIN (sony_diseqc_message_t * pMessage,
uint8_t userbandId, uint8_t pin)
{
sony_result_t result = SONY_RESULT_OK;
SONY_TRACE_ENTER ("sony_singlecable2_command_ODU_PowerOFF_PIN");
if (!pMessage){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
if ((userbandId < 1) || (userbandId > 32)) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_RANGE);
}
result = sony_singlecable2_command_ODU_Channel_change_PIN (pMessage, userbandId, 0, 0, 0, pin);
if (result != SONY_RESULT_OK) {
SONY_TRACE_RETURN (result);
}
result = addPINCode (pMessage, pin);
if (result != SONY_RESULT_OK) {
SONY_TRACE_RETURN (result);
}
SONY_TRACE_RETURN (result);
}
sony_result_t sony_singlecable2_command_ODU_UB_avail (sony_diseqc_message_t * pMessage)
{
int32_t index = 0;
SONY_TRACE_ENTER ("sony_singlecable2_command_ODU_UB_avail");
if (!pMessage){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
for(index = 0; index < SONY_DISEQC_MESSAGE_LENGTH; index++){
pMessage->data[index] = 0;
}
pMessage->data[0] = 0x7A;
pMessage->length = 1;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
sony_result_t sony_singlecable2_command_ODU_UB_freq (sony_diseqc_message_t * pMessage,
uint8_t userbandId)
{
int32_t index = 0;
SONY_TRACE_ENTER ("sony_singlecable2_command_ODU_UB_freq");
if (!pMessage){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
if ((userbandId < 1) || (userbandId > 32)) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_RANGE);
}
for(index = 0; index < SONY_DISEQC_MESSAGE_LENGTH; index++){
pMessage->data[index] = 0;
}
pMessage->data[0] = 0x7D;
pMessage->data[1] = (uint8_t)(((userbandId - 1) & 0x1F) << 3);
pMessage->length = 2;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
sony_result_t sony_singlecable2_command_ODU_UB_inuse (sony_diseqc_message_t * pMessage)
{
int32_t index = 0;
SONY_TRACE_ENTER ("sony_singlecable2_command_ODU_UB_inuse");
if (!pMessage){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
for(index = 0; index < SONY_DISEQC_MESSAGE_LENGTH; index++){
pMessage->data[index] = 0;
}
pMessage->data[0] = 0x7C;
pMessage->length = 1;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
sony_result_t sony_singlecable2_command_ODU_UB_PIN (sony_diseqc_message_t * pMessage)
{
int32_t index = 0;
SONY_TRACE_ENTER ("sony_singlecable2_command_ODU_UB_PIN");
if (!pMessage){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
for(index = 0; index < SONY_DISEQC_MESSAGE_LENGTH; index++){
pMessage->data[index] = 0;
}
pMessage->data[0] = 0x7B;
pMessage->length = 1;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
sony_result_t sony_singlecable2_command_ODU_UB_switches (sony_diseqc_message_t * pMessage,
uint8_t userbandId)
{
int32_t index = 0;
SONY_TRACE_ENTER ("sony_singlecable2_command_ODU_UB_switches");
if (!pMessage){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
if ((userbandId < 1) || (userbandId > 32)) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_RANGE);
}
for(index = 0; index < SONY_DISEQC_MESSAGE_LENGTH; index++){
pMessage->data[index] = 0;
}
pMessage->data[0] = 0x7E;
pMessage->data[1] = (uint8_t)(((userbandId - 1) & 0x1F) << 3);
pMessage->length = 2;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
/*------------------------------------------------------------------------------
Static Functions
------------------------------------------------------------------------------*/
static sony_result_t addPINCode (sony_diseqc_message_t * pMessage,
uint8_t pin)
{
sony_result_t result = SONY_RESULT_OK;
SONY_TRACE_ENTER ("addPIN");
if (!pMessage){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
if (pMessage->length < (SONY_DISEQC_MESSAGE_LENGTH - 1)){
pMessage->data[pMessage->length] = pin;
pMessage->length++;
} else {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
SONY_TRACE_RETURN (result);
}
@@ -0,0 +1,142 @@
/*------------------------------------------------------------------------------
Copyright 2016 Sony Semiconductor Solutions Corporation
Last Updated : 2016/06/24
Modification ID : 3b74e280b7ad8ce430b6a9419ac53e8f2e3737f9
------------------------------------------------------------------------------*/
/**
@file sony_singlecable2_command.h
This file provides the function to generate "single cable2 commands".
*/
/*----------------------------------------------------------------------------*/
#ifndef SONY_SINGLECABLE2_COMMAND_H
#define SONY_SINGLECABLE2_COMMAND_H
#include "../sony_common.h"
#include "sony_demod_sat_device_ctrl.h"
/*------------------------------------------------------------------------------
Enumerations
------------------------------------------------------------------------------*/
/*------------------------------------------------------------------------------
Structs
------------------------------------------------------------------------------*/
/*------------------------------------------------------------------------------
Functions
------------------------------------------------------------------------------*/
/**
@brief Create "ODU_Channel_change" command, addressing a Single Outdoor Unit. This is used
to retune a specific user band to a new centre frequency.
@param pMessage The message instance.
@param userbandId Userband-ID (1 - 32)
@param ifFreqMHz IF frequency in MHz.(0 - 9 is special value.)
@param uncommittedSwitches Switch selection for uncommitted switch.
@param committedSwitches Switch selection for committed switch.
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_singlecable2_command_ODU_Channel_change (sony_diseqc_message_t * pMessage,
uint8_t userbandId,
uint32_t ifFreqMHz,
uint8_t uncommittedSwitches,
uint8_t committedSwitches);
/**
@brief Create "ODU_Channel_change_PIN" command, addressing a Multi-Dwelling Unit. This is used
to retune a specific user band to a new centre frequency.
@param pMessage The message instance.
@param userbandId Userband-ID (1 - 32)
@param ifFreqMHz IF frequency in MHz.(0 - 9 is special value.)
@param uncommittedSwitches Switch selection for uncommitted switch.
@param committedSwitches Switch selection for committed switch.
@param pin PIN code.
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_singlecable2_command_ODU_Channel_change_PIN (sony_diseqc_message_t * pMessage,
uint8_t userbandId,
uint32_t ifFreqMHz,
uint8_t uncommittedSwitches,
uint8_t committedSwitches,
uint8_t pin);
/**
@brief Create "ODU_PowerOFF" command, addressing a Single Outdoor Unit. This is used to reduce
power consumption and release a user band when the corresponding demodulator is turned off.
@param pMessage The message instance.
@param userbandId Userband-Id (1 - 32)
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_singlecable2_command_ODU_PowerOFF (sony_diseqc_message_t * pMessage, uint8_t userbandId);
/**
@brief Create "ODU_PowerOFF_PIN" command, addressing a Multi-Dwelling Unit. This is used to reduce
power consumption and release a user band when the corresponding demodulator is turned off.
@param pMessage The message instance.
@param userbandId Userband-Id (1 - 32)
@param pin PIN code.
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_singlecable2_command_ODU_PowerOFF_PIN (sony_diseqc_message_t * pMessage,
uint8_t userbandId,
uint8_t pin);
/**
@brief Create "ODU_UB_avail" command.
@param pMessage The message instance.
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_singlecable2_command_ODU_UB_avail (sony_diseqc_message_t * pMessage);
/**
@brief Create "ODU_UB_freq" command.
@param pMessage The message instance.
@param userbandId Userband-Id (1 - 32)
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_singlecable2_command_ODU_UB_freq (sony_diseqc_message_t * pMessage,
uint8_t userbandId);
/**
@brief Create "ODU_UB_inuse" command.
@param pMessage The message instance.
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_singlecable2_command_ODU_UB_inuse (sony_diseqc_message_t * pMessage);
/**
@brief Create "ODU_UB_PIN" command.
@param pMessage The message instance.
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_singlecable2_command_ODU_UB_PIN (sony_diseqc_message_t * pMessage);
/**
@brief Create "ODU_UB_switches" command.
@param pMessage The message instance.
@param userbandId Userband-Id (1 - 32)
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_singlecable2_command_ODU_UB_switches (sony_diseqc_message_t * pMessage,
uint8_t userbandId);
#endif /* SONY_SINGLECABLE_COMMAND_H */
@@ -0,0 +1,375 @@
/*------------------------------------------------------------------------------
Copyright 2016 Sony Semiconductor Solutions Corporation
Last Updated : 2016/06/24
Modification ID : 3b74e280b7ad8ce430b6a9419ac53e8f2e3737f9
------------------------------------------------------------------------------*/
#include "sony_common.h"
#include "sony_demod_sat_device_ctrl.h"
#include "sony_singlecable_command.h"
/*------------------------------------------------------------------------------
Static Functions
------------------------------------------------------------------------------*/
static sony_result_t addPINCode (sony_diseqc_message_t * pMessage,
uint8_t pin);
/*------------------------------------------------------------------------------
Functions
------------------------------------------------------------------------------*/
sony_result_t sony_singlecable_command_ODU_Channel_change (sony_diseqc_message_t * pMessage,
sony_singlecable_address_t address,
uint8_t userbandId,
uint32_t ubSlotFreqKHz,
sony_singlecable_bank_t bank,
uint32_t centerFreqKHz)
{
int32_t index = 0;
uint16_t T = 0;
uint8_t data = 0;
SONY_TRACE_ENTER ("sony_singlecable_command_ODU_Channel_change");
if (!pMessage){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
if ((userbandId <= 0) || (9 <= userbandId)) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_RANGE);
}
for(index = 0; index < SONY_DISEQC_MESSAGE_LENGTH; index++){
pMessage->data[index] = 0;
}
/* Calculation T */
T = (uint16_t)(((centerFreqKHz + ubSlotFreqKHz + 2000) / 4000) - 350);
if (T > 0x3FFF){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_RANGE);
}
pMessage->data[0] = 0xE0;
pMessage->data[1] = (uint8_t)address;
pMessage->data[2] = 0x5A;
data = (uint8_t)(((uint32_t)(userbandId - 1) & 0x07) << 5);
data |= (uint8_t)(((uint32_t)bank & 0x07) << 2);
data |= (uint8_t)((T >> 8) & 0x03);
pMessage->data[3] = data;
pMessage->data[4] = (uint8_t)(T & 0xFF);
pMessage->length = 5;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
sony_result_t sony_singlecable_command_ODU_PowerOFF (sony_diseqc_message_t * pMessage,
sony_singlecable_address_t address,
uint8_t userbandId)
{
int32_t index = 0;
SONY_TRACE_ENTER ("sony_singlecable_command_ODU_PowerOFF");
if (!pMessage){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
if ((userbandId <= 0) || (9 <= userbandId)) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_RANGE);
}
for(index = 0; index < SONY_DISEQC_MESSAGE_LENGTH; index++){
pMessage->data[index] = 0;
}
pMessage->data[0] = 0xE0;
pMessage->data[1] = (uint8_t)address;
pMessage->data[2] = 0x5A;
pMessage->data[3] = (uint8_t)((((uint32_t)(userbandId - 1)) & 0x07) << 5);
pMessage->data[4] = 0x00;
pMessage->length = 5;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
sony_result_t sony_singlecable_command_ODU_UbxSignal_ON (sony_diseqc_message_t * pMessage,
sony_singlecable_address_t address)
{
int32_t index = 0;
SONY_TRACE_ENTER ("sony_singlecable_command_ODU_UbxSignal_ON");
if (!pMessage){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
for(index = 0; index < SONY_DISEQC_MESSAGE_LENGTH; index++){
pMessage->data[index] = 0;
}
pMessage->data[0] = 0xE0;
pMessage->data[1] = (uint8_t)address;
pMessage->data[2] = 0x5B;
pMessage->data[3] = 0x00;
pMessage->data[4] = 0x00;
pMessage->length = 5;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
sony_result_t sony_singlecable_command_ODU_Config (sony_diseqc_message_t * pMessage,
sony_singlecable_address_t address,
uint8_t userbandId,
sony_singlecable_num_of_sat_pos_t numberOfSatPos,
sony_singlecable_rf_band_t rfBand,
sony_singlecable_num_of_ub_slots_t numberOfUBSlots)
{
int32_t index = 0;
static const struct{
sony_singlecable_num_of_sat_pos_t numberOfSatPos;
sony_singlecable_rf_band_t rfBand;
sony_singlecable_num_of_ub_slots_t numberOfUBSlots;
uint8_t Config_Nb;
} ODU_Config_table[] = {
{SONY_SINGLECABLE_NUM_OF_SAT_POS_1, SONY_SINGLECABLE_RF_BAND_STANDARD, SONY_SINGLECABLE_NUM_OF_UB_2, 0x10},
{SONY_SINGLECABLE_NUM_OF_SAT_POS_1, SONY_SINGLECABLE_RF_BAND_STANDARD, SONY_SINGLECABLE_NUM_OF_UB_4, 0x11},
{SONY_SINGLECABLE_NUM_OF_SAT_POS_1, SONY_SINGLECABLE_RF_BAND_STANDARD, SONY_SINGLECABLE_NUM_OF_UB_6, 0x12},
{SONY_SINGLECABLE_NUM_OF_SAT_POS_1, SONY_SINGLECABLE_RF_BAND_STANDARD, SONY_SINGLECABLE_NUM_OF_UB_8, 0x13},
{SONY_SINGLECABLE_NUM_OF_SAT_POS_1, SONY_SINGLECABLE_RF_BAND_WIDE, SONY_SINGLECABLE_NUM_OF_UB_2, 0x14},
{SONY_SINGLECABLE_NUM_OF_SAT_POS_1, SONY_SINGLECABLE_RF_BAND_WIDE, SONY_SINGLECABLE_NUM_OF_UB_4, 0x15},
{SONY_SINGLECABLE_NUM_OF_SAT_POS_1, SONY_SINGLECABLE_RF_BAND_WIDE, SONY_SINGLECABLE_NUM_OF_UB_6, 0x16},
{SONY_SINGLECABLE_NUM_OF_SAT_POS_1, SONY_SINGLECABLE_RF_BAND_WIDE, SONY_SINGLECABLE_NUM_OF_UB_8, 0x17},
{SONY_SINGLECABLE_NUM_OF_SAT_POS_2, SONY_SINGLECABLE_RF_BAND_STANDARD, SONY_SINGLECABLE_NUM_OF_UB_2, 0x18},
{SONY_SINGLECABLE_NUM_OF_SAT_POS_2, SONY_SINGLECABLE_RF_BAND_STANDARD, SONY_SINGLECABLE_NUM_OF_UB_4, 0x19},
{SONY_SINGLECABLE_NUM_OF_SAT_POS_2, SONY_SINGLECABLE_RF_BAND_STANDARD, SONY_SINGLECABLE_NUM_OF_UB_6, 0x1A},
{SONY_SINGLECABLE_NUM_OF_SAT_POS_2, SONY_SINGLECABLE_RF_BAND_STANDARD, SONY_SINGLECABLE_NUM_OF_UB_8, 0x1B},
{SONY_SINGLECABLE_NUM_OF_SAT_POS_2, SONY_SINGLECABLE_RF_BAND_WIDE, SONY_SINGLECABLE_NUM_OF_UB_2, 0x1C},
{SONY_SINGLECABLE_NUM_OF_SAT_POS_2, SONY_SINGLECABLE_RF_BAND_WIDE, SONY_SINGLECABLE_NUM_OF_UB_4, 0x1D},
{SONY_SINGLECABLE_NUM_OF_SAT_POS_2, SONY_SINGLECABLE_RF_BAND_WIDE, SONY_SINGLECABLE_NUM_OF_UB_6, 0x1E},
{SONY_SINGLECABLE_NUM_OF_SAT_POS_2, SONY_SINGLECABLE_RF_BAND_WIDE, SONY_SINGLECABLE_NUM_OF_UB_8, 0x1F}
};
SONY_TRACE_ENTER ("sony_singlecable_command_ODU_Config");
if (!pMessage){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
if ((userbandId <= 0) || (9 <= userbandId)) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_RANGE);
}
for(index = 0; index < SONY_DISEQC_MESSAGE_LENGTH; index++){
pMessage->data[index] = 0;
}
pMessage->data[0] = 0xE0;
pMessage->data[1] = (uint8_t)address;
pMessage->data[2] = 0x5B;
pMessage->data[3] = (uint8_t)(((((uint32_t)(userbandId - 1)) & 0x07) << 5) | (uint32_t)0x01);
for(index = 0; index < (int32_t)(sizeof(ODU_Config_table)/sizeof(ODU_Config_table[0])); index++)
{
if((numberOfSatPos == ODU_Config_table[index].numberOfSatPos) &&
(rfBand == ODU_Config_table[index].rfBand) &&
(numberOfUBSlots == ODU_Config_table[index].numberOfUBSlots))
{
pMessage->data[4] = ODU_Config_table[index].Config_Nb;
pMessage->length = 5;
/* Success */
SONY_TRACE_RETURN(SONY_RESULT_OK);
}
}
/* Error */
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
sony_result_t sony_singlecable_command_ODU_LoFreq (sony_diseqc_message_t * pMessage,
sony_singlecable_address_t address,
uint8_t userbandId,
sony_singlecable_lofreq_t loFreq)
{
int32_t index = 0;
SONY_TRACE_ENTER ("sony_singlecable_command_ODU_LoFreq");
if (!pMessage){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
if ((userbandId <= 0) || (9 <= userbandId)) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_RANGE);
}
for(index = 0; index < SONY_DISEQC_MESSAGE_LENGTH; index++){
pMessage->data[index] = 0;
}
pMessage->data[0] = 0xE0;
pMessage->data[1] = (uint8_t)address;
pMessage->data[2] = 0x5B;
pMessage->data[3] = (uint8_t)(((((uint32_t)(userbandId - 1)) & 0x07) << 5) | 0x02);
pMessage->data[4] = (uint8_t)loFreq;
pMessage->length = 5;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
sony_result_t sony_singlecable_command_ODU_Channel_change_MDU (sony_diseqc_message_t * pMessage,
sony_singlecable_address_t address,
uint8_t userbandId,
uint32_t ubSlotFreqKHz,
sony_singlecable_bank_t bank,
uint32_t centerFreqKHz,
uint8_t pin)
{
sony_result_t result = SONY_RESULT_OK;
SONY_TRACE_ENTER ("sony_singlecable_command_ODU_Channel_change_MDU");
if (!pMessage) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
if ((userbandId <= 0) || (9 <= userbandId)) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_RANGE);
}
result = sony_singlecable_command_ODU_Channel_change (pMessage, address, userbandId, ubSlotFreqKHz, bank, centerFreqKHz);
if (result != SONY_RESULT_OK) {SONY_TRACE_RETURN (result);}
pMessage->data[2] = 0x5C;
result = addPINCode (pMessage, pin);
if (result != SONY_RESULT_OK) {SONY_TRACE_RETURN (result);}
SONY_TRACE_RETURN (result);
}
sony_result_t sony_singlecable_command_ODU_PowerOFF_MDU (sony_diseqc_message_t * pMessage,
sony_singlecable_address_t address,
uint8_t userbandId,
uint8_t pin)
{
sony_result_t result = SONY_RESULT_OK;
SONY_TRACE_ENTER ("sony_singlecable_command_ODU_PowerOFF_MDU");
if (!pMessage){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
if ((userbandId <= 0) || (9 <= userbandId)) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_RANGE);
}
result = sony_singlecable_command_ODU_PowerOFF (pMessage, address, userbandId);
if (result != SONY_RESULT_OK) {SONY_TRACE_RETURN (result);}
pMessage->data[2] = 0x5C;
result = addPINCode (pMessage, pin);
if (result != SONY_RESULT_OK) {SONY_TRACE_RETURN (result);}
SONY_TRACE_RETURN (result);
}
sony_result_t sony_singlecable_command_ODU_UbxSignal_ON_MDU (sony_diseqc_message_t * pMessage,
sony_singlecable_address_t address,
uint8_t pin)
{
sony_result_t result = SONY_RESULT_OK;
SONY_TRACE_ENTER ("sony_singlecable_command_ODU_UbxSignal_ON_MDU");
if (!pMessage){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
result = sony_singlecable_command_ODU_UbxSignal_ON (pMessage, address);
if (result != SONY_RESULT_OK) {SONY_TRACE_RETURN (result);}
pMessage->data[2] = 0x5D;
result = addPINCode (pMessage, pin);
if (result != SONY_RESULT_OK) {SONY_TRACE_RETURN (result);}
SONY_TRACE_RETURN (result);
}
sony_result_t sony_singlecable_command_ODU_Config_MDU (sony_diseqc_message_t * pMessage,
sony_singlecable_address_t address,
uint8_t userbandId,
sony_singlecable_num_of_sat_pos_t numberOfSatPos,
sony_singlecable_rf_band_t rfBand,
sony_singlecable_num_of_ub_slots_t numberOfUBSlots,
uint8_t pin)
{
sony_result_t result = SONY_RESULT_OK;
SONY_TRACE_ENTER ("sony_singlecable_command_ODU_Config_MDU");
if (!pMessage){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
if ((userbandId <= 0) || (9 <= userbandId)) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_RANGE);
}
result = sony_singlecable_command_ODU_Config (pMessage, address, userbandId, numberOfSatPos, rfBand, numberOfUBSlots);
if (result != SONY_RESULT_OK) {SONY_TRACE_RETURN (result);}
pMessage->data[2] = 0x5D;
result = addPINCode (pMessage, pin);
if (result != SONY_RESULT_OK) {SONY_TRACE_RETURN (result);}
SONY_TRACE_RETURN (result);
}
sony_result_t sony_singlecable_command_ODU_LoFreq_MDU (sony_diseqc_message_t * pMessage,
sony_singlecable_address_t address,
uint8_t userbandId,
sony_singlecable_lofreq_t loFreq,
uint8_t pin)
{
sony_result_t result = SONY_RESULT_OK;
SONY_TRACE_ENTER ("sony_singlecable_command_ODU_LoFreq_MDU");
if (!pMessage){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
if ((userbandId <= 0) || (9 <= userbandId)) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_RANGE);
}
result = sony_singlecable_command_ODU_LoFreq (pMessage, address, userbandId, loFreq);
if (result != SONY_RESULT_OK) {SONY_TRACE_RETURN (result);}
pMessage->data[2] = 0x5D;
result = addPINCode (pMessage, pin);
if (result != SONY_RESULT_OK) {SONY_TRACE_RETURN (result);}
SONY_TRACE_RETURN (result);
}
/*------------------------------------------------------------------------------
Static Functions
------------------------------------------------------------------------------*/
static sony_result_t addPINCode (sony_diseqc_message_t * pMessage,
uint8_t pin)
{
sony_result_t result = SONY_RESULT_OK;
SONY_TRACE_ENTER ("addPIN");
if (!pMessage){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
if (pMessage->length < (SONY_DISEQC_MESSAGE_LENGTH - 1)){
pMessage->data[pMessage->length] = pin;
pMessage->length++;
} else {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
SONY_TRACE_RETURN (result);
}
@@ -0,0 +1,286 @@
/*------------------------------------------------------------------------------
Copyright 2016 Sony Semiconductor Solutions Corporation
Last Updated : 2016/06/24
Modification ID : 3b74e280b7ad8ce430b6a9419ac53e8f2e3737f9
------------------------------------------------------------------------------*/
/**
@file sony_singlecable_command.h
This file provides the function to generate "single cable commands".
*/
/*----------------------------------------------------------------------------*/
#ifndef SONY_SINGLECABLE_COMMAND_H
#define SONY_SINGLECABLE_COMMAND_H
#include "../sony_common.h"
#include "sony_demod_sat_device_ctrl.h"
/*------------------------------------------------------------------------------
Enumerations
------------------------------------------------------------------------------*/
/**
@brief Definition of address byte for Single cable message.
*/
typedef enum {
SONY_SINGLECABLE_ADDRESS_ALL_DEVICES = 0x00, /**< Any device (Master to all devices) */
SONY_SINGLECABLE_ADDRESS_ALL_LNB_SMATV_SWITCHER = 0x10, /**< Any LNB, Switcher or SMATV (Master to all...) */
SONY_SINGLECABLE_ADDRESS_LNB_DEVICE = 0x11 /**< LNB devices. */
} sony_singlecable_address_t;
/**
@brief Definition of bank.
*/
typedef enum {
SONY_SINGLECABLE_BANK_0 = 0, /**< Position A, Vertical, Low band. */
SONY_SINGLECABLE_BANK_1 = 1, /**< Position A, Vertical, High band. */
SONY_SINGLECABLE_BANK_2 = 2, /**< Position A, Horizontal, Low band. */
SONY_SINGLECABLE_BANK_3 = 3, /**< Position A, Horizontal, High band. */
SONY_SINGLECABLE_BANK_4 = 4, /**< Position B, Vertical, Low band. */
SONY_SINGLECABLE_BANK_5 = 5, /**< Position B, Vertical, High band. */
SONY_SINGLECABLE_BANK_6 = 6, /**< Position B, Horizontal, Low band. */
SONY_SINGLECABLE_BANK_7 = 7 /**< Position B, Horizontal, High band. */
} sony_singlecable_bank_t;
/**
@brief Number of Satellite Positions definition.
*/
typedef enum {
SONY_SINGLECABLE_NUM_OF_SAT_POS_1, /**< 1 Satellite Position */
SONY_SINGLECABLE_NUM_OF_SAT_POS_2 /**< 2 Satellite Positions */
} sony_singlecable_num_of_sat_pos_t;
/**
@brief RF Band
*/
typedef enum {
SONY_SINGLECABLE_RF_BAND_STANDARD, /**< Standard RF */
SONY_SINGLECABLE_RF_BAND_WIDE /**< Wide band RF */
} sony_singlecable_rf_band_t;
/**
@brief Number of User band (UB) slots definition.
*/
typedef enum {
SONY_SINGLECABLE_NUM_OF_UB_2, /**< 2 UB slots */
SONY_SINGLECABLE_NUM_OF_UB_4, /**< 4 UB slots */
SONY_SINGLECABLE_NUM_OF_UB_6, /**< 6 UB slots */
SONY_SINGLECABLE_NUM_OF_UB_8 /**< 8 UB slots */
} sony_singlecable_num_of_ub_slots_t;
/**
@brief Definition of local oscillator frequency.
*/
typedef enum {
SONY_SINGLECABLE_LOFREQ_NONE = 0x00, /**< None (switcher) */
SONY_SINGLECABLE_LOFREQ_UNKNOWN = 0x01, /**< Unknown */
SONY_SINGLECABLE_LOFREQ_9750_MHZ = 0x02, /**< 9750MHz */
SONY_SINGLECABLE_LOFREQ_10000_MHZ = 0x03, /**< 10000MHz */
SONY_SINGLECABLE_LOFREQ_10600_MHZ = 0x04, /**< 10600MHz */
SONY_SINGLECABLE_LOFREQ_10750_MHZ = 0x05, /**< 10750MHz */
SONY_SINGLECABLE_LOFREQ_11000_MHZ = 0x06, /**< 11000MHz */
SONY_SINGLECABLE_LOFREQ_11250_MHZ = 0x07, /**< 11250MHz */
SONY_SINGLECABLE_LOFREQ_11475_MHZ = 0x08, /**< 11475MHz */
SONY_SINGLECABLE_LOFREQ_20250_MHZ = 0x09, /**< 20250MHz */
SONY_SINGLECABLE_LOFREQ_5150_MHZ = 0x0A, /**< 5150MHz */
SONY_SINGLECABLE_LOFREQ_1585_MHZ = 0x0B, /**< 1585MHz */
SONY_SINGLECABLE_LOFREQ_13850_MHZ = 0x0C, /**< 13850MHz */
SONY_SINGLECABLE_LOFREQ_WB_NONE = 0x10, /**< Wide band RF, None(switcher) */
SONY_SINGLECABLE_LOFREQ_WB_10000_MHZ = 0x11, /**< Wide band RF, 10000MHz */
SONY_SINGLECABLE_LOFREQ_WB_10200_MHZ = 0x12, /**< Wide band RF, 10200MHz */
SONY_SINGLECABLE_LOFREQ_WB_13250_MHZ = 0x13, /**< Wide band RF, 13250MHz */
SONY_SINGLECABLE_LOFREQ_WB_13450_MHZ = 0x14 /**< Wide band RF, 13450MHz */
} sony_singlecable_lofreq_t;
/*------------------------------------------------------------------------------
Structs
------------------------------------------------------------------------------*/
/**
@brief structure for Single cable Config_Nb table.
*/
typedef struct {
sony_singlecable_num_of_sat_pos_t numberOfSatPos; /**< Number of Satellite Positions. */
sony_singlecable_rf_band_t rfBand; /**< RF Band(Standard or Wide). */
sony_singlecable_num_of_ub_slots_t numberOfUBSlots; /**< Number of User band (UB) slots. */
} sony_singlecable_config_nb_t;
/*------------------------------------------------------------------------------
Functions
------------------------------------------------------------------------------*/
/**
@brief Create "ODU_Channel_change" command, addressing a Single Outdoor Unit. This is used
to retune a specific user band to a new centre frequency.
@param pMessage The message instance.
@param address Address byte.
@param userbandId User band slot number allocated to the user. (1-8)
@param ubSlotFreqKHz User band slot center frequency allocated to the user in KHz.
@param bank Target bank to tune.
@param centerFreqKHz Frequency to tune in KHz.
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_singlecable_command_ODU_Channel_change (sony_diseqc_message_t * pMessage,
sony_singlecable_address_t address,
uint8_t userbandId,
uint32_t ubSlotFreqKHz,
sony_singlecable_bank_t bank,
uint32_t centerFreqKHz);
/**
@brief Create "ODU_PowerOFF" command, addressing a Single Outdoor Unit. This is used to reduce
power consumption and release a user band when the corresponding demodulator is turned off.
@param pMessage The message instance.
@param address Address byte.
@param userbandId User band slot number allocated to the user. (1-8)
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_singlecable_command_ODU_PowerOFF (sony_diseqc_message_t * pMessage,
sony_singlecable_address_t address,
uint8_t userbandId);
/**
@brief Create "ODU_UbxSignal_ON" command, addressing a Single Outdoor Unit. This is used to output
an RF tone at the centre frequency of each user band on the cable. This is primarily used
for the receiver to scan the cable and detect the user band frequencies.
@param pMessage The message instance.
@param address Address byte.
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_singlecable_command_ODU_UbxSignal_ON (sony_diseqc_message_t * pMessage,
sony_singlecable_address_t address);
/**
@brief Create "ODU_Config" command, addressing a Single Outdoor Unit. This is primarily used to
identify useful parameters of the installation and of the SCIF device.
@param pMessage The message instance.
@param address Address byte.
@param userbandId User band slot number allocated to the user.(1-8)
@param numberOfSatPos The number of satellite position.
@param rfBand The RF band(Standard(S) or Wide band(WB)).
@param numberOfUBSlots The number of user band slots.
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_singlecable_command_ODU_Config (sony_diseqc_message_t * pMessage,
sony_singlecable_address_t address,
uint8_t userbandId,
sony_singlecable_num_of_sat_pos_t numberOfSatPos,
sony_singlecable_rf_band_t rfBand,
sony_singlecable_num_of_ub_slots_t numberOfUBSlots);
/**
@brief Create "ODU_LoFreq" command, addressing a Single Outdoor Unit. This is used to determine
the value of the local oscillator frequency used in the LNB of the installation.
@param pMessage The message instance.
@param address Address byte.
@param userbandId User band slot number allocated to the user.(1-8)
@param loFreq Local oscillator frequency.
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_singlecable_command_ODU_LoFreq (sony_diseqc_message_t * pMessage,
sony_singlecable_address_t address,
uint8_t userbandId,
sony_singlecable_lofreq_t loFreq);
/**
@brief Create "ODU_Channel_change_MDU" command, addressing a Multi-Dwelling Unit. This is used
to retune a specific user band to a new centre frequency.
@param pMessage The message instance.
@param address Address byte.
@param userbandId User band slot number allocated to the user.(1-8)
@param ubSlotFreqKHz User band slot center frequency allocated to the user in KHz.
@param bank Target bank to tune.
@param centerFreqKHz Center frequency to tune in KHz.
@param pin PIN code.
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_singlecable_command_ODU_Channel_change_MDU (sony_diseqc_message_t * pMessage,
sony_singlecable_address_t address,
uint8_t userbandId,
uint32_t ubSlotFreqKHz,
sony_singlecable_bank_t bank,
uint32_t centerFreqKHz,
uint8_t pin);
/**
@brief Create "ODU_PowerOFF_MDU" command, addressing a Multi-Dwelling Unit. This is used to reduce
power consumption and release a user band when the corresponding demodulator is turned off.
@param pMessage The message instance.
@param address Address byte.
@param userbandId User band slot allocated to the user.(1-8)
@param pin PIN code.
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_singlecable_command_ODU_PowerOFF_MDU (sony_diseqc_message_t * pMessage,
sony_singlecable_address_t address,
uint8_t userbandId,
uint8_t pin);
/**
@brief Create "ODU_UbxSignal_ON_MDU" command, addressing a Multi-Dwelling Unit. This is used to output
an RF tone at the centre frequency of each user band on the cable. This is primarily used
for the receiver to scan the cable and detect the user band frequencies.
@param pMessage The message instance.
@param address Address byte.
@param pin PIN code.
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_singlecable_command_ODU_UbxSignal_ON_MDU (sony_diseqc_message_t * pMessage,
sony_singlecable_address_t address,
uint8_t pin);
/**
@brief Create "ODU_Config_MDU" command, addressing a Multi-Dwelling Unit. This is primarily used to
identify useful parameters of the installation and of the SCIF device.
@param pMessage The message instance.
@param address Address byte.
@param userbandId User band allocated to the user.(1-8)
@param numberOfSatPos The number of satellite position.
@param rfBand The RF band(Standard(S) or Wide band(WB)).
@param numberOfUBSlots The number of user band slots.
@param pin PIN code.
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_singlecable_command_ODU_Config_MDU (sony_diseqc_message_t * pMessage,
sony_singlecable_address_t address,
uint8_t userbandId,
sony_singlecable_num_of_sat_pos_t numberOfSatPos,
sony_singlecable_rf_band_t rfBand,
sony_singlecable_num_of_ub_slots_t numberOfUBSlots,
uint8_t pin);
/**
@brief Create "ODU_LoFreq_MDU" command, addressing a Multi-Dwelling Unit. This is used to determine
the value of the local oscillator frequency used in the LNB of the installation.
@param pMessage The message instance.
@param address Address byte.
@param userbandId User band slot allocated to the user.(1-8)
@param loFreq Local oscillator frequency.
@param pin PIN code.
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_singlecable_command_ODU_LoFreq_MDU (sony_diseqc_message_t * pMessage,
sony_singlecable_address_t address,
uint8_t userbandId,
sony_singlecable_lofreq_t loFreq,
uint8_t pin);
#endif /* SONY_SINGLECABLE_COMMAND_H */