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

📄 xps2_intr.c

📁 基于FPGA的防火墙系统设计.rar
💻 C
字号:
/* $Id: xps2_intr.c,v 1.1 2006/02/16 23:45:09 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 xps2_intr.c** This file contains the functions that are related to interrupt processing* for the PS/2 driver.** <pre>* MODIFICATION HISTORY:** Ver   Who  Date     Changes* ----- ---- -------- -----------------------------------------------* 1.00a ch   06/18/02 First release* </pre>******************************************************************************//***************************** Include Files ********************************/#include "xps2.h"#include "xps2_i.h"#include "xio.h"/************************** Constant Definitions ****************************//**************************** Type Definitions ******************************//***************** Macros (Inline Functions) Definitions ********************//************************** Variable Definitions ****************************/typedef void (*Handler)(XPs2 *InstancePtr);/************************** Function Prototypes *****************************/static void ReceiveDataHandler(XPs2 *InstancePtr);static void ReceiveErrorHandler(XPs2 *InstancePtr);static void ReceiveOverflowHandler(XPs2 *InstancePtr);static void SendDataHandler(XPs2 *InstancePtr);static void SendErrorHandler(XPs2 *InstancePtr);static void TimeoutHandler(XPs2 *InstancePtr);/****************************************************************************//**** This function sets the handler that will be called when an event (interrupt)* occurs in the driver. The purpose of the handler is to allow application* specific processing to be performed.** @param    InstancePtr is a pointer to the XPs2 instance to be worked on.* @param    FuncPtr is the pointer to the callback function.* @param    CallBackRef is the upper layer callback reference passed back when*           the callback function is invoked.** @return** None.** @notes** There is no assert on the CallBackRef since the driver doesn't know what it* is (nor should it)******************************************************************************/void XPs2_SetHandler(XPs2 *InstancePtr, XPs2_Handler FuncPtr,                     void *CallBackRef){    /*     * Assert validates the input arguments     * CallBackRef not checked, no way to know what is valid     */    XASSERT_VOID(InstancePtr != XNULL);    XASSERT_VOID(FuncPtr != XNULL);    XASSERT_VOID(InstancePtr->IsReady == XCOMPONENT_IS_READY);    InstancePtr->Handler = FuncPtr;    InstancePtr->CallBackRef = CallBackRef;}/****************************************************************************//**** This function is the interrupt handler for the PS/2 driver.* It must be connected to an interrupt system by the user such that it is* called when an interrupt for any PS/2 port occurs. This function does * not save or restore the processor context such that the user must* ensure this occurs.** @param    InstancePtr contains a pointer to the instance of the PS/2 port*           that the interrupt is for.** @return** None.** @note** None.*******************************************************************************/void XPs2_InterruptHandler(XPs2 *InstancePtr){    Xuint8 IntrStatus;    XASSERT_VOID(InstancePtr != XNULL);    /*     * Read the interrupt status register to determine which     * interrupt is active     */    IntrStatus = XPs2_mGetIntrStatus(InstancePtr->BaseAddress);    if (IntrStatus & XPS2_INT_WDT_TOUT)    {        TimeoutHandler(InstancePtr);    }    if (IntrStatus & XPS2_INT_RX_ERR)    {        ReceiveErrorHandler(InstancePtr);    }    if (IntrStatus & XPS2_INT_RX_OVF)    {        ReceiveOverflowHandler(InstancePtr);    }    if (IntrStatus & XPS2_INT_TX_NOACK)    {        SendErrorHandler(InstancePtr);    }    if (IntrStatus & XPS2_INT_RX_FULL)    {        ReceiveDataHandler(InstancePtr);    }    if (IntrStatus & XPS2_INT_TX_ACK)    {        SendDataHandler(InstancePtr);    }}/****************************************************************************//**** This function enables the PS/2 interrupts.** @param    InstancePtr is a pointer to the XPs2 instance to be worked on.** @return** None.** @note** None.******************************************************************************/void XPs2_EnableInterrupt(XPs2 *InstancePtr){    /*     * ASSERT the arguments     */    XASSERT_VOID(InstancePtr != XNULL);    XASSERT_VOID(InstancePtr->IsReady == XCOMPONENT_IS_READY);    /*     * Enable all receiver interrupts (RX_FULL, RX_ERR, RX_OVF)     * transmitter interrupts are enabled when sending data.     */    XPs2_mEnableIntr(InstancePtr->BaseAddress, XPS2_INT_RX_ALL);}/****************************************************************************//**void XPs2_DisableInterrupt** This function disables the PS/2 interrupts.** @param    InstancePtr is a pointer to the XPs2 instance to be worked on.** @return** None.** @note** None.******************************************************************************/void XPs2_DisableInterrupt(XPs2 *InstancePtr){    /*     * ASSERT the arguments     */    XASSERT_VOID(InstancePtr != XNULL);    XASSERT_VOID(InstancePtr->IsReady == XCOMPONENT_IS_READY);    /*     * Disable all interrupts.     */    XPs2_mDisableIntr(InstancePtr->BaseAddress, XPS2_INT_ALL);}/****************************************************************************//**** This function handles the interrupt when data is received.** @param    InstancePtr is a pointer to the XPs2 instance to be worked on.** @return** None.** @note** None.******************************************************************************/static void ReceiveDataHandler(XPs2 *InstancePtr){    XPs2_mClearIntr(InstancePtr->BaseAddress, XPS2_INT_RX_FULL);    /*     * If there are bytes still to be received in the specified buffer     * go ahead and receive them     */    if (InstancePtr->ReceiveBuffer.RemainingBytes != 0)    {        XPs2_ReceiveBuffer(InstancePtr);    }    /*     * If the last byte of a message was received then call the application     * handler, this code should not use an else from the previous check of     * the number of bytes to receive because the call to receive the buffer     * updates the bytes to receive     */    if (InstancePtr->ReceiveBuffer.RemainingBytes == 0)    {        InstancePtr->Handler(InstancePtr->CallBackRef, XPS2_EVENT_RECV_DATA,                             InstancePtr->ReceiveBuffer.RequestedBytes -                             InstancePtr->ReceiveBuffer.RemainingBytes);    }    /*     * Update the receive stats to reflect the receive interrupt     */    InstancePtr->Stats.ReceiveInterrupts++;}/****************************************************************************//**** This function handles the receive error interrupt.** @param    InstancePtr is a pointer to the XPs2 instance to be worked on.** @return** None.** @note** None.******************************************************************************/static void ReceiveErrorHandler(XPs2 *InstancePtr){    XPs2_mClearIntr(InstancePtr->BaseAddress, XPS2_INT_RX_ERR);    /*     * Call the application handler with an error code     */    InstancePtr->Handler(InstancePtr->CallBackRef, XPS2_EVENT_RECV_ERROR,                         InstancePtr->ReceiveBuffer.RequestedBytes -                         InstancePtr->ReceiveBuffer.RemainingBytes);    /*     * Update the LastError variable     */    InstancePtr->LastErrors |= XPS2_ERROR_RX_ERR_MASK;    /*     * Update the receive stats to reflect the receive error interrupt     */    InstancePtr->Stats.ReceiveErrors++;}/****************************************************************************//**** This function handles the receive overflow interrupt.** @param    InstancePtr is a pointer to the XPs2 instance to be worked on.** @return** None.** @note** None.******************************************************************************/static void ReceiveOverflowHandler(XPs2 *InstancePtr){    XPs2_mClearIntr(InstancePtr->BaseAddress, XPS2_INT_RX_OVF);    /*     * Call the application handler with an error code     */    InstancePtr->Handler(InstancePtr->CallBackRef, XPS2_EVENT_RECV_OVF,                         InstancePtr->ReceiveBuffer.RequestedBytes -                         InstancePtr->ReceiveBuffer.RemainingBytes);    /*     * Update the LastError variable     */    InstancePtr->LastErrors |= XPS2_ERROR_RX_OVF_MASK;    /*     * Update the receive stats to reflect the receive interrupt     */    InstancePtr->Stats.ReceiveOverflowErrors++;}/****************************************************************************//**** This function handles the interrupt when data has been sent, the transmit* transmitter holding register is empty.** @param    InstancePtr is a pointer to the XPs2 instance to be worked on.** @return** None.** @note** None.******************************************************************************/static void SendDataHandler(XPs2 *InstancePtr){    XPs2_mClearIntr(InstancePtr->BaseAddress, XPS2_INT_TX_ACK);    /*     * If there are no bytes to be sent from the specified buffer then disable     * the transmit interrupt     */    if (InstancePtr->SendBuffer.RemainingBytes == 0)    {        XPs2_mDisableIntr(InstancePtr->BaseAddress, XPS2_INT_TX_ALL);        /*         * Call the application handler to indicate the data has been sent         */        InstancePtr->Handler(InstancePtr->CallBackRef, XPS2_EVENT_SENT_DATA,                             InstancePtr->SendBuffer.RequestedBytes -                             InstancePtr->SendBuffer.RemainingBytes);    }    /*     * Otherwise there is still more data to send in the specified buffer     * so go ahead and send it     */    else    {        XPs2_SendBuffer(InstancePtr);    }    /*     * Update the transmit stats to reflect the transmit interrupt     */    InstancePtr->Stats.TransmitInterrupts++;}/****************************************************************************//**** This function handles the interrupt when a transmit is not acknowledged** @param    InstancePtr is a pointer to the XPs2 instance to be worked on.** @return** None.** @note** None.******************************************************************************/static void SendErrorHandler(XPs2 *InstancePtr){    XPs2_mClearIntr(InstancePtr->BaseAddress, XPS2_INT_TX_NOACK);    /*     * Call the application handler     */    InstancePtr->Handler(InstancePtr->CallBackRef, XPS2_EVENT_SENT_NOACK,                         InstancePtr->SendBuffer.RequestedBytes -                         InstancePtr->SendBuffer.RemainingBytes);    /*     * Update the LastError variable     */    InstancePtr->LastErrors |= XPS2_ERROR_TX_NOACK_MASK;    /*     * Update the transmit stats to reflect the transmit interrupt     */    InstancePtr->Stats.TransmitErrors++;}/****************************************************************************//**** This function handles the interrupt when timeout occurrs** @param    InstancePtr is a pointer to the XPs2 instance to be worked on.** @return** None.** @note** None.******************************************************************************/static void TimeoutHandler(XPs2 *InstancePtr){    XPs2_mClearIntr(InstancePtr->BaseAddress, XPS2_INT_WDT_TOUT);    /*     * Call the application handler     */    InstancePtr->Handler(InstancePtr->CallBackRef, XPS2_EVENT_TIMEOUT,                         InstancePtr->SendBuffer.RequestedBytes -                         InstancePtr->SendBuffer.RemainingBytes);    /*     * Update the LastError variable     */    InstancePtr->LastErrors |=  XPS2_ERROR_WDT_TOUT_MASK;    /*     * Update the transmit stats to reflect the transmit interrupt     */    InstancePtr->Stats.TransmitErrors++;}

⌨️ 快捷键说明

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