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

📄 socket.c

📁 三星2440CPU下WIN MOBILE系统的PCMCIA驱动程序代码!
💻 C
📖 第 1 页 / 共 2 页
字号:
		}

		// LKY 2001.12
		Sleep(100);

		//
		// Assert RESET
		//
		PCICIndex(uSocket, REG_INTERRUPT_AND_GENERAL_CONTROL);
		intctl = PCICDataRead();
		PCICDataWrite((UINT8)(intctl & ~ INT_CARD_NOT_RESET));

		Sleep(20);

		PCICIndex(uSocket, REG_POWER_CONTROL);

		PCICDataWrite(PWR_OUTPUT_ENABLE | PWR_AUTO_POWER | PWR_VPP2_BIT0 | PWR_VPP1_BIT0);
		//
		// Power the socket
		//
		PCICIndex(uSocket, REG_POWER_CONTROL);
		PCICDataWrite(PWR_OUTPUT_ENABLE | PWR_AUTO_POWER | PWR_VCC_POWER | PWR_VPP2_BIT0 | PWR_VPP1_BIT0);

		Sleep(20);

		//
		// Deassert RESET
		//
		PCICIndex(uSocket, REG_INTERRUPT_AND_GENERAL_CONTROL);
		intctl = PCICDataRead();
		PCICDataWrite((UINT8)(intctl | INT_CARD_NOT_RESET));

		Sleep(20);
    
		//
		// Allow the card 2 seconds to assert RDY
		//
		PCICIndex(uSocket, REG_INTERFACE_STATUS);
		for (t = 0; t < PCMCIA_MAX_RDY_WAIT_TIME; t += PCMCIA_RDY_POLL_INT) 
		{
			tmp = PCICDataRead();
			if (tmp & STS_CARD_READY) 
			{
				DEBUGMSG(ZONE_PDD, (TEXT("PDCardSetSocket: Card in socket %d RDY after %dms\r\n"),
							uSocket, t));
				break;
			}
			Sleep(PCMCIA_RDY_POLL_INT);
		}

		if (t >= PCMCIA_MAX_RDY_WAIT_TIME) 
		{
			DEBUGMSG(ZONE_PDD, (TEXT("PDCardSetSocket: CARD IN SOCKET %d NOT RDY AFTER %dms\r\n"),
						uSocket, t));
		}

		// LKY 2001.12    
		Sleep(300); // necessary for CF cards?

	}

	if (pState->fIREQRouting & SOCK_IREQ_ENABLE) 
		DumpSocketRegisters(uSocket);

	*pPDDState = *pState;

pcss_exit:
#ifdef DEBUG
	DeltaSocketRegisters(uSocket);
#endif
	LeaveCriticalSection(&g_PCIC_Crit);
	return CERR_SUCCESS;

pcss_fail:
	DEBUGMSG(ZONE_PDD, (TEXT("PDCardSetSocket(%d) returning %d\r\n"), uSocket, ret));
	return ret;
}   // PDCardSetSocket


//
// PDCardInquireAdapter
//
// @func    STATUS | PDCardInquireAdapter | Returns the socket controller's characteristics
//                                          and capabilities.
// @rdesc   Returns one of the CERR_* return codes in cardserv.h.
//
STATUS
PDCardInquireAdapter( PPDCARD_ADAPTER_INFO pAdapterInfo )	// @parm Pointer to PDCARD_ADAPTER_INFO structure.
{
	if (pAdapterInfo->uPowerEntries < NUM_POWER_ENTRIES) 
	{
		pAdapterInfo->uPowerEntries = NUM_POWER_ENTRIES;
		return CERR_BAD_ARG_LENGTH;
	}

	// Copy the adapter info
	memcpy(pAdapterInfo, &v_AdapterInfo, sizeof(PDCARD_ADAPTER_INFO));
	pAdapterInfo = (PPDCARD_ADAPTER_INFO)(((UINT)pAdapterInfo) + sizeof(PDCARD_ADAPTER_INFO));

	// Copy the power entries at the end
	memcpy(pAdapterInfo, &v_PowerEntries, sizeof(v_PowerEntries));
	return CERR_SUCCESS;
}

//
// Set up socket's initial window registers and interrupts
//
VOID
InitSocket( UINT32 uSocket )
{
	PDCARD_WINDOW_STATE WinState;
	PDCARD_SOCKET_STATE SockState;
	UINT32 status; 
	UINT32 i; 
	UINT32 first, last;

	DEBUGMSG(1, (TEXT(":::PCMCIA:InitSocket\r\n")));

	//
	// Set the socket to detect status change events
	//
	SockState = v_SockState[uSocket];
	SockState.fInterruptEvents = EVENT_MASK_CARD_DETECT|
                                 EVENT_MASK_CARD_LOCK|
                                 EVENT_MASK_BATTERY_LOW|
                                 EVENT_MASK_BATTERY_DEAD|
                                 EVENT_MASK_WRITE_PROTECT;
#if 0
	SockState.fInterfaceType = CFG_IFACE_MEMORY;
	SockState.fIREQRouting = 0;
#else
	SockState.fInterfaceType = CFG_IFACE_MEMORY_IO;		// IO/MEM Interface, 2000.4.26, LKY
	SockState.fIREQRouting = 1; 				// IRQRouting enabled, 2000.4.26, LKY
#endif

	SockState.fVcc = VCC_DEFAULT_INDEX;
	PDCardSetSocket(uSocket, &SockState);

	//
	// Initially enable only the memory windows
	//
	first = (uSocket == 0) ? 0 : SOCKET1_FIRST_MEMORY_WINDOW;
	last = first + SOCKET1_FIRST_MEMORY_WINDOW;
	for (i = first; i < last; i++) 
	{
		status = PDCardGetWindow(i, &WinState);
		if (status == CERR_SUCCESS) 
		{
			WinState.fState |= WIN_STATE_ATTRIBUTE|WIN_STATE_ENABLED;
			PDCardSetWindow(i, &WinState);
		}
	}
}   // InitSocket

//
// PDCardResetSocket
//
// @func    STATUS | PDCardResetSocket | Resets the specified socket.
// @rdesc   Returns one of the CERR_* return codes in cardserv.h.
//
STATUS
PDCardResetSocket( UINT32 uSocket )	// @parm Socket number (first socket is 0)
{
	UINT8 tmp;
	UINT8 intctl;
	UINT32 t; 

	DEBUGMSG(1, (TEXT("++PDCardResetSocket\r\n")));

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

	EnterCriticalSection(&g_PCIC_Crit);

	PCICIndex(uSocket, REG_INTERFACE_STATUS);
	tmp = PCICDataRead();

	//
	// Power off the socket
	//
	PCICIndex(uSocket, REG_POWER_CONTROL);
	PCICDataWrite(0);

	if ((tmp & (STS_CD1|STS_CD2)) != (STS_CD1|STS_CD2)) 
	{
		//
		// Leave it powered off if no card in it.
		//
		InitSocketNoCard(uSocket, FALSE);
		LeaveCriticalSection(&g_PCIC_Crit);
		return CERR_NO_CARD;
	}

	//
	// Tri-state outputs for 310ms
	//
	Sleep(310);

	//
	// Assert RESET
	//
	PCICIndex(uSocket, REG_INTERRUPT_AND_GENERAL_CONTROL);
	intctl = PCICDataRead();
	PCICDataWrite(0);

	//
	// Power the socket
	//
	PCICIndex(uSocket, REG_POWER_CONTROL);
	PCICDataWrite(PWR_OUTPUT_ENABLE|PWR_AUTO_POWER|PWR_VCC_POWER);

	Sleep(20);

	//
	// Deassert RESET
	//
	PCICIndex(uSocket, REG_INTERRUPT_AND_GENERAL_CONTROL);
	PCICDataWrite(INT_CARD_NOT_RESET);

	//
	// Allow 20ms for card to assert RDY
	//
	Sleep(20);

	//
	// Allow the card 2 seconds to assert RDY
	//
	PCICIndex(uSocket, REG_INTERFACE_STATUS);
	for (t = 0; t < PCMCIA_MAX_RDY_WAIT_TIME; t += PCMCIA_RDY_POLL_INT) 
	{
		tmp = PCICDataRead();
		if (tmp & STS_CARD_READY) 
		{
			DEBUGMSG(ZONE_PDD, (TEXT("PDCardResetSocket: Card in socket %d RDY after %dms\r\n"),uSocket, t));
			break;
		}
		Sleep(PCMCIA_RDY_POLL_INT);
	}

	if (t >= PCMCIA_MAX_RDY_WAIT_TIME) 
	{
		DEBUGMSG(ZONE_PDD, (TEXT("PDCardResetSocket: CARD IN SOCKET %d NOT RDY AFTER %dms\r\n"),uSocket, t));
	}

	InitSocket(uSocket);

	// LKY 2001.12
	Sleep(20);

	PCICIndex(uSocket, REG_INTERRUPT_AND_GENERAL_CONTROL);
	intctl |= INT_CARD_NOT_RESET;
	PCICDataWrite(intctl);

	// LKY 2001.12
	Sleep(20);

#if 0
	// Enable Manage Interrupt
	PCICIndex(0, REG_INTERRUPT_AND_GENERAL_CONTROL);
	intctl = PCICDataRead();
	intctl |= INT_ENABLE_MANAGE_INT;
	PCICDataWrite(intctl);
#endif

	LeaveCriticalSection(&g_PCIC_Crit);
    
	DEBUGMSG(1, (TEXT("--PDCardResetSocket\r\n")));
    
	return CERR_SUCCESS;
}   // PDCardResetSocket

//
// PDCardGetAdapter
//
// @func    STATUS | PDCardGetAdapter | Returns power save mode status and capabilities
// @rdesc   Returns one of the CERR_* return codes in cardserv.h
//

STATUS
PDCardGetAdapter(	UINT32 uSocket,
			PPDCARD_ADAPTER_STATE pState     )
{

	UINT8 tmp;
	BOOL bUserMode;

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

	if (pState == NULL) 
	{
		return CERR_BAD_ARGS;
	}

	bUserMode = (*pState & ADP_STATE_KERNEL_MODE) ? FALSE : TRUE;

	DEBUGMSG(1, (TEXT("PDCardGetAdapter entered\r\n")));
	
	*pState = 0;
	if (bUserMode) 
	{
		EnterCriticalSection(&g_PCIC_Crit);
	}

	PCICIndex(uSocket, REG_POWER_CONTROL);
	tmp = PCICDataRead();
	if (!(tmp & PWR_OUTPUT_ENABLE)) 
	{
		*pState |= ADP_STATE_POWERDOWN;
	}

	if (bUserMode) 
	{
		LeaveCriticalSection(&g_PCIC_Crit);
	}

	DEBUGMSG(1, (TEXT("PDCardGetAdapter done\r\n")));
	return CERR_SUCCESS;

}


//
// PDCardSetAdapter
//
// @func    STATUS | PDCardSetAdapter | Sets power save mode status and capabilities
// @rdesc   Returns one of the CERR_* return codes in cardserv.h
//
STATUS
PDCardSetAdapter(	UINT32 uSocket,
			PPDCARD_ADAPTER_STATE pState )
{
	BOOL bUserMode;
	// UINT32 bSoc;

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

	if (pState == NULL) 
	{
		return CERR_BAD_ARGS;
	}

	bUserMode = (*pState & ADP_STATE_KERNEL_MODE) ? FALSE : TRUE;
	
	DEBUGMSG(1, (TEXT("PDCardSetAdapter entered\r\n")));

	if (bUserMode) 
	{
		EnterCriticalSection(&g_PCIC_Crit);
	}

	//
	// The socket controller will automatically power up when a card is inserted
	// by shlim
	// if (*pState & (ADP_STATE_POWERDOWN|ADP_STATE_POWEROFF)) 
	if (*pState & (ADP_STATE_POWEROFF | ADP_STATE_POWERDOWN)) 
	{
		//RETAILMSG(1, (TEXT("---- (ADP_STATE_POWEROFF | ADP_STATE_POWERDOWN)\r\n")));	
		// Power down the socket
		//RETAILMSG(1, (TEXT("PD_DataRestore()\r\n")));
		PD_DataRestore();				
		InitSocketNoCard(uSocket, bUserMode);
	}else {
		//RETAILMSG(1, (TEXT("---! (ADP_STATE_POWEROFF | ADP_STATE_POWERDOWN)\r\n")));	
		//
		// Power up the socket
		//
		//RETAILMSG(1, (TEXT("PD_DataBackup()\r\n")));
		//PD_DataBackup();
		//InitSocketNoCard(uSocket, bUserMode);		
	}

	if (bUserMode) 
	{
		LeaveCriticalSection(&g_PCIC_Crit);
	}

	return CERR_SUCCESS;
}

⌨️ 快捷键说明

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