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

📄 tidtv_avinput.c

📁 ti的数字电视芯片 tvp9000的源码
💻 C
📖 第 1 页 / 共 2 页
字号:
/*******************************************************************************
*	@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 + -