iwub
驱动牛犊
驱动牛犊
  • 注册日期2002-10-09
  • 最后登录2009-06-22
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望60点
  • 贡献值0点
  • 好评度17点
  • 原创分0分
  • 专家分0分
阅读:2383回复:1

usb scsi 命令问题(多分)

楼主#
更多 发布于:2004-08-03 18:02
本人开发cf card 应用程序,有的scsi命令 可以返回正确,但是这个命令却不行。请教大虾,帮我看看,是不是命令格式的问题

不甚感激!!!谢谢!


EraseAll(char ubMode)
{ UCHAR   vcmdEraseAll[16] = {0xD8,ERASEALL,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0};
if(FI.DeviceNo==16)
    FI.DeviceNo=0;
    vcmdEraseAll[2] = ubMode;
vcmdEraseAll[6] = 0x40 |FI.DeviceNo;

   // if(!PioNonData_sign( ICSI_VENDER, ERASEALL, ubMode, 1, 0, 0, (0xa0|FI.DeviceNo)))
    if(STATUS_OK != IssueScsiCmd(vcmdEraseAll, 0, NULL, 0, NULL, 0,0))
{
        return FALSE;
    }
if(FI.DeviceNo==0)
      FI.DeviceNo=16;
return TRUE;
}


int IssueScsiCmd(UCHAR *cmd, int LunID,UCHAR *inBuffer, long inLen, UCHAR *outBuffer, long outLen,long offset)
{
    DWORD length;
DWORD returned = (DWORD) -1;
int rtn;

    SCSI_PASS_THROUGH_DIRECT_WITH_BUFFER sptdwb;

if (hDevHandle == INVALID_HANDLE_VALUE)
return STATUS_NODEVICE;

    ZeroMemory(&sptdwb, sizeof(SCSI_PASS_THROUGH_DIRECT_WITH_BUFFER));

    sptdwb.sptd.Length = sizeof(SCSI_PASS_THROUGH_DIRECT);
    sptdwb.sptd.PathId = 0;
    sptdwb.sptd.TargetId = 1;
    sptdwb.sptd.Lun = LunID;
    sptdwb.sptd.CdbLength = 16;//10;//16; // CDB6GENERIC_LENGTH;
    sptdwb.sptd.SenseInfoLength = 24;

if (inLen > 0 && inBuffer != NULL) {
   sptdwb.sptd.DataIn = SCSI_IOCTL_DATA_IN;
sptdwb.sptd.DataTransferLength = inLen;
sptdwb.sptd.DataBuffer = inBuffer;
} else if (outLen > 0 && outBuffer != NULL) {
ASSERT(inLen == 0 && inBuffer == NULL);
   sptdwb.sptd.DataIn = SCSI_IOCTL_DATA_OUT;
sptdwb.sptd.DataTransferLength = outLen;
sptdwb.sptd.DataBuffer = outBuffer;
} else {
ASSERT(outLen == 0 && outBuffer == NULL);
   sptdwb.sptd.DataIn = SCSI_IOCTL_DATA_IN;
sptdwb.sptd.DataTransferLength = 0;
sptdwb.sptd.DataBuffer = NULL;
}

    sptdwb.sptd.TimeOutValue = 2;
    sptdwb.sptd.SenseInfoOffset =
offsetof(SCSI_PASS_THROUGH_DIRECT_WITH_BUFFER, ucSenseBuf);

    CopyMemory(sptdwb.sptd.Cdb,cmd,16);

    length = sizeof(SCSI_PASS_THROUGH_DIRECT_WITH_BUFFER);

    rtn = DeviceIoControl(hDevHandle,
                             IOCTL_SCSI_PASS_THROUGH_DIRECT,
                             &sptdwb,
                             length,
                             &sptdwb,
                             length,
                             &returned,
                             FALSE);
if( sptdwb.sptd.ScsiStatus )
return STATUS_ERROR;

if (rtn && returned != -1)
return STATUS_OK;

return STATUS_ERROR;
}
iwub
iwub
驱动牛犊
驱动牛犊
  • 注册日期2002-10-09
  • 最后登录2009-06-22
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望60点
  • 贡献值0点
  • 好评度17点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-08-23 12:38
已经解决,谢谢!
有相同问题者,来函咨询:)
iwub@etang.com
iwub
游客

返回顶部