blob: 578b5bd74e4a481ea0ffbbf7c7010374c901df8e [file] [log] [blame]
/*------------------------------------------------------------------------------
* Module Name SiIRX_API
* Module Description: RX API functions
*
* Copyright © 2002-2005, Silicon Image, Inc. All rights reserved.
*
* No part of this work may be reproduced, modified, distributed, transmitted,
* transcribed, or translated into any language or computer format, in any form
* or by any means without written permission of: Silicon Image, Inc.,
* 1060 East Arques Avenue, Sunnyvale, California 94085
*----------------------------------------------------------------------------
*/
#include "SiIRX_API.h"
#include "SiIGlob.h"
#include "SiIVidF.h"
#include "SiIVidIn.h"
#include "SiIAudio.h"
#include "SiITTAudio.h"
#include "SiITTVideo.h"
#include "SiISysCtrl.h"
#include "SiITTasks.h"
#include "SiIHDMIRX.h"
#include "SiIInfoPkts.h"
#include "SiIDiagnostic.h"
#include "SiIISR.h"
#include "SiIHAL.h"
#include "SiITrace.h"
#include "../hdmirx_ext_drv.h"
/*------------------------------------------------------------------------------
* System Commands
*----------------------------------------------------------------------------
*/
/*------------------------------------------------------------------------------
* Function Name: SiI_RX_GetAPIInfo
* ---
* Function Description: This function is used to get information about API
*
* Accepts: <description of input>
* Returns: Number of Errors code and/or warnings
* Globals: <global variables and system state changes>
*----------------------------------------------------------------------------
*/
BYTE SiI_RX_GetAPI_Info(BYTE *pbRXParameters)
{
WORD wStartSysTimerTicks;
siiResetErrorsAndWarnings(); /* Number of Warning Messages = Zero */
wStartSysTimerTicks = siiGetTicksNumber();
pbRXParameters[0] = SiI_RX_API_Version;
pbRXParameters[1] = SiI_RX_API_Revision;
pbRXParameters[2] = SiI_RX_API_Build;
pbRXParameters[3] = SiI_RX_API_DiagnosticCommands;
siiGetRXDeviceInfo(&pbRXParameters[4]);
pbRXParameters[7] = SII_REQ_TASK_CALL_TIME;
siiMeasureProcLastAPI_Ticks(wStartSysTimerTicks);
/* if Result FALSE, no errors and warning messages */
return siiGetErrorsWarnings();
}
/*------------------------------------------------------------------------------
* Function Name: SiI_RX_InitializeSystem
* Function Description: Initialize global data and devices
*
* Accepts: none
* Returns: Number of Errors code and/or warnings
* Globals: none
*----------------------------------------------------------------------------
*/
BYTE SiI_RX_InitializeSystem(BYTE *pbSysInit)
{
WORD wStartSysTimerTicks;
RXEXTPR("%s\n", __func__);
siiResetErrorsAndWarnings(); /* Number of Warning Messages = Zero */
wStartSysTimerTicks = siiGetTicksNumber();
halInitGPIO_Pins();
siiInitializeRX(pbSysInit);
siiSaveRXInitParameters(pbSysInit);
siiInitilizeSystemData(ON);
siiTurnAudioOffAndSetSM_AudioOff();
siiMuteVideoAndSetSM_SyncInChange();
siiMeasureProcLastAPI_Ticks(wStartSysTimerTicks);
/* if Result FALSE, no errors and warning messages */
return siiGetErrorsWarnings();
}
/*------------------------------------------------------------------------------
* Function Name: SiI_RX_GlobalPower
* Function Description:
*
* Accepts: none
* Returns: Number of Errors code and/or warnings
* Globals: none
*----------------------------------------------------------------------------
*/
BYTE SiI_RX_GlobalPower(BYTE bPowerState)
{
WORD wStartSysTimerTicks;
siiResetErrorsAndWarnings(); /* Number of Warning Messages = Zero */
wStartSysTimerTicks = siiGetTicksNumber();
siiRX_GlobalPower(bPowerState);
siiMeasureProcLastAPI_Ticks(wStartSysTimerTicks);
/* if Result FALSE, no errors and warning messages */
return siiGetErrorsWarnings();
}
/*------------------------------------------------------------------------------
* Function Name: SiI_RX_SetVideoInput
* ---
* Function Description: Selects HDMI (DVI) input
* Accepts: bVideoInputChannels
* Returns: Number of Errors code and/or warnings
* Globals: none
*----------------------------------------------------------------------------
*/
BYTE SiI_RX_SetVideoInput(BYTE bVideoInputChannels)
{
WORD wStartSysTimerTicks;
siiResetErrorsAndWarnings(); /* Number of Warning Messages = Zero */
wStartSysTimerTicks = siiGetTicksNumber();
SiI_Ctrl.bVidInChannel = bVideoInputChannels; /* YMA added */
siiChangeVideoInput(bVideoInputChannels);
siiMeasureProcLastAPI_Ticks(wStartSysTimerTicks);
return siiGetErrorsWarnings();
}
/*------------------------------------------------------------------------------
* Function Name: SiI_RX_SetAudioMute
* Function Description: This command provides a manual mute of
* the Silicon Image HDMI receiver's audio output.
* This command does not change the behavior of any
* device's auto mute functionality
* Accepts: none
* Returns: none
* Globals: none
*----------------------------------------------------------------------------
*/
BYTE SiI_RX_SetAudioVideoMute(BYTE bAudioVideoMute)
{
WORD wStartSysTimerTicks;
siiResetErrorsAndWarnings(); /* Number of Warning Messages = Zero */
wStartSysTimerTicks = siiGetTicksNumber();
if (bAudioVideoMute & SiI_RX_AVMuteCtrl_MuteAudio)
siiSetSM_ReqHoldAudioMuteAndStartMuting(ON);
else if (siiIsAudioHoldMuteState())
siiSetSM_ReqHoldAudioMuteAndStartMuting(OFF);
if (bAudioVideoMute & SiI_RX_AVMuteCtrl_MuteVideo)
siiSetGlobalVideoMuteAndSM_Video(ON);
else
siiSetGlobalVideoMuteAndSM_Video(OFF);
siiMeasureProcLastAPI_Ticks(wStartSysTimerTicks);
/* if Result FALSE, no errors and warning messages */
return siiGetErrorsWarnings();
}
/*------------------------------------------------------------------------------
* Function Name: SiI_RX_DoTasks
* Function Description:
*
* Accepts: pointer on events changes
* Returns: Number of Errors code and/or warnings
* Globals: <global variables and system state changes>
*----------------------------------------------------------------------------
*/
BYTE SiI_RX_DoTasks(BYTE *pbRXParameters)
{
/* Slot time is time between last and current DoTasks measured in ms */
WORD wNumberOfTicks;
BYTE bTimeFromLastDoTasks;
BYTE bError;
siiResetErrorsAndWarnings(); /* Number of Warning Messages = Zero */
wNumberOfTicks = siiGetTicksNumber();
RXEXTDBG("sii9135 SiI_Ctrl.sm_bVideo = %d\n", SiI_Ctrl.sm_bVideo);
if (SiI_Ctrl.sm_bVideo != SiI_RX_VS_GlobalPowerDown) {
/* if (SiI_Inf.bGlobStatus & SiI_RX_Global_HotPlugDetect) { */
#ifdef SII_USE_RX_PIN_INTERRUPT
bError = siiRX_PinInterruptHandler();
#else
bError = siiRX_BitInterruptHandler();
#endif
/* } */
if (bError == SiI_EC_HDCP_StuckInterrupt)
siiReInitRX();
#ifndef FIXED_TASK_CALL_TIME
bTimeFromLastDoTasks = siiDoTasksTimeDiffrence();
#else
bTimeFromLastDoTasks = SII_TASK_CALL_TIME;
#endif
siiTimerTasksHandler(bTimeFromLastDoTasks);
pbRXParameters[0] = siiGetSMEventChanges();
}
siiMeasureProcLastAPI_Ticks(wNumberOfTicks);
/* if Result FALSE, no errors and warning messages */
return siiGetErrorsWarnings();
}
/*------------------------------------------------------------------------------
* Function Name: SiI_RX_GetSystemInformation
* Function Description:
*
* Accepts: none
* Returns: nNumber of Errors code and/or warnings
* Globals: none
*----------------------------------------------------------------------------
*/
BYTE SiI_RX_GetSystemInformation(BYTE *pbRXParameters)
{
WORD wStartSysTimerTicks;
siiResetErrorsAndWarnings(); /* Number of Warning Messages = Zero */
wStartSysTimerTicks = siiGetTicksNumber();
pbRXParameters[0] = SiI_Ctrl.sm_bVideo; /* is BYTE bVideoState */
pbRXParameters[1] = SiI_Ctrl.sm_bAudio; /* is BYTE bAudioState */
if (siiCheckIfVideoInputResolutionReady()) {
/* is BYTE bModeId */
pbRXParameters[2] = siiGetVideoResId(SiI_Inf.bVResId);
} else {
if (siiCheckIfVideoOutOfRangeOrVMNotDetected())
pbRXParameters[2] = SiI_ResNotDetected;
else
pbRXParameters[2] = SiI_ResNoInfo;
}
/* is BYTE bInputColorSpace */
pbRXParameters[3] = SiI_Inf.AVI.bInputColorSpace;
/* is BYTE bColorimetry */
pbRXParameters[4] = SiI_Inf.AVI.bColorimetry/* ; */
/* is upper 4 bits is Color Depth */
| (SiI_Inf.AVI.bInputColorDepth << 4);
/* is BYTE bHDCPStatus */
pbRXParameters[5] = SiI_Inf.bHDCPStatus;
/* is BYTE bGlobStatus */
pbRXParameters[6] = SiI_Inf.bGlobStatus;
pbRXParameters[7] = SiI_Inf.bNewInfoPkts;
siiMeasureProcLastAPI_Ticks(wStartSysTimerTicks);
/* if Result FALSE, no errors and warning messages */
return siiGetErrorsWarnings();
}
/*------------------------------------------------------------------------------
* Packet Commands
*----------------------------------------------------------------------------
*/
/*------------------------------------------------------------------------------
* Function Name: SiI_RX_GetInfoFrame
* Function Description: Get the current Info Frame received by
* the Silicon Image HDMI receiver.
*
* Accepts: bInfoFrameType
* Returns: BYTE *pbRXParameters pointer on Info Frame data
* Globals: none
*----------------------------------------------------------------------------
*/
BYTE SiI_RX_GetPackets(BYTE bInfoPacketType, BYTE *pbRXParameters)
{
WORD wStartSysTimerTicks;
siiResetErrorsAndWarnings(); /* Number of Warning Messages = Zero */
wStartSysTimerTicks = siiGetTicksNumber();
siiGetInfoPacket(bInfoPacketType, pbRXParameters);
siiClearNewPacketEvent(bInfoPacketType);
siiMeasureProcLastAPI_Ticks(wStartSysTimerTicks);
/* if Result FALSE, no errors and warning messages */
return siiGetErrorsWarnings();
}
/*------------------------------------------------------------------------------
* Video Commands
*----------------------------------------------------------------------------
*/
/*------------------------------------------------------------------------------
* Function Name: SiI_RX_SetVideoOutputFormat
* ---
* Function Description: Sets Video Output Format of SiI RX, function sets
* static part of Video Path, dynamic part will be
* complete after detection of video resolution
* Accepts: parameters to set Video Output Format
* Returns: Number of Errors code and/or warnings
* Globals: sm_bVideo, bVideoPath, bInputColorSpace
*----------------------------------------------------------------------------
*/
BYTE SiI_RX_SetVideoOutputFormat(BYTE bOutputVideoPathSelect,
BYTE bOutputSyncSelect,
BYTE bOutputSyncCtrl,
BYTE bOutputVideoCtrl)
{
WORD wStartSysTimerTicks;
BYTE abVidFormatData[3];
siiResetErrorsAndWarnings(); /* Number of Warning Messages = Zero */
wStartSysTimerTicks = siiGetTicksNumber();
abVidFormatData[0] = abVidFormatData[1] = abVidFormatData[2] = 0;
/* YMA restore the configuration, or outpout depth lost */
siiGetVideoFormatData(abVidFormatData);
siiMuteVideoAndSetSM_SyncInChange();
siiPrepVideoPathSelect(bOutputVideoPathSelect,
SiI_Inf.AVI.bInputColorSpace, abVidFormatData);
siiPrepSyncSelect(bOutputSyncSelect, abVidFormatData);
siiPrepSyncCtrl(bOutputSyncCtrl, abVidFormatData);
siiPrepVideoCtrl(bOutputVideoCtrl, abVidFormatData);
/* Update Video format data to Vid. Mode/Ctrl regs. */
siiSetVideoFormatData(abVidFormatData);
/* later will be used in Vid. Res. Dependent functions */
SiI_Ctrl.VideoF.bOutputVideoPath = bOutputVideoPathSelect;
SiI_Ctrl.VideoF.bOutputSyncSelect = bOutputSyncSelect;
SiI_Ctrl.VideoF.bOutputSyncCtrl = bOutputSyncCtrl;
SiI_Ctrl.VideoF.bOutputVideoCtrl = bOutputVideoCtrl;
siiMeasureProcLastAPI_Ticks(wStartSysTimerTicks);
/* if Result FALSE, no errors and warning messages */
return siiGetErrorsWarnings();
}
/*------------------------------------------------------------------------------
* Function Name: SiI_RX_GetVideoOutputFormat
* Function Description: Gets Video Output Format
*
* Accepts: none
* Returns: Number of Errors code and/or warnings
* Globals: none
*----------------------------------------------------------------------------
*/
BYTE SiI_RX_GetVideoOutputFormat(BYTE *pbRXParameters)
{
WORD wStartSysTimerTicks;
siiResetErrorsAndWarnings(); /* Number of Warning Messages = Zero */
wStartSysTimerTicks = siiGetTicksNumber();
/* later will be used in Vid. Res. Dependent functions */
pbRXParameters[0] = SiI_Ctrl.VideoF.bOutputVideoPath;
pbRXParameters[1] = SiI_Ctrl.VideoF.bOutputSyncSelect;
pbRXParameters[2] = SiI_Ctrl.VideoF.bOutputSyncCtrl;
pbRXParameters[3] = SiI_Ctrl.VideoF.bOutputVideoCtrl;
siiMeasureProcLastAPI_Ticks(wStartSysTimerTicks);
/* if Result FALSE, no errors and warning messages */
return siiGetErrorsWarnings();
}
/*------------------------------------------------------------------------------
* Function Name: SiI_RX_GetInputVideoResolution
* Function Description:
*
* Accepts: none
* Returns: Number of Errors code and/or warnings
* Globals: none
*----------------------------------------------------------------------------
*/
BYTE SiI_RX_GetVideoInputResolution(BYTE *pbRXParameters)
{
WORD wStartSysTimerTicks;
siiResetErrorsAndWarnings(); /* Number of Warning Messages = Zero */
wStartSysTimerTicks = siiGetTicksNumber();
if (siiCheckIfVideoInputResolutionReady())
siiGetVideoInputResolution(SiI_Inf.bVResId, pbRXParameters);
else
pbRXParameters[0] = SiI_ResNoInfo;
#ifdef SII_NO_RESOLUTION_DETECTION
if (siiCheckIfVideoOutOfRangeOrVMNotDetected())
siiGetVideoInputResolutionromRegisters(pbRXParameters);
#endif
siiMeasureProcLastAPI_Ticks(wStartSysTimerTicks);
/* if Result FALSE, no errors and warning messages */
return siiGetErrorsWarnings();
}
/*------------------------------------------------------------------------------
* Audio Commands
*----------------------------------------------------------------------------
*/
/*------------------------------------------------------------------------------
* Function Name: SiI_RX_SetAudioOutputFormat
* Function Description: Set the Silicon image HDMI receivers audio
* output format.
* Both audio interfaces, SPDIF and I2S can
* be selected simultaneously.
* The Smooth HW Mute can also be enabled regardless of
* the audio interfaces combination selected.
*
* The BYTE bI2SMap is a reserved parameter in
* the API specification.
* It is being used to set up the I2S mapping,
* the API does not support configurations other than
* the default.
* Accepts: none
* Returns: none
* Globals: none
*----------------------------------------------------------------------------
*/
BYTE SiI_RX_SetAudioOutputFormat(WORD wAudioOutputSelect,
WORD wI2SBusFormat,
BYTE bI2SMap,
BYTE bDSDHBRFormat)
{
/* YMA 2 added for API rev2 */
WORD wStartSysTimerTicks;
struct AudioOutputFormatType_s AudioOutputFormat;
siiResetErrorsAndWarnings(); /* Number of Warning Messages = Zero */
wStartSysTimerTicks = siiGetTicksNumber();
siiTurnAudioOffAndSetSM_AudioOff();
AudioOutputFormat.wOutputSelect =
SiI_Ctrl.wAudioOutputSelect = wAudioOutputSelect;
AudioOutputFormat.wI2SBusFormat = wI2SBusFormat;
AudioOutputFormat.bI2SMap = bI2SMap;
AudioOutputFormat.bDSDHBRFormat = bDSDHBRFormat;
siiSetAudioOutputFormat(&AudioOutputFormat);
/* YMA 2 add to save the configuration for
*later restore when HBR/DSD -> PCM
*/
SavedAudioOutputFormat = AudioOutputFormat;
siiMeasureProcLastAPI_Ticks(wStartSysTimerTicks);
/* if Result FALSE, no errors and warning messages */
return siiGetErrorsWarnings();
}
/*------------------------------------------------------------------------------
* Function Name: SiI_RX_GetAudioOutputFormat
* Function Description:
*
* Accepts: none
* Returns: pbRXParameters[0] is BYTE bAudioOutputControl,
* pbRXParameters[1] is WORD wI2SBusFormat
* pbRXParameters[4] is BYTE bI2SMap
* pbRXParameters[5] is BYTE bDSDHBRFormat
* Globals: none
*----------------------------------------------------------------------------
*/
BYTE SiI_RX_GetAudioOutputFormat(BYTE *pbRXParameters)
{
WORD wStartSysTimerTicks;
/* struct AudioOutputFormatType_s AudioOutputFormat; */
siiResetErrorsAndWarnings(); /* Number of Warning Messages = Zero */
wStartSysTimerTicks = siiGetTicksNumber();
/* YMA change to return the save value instead of read from registers.
*the reg value may be not the right mode
*/
/* siiGetAudioOutputFormat(&AudioOutputFormat); */
pbRXParameters[0] = (BYTE)(SavedAudioOutputFormat.wOutputSelect & 0xFF);
pbRXParameters[1] =
(BYTE)((SavedAudioOutputFormat.wOutputSelect >> 8) & 0xFF);
pbRXParameters[2] = (BYTE)(SavedAudioOutputFormat.wI2SBusFormat & 0xFF);
pbRXParameters[3] =
(BYTE)((SavedAudioOutputFormat.wI2SBusFormat >> 8) & 0xFF);
pbRXParameters[4] = SavedAudioOutputFormat.bI2SMap;
pbRXParameters[5] = SavedAudioOutputFormat.bDSDHBRFormat;
siiMeasureProcLastAPI_Ticks(wStartSysTimerTicks);
/* if Result FALSE, no errors and warning messages */
return siiGetErrorsWarnings();
}
/*------------------------------------------------------------------------------
* Function Name: SiI_RX_GetAudioInputStatus
* Function Description:
*
* Accepts: none
* Returns: none
* Globals: none
*----------------------------------------------------------------------------
*/
BYTE SiI_RX_GetAudioInputStatus(BYTE *pbRXParameters)
{
WORD wStartSysTimerTicks;
siiResetErrorsAndWarnings(); /* Number of Warning Messages = Zero */
wStartSysTimerTicks = siiGetTicksNumber();
pbRXParameters[0] = SiI_Inf.bAudioErr;
if (siiIsAudioStatusReady()) {
/* Compressed, PCM, DSD */
pbRXParameters[1] = SiI_Inf.AudioStatus.bRepresentation;
pbRXParameters[2] = SiI_Inf.AudioStatus.bAccuracyAndFs;
pbRXParameters[3] = SiI_Inf.AudioStatus.bLength;
pbRXParameters[4] = SiI_Inf.AudioStatus.bNumberChannels;
} else {
pbRXParameters[1] = 0xFF;
pbRXParameters[2] = 0xFF;
pbRXParameters[3] = 0xFF;
pbRXParameters[4] = 0xFF;
}
siiMeasureProcLastAPI_Ticks(wStartSysTimerTicks);
/* if Result FALSE, no errors and warning messages */
return siiGetErrorsWarnings();
}
/*------------------------------------------------------------------------------
* Common Commands
*----------------------------------------------------------------------------
*/
/*------------------------------------------------------------------------------
* Function Name:
* Function Description:
*
* Accepts: none
* Returns: none
* Globals: none
*----------------------------------------------------------------------------
*/
BYTE SiI_GetWarnings(BYTE *pbRXParameters)
{
WORD wStartSysTimerTicks;
BYTE bNumberWrn;
wStartSysTimerTicks = siiGetTicksNumber();
bNumberWrn = siiGetWarningData(pbRXParameters);
siiMeasureProcLastAPI_Ticks(wStartSysTimerTicks);
/* if Result FALSE, no errors and warning messages */
return bNumberWrn;
}
/*------------------------------------------------------------------------------
* Function Name:
* Function Description:
*
* Accepts: none
* Returns: none
* Globals: none
*----------------------------------------------------------------------------
*/
BYTE SiI_GetErrors(BYTE *pbRXParameters)
{
WORD wStartSysTimerTicks;
BYTE bNumberErr;
wStartSysTimerTicks = siiGetTicksNumber();
bNumberErr = siiGetErrorsData(pbRXParameters);
siiMeasureProcLastAPI_Ticks(wStartSysTimerTicks);
/* if Result FALSE, no errors and warning messages */
return bNumberErr;
}
/*------------------------------------------------------------------------------
* Diagnostics Commands
*----------------------------------------------------------------------------
*/
/*------------------------------------------------------------------------------
* Function Name: SiI_Diagnostic_GetNCTS
* Function Description: Get information about N/CTS packets, these packets
* are sent by TX and used for Audio Clock Regeneration
* (ACR)
* Accepts: none
* Returns: pointer on requested data
* Globals: none
*----------------------------------------------------------------------------
*/
BYTE SiI_Diagnostic_GetNCTS(BYTE *pbRXParameters)
{
siiResetErrorsAndWarnings(); /* Number of Warning Messages = Zero */
siiGetNCTS(pbRXParameters);
/* if Result FALSE, no errors and warning messages */
return siiGetErrorsWarnings();
}
/*------------------------------------------------------------------------------
* Function Name: SiI_Diagnostic_GetABKSV
* Function Description: Get AKSV and BKSV
* (for more information see HDCP specefication)
*
* Accepts: none
* Returns: pointer on requested data
* Globals: none
*----------------------------------------------------------------------------
*/
BYTE SiI_Diagnostic_GetABKSV(BYTE *pbRXParameters)
{
siiResetErrorsAndWarnings(); /* Number of Warning Messages = Zero */
siiGetABKSV(pbRXParameters);
/* if Result FALSE, no errors and warning messages */
return siiGetErrorsWarnings();
}
/*------------------------------------------------------------------------------
* Function Name:
* Function Description:
*
* Accepts: none
* Returns: none
* Globals: none
*----------------------------------------------------------------------------
*/
BYTE SiI_Diagnostic_GetAPIExeTime(BYTE *pbRXParameters)
{
siiResetErrorsAndWarnings(); /* Number of Warning Messages = Zero */
siiDiagnostic_GetAPI_ExeTime(pbRXParameters);
/* if Result FALSE, no errors and warning messages */
return siiGetErrorsWarnings();
}