📄 mscuser.c
字号:
BulkBuf[ 0] = 0x00; /* Direct Access Device */
BulkBuf[ 1] = 0x80; /* RMB = 1: Removable Medium */
BulkBuf[ 2] = 0x00; /* Version: No conformance claim to standard */
BulkBuf[ 3] = 0x01;
BulkBuf[ 4] = 36-4; /* Additional Length */
BulkBuf[ 5] = 0x80; /* SCCS = 1: Storage Controller Component */
BulkBuf[ 6] = 0x00;
BulkBuf[ 7] = 0x00;
BulkBuf[ 8] = 'K'; /* Vendor Identification */
BulkBuf[ 9] = 'e';
BulkBuf[10] = 'i';
BulkBuf[11] = 'l';
BulkBuf[12] = ' ';
BulkBuf[13] = ' ';
BulkBuf[14] = ' ';
BulkBuf[15] = ' ';
BulkBuf[16] = 'L'; /* Product Identification */
BulkBuf[17] = 'P';
BulkBuf[18] = 'C';
BulkBuf[19] = '2';
BulkBuf[20] = '1';
BulkBuf[21] = '4';
BulkBuf[22] = '8';
BulkBuf[23] = ' ';
BulkBuf[24] = 'D';
BulkBuf[25] = 'i';
BulkBuf[26] = 's';
BulkBuf[27] = 'k';
BulkBuf[28] = ' ';
BulkBuf[29] = ' ';
BulkBuf[30] = ' ';
BulkBuf[31] = ' ';
BulkBuf[32] = '1'; /* Product Revision Level */
BulkBuf[33] = '.';
BulkBuf[34] = '0';
BulkBuf[35] = ' ';
BulkLen = 36;
DataInTransfer();
}
/*
* MSC SCSI Mode Sense (6-Byte) Callback
* Parameters: None (global variables)
* Return Value: None
*/
void MSC_ModeSense6 (void) {
if (!DataInFormat()) return;
BulkBuf[ 0] = 0x03;
BulkBuf[ 1] = 0x00;
BulkBuf[ 2] = 0x00;
BulkBuf[ 3] = 0x00;
BulkLen = 4;
DataInTransfer();
}
/*
* MSC SCSI Mode Sense (10-Byte) Callback
* Parameters: None (global variables)
* Return Value: None
*/
void MSC_ModeSense10 (void) {
if (!DataInFormat()) return;
BulkBuf[ 0] = 0x00;
BulkBuf[ 1] = 0x06;
BulkBuf[ 2] = 0x00;
BulkBuf[ 3] = 0x00;
BulkBuf[ 4] = 0x00;
BulkBuf[ 5] = 0x00;
BulkBuf[ 6] = 0x00;
BulkBuf[ 7] = 0x00;
BulkLen = 8;
DataInTransfer();
}
/*
* MSC SCSI Read Capacity Callback
* Parameters: None (global variables)
* Return Value: None
*/
void MSC_ReadCapacity (void)
{
if (!DataInFormat()) return;
/* Last Logical Block */
BulkBuf[ 0] =0x00;
BulkBuf[ 1] =0x0f;
BulkBuf[ 2] =0x5b;
BulkBuf[ 3] =0xff;
/* Block Length */
BulkBuf[ 4] = (MSC_BlockSize >> 24) & 0xFF;
BulkBuf[ 5] = (MSC_BlockSize >> 16) & 0xFF;
BulkBuf[ 6] = (MSC_BlockSize >> 8) & 0xFF;
BulkBuf[ 7] = (MSC_BlockSize >> 0) & 0xFF;
BulkLen = 8;
DataInTransfer();
}
/*
* MSC SCSI Read Format Capacity Callback
* Parameters: None (global variables)
* Return Value: None
*/
void MSC_ReadFormatCapacity (void)
{
if (!DataInFormat()) return;
BulkBuf[ 0] = 0x00;
BulkBuf[ 1] = 0x00;
BulkBuf[ 2] = 0x00;
BulkBuf[ 3] = 0x08; /* Capacity List Length */
/* Block Count */
BulkBuf[ 4] =0x00;
BulkBuf[ 5] =0x0f;
BulkBuf[ 6] =0x5c;
BulkBuf[ 7] =0x00;
/* Block Length */
BulkBuf[ 8] = 0x02; /* Descriptor Code: Formatted Media */
BulkBuf[ 9] = (MSC_BlockSize >> 16) & 0xFF;
BulkBuf[10] = (MSC_BlockSize >> 8) & 0xFF;
BulkBuf[11] = (MSC_BlockSize >> 0) & 0xFF;
BulkLen = 12;
DataInTransfer();
}
/*
* MSC Get Command Block Wrapper Callback
* Parameters: None (global variables)
* Return Value: None
*/
void MSC_GetCBW (void)
{
DWORD n,m;
for (n = 0; n < BulkLen; n++)
{
*((BYTE *)&CBW + n) = BulkBuf[n];
}
if ((BulkLen == sizeof(CBW)) && (CBW.dSignature == MSC_CBW_Signature))
{
/* Valid CBW */
CSW.dTag = CBW.dTag;
CSW.dDataResidue = CBW.dDataLength;
if ((CBW.bLUN != 0) || (CBW.bCBLength < 1) || CBW.bCBLength > 16)
{
fail: CSW.bStatus = CSW_CMD_FAILED;
MSC_SetCSW();
}
else {
switch (CBW.CB[0]) {
case SCSI_TEST_UNIT_READY: //00反映设备是否准备好?
MSC_TestUnitReady();
break;
case SCSI_REQUEST_SENSE: //03返回错误信息的细节
MSC_RequestSense();
break;
case SCSI_FORMAT_UNIT: //04格式化介质
goto fail;
case SCSI_INQUIRY: //12返回设备的特定信息
MSC_Inquiry();
break;
case SCSI_START_STOP_UNIT: //1B装载或卸载介质
goto fail;
case SCSI_MEDIA_REMOVAL: //1E加锁或解锁介质
goto fail;
case SCSI_MODE_SELECT6: //15设置设备参数
goto fail;
case SCSI_MODE_SENSE6: //1A读设备参数
MSC_ModeSense6();
break;
case SCSI_MODE_SELECT10: //55设置设备参数
goto fail;
case SCSI_MODE_SENSE10: //5A读设备参数
MSC_ModeSense10();
break;
case SCSI_READ_FORMAT_CAPACITIES: //23读格式化容量
MSC_ReadFormatCapacity();
break;
case SCSI_READ_CAPACITY: //25读逻辑块号
MSC_ReadCapacity();
break;
case SCSI_READ10: //28读逻辑块
if (MSC_RWSetup()) {
if ((CBW.bmFlags & 0x80) != 0) //数据方向,发至主机
{
IOSET1 = LED_RD; /* Turn On Read LED */
BulkStage = MSC_BS_DATA_IN; //状态设置
n=Offset;
m=Length/512;
Offset=0;
SD_READ(Memory,512,n);
sec_left=m-1;
sec_num=n+1;
Length=512;
MSC_MemoryRead();
}
else { //来自主机
USB_SetStallEP(MSC_EP_OUT);
CSW.bStatus = CSW_PHASE_ERROR;
MSC_SetCSW();
}
}
break;
case SCSI_WRITE10: //2A写逻辑块
if (MSC_RWSetup())
{
if ((CBW.bmFlags & 0x80) == 0)
{
IOSET1 = LED_WR; /* Turn On Write LED */
BulkStage = MSC_BS_DATA_OUT;
sec_num=Offset;
sec_left=Length/512;
Length=512;
Offset=0;
}
else
{
USB_SetStallEP(MSC_EP_IN);
CSW.bStatus = CSW_PHASE_ERROR;
MSC_SetCSW();
}
}
break;
case SCSI_VERIFY10: //2F验证
if (MSC_RWSetup()) {
if ((CBW.bmFlags & 0x80) == 0) {
BulkStage = MSC_BS_DATA_OUT;
MemOK = TRUE;
} else {
USB_SetStallEP(MSC_EP_IN);
CSW.bStatus = CSW_PHASE_ERROR;
MSC_SetCSW();
}
}
break;
default:
goto fail;
}
}
}
else {
/* Invalid CBW */
USB_SetStallEP(MSC_EP_IN);
USB_SetStallEP(MSC_EP_OUT);
BulkStage = MSC_BS_ERROR;
}
}
/*
* MSC Set Command Status Wrapper Callback
* Parameters: None (global variables)
* Return Value: None
*/
void MSC_SetCSW (void) {
CSW.dSignature = MSC_CSW_Signature;
USB_WriteEP(MSC_EP_IN, (BYTE *)&CSW, sizeof(CSW));
BulkStage = MSC_BS_CSW;
}
/*
* MSC Bulk In Callback
* Parameters: None (global variables)
* Return Value: None
*/
void MSC_BulkIn (void) {
switch (BulkStage)
{
case MSC_BS_DATA_IN:
switch (CBW.CB[0])
{
case SCSI_READ10:
MSC_MemoryRead();
break;
}
break;
case MSC_BS_DATA_IN_LAST:
MSC_SetCSW();
break;
case MSC_BS_DATA_IN_LAST_STALL:
USB_SetStallEP(MSC_EP_IN);
MSC_SetCSW();
break;
case MSC_BS_CSW:
BulkStage = MSC_BS_CBW;
break;
}
}
/*
* MSC Bulk Out Callback
* Parameters: None (global variables)
* Return Value: None
*/
void MSC_BulkOut (void)
{
BulkLen = USB_ReadEP(MSC_EP_OUT, BulkBuf);
switch (BulkStage)
{
case MSC_BS_CBW:
MSC_GetCBW();
break;
case MSC_BS_DATA_OUT:
switch (CBW.CB[0])
{
case SCSI_WRITE10:
MSC_MemoryWrite();
break;
case SCSI_VERIFY10:
MSC_MemoryVerify();
break;
}
break;
default:
USB_SetStallEP(MSC_EP_OUT);
CSW.bStatus = CSW_PHASE_ERROR;
MSC_SetCSW();
break;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -