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

📄 hd465socket.c

📁 WinCE 3.0 BSP, 包含Inter SA1110, Intel_815E, Advantech_PCM9574 等
💻 C
📖 第 1 页 / 共 2 页
字号:
/*

  Copyright(c) 1998,1999 SIC/Hitachi,Ltd.

	Module Name:

		socket.c

	Revision History:

		26th April 1999		Released

*/

extern PCMCIA_REGISTER_LAYOUT 	PcmciaRegisters[];
extern CRITICAL_SECTION 		gPddSocketCrit;
extern CRITICAL_SECTION			gPddPowerCrit;
extern POWER_REGISTER_LAYOUT	PowerRegisters;
extern PDRIVER_GLOBALS			pDriverGlobals;

//
// @doc DRIVERS
//

PDCARD_ADAPTER_INFO v_AdapterInfo = {
	1,  // memory granularity (for production platforms, this should be 1)
	0,  // adapter capabilities
	8,  // cache line size in 32-bit words
	NUM_POWER_ENTRIES
};

PDCARD_POWER_ENTRY v_PowerEntries[NUM_POWER_ENTRIES] = {
{ 0,    PWR_SUPPLY_VCC | PWR_SUPPLY_VPP1 | PWR_SUPPLY_VPP2 },
{ 33,   PWR_SUPPLY_VCC | PWR_SUPPLY_VPP1 | PWR_SUPPLY_VPP2 },
{ 50,   PWR_SUPPLY_VCC | PWR_SUPPLY_VPP1 | PWR_SUPPLY_VPP2 },
{ 120,  PWR_SUPPLY_VPP1 | PWR_SUPPLY_VPP2 },
};

PDCARD_ADAPTER_STATE v_AdapterState[NUM_SOCKETS] = {ADP_STATE_POWEROFF,
                                                    ADP_STATE_POWEROFF};

// for TPS2206
POWER_REGISTER_VALUES PowerSettingsA[NUM_POWER_ENTRIES][NUM_POWER_ENTRIES] = {
	/* this is socket 0 */
   {{TRUE, 0, 0},																	// 00 Vcc 0V,	Vpp 0V
	{BAD_VPP, 0, 0},																// 01 Vcc 0V,	Vpp 3.3V
	{BAD_VPP, 0, 0},																// 02 Vcc 0V,	Vpp 5V
	{BAD_VPP, 0, 0}},																// 03 Vcc 0V,	Vpp 12V
   {{TRUE, CC_PCMCIA_SCR_SHDN_ENB, CC_PCMCIA_PSR_3V_ENBA},							// 04 Vcc 3.3V,	Vpp 0V
	{TRUE, CC_PCMCIA_SCR_SHDN_ENB, CC_PCMCIA_PSR_3V_ENBA|CC_PCMCIA_PSR_AVPP_PGM},	// 05 Vcc 3.3V,	Vpp 3.3V
	{BAD_VPP, 0, 0},																// 06 Vcc 3.3V, Vpp 5V
	{TRUE, CC_PCMCIA_SCR_SHDN_ENB, CC_PCMCIA_PSR_3V_ENBA|CC_PCMCIA_PSR_AVPP_VCC}},	// 07 Vcc 3.3V, Vpp 12V
   {{TRUE, CC_PCMCIA_SCR_SHDN_ENB, CC_PCMCIA_PSR_5V_ENBA},							// 08 Vcc 5V,	Vpp 0V
    {BAD_VPP, 0, 0},																// 09 Vcc 5V,	Vpp 3.3V
    {TRUE, CC_PCMCIA_SCR_SHDN_ENB, CC_PCMCIA_PSR_5V_ENBA|CC_PCMCIA_PSR_AVPP_VCC},	// 10 Vcc 5V,	Vpp 5V
    {TRUE, CC_PCMCIA_SCR_SHDN_ENB, CC_PCMCIA_PSR_5V_ENBA|CC_PCMCIA_PSR_AVPP_PGM}},	// 11 Vcc 5V,	Vpp 12V
   {{BAD_VCC, 0, 0},																// 12 Vcc 12V,	Vpp 0V
    {BAD_VCC, 0, 0},																// 13 Vcc 12V,	Vpp 3.3V
    {BAD_VCC, 0, 0},																// 14 Vcc 12V,	Vpp 5V
    {BAD_VCC, 0, 0}}																// 15 Vcc 12V,	Vpp 12V
};
POWER_REGISTER_VALUES PowerSettingsB[NUM_POWER_ENTRIES][NUM_POWER_ENTRIES] = {
	/* this is socket 1 */
   {{TRUE, 0, 0},																	// 00 Vcc 0V,	Vpp 0V
	{BAD_VPP, 0, 0},																// 01 Vcc 0V,	Vpp 3.3V
	{BAD_VPP, 0, 0},																// 02 Vcc 0V,	Vpp 5V
	{BAD_VPP, 0, 0}},																// 03 Vcc 0V,	Vpp 12V
   {{TRUE, CC_PCMCIA_SCR_SHDN_ENB, CC_PCMCIA_PSR_3V_ENBB},							// 04 Vcc 3.3V,	Vpp 0V
	{TRUE, CC_PCMCIA_SCR_SHDN_ENB, CC_PCMCIA_PSR_3V_ENBB|CC_PCMCIA_PSR_BVPP_VCC},	// 05 Vcc 3.3V,	Vpp 3.3V
	{BAD_VPP, 0, 0},																// 06 Vcc 3.3V, Vpp 5V
	{TRUE, CC_PCMCIA_SCR_SHDN_ENB, CC_PCMCIA_PSR_3V_ENBB|CC_PCMCIA_PSR_BVPP_PGM}},	// 07 Vcc 3.3V, Vpp 12V
   {{TRUE, CC_PCMCIA_SCR_SHDN_ENB, CC_PCMCIA_PSR_5V_ENBB},							// 08 Vcc 5V,	Vpp 0V
    {BAD_VPP, 0, 0},																// 09 Vcc 5V,	Vpp 3.3V
    {TRUE, CC_PCMCIA_SCR_SHDN_ENB, CC_PCMCIA_PSR_5V_ENBB|CC_PCMCIA_PSR_BVPP_VCC},	// 10 Vcc 5V,	Vpp 5V
    {TRUE, CC_PCMCIA_SCR_SHDN_ENB, CC_PCMCIA_PSR_5V_ENBB|CC_PCMCIA_PSR_BVPP_PGM}},	// 11 Vcc 5V,	Vpp 12V
   {{BAD_VCC, 0, 0},																// 12 Vcc 12V,	Vpp 0V
    {BAD_VCC, 0, 0},																// 13 Vcc 12V,	Vpp 3.3V
    {BAD_VCC, 0, 0},																// 14 Vcc 12V,	Vpp 5V
    {BAD_VCC, 0, 0}}																// 15 Vcc 12V,	Vpp 12V
};

PDCARD_SOCKET_STATE v_SockState[NUM_SOCKETS] = {
{
	SOCK_CAP_IO /* DAMON - |SOCK_CAP_MEM_ONLY|SOCK_CAP_33_VOLT */,
	EVENT_MASK_BATTERY_DEAD|EVENT_MASK_BATTERY_LOW|EVENT_MASK_CARD_DETECT|EVENT_MASK_WRITE_PROTECT,   // status change interrupt mask
	0,  // present socket state
	0,  // control and indicators
	0,  // interface type, set to memory or I/O
	0,  // enable ireq routing
	2,  // Vcc  5V		/* start off */
	0,  // Vpp1 0V
	0   // Vpp2 0V
},
{
	SOCK_CAP_IO /* DAMON - |SOCK_CAP_MEM_ONLY|SOCK_CAP_33_VOLT */,
	EVENT_MASK_BATTERY_DEAD|EVENT_MASK_BATTERY_LOW|EVENT_MASK_CARD_DETECT|EVENT_MASK_WRITE_PROTECT,	// status change interrupt mask
	0,  // present socket state
	0,  // control and indicators
	0,  // interface type, set to memory or I/O
	0,  // disable ireq routing
	2,  // Vcc  5V
	0,  // Vpp1 0V
	0   // Vpp2 0V
}
};

// debug prototypes
void PrintRegisters(int uSocket);

#define PCMCIA_DEBUG 1
#define PCMCIA_0	0
#define PCMCIA_1	1
#define POWER_REG	0

/*****************************************************************************
*	FUNCTION :		PDCardGetSocket
*	DESCRIPTION :	Get the socket state of the specified socket.
*	INPUTS :		Socket num and sock structure
*	OUTPUTS :		Returns one of the CERR_* return codes in cardserv.h.
*	DESIGN NOTES :	This function reads the specified socket's state and
*					returns it in the PDCARD_SOCKET_STATE structure.  This
*					function is also required to notify the system if there
*					are any interrupts to clear.  They cannot be cleared
*					here because at this point, the MDD has not had an
*					opportunity to turn off the interrupt.  So if we clear
*					the interrupt, then we might receive another too soon.
*					We do this by simply recording the SCR.  This will
*					tell the Hal which interrupts we were actually aware
*					of when we serviced the interrupt.  If there are
*					other interrupts, then need to be generated still.
*	CAUTIONS :
*****************************************************************************/
STATUS PDCardGetSocket(
	UINT32 uSocket,					// Socket number (first socket is 0)
	PPDCARD_SOCKET_STATE pState)	// Pointer to PDCARD_SOCKET_STATE structure
{
	USHORT ISRValue;				// The value of the ISR reg
	USHORT CSCRValue;				// the CSCR register

	DEBUGMSG(ZONE_PDD, (TEXT("+PDCardGetSocket, socket = %d\r\n"), uSocket));

	if ((uSocket >= NUM_SOCKETS) || (uSocket < 0))
	{
        return CERR_BAD_SOCKET;
    }

    EnterCriticalSection(&gPddSocketCrit);
    memcpy(pState, &v_SockState[uSocket], sizeof(PDCARD_SOCKET_STATE));
    LeaveCriticalSection(&gPddSocketCrit);

    pState->fNotifyEvents = 0;        // Start off with nothing

	// read the value of the ISR
	ISRValue = (READ_REGISTER_USHORT(PcmciaRegisters[uSocket].pISR));
	CSCRValue = (READ_REGISTER_USHORT(PcmciaRegisters[uSocket].pCSCR));

	// now lets record it for the HAL

	if(uSocket)
	{
		pDriverGlobals->pcm.slot1Enable = CSCRValue;
	}
	else
	{
		pDriverGlobals->pcm.slot0Enable = CSCRValue;
	}

    // if the CD's show 00 (binary) then a card is present
    if (!(ISRValue & CC_PCMCIA_ISR_CD_MASK))
	{
        pState->fNotifyEvents |= EVENT_MASK_CARD_DETECT;		//EVENT_MASK_CARD_DETECT = 0x80
	}

	// lets make sure that power is present 
	if (POWER_ENABLED(uSocket))
	{
		if ((ISRValue & CC_PCMCIA_ISR_BVD_MASK) == CC_PCMCIA_ISR_BVD_LOW_GD)
		{
			pState->fNotifyEvents |= EVENT_MASK_BATTERY_LOW;	//EVENT_MASK_BATTERY_LOW = 0x20
			DEBUGMSG(ZONE_PDD, (TEXT("+EVENT_MASK_BATTERY_LOW \r\n")));
		}
		else if ((ISRValue & CC_PCMCIA_ISR_BVD_MASK) != CC_PCMCIA_ISR_BVD_NORMAL)
		{
			pState->fNotifyEvents |= EVENT_MASK_BATTERY_DEAD;	//EVENT_MASK_BATTERY_DEAD = 0x10
			DEBUGMSG(ZONE_PDD, (TEXT("+EVENT_MASK_BATTERY_DEAD \r\n")));
		}

		if (ISRValue & CC_PCMCIA_ISR_WP_MASK)
		{
		    pState->fNotifyEvents |= EVENT_MASK_WRITE_PROTECT;	//EVENT_MASK_WRITE_PROTECT = 0x01
			DEBUGMSG(ZONE_PDD, (TEXT("+EVENT_MASK_WRITE_PROTECT \r\n")));
		}

		if (!(ISRValue & CC_PCMCIA_ISR_RDY_MASK))
		{
	        pState->fNotifyEvents |= EVENT_MASK_CARD_READY;		//EVENT_MASK_CARD_READY = 0x40
			DEBUGMSG(ZONE_PDD, (TEXT("+EVENT_MASK_CARD_READY \r\n")));
		}

	}

	DEBUGMSG(ZONE_PDD, (TEXT("PDCardGetSocket : Reporting Events 0x%X on Socket %d\r\n"),
		pState->fNotifyEvents, uSocket ));
	PrintRegisters(uSocket);

	DEBUGMSG(ZONE_PDD, (TEXT("-PDCardGetSocket\r\n")));
    return CERR_SUCCESS;
}

/*****************************************************************************
*	FUNCTION :		PDCardSetSocket
*	DESCRIPTION :	This function sets the specified socket's state and
*					adjusts the socket controller appropriately.
*					PDCardGetSocketState will usually be called first and
*					adjustments will be made to the PDCARD_SOCKET_STATE
*					structure before PDCardSetSocketState is called.  This
*					avoids duplicated socket state on different layers and
*					it avoids unintentionally setting socket parameters.
*	INPUTS :
*	OUTPUTS :		Returns one of the CERR_* return codes in cardserv.h.
*	DESIGN NOTES :	This routine is also called to get all status information
*					on sockets.  Notably, it is called immediately following
*					an interrupt.  It is the only notification that the PDD
*					gets that an interrupt has occurred.  So we must take this
*					opportunity to decide if we need to clear the
*					interrupt in the InterruptDone() routine.  It is really the
*					only place to do it.
*	CAUTIONS :
*****************************************************************************/
STATUS PDCardSetSocket(
    UINT32 uSocket,					// Socket number (first socket is 0)
    PPDCARD_SOCKET_STATE pState)	// Pointer to PDCARD_SOCKET_STATE structure
{
	USHORT		DisableCSCIERInts = 0;
	USHORT		EnableCSCIERInts = 0;

	DEBUGMSG(ZONE_PDD, (TEXT("+PDCardSetSocket, socket = %d\r\n"), uSocket));
    if ((uSocket >= NUM_SOCKETS) || (uSocket < 0 ))
	{
        return CERR_BAD_SOCKET;
    }

    EnterCriticalSection(&gPddSocketCrit);

	// Set the Interface Type that we are using
	if (pState->fInterfaceType == CFG_IFACE_MEMORY_IO)
	{
		WRITE_REGISTER_USHORT(PcmciaRegisters[uSocket].pGCR,
			(READ_REGISTER_USHORT(PcmciaRegisters[uSocket].pGCR) | CC_PCMCIA_GCR_IO_CARD));

		DEBUGMSG(ZONE_PDD, (TEXT("PDCardSetSocket : Set for I/O Card\r\n")));
	}
	else if (pState->fInterfaceType == CFG_IFACE_MEMORY)
	{
		WRITE_REGISTER_USHORT(PcmciaRegisters[uSocket].pGCR,
			(READ_REGISTER_USHORT(PcmciaRegisters[uSocket].pGCR) & ~CC_PCMCIA_GCR_IO_CARD));

		DEBUGMSG(ZONE_PDD, (TEXT("PDCardSetSocket : Set for Memory Card\r\n")));
	}
    else
    {
		DEBUGMSG(ZONE_PDD, (TEXT("PDCardSetSocket : Set for Other Card\r\n")));
    }
	
	//Set the PCMCIA interrupt mask.
	
	DEBUGMSG(ZONE_PDD, (TEXT("PDCardSetSocket : Interrupt Event Mask = 0x%X\r\n"), pState->fInterruptEvents ));

   	if (pState->fInterruptEvents & (EVENT_MASK_BATTERY_DEAD	|
                                    EVENT_MASK_BATTERY_LOW	|
                                    EVENT_MASK_CARD_DETECT	|
                                 	EVENT_MASK_CARD_READY	|
									EVENT_MASK_STATUS_CHANGE))
	{
		//we must now enable the interrupts one at a time here battery dead 
		if (pState->fInterruptEvents & EVENT_MASK_BATTERY_DEAD)
		{
			DEBUGMSG(ZONE_PDD, (TEXT("PDCardSetSocket : EVENT_MASK_BATTERY_DEAD  Enabled\r\n")));
			EnableCSCIERInts |= CC_PCMCIA_CSCIER_BDE_INT_EN;
		}
		else
		{
			DEBUGMSG(ZONE_PDD, (TEXT("PDCardSetSocket : EVENT_MASK_BATTERY_DEAD  Disabled\r\n")));
			DisableCSCIERInts |= CC_PCMCIA_CSCIER_BDE_INT_EN;
		}

		// battery low 
		if (pState->fInterruptEvents & EVENT_MASK_BATTERY_LOW)
		{
			DEBUGMSG(ZONE_PDD, (TEXT("PDCardSetSocket : EVENT_MASK_BATTERY_LOW  Enabled\r\n")));
			EnableCSCIERInts |= CC_PCMCIA_CSCIER_BWE_INT_EN;
		}
		else
		{
			DEBUGMSG(ZONE_PDD, (TEXT("PDCardSetSocket : EVENT_MASK_BATTERY_LOW  Disabled\r\n")));
			DisableCSCIERInts |= CC_PCMCIA_CSCIER_BWE_INT_EN;
		}

		// Card Ready
		DEBUGMSG(ZONE_PDD, (TEXT("\r\n--> EVENT_MASK_CARD_READY <- pState->fInterruptEvents=%X,EVENT_MASK_CARD_READY=%X\r\n"),pState->fInterruptEvents,EVENT_MASK_CARD_READY));
		
		if (pState->fInterruptEvents & EVENT_MASK_CARD_READY)
		{
			DEBUGMSG(ZONE_PDD, (TEXT("PDCardSetSocket : EVENT_MASK_CARD_READY  Enabled\r\n")));
			EnableCSCIERInts |= CC_PCMCIA_CSCIER_RDY_INT_EN;
		}
		else
		{
			DEBUGMSG(ZONE_PDD, (TEXT("PDCardSetSocket : EVENT_MASK_CARD_READY  Disabled\r\n")));
			DisableCSCIERInts |= CC_PCMCIA_CSCIER_RDY_INT_EN;
		}

		if (pState->fInterruptEvents & EVENT_MASK_STATUS_CHANGE)
		{
			DEBUGMSG(ZONE_PDD, (TEXT("PDCardSetSocket : EVENT_MASK_STATUS_CHANGE  Enabled\r\n")));
			EnableCSCIERInts |= CC_PCMCIA_CSCIER_STSCH_INT_EN;
		}
		else
		{
			DEBUGMSG(ZONE_PDD, (TEXT("PDCardSetSocket : EVENT_MASK_STATUS_CHANGE  Disabled\r\n")));
			DisableCSCIERInts |= CC_PCMCIA_CSCIER_STSCH_INT_EN;
		}

		// now check for card detect
		if (pState->fInterruptEvents & EVENT_MASK_CARD_DETECT)
		{
			DEBUGMSG(ZONE_PDD, (TEXT("PDCardSetSocket : EVENT_MASK_CARD_DETECT  Enabled\r\n")));
			EnableCSCIERInts |= CC_PCMCIA_CSCIER_CD_INT_EN;
			if (pState->fInterfaceType == CFG_IFACE_MEMORY_IO) 
			{
			    EnableCSCIERInts |= CC_PCMCIA_CSCIER_RDY_INT_EN;
			    DisableCSCIERInts &= ~CC_PCMCIA_CSCIER_RDY_INT_EN;
    			EnableCSCIERInts |= CC_PCMCIA_CSCIER_STSCH_INT_EN;
			    DisableCSCIERInts &= CC_PCMCIA_CSCIER_STSCH_INT_EN;
			}
		}
		else
		{
			DEBUGMSG(ZONE_PDD, (TEXT("PDCardSetSocket : EVENT_MASK_CARD_DETECT  Disabled\r\n")));
			DisableCSCIERInts |= CC_PCMCIA_CSCIER_CD_INT_EN;
			if (pState->fInterfaceType == CFG_IFACE_MEMORY_IO)
			{
    			DisableCSCIERInts |= CC_PCMCIA_CSCIER_RDY_INT_EN;
	    		EnableCSCIERInts &= ~CC_PCMCIA_CSCIER_RDY_INT_EN;
    			DisableCSCIERInts |= CC_PCMCIA_CSCIER_BDE_INT_EN;
	    		EnableCSCIERInts &= ~CC_PCMCIA_CSCIER_BDE_INT_EN;
			}
        }

	}

	if (pState->fIREQRouting & SOCK_IREQ_ENABLE)
	{
		DEBUGMSG(ZONE_PDD, (TEXT("PDCardSetSocket : SOCK_IREQ_ENABLE  Enabled\r\n")));
	    EnableCSCIERInts |= CC_PCMCIA_CSCIER_IREQ_LEVEL;
	}
	else
	{
		DisableCSCIERInts |= CC_PCMCIA_CSCIER_IREQ_MASK;
	}

	// write values to the int registers

⌨️ 快捷键说明

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