在target\config\comps\src\dosfs2的usrata.c中,是由ataload()调用的
STATUS usrAtaConfig ( int ctrl, /* 0: primary address, 1: secondary address */ int drive, /* drive number of hard disk (0 or 1) */ char *devNames /* mount points for each partition */ ) { BLK_DEV *pBlkDev; CBIO_DEV_ID cbio, masterCbio; STATUS stat = OK; char *tmp; char *devNamesCopy; char *freePtr; char *sysType; char *devName[PART_MAX_ENTRIES]; int pn; int numPart = 0;
/* check argument sanity */
if( NULL == devNames || EOS == *devNames ) { printErr ("usrAtaConfig: Invalid device name.\n");
return (ERROR); }
if (ATA_MAX_DRIVES <= (UINT) drive) { printErr ("usrAtaConfig: drive is out of range (0-%d).\n", ATA_MAX_DRIVES - 1);
return (ERROR); }
if (ATA_MAX_CTRLS <= (UINT) ctrl) { printErr ("usrAtaConfig: controller is out of range (0-%d).\n", ATA_MAX_CTRLS - 1);
return (ERROR); }
/* * make private copy of the devNames, SPR#70337 * strlen does not count EOS, so we add 1 to malloc. */
devNamesCopy = malloc (1 + (int) (strlen (devNames)));
/* ensure malloc suceeded */
if (NULL == devNamesCopy) { printErr ("usrAtaConfig: malloc returned NULL\n");
return (ERROR); }
/* store the pointer for free, since devNamesCopy is modified */ freePtr = devNamesCopy;
/* copy string, include EOS */
strcpy (devNamesCopy, devNames); /* Check for file system spec */
sysType = index (devNamesCopy, '(');
if (sysType != NULL) { *sysType = '\0'; sysType++; tmp = index( sysType, ')' );
if (tmp != NULL) { *tmp = '\0'; } } else { sysType = "dos"; }
/* Parse the partition device name string */
for (numPart = 0; numPart < PART_MAX_ENTRIES; numPart++) {
if (EOS == *devNamesCopy) break;
tmp = devNamesCopy ; devName[numPart] = devNamesCopy ; tmp = index (tmp, ',');
if (NULL == tmp) { numPart++;
break; }
*tmp = EOS ; devNamesCopy = tmp+1; }
/* create block device for the entire disk, */
if ((pBlkDev = ataDevCreate (ctrl, drive, 0, 0)) == (BLK_DEV *) NULL) { printErr ("Error during ataDevCreate: %x\n", errno); free (freePtr);
return (ERROR); }
if (strcmp (sysType, "dos") == 0) {
/* create disk cache for the entire drive */
cbio = dcacheDevCreate ((CBIO_DEV_ID) pBlkDev, NULL, ATA_CACHE_SIZE, freePtr);
if (NULL == cbio) { /* insufficient memory, will avoid the cache */
printErr ("WARNING: Failed to create %d bytes of disk cache" " ATA disk %s configured without cache\n", ATA_CACHE_SIZE, devNames); cbio = cbioWrapBlkDev (pBlkDev); }
/* create partition manager */
masterCbio = dpartDevCreate (cbio, numPart, usrFdiskPartRead);
if (NULL == masterCbio) { printErr ("Error creating partition manager: %x\n", errno); free (freePtr);
return (ERROR); }
/* Create a DosFs device for each partition required */
for (pn = 0; pn < numPart; pn ++) { stat = dosFsDevCreate (devName[pn], dpartPartGet (masterCbio, pn), NUM_DOSFS_FILES, NONE);
if (stat == ERROR) { printErr ("Error creating dosFs device %s, errno=%x\n", devName[pn], errno); free (freePtr);
return (ERROR); } } } #ifdef INCLUDE_CDROMFS
else if (strcmp (sysType, "cdrom") == 0) {
if (cdromFsDevCreate (devName[0], pBlkDev) == NULL) { printErr ("Error creating cdromFs device %s, errno=%x\n", devName[0], errno);
free (freePtr);
return (ERROR); } } #endif
else { printErr ("Unknown or un-included filesystem type: \"%s\"\n", sysType); free (freePtr);
return (ERROR); }
free (freePtr);
return (OK); }
/****************************************************************************** * * usrAtaInit - intialize the hard disk driver * * This routine is called from usrConfig.c to initialize the hard drive. */
void usrAtaInit (void) { int ix; ATA_RESOURCE *pAtaResource;
for (ix = 0; ix < ATA_MAX_CTRLS; ix++) { pAtaResource = &ataResources[ix];
if (pAtaResource->ctrlType == IDE_LOCAL)
if ((ataDrv (ix, pAtaResource->drives, pAtaResource->intVector, pAtaResource->intLevel, pAtaResource->configType, pAtaResource->semTimeout, pAtaResource->wdgTimeout)) == ERROR) { printf ("ataDrv returned ERROR from usrRoot.\n"); } } }