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

📄 metrics.c

📁 Lido PXA270平台开发板的最新BSP,包括源代码
💻 C
字号:
/**************************************************************************
* Name         : metrics.c
* Created      : 22/09/2004
*
* Copyright    : 2004 by Imagination Technologies Limited. All rights reserved.
*              : No part of this software, either material or conceptual 
*              : may be copied or distributed, transmitted, transcribed,
*              : stored in a retrieval system or translated into any 
*              : human or computer language in any form by any means,
*              : electronic, mechanical, manual or other-wise, or 
*              : disclosed to third parties without the express written
*              : permission of Imagination Technologies Limited, Unit 8, HomePark
*              : Industrial Estate, King's Langley, Hertfordshire,
*              : WD4 8LZ, U.K.
*
* Platform     : ANSI
*
* $Log: metrics.c $
**************************************************************************/

#if defined(DEBUG) || defined(TIMING)

#include "services_headers.h"

static IMG_UINT32 *pui32TimerRegister = 0;


#if defined(__SH4__)

/* timer control registers */
#define TST_REG   (*(volatile unsigned char *)(psDevLocation->pvSOCRegsBaseKM)) 		// timer start register

#define TCOR_0    (*(volatile unsigned int *)(psDevLocation->pvSOCRegsBaseKM+4))	 	// timer constant register_0
#define TCNT_0    (*(volatile unsigned int *)(psDevLocation->pvSOCRegsBaseKM+8))	 	// timer counter register_0
#define TCR_0     (*(volatile unsigned short *)(psDevLocation->pvSOCRegsBaseKM+12))		// timer control register_0

#define TCOR_1    (*(volatile unsigned int *)(psDevLocation->pvSOCRegsBaseKM+16))	 	// timer constant register_1
#define TCNT_1    (*(volatile unsigned int *)(psDevLocation->pvSOCRegsBaseKM+20))	 	// timer counter register_1
#define TCR_1     (*(volatile unsigned short *)(psDevLocation->pvSOCRegsBaseKM+24))		// timer control register_1

#define TCOR_2    (*(volatile unsigned int *)(psDevLocation->pvSOCRegsBaseKM+28))	 	// timer constant register_2
#define TCNT_2    (*(volatile unsigned int *)(psDevLocation->pvSOCRegsBaseKM+32))	 	// timer counter register_2
#define TCR_2     (*(volatile unsigned short *)(psDevLocation->pvSOCRegsBaseKM+36))		// timer control register_2

#define TIMER_DIVISOR  4

#endif /* __SH4__ */


#define PVRSRV_TIMER_TOTAL_IN_TICKS(X)	asTimers[X].ui32Total
#define PVRSRV_TIMER_TOTAL_IN_MS(X)		((1000*asTimers[X].ui32Total)/ui32TicksPerMS)
#define PVRSRV_TIMER_COUNT(X)			asTimers[X].ui32Count


Temporal_Data asTimers[PVRSRV_NUM_TIMERS]; 


/***********************************************************************************
 Function Name      : PVRSRVTimeNow
 Inputs             : 
 Outputs            : 
 Returns            : 
 Description        : 
                      
************************************************************************************/
IMG_UINT32 PVRSRVTimeNow(IMG_VOID)
{
	if (!pui32TimerRegister)
	{
		static IMG_BOOL bFirstTime = IMG_TRUE;

		if (bFirstTime)
		{
			PVR_DPF((PVR_DBG_ERROR,"PVRSRVTimeNow: No timer register set up"));

			bFirstTime = IMG_FALSE;
		}

		return 0;
	}

#if defined(__arm__)

	return *pui32TimerRegister;

#elif defined(__SH4__)

	return (0xffffffff-*pui32TimerRegister);

#else 

	return 0;

#endif
}


/***********************************************************************************
 Function Name      : PVRSRVGetCPUFreq
 Inputs             : 
 Outputs            : 
 Returns            : 
 Description        : 
                      
************************************************************************************/
static IMG_UINT32 PVRSRVGetCPUFreq(IMG_VOID)
{
	IMG_UINT32 ui32Time1, ui32Time2;

	ui32Time1 = PVRSRVTimeNow();

	HostWaitus(1000000);

	ui32Time2 = PVRSRVTimeNow();

	return (ui32Time2 - ui32Time1);
}	


/***********************************************************************************
 Function Name      : PVRSRVSetupMetricTimers
 Inputs             : 
 Outputs            : 
 Returns            : 
 Description        : 
                      
************************************************************************************/
IMG_VOID PVRSRVSetupMetricTimers(PPVRSRV_DEV_INFO psDevInfo)
{
	PVRSRV_DEV_LOCATION *psDevLocation = &psDevInfo->sDevLocation;
	IMG_UINT32 ui32Loop;

	for(ui32Loop=0; ui32Loop < (PVRSRV_NUM_TIMERS); ui32Loop++)
	{
		asTimers[ui32Loop].ui32Total = 0;
		asTimers[ui32Loop].ui32Count = 0;
	}

#if defined(__arm__)

	pui32TimerRegister = (IMG_UINT32 *)psDevLocation->pvSOCRegsBaseKM;

#elif defined(__SH4__)

	/* timer control register */
	// clock / 1024 when TIMER_DIVISOR = 4
	// underflow int disabled
	// we get approx 38 uS per timer tick 
	TCR_2 = TIMER_DIVISOR;

	/* reset the timer counter to 0 */
	TCOR_2 = TCNT_2 = (unsigned int)0xffffffff;

	/* start timer 2 */
	TST_REG |= (unsigned char)0x04;

	pui32TimerRegister = (IMG_UINT32 *)(psDevLocation->pvSOCRegsBaseKM+32);
	
#else

	pui32TimerRegister = 0;

#endif
}	


/***********************************************************************************
 Function Name      : PVRSRVOutputMetricTotals
 Inputs             : 
 Outputs            : 
 Returns            : 
 Description        : 
                      
************************************************************************************/
IMG_VOID PVRSRVOutputMetricTotals(IMG_VOID)
{
	IMG_UINT32 ui32TicksPerMS, ui32Loop;

	ui32TicksPerMS = PVRSRVGetCPUFreq();

	if (!ui32TicksPerMS)
	{
		PVR_DPF((PVR_DBG_ERROR,"PVRSRVOutputMetricTotals: Failed to get CPU Freq"));
		return;
	}

	for(ui32Loop=0; ui32Loop < (PVRSRV_NUM_TIMERS); ui32Loop++)
	{
		if (asTimers[ui32Loop].ui32Count & 0x80000000L)
		{
			PVR_DPF((PVR_DBG_WARNING,"PVRSRVOutputMetricTotals: Timer %u is still ON", ui32Loop));
		}
	}
#if 0
	/*
	** EXAMPLE TIMER OUTPUT
	*/
	PVR_DPF((PVR_DBG_ERROR," Timer(%u): Total = %u",PVRSRV_TIMER_EXAMPLE_1, PVRSRV_TIMER_TOTAL_IN_TICKS(PVRSRV_TIMER_EXAMPLE_1)));
	PVR_DPF((PVR_DBG_ERROR," Timer(%u): Time = %ums",PVRSRV_TIMER_EXAMPLE_1, PVRSRV_TIMER_TOTAL_IN_MS(PVRSRV_TIMER_EXAMPLE_1)));
	PVR_DPF((PVR_DBG_ERROR," Timer(%u): Count = %u",PVRSRV_TIMER_EXAMPLE_1, PVRSRV_TIMER_COUNT(PVRSRV_TIMER_EXAMPLE_1)));
#endif
}

#endif /* DLL_METRIC */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -