diff --git a/XilinxProcessorIPLib/drivers/ttcps/data/ttcps_header.h b/XilinxProcessorIPLib/drivers/ttcps/data/ttcps_header.h new file mode 100755 index 00000000..0f25a63a --- /dev/null +++ b/XilinxProcessorIPLib/drivers/ttcps/data/ttcps_header.h @@ -0,0 +1,41 @@ +/****************************************************************************** +* +* Copyright (C) 2014 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +* XILINX CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +#ifndef TTCPS_HEADER_H /* prevent circular inclusions */ +#define TTCPS_HEADER_H /* by using protection macros */ + +#include "xil_assert.h" +#include "xil_types.h" +#include "xstatus.h" + +int TmrInterruptExample(XTtcPs *TtcPsInst,u16 DeviceID,u16 TtcTickIntrID, + XScuGic *InterruptController); +#endif diff --git a/XilinxProcessorIPLib/drivers/ttcps/data/ttcps_tapp.tcl b/XilinxProcessorIPLib/drivers/ttcps/data/ttcps_tapp.tcl new file mode 100755 index 00000000..8b67d6bb --- /dev/null +++ b/XilinxProcessorIPLib/drivers/ttcps/data/ttcps_tapp.tcl @@ -0,0 +1,166 @@ +############################################################################### +# +# Copyright (C) 2014 Xilinx, Inc. All rights reserved. +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# Use of the Software is limited solely to applications: +# (a) running on a Xilinx device, or +# (b) that interact with a Xilinx device through a bus or interconnect. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# XILINX CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +# OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +# +# Except as contained in this notice, the name of the Xilinx shall not be used +# in advertising or otherwise to promote the sale, use or other dealings in +# this Software without prior written authorization from Xilinx. +# +############################################################################### +############################################################################## +# +# Modification History +# +# Ver Who Date Changes +# ----- ---- -------- ----------------------------------------------- +# 3.0 pkp 12/01/15 Initial Release +############################################################################## + +# Uses $XILINX_EDK/bin/lib/xillib_sw.tcl +# ----------------------------------------------------------------- +# Software Project Types (swproj): +# 0 : MemoryTest - Calls basic memorytest routines from common driver dir +# 1 : PeripheralTest - Calls any existing polled_example and/or selftest +# ----------------------------------------------------------------- + +# ----------------------------------------------------------------- +# TCL Procedures: +# ----------------------------------------------------------------- + +proc gen_include_files {swproj mhsinst} { + + if {$swproj == 0} { + return "" + } + if {$swproj == 1} { + set inc_file_lines {xttcps.h ttcps_header.h} + } + return $inc_file_lines +} + +proc gen_src_files {swproj mhsinst} { + if {$swproj == 0} { + return "" + } + if {$swproj == 1} { + + set inc_file_lines {examples/xttcps_tapp_example.c data/ttcps_header.h} + + return $inc_file_lines + } +} + +proc gen_testfunc_def {swproj mhsinst} { + return "" +} + +proc gen_init_code {swproj mhsinst} { + + if {$swproj == 0} { + return "" + } + if {$swproj == 1} { + + set ipname [get_property NAME $mhsinst] + set decl " static XTtcPs ${ipname};" + set inc_file_lines $decl + return $inc_file_lines + + } + +} + +proc gen_testfunc_call {swproj mhsinst} { + + if {$swproj == 0} { + return "" + } + + set ipname [get_property NAME $mhsinst] + set deviceid [::hsi::utils::get_ip_param_name $mhsinst "DEVICE_ID"] + set stdout [get_property CONFIG.STDOUT [get_os]] + if { $stdout == "" || $stdout == "none" } { + set hasStdout 0 + } else { + set hasStdout 1 + } + set intsnum [string range $deviceid 13 13] + set intsnum [format $intsnum %d] + set device_id [expr {$intsnum * 3}] + set deviceidname $deviceid + set deviceid [format %s%d%s [string range $deviceidname 0 12] $device_id [string range $deviceidname 14 end]] + set isintr [::hsi::utils::is_ip_interrupting_current_proc $mhsinst] + set intcvar intc + set testfunc_call "" + + if {${hasStdout} == 0} { + + if {$isintr == 1} { + set intr_id [format %s_INTR [string range $deviceid 0 13]] + set intr_id [string toupper $intr_id] + + append testfunc_call " + + { + int Status; + Status = TmrInterruptExample(&$ipname, \\ + $deviceid, \\ + $intr_id, &${intcvar}); + }" + + } + + + } else { + + if {$isintr == 1} { + set intr_id [format %s_INTR [string range $deviceid 0 13]] + set intr_id [string toupper $intr_id] + + append testfunc_call " + { + int Status; + + print(\"\\r\\n Running Interrupt Test for ${ipname}...\\r\\n\"); + + Status = TmrInterruptExample(&$ipname, \\ + $deviceid, \\ + $intr_id, &${intcvar}); + + if (Status == 0) { + print(\"TtcIntrExample PASSED\\r\\n\"); + } + else { + print(\"TtcIntrExample FAILED\\r\\n\"); + } + + }" + + } + + } + + return $testfunc_call +} \ No newline at end of file diff --git a/XilinxProcessorIPLib/drivers/ttcps/examples/xttcps_tapp_example.c b/XilinxProcessorIPLib/drivers/ttcps/examples/xttcps_tapp_example.c new file mode 100755 index 00000000..256c2fbd --- /dev/null +++ b/XilinxProcessorIPLib/drivers/ttcps/examples/xttcps_tapp_example.c @@ -0,0 +1,426 @@ +/****************************************************************************** +* +* Copyright (C) 2014 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +* XILINX CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* @file xttcps_tapp_example.c +* +* This file contains an example uses ttc to generate interrupt and +* update a flag which is checked in interrupt example to confirm whether the +* interrupt is generated or not. +* +* +* @note +* +*
+* MODIFICATION HISTORY:
+*
+* Ver  Who    Date     Changes
+* ---- ------ -------- ---------------------------------------------
+* 3.00 pkp    01/12/15 First release
+*
+******************************************************************************/ + +/***************************** Include Files *********************************/ + +#include +#include +#include "xparameters.h" +#include "xstatus.h" +#include "xil_io.h" +#include "xil_exception.h" +#include "xttcps.h" +#include "xscugic.h" +#include "xil_printf.h" + +/************************** Constant Definitions *****************************/ + +/* + * The following constants map to the XPAR parameters created in the + * xparameters.h file. They are only defined here such that a user can easily + * change all the needed parameters in one place. + */ +#ifndef TESTAPP_GEN +#define TTC_TICK_DEVICE_ID XPAR_XTTCPS_0_DEVICE_ID +#define TTC_TICK_INTR_ID XPAR_XTTCPS_0_INTR +#endif + +#define INTC_DEVICE_ID XPAR_SCUGIC_0_DEVICE_ID +#define TICK_TIMER_FREQ_HZ 100 /* Tick timer counter's output frequency */ + +/**************************** Type Definitions *******************************/ +typedef struct { + u32 OutputHz; /* Output frequency */ + u16 Interval; /* Interval value */ + u8 Prescaler; /* Prescaler value */ + u16 Options; /* Option settings */ +} TmrCntrSetup; + +/***************** Macros (Inline Functions) Definitions *********************/ + + +/************************** Function Prototypes ******************************/ + +int TmrInterruptExample(XTtcPs *TtcPsInst,u16 DeviceID, u16 TtcTickIntrID, + XScuGic *InterruptController); /* Main test */ + +/* Set up routines for timer counters */ +static int SetupTicker(XTtcPs *TtcPsInst,u16 DeviceID, u16 TtcTickIntrID, + XScuGic *InterruptController); +static int SetupTimer(u16 DeviceID, XTtcPs *TtcPsInst); + +static int SetupInterruptSystem(u16 IntcDeviceID, XScuGic *IntcInstancePtr); + +static void TickHandler(void *CallBackRef); + +/************************** Variable Definitions *****************************/ +static TmrCntrSetup SettingsTable= + {TICK_TIMER_FREQ_HZ, 0, 0, 0}; /* Ticker timer counter initial setup, + only output freq */ + +static volatile u8 UpdateFlag; /* Flag to update the seconds counter */ + +#ifndef TESTAPP_GEN +XScuGic InterruptController; /* Interrupt controller instance */ +static XTtcPs TtcPsInst; /* Timer counter instance */ +#endif + + +/*****************************************************************************/ +/** +* +* This is the main function that calls the TTC interrupt example. +* +* @param None +* +* @return +* - XST_SUCCESS to indicate Success +* - XST_FAILURE to indicate a Failure. +* +* @note None. +* +*****************************************************************************/ +#ifndef TESTAPP_GEN +int main(void) +{ + int Status; + + xil_printf("Starting Timer interrupt Example \r\n"); + Status = TmrInterruptExample(&TtcPsInst, TTC_TICK_DEVICE_ID, + TTC_TICK_INTR_ID, &InterruptController); + if (Status != XST_SUCCESS) { + xil_printf("Timer interrupt Example failed \n!"); + return XST_FAILURE; + } + + xil_printf("Timer interrupt Example passed \n!"); + return XST_SUCCESS; +} +#endif +/*****************************************************************************/ +/** +* +* This is the main function of the interrupt example. +* +* +* @param TtcPsInst is a pointer to the ttc instance. +* @param DeviceID is the unique ID for the device. +* @param TtcTickIntrID is the unique interrupt ID for the timer. +* @param InterruptController is a pointer to the interrupt controller +* instance.. +* +* @return XST_SUCCESS to indicate success, else XST_FAILURE to indicate +* a Failure. +* +****************************************************************************/ +int TmrInterruptExample(XTtcPs *TtcPsInst,u16 DeviceID,u16 TtcTickIntrID, + XScuGic *InterruptController) +{ + int Status,Index; + + /* + * Connect the Intc to the interrupt subsystem such that interrupts can + * occur. This function is application specific. + */ + Status = SetupInterruptSystem(INTC_DEVICE_ID, InterruptController); + if (Status != XST_SUCCESS) { + return XST_FAILURE; + } + /* + * TTC interrupt example is setup and run for all the three timer/counter + * one after another. + */ + for(Index = 0; Index < 3; Index++){ + + UpdateFlag = 0; + + /* + * Set up the Ticker timer + */ + + Status = SetupTicker(TtcPsInst,DeviceID,TtcTickIntrID, + InterruptController); + /* + * The Ticker interrupt sets a flag for update. + * Wait until the flag is updated by interrupt routine + */ + + while (!UpdateFlag); + DeviceID++; + TtcTickIntrID++; + + /* + * Stop the counter + */ + XTtcPs_Stop(TtcPsInst); + } + + + return XST_SUCCESS; +} + +/****************************************************************************/ +/** +* +* This function sets up the Ticker timer. +* +* @param TtcPsInst is a pointer to the ttc instance. +* @param DeviceID is the unique ID for the device. +* @param TtcTickIntrID is the unique interrupt ID for the timer. +* @param InterruptController is a pointer to the interrupt controller +* instance.. +* +* @return XST_SUCCESS if everything sets up well, XST_FAILURE otherwise. +* +*****************************************************************************/ +int SetupTicker(XTtcPs *TtcPsInst,u16 DeviceID,u16 TtcTickIntrID, + XScuGic *InterruptController) +{ + int Status; + TmrCntrSetup *TimerSetup; + XTtcPs *TtcPsTick; + + TimerSetup = &SettingsTable; + + /* + * Set up appropriate options for Ticker: interval mode without + * waveform output. + */ + TimerSetup->Options |= (XTTCPS_OPTION_INTERVAL_MODE | + XTTCPS_OPTION_WAVE_DISABLE); + + /* + * Calling the timer setup routine + * . initialize device + * . set options + */ + Status = SetupTimer(DeviceID,TtcPsInst); + if(Status != XST_SUCCESS) { + return Status; + } + + TtcPsTick = TtcPsInst; + + /* + * Connect to the interrupt controller + */ + Status = XScuGic_Connect(InterruptController, TtcTickIntrID, + (Xil_InterruptHandler)TickHandler, (void *)TtcPsTick); + if (Status != XST_SUCCESS) { + return XST_FAILURE; + } + + + /* + * Enable the interrupt for the Timer counter + */ + XScuGic_Enable(InterruptController, TtcTickIntrID); + + /* + * Enable the interrupts for the tick timer/counter + */ + XTtcPs_EnableInterrupts(TtcPsTick, XTTCPS_IXR_INTERVAL_MASK); + + /* + * Start the tick timer/counter + */ + XTtcPs_Start(TtcPsTick); + + return Status; +} +/****************************************************************************/ +/** +* +* This function sets up a timer counter device, using the information in its +* setup structure. +* . initialize device +* . set options +* . set interval and prescaler value for given output frequency. +* +* @param DeviceID is the unique ID for the device. +* @param TtcPsInst is a pointer to the ttc instance. +* +* @return XST_SUCCESS if successful, otherwise XST_FAILURE. +* +*****************************************************************************/ +int SetupTimer(u16 DeviceID,XTtcPs *TtcPsInst) +{ + int Status; + XTtcPs_Config *Config; + XTtcPs *Timer; + TmrCntrSetup *TimerSetup; + + TimerSetup = &SettingsTable; + + Timer = TtcPsInst; + /* + * Stop the timer first + */ + XTtcPs_Stop(Timer); + + /* + * Look up the configuration based on the device identifier + */ + Config = XTtcPs_LookupConfig(DeviceID); + if (NULL == Config) { + return XST_FAILURE; + } + /* + * Initialize the device + */ + Status = XTtcPs_CfgInitialize(Timer, Config, Config->BaseAddress); + if (Status != XST_SUCCESS) { + return XST_FAILURE; + } + + /* + * Set the options + */ + XTtcPs_SetOptions(Timer, TimerSetup->Options); + + /* + * Timer frequency is preset in the TimerSetup structure, + * however, the value is not reflected in its other fields, such as + * IntervalValue and PrescalerValue. The following call will map the + * frequency to the interval and prescaler values. + */ + XTtcPs_CalcIntervalFromFreq(Timer, TimerSetup->OutputHz, + &(TimerSetup->Interval), &(TimerSetup->Prescaler)); + + /* + * Set the interval and prescale + */ + XTtcPs_SetInterval(Timer, TimerSetup->Interval); + XTtcPs_SetPrescaler(Timer, TimerSetup->Prescaler); + + return XST_SUCCESS; +} + +/****************************************************************************/ +/** +* +* This function setups the interrupt system such that interrupts can occur. +* This function is application specific since the actual system may or may not +* have an interrupt controller. The TTC could be directly connected to a +* processor without an interrupt controller. The user should modify this +* function to fit the application. +* +* @param IntcDeviceID is the unique ID of the interrupt controller +* @param IntcInstacePtr is a pointer to the interrupt controller +* instance. +* +* @return XST_SUCCESS if successful, otherwise XST_FAILURE. +* +*****************************************************************************/ +static int SetupInterruptSystem(u16 IntcDeviceID, + XScuGic *IntcInstancePtr) +{ + int Status; + XScuGic_Config *IntcConfig; /* The configuration parameters of the + interrupt controller */ + + /* + * Initialize the interrupt controller driver + */ + IntcConfig = XScuGic_LookupConfig(IntcDeviceID); + if (NULL == IntcConfig) { + return XST_FAILURE; + } + + Status = XScuGic_CfgInitialize(IntcInstancePtr, IntcConfig, + IntcConfig->CpuBaseAddress); + if (Status != XST_SUCCESS) { + return XST_FAILURE; + } + + + /* + * Connect the interrupt controller interrupt handler to the hardware + * interrupt handling logic in the ARM processor. + */ + Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_IRQ_INT, + (Xil_ExceptionHandler) XScuGic_InterruptHandler, + IntcInstancePtr); + + + /* + * Enable interrupts in the ARM + */ + Xil_ExceptionEnable(); + + return XST_SUCCESS; +} + +/***************************************************************************/ +/** +* +* This function is the handler which updates the flag when TTC interrupt is +* occurred +* +* @param CallBackRef contains a callback reference from the driver, in +* this case it is the instance pointer for the TTC driver. +* +* @return None. +* +*****************************************************************************/ +static void TickHandler(void *CallBackRef) +{ + u32 StatusEvent; + /* + * Read the interrupt status, then write it back to clear the interrupt. + */ + StatusEvent = XTtcPs_GetInterruptStatus((XTtcPs *)CallBackRef); + XTtcPs_ClearInterruptStatus((XTtcPs *)CallBackRef, StatusEvent); + + /*update the flag if interrupt has been occurred*/ + UpdateFlag = TRUE; + +}