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

📄 intproc.c

📁 此压缩包为杰得开发得z228的BSP的源代码,可以实现很多功能,尤其是视频解码有很好的效果.
💻 C
📖 第 1 页 / 共 3 页
字号:
/******************* ?Marvell Semiconductor, Inc., 2001-2004 *****************
 *
 *  Purpose:    This module provides implementaion of ISR, DPC and other 
 *              interrupt related routines
 *
 *  $Author: schiu $
 *
 *  $Date: 2004/10/27 $
 *
 *  $Revision: #3 $
 *
 *****************************************************************************/

/*
===============================================================================
INCLUDE FILES
===============================================================================
*/
#include "precomp.h"
#include "If.h"

#ifdef UNDER_CE#include "pkfuncs.h"#endif
/******************************************************************************
*
*  Name: MrvDrvDisableInterrupt()
*
*  Description: Miniport HW interrupt disable routine
*
*  Conditions for Use: Will be called to disable HW PCI/CardBus interrupt
*
*  Arguments:
*      IN NDIS_HANDLE MiniportAdapterContext
*    
*  Return Value: None
* 
*  Notes:               
*
*****************************************************************************/
VOID
MrvDrvDisableInterrupt(
    IN NDIS_HANDLE MiniportAdapterContext
    )
{
    PMRVDRV_ADAPTER Adapter;
    
    //  DBGPRINT(DBG_ISR,("INT - Enter MrvDrvDisableInterrupt \n"));
    Adapter = (PMRVDRV_ADAPTER)MiniportAdapterContext;
    #ifdef IF_SDIO
    {
        SD_API_STATUS   status;          // intermediate status

    // Though macro names are different in below lines,
    // the values defined for them are same. To avoid
    // confusion, we have redefined with new names.
    // See "sdio.h" for their defenitions.
    //
        #ifdef PWARE_SDIO_INTR_MODIFICATIONS
              UCHAR           ucMask = SDIO_DISABLE_INTERRUPT_MASK;
        #else // old code follows
              UCHAR           ucMask = SDIO_ENABLE_INTERRUPT;;       
        #endif // PWARE_SDIO_INTR_MODIFICATIONS
             
                status = If_WriteRegister(Adapter,
                                                //SD_IO_WRITE ,
                                                1, // function 1
                                                HCR_HOST_INT_MASK_REGISTER, // reg 4
                                                FALSE,
                                                &ucMask,
                                                sizeof(ucMask));

    
    }
#else ///IF_SDIO
    If_DisableInterrupt(Adapter);
#endif //IF_SDIO
}

/******************************************************************************
*
*  Name: MrvDrvEnableInterrupt()
*
*  Description: Miniport HW interrupt enable routine
*
*  Conditions for Use: Will be called to enable HW PCI/CardBus interrupt
*
*  Arguments:
*      IN NDIS_HANDLE MiniportAdapterContext
*    
*  Return Value: None
* 
*  Notes:               
*
*****************************************************************************/
VOID
MrvDrvEnableInterrupt(
  IN NDIS_HANDLE MiniportAdapterContext
    )
{
    PMRVDRV_ADAPTER Adapter;
    
    //  DBGPRINT(DBG_ISR,("INT - Enter MrvDrvEnbleInterrupt \n"));
    //yz_add
    RETAILMSG(1,(TEXT("MrvDrvEnableInterrupt() \r\n")));
    Adapter = (PMRVDRV_ADAPTER)MiniportAdapterContext;
    #ifdef IF_SDIO

    {
        SD_API_STATUS   status;          // intermediate status

    // Though macro names are different in below lines,
    // the values defined for them are same. To avoid
    // confusion, we have redefined with new names.
    // See "sdio.h" for their defenitions.
    //
        #ifdef PWARE_SDIO_INTR_MODIFICATIONS
              UCHAR           ucMask = SDIO_ENABLE_INTERRUPT_MASK;
        #else // old code follows
                UCHAR           ucMask = SDIO_DISABLE_INTERRUPT;;       
        #endif // PWARE_SDIO_INTR_MODIFICATIONS
             
                status = If_WriteRegister(Adapter,
                                                //SD_IO_WRITE ,
                                                1, // function 1
                                                HCR_HOST_INT_MASK_REGISTER, // reg 4
                                                FALSE,
                                                &ucMask,
                                                sizeof(ucMask));
    }

   #else //IF_SDIO
    If_EnableInterrupt(Adapter);
   #endif  //IF_SDIO
}

#ifdef IF_SDIO
///////////////////////////////////////////////////////////////////////////////
//  SDNdisSlotEventCallBack - slot event callback for fast-path events
//  Input:  hDevice - device handle
//          pContext - device specific context that was registered
//          SlotEventType - slot event type
//          pData - Slot event data (can be NULL)
//          DataLength - length of slot event data (can be 0)
//  Output:
//  Returns: 
//  Notes:  
//
//      If this callback is registered the client driver can be notified of
//      slot events (such as device removal) using a fast path mechanism.  This
//      is useful if a driver must be notified of device removal 
//      before its XXX_Deinit is called.  
//
//      This callback can be called at a high thread priority and should only
//      set flags or set events.  This callback must not perform any
//      bus requests or call any apis that can perform bus requests.
///////////////////////////////////////////////////////////////////////////////
VOID SDNdisSlotEventCallBack(SD_DEVICE_HANDLE    hDevice,
                             PVOID               pContext,                      
                             SD_SLOT_EVENT_TYPE  SlotEventType,         
                             PVOID               pData,                      
                             DWORD               DataLength)
{
    PMRVDRV_ADAPTER pAdapter;
    //BOOLEAN timerStatus;

    DBGPRINT(DBG_OID,("Entered +SDNdisSlotEventCallBack: event 0x%x \n", 
                        SlotEventType));

    switch (SlotEventType)
    {
        case SDCardEjected :
                 
            RETAILMSG(1,(TEXT("SDCardEjected Event!\n\r")));
            DBGPRINT(DBG_LOAD, ("SDCardEjected Event!\n"));

            pAdapter = (PMRVDRV_ADAPTER)pContext;

            pAdapter->SurpriseRemoved = TRUE; 
 
            SDIODisconnectInterrupt(pAdapter->hDevice);  
            
            pAdapter->ShutDown = TRUE;

            NdisMSleep(100);   

          break;
    }
}
#endif //IF_SDIO

///////////////////////////////////////////////////////////////////////////////
//  SDNdisInterruptCallback - interrupt handler
//  Input:  hDevice - handle to the SDIO device
//          pAdapter - adapter context
//  Output: 
//  Returns:  SD_API_STATUS code
//  Notes:  
//
//      SD_API_STATUS_SUCCESS  is returned for HW to acknowledge the interrupt
///////////////////////////////////////////////////////////////////////////////
#ifdef IF_SDIO
SD_API_STATUS SDNdisInterruptCallback(SD_DEVICE_HANDLE hDevice, 
                                      PVOID pContext)
#elif defined(IF_GSPI)
SD_API_STATUS SPINdisInterruptCallback(IN NDIS_HANDLE MiniportAdapterContext)
#endif
{                         
    
    PMRVDRV_ADAPTER  pAdapter;
#ifdef IF_SDIO
    UCHAR            ucHostIntStatus;
    UCHAR            ucCardStatus;
    SD_API_STATUS    status;
#endif ///IF_SDIO

#ifdef IF_GSPI
    WORD            ucHostIntStatus;
    USHORT          ucCardStatus;
    SD_API_STATUS   status;
#endif	///IF_GSPI

#ifdef IF_SDIO
    pAdapter = (PMRVDRV_ADAPTER)pContext;
#elif defined(IF_GSPI)
    pAdapter = (PMRVDRV_ADAPTER)MiniportAdapterContext;
#endif   
#if 1                   
    //dralee_20060513
    //clear Int work around timeout count
    pAdapter->IntWARTimeoutCount = 0;
#endif
/*
    if( pAdapter->ulINTCount < 5 )
    {  
       int pri;
       pri = CeGetThreadPriority(GetCurrentThread());
       DbgMrvPrintFile( ("HCD thread priority: %d\n",pri) );
    }                                             
*/
    DBGPRINT(DBG_ISR,("INT - SDNdisInterruptCallback(%d)\n", pAdapter->ulINTCount));  
   
// tt ps chk    pAdapter->dwInterruptTick = GetTickCount();
       
/* dralee 072905
    if ( pAdapter->hISRThread == NULL )
    {
        pAdapter->hISRThread = GetCurrentThread();
    }           
*/ 
        
///#ifdef IF_SDIO
	///crlo:intr ++
	#if defined(IF_GSPI)
	{
		WORD	maskreg=0;
		status = If_WriteRegister(pAdapter,
                                        1,     
                                        HCR_HOST_INT_MASK_REGISTER,
                                        FALSE,
                                        &maskreg,   // reg
                                        sizeof(maskreg));   
		if (!SD_API_SUCCESS(status))
		{
			LeaveCriticalSection(&pAdapter->IntCriticalSection);   
			return status;
		}
	}
	#endif ///(IF_GSPI)
	///crlo:intr --
    // read Host Int Status register (function 1,addr 6)
    status = If_ReadRegister(pAdapter,
                                        //SD_IO_READ ,
                                        1, // function 1
                                        HCR_HOST_INT_STATUS_REGISTER, 
                                        FALSE,
                                        &ucHostIntStatus,
                                        sizeof(ucHostIntStatus));
    
    if (!SD_API_SUCCESS(status))
    {
        DBGPRINT(DBG_ISR,("Unable to read Host interrupt status register\n"));
	DBGPRINT(DBG_ISR, ("ISR read error 1\n") );
        return status;
    } 
     
    EnterCriticalSection(&pAdapter->IntCriticalSection);   
    pAdapter->ucGHostIntStatus |= ucHostIntStatus; 
    LeaveCriticalSection(&pAdapter->IntCriticalSection);   
    ucCardStatus = ~ucHostIntStatus;    
    //dralee_1226
    ucCardStatus &= 0x1f;
    //EnterCriticalSection(&pAdapter->SDIOCriticalSection);
    status = If_WriteRegister(pAdapter,
                                        //SD_IO_WRITE,          
                                        1,     
                                        HCR_HOST_INT_STATUS_REGISTER,
                                        FALSE,
                                        &ucCardStatus,   // reg
                                        sizeof(ucCardStatus));   

    if (!SD_API_SUCCESS(status))
    {
        DBGPRINT(DBG_ISR,("Unable to clear Host interrupt status register\n"));
	DBGPRINT(DBG_ISR, ("ISR read error 2\n") );
        return status;
    } 
	///crlo:intr ++
	#if defined(IF_GSPI)
	{
		WORD	maskreg=HIS_TxDnLdRdy | HIS_RxUpLdRdy | HIS_CmdDnLdRdy | HIS_CardEvent | HIS_CmdUpLdRdy;
		status = If_WriteRegister(pAdapter,
                                        1,     
                                        HCR_HOST_INT_MASK_REGISTER,
                                        FALSE,
                                        &maskreg,   // reg
                                        sizeof(maskreg));   
		if (!SD_API_SUCCESS(status))
		{
			LeaveCriticalSection(&pAdapter->IntCriticalSection);   
			return status;
		}
	}
	#endif	///(IF_GSPI)
	///crlo:intr --
    //#ifndef MRV_CHIP_8305 
    //   pAdapter->ucGHostIntStatus=ucHostIntStatus;
    // DBGPRINT(DBG_ISR,("SDNdisInterruptCallback pAdapter->ucGHostIntStatus=%d\n",pAdapter->ucGHostIntStatus));
    //#endif 

#if defined (IF_GSPI)
    if (ucHostIntStatus == 0xffff)
#else
    if ( ucHostIntStatus == 0xff )
#endif ///IF_GSPI
    {
        // card removed?
        DBGPRINT(DBG_ISR,("read 0xff\n"));
        return SD_API_STATUS_SUCCESS;
    }  
///#endif // IF_SDIO

    //Disable further interrupts at this point
    //DisableInterrupt(pAdapter);

    // use timer to get into Miniport context
    //NdisMSetTimer(&pAdapter->MrvDrvSdioIntTimer, 0);
    //pAdapter->MrvDrvSdioIntTimerIsSet = TRUE;
    
/*          
    //dralee_1101
    if(pAdapter->RetQTimerIsSet==1)
    {
       pAdapter->RetQTimerIsSet=2;
       NdisMSetTimer(&pAdapter->MrvRetQTimer, 
                      MRVDRV_DEFAULT_RETQ_TIME_OUT);
    }  
*/
           
    SetEvent(pAdapter->hControllerInterruptEvent);
  
    return SD_API_STATUS_SUCCESS;
}

#ifdef IF_SDIO

///////////////////////////////////////////////////////////////////////////////
//  MrvDrvSdioAsyncBusRequestCB -  handles asynchronous bus call back for
//                                 reading CMD53 from card.
//                                 It is used when the response is discarded
//                                 so it just frees up the buffer
//    
///////////////////////////////////////////////////////////////////////////////
VOID MrvDrvSdioAsyncBusRequestCB(SD_DEVICE_HANDLE hDevice,
                                 PSD_BUS_REQUEST  pRequest,
                                 PVOID            pDeviceContext,

⌨️ 快捷键说明

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