📄 hd465init.c
字号:
/*
Copyright(c) 1998,1999 SIC/Hitachi,Ltd.
Module Name:
init.c
Revision History:
26th April 1999 Released
23rd September 1999 Deleted unused code (pControlRegs )
*/
DWORD gIntrPcmciaState = SYSINTR_PCMCIA_STATE;
DWORD gIntrPcmciaLevel = SYSINTR_PCMCIA_LEVEL;
//
// Global structure to hold user-space pointers to
// PCMCIA registers.
//
PCMCIA_REGISTER_LAYOUT PcmciaRegisters[NUM_SOCKETS];
POWER_REGISTER_LAYOUT PowerRegisters;
/* we need to make these global so that we can delete them later */
PVBYTE pPcmciaBase;
PDRIVER_GLOBALS pDriverGlobals;
/*
*Critical sections to make PDD re-entrant.
*/
CRITICAL_SECTION gPddSocketCrit;
CRITICAL_SECTION gPddWindowCrit;
CRITICAL_SECTION gPddMemoryCrit;
CRITICAL_SECTION gPddPowerCrit;
/*
* Global Adapter state variable
*/
extern PDCARD_ADAPTER_STATE v_AdapterState[];
/*
* Global socket structure, not used here
*/
extern PDCARD_SOCKET_STATE v_SockState[];
void PrintRegisters(int uSocket);
#define PCMCIA_DEBUG 1
/*****************************************************************************
* FUNCTION : PDCardInitServices
* DESCRIPTION : This routine maps the PCMCIA registers into user space,
* initializes critical sections needed to make the PDD
* re-entrant, and enables the auxiliary power suppy for
* PCMCIA operation.
*
* INPUTS : None
* OUTPUTS : Status
* DESIGN NOTES :
* CAUTIONS :
*****************************************************************************/
STATUS
PDCardInitServices()
{
DEBUGMSG(ZONE_PDD, (TEXT("+PDCardInitServices\r\n")));
pPcmciaBase = VirtualAlloc (0,CC_PCMCIA_REGSIZE, MEM_RESERVE, PAGE_NOACCESS);
if (NULL == pPcmciaBase)
{
return CERR_OUT_OF_RESOURCE;
}
if (!VirtualCopy((unsigned char *)pPcmciaBase, (PVOID)CC_PCMCIA_REGBASE, CC_PCMCIA_REGSIZE, PAGE_READWRITE|PAGE_NOCACHE))
{
return CERR_OUT_OF_RESOURCE;
}
PcmciaRegisters[0].pISR = (PVBYTE)(pPcmciaBase + CC_PCMCIA_PCC0ISR_OFFSET);
PcmciaRegisters[0].pGCR = (PVBYTE)(pPcmciaBase + CC_PCMCIA_PCC0GCR_OFFSET);
PcmciaRegisters[0].pCSCR = (PVBYTE)(pPcmciaBase + CC_PCMCIA_PCC0CSCR_OFFSET);
PcmciaRegisters[0].pCSCIER = (PVBYTE)(pPcmciaBase + CC_PCMCIA_PCC0CSCIER_OFFSET);
PcmciaRegisters[0].pSCR = (PVBYTE)(pPcmciaBase + CC_PCMCIA_PCC0SCR_OFFSET);
PcmciaRegisters[0].pPSR = (PVBYTE)(pPcmciaBase + CC_PCMCIA_PCCPSR_OFFSET);
PcmciaRegisters[1].pISR = (PVBYTE)(pPcmciaBase + CC_PCMCIA_PCC1ISR_OFFSET);
PcmciaRegisters[1].pGCR = (PVBYTE)(pPcmciaBase + CC_PCMCIA_PCC1GCR_OFFSET);
PcmciaRegisters[1].pCSCR = (PVBYTE)(pPcmciaBase + CC_PCMCIA_PCC1CSCR_OFFSET);
PcmciaRegisters[1].pCSCIER = (PVBYTE)(pPcmciaBase + CC_PCMCIA_PCC1CSCIER_OFFSET);
PcmciaRegisters[1].pSCR = (PVBYTE)(pPcmciaBase + CC_PCMCIA_PCC1SCR_OFFSET);
//Initialize critical sections.
InitializeCriticalSection(&gPddSocketCrit);
InitializeCriticalSection(&gPddWindowCrit);
InitializeCriticalSection(&gPddMemoryCrit);
InitializeCriticalSection(&gPddPowerCrit);
CPUEnablePinOut();
//so now we have to init those Control Regs
// SET PCC0SCR
WRITE_REGISTER_USHORT(PcmciaRegisters[0].pSCR,
(READ_REGISTER_USHORT(PcmciaRegisters[0].pSCR) &
~(CC_PCMCIA_SCR_VCC0VPP0 | CC_PCMCIA_SCR_VCC0VPP1)));
// SET PCC1SCR
WRITE_REGISTER_USHORT(PcmciaRegisters[1].pSCR,
(READ_REGISTER_USHORT(PcmciaRegisters[1].pSCR) &
~(CC_PCMCIA_SCR_VCC1VPP0 | CC_PCMCIA_SCR_VCC1VPP1)));
// pDriverGlobals = VirtualAlloc (0, PCMCIA_GLOBAL_SIZE, MEM_RESERVE, PAGE_NOACCESS);
pDriverGlobals = VirtualAlloc (0, DRIVER_GLOBALS_PHYSICAL_MEMORY_SIZE, MEM_RESERVE, PAGE_NOACCESS);
if (NULL == pDriverGlobals)
return CERR_OUT_OF_RESOURCE;
// if (!VirtualCopy((unsigned char *)pDriverGlobals, (PVOID)PCMCIA_GLOBAL_BASE, PCMCIA_GLOBAL_SIZE, PAGE_READWRITE|PAGE_NOCACHE))
if (!VirtualCopy(pDriverGlobals, (PVOID)DRIVER_GLOBALS_PHYSICAL_MEMORY_START,
DRIVER_GLOBALS_PHYSICAL_MEMORY_SIZE,PAGE_READWRITE|PAGE_NOCACHE))
return CERR_OUT_OF_RESOURCE;
// WRITE_REGISTER_ULONG(pDriverGlobals + PCMCIA_GLOBAL_INTS0, 0);
// WRITE_REGISTER_ULONG(pDriverGlobals + PCMCIA_GLOBAL_INTS1, 0);
pDriverGlobals->pcm.slot0Enable = 0;
pDriverGlobals->pcm.slot1Enable = 0;
// lets disable all interrupts
WRITE_REGISTER_USHORT(PcmciaRegisters[0].pCSCIER, 0);
WRITE_REGISTER_USHORT(PcmciaRegisters[1].pCSCIER, 0);
DEBUGMSG(ZONE_PDD, (TEXT("About to write 0x%X to SCR\r\n"),
(~(CC_PCMCIA_CSCR_STSCH_INT_REQ| CC_PCMCIA_CSCR_CD_INT_REQ|
CC_PCMCIA_CSCR_RDY_INT_REQ|CC_PCMCIA_CSCR_BW_INT_REQ|CC_PCMCIA_CSCR_BE_INT_REQ|
CC_PCMCIA_CSCR_IREQ_INT_REQ|CC_PCMCIA_CSCR_TPS2206_SEL))));
// before we start the systems, lets clear all pending ints
WRITE_REGISTER_USHORT(PcmciaRegisters[0].pCSCR,
(READ_REGISTER_USHORT(PcmciaRegisters[0].pCSCR) &
~(CC_PCMCIA_CSCR_STSCH_INT_REQ| CC_PCMCIA_CSCR_CD_INT_REQ|
CC_PCMCIA_CSCR_RDY_INT_REQ|CC_PCMCIA_CSCR_BW_INT_REQ|CC_PCMCIA_CSCR_BE_INT_REQ|
CC_PCMCIA_CSCR_IREQ_INT_REQ|CC_PCMCIA_CSCR_TPS2206_SEL)));
WRITE_REGISTER_USHORT(PcmciaRegisters[1].pCSCR,
(READ_REGISTER_USHORT(PcmciaRegisters[1].pCSCR) &
~(CC_PCMCIA_CSCR_STSCH_INT_REQ| CC_PCMCIA_CSCR_CD_INT_REQ|
CC_PCMCIA_CSCR_RDY_INT_REQ|CC_PCMCIA_CSCR_BW_INT_REQ|CC_PCMCIA_CSCR_BE_INT_REQ|
CC_PCMCIA_CSCR_IREQ_INT_REQ)));
//Select power switch interface
WRITE_REGISTER_USHORT(PcmciaRegisters[0].pCSCR,
READ_REGISTER_USHORT(PcmciaRegisters[0].pCSCR)|CC_PCMCIA_CSCR_TPS2206_SEL);
WRITE_REGISTER_USHORT(PcmciaRegisters[0].pGCR,
((READ_REGISTER_USHORT(PcmciaRegisters[0].pGCR) | (CC_PCMCIA_GCR_DRV_ENABLE |
CC_PCMCIA_GCR_RESET | CC_PCMCIA_GCR_MMOD_16 )) & (~CC_PCMCIA_GCR_A25_HIGH &
~CC_PCMCIA_GCR_A24_HIGH)));
WRITE_REGISTER_USHORT(PcmciaRegisters[1].pGCR,
((READ_REGISTER_USHORT(PcmciaRegisters[1].pGCR) | (CC_PCMCIA_GCR_DRV_ENABLE |
CC_PCMCIA_GCR_RESET | CC_PCMCIA_GCR_MMOD_16 )) & (~CC_PCMCIA_GCR_A25_HIGH &
~CC_PCMCIA_GCR_A24_HIGH)));
// The reset line must be active 10 us
Sleep(10);
WRITE_REGISTER_USHORT(PcmciaRegisters[0].pGCR,
(READ_REGISTER_USHORT(PcmciaRegisters[0].pGCR) & ~CC_PCMCIA_GCR_RESET));
WRITE_REGISTER_USHORT(PcmciaRegisters[1].pGCR,
(READ_REGISTER_USHORT(PcmciaRegisters[1].pGCR) & ~CC_PCMCIA_GCR_RESET));
// we are in the power off state because neither 5V or 3.3V is asserted at this point.
v_AdapterState[0] = ADP_STATE_POWEROFF;
v_AdapterState[1] = ADP_STATE_POWEROFF;
DEBUGMSG(ZONE_PDD, (TEXT("-PDCardInitServices\r\n")));
return CERR_SUCCESS;
}
void PrintRegisters(int uSocket)
{
DEBUGMSG(ZONE_PDD, (TEXT("&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&\r\n")));
DEBUGMSG(ZONE_PDD, (TEXT("& PCC%dISR 0x%X\r\n"), uSocket, READ_REGISTER_USHORT(PcmciaRegisters[uSocket].pISR)));
DEBUGMSG(ZONE_PDD, (TEXT("& PCC%dGCR 0x%X\r\n"), uSocket, READ_REGISTER_USHORT(PcmciaRegisters[uSocket].pGCR)));
DEBUGMSG(ZONE_PDD, (TEXT("& PCC%dCSCR 0x%X\r\n"), uSocket, READ_REGISTER_USHORT(PcmciaRegisters[uSocket].pCSCR)));
DEBUGMSG(ZONE_PDD, (TEXT("& PCC%dCSCIER 0x%X\r\n"), uSocket, READ_REGISTER_USHORT(PcmciaRegisters[uSocket].pCSCIER)));
DEBUGMSG(ZONE_PDD, (TEXT("& PCC%dSCR 0x%X\r\n"), uSocket, READ_REGISTER_USHORT(PcmciaRegisters[uSocket].pSCR)));
DEBUGMSG(ZONE_PDD, (TEXT("& PCC0PSR 0x%X\r\n"), READ_REGISTER_USHORT(PcmciaRegisters[0].pPSR)));
DEBUGMSG(ZONE_PDD, (TEXT("&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&\r\n")));
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -