📄 cf_ifc.h
字号:
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//
// Use of this sample source code is subject to the terms of the Microsoft
// license agreement under which you licensed this sample source code. If
// you did not accept the terms of the license agreement, you are not
// authorized to use this sample source code. For the terms of the license,
// please see the license agreement between you and Microsoft or, if applicable,
// see the LICENSE.RTF on your install media or the root of your tools installation.
// THE SAMPLE SOURCE CODE IS PROVIDED "AS IS", WITH NO WARRANTIES OR INDEMNITIES.
//
/** @file CF_IFC.h
* @ Header file for the compact flash interface.
* Contains data definitions and prototypes that define one instance of
* the compact flash interface.
*
* Copyright (c) Marvell Semiconductor, Inc.
*/
#define CF_Signature 0xDEADBEEF
//------------------------------------------------------------------------------------
// This structure defines a compact flash interface object. An instance of this structure
// will be passed to all calls in the CF interace.
//------------------------------------------------------------------------------------
typedef struct
{
ULONG ulSignatureTop; // CF object top signature. Nothing above this data.
ULONG ulMrvDrvVirtualIoBase;
USHORT cfHostIntMask; // Current device interrupt mask.
//----------------------------------------------------
// Transmit related members
//----------------------------------------------------
BOOLEAN bTxPacketOpen; // Set if TX packet is open.
ULONG ulTxPacketSize; // size in bytes of current packet.
ULONG ulTxPacketByteCount; // number of bytes transmitted in current tx packet.
//----------------------------------------------------
// Receive related members
//----------------------------------------------------
BOOLEAN bRxPacketOpen; // Set if RX packet is open.
ULONG ulRxPacketSize; // size of current receive packet.
ULONG ulRxPacketByteCount; // number of bytes transmitted in current RX packet.
ULONG ulSignatureBottom; // CF object bottom signature. Nothing below this.
} CF_OBJECT, *PCF_OBJECT;
//-------------------------------------------------------------------------------------
// Interface definition function prototypes. (Cf_IFC.c)
//-------------------------------------------------------------------------------------
IX_STATUS cf_CreateIface( PVOID *iface, ULONG ioVirtRegBaseAddress );
IX_STATUS cf_DestroyIface( PVOID *iface );
IX_STATUS cf_SendCmd ( PVOID iface, USHORT *cmdBuf, USHORT cmdSizeBytes );
IX_STATUS cf_TxStartPacket(PCF_OBJECT pCf, USHORT totalPacketLengthInBytes );
IX_STATUS cf_TxPacket ( PVOID iface, UCHAR *packet, USHORT packetSizeBytes );
IX_STATUS cf_RxPacket(PVOID iface,UCHAR *packet,PUSHORT bytesRead,BOOLEAN discard);
IX_STATUS cf_IsFirmwareLoaded ( PVOID iface );
IX_STATUS cf_FirmwareDownload( PCF_OBJECT pCf,IN PMRVDRV_ADAPTER Adapter);
VOID cf_ReadCommandResponse(PMRVDRV_ADAPTER Adapter, PUCHAR buffer);
BOOLEAN cf_UseAndLockCfDownloadPath(PMRVDRV_ADAPTER Adapter);
VOID cf_ReleaseCfDownloadPath(PMRVDRV_ADAPTER Adapter);
VOID cf_WriteDeepSleepExit( PMRVDRV_ADAPTER Adapter, PVOID iface);
#if DBG
void DumpMrvDrvRegs( PCF_OBJECT pCf, char *msg );
#else
#define DumpMrvDrvRegs(x,y)
#endif
//-------------------------------------------------------------------------------------
// Utility routine function prototypes. (CF_util.c)
//-------------------------------------------------------------------------------------
IX_STATUS cf_InitInterface( PCF_OBJECT pCf );
IX_STATUS cf_EnableHostInterrupts( PCF_OBJECT pCf , USHORT mask );
IX_STATUS cf_DisableHostInterrupts( PCF_OBJECT pCf , USHORT mask );
IX_STATUS cf_HostBootFirmwareDownload(PCF_OBJECT pCf, IN PMRVDRV_ADAPTER Adapter);
//-------------------------------------------------------------------------------------
// Inlines for speed.
//-------------------------------------------------------------------------------------
/******************************************************************************
*
* Name: DisableInterrupt()
*
*
* Description:
* This routine disables interrupts
*
* Arguments:
* DriverObject - Pointer to driver object created by the system.
*
* Return Value:
*
* Notes:
*
*****************************************************************************/
__inline
VOID
DisableInterrupt(
IN PMRVDRV_ADAPTER Adapter
)
{
//AllenDBGPRINT(DBG_SP,("DisableInterrupt() \n"));
NdisRawWritePortUshort(
Adapter -> ulMrvDrvVirtualIoBase + CFMACREG_HCR_HOST_INT_MASK, CFMACREG_HCR_HIM_MASK);
}
/******************************************************************************
*
* Name: EnableInterrupt()
*
*
* Description:
* This routine enables interrupts
*
* Arguments:
* DriverObject - Pointer to driver object created by the system.
*
* Return Value:
*
* Notes:
*
*****************************************************************************/
__inline
VOID
EnableInterrupt(
IN PMRVDRV_ADAPTER Adapter
)
{
NDIS_STATUS Status;
DBGPRINT(DBG_SP,("EnableInterrupt() \n"));
//----------------------------------------------------------------------------
// Make sure our interrupt is registerd.
//----------------------------------------------------------------------------
if ( !Adapter->bIntRegistered )
{
DBGPRINT(DBG_ISR,("EnableInterrupt: Reregistering interupt\n"));
Status = NdisMRegisterInterrupt(
&Adapter->hMrvDrvINT,
Adapter->MrvDrvAdapterHdl,
Adapter->MrvDrvINTVector,
Adapter->MrvDrvINTLevel,
TRUE, // ISR should be called for each interrupt
Adapter->IntShared, // Do what ever resource manager tells us to do
Adapter->tMrvDrvINTMode); // In Windows CE.Net, this parameter is now ignored
Adapter -> bIntRegistered = TRUE; // our interrupt has been registerd.
}
//DBGPRINT(DBG_WARNING,("Interrupt Enabled.\n"));
// PJG: fixed isr - can now enable tx.
// allow all interrupts except tx dnload ready. This will unmasked
// after we send a packet.
NdisRawWritePortUshort(
Adapter -> ulMrvDrvVirtualIoBase + CFMACREG_HCR_HOST_INT_MASK, 0);
// CFMACREG_HCR_HIM_TxDnLdRdy);
}
//*************************************************************************
//* Function: cf_UshortRegSetBits
//* Description: Sets bits set in mask passed in the USHORT register specified
//* by offset passed in.
//* Returns IX_STATUS_SUCCESS if device is ready. IX_STATUS_DEVICE_BUSY if not.
//* Date: 04/10/2003
//*************************************************************************
__inline void cf_UshortRegSetBits( PCF_OBJECT pCf, USHORT regOffset, USHORT mask )
{
USHORT usRegVal;
NdisRawReadPortUshort(
pCf -> ulMrvDrvVirtualIoBase + regOffset,
&usRegVal );
usRegVal |= mask; // set the bit(s).
//-------------------------------------------------------------------------------
// Set the bit in host status to indicate host cmd download is complete.
//-------------------------------------------------------------------------------
NdisRawWritePortUshort(
pCf -> ulMrvDrvVirtualIoBase + regOffset,
usRegVal );
}
//*************************************************************************
//* Function: cf_UshortRegClearBits
//* Description: clears bits set in mask passed in the USHORT register specified
//* by offset passed in.
//* Returns IX_STATUS_SUCCESS if device is ready. IX_STATUS_DEVICE_BUSY if not.
//* Date: 04/10/2003
//*************************************************************************
__inline void cf_UshortRegClearBits( PCF_OBJECT pCf, USHORT regOffset, USHORT mask )
{
USHORT usRegVal;
NdisRawReadPortUshort(
pCf -> ulMrvDrvVirtualIoBase + regOffset,
&usRegVal );
usRegVal &= ~mask; // set the bit(s).
//-------------------------------------------------------------------------------
// Set the bit in host status to indicate host cmd download is complete.
//-------------------------------------------------------------------------------
NdisRawWritePortUshort(
pCf -> ulMrvDrvVirtualIoBase + regOffset,
usRegVal );
}
//*************************************************************************
//* Function: cf_IsCmdReady
//* Description: Polls device cmd ready bit to see if the device is really ready.
//* Returns IX_STATUS_SUCCESS if device is ready. IX_STATUS_DEVICE_BUSY if not.
//* Date: 04/02/2003
//*************************************************************************
__inline IX_STATUS cf_IsCmdReady(PCF_OBJECT pCf )
{
// Set command length
USHORT usval;
ASSERT( pCf != NULL );
NdisRawReadPortUshort( pCf->ulMrvDrvVirtualIoBase + CFMACREG_CCR_CARD_STATUS,
&usval);
DBGPRINT(DBG_HWIF,("cf_IsCmdReady: CFMACREG_CCR_CARD_STATUS = %x\n",(ULONG)usval));
return (usval & CFMACREG_HCR_HIM_CmdDnLdRdy) ? IX_STATUS_SUCCESS : IX_STATUS_DEVICE_BUSY;
}
//*************************************************************************
//* Function: cf_IsRespReady
//* Description: Polls device to see if the device has a cmd response waiting.
//* Returns IX_STATUS_SUCCESS if device has response ready.
//* IX_STATUS_NO_RESP if not.
//* Date: 04/02/2003
//*************************************************************************
__inline IX_STATUS cf_IsRespReady(PCF_OBJECT pCf )
{
// Set command length
USHORT usval;
ASSERT( pCf != NULL );
NdisRawReadPortUshort( pCf -> ulMrvDrvVirtualIoBase + CFMACREG_CCR_CARD_STATUS,
&usval);
return (usval & CFMACREG_HCR_HIM_CmdRspRdy) ? IX_STATUS_SUCCESS : IX_STATUS_NO_RESP;
}
//*************************************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -