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

📄 hd465init.c

📁 WinCE 3.0 BSP, 包含Inter SA1110, Intel_815E, Advantech_PCM9574 等
💻 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 + -