📄 usbmpc5200sffdevlib.c
字号:
case USB_SFF_BULK_EJECT_MEDIA:
/* Only applicable if media is removable */
if ( pBulkDev->blkDev.bd_removable != TRUE )
return (ERROR);
else
{
if ( usbSFFBulkFormSFFCmd (pBulkDev,
USB_SFF_START_STOP_START,
USB_SFF_START_STOP_LOEJ,
NULL)
!= OK )
return (ERROR);
if ( usbSFFBulkCmdExecute (pBulkDev) != USB_COMMAND_SUCCESS )
{
USB_SFF_BULK_ERR ("usbSFFBulkDevIoctl: EJECT Command " \
"failed\n", 0, 0, 0, 0, 0, 0);
return (ERROR);
}
}
return (OK);
case USB_SFF_BULK_MAX_LUN:
/* May not be supported by devices having single LUN */
if (usbdVendorSpecific (usbdSFFHandle, pBulkDev->bulkDevId,
USB_RT_DEV_TO_HOST | USB_RT_CLASS | USB_RT_INTERFACE,
USB_SFF_BULK_GET_MAX_LUN, 0, pBulkDev->interface, 1,
&(pBulkDev->maxLun), &actLen) != OK )
{
USB_SFF_BULK_ERR ("usbSFFBulkDevIoctl: Failed to acquire max lun \n",
0, 0, 0, 0, 0, 0);
}
else
{
USB_SFF_BULK_DEBUG ("usbSFFBulkDevIoctl: Max Lun = %c \n",
pBulkDev->maxLun, 0, 0, 0, 0, 0);
}
return (OK);
default:
errnoSet (S_ioLib_UNKNOWN_REQUEST);
USB_SFF_BULK_DEBUG ("usbSFFBulkDevIoctl: Unknown Request\n",
0, 0, 0, 0, 0, 0);
return (ERROR);
}
}
LOCAL STATUS usbSFFBulkDevResetRecovery
(
pUSB_SFF_BULK_DEV pBulkDev /* pointer to bulk device */
)
{
OSS_MUTEX_TAKE (sffbulkDevMutex, OSS_BLOCK);
/* issue bulk-only mass storage reset request on control End point */
if ((usbdVendorSpecific (usbdSFFHandle,
pBulkDev->bulkDevId,
USB_RT_HOST_TO_DEV | USB_RT_CLASS | USB_RT_INTERFACE,
USB_SFF_BULK_RESET,
0,
pBulkDev->interface,
0,
NULL,
NULL))
!= OK )
{
USB_SFF_BULK_ERR ("usbSFFBulkDevResetRecovery: Failed to reset %x\n",
0, 0, 0, 0, 0, 0);
OSS_MUTEX_RELEASE (sffbulkDevMutex);
return (ERROR);
}
else
{
USB_SFF_BULK_DEBUG ("usbSFFBulkDevResetRecovery: Reset...done\n",
0, 0, 0, 0, 0, 0);
}
/* clear HALT feature on bulk in and bulk out end points */
if ((usbdFeatureClear (usbdSFFHandle,
pBulkDev->bulkDevId,
USB_RT_ENDPOINT,
USB_FSEL_DEV_ENDPOINT_HALT,
(pBulkDev->inEpAddress & 0x0F)))
!= OK)
{
USB_SFF_BULK_ERR ("usbSFFBulkDevResetRecovery: Failed to clear HALT feauture"\
" on bulk in Endpoint %x\n", 0, 0, 0, 0, 0, 0);
}
if ((usbdFeatureClear (usbdSFFHandle,
pBulkDev->bulkDevId,
USB_RT_ENDPOINT,
USB_FSEL_DEV_ENDPOINT_HALT,
(pBulkDev->outEpAddress & 0x0F)))
!= OK)
{
USB_SFF_BULK_ERR ("usbSFFBulkDevResetRecovery: Failed to clear HALT feauture"\
" on bulk out Endpoint %x\n", 0, 0, 0, 0, 0, 0);
}
OSS_MUTEX_RELEASE (sffbulkDevMutex);
return (OK);
}
LOCAL STATUS usbSFFBulkFormSFFCmd
(
pUSB_SFF_BULK_DEV pBulkDev, /* pointer to bulk device */
UINT SFFCmd, /* SFF 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 SFF device on the usb-SFF bus. how can we get SFF ID
*/
pBulkDev->bulkCbw.signature = USB_SFF_BULK_SWAP_32 (USB_SFF_CBW_SIGNATURE);
pBulkDev->bulkCbw.tag = USB_SFF_BULK_SWAP_32 (USB_SFF_CBW_TAG);
pBulkDev->bulkCbw.lun = 0x00;
switch (SFFCmd)
{
case USB_SFF_WRITE10: /* 10-byte SFF 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_SFF_BULK_SWAP_32(((cmdParam2) *
(pBulkDev->blkDev.bd_bytesPerBlk)));
pBulkDev->bulkCbw.direction = USB_SFF_CBW_DIR_OUT;
pBulkDev->bulkCbw.length = 0x0C;
/* 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;
pBulkDev->bulkCbw.CBD[10] = 0x0;
pBulkDev->bulkCbw.CBD[11] = 0x0;
break;
case USB_SFF_WRITE12: /* 12-byte SFF 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_SFF_BULK_SWAP_32(((cmdParam2) *
(pBulkDev->blkDev.bd_bytesPerBlk)));
pBulkDev->bulkCbw.direction = USB_SFF_CBW_DIR_OUT;
pBulkDev->bulkCbw.length = 0x0C;
pBulkDev->bulkCbw.CBD[0] = USB_SFF_WRITE12;
pBulkDev->bulkCbw.CBD[1] = 0x0;
#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);
pBulkDev->bulkCbw.CBD[6] = (UINT8)((cmdParam2 & 0xFF000000) >>24);
pBulkDev->bulkCbw.CBD[7] = (UINT8)((cmdParam2 & 0xFF0000) >>16);
pBulkDev->bulkCbw.CBD[8] = (UINT8)((cmdParam2 & 0xFF00) >>8);
pBulkDev->bulkCbw.CBD[9] = (UINT8)(cmdParam2 & 0xFF);
pBulkDev->bulkCbw.CBD[10] = 0x0;
pBulkDev->bulkCbw.CBD[11] = 0x0;
break;
case USB_SFF_READ10: /* 10-byte SFF 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_SFF_BULK_SWAP_32(((cmdParam2) *
(pBulkDev->blkDev.bd_bytesPerBlk)));
pBulkDev->bulkCbw.direction = USB_SFF_CBW_DIR_IN;
pBulkDev->bulkCbw.length = 0x0C;
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 */
pBulkDev->bulkCbw.CBD[10] = 0x0; /* Control */
pBulkDev->bulkCbw.CBD[11] = 0x0; /* Control */
break;
case USB_SFF_READ12: /* 12-byte SFF READ command */
cmdParam1 += pBulkDev->blkOffset;
/*
* For READ12 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_SFF_BULK_SWAP_32(((cmdParam2) *
(pBulkDev->blkDev.bd_bytesPerBlk)));
pBulkDev->bulkCbw.direction = USB_SFF_CBW_DIR_IN;
pBulkDev->bulkCbw.length = 0x0C;
pBulkDev->bulkCbw.CBD[0] = USB_SFF_READ12;
pBulkDev->bulkCbw.CBD[1] = 0x0;
#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);
pBulkDev->bulkCbw.CBD[6] = (UINT8)((cmdParam2 & 0xFF000000) >>24);
pBulkDev->bulkCbw.CBD[7] = (UINT8)((cmdParam2 & 0xFF0000) >>16);
pBulkDev->bulkCbw.CBD[8] = (UINT8)((cmdParam2 & 0xFF00) >>8);
pBulkDev->bulkCbw.CBD[9] = (UINT8)(cmdParam2 & 0xFF);
pBulkDev->bulkCbw.CBD[10] = 0x0;
pBulkDev->bulkCbw.CBD[11] = 0x0;
break;
case USB_SFF_INQUIRY: /* Standard 36-byte INQUIRY command */
pBulkDev->bulkCbw.dataXferLength = USB_SFF_BULK_SWAP_32 (USB_SFF_STD_INQUIRY_LEN);
pBulkDev->bulkCbw.direction = USB_SFF_CBW_DIR_IN;
pBulkDev->bulkCbw.length = 0x0C;
pBulkDev->bulkCbw.CBD[0] = USB_SFF_INQUIRY;
pBulkDev->bulkCbw.CBD[1] = 0x0;
pBulkDev->bulkCbw.CBD[2] = 0x0;
pBulkDev->bulkCbw.CBD[3] = 0x0;
pBulkDev->bulkCbw.CBD[4] = USB_SFF_STD_INQUIRY_LEN;
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;
pBulkDev->bulkCbw.CBD[10] = 0x0;
pBulkDev->bulkCbw.CBD[11] = 0x0;
break;
case USB_SFF_START_STOP_UNIT: /* for Eject/start media command */
/* Eject applicable only for removable media */
if ((cmdParam1 == USB_SFF_START_STOP_LOEJ) &
(pBulkDev->blkDev.bd_removable != TRUE))
{
status = ERROR;
break;
}
pBulkDev->bulkCbw.dataXferLength = 0;
pBulkDev->bulkCbw.direction = USB_SFF_CBW_DIR_NONE;
pBulkDev->bulkCbw.length = 0x0C;
pBulkDev->bulkCbw.CBD[0] = USB_SFF_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;
pBulkDev->bulkCbw.CBD[6] = 0x0;
pBulkDev->bulkCbw.CBD[7] = 0x0;
pBulkDev->bulkCbw.CBD[8] = 0x0;
pBulkDev->bulkCbw.CBD[9] = 0x0;
pBulkDev->bulkCbw.CBD[10] = 0x0;
pBulkDev->bulkCbw.CBD[11] = 0x0;
break;
case USB_SFF_TEST_UNIT_READY: /* Test unit ready command */
pBulkDev->bulkCbw.dataXferLength = 0;
pBulkDev->bulkCbw.direction = USB_SFF_CBW_DIR_NONE;
pBulkDev->bulkCbw.length = 0x0C;
pBulkDev->bulkCbw.CBD[0] = USB_SFF_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;
pBulkDev->bulkCbw.CBD[6] = 0x0;
pBulkDev->bulkCbw.CBD[7] = 0x0;
pBulkDev->bulkCbw.CBD[8] = 0x0;
pBulkDev->bulkCbw.CBD[9] = 0x0;
pBulkDev->bulkCbw.CBD[10] = 0x0;
pBulkDev->bulkCbw.CBD[11] = 0x0;
break;
case USB_SFF_REQ_SENSE: /* Request sense command */
pBulkDev->bulkCbw.dataXferLength =
USB_SFF_BULK_SWAP_32(USB_SFF_REQ_SENSE_LEN);
pBulkDev->bulkCbw.direction = USB_SFF_CBW_DIR_IN;
pBulkDev->bulkCbw.length = 0x0C;
pBulkDev->bulkCbw.CBD[0] = USB_SFF_REQ_SENSE;
pBulkDev->bulkCbw.CBD[1] = 0x0;
pBulkDev->bulkCbw.CBD[2] = 0x0;
pBulkDev->bulkCbw.CBD[3] = 0x0;
pBulkDev->bulkCbw.CBD[4] = USB_SFF_REQ_SENSE_LEN;
pBulkDev->bulkCbw.CBD[5] = 0x0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -