📄 tidtv_avinput.c
字号:
/*******************************************************************************
* @ModuleName :: TiDTV_AvInput.c
*
* @Copyright :: Copyright 2005- Texas Instruments, Inc.
*
* @Description :: A/V Inputs handling module
*
* @History ::
*---------------------------------------
* 02-26-2005 W.Shi Created
*******************************************************************************/
#include <stdio.h>
#include <string.h>
#include "ucos_ii.h"
#include "TvpArch.h"
#include "TvpDefs.h"
#include "Tvp9000.h"
#include "TvpError.h"
#include "TvpInt.h"
#include "TvpHdm.h"
#include "TvpInt926.h"
#include "TvpUarts.h"
#include "TvpEbi.h"
#include "TvpTpp.h"
#include "TvpIrrf.h"
#include "TvpGpio.h"
#include "TvpVideo.h"
#include "TvpAudio.h"
#include "TvpEncoder.h"
#include "TvpI2c.h"
#include "TvpTimer.h"
#include "TvpSdTables.h"
#include "TvpSdram.h"
#include "TvpSystem.h"
#include "TvpCp15.h"
#include "TvpMmu.h"
#include "TiDTV_DataType.h"
#include "TiDTV_SysCtrl.h"
#include "TiDTV_UserApi.h"
#include "TiDTV_GLib.h"
#include "TVP9K_I2C_Def.h"
#include "TVP9K_NV_Def.h"
#include "TiDTV_McuComm.h"
#include "TiDTV_IrKey.h"
#include "TiDTV_Buffers.h"
#include "TiDTV_PSIP.h"
#include "TiDTV_AvInput.h"
#include "TiDTV_GuiApi.h"
static void TiDTV_AutoChanScanDTV(void);
static void TiDTV_AutoChanScanATV(void);
static void TiDTV_DtvChanUp(void);
static void TiDTV_DtvChanDown(void);
static void TiDTV_AtvChanUp(void);
static void TiDTV_AtvChanDown(void);
OS_STK TiDTV_AutoTvChanScanTaskStack[TI_DTV_AUTO_TV_CHAN_SCAN_TASK_STACK_SIZE];
void TiDTV_AutoTvChanScanTask(void *pArg);
/*******************************************************************************
* @RoutineName:: TiDTV_AvInputTask
*
* @Description:: The entry of A/V Inputs handling task
*
* @Input ::
* void *pArg : pointer to the Aruguments
*
* @Output :: none
*
* @Return :: none
*******************************************************************************/
void TiDTV_AvInputTask(void *pArg)
{
INT8U uCosRetStatus;
OS_FLAGS AvInputFlag;
// Initialize the Tuner
TiDTV_InitTuner();
#if 1
TiDTV_KeyBuf.CurKeyCode = TI_DTV_IR_KEY_INPUT; // TV/Video Input Selection
TiDTV_PromptMsgTaskStartup();
#else
// check if needs to do Auto Channel Scanning
if (TiDTV_SysCtrl.TotalNumPhyChanATV + TiDTV_SysCtrl.TotalNumPhyChanDTV == 0)
TiDTV_AutoTvChanScanStartup(3); // Auto TV Channel Scanning
#endif
TiDTV_CcServiceCtrl(); // CC Service control: Enable/Disable/On-Mute
//------------------------------------------------------
// Time out value for LG Tuner Status Checking
//
TiDTV_SysCtrl.AvTimeOutValue = TiDTV_SysCtrl.AvTimeCount = OS_TICKS_PER_SEC / 5;
while (1) { // loop forever
// Wait for AV Input related events
AvInputFlag = OSFlagPend(pTiDTV_SysFLAG, TI_DTV_AV_WDT_FLAG,
OS_FLAG_WAIT_SET_ANY + OS_FLAG_CONSUME, 0, &uCosRetStatus);
if (AvInputFlag == 0 || uCosRetStatus != OS_NO_ERR)
continue; // should never get here !
switch (TiDTV_SysCtrl.AvInput) {
case TI_DTV_AV_INPUT_DTV: // D-TV
// Checks Demod status and call appropriate functinons
LGDTcheckStatus();
break;
case TI_DTV_AV_INPUT_YPBPR1: // Component-1
break;
case TI_DTV_AV_INPUT_YPBPR2: // Component-2
break;
case TI_DTV_AV_INPUT_HDMI: // HDMI
break;
case TI_DTV_AV_INPUT_VGA: // VGA
break;
default:
#if 0
TiDTV_VideoDecChanSel();
// Check the Analog Video Standard: NTSC/PAL/480i/480p/576p
TiDTV_ConfigNvIn(TiDTV_VideoDecGetStandard());
#else
if (TiDTV_VideoDecGetLockStatus()) {
// Normal mode: not forcing Backgound Color
TiDTV_OsdBackColorCtrl(0);
// Check the Analog Video Standard: NTSC/PAL/480i/480p/576p
TiDTV_ConfigNvIn(TiDTV_VideoDecGetStandard());
} else {
// force Backgound Color
TiDTV_OsdBackColorCtrl(1);
}
#endif
break;
}
}
}
/*******************************************************************************
* @RoutineName:: TiDTV_AutoTvChanScanTask
*
* @Description:: The entry of TV Channel Automatic Scanning Task
*
* @Input ::
* void *pArg : pointer to the Aruguments
*
* @Output :: none
*
* @Return :: none
*******************************************************************************/
void TiDTV_AutoTvChanScanTask(void *pArg)
{
INT8U SaveCcCtrl = TiDTV_CcCtrl.DispCtrl;
if (1 <= TiDTV_SysCtrl.AutoTvChanScanFlag &&
TiDTV_SysCtrl.AutoTvChanScanFlag <= 3)
{
// CC Service control: Enable/Disable/On-Mute
TiDTV_CcCtrl.DispCtrl = TI_DTV_CC_DISABLE;
TiDTV_CcServiceCtrl();
switch (TiDTV_SysCtrl.AutoTvChanScanFlag) {
case 1:
TiDTV_AutoChanScanATV(); // Analog TV Channel Scanning
break;
case 2:
TiDTV_AutoChanScanDTV(); // Digital TV Channel Scanning
break;
case 3:
TiDTV_AutoChanScanATV(); // Analog TV Channel Scanning
TiDTV_AutoChanScanDTV(); // Digital TV Channel Scanning
break;
default:
break;
}
// CC Service control: Enable/Disable/On-Mute
TiDTV_CcCtrl.DispCtrl = SaveCcCtrl; // restore CC Control
if (TiDTV_MenuTaskStatus() != OS_NO_ERR)
TiDTV_CcServiceCtrl();
}
OSTaskDel(OS_PRIO_SELF);
}
/*******************************************************************************
* @RoutineName:: TiDTV_AutoTvChanScanStartup
*
* @Description:: TV Channel Automatic Scanning Task Start up
*
* @Input ::
* int ScanFlag : Flag of TV Channel Scanning
*
* @Output :: none
*
* @Return :: none
*******************************************************************************/
void TiDTV_AutoTvChanScanTaskStartup(int ScanFlag)
{
// Auto TV Channel Scanning Flag: 1 = A-TV, 2 = D-TV, 3 = A-TV & D-TV
TiDTV_SysCtrl.AutoTvChanScanFlag = (UINT8) ScanFlag;
OSTaskCreate(TiDTV_AutoTvChanScanTask,
(void *) NULL,
&TiDTV_AutoTvChanScanTaskStack[TI_DTV_AUTO_TV_CHAN_SCAN_TASK_STACK_SIZE - 1],
TI_DTV_AUTO_TV_CHAN_SCAN_TASK_PRIORITY);
}
/*******************************************************************************
* @RoutineName:: TiDTV_AutoChanScanDTV
*
* @Description:: Digital TV Channel Automatic Scanning
*
* @Input :: none
*
* @Output :: none
*
* @Return :: none
*******************************************************************************/
static void TiDTV_AutoChanScanDTV(void) // qfy auto scan
{
TI_DTV_CHAN_STATUS *pTvChanStatus = TiDTV_SysCtrl.ChanStatus;
TI_DTV_PROGRAM_TABLE *pDtvProgTable = (TI_DTV_PROGRAM_TABLE *) &TiDTV_ProgTable[0];
INT8U uCosRetStatus, i;
OS_FLAGS ChanScanFlag;
char WorkChar[5];
TiDTV_AudioAmpCtrl(0); // Turn Off the Audio
// Disable all the H/W filters
TiDTV_DisableAllHwFilters();
TiDTV_SysCtrl.TotalNumPhyChanDTV =
TiDTV_SysCtrl.CurPhyChanDTV =
TiDTV_SysCtrl.CurProgramIdx = 0;
// clear the Digital TV Program Table
memset(&TiDTV_ProgTable, 0, sizeof(TiDTV_ProgTable));
for (i = TI_DTV_MIN_PHY_CHANNEL_NO; i <= TI_DTV_MAX_PHY_CHANNEL_NO; i++, pDtvProgTable++)
pDtvProgTable->MajorChanNo = 0xffff; // Major Channel Number: [1 - 99]
//------------------------------------------------------
TiDTV_SysCtrl.AvInput = TI_DTV_AV_INPUT_DTV;
TiDTV_SwitchAvInput(); // Switch AV Input to Digital TV
// Scan all DTV Physical Channels
TiDTV_KeyBuf.CurKeyCode = 0; // clear the Key Code
for (i = TI_DTV_MIN_PHY_CHANNEL_NO; i <= TI_DTV_MAX_PHY_CHANNEL_NO; i++, pTvChanStatus++) {
if (pTvChanStatus->Bits.Analog)
continue; // skip Analog RF Channels
// use Top Window
TiDTV_OsdSetDrawWindow(&TiDTV_OsdScreenAux, &TiDTV_OsdScreenAux.pOsdWindows[0]);
TiDTV_OsdSetCharColor(&TiDTV_OsdScreenAux, TI_DTV_COLOR_BRIGHT_GREEN, 0);
TiDTV_OsdSolidRect(&TiDTV_OsdScreenAux, 30, 0, 60, 30, 0);
TiDTV_MyInt2Str(i, WorkChar, 2, ' ');
TiDTV_OsdMove(&TiDTV_OsdScreenAux, 30, 0);
TiDTV_OsdDrawAsciiStr(&TiDTV_OsdScreenAux, WorkChar);
// Display the Progress Bar
TiDTV_OsdMove(&TiDTV_OsdScreenAux, 30 + 60 + (i - TI_DTV_MIN_PHY_CHANNEL_NO) * 12, 0);
TiDTV_OsdDrawChar(&TiDTV_OsdScreenAux, 0x1E);
TiDTV_SysCtrl.CurPhyChanDTV = i;
TiDTV_ChangeDtvRfChan(i, 3); // Change DTV RF Channel
if (pTvChanStatus->Bits.Locked) {
// use Top Window
TiDTV_OsdSetDrawWindow(&TiDTV_OsdScreenAux, &TiDTV_OsdScreenAux.pOsdWindows[0]);
TiDTV_OsdSetCharColor(&TiDTV_OsdScreenAux, TI_DTV_COLOR_BRIGHT_BLUE, 0);
TiDTV_OsdSolidRect(&TiDTV_OsdScreenAux, 30, TI_DTV_AUDIO_CTRL_Y, 60, 30, 0);
TiDTV_OsdMove(&TiDTV_OsdScreenAux, 30, TI_DTV_AUDIO_CTRL_Y);
TiDTV_OsdDrawAsciiStr(&TiDTV_OsdScreenAux, WorkChar);
// wait for PMT/TVCT data updating finished
ChanScanFlag = OSFlagPend(pTiDTV_SysFLAG, TI_DTV_PROGRAM_TABLE_READY,
OS_FLAG_WAIT_SET_ANY + OS_FLAG_CONSUME, 10 * OS_TICKS_PER_SEC, &uCosRetStatus);
// Show the DTV program for a while
if ((uCosRetStatus == OS_NO_ERR && ChanScanFlag == TI_DTV_PROGRAM_TABLE_READY) ||
(TiDTV_PsipCtrl.Status & TI_DTV_TVCT_DATA_READY))
{
// Total number of Locked Physical Channels (D-TV)
TiDTV_SysCtrl.TotalNumPhyChanDTV++;
OSTimeDly(2 * OS_TICKS_PER_SEC);
} else {
// No any program then clear the Locked status
pTvChanStatus->Bits.Locked = 0;
}
}
// if EXIT or MENU key pressed, then exit the Auto Scan
if (TiDTV_KeyBuf.CurKeyCode == TI_DTV_IR_KEY_EXIT ||
TiDTV_KeyBuf.CurKeyCode == TI_DTV_IR_KEY_MENU)
break;
}
// Erase the AUX OSD Display windows
TiDTV_OsdClearWindow(&TiDTV_OsdScreenAux, &TiDTV_OsdScreenAux.pOsdWindows[0], 0);
// Tune to the 1st DTV Channel: TiDTV_SysCtrl.CurDtvPhyChanIdx = 0
if (TiDTV_SysCtrl.TotalNumPhyChanDTV > 0) {
TiDTV_SortProgTable(); // Sort the DTV Program Table
TiDTV_SysCtrl.CurProgTableIdx = 0;
TiDTV_SysCtrl.CurPhyChanDTV = TiDTV_ProgTable[TiDTV_SysCtrl.CurProgTableIdx].RfChanNo;
//------------------------------------------------------
// Signal the Event Flag of Program Table Ready
//
OSFlagPost(pTiDTV_SysFLAG, TI_DTV_PROGRAM_TABLE_READY, OS_FLAG_SET, &uCosRetStatus);
// Change DTV RF Channel
TiDTV_ChangeDtvRfChan(TiDTV_SysCtrl.CurPhyChanDTV, 0);
}
TiDTV_AudioAmpCtrl(1); // Turn On the Audio
}
/*******************************************************************************
* @RoutineName:: TiDTV_AutoChanScanATV
*
* @Description:: Analog TV Channel Automatic Scanning
*
* @Input :: none
*
* @Output :: none
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -