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

📄 cardservice.c

📁 PXA270CF卡代码
💻 C
📖 第 1 页 / 共 5 页
字号:
    }

    if (!DM_StopTest(NULL))
    {
        DM_AnyKeyToContinue("Hit any key to continue...");
    }

    DM_FinishTest("Display CIS Test Complete");
}

/*
*******************************************************************************
*
* FUNCTION:
*    UpdateDisplayMenu
*
* DESCRIPTION:
*    This function displays the menu for a supported CF Card. The menu displayed
*    depends on the type of card found.
*
*
* INPUT PARAMETERS:
*    XS_PCMCIA_DCST *ctxP - Pointer to device context.
*    UINT cardIndex - Menu entry index.
*
* RETURNS:
*    None.
*
* GLOBAL EFFECTS:
*    Menu item is updated.
*
* ASSUMPTIONS:
*    Only supported devices are added to the menu.
*
* CALLS:
*    None.
*
* CALLED BY:
*    CardServices_Enumerate.
*
* PROTOTYPE:
*    VOID UpdateDisplayMenu(XS_PCMCIA_DCST *ctxP, UINT cardIndex);
*
*******************************************************************************
*/
static
VOID UpdateDisplayMenu(XS_PCMCIA_DCST *ctxP, UINT cardIndex)
{
    UINT srcBaseEntry, destEntry;

    DM_CwDbgPrintf(DM_CW_SK_PCMCIA_0,
                   "PCMCIA: socket: %d, cardIndex: %d", socket, cardIndex);

    // Determine the destination menu index.
    if (ctxP->socket)
    {
        // Slot 1 is under Enumerate slot 1.
        srcBaseEntry = 5;
        destEntry = 9;
    }
    else
    {
        // Slot 0 is under Enumerate slot 0.
        srcBaseEntry = 0;
        destEntry = 7;
    }

    DM_CwDbgPrintf(DM_CW_SK_PCMCIA_0, "PCMCIA: cardIndex: %d", cardIndex);

    switch(cardIndex)
    {
        /******** Empty socket ********/
        case 0:
            // Disable the DP8390 menu item.
            DM_ReplaceMenuItem (CfCardEnumeratedMenuList,
                                srcBaseEntry,
                                MainstoneCardServicesMenuList,
                                destEntry);

            ETHERNET_SelectDevice(NULL, "LAN91C111");
        break;

        /******** Socket CF + LPE Adapter ********/
        case 1:
            // Enable the DP8390 menu item.
            DM_ReplaceMenuItem (CfCardEnumeratedMenuList,
                                srcBaseEntry + 1,
                                MainstoneCardServicesMenuList,
                                destEntry);

            // Initialize the DP8390 driver.
            DP8390SWInit();
            if (ctxP->socket)
            {
                ETHERNET_SelectDevice(ctxP, "DP8390,1");
            }
            else
            {
                ETHERNET_SelectDevice(ctxP, "DP8390,0");
            }
        break;

        /******** IBM MicroDrive ********/
        case 2:
            DM_ReplaceMenuItem (CfCardEnumeratedMenuList,
                                srcBaseEntry + 2,
                                MainstoneCardServicesMenuList,
                                destEntry);
        break;

        /******** SiliconTech CF Card ********/
        case 3:
            DM_ReplaceMenuItem (CfCardEnumeratedMenuList,
                                srcBaseEntry + 3,
                                MainstoneCardServicesMenuList,
                                destEntry);
        break;

        /******** Accton NE2000 Ethernet Card ********/
        case 4:
            DM_ReplaceMenuItem (CfCardEnumeratedMenuList,
                                srcBaseEntry + 4,
                                MainstoneCardServicesMenuList,
                                destEntry);
        break;

        default:
            DM_ErrPrintf("Card not supported!\r\n");
            DM_ReplaceMenuItem (CfCardEnumeratedMenuList,
                                srcBaseEntry,
                                MainstoneCardServicesMenuList,
                                destEntry);
        break;
    }

    return;
}

/*
*******************************************************************************
*
* FUNCTION:
*    EnumerateSocket
*
* DESCRIPTION:
*    This function enumerates a CF card inserted into a socket.
*
* INPUT PARAMETERS:
*    PVOID *ctxP - Pointer the the PCMCIA socket Device Context Structure
*    PVOID arg - Pointer to the agrument.
*
* RETURNS:
*    None.
*
* GLOBAL EFFECTS:
*    The menu item is update to reflect cards detected.
*
* ASSUMPTIONS:
*    None.
*
* CALLS:
*    PCMCIA device driver, statSocket, decodeCIS, UpdateDisplayMenu
*
* CALLED BY:
*    Menu system.
*
* PROTOTYPE:
*    VOID EnumerateSocket(PVOID ctxP, PCHAR param);
*    
*
*******************************************************************************
*/
static
VOID EnumerateSocket(XS_PCMCIA_DCST *XsPcmciaCtxP, UINT socket)
{
    SocketStatusT *infoP;
    CIS_EntryT *cisP;
    UINT32 status;
    int i;
    UINT cardFound = 0;
    UINT cardIndex = 0;

    // Initialize pointers.
    infoP = &XsPcmciaCtxP->status;
    cisP = &XsPcmciaCtxP->cis;

    DM_CwDbgPrintf(DM_CW_SK_PCMCIA_0, "PCMCIA: socket: %d", socket);

     // HW Setup for the socket
    status = XsPcmciaCtxP->XsPcmciaHWSetupFnP(XsPcmciaCtxP);
    if (status)
    {
		XllpUtilityOutputError(status);
		return;
    }

    if (statSocket(XsPcmciaCtxP, socket, 1) == 0)
    {
        // Decode the Card Information Structures
        decodeCIS(infoP, cisP);
        cisP->socket = socket;

        // Locate a corresponding entry in the CF Card Registration Table
        for (i=0; cfCardsList[i].cfCardName && cardFound == 0; i++) 
        {
            DM_CwDbgPrintf(DM_CW_SK_PCMCIA_0,
                           "PCMCIA: cisP->manName: %s",
                            cisP->manName);
            DM_CwDbgPrintf(DM_CW_SK_PCMCIA_0,
                           "PCMCIA: cisP->prodName: %s",
                            cisP->prodName);

            if ((strcmp(cfCardsList[i].cfCardVendor, cisP->manName) == 0) &&
                (strcmp(cfCardsList[i].cfCardProduct, cisP->prodName) == 0))
            {
                cardFound = 1;
                CfSocketDetect[socket] = TRUE;
                cardIndex = cfCardsList[i].cfCardIndex;
                if (cardIndex == 1)
                {
                    // Low-Power Ethernet adapter found.
                    CfLpeDetect = TRUE;
                }
                else
                {
                    // Some other CF card found.
                    CfLpeDetect = FALSE;
                }

                // Find a basic configuration.
                if (!findConfig(infoP, cisP))
                {
                    DM_Error("Failed to find suitable configuration\r\n");
                }

                UpdateDisplayMenu(XsPcmciaCtxP, cardIndex);
            }
        }
    }

    if ((cardFound == 0) && (!(CfSocketDetect[0])) && (!(CfSocketDetect[1])))
    {
        DM_CwDbgPrintf(DM_CW_SK_PCMCIA_0, "PCMCIA: unsupported card found");
        UpdateDisplayMenu(XsPcmciaCtxP, cardIndex);
        CfLpeDetect = FALSE;
    }

    return;
}

/*
*******************************************************************************
*
* FUNCTION:
*    CardServices_Enumerate
*
* DESCRIPTION:
*    This function enumerates the CF card inserted into either socket.
*
* INPUT PARAMETERS:
*    PVOID *ctxP - Pointer the the PCMCIA socket Device Context Structure
*    PVOID arg - Pointer to the agrument.
*
* RETURNS:
*    None.
*
* GLOBAL EFFECTS:
*    The menu item is update to reflect cards detected.
*
* ASSUMPTIONS:
*    None.
*
* CALLS:
*    PCMCIA device driver, statSocket, decodeCIS, UpdateDisplayMenu
*
* CALLED BY:
*    Menu system.
*
* PROTOTYPE:
*    VOID CardServices_Enumerate(PVOID ctxP, PCHAR param);
*    
*
*******************************************************************************
*/
VOID CardServices_Enumerate(PVOID ctxP, PCHAR arg)
{
    // Get pointer to the PCMCIA drivers DCS.
    XS_PCMCIA_DCST *XsPcmciaCtxP = NULL;
    UINT socket;

    // Get parameters
    if (GetParameters(&XsPcmciaCtxP, arg, &socket))
    {
        // Abort, no invalid parameters.
        return;
    }

    // Check for valid context.
    if (XsPcmciaCtxP)
    {
        // Enumerate only the specified socket.
        EnumerateSocket(XsPcmciaCtxP, socket);
    }
    else
    {
        // Enumerate socket 0.
        XsPcmciaCtxP = &XS_PCMCIA_DCS[PCMCIA_SLOT0];
        socket = PCMCIA_SLOT0;
        EnumerateSocket(XsPcmciaCtxP, socket);

        // Enumerate socket 1.
        XsPcmciaCtxP = &XS_PCMCIA_DCS[PCMCIA_SLOT1];
        socket = PCMCIA_SLOT1;
        EnumerateSocket(XsPcmciaCtxP, socket);
    }
}

/*
*******************************************************************************
*
* FUNCTION:
*    CardServices_Disable
*
* DESCRIPTION:
*    This function disable the specified socket.
*
* INPUT PARAMETERS:
*    PVOID *ctxP - Pointer the the PCMCIA socket Device Context Structure
*    PVOID arg - Pointer to the agrument.
*
* RETURNS:
*    None.
*
* GLOBAL EFFECTS:
*    The menu item is update to reflect the socket being disabled.
*
* ASSUMPTIONS:
*    None.
*
* CALLS:
*    PCMCIA device driver, statSocket, decodeCIS, cfCardDisplayMenu
*
* CALLED BY:
*    Menu system.
*
* PROTOTYPE:
*    VOID CardServices_Disable(PVOID ctxP, PCHAR param);
*    
*
*******************************************************************************
*/
VOID CardServices_Disable(PVOID ctxP, PCHAR arg)
{
    // Get pointer to the PCMCIA drivers DCS.
    XS_PCMCIA_DCST *XsPcmciaCtxP;
    UINT socket;

    // Get parameters
    if (GetParameters(&XsPcmciaCtxP, arg, &socket))
    {
        return;
    }

    DM_CwDbgPrintf(DM_CW_SK_PCMCIA_0, "PCMCIA: socket: %d", socket);

    // HW Shutdown for the socket
    XsPcmciaCtxP->XsPcmciaHWShutdownFnP(XsPcmciaCtxP);
    UpdateDisplayMenu(XsPcmciaCtxP, 0);

    return;
}

/*
*******************************************************************************
*
* FUNCTION:         TstPcmcia
*
* DESCRIPTION:      Test a PCMCIA socket.
*
* INPUT PARAMETERS: UINT socket - The socket of interest.
*
* RETURNS:          Number of errors.
*
* GLOBAL EFFECTS:   None.
*
* ASSUMPTIONS:      None.
*
* CALLS:            statSocket(), decodeCIS()
*
* CALLED BY:        POST
*
* PROTOTYPE:        UINT TstPcmcia(UINT socket);
*
*******************************************************************************
*/

UINT TstPcmcia(UINT socket)
{
    XS_PCMCIA_DCST *XsPcmciaCtxP;
    SocketStatusT *infoP;
    CIS_EntryT *cisP;
    UINT status;

    printf(" Testing PCMCIA Slot %i\r\n", socket);
    PostDisplayProgress(ERR_L_PCMCIA, 0x80, 0);

    // Check the socket number.
    if (!socket)
    {
        // Get slot 0 Device Context Structure.
        XsPcmciaCtxP = &XS_PCMCIA_DCS[PCMCIA_SLOT0];
    }
    else
    {
        // Get slot 1 Device Context Structure.
        XsPcmciaCtxP = &XS_PCMCIA_DCS[PCMCIA_SLOT1];
    }

    // Save the socket number.
    XsPcmciaCtxP->socket = socket;

    // Initialize pointers.
    infoP = &XsPcmciaCtxP->status;
    cisP = &XsPcmciaCtxP->cis;

    if (GetPcmciaRegister(socket)&BCR_PCMCIA_nCD) {
		XllpUtilityOutputError(ERRORCODEX(ERR_L_PCMCIA, 0x80, 2, ERR_T_NODEVICE));
		return 1;
	}
    // Check socket number.
    if (socket)
    {
        PostDisplayProgress(ERR_L_PCMCIA, 0x80, 3);

        // Enumerate the socket.
        CardServices_Enumerate(NULL, "1");

        PostDisplayProgress(ERR_L_PCMCIA, 0x80, 4);

        // Check for Low-Power Ethernet adapter.
        if (CfLpeDetect)
        {
            // Test internal loopback.
            ETHERNET_LoopBackTest(NULL, "DP8390,1,NOBANNER");
        }
        else
        {
            status = ERRORCODEX(ERR_L_PCMCIA, 0x80, 4, ERR_T_NODEVICE);
            XllpUtilityOutputError(status);
    		return 1;
        }

        PostDisplayProgress(ERR_L_PCMCIA, 0x80, 5);

        // Disable the socket.
        CardServices_Disable(NULL, "1");
    }
    else
    {
        PostDisplayProgress(ERR_L_PCMCIA, 0x80, 6);

        CardServices_Enumerate(NULL, "0");

        PostDisplayProgress(ERR_L_PCMCIA, 0x80, 7);

        // Check for Low-Power Ethernet adapter.
        if (CfLpeDetect)
        {
            // Test internal loopback.
            ETHERNET_LoopBackTest(NULL, "DP8390,0,NOBANNER");
        }
        else
        {
            status = ERRORCODEX(ERR_L_PCMCIA, 0x80, 7, ERR_T_NODEVICE);
            XllpUtilityOutputError(status);
    		return 1;
        }

        PostDisplayProgress(ERR_L_PCMCIA, 0x80, 8);

        // Disable the socket.
        CardServices_Disable(NULL, "0");
    }

    PostDisplayProgress(ERR_L_PCMCIA, 0x80, 9);

	printf(" Success!\r\n");
	return 0;
}

/*
*******************************************************************************
*
* FUNCTION:         KTstPcmcia0
*
* DESCRIPTION:      Kludge for legacy code.
*
* INPUT PARAMETERS: void *arg - Ignored.
*                   CHAR *param - Ignored.
*
* RETURNS:			None.
*
* GLOBAL EFFECTS:	None.
*
* ASSUMPTIONS:		None.
*
* CALLS:            TstPcmcia()
*
* CALLED BY:        Command List.
*
* PROTOTYPE:        void KTstPcmcia0(PVOID arg, PCHAR param);
*
*******************************************************************

⌨️ 快捷键说明

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