⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 freescale

📁 Freescale 系列单片机常用模块与综合系统设计
💻
📖 第 1 页 / 共 2 页
字号:
    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 + -