📄 bootconfig.c
字号:
#ifdef INCLUDE_NETWORK
case 'n':
netifAdrsPrint (pLine);
break;
#ifdef ETHERNET_ADR_SET
case 'N':
mEnet (pLine);
break;
#endif /* ETHERNET_ADR_SET */
#endif /* INCLUDE_NETWORK */
case '?': /* help */
case 'h': /* help */
bootHelp ();
break;
case '@': /* load and go with internal params */
case '$': /* load and go with internal params */
if (bootLoad (pLine, &entry) == OK)
{
go (entry);
}
else
{
taskDelay (sysClkRateGet ()); /* pause a second */
reboot (BOOT_NO_AUTOBOOT); /* something is awry */
}
break;
case 'l': /* load with internal params */
if (bootLoad (pLine, &entry) == OK)
{
printf ("entry = 0x%x\n", (int) entry);
}
else
{
taskDelay (sysClkRateGet ()); /* pause a second */
reboot (BOOT_NO_AUTOBOOT); /* something is awry */
}
break;
case 'v': /* print version & logo */
printBootLogo ();
break;
default:
printf ("Unrecognized command. Type '?' for help.\n");
break;
} /* switch */
} /* FOREVER */
}
/******************************************************************************
*
* autoboot - do automatic boot sequence
*
* RETURNS: Doesn't return if successful (starts execution of booted system).
*/
LOCAL char autoboot
(
int timeout /* timeout time in seconds */
)
{
ULONG autoBootTime;
int timeLeft;
UINT timeMarker;
int bytesRead = 0;
FUNCPTR entry;
char key;
if (timeout > 0)
{
printf ("\nPress any key to stop auto-boot...\n");
/* Loop looking for a char, or timeout after specified seconds */
autoBootTime = tickGet () + sysClkRateGet () * timeout;
timeMarker = tickGet () + sysClkRateGet ();
timeLeft = timeout;
printf ("%2d\r", timeLeft);
while ((tickGet () < autoBootTime) && (bytesRead == 0))
{
(void) ioctl (consoleFd, FIONREAD, (int) &bytesRead);
if (tickGet () == timeMarker)
{
timeMarker = tickGet () + sysClkRateGet ();
printf ("%2d\r", --timeLeft);
}
}
}
if (bytesRead == 0) /* nothing typed so auto-boot */
{
/* put the console back in line mode so it echoes (so's you can bang
* on it to see if it's still alive) */
(void) ioctl (consoleFd, FIOSETOPTIONS, OPT_TERMINAL);
printf ("\nauto-booting...\n\n");
if (bootLoad (BOOT_LINE_ADRS, &entry) == OK)
go (entry); /* ... and never return */
else
{
printf ("Can't load boot file!!\n");
taskDelay (sysClkRateGet ()); /* pause a second */
reboot (BOOT_NO_AUTOBOOT); /* something is awry */
}
}
else
{
/* read the key that stopped autoboot */
read (consoleFd, &key, 1);
return (key & 0x7f); /* mask off parity in raw mode */
}
return (ERROR); /* for lint - can't really get here */
}
/******************************************************************************
*
* printBootLogo - print initial boot banner page
*/
LOCAL void printBootLogo (void)
{
printf ("\n\n\n\n\n\n\n\n\n\n\n");
printf ("%28s%s", "","VxWorks System Boot");
printf ("\n\n\nCopyright 1984-2002 Wind River Systems, Inc.\n\n\n\n\n\n");
printf ("CPU: %s\n", sysModel ());
printf ("Version: %s\n", vxWorksVersion);
printf ("BSP version: " BSP_VERSION BSP_REV "\n");
printf ("Creation date: %s\n\n", creationDate);
}
/*******************************************************************************
*
* bootHelp - print brief help list
*/
LOCAL void bootHelp (void)
{
static char *helpMsg[] =
{
"?", "- print this list",
"@", "- boot (load and go)",
"p", "- print boot params",
"c", "- change boot params",
"l", "- load boot file",
"g adrs", "- go to adrs",
"d adrs[,n]", "- display memory",
"m adrs", "- modify memory",
"f adrs, nbytes, value", "- fill memory",
"t adrs, adrs, nbytes", "- copy memory",
"e", "- print fatal exception",
"v", "- print boot logo with version",
#ifdef INCLUDE_NETWORK
"n netif", "- print network interface device address",
#if defined(ETHERNET_ADR_SET)
"N", "- set ethernet address",
#endif /* ETHERNET_ADR_SET */
#endif /* INCLUDE_NETWORK */
#if defined(TARGET_HK_V2F) || defined(TARGET_FRC_30) || \
defined(TARGET_FRC_31) || defined(TARGET_FRC_33)
"s [0/1]", "- system controller 0 = off, 1 = on",
#endif /* TARGET_HK_V2F/FRC_30/FRC_31/FRC_33 */
"$dev(0,procnum)host:/file h=# e=# b=# g=# u=usr [pw=passwd] f=#", "",
" tn=targetname s=script o=other", "",
#ifdef INCLUDE_SCSI_BOOT
"boot device: scsi=id,lun file name: /sd0/vxWorks","",
#endif /*INCLUDE_SCSI_BOOT*/
#ifdef INCLUDE_FD
"boot device: fd=drive,fdType file name: /fd0/vxWorks","",
#endif /* INCLUDE_FD */
#ifdef INCLUDE_IDE
"boot device: ide=drive,configType file name: /ide0/vxWorks","",
#endif /* INCLUDE_IDE */
#ifdef INCLUDE_ATA
"boot device: ata=ctrl,drive file name: /ata0/vxWorks","",
#endif /* INCLUDE_ATA */
#ifdef INCLUDE_PCMCIA
"boot device: pcmcia=sock file name: /pcmcia0/vxWorks","",
#endif /* INCLUDE_PCMCIA */
#ifdef INCLUDE_TFFS
"boot device: tffs=drive,removable file name: /tffs0/vxWorks","",
#endif /* INCLUDE_TFFS */
#ifdef INCLUDE_TSFS_BOOT
"boot device: tsfs file name: /tgtsvr/vxWorks","",
#endif /*INCLUDE_TSFS_BOOT */
"Boot flags:", "",
#if defined(TARGET_HK_V2F) || defined(TARGET_FRC_30) || \
defined(TARGET_FRC_31) || defined(TARGET_FRC_33)
" 0x01 - don't be system controller", "",
#endif /* TARGET_HK_V2F/FRC_30/FRC_31/FRC_33 */
" 0x02 - load local system symbols", "",
" 0x04 - don't autoboot", "",
" 0x08 - quick autoboot (no countdown)", "",
#ifdef INCLUDE_NETWORK
" 0x20 - disable login security", "",
#ifdef INCLUDE_DHCPC
" 0x40 - use dhcp to get boot parameters", "",
#else
#ifdef INCLUDE_BOOTP
" 0x40 - use bootp to get boot parameters", "",
#else
" 0x40 - autoconfigure: NOT AVAILABLE (no method installed)", "",
#endif /* INCLUDE_BOOTP */
#endif /* INCLUDE_DHCPC */
" 0x80 - use tftp to get boot image", "",
" 0x100 - use proxy arp", "",
#endif /* INCLUDE_NETWORK */
NULL
};
FAST char **pMsg;
#ifdef INCLUDE_NETWORK
FAST NETIF *pNif;
#endif /* INCLUDE_NETWORK */
#ifdef INCLUDE_END
int count;
char muxDevName[8];
END_TBL_ENTRY* pDevTbl;
#endif /* INCLUDE_END */
printf ("\n");
for (pMsg = helpMsg; *pMsg != NULL; pMsg += 2)
printf (" %-21s %s\n", *pMsg, *(pMsg + 1));
#ifdef INCLUDE_NETWORK
printf ("\navailable boot devices:");
#ifdef INCLUDE_END
printf ("Enhanced Network Devices\n");
for (count = 0, pDevTbl = endDevTbl; pDevTbl->endLoadFunc != END_TBL_END;
pDevTbl++, count++)
{
if (!pDevTbl->processed)
{
muxDevName [0] = EOS;
pDevTbl->endLoadFunc (muxDevName, NULL);
printf (" %s%d", muxDevName, pDevTbl->unit);
}
}
#endif /* INCLUDE_END */
for (pNif = netIf; pNif->ifName != 0; pNif++)
{
if (strncmp (pNif->ifName, "lo", 2) != 0)
printf (" %s", pNif->ifName);
}
#endif /* INCLUDE_NETWORK */
#ifdef INCLUDE_SCSI_BOOT
printf (" scsi");
#endif /*INCLUDE_SCSI_BOOT*/
#ifdef INCLUDE_FD
printf (" fd");
#endif /* INCLUDE_FD */
#ifdef INCLUDE_IDE
printf (" ide");
#endif /* INCLUDE_IDE */
#ifdef INCLUDE_ATA
printf (" ata");
#endif /* INCLUDE_ATA */
#ifdef INCLUDE_TFFS
printf (" tffs");
#endif /* INCLUDE_TFFS */
#ifdef INCLUDE_TSFS_BOOT
printf (" tsfs");
#endif /* INCLUDE_TSFS_BOOT */
printf ("\n");
}
/*******************************************************************************
*
* bootLoad - load a module into memory
*
* RETURNS: OK or ERROR
*/
LOCAL STATUS bootLoad
(
char * bootString,
FUNCPTR *pEntry
)
{
BOOT_PARAMS params;
#ifdef INCLUDE_SCSI_BOOT
#ifdef INCLUDE_SCSI2
SCSI_OPTIONS options;
UINT which;
int devBusId;
#endif /* INCLUDE_SCSI2 */
#endif /* INCLUDE_SCSI_BOOT */
#ifdef INCLUDE_NETWORK
char nad [20]; /* host's network internet addr */
int netmask = 0; /* temporary storage */
int result; /* classification of address string */
unsigned long leaseLen; /* lease length field (optional) */
#ifdef INCLUDE_DHCPC
DHCP_LEASE_DATA dhcpLease;
#endif /* INCLUDE_DHCPC */
char buf [30]; /* string of netmask and timestamps */
char netDev [BOOT_DEV_LEN + 1];
char bootDev [BOOT_DEV_LEN];
BOOL backplaneBoot = FALSE;
char * pBootAddr;
BOOL attached = FALSE; /* driver is attached */
char icmpPeer [BOOT_ADDR_LEN];
IMPORT int netTaskPriority;
int oldTaskPriority;
#ifdef INCLUDE_END
char muxDevName[8];
#endif /* INCLUDE_END */
#endif /* INCLUDE_NETWORK */
/* copy bootString to low mem address, if specified */
if ((bootString != NULL) && (*bootString != EOS))
strcpy (BOOT_LINE_ADRS, bootString);
/* interpret boot command */
if (usrBootLineCrack (BOOT_LINE_ADRS, ¶ms) != OK)
return (ERROR);
/* Display boot parameters */
bootParamsShow (BOOT_LINE_ADRS);
/* set our processor number: may establish vme access, etc. */
sysFlags = params.flags;
sysProcNumSet (params.procNum);
#ifdef INCLUDE_SCSI_BOOT
/*
* initialize either the SCSI1 or SCSI2 interface; initialize SCSI2 when
* the SCSI2 interface is available.
*/
#ifndef INCLUDE_SCSI2
scsi1IfInit ();
#else
scsi2IfInit ();
#endif
if (strncmp (params.bootDev, "scsi", 4) == 0)
{
int bootDevId = NONE;
int bootDevLUN = NONE;
#ifdef INCLUDE_SCSI2
/* Set all devices to asynchronous data transfer */
which = SCSI_SET_OPT_XFER_PARAMS;
options.maxOffset = 0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -