?? sysscsi.c
字號:
* compatibility.** Similarly, the tape configuration is more complex because certain device* parameters must be turned off within VxWorks and the tape fixed block size* must be defined, assuming that the tape supports fixed blocks.** The last parameter to the dosFsDevInit() call is a pointer to a* DOS_VOL_CONFIG structure. If NULL is specified, dosFsDevInit() reads this* information off the disk in the drive. The read may fail if no disk is* present or if the disk has no valid dosFs directory. Should that happen,* use dosFsMkfs() to create a new directory on a disk. This routine uses* default parameters (see dosFsLib) that may not be suitable an application,* in which case, use dosFsDevInit() with a pointer to a valid DOS_VOL_CONFIG* structure that has been created and initialized by the user. If* dosFsDevInit() is used, a call to diskInit() should be made to write a new* directory on the disk, if the disk is blank or disposable.** NOTE: The variable <pSbdFloppy> is global to allow the above calls to be* made from the VxWorks shell, for example:* .CS* -> dosFsMkfs "/fd0/", pSbdFloppy* .CE* If a disk is new, use diskFormat() to format it.** INTERNAL* The fourth parameter passed to scsiPhysDevCreate() is now* <reqSenseLength> (previously <selTimeout>).*/STATUS sysScsiConfig (void) {#if FALSE /* EXAMPLE CODE IS NOT COMPILED */ UINT which; int scsiId; char modeData [4]; /* array for floppy MODE SELECT data */ SCSI_OPTIONS options; /* * NOTE: Either of the following global variables may be set or reset * from the VxWorks shell. Under 5.0, they should NOT both be set at the * same time, or output will be interleaved and hard to read!! They are * intended as an aid to trouble-shooting SCSI problems. */ scsiDebug = FALSE; /* enable SCSI debugging output */ scsiIntsDebug = FALSE; /* enable SCSI interrupt debugging output */ /* * The following section of code provides sample configurations within * VxWorks of SCSI peripheral devices and VxWorks file systems. It * should however be noted that the actual parameters provided to * scsiPhysDevCreate(), scsiBlkDevCreate(), dosFsDevInit() etc., are * highly dependent upon the user environment and should therefore be * modified accordingly. */ /* * HARD DRIVE CONFIGURATION * * In order to configure a hard disk and initialise both dosFs and rt11Fs * file systems, the following initialisation code will serve as an * example. */ /* configure a SCSI hard disk at busId = 2, LUN = 0 */ if ((pSpd20 = scsiPhysDevCreate (pSysScsiCtrl, 2, 0, 0, NONE, 0, 0, 0)) == (SCSI_PHYS_DEV *) NULL) { printErr ("usrScsiConfig: scsiPhysDevCreate failed.\n", 0, 0, 0, 0, 0, 0); } else { /* create block devices */ if (((pSbd0 = scsiBlkDevCreate (pSpd20, 0x10000, 0)) == NULL) || ((pSbd1 = scsiBlkDevCreate (pSpd20, 0x10000, 0x10000)) == NULL) || ((pSbd2 = scsiBlkDevCreate (pSpd20, 0, 0x20000)) == NULL)) { return (ERROR); } if ((dosFsDevInit ("/sd0/", pSbd0, NULL) == NULL) ) { return (ERROR); }#ifdef INCLUDE_RT11FS if ((rt11FsDevInit ("/sd1/", pSbd1, 0, 256, TRUE) == NULL) || (rt11FsDevInit ("/sd2/", pSbd2, 0, 256, TRUE) == NULL)) { return (ERROR); }#endif } /* * FLOPPY DRIVE CONFIGURATION * * In order to configure a removable media floppy drive with a * dosFs file system, the following device specific code will serve * as an example. Note that some arguments like mode parameters are * highly devcie and vendor specific. Thus, the appropriate peripheral * hardware manual should be consulted. */ /* configure floppy at busId = 3, LUN = 1 */ if ((pSpd31 = scsiPhysDevCreate (pSysScsiCtrl, 3, 1, 0, NONE, 0, 0, 0)) == (SCSI_PHYS_DEV *) NULL) { printErr ("usrScsiConfig: scsiPhysDevCreate failed.\n"); return (ERROR); } /* * Zero modeData array, then set byte 1 to "medium code" (0x1b). NOTE: * MODE SELECT data is highly device-specific. If your device requires * configuration via MODE SELECT, please consult the device's Programmer's * Reference for the relevant data format. */ bzero (modeData, sizeof (modeData)); modeData [1] = 0x1b; /* * issue the MODE SELECT command to correctly configure * floppy controller */ scsiModeSelect (pSpd31, 1, 0, modeData, sizeof (modeData)); /* * delete and re-create the SCSI_PHYS_DEV so that INQUIRY will return the * new device parameters, i.e., correct number of blocks */ scsiPhysDevDelete (pSpd31); if ((pSpd31 = scsiPhysDevCreate (pSysScsiCtrl, 3, 1, 0, NONE, 0, 0, 0)) == (SCSI_PHYS_DEV *) NULL) { printErr ("usrScsiConfig: scsiPhysDevCreate failed.\n"); return (ERROR); } if ((pSbdFloppy = scsiBlkDevCreate (pSpd31, 0, 0)) == NULL) { printErr ("usrScsiConfig: scsiBlkDevCreate failed.\n"); return (ERROR); } /* * Fill in the <blksPerTrack> (blocks (or sectors) per track) and <nHeads> * (number of heads) BLK_DEV fields, since it is impossible to ascertain * this information from the SCSI adapter card. This is important for * PC compatibility, primarily. */ scsiBlkDevInit ((SCSI_BLK_DEV *) pSbdFloppy, 15, 2); /* Initialize as a dosFs device */ /* * NOTE: pSbdFloppy is declared globally in case the following call * fails, in which case dosFsMkfs or dosFsDevInit can be * called (from the shell) with pSbdFloppy as an argument * (assuming pSbdFloppy != NULL) */ if (dosFsDevInit ("/fd0/", pSbdFloppy, NULL) == NULL) { printErr ("usrScsiConfig: dosFsDevInit failed.\n"); return (ERROR); } /* * CD-ROM DRIVE CONFIGURATION * * In order to configure a CD-ROM drive with cdromFs file system, * the following device specific code serves as an example. */ /* configure a SCSI CDROM at busId 6, LUN = 0 */ if ((pSpd60 = scsiPhysDevCreate (pSysScsiCtrl, 6, 0, 0, NONE, 0, 0, 0)) == (SCSI_PHYS_DEV *) NULL) { SCSI_DEBUG_MSG ("sysScsiConfig: scsiPhysDevCreate failed for CDROM.\n", 0, 0, 0, 0, 0, 0); } else if( (pSbdCd = scsiBlkDevCreate (pSpd60, 0, 0))== NULL ) { SCSI_DEBUG_MSG ("sysScsiConfig: scsiBlkDevCreate failed for CDROM.\n", 0, 0, 0, 0, 0, 0); } /* * Create an instance of a CDROM device in the I/O system. A block device * should have been created. The "cdromFsDevCreate" calls "iosDrvInstall" * which enters the appropriate driver routines in the I/O driver table. */ if ((cdVolDesc = cdromFsDevCreate ("cdrom:", (BLK_DEV *) pBlkDev)) == NULL) { printErr (ERROR); } /* * TAPE DRIVE CONFIGURATION * * In order to configure a sequential access tape device and a tapeFs * file system, the following code will serve as an example. Note that * sequential access and tapeFs support are only available via SCSI-2. * To make sure that SCSI-2 is being used, check for the INCLUDE_SCSI2 * macro definition in the BSP. * * The tape device does not support synchronous data transfers * or wide data transfers. Therefore, turn off the automatic configuration * of these features within VxWorks. */ scsiId = 4; which = SCSI_SET_OPT_XFER_PARAMS | SCSI_SET_OPT_WIDE_PARAMS; options.maxOffset = SCSI_SYNC_XFER_ASYNC_OFFSET; options.minPeriod = SCSI_SYNC_XFER_ASYNC_PERIOD; options.xferWidth = SCSI_WIDE_XFER_SIZE_NARROW; if (scsiTargetOptionsSet (pSysScsiCtrl, scsiId, &options, which) == ERROR) { printf ("Could not set target option parameters\n"); return (ERROR); } /* create SCSI physical device and sequential device */ if ((pSpd40 = scsiPhysDevCreate (pSysScsiCtrl, scsiId, 0,0,NONE,0,0,0)) == NULL) { printErr ("scsiPhysDevCreate failed.\n"); return (ERROR); } if ((pSd0 = scsiSeqDevCreate (pSpd40)) == NULL) { printErr ("scsiSeqDevCreate failed.\n"); return (ERROR); } /* configure a fixed block and rewind, tape file system */ pTapeConfig = (TAPE_CONFIG *) calloc (sizeof(TAPE_CONFIG),1); pTapeConfig->rewind = TRUE; /* rewind device */ pTapeConfig->blkSize = 512; /* fixed 512 byte block */ if (tapeFsDevInit ("/tape1", pSd0, pTapeConfig) == NULL) { printErr ("tapeFsDevInit failed.\n"); return (ERROR); }#endif /*FALSE, END OF EXAMPLE CODE */ return (OK); }#endif /* INCLUDE_SCSI */
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -