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

📄 _profile_timer_hw.c

📁 自学ZedBoard:使用IP通过ARM PS访问FPGA(源代码)
💻 C
字号:
////////////////////////////////////////////////////////////////////////// Copyright (c) 2004-2010 Xilinx, Inc.  All rights reserved.// Xilinx, Inc.//// XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION "AS IS" AS A// COURTESY TO YOU.  BY PROVIDING THIS DESIGN, CODE, OR INFORMATION AS// ONE POSSIBLE   IMPLEMENTATION OF THIS FEATURE, APPLICATION OR// STANDARD, XILINX IS MAKING NO REPRESENTATION THAT THIS IMPLEMENTATION// IS FREE FROM ANY CLAIMS OF INFRINGEMENT, AND YOU ARE RESPONSIBLE// FOR OBTAINING ANY RIGHTS YOU MAY REQUIRE FOR YOUR IMPLEMENTATION.// XILINX EXPRESSLY DISCLAIMS ANY WARRANTY WHATSOEVER WITH RESPECT TO// THE ADEQUACY OF THE IMPLEMENTATION, INCLUDING BUT NOT LIMITED TO// ANY WARRANTIES OR REPRESENTATIONS THAT THIS IMPLEMENTATION IS FREE// FROM CLAIMS OF INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY// AND FITNESS FOR A PARTICULAR PURPOSE.//// $Id: _profile_timer_hw.c,v 1.1.2.1 2011/05/17 04:37:56 sadanan Exp $//// _program_timer_hw.c://	Timer related functions////////////////////////////////////////////////////////////////////////#include "profile.h"#include "_profile_timer_hw.h"#include "xil_exception.h"#ifdef PROC_PPC#include "xtime_l.h"#include "xpseudo_asm.h"#endif#ifdef TIMER_CONNECT_INTC#include "xintc_l.h"#include "xintc.h"#endif	// TIMER_CONNECT_INTC//#ifndef PPC_PIT_INTERRUPT#if (!defined PPC_PIT_INTERRUPT && !defined PROC_CORTEXA9)#include "xtmrctr_l.h"#endifextern unsigned int timer_clk_ticks ;//--------------------------------------------------------------------// PowerPC Target - Timer related functions//--------------------------------------------------------------------#ifdef PROC_PPC405//--------------------------------------------------------------------// PowerPC PIT Timer Init.//	Defined only if PIT Timer is used for Profiling////--------------------------------------------------------------------#ifdef PPC_PIT_INTERRUPTint ppc_pit_init( void ){	// 1. Register Profile_intr_handler as Interrupt handler	// 2. Set PIT Timer Interrupt and Enable it.	Xil_ExceptionRegisterHandler( XIL_EXCEPTION_ID_PIT_INT,			    (Xil_ExceptionHandler)profile_intr_handler,(void *)0);	XTime_PITSetInterval( timer_clk_ticks ) ;	XTime_PITEnableAutoReload() ;	return 0;}#endif//--------------------------------------------------------------------// PowerPC Timer Initialization functions.//	For PowerPC, PIT and opb_timer can be used for Profiling. This//	is selected by the user in standalone BSP////--------------------------------------------------------------------int powerpc405_init(){	Xil_ExceptionInit() ;	Xil_ExceptionDisableMask( XIL_EXCEPTION_NON_CRITICAL ) ;	// Initialize the Timer.	// 1. If PowerPC PIT Timer has to be used, initialize PIT timer.	// 2. Else use opb_timer. It can be directly connected or thru intc to PowerPC#ifdef PPC_PIT_INTERRUPT	ppc_pit_init();#else#ifdef TIMER_CONNECT_INTC	Xil_ExceptionRegisterHandler( XIL_EXCEPTION_ID_NON_CRITICAL_INT,			      (Xil_ExceptionHandler)XIntc_DeviceInterruptHandler,(void *)0);	XIntc_RegisterHandler( INTC_BASEADDR, PROFILE_TIMER_INTR_ID,			     (XInterruptHandler)profile_intr_handler,(void*)0);#else	Xil_ExceptionRegisterHandler( XIL_EXCEPTION_ID_NON_CRITICAL_INT,			      (Xil_ExceptionHandler)profile_intr_handler,(void *)0);#endif	// Initialize the timer with Timer Ticks	opb_timer_init() ;#endif	// Enable Interrupts in the System, if Profile Timer is the only Interrupt	// in the System.#ifdef ENABLE_SYS_INTR#ifdef PPC_PIT_INTERRUPT	XTime_PITEnableInterrupt() ;#elif TIMER_CONNECT_INTC	XIntc_MasterEnable( INTC_BASEADDR );	XIntc_SetIntrSvcOption( INTC_BASEADDR, XIN_SVC_ALL_ISRS_OPTION);	XIntc_EnableIntr( INTC_BASEADDR, PROFILE_TIMER_INTR_MASK );#endif	Xil_ExceptionEnableMask( XIL_EXCEPTION_NON_CRITICAL ) ;#endif	return 0;}#endif	// PROC_PPC//--------------------------------------------------------------------// PowerPC440 Target - Timer related functions//--------------------------------------------------------------------#ifdef PROC_PPC440//--------------------------------------------------------------------// PowerPC DEC Timer Init.//	Defined only if DEC Timer is used for Profiling////--------------------------------------------------------------------#ifdef PPC_PIT_INTERRUPTint ppc_dec_init( void ){	// 1. Register Profile_intr_handler as Interrupt handler	// 2. Set DEC Timer Interrupt and Enable it.	Xil_ExceptionRegisterHandler( XIL_EXCEPTION_ID_DEC_INT,			    (Xil_ExceptionHandler)profile_intr_handler,(void *)0);	XTime_DECSetInterval( timer_clk_ticks ) ;	XTime_DECEnableAutoReload() ;	return 0;}#endif//--------------------------------------------------------------------// PowerPC Timer Initialization functions.//	For PowerPC, DEC and opb_timer can be used for Profiling. This//	is selected by the user in standalone BSP////--------------------------------------------------------------------int powerpc405_init(void){	Xil_ExceptionInit();	Xil_ExceptionDisableMask( XIL_EXCEPTION_NON_CRITICAL ) ;	// Initialize the Timer.	// 1. If PowerPC DEC Timer has to be used, initialize DEC timer.	// 2. Else use opb_timer. It can be directly connected or thru intc to PowerPC#ifdef PPC_PIT_INTERRUPT	ppc_dec_init();#else#ifdef TIMER_CONNECT_INTC	Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_NON_CRITICAL_INT,				     (Xil_ExceptionHandler)XIntc_DeviceInterruptHandler,(void *)0);	XIntc_RegisterHandler( INTC_BASEADDR, PROFILE_TIMER_INTR_ID,			     (XInterruptHandler)profile_intr_handler,(void*)0);#else	Xil_ExceptionRegisterHandler( XIL_EXCEPTION_ID_NON_CRITICAL_INT,			      (Xil_ExceptionHandler)profile_intr_handler,(void *)0);	Xil_ExceptionRegisterHandler( XIL_EXCEPTION_ID_NON_CRITICAL_INT,			      (Xil_ExceptionHandler)profile_intr_handler,(void *)0);#endif	// Initialize the timer with Timer Ticks	opb_timer_init() ;#endif	// Enable Interrupts in the System, if Profile Timer is the only Interrupt	// in the System.#ifdef ENABLE_SYS_INTR#ifdef PPC_PIT_INTERRUPT	XTime_DECEnableInterrupt() ;#elif TIMER_CONNECT_INTC	XIntc_MasterEnable( INTC_BASEADDR );	XIntc_SetIntrSvcOption( INTC_BASEADDR, XIN_SVC_ALL_ISRS_OPTION);	XIntc_EnableIntr( INTC_BASEADDR, PROFILE_TIMER_INTR_MASK );#endif	Xil_ExceptionEnableMask( XEXC_NON_CRITICAL ) ;#endif	return 0;}#endif	// PROC_PPC440//--------------------------------------------------------------------// opb_timer Initialization for PowerPC and MicroBlaze. This function// is not needed if DEC timer is used in PowerPC////--------------------------------------------------------------------//#ifndef PPC_PIT_INTERRUPT#if (!defined PPC_PIT_INTERRUPT && !defined PROC_CORTEXA9)int opb_timer_init( void ){	// set the number of cycles the timer counts before interrupting	XTmrCtr_SetLoadReg(PROFILE_TIMER_BASEADDR, 0, timer_clk_ticks);	// reset the timers, and clear interrupts	XTmrCtr_SetControlStatusReg(PROFILE_TIMER_BASEADDR, 0,				     XTC_CSR_INT_OCCURED_MASK | XTC_CSR_LOAD_MASK );	// start the timers	XTmrCtr_SetControlStatusReg(PROFILE_TIMER_BASEADDR, 0, XTC_CSR_ENABLE_TMR_MASK			     | XTC_CSR_ENABLE_INT_MASK | XTC_CSR_AUTO_RELOAD_MASK | XTC_CSR_DOWN_COUNT_MASK);	return 0;}#endif//--------------------------------------------------------------------// MicroBlaze Target - Timer related functions//--------------------------------------------------------------------#ifdef PROC_MICROBLAZE//--------------------------------------------------------------------// Initialize the Profile Timer for MicroBlaze Target.//	For MicroBlaze, opb_timer is used. The opb_timer can be directly//	connected to MicroBlaze or connected through Interrupt Controller.////--------------------------------------------------------------------int microblaze_init(void){	// Register profile_intr_handler	// 1. If timer is connected to Interrupt Controller, register the handler	//    to Interrupt Controllers vector table.	// 2. If timer is directly connected to MicroBlaze, register the handler	//    as Interrupt handler	Xil_ExceptionInit();#ifdef TIMER_CONNECT_INTC	XIntc_RegisterHandler( INTC_BASEADDR, PROFILE_TIMER_INTR_ID,			     (XInterruptHandler)profile_intr_handler,(void*)0);#else	Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,				     (Xil_ExceptionHandler)profile_intr_handler,				     (void *)0) ;#endif	// Initialize the timer with Timer Ticks	opb_timer_init() ;	// Enable Interrupts in the System, if Profile Timer is the only Interrupt	// in the System.#ifdef ENABLE_SYS_INTR#ifdef TIMER_CONNECT_INTC	XIntc_MasterEnable( INTC_BASEADDR );	XIntc_SetIntrSvcOption( INTC_BASEADDR, XIN_SVC_ALL_ISRS_OPTION);	XIntc_EnableIntr( INTC_BASEADDR, PROFILE_TIMER_INTR_MASK );	Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,				     (Xil_ExceptionHandler)XIntc_DeviceInterruptHandler,(void *)0);#endif#endif	Xil_ExceptionEnable();	return 0;}#endif	// PROC_MICROBLAZE//--------------------------------------------------------------------// Cortex A9 Target - Timer related functions//--------------------------------------------------------------------#ifdef PROC_CORTEXA9//--------------------------------------------------------------------// Initialize the Profile Timer for Cortex A9 Target.//	The scu private timer is connected to the Scu GIC controller.////--------------------------------------------------------------------int scu_timer_init( void ){	// set the number of cycles the timer counts before interrupting	// scu timer runs at half the cpu clock	XScuTimer_SetLoadReg(PROFILE_TIMER_BASEADDR, timer_clk_ticks/2);	// clear any pending interrupts	XScuTimer_SetIntrReg(PROFILE_TIMER_BASEADDR, 1);	// enable interrupts, auto-reload mode and start the timer	XScuTimer_SetControlReg(PROFILE_TIMER_BASEADDR, XSCUTIMER_CONTROL_IRQ_ENABLE_MASK |				XSCUTIMER_CONTROL_AUTO_RELOAD_MASK | XSCUTIMER_CONTROL_ENABLE_MASK);	return 0;}int cortexa9_init(void){	Xil_ExceptionInit();	XScuGic_DeviceInitialize(0);	/*	 * Connect the interrupt controller interrupt handler to the hardware	 * interrupt handling logic in the processor.	 */	Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_IRQ_INT,				(Xil_ExceptionHandler)XScuGic_DeviceInterruptHandler,				(void *)0);	/*	 * Connect the device driver handler that will be called when an	 * interrupt for the device occurs, the handler defined above performs	 * the specific interrupt processing for the device.	 */	XScuGic_RegisterHandler(SCUGIC_CPU_BASEADDR,				PROFILE_TIMER_INTR_ID,				(Xil_ExceptionHandler)profile_intr_handler,				(void *)0);	/*	 * Enable the interrupt for scu timer.	 */	XScuGic_EnableIntr(SCUGIC_DIST_BASEADDR, PROFILE_TIMER_INTR_ID);	/*	 * Enable interrupts in the Processor.	 */	Xil_ExceptionEnableMask(XIL_EXCEPTION_IRQ);	/*	 * Initialize the timer with Timer Ticks	 */	scu_timer_init() ;	Xil_ExceptionEnable();	return 0;}#endif	// PROC_CORTEXA9

⌨️ 快捷键说明

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