📄 cardservice.c
字号:
}
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 + -