初级会员

- 积分
- 86
- 金钱
- 86
- 注册时间
- 2011-4-3
- 在线时间
- 4 小时
|

楼主 |
发表于 2013-4-7 11:11:36
|
显示全部楼层
回复【3楼】正点原子:
---------------------------------
u8 SD_EraseBlock(u32 sector,u32 Offset)
{
u8 r1 ;
if (SD_Type !=SD_TYPE_V2HC)
{
sector <<= 9;
}
r1 = SD_SendCommand (CMD32,sector,0xFF); //写地址后第一块被擦除
if (r1 !=MSD_RESPONSE_NO_ERROR)
{
return ERASEDERR;
}
Offset = sector+ Offset;
r1 = SD_SendCommand (CMD33,Offset,0xFF); //写地址后第一块被擦除
if (r1 !=MSD_RESPONSE_NO_ERROR)
{
return ERASEDERR;
}
r1 = SD_SendCommand (CMD38,0,0xFF); //写地址后第一块被擦除
if (r1 !=MSD_RESPONSE_NO_ERROR)
{
return ERASEDERR;
}
return MSD_RESPONSE_NO_ERROR;
}
应放在哪里呢
void Mass_Storage_Out (void)
{
u8 CMD;
Usb_Status_Reg=0X10;//标记轮询
CMD = CBW.CB[0];
Data_Len = _GetEPRxCount(ENDP2);//GetEPRxCount(ENDP2);
PMAToUserBufferCopy(Bulk_Data_Buff, ENDP2_RXADDR, Data_Len);
switch (Bot_State)
{
case BOT_IDLE:
CBW_Decode();
break;
case BOT_DATA_OUT://USB发送数据到设备
if (CMD == SCSI_WRITE10)
{
// Usb_Status_Reg|=0X01;//标记正在写数据
SCSI_Write10_Cmd(CBW.bLUN , SCSI_LBA , SCSI_BlkLen);
break;
}
Bot_Abort(DIR_OUT);
Set_Scsi_Sense_Data(CBW.bLUN, ILLEGAL_REQUEST, INVALID_FIELED_IN_COMMAND);
Set_CSW (CSW_PHASE_ERROR, SEND_CSW_DISABLE);
break;
default:
Bot_Abort(BOTH_DIR);
Set_Scsi_Sense_Data(CBW.bLUN, ILLEGAL_REQUEST, INVALID_FIELED_IN_COMMAND);
Set_CSW (CSW_PHASE_ERROR, SEND_CSW_DISABLE);
break;
}
}
/*******************************************************************************
* Function Name: CBW_Decode
* Description : Decode the received CBW and call the related SCSI command
* routine.
* Input : None.
* Output : None.
* Return : None.
*******************************************************************************/
void CBW_Decode(void)
{
u32 Counter;
for (Counter = 0; Counter < Data_Len; Counter++)
{
*((u8 *)&CBW + Counter) = Bulk_Data_Buff[Counter];
}
CSW.dTag = CBW.dTag;
CSW.dDataResidue = CBW.dDataLength;
if (Data_Len != BOT_CBW_PACKET_LENGTH)
{
Bot_Abort(BOTH_DIR);
/* reset the CBW.dSignature to desible the clear feature until receiving a Mass storage reset*/
CBW.dSignature = 0;
Set_Scsi_Sense_Data(CBW.bLUN, ILLEGAL_REQUEST,  ARAMETER_LIST_LENGTH_ERROR);
Set_CSW (CSW_CMD_FAILED, SEND_CSW_DISABLE);
return;
}
if ((CBW.CB[0] == SCSI_READ10 ) || (CBW.CB[0] == SCSI_WRITE10 ))
{
/* Calculate Logical Block Address */
SCSI_LBA = (CBW.CB[2] << 24) | (CBW.CB[3] << 16) | (CBW.CB[4] << 8) | CBW.CB[5];
/* Calculate the Number of Blocks to transfer */
SCSI_BlkLen = (CBW.CB[7] << 8) | CBW.CB[8];
}
if (CBW.dSignature == BOT_CBW_SIGNATURE)
{
/* Valid CBW */
if ((CBW.bLUN > Max_Lun) || (CBW.bCBLength < 1) || (CBW.bCBLength > 16))
{
Bot_Abort(BOTH_DIR);
Set_Scsi_Sense_Data(CBW.bLUN, ILLEGAL_REQUEST, INVALID_FIELED_IN_COMMAND);
Set_CSW (CSW_CMD_FAILED, SEND_CSW_DISABLE);
}
else
{
switch (CBW.CB[0])
{
case SCSI_REQUEST_SENSE:
SCSI_RequestSense_Cmd (CBW.bLUN);
break;
case SCSI_INQUIRY:
SCSI_Inquiry_Cmd(CBW.bLUN);
break;
case SCSI_START_STOP_UNIT:
SCSI_Start_Stop_Unit_Cmd(CBW.bLUN);
break;
case SCSI_ALLOW_MEDIUM_REMOVAL:
SCSI_Start_Stop_Unit_Cmd(CBW.bLUN);
break;
case SCSI_MODE_SENSE6:
SCSI_ModeSense6_Cmd (CBW.bLUN);
break;
case SCSI_MODE_SENSE10:
SCSI_ModeSense10_Cmd (CBW.bLUN);
break;
case SCSI_READ_FORMAT_CAPACITIES:
SCSI_ReadFormatCapacity_Cmd(CBW.bLUN);
break;
case SCSI_READ_CAPACITY10:
SCSI_ReadCapacity10_Cmd(CBW.bLUN);
break;
case SCSI_TEST_UNIT_READY:
SCSI_TestUnitReady_Cmd(CBW.bLUN);
break;
case SCSI_READ10:
SCSI_Read10_Cmd(CBW.bLUN, SCSI_LBA , SCSI_BlkLen);
break;
case SCSI_WRITE10:
SCSI_Write10_Cmd(CBW.bLUN, SCSI_LBA , SCSI_BlkLen);
break;
case SCSI_VERIFY10:
SCSI_Verify10_Cmd(CBW.bLUN);
break;
case SCSI_FORMAT_UNIT:
SCSI_Format_Cmd(CBW.bLUN);
break;
/*Unsupported command*/
case SCSI_MODE_SELECT10:
SCSI_Mode_Select10_Cmd(CBW.bLUN);
break;
case SCSI_MODE_SELECT6:
SCSI_Mode_Select6_Cmd(CBW.bLUN);
break;
case SCSI_SEND_DIAGNOSTIC:
SCSI_Send_Diagnostic_Cmd(CBW.bLUN);
break;
case SCSI_READ6:
SCSI_Read6_Cmd(CBW.bLUN);
break;
case SCSI_READ12:
SCSI_Read12_Cmd(CBW.bLUN);
break;
case SCSI_READ16:
SCSI_Read16_Cmd(CBW.bLUN);
break;
case SCSI_READ_CAPACITY16:
SCSI_READ_CAPACITY16_Cmd(CBW.bLUN);
break;
case SCSI_WRITE6:
SCSI_Write6_Cmd(CBW.bLUN);
break;
case SCSI_WRITE12:
SCSI_Write12_Cmd(CBW.bLUN);
break;
case SCSI_WRITE16:
SCSI_Write16_Cmd(CBW.bLUN);
break;
case SCSI_VERIFY12:
SCSI_Verify12_Cmd(CBW.bLUN);
break;
case SCSI_VERIFY16:
SCSI_Verify16_Cmd(CBW.bLUN);
break;
default:
{
Bot_Abort(BOTH_DIR);
Set_Scsi_Sense_Data(CBW.bLUN, ILLEGAL_REQUEST, INVALID_COMMAND);
Set_CSW (CSW_CMD_FAILED, SEND_CSW_DISABLE);
}
}
}
}
else
{
/* Invalid CBW */
Bot_Abort(BOTH_DIR);
Set_Scsi_Sense_Data(CBW.bLUN, ILLEGAL_REQUEST, INVALID_COMMAND);
Set_CSW (CSW_CMD_FAILED, SEND_CSW_DISABLE);
}
} |
|