阅读:1328回复:0
isp1160来读写U盘问题请教
我用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 } |
|