📄 hd465socket.c
字号:
/*
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 + -