📄 freescale
字号:
vEP1Data[21] ='R'; // 21
vEP1Data[22] ='e'; // 22
vEP1Data[23] ='a'; // 23
vEP1Data[24] ='d'; // 24
vEP1Data[25] ='e'; // 25
vEP1Data[26] ='r'; // 26
vEP1Data[27] = 0x20; // 27
vEP1Data[28] = 0x20; // 28
vEP1Data[29] = 0x20; // 29
vEP1Data[30] = 0x20; // 30 ' '
vEP1Data[31] = 0x20; // 31 ' '
vEP1Data[32] = '1'; // 32 '1'
vEP1Data[33] = '.'; // 33 '.'
vEP1Data[34] = '0'; // 34 '0'
vEP1Data[35] = '0'; // 35 '0'
vCSWResult = kCSWPass;
vEP1_Cnt = 36;
EP1_Load();
vUSB_Trf_State = cCSW;
}
/*********************************************************
* Name: SCSIList1A
* Desc: SCSI command 0x1A (Mode Sense) handler
* Parameter: None
* Return: None
**********************************************************/
void SCSIList1A(void)
{
vEP1Data[0] = 0x03; // page mode
vEP1Data[1] = 0x00;
if(SD_WR == kSD_WP)
vEP1Data[2]=0x80;
else
vEP1Data[2] = 0x00; // unprotect, protect is 0x80
vEP1Data[3] = 0x00;
vCSWResult = kCSWPass;
vEP1_Cnt = 4;
EP1_Load();
vUSB_Trf_State = cCSW;
}
/*********************************************************
* Name: SCSIList23
* Desc: SCSI command 0x23 handler
* Parameter: None
* Return: None
**********************************************************/
void SCSIList23(void)
{
vIdx=0;
vEP1Data[0] = 0x00;
vEP1Data[1] = 0x00;
vEP1Data[2] = 0x00;
vEP1Data[3] = 0x10;
vEP1Data[4] = u32MaxBlocks.bytes[0];
vEP1Data[5] = u32MaxBlocks.bytes[1];
vEP1Data[6] = u32MaxBlocks.bytes[2];
vEP1Data[7] = u32MaxBlocks.bytes[3];
vEP1Data[8] = 0x02;
vEP1Data[9] = 0x00;
vEP1Data[10] = u16BlockSize.u8[0];
vEP1Data[11] = u16BlockSize.u8[1];
vEP1Data[12] = u32MaxBlocks.bytes[0];
vEP1Data[13] = u32MaxBlocks.bytes[1];
vEP1Data[14] = u32MaxBlocks.bytes[2];
vEP1Data[15] = u32MaxBlocks.bytes[3];
vEP1Data[16] = 0x00;
vEP1Data[17] = 0x00;
vEP1Data[18] = u16BlockSize.u8[0];
vEP1Data[19] = u16BlockSize.u8[1];
vCSWResult = kCSWPass;
vEP1_Cnt = 20;
EP1_Load();
vUSB_Trf_State = cCSW;
}
/*********************************************************
* Name: SCSIList25
* Desc: SCSI command 0x25 (Read Capacity) handler
* Parameter: None
* Return: None
**********************************************************/
void SCSIList25(void)
{
T32_8 u32Temp;
u32Temp.lword=u32MaxBlocks.lword-1;
vIdx=0;
vEP1Data[0] = u32Temp.bytes[0];
vEP1Data[1] = u32Temp.bytes[1];
vEP1Data[2] = u32Temp.bytes[2];
vEP1Data[3] = u32Temp.bytes[3];
vEP1Data[4] = 0x00;
vEP1Data[5] = 0x00;
vEP1Data[6] = u16BlockSize.u8[0];
vEP1Data[7] = u16BlockSize.u8[1];
vCSWResult = kCSWPass;
vEP1_Cnt = 8;
EP1_Load();
vUSB_Trf_State = cCSW;
}
/*********************************************************
* Name: SCSIList28
* Desc: SCSI command 0x28 (Read ) handler
* Parameter: None
* Return: None
**********************************************************/
void SCSIList28(void)
{
byte i;
vSD_LBA = (dword)(vCBW_Buf[kSCSI10LBAByte3])<<24;
vSD_LBA |= (dword)(vCBW_Buf[kSCSI10LBAByte2])<<16;
vSD_LBA |= (dword)(vCBW_Buf[kSCSI10LBAByte1])<<8;
vSD_LBA |= (dword)(vCBW_Buf[kSCSI10LBAByte0]);
vSD_Bnum = vCBW_Buf[kSCSI10XferLength0];
vCSWResult = kCSWPass;
for(i=0;i<vSD_Bnum;i++)
{
SD_Read_Block(vSD_LBA,vEP1Data);
vUSB_Trf_State = cEP1Tx;
vEP1Idx =0;
vEP1_Cnt=512;
EP1_Load();
while(vEP1_Cnt);
vSD_LBA++;
}
vUSB_Trf_State = cCSW;
}
/*********************************************************
* Name: SCSIList2A
* Desc: SCSI command 0x2A (Write) handler
* Parameter: None
* Return: None
**********************************************************/
void SCSIList2A(void)
{
byte i;
vSD_LBA = (dword)(vCBW_Buf[kSCSI10LBAByte3])<<24;
vSD_LBA |= (dword)(vCBW_Buf[kSCSI10LBAByte2])<<16;
vSD_LBA |= (dword)(vCBW_Buf[kSCSI10LBAByte1])<<8;
vSD_LBA |= (dword)(vCBW_Buf[kSCSI10LBAByte0]);
vSD_Bnum = vCBW_Buf[kSCSI10XferLength0];
for(i=0;i<vSD_Bnum;i++)
{
while(vEP2Idx !=512);
SD_Write_Block(vSD_LBA,vEP2Data);
vEP2Idx =0;
EP2Bo.Stat._byte=vEP2State;
vSD_LBA++;
}
vCSWResult = kCSWPass;
Send_CSW();
}
/*********************************************************
* Name: SCSI_NotSupport
* Desc: Handle Not support SCSI command
* Parameter: None
* Return: None
**********************************************************/
void SCSI_NotSupport(void) {
byte count;
vCSWResult= kCSWFailed;
count=vCBW_Buf[kCBWXferLength0] | vCBW_Buf[kCBWXferLength1] | vCBW_Buf[kCBWXferLength2] | vCBW_Buf[kCBWXferLength3];
if(count)
{
if( (vCBW_Buf[kCBWFlags] & kCBWDirection) == kHost2Device)
{
EPCTL2_EPSTALL =1; // STALL OUT endpoint
Send_CSW();
}
else
{ // device to host
vEP1_Cnt = 0;
EP1_Load();
vUSB_Trf_State = cCSW;
}
}
else // zero data
Send_CSW();
}
/*********************************************************
* Name: SCSI_Process
* Desc: SCSI command handler
* Parameter: None
* Return: None
**********************************************************/
void SCSI_Process(void)
{
vUSBCBWTag[0]=vCBW_Buf[kCBWTag0];
vUSBCBWTag[1]=vCBW_Buf[kCBWTag1];
vUSBCBWTag[2]=vCBW_Buf[kCBWTag2];
vUSBCBWTag[3]=vCBW_Buf[kCBWTag3];
vEP1Idx =0;
switch(vCBW_Buf[kCBWSCSICommand])
{
case 0x00:
SCSIList00();
break;
case 0x03:
SCSIList03();
break;
case 0x12:
SCSIList12();
break;
case 0x1A:
SCSIList1A();
break;
case 0x23:
SCSIList23();
break;
case 0x25:
SCSIList25();
break;
case 0x28:
SCSIList28();
break;
case 0x2A:
SCSIList2A();
break;
default:
SCSI_NotSupport();
break;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -