usbmpc5200devlib.c
来自「MPC5200 BSP 支持ATA,USB, I2C,扩展网口」· C语言 代码 · 共 1,989 行 · 第 1/5 页
C
1,989 行
if ( usbBulkCmdExecute (pBulkDev) != USB_COMMAND_SUCCESS )
{
USB_BULK_ERR ("usbBulkDevIoctl: EJECT Command " \
"failed\n", 0, 0, 0, 0, 0, 0);
return (ERROR);
}
}
return (OK);
case USB_BULK_MAX_LUN:
/* May not be supported by devices having single LUN */
if (usbdVendorSpecific (usbdHandle, pBulkDev->bulkDevId,
USB_RT_DEV_TO_HOST | USB_RT_CLASS | USB_RT_INTERFACE,
USB_BULK_GET_MAX_LUN, 0, pBulkDev->interface, 1,
&(pBulkDev->maxLun), &actLen) != OK )
{
USB_BULK_ERR ("usbBulkDevIoctl: Failed to acquire max lun \n",
0, 0, 0, 0, 0, 0);
}
else
{
USB_BULK_DEBUG ("usbBulkDevIoctl: Max Lun = %c \n",
pBulkDev->maxLun, 0, 0, 0, 0, 0);
}
return (OK);
default:
errnoSet (S_ioLib_UNKNOWN_REQUEST);
USB_BULK_DEBUG ("usbBulkDevIoctl: Unknown Request\n",
0, 0, 0, 0, 0, 0);
return (ERROR);
}
}
LOCAL STATUS usbBulkDevResetRecovery
(
pUSB_BULK_DEV pBulkDev /* pointer to bulk device */
)
{
OSS_MUTEX_TAKE (bulkDevMutex, OSS_BLOCK);
/* issue bulk-only mass storage reset request on control End point */
if ((usbdVendorSpecific (usbdHandle,
pBulkDev->bulkDevId,
USB_RT_HOST_TO_DEV | USB_RT_CLASS | USB_RT_INTERFACE,
USB_BULK_RESET,
0,
pBulkDev->interface,
0,
NULL,
NULL))
!= OK )
{
USB_BULK_ERR ("usbBulkDevResetRecovery: Failed to reset %x\n",
0, 0, 0, 0, 0, 0);
OSS_MUTEX_RELEASE (bulkDevMutex);
return (ERROR);
}
else
{
USB_BULK_DEBUG ("usbBulkDevResetRecovery: Reset...done\n",
0, 0, 0, 0, 0, 0);
}
/* clear HALT feature on bulk in and bulk out end points */
if ((usbdFeatureClear (usbdHandle,
pBulkDev->bulkDevId,
USB_RT_ENDPOINT,
USB_FSEL_DEV_ENDPOINT_HALT,
(pBulkDev->inEpAddress & 0x0F)))
!= OK)
{
USB_BULK_ERR ("usbBulkDevResetRecovery: Failed to clear HALT feauture"\
" on bulk in Endpoint %x\n", 0, 0, 0, 0, 0, 0);
}
if ((usbdFeatureClear (usbdHandle,
pBulkDev->bulkDevId,
USB_RT_ENDPOINT,
USB_FSEL_DEV_ENDPOINT_HALT,
(pBulkDev->outEpAddress & 0x0F)))
!= OK)
{
USB_BULK_ERR ("usbBulkDevResetRecovery: Failed to clear HALT feauture"\
" on bulk out Endpoint %x\n", 0, 0, 0, 0, 0, 0);
}
OSS_MUTEX_RELEASE (bulkDevMutex);
return (OK);
}
LOCAL STATUS usbBulkFormScsiCmd
(
pUSB_BULK_DEV pBulkDev, /* pointer to bulk device */
UINT scsiCmd, /* SCSI command */
UINT cmdParam1, /* command parameter */
UINT cmdParam2 /* command parameter */
)
{
BOOL status = OK;
/* TODO : how to support a LUN other than 0. Also support for more than
* one scsi device on the usb-scsi bus. how can we get SCSI ID
*/
pBulkDev->bulkCbw.signature = USB_BULK_SWAP_32 (USB_CBW_SIGNATURE);
pBulkDev->bulkCbw.tag = USB_BULK_SWAP_32 (USB_CBW_TAG);
pBulkDev->bulkCbw.lun = 0x00;
switch (scsiCmd)
{
case USB_SCSI_WRITE10: /* 6-byte SCSI WRITE command */
cmdParam1 += pBulkDev->blkOffset; /* add offset to blk number */
/*
* For WRITE10 command, cmdParam1 refers to the block number from
* which cmdParam2 number of blocks are to be written. Calculate
* the transfer length based on the block size and num. of blocks
*/
pBulkDev->bulkCbw.dataXferLength = USB_BULK_SWAP_32(((cmdParam2) *
(pBulkDev->blkDev.bd_bytesPerBlk)));
pBulkDev->bulkCbw.direction = USB_CBW_DIR_OUT;
pBulkDev->bulkCbw.length = 0x0A;
/* op code */
pBulkDev->bulkCbw.CBD[0] = 0x2A;
/* DPU, FOA, and RELADR bits*/
pBulkDev->bulkCbw.CBD[1] = 0x0;
/* lba is bytes 2-5 MSB first, LSB .last */
#if 0
pBulkDev->bulkCbw.CBD[2] = 0x0;
pBulkDev->bulkCbw.CBD[3] = 0x0;
#else
pBulkDev->bulkCbw.CBD[2] = (UINT8)((cmdParam1 & 0xFF000000) >>24);;
pBulkDev->bulkCbw.CBD[3] = (UINT8)((cmdParam1 & 0xFF0000) >>16);;
#endif
pBulkDev->bulkCbw.CBD[4] = (UINT8)((cmdParam1 & 0xFF00) >>8);
pBulkDev->bulkCbw.CBD[5] = (UINT8)(cmdParam1 & 0xFF);
/* Reserved */
pBulkDev->bulkCbw.CBD[6] = 0x0;
/* transfer length */
pBulkDev->bulkCbw.CBD[7] = (UINT8)((cmdParam2 & 0xFF00) >>8);
pBulkDev->bulkCbw.CBD[8] = (UINT8)(cmdParam2 & 0xFF);
/* Control */
pBulkDev->bulkCbw.CBD[9] = 0x0;
break;
case USB_SCSI_WRITE6: /* 6-byte SCSI WRITE command */
cmdParam1 += pBulkDev->blkOffset; /* add offset to blk number */
/*
* For WRITE6 command, cmdParam1 refers to the block number from
* which cmdParam2 number of blocks are to be written. Calculate
* the transfer length based on the block size and num. of blocks
*/
pBulkDev->bulkCbw.dataXferLength = USB_BULK_SWAP_32(((cmdParam2) *
(pBulkDev->blkDev.bd_bytesPerBlk)));
pBulkDev->bulkCbw.direction = USB_CBW_DIR_OUT;
pBulkDev->bulkCbw.length = 0x06;
pBulkDev->bulkCbw.CBD[0] = USB_SCSI_WRITE6;
pBulkDev->bulkCbw.CBD[1] = 0x0;
pBulkDev->bulkCbw.CBD[2] = (UINT8)((cmdParam1 & 0xFF00) >>8) ;
pBulkDev->bulkCbw.CBD[3] = (UINT8)(cmdParam1 & 0xFF);
pBulkDev->bulkCbw.CBD[4] = (UINT8)cmdParam2;
pBulkDev->bulkCbw.CBD[5] = 0x0;
break;
case USB_SCSI_READ10: /* 10-byte SCSI READ command */
cmdParam1 += pBulkDev->blkOffset;
/*
* For READ10 command, cmdParam1 refers to the block number from
* which cmdParam2 number of blocks are to be read. Calculate
* the transfer length based on the block size and num. of blocks
*/
pBulkDev->bulkCbw.dataXferLength = USB_BULK_SWAP_32(((cmdParam2) *
(pBulkDev->blkDev.bd_bytesPerBlk)));
pBulkDev->bulkCbw.direction = USB_CBW_DIR_IN;
pBulkDev->bulkCbw.length = 0x0A;
pBulkDev->bulkCbw.CBD[0] = 0x28; /* op code */
pBulkDev->bulkCbw.CBD[1] = 0x0; /* DPU, FOA, and RELADR bits*/
#if 0
pBulkDev->bulkCbw.CBD[2] = 0x0; /* lba is bytes 2-5 MSB */
pBulkDev->bulkCbw.CBD[3] = 0x0; /* lba is bytes 2-5 */
#else
pBulkDev->bulkCbw.CBD[2] = (UINT8)((cmdParam1 & 0xFF000000) >>24); /* lba is bytes 2-5 MSB */
pBulkDev->bulkCbw.CBD[3] = (UINT8)((cmdParam1 & 0xFF0000) >>16); /* lba is bytes 2-5 */
#endif
pBulkDev->bulkCbw.CBD[4] = (UINT8)((cmdParam1 & 0xFF00) >>8); /* lba is bytes 2-5 */
pBulkDev->bulkCbw.CBD[5] = (UINT8)(cmdParam1 & 0xFF); /* lba is bytes 2-5 LSB*/
pBulkDev->bulkCbw.CBD[6] = 0x0; /* Reserved */
pBulkDev->bulkCbw.CBD[7] = (UINT8)((cmdParam2 & 0xFF00) >>8); /* transfer length MSB */
pBulkDev->bulkCbw.CBD[8] = (UINT8)(cmdParam2 & 0xFF); /* transfer length LSB */
pBulkDev->bulkCbw.CBD[9] = 0x0; /* Control */
break;
case USB_SCSI_READ6: /* 6-byte SCSI READ command */
cmdParam1 += pBulkDev->blkOffset;
/*
* For READ6 command, cmdParam1 refers to the block number from
* which cmdParam2 number of blocks are to be read. Calculate
* the transfer length based on the block size and num. of blocks
*/
pBulkDev->bulkCbw.dataXferLength = USB_BULK_SWAP_32(((cmdParam2) *
(pBulkDev->blkDev.bd_bytesPerBlk)));
pBulkDev->bulkCbw.direction = USB_CBW_DIR_IN;
pBulkDev->bulkCbw.length = 0x06;
pBulkDev->bulkCbw.CBD[0] = USB_SCSI_READ6;
pBulkDev->bulkCbw.CBD[1] = 0x0;
pBulkDev->bulkCbw.CBD[2] = (UINT8)((cmdParam1 & 0xFF00) >>8) ;
pBulkDev->bulkCbw.CBD[3] = (UINT8)(cmdParam1 & 0xFF);
pBulkDev->bulkCbw.CBD[4] = (UINT8)cmdParam2;
pBulkDev->bulkCbw.CBD[5] = 0x0;
break;
case USB_SCSI_INQUIRY: /* Standard 36-byte INQUIRY command */
pBulkDev->bulkCbw.dataXferLength = USB_BULK_SWAP_32 (USB_SCSI_STD_INQUIRY_LEN);
pBulkDev->bulkCbw.direction = USB_CBW_DIR_IN;
pBulkDev->bulkCbw.length = 0x06;
pBulkDev->bulkCbw.CBD[0] = USB_SCSI_INQUIRY;
pBulkDev->bulkCbw.CBD[1] = 0x0;
pBulkDev->bulkCbw.CBD[2] = 0x0;
pBulkDev->bulkCbw.CBD[3] = 0x0;
pBulkDev->bulkCbw.CBD[4] = USB_SCSI_STD_INQUIRY_LEN;
pBulkDev->bulkCbw.CBD[5] = 0x0;
break;
case USB_SCSI_START_STOP_UNIT: /* for Eject/start media command */
/* Eject applicable only for removable media */
if ((cmdParam1 == USB_SCSI_START_STOP_LOEJ) &
(pBulkDev->blkDev.bd_removable != TRUE))
{
status = ERROR;
break;
}
pBulkDev->bulkCbw.dataXferLength = 0;
pBulkDev->bulkCbw.direction = USB_CBW_DIR_NONE;
pBulkDev->bulkCbw.length = 0x06;
pBulkDev->bulkCbw.CBD[0] = USB_SCSI_START_STOP_UNIT;
pBulkDev->bulkCbw.CBD[1] = 0x0;
pBulkDev->bulkCbw.CBD[2] = 0x0;
pBulkDev->bulkCbw.CBD[3] = 0x0;
pBulkDev->bulkCbw.CBD[4] = (UINT8)cmdParam1;
pBulkDev->bulkCbw.CBD[5] = 0x0;
break;
case USB_SCSI_TEST_UNIT_READY: /* Test unit ready command */
pBulkDev->bulkCbw.dataXferLength = 0;
pBulkDev->bulkCbw.direction = USB_CBW_DIR_NONE;
pBulkDev->bulkCbw.length = 0x06;
pBulkDev->bulkCbw.CBD[0] = USB_SCSI_TEST_UNIT_READY;
pBulkDev->bulkCbw.CBD[1] = 0x0;
pBulkDev->bulkCbw.CBD[2] = 0x0;
pBulkDev->bulkCbw.CBD[3] = 0x0;
pBulkDev->bulkCbw.CBD[4] = 0x0;
pBulkDev->bulkCbw.CBD[5] = 0x0;
break;
case USB_SCSI_REQ_SENSE: /* Request sense command */
pBulkDev->bulkCbw.dataXferLength =
USB_BULK_SWAP_32(USB_SCSI_REQ_SENSE_LEN);
pBulkDev->bulkCbw.direction = USB_CBW_DIR_IN;
pBulkDev->bulkCbw.length = 0x06;
pBulkDev->bulkCbw.CBD[0] = USB_SCSI_REQ_SENSE;
pBulkDev->bulkCbw.CBD[1] = 0x0;
pBulkDev->bulkCbw.CBD[2] = 0x0;
pBulkDev->bulkCbw.CBD[3] = 0x0;
pBulkDev->bulkCbw.CBD[4] = USB_SCSI_REQ_SENSE_LEN;
pBulkDev->bulkCbw.CBD[5] = 0x0;
break;
case USB_SCSI_FORMAT_UNIT: /* Format Unit command */
/* issue a FORMAT UNIT command with default parameters */
pBulkDev->bulkCbw.dataXferLength = 0;
pBulkDev->bulkCbw.direction = USB_CBW_DIR_NONE;
pBulkDev->bulkCbw.length = 0x06;
pBulkDev->bulkCbw.CBD[0] = USB_SCSI_FORMAT_UNIT;
pBulkDev->bulkCbw.CBD[1] = 0x0;
pBulkDev->bulkCbw.CBD[2] = 0x0;
pBulkDev->bulkCbw.CBD[3] = 0x0;
pBulkDev->bulkCbw.CBD[4] = 0x0;
pBulkDev->bulkCbw.CBD[5] = 0x0;
break;
case USB_SCSI_READ_CAPACITY: /* Read capacity command */
/*
* Provides a means to request information regarding the capacity
* of the logical unit. The response will consists of number of
* logical blocks present and the size of the block.
*/
pBulkDev->bulkCbw.dataXferLength =
USB_BULK_SWAP_32(USB_SCSI_READ_CAP_LEN);
pBulkDev->bulkCbw.direction = USB_CBW_DIR_IN;
pBulkDev->bulkCbw.length = 0x0A;
pBulkDev->bulkCbw.CBD[0] = USB_SCSI_READ_CAPACITY;
pBulkDev->bulkCbw.CBD[1] = 0x0;
pBulkDev->bulkCbw.CBD[2] = 0x0;
pBulkDev->bulkCbw.CBD[3] = 0x0;
pBulkDev->bulkCbw.CBD[4] = 0x0;
pBulkDev->bulkCbw.CBD[5] = 0x0;
pBulkDev->bulkCbw.CBD[6] = 0x0;
pBulkDev->bulkCbw.CBD[7] = 0x0;
pBulkDev->bulkCbw.CBD[8] = 0x0;
pBulkDev->bulkCbw.CBD[9] = 0x0;
break;
case USB_SCSI_PREVENT_REMOVAL: /* Prevent media removal command */
/* Applicable only for removable media. Disables removal of media */
if (pBulkDev->blkDev.bd_removable != TRUE)
{
status = ERROR;
break;
}
pBulkDev->bulkCbw.dataXferLength = 0;
pBulkDev->bulkCbw.direction = USB_CBW_DIR_NONE;
pBulkDev->bulkCbw.length = 0x06;
pBulkDev->bulkCbw.CBD[0] = USB_SCSI_PREVENT_REMOVAL;
pBulkDev->bulkCbw.CBD[1] = 0x0;
pBulkDev->bulkCbw.CBD[2] = 0x0;
pBulkDev->bulkCbw.CBD[3] = 0x0;
pBulkDev->bulkCbw.CBD[4] = 0x0;
pBulkDev->bulkCbw.CBD[5] = 0x0;
break;
default:
status= ERROR;
}
return (status);
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?