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

📄 xintc_selftest.c

📁 基于Xilinx-XUPV2P开发平台的嵌入式系统实验例程:实验5高级应用程序编写
💻 C
字号:
/* $Id: xintc_selftest.c,v 1.2 2005/01/04 17:48:57 moleres Exp $ *//********************************************************************************       XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION "AS IS"*       AS A COURTESY TO YOU, SOLELY FOR USE IN DEVELOPING PROGRAMS AND*       SOLUTIONS FOR XILINX DEVICES.  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.**       (c) Copyright 2002 Xilinx Inc.*       All rights reserved.*******************************************************************************//*****************************************************************************//**** @file xintc_selftest.c** Contains diagnostic self-test functions for the XIntc component.  This file* requires other files of the component to be linked in also.** <pre>* MODIFICATION HISTORY:** Ver   Who  Date     Changes* ----- ---- -------- -----------------------------------------------* 1.00b jhl  02/21/02 First release* </pre>*******************************************************************************//***************************** Include Files *********************************/#include "xbasic_types.h"#include "xintc.h"#include "xintc_i.h"/************************** Constant Definitions *****************************/#define XIN_TEST_MASK 1/**************************** Type Definitions *******************************//***************** Macros (Inline Functions) Definitions *********************//************************** Function Prototypes ******************************//************************** Variable Definitions *****************************//*****************************************************************************//**** Run a self-test on the driver/device. This is a destructive test.** This involves forcing interrupts into the controller and verifying that they* are recognized and can be acknowledged. This test will not succeed if the* interrupt controller has been started in real mode such that interrupts* cannot be forced.** @param    InstancePtr is a pointer to the XIntc instance to be worked on.** @return** - XST_SUCCESS if self-test is successful.* - XST_INTC_FAIL_SELFTEST if the Interrupt controller fails the self-test.*   It will fail the self test if the device has previously been started in*   real mode.** @note** None.*******************************************************************************/XStatus XIntc_SelfTest(XIntc *InstancePtr){    Xuint32 CurrentMIE;    Xuint32 CurrentISR;    Xuint32 Temp;    /*     * assert the arguments     */    XASSERT_NONVOID(InstancePtr != XNULL);    XASSERT_NONVOID(InstancePtr->IsReady == XCOMPONENT_IS_READY);    CurrentMIE = XIntc_In32(InstancePtr->BaseAddress +                          XIN_MER_OFFSET);    /*     * acknowledge all pending interrupts by reading the interrupt status     * register and writing the value to the acknowledge register     */    Temp = XIntc_In32(InstancePtr->BaseAddress + XIN_ISR_OFFSET);    XIntc_Out32(InstancePtr->BaseAddress + XIN_IAR_OFFSET, Temp);    /*     * verify that there are no interrupts by reading the interrupt status     */    CurrentISR = XIntc_In32(InstancePtr->BaseAddress + XIN_ISR_OFFSET);    /*     * ISR should be zero after all interrupts are acknowledged     */    if (CurrentISR != 0)    {        return XST_INTC_FAIL_SELFTEST;    }    /*     * set a bit in the ISR which simulates an interrupt     */    XIntc_Out32(InstancePtr->BaseAddress + XIN_ISR_OFFSET, XIN_TEST_MASK);    /*     * verify that it was set     */    CurrentISR = XIntc_In32(InstancePtr->BaseAddress +                          XIN_ISR_OFFSET);    if (CurrentISR != XIN_TEST_MASK)    {        return XST_INTC_FAIL_SELFTEST;    }    /*     * acknowledge the interrupt     */    XIntc_Out32(InstancePtr->BaseAddress + XIN_IAR_OFFSET, XIN_TEST_MASK);    /*     * read back the ISR to verify that the interrupt is gone     */    CurrentISR = XIntc_In32(InstancePtr->BaseAddress + XIN_ISR_OFFSET);    if (CurrentISR != 0)    {        return XST_INTC_FAIL_SELFTEST;    }    return XST_SUCCESS;}/*****************************************************************************//**** Allows software to simulate an interrupt in the interrupt controller.  This* function will only be successful when the interrupt controller has been* started in simulation mode.  Once it has been started in real mode,* interrupts cannot be simulated. A simulated interrupt allows the interrupt* controller to be tested without any device to drive an interrupt input* signal into it.** @param    InstancePtr is a pointer to the XIntc instance to be worked on.* @param    Id is the interrupt ID for which to simulate an interrupt.** @return** XST_SUCCESS if successful, or XST_FAILURE if the interrupt could not be* simulated because the interrupt controller is or has previously been in* real mode.** @note** None.*******************************************************************************/XStatus XIntc_SimulateIntr(XIntc *InstancePtr, Xuint8 Id){    Xuint32 Mask;    Xuint32 MasterEnable;    /*     * assert the arguments     */    XASSERT_NONVOID(InstancePtr != XNULL);    XASSERT_NONVOID(InstancePtr->IsReady == XCOMPONENT_IS_READY);    XASSERT_NONVOID(Id < XPAR_INTC_MAX_NUM_INTR_INPUTS);    /* get the contents of the master enable register and determine if     * hardware interrupts have already been enabled, if so, this is a write     * once bit such that simulation can't be done at this point because     * the ISR register is no longer writable by software     */    MasterEnable = XIntc_In32(InstancePtr->BaseAddress + XIN_MER_OFFSET);    if (MasterEnable & XIN_INT_HARDWARE_ENABLE_MASK)    {        return XST_FAILURE;    }    /*     * the Id is used to create the appropriate mask for the     * desired bit position. Id currently limited to 0 - 31     */    Mask = XIntc_BitPosMask[Id];    /*     * enable the selected interrupt source by reading the interrupt enable     * register and then modifying only the specified interrupt id enable     */    XIntc_Out32(InstancePtr->BaseAddress + XIN_ISR_OFFSET, Mask);    /* indicate the interrupt was successfully simulated */    return XST_SUCCESS;}

⌨️ 快捷键说明

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