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

📄 socket.c

📁 三星2410 Windows CE 4.2 PCMCIA驱动源码。适合所有以S3C2410X为主芯片开发的平台。
💻 C
📖 第 1 页 / 共 2 页
字号:
 	            DEBUGMSG(1, (TEXT("set to 3.3V[5V]\r\n")));
            }
            break;
        default:
            ASSERT(0); // this ought to have been caught above
        }

		// 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(100); // 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;

    //
    // 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(bUserMode & ZONE_PDD, (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(bUserMode & ZONE_PDD, (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;

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

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

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

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

    //
    // The socket controller will automatically power up when a card is inserted
    //
    if (*pState & (ADP_STATE_POWERDOWN|ADP_STATE_POWEROFF)) {
        //
        // Power down the socket
        //
        InitSocketNoCard(uSocket, bUserMode);
    }

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

    DEBUGMSG(bUserMode & ZONE_PDD, (TEXT("PDCardSetAdapter done\r\n")));

	return CERR_SUCCESS;
}

⌨️ 快捷键说明

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