knight19931997
驱动牛犊
驱动牛犊
  • 注册日期2002-06-16
  • 最后登录2009-02-11
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望10点
  • 贡献值1点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1328回复:0

isp1160来读写U盘问题请教

楼主#
更多 发布于:2005-03-22 11:29
我用isp1160来读写U盘,标准设备的枚举都已经通过。
得到了U盘的BILKOUT和BILKin端点,我向OUT端点
发出CBW包后,1160返回的PTD是正常的(表明CBW已经发出),
然后我又向in端点发出in包,以获得数据,但是1160返回的PTD
中的
active=1
actualbyte=0
completion=0
 
表明1160好像没处理此in包似的,是不是toggle有问题呀?
或者是不是U盘在读写钱要先Bulk-Only Mass Storage Reset?但是我参考的sl811读U盘
源代码里就没有Bulk-Only Mass Storage Reset(见EnumMassDev(void))。
 
out和in端点的toggle是不是彼此独立的,还是要相互影响呀?
 
 
请帮帮我把
 
 

///////////////////////////////////////////////////////////////////////////
unsigned char EnumMassDev(void)
{
 
 PMBR_BLOCK pMBR;
 PBPB_BLOCK pBPB;
 ////////////////////////////////////////////////////
 if(!SPC_Inquiry())
  return FALSE;
  if(!SPC_TestUnit())
  return FALSE;
 if(!SPC_LockMedia())
  return FALSE;
 if(!SPC_RequestSense())
  return FALSE;
 if(!SPC_TestUnit())
  return FALSE;
 if(!RBC_ReadCapacity())
  return FALSE;
 ////////////////////////////////////////////////////
 pMBR=(PMBR_BLOCK)DBUF;
 DeviceInfo.BPB_BytesPerSec=512; //暂假设为512
 
 if(!SPC_RequestSense())
  return FALSE;
 if(!SPC_TestUnit())
  return FALSE;
 if(!RBC_ReadCapacity())
  return FALSE;        
 if(!RBC_Read(0x0,1,DBUF))
  return FALSE;
 //////////////////////////////////
 if(DBUF[0]==0xeb||DBUF[0]==0xe9)
  {
  DeviceInfo.StartSector=0;
  //DeviceInfo.TotalSector=SwapINT32(pMBR->TotalSector);
  }
 else
  {
 //////////////////////////////////
  DeviceInfo.StartSector=SwapINT32(pMBR->StartSector);
  //DeviceInfo.TotalSector=SwapINT32(pMBR->TotalSector);
  }
 ///////////////////////////////////////////////////////
 pBPB=(PBPB_BLOCK)DBUF;
 if(!RBC_Read(DeviceInfo.StartSector,1,DBUF))
  return FALSE;
 DeviceInfo.BPB_BytesPerSec=SwapINT16(pBPB->BPB_BytesPerSec);
 DeviceInfo.BPB_SecPerClus=pBPB->BPB_SecPerClus;
 DeviceInfo.BPB_NumFATs=pBPB->BPB_NumFATs;
 DeviceInfo.BPB_RootEntCnt=SwapINT16(pBPB->BPB_RootEntCnt);
 DeviceInfo.BPB_TotSec16=SwapINT16(pBPB->BPB_TotSec16);
 DeviceInfo.BPB_FATSz16=SwapINT16(pBPB->BPB_FATSz16);
 DeviceInfo.BPB_TotSec32=SwapINT32(pBPB->BPB_TotSec32);
 DeviceInfo.FatStartSector=DeviceInfo.StartSector+1;
 DeviceInfo.RootStartSector=DeviceInfo.StartSector+2*DeviceInfo.BPB_FATSz16+1;
 //DeviceInfo.DataStartSector=DeviceInfo.RootStartSector+DeviceInfo.BPB_RootEntCnt;
 DeviceInfo.FirstDataSector=DeviceInfo.FatStartSector+2*DeviceInfo.BPB_FATSz16+32;
 //DeviceInfo.FirstSectorofCluster=;
 ///////////////////////////////////////////////////////
 ThisFile.bFileOpen=0;
 ///////////////////////////////////////////////////////
 
 //FreeFat.SectorNum=DeviceInfo.FatStartSector;
 //FreeFat.OldSectorNum=DeviceInfo.FatStartSector;
 //FreeFat.OffsetofSector=2;
 //(!RBC_Read(FreeFat.SectorNum,1,CurFatSector))
 //  return 0x0;
 ///////////////////////////////////////////////////////
 return TRUE;
}
unsigned char SPC_Inquiry(void)
{
#define cdbInquirySPC RBC_CDB.SpcCdb_Inquiry
 //unsigned char len;
 //unsigned char retStatus=FALSE;
 TPBulk_CBW.dCBW_Signature=CBW_SIGNATURE;
 TPBulk_CBW.dCBW_Tag=0x60a624de;
 TPBulk_CBW.dCBW_DataXferLen=0x24000000;
 TPBulk_CBW.bCBW_Flag=0x80;
 TPBulk_CBW.bCBW_LUN=0;
 TPBulk_CBW.bCBW_CDBLen=sizeof(INQUIRY_SPC);
 
 /////////////////////////////////
 cdbInquirySPC.OperationCode=SPC_CMD_INQUIRY;
 cdbInquirySPC.EnableVPD=0;
 cdbInquirySPC.CmdSupportData=0;
 cdbInquirySPC.PageCode=0;
 cdbInquirySPC.AllocationLen=0x24;
 cdbInquirySPC.Control=0;
 ////////////////////////////////
 //if(!epBulkRcv(DBUF,5))
 // return FALSE;
 if(!epBulkSend((unsigned char *)&TPBulk_CBW,sizeof(TPBulk_CBW)))
  return FALSE;
 
 if(!epBulkRcv(DBUF,38))
  return FALSE;
 if(!epBulkRcv((unsigned char *)&TPBulk_CSW,13))
  return FALSE;
 ////////////////////////////////
 return TRUE;
#undef cdbInquirySPC
}
游客

返回顶部