📄 sysscsi.c
字号:
val = BYTE_SWAP_32_BIT ( (UINT32) *((UINT32 *) (start + i)) ); *((UINT32 *) start + i) = val; } }/********************************************************************************* inOrderExecute - enforce in-order execution of PowerPC accesses** This routine enforces in-order execution of register accesses to the SCSI* I/O processor (SIOP). It is invoked by the SCSI-2 driver, and is a* wrapper to a PowerPC assembler instruction.** RETURNS: N/A.*/void inOrderExecute () { vxEieio (); /* defined in vxALib.s */ }/* Data for example code in sysScsiConfig, modify as needed */SCSI_PHYS_DEV * pSpd20;SCSI_PHYS_DEV * pSpd31; /* SCSI_PHYS_DEV ptrs (suffix == ID, LUN) */SCSI_PHYS_DEV * pSpd40;BLK_DEV * pSbd0;BLK_DEV * pSbd1;BLK_DEV * pSbd2; /* SCSI_BLK_DEV ptrs for Winchester */BLK_DEV * pSbdFloppy; /* ptr to SCSI floppy block device */#ifdef INCLUDE_SCSI2SEQ_DEV * pSd0;TAPE_CONFIG * pTapeConfig;#endif /* INCLUDE_SCSI2 *//********************************************************************************* sysScsiConfig - system SCSI configuration** This routine is an example SCSI configuration routine.** Most of the code for this routine shows how to declare a SCSI peripheral* configuration. This routine must be edited to reflect the actual* configuration of the user's SCSI bus. This example can also be found in* src/config/usrScsi.c.** For users just getting started, hardware configurations can be tested* by defining SCSI_AUTO_CONFIG in config.h, which probes the bus and* displays all devices found. No device should have the same SCSI bus ID as* the VxWorks SCSI port (default = 7), or the same ID as any other device.* Check for proper bus termination.** This routine includes three configuration examples that demonstrate* configuration of a SCSI hard disk (any type), of an OMTI 3500 floppy disk,* and of a tape drive (any type).** The hard disk is divided into two 32-megabyte partitions and a third* partition with the remainder of the disk. The first partition is* initialized as a dosFs device. The second and third partitions are* initialized as rt11Fs devices, each with 256 directory entries.** It is recommended that the first partition on a block device (BLK_DEV) be* a dosFs device, if the intention is eventually to boot VxWorks from the* device. This will simplify the task considerably.** The floppy, since it is a removable medium device, is allowed to have only* a single partition, and dosFs is the file system of choice because it* facilitates media compatibility with IBM PC machines.** While the hard disk configuration is fairly straightforward, the floppy* setup in this example is more intricate. Note that the* scsiPhysDevCreate() call is issued twice. The first time is merely to get* a "handle" to pass to scsiModeSelect(); the default media type is* sometimes inappropriate (in the case of generic SCSI-to-floppy cards).* After the hardware is correctly configured, the handle is discarded using* scsiPhysDevDelete(), after which a second call to scsiPhysDevCreate()* correctly configures the peripheral. (Before the scsiModeSelect() call,* the configuration information was incorrect.) Also note that following* the scsiBlkDevCreate() call, correct values for <sectorsPerTrack> and* <nHeads> must be set using scsiBlkDevInit(). This is necessary for IBM PC* 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); } /* * 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); }/********************************************************************************* sysScsiInByte - BSP-specific byte input routine** This routine reads one byte at the specified address in a BSP-specific* manner. It is invoked by the SCSI-2 driver, and is a wrapper to a PowerPC* assembler routine.** RETURNS: unsigned byte*/UINT8 sysScsiInByte ( UINT32 adr /* address of where to read byte */ ) { return (sysInByte (adr)); }/********************************************************************************* sysScsiOutByte - BSP-specific byte output routine** This routine writes one byte at the specified address in a BSP-specific* manner. It is invoked by the SCSI-2 driver, and is a wrapper to a PowerPC* assembler routine.** RETURNS: N/A.*/void sysScsiOutByte ( UINT32 adr, /* address of where to write byte */ UINT8 val /* value of byte to write */ ) { sysOutByte (adr, val); }#endif /* INCLUDE_SCSI */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -