?? usbtcdisp1582interrupt.c
字號(hào):
/* usbTcdIsp1582Interrupt.c - defines modules for interrupt handling *//* Copyright 2004 Wind River Systems, Inc. *//*Modification history--------------------01g,17sep04,ami WindView Instrumentation Changes01f,02aug04,mta Modification History Changes01e,19jul04,ami Coding Convention Changes01d,09jul04,mta Fixes based on pentium full speed testing01c,30jun04,pdg Bug fixes - isp1582 full speed testing01b,01jun04,mta Changes for Interrupt Mode01a,21apr04,ami First*//*DESCRIPTIONThis file implements the interrupt related functionalities of TCD(Target Controller Driver) for the Philips ISP 1582.INCLUDE FILES: usb/usbPlatform.h, usb/ossLib.h, usb/usbPciLib.h, usb/usb.h, usb/target/usbHalCommon.h, usb/target/usbTcd.h drv/usb/target/usbisp1582.h, drv/usb/target/usbIsp1582Eval.h, drv/usb/target/usbIsp1582Tcd.h, usb/target/usbPeriphInstr.h*//* includes */#include "usb/usbPlatform.h" #include "usb/ossLib.h" #include "usb/usbPciLib.h" #include "usb/usb.h" #include "usb/target/usbHalCommon.h" #include "usb/target/usbTcd.h" #include "drv/usb/target/usbIsp1582.h" #include "drv/usb/target/usbIsp1582Eval.h" #include "drv/usb/target/usbIsp1582Tcd.h"#include "usb/target/usbPeriphInstr.h"/********************************************************************************* usbTcdIsp1582Isr - isr of Isp 1582 TCD** This is the ISR for the Isp 1582 TCD.** RETURNS: N/A** ERRNO:* none** \NOMANUAL*/VOID usbTcdIsp1582Isr ( pVOID param /* ISR Paramter */ ) { pUSB_TCD_ISP1582_TARGET pTarget = NULL; /* USB_TCD_ISP1582_TARGET */ UINT16 data16 = 0 ; USBISP1582_DEBUG ("usbTcdIsp1582Isr: Entered...\n",0,0,0,0,0,0); if ( param == NULL ) { USBISP1582_ERROR ("usbTcdIsp1582Isr : Bad Parameters...\n",0,0,0,0,0,0); return; } pTarget = (pUSB_TCD_ISP1582_TARGET) param; /* Disable the Control Port */ USB_PCI_WORD_OUT((pTarget->ioBase + ISP1582EVAL_CNTL_PORT), ~(0x80)); /* Disable all interrupts by reseting bit GLINTENA of mode register */ /* Read the mode regsiter and then reset GLINTENA bit */ data16 = isp1582Read16 (pTarget , ISP1582_MODE_REG); data16 &= ~ISP1582_MODE_REG_GLINTENA; /* Write to mode register to disable interrupts */ isp1582Write16 (pTarget , ISP1582_MODE_REG ,data16 & ISP1582_MODE_REG_MASK); /* Call the HAL ISR */ (*pTarget->usbHalIsr)(pTarget->usbHalIsrParam); /* Enable Interrupts */ data16 |= ISP1582_MODE_REG_GLINTENA; isp1582Write16 (pTarget ,ISP1582_MODE_REG , data16 & ISP1582_MODE_REG_MASK); /* Enable the Control Port */ USB_PCI_WORD_OUT((pTarget->ioBase + ISP1582EVAL_CNTL_PORT) , 0x80); USBISP1582_DEBUG ("usbTcdIsp1582Isr: Exiting...\n",0,0,0,0,0,0); return; }/********************************************************************************* usbTcdIsp1582FncInterruptStatusGet - to get the interrupt status** This function returns the interrupt status i.e whether the reset interrupt,* suspend interrupt, resume interrupt, disconnect interrupt or endpoint* related interrupt is pending.** RETURNS : OK or ERROR, if the interrupt status is not retrieved successfully.** ERRNO:* \is* \i S_usbTcdLib_BAD_PARAM.* Bad Parameter is passed.* \ie** \NOMANUAL*/LOCAL STATUS usbTcdIsp1582FncInterruptStatusGet ( pTRB_INTERRUPT_STATUS_GET_CLEAR pTrb /* Trb to be executed */ ) { pTRB_HEADER pHeader = (pTRB_HEADER) pTrb; /* TRB_HEADER */ pUSB_TCD_ISP1582_TARGET pTarget = NULL; /* USB_TCD_ISP1582_TARGET */ UINT32 data32 = 0; UINT16 data16 = 0; UINT8 data8 = 0; UINT32 endpointIntMask = 0; /* endpoint interrupt mask */ /* WindView Instrumentation */ USB_TCD_LOG_EVENT(USB_TCD_ISP1582_INTERRUPT, "usbTcdIsp1582FncInterruptStatusGet entered...", USB_TCD_ISP582_WV_FILTER); USBISP1582_DEBUG ("usbTcdIsp1582FncInterruptStatusGet: Entered...\n", 0,0,0,0,0,0); /* Validate Parameters */ if ((pHeader == NULL) || (pHeader->trbLength < sizeof (TRB_HEADER)) || (pHeader->handle == NULL)) { /* WindView Instrumentation */ USB_TCD_LOG_EVENT(USB_TCD_ISP1582_INTERRUPT, "usbTcdIsp1582FncInterruptStatusGet exiting: Bad Parameter Received...", USB_TCD_ISP582_WV_FILTER); USBISP1582_ERROR ("usbTcdIsp1582FncInterruptStatusGet : \ Bad Parameters...\n",0,0,0,0,0,0); return ossStatus (S_usbTcdLib_BAD_PARAM); } pTarget = (pUSB_TCD_ISP1582_TARGET) pHeader->handle; /* Reset uInterruptStatus */ pTrb->uInterruptStatus = 0; /* Read the Interrupt Status Register */ data32 = isp1582Read32 ( pTarget , ISP1582_INT_REG); /* * While reading interrupt register always and it with the interrupt * Enable Register. */ data32 &= isp1582Read32 ( pTarget , ISP_1582_INT_ENABLE_REG); /* If bit 0 is set then its a Bus Reset Interrupt. */ if (( data32 & ISP1582_INT_REG_BRST) != 0) { USBISP1582_DEBUG ("usbTcdIsp1582FncInterruptStatusGet: Reset Interrupt \ ...\n",0,0,0,0,0,0); /* WindView Instrumentation */ USB_TCD_LOG_EVENT(USB_TCD_ISP1582_INTERRUPT, "usbTcdIsp1582FncInterruptStatusGet: Reset Event Occured...", USB_TCD_ISP582_WV_FILTER); /* Reinilialize the registers */ /* Mode Register */ data16 = isp1582Read16 (pTarget , ISP1582_MODE_REG); data16 |= ISP1582_MODE_REG_CLKAON; data16 |= ISP1582_MODE_REG_POWRON; data16 |= ISP1582_MODE_REG_DMACLKON; data16 |= ISP1582_MODE_REG_GLINTENA; isp1582Write16 (pTarget , ISP1582_MODE_REG , data16); /* write 0 to OTG register */ isp1582Write8(pTarget,ISP_1582_OTG_REG, 0); /* Interrupt Configuration Register */ data8 = ((ISP1582_INT_CONF_REG_CDBGMOD_SHIFT( ISP1582_INT_CONF_REG_CDBGMOD_ACK_ONLY)) | (ISP1582_INT_CONF_REG_DDBGMODIN_SHIFT( ISP1582_INT_CONF_REG_DDBGMODIN_ACK_ONLY)) | (ISP1582_INT_CONF_REG_DDBGMODOUT_SHIFT( ISP1582_INT_CONF_REG_DDBGMODOUT_ACK_NYET))); isp1582Write8 (pTarget , ISP1582_INT_CONFIG_REG , data8); /* Interrupt Enable Register */ isp1582Write32 (pTarget , ISP_1582_INT_ENABLE_REG , (ISP1582_INT_ENABLE_REG_IEBRST | ISP1582_INT_ENABLE_REG_IESUSP | ISP1582_INT_ENABLE_REG_IERESM )); pTrb->uInterruptStatus |= USBTCD_RESET_INTERRUPT_MASK; } /* If bit 3 is set then Suspend event has occured */ if (( data32 & ISP1582_INT_REG_SUSP) != 0) { /* WindView Instrumentation */ USB_TCD_LOG_EVENT(USB_TCD_ISP1582_INTERRUPT, "usbTcdIsp1582FncInterruptStatusGet: Suspend Event Occured...", USB_TCD_ISP582_WV_FILTER); USBISP1582_DEBUG ("usbTcdIsp1582FncInterruptStatusGet: Suspend Interrupt\ ...\n",0,0,0,0,0,0); pTrb->uInterruptStatus |= USBTCD_SUSPEND_INTERRUPT_MASK; } /* If bit 4 is set then Resume event has occured */ if (( data32 & ISP1582_INT_REG_RESM) != 0) { USBISP1582_DEBUG ("usbTcdIsp1582FncInterruptStatusGet: Resume Interrupt\ ...\n",0,0,0,0,0,0); /* WindView Instrumentation */ USB_TCD_LOG_EVENT(USB_TCD_ISP1582_INTERRUPT, "usbTcdIsp1582FncInterruptStatusGet: Resume Event Occured...", USB_TCD_ISP582_WV_FILTER); pTrb->uInterruptStatus |= USBTCD_RESUME_INTERRUPT_MASK; } /* if bit 6 is set then DMA related event has occured */ if (( data32 & ISP1582_INT_REG_DMA) != 0) { UINT8 endpointIndex = 0; USBISP1582_DEBUG ("usbTcdIsp1582FncInterruptStatusGet: DMA Interrupt \ ...\n",0,0,0,0,0,0); /* WindView Instrumentation */ USB_TCD_LOG_EVENT(USB_TCD_ISP1582_INTERRUPT, "usbTcdIsp1582FncInterruptStatusGet: DMA Related Event Occured...", USB_TCD_ISP582_WV_FILTER); pTarget->dmaEot = TRUE; pTrb->uInterruptStatus |= USBTCD_ENDPOINT_INTERRUPT_MASK; endpointIndex = pTarget->dmaEndpointId; pTarget->endptIntPending |= (1 << endpointIndex); } /* * If bit 8 is set then setup interrupt has occured. Set setupIntPending * to TRUE */ if (( data32 & ISP1582_INT_REG_EP0SETUP) != 0) { USBISP1582_DEBUG ("usbTcdIsp1582FncInterruptStatusGet: Setup Interrupt \ ...\n",0,0,0,0,0,0); /* WindView Instrumentation */ USB_TCD_LOG_EVENT(USB_TCD_ISP1582_INTERRUPT, "usbTcdIsp1582FncInterruptStatusGet: Setup Packet Event Occured...", USB_TCD_ISP582_WV_FILTER); pTarget->setupIntPending = TRUE; pTrb->uInterruptStatus |= USBTCD_ENDPOINT_INTERRUPT_MASK; } /* * If any of bit from 10 to 25 is set, endpoint related intrrupt has * occured. */ if ((endpointIntMask = (data32 & ISP1582_INT_ENDPT_MASK)) != 0) { USBISP1582_DEBUG ("usbTcdIsp1582FncInterruptStatusGet: Endpoint \ Interrupt...\n",0,0,0,0,0,0); /* WindView Instrumentation */ USB_TCD_LOG_EVENT(USB_TCD_ISP1582_INTERRUPT, "usbTcdIsp1582FncInterruptStatusGet: Endpoint Related Event Occured...", USB_TCD_ISP582_WV_FILTER); /* Update endptPending accordingly */ pTarget->endptIntPending |= (endpointIntMask >> ISP1582_INT_REG_ENDPT_SFT_VAL); pTrb->uInterruptStatus |= USBTCD_ENDPOINT_INTERRUPT_MASK; } /* WindView Instrumentation */ USB_TCD_LOG_EVENT(USB_TCD_ISP1582_INTERRUPT, "usbTcdIsp1582FncInterruptStatusGet exiting...", USB_TCD_ISP582_WV_FILTER); USBISP1582_DEBUG ("usbTcdIsp1582FncInterruptStatusGet: Exiting...\n", 0,0,0,0,0,0); return OK; }/*******************************************************************************
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -