liweiqiao
驱动牛犊
驱动牛犊
  • 注册日期2004-10-08
  • 最后登录2007-09-27
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望2点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
阅读:4176回复:4

主机应用程序如何通过SCSI Command与USB Mass Storage Device进行通信!

楼主#
更多 发布于:2005-01-03 10:37
    小弟遇到一个问题:采用Sigmatel芯片的MP3播放器,插在电脑上以后系统会把它当作一个Standard Device来对待,我现在需要写一个这样的测试程序:通过主机端的应用程序(C/C++,VC编译)和Player端的Firmware共同工作,应用程序向处于USBMSC的Device发送16 Bytes的SCSI Command过去,这些Command是由Firmware端的测试程序定义的,Device的SCSI Library收到这些命令后传给Firmware,它成功处理后如果有结果则将结果再通过SCSI Library传给主机的应用程序,应用程序将结果显示在UI上.
    测试的内容主要是Key,Display,Contrast等.如果哪位用过Rio的测试程序就很清楚,小弟目前还没有思路,请有经验的大侠指点,谢谢!

最新喜欢:

xingzhe23xingzh...
liulin
驱动牛犊
驱动牛犊
  • 注册日期2003-01-28
  • 最后登录2009-06-19
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2005-01-03 10:56
要用vendor命令
liweiqiao
驱动牛犊
驱动牛犊
  • 注册日期2004-10-08
  • 最后登录2007-09-27
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望2点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-01-03 11:49
能不能请再详细一点说一说,谢谢!
Zhongyh
驱动牛犊
驱动牛犊
  • 注册日期2001-09-04
  • 最后登录2012-04-09
  • 粉丝1
  • 关注1
  • 积分40分
  • 威望4点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
地板#
发布于:2005-01-07 12:51
并不难,其实就是u盘读写问题,可以搜我以前回复的贴子.
的确不行可以联系我
msn:zsskyler@msn.com
liweiqiao
驱动牛犊
驱动牛犊
  • 注册日期2004-10-08
  • 最后登录2007-09-27
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望2点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2005-01-07 14:57
我现在已经可以向USB设备发送SCSI命令了,代码如下:
**********************************************************
    BOOL status = 0;
    DWORD accessMode = 0, shareMode = 0;
    HANDLE fileHandle = NULL;
    //PUCHAR dataBuffer = NULL;
    SCSI_PASS_THROUGH_WITH_BUFFERS sptwb;
    SCSI_PASS_THROUGH_DIRECT_WITH_BUFFER sptdwb;
    UCHAR buffer[2048];
    UCHAR string[25];
    ULONG length = 0,
          errorCode = 0;
    DWORD returned = 0;

    strcpy(string, "\\\\.\\");
    strcat(string, "I:");

    shareMode = FILE_SHARE_READ | FILE_SHARE_WRITE; //default
    accessMode = GENERIC_WRITE | GENERIC_READ;      //default

    fileHandle = CreateFile(string,
        accessMode,
        shareMode,
        NULL,
        OPEN_EXISTING,
        0,
        NULL);

    if (fileHandle == INVALID_HANDLE_VALUE)
    {
        MessageBox(NULL, "Create file fail", "tester", MB_OK);
        return false;
    }

    ZeroMemory(&sptwb, sizeof(SCSI_PASS_THROUGH_WITH_BUFFERS));

    sptwb.spt.Length = sizeof(SCSI_PASS_THROUGH);
    sptwb.spt.PathId = 0;
    sptwb.spt.TargetId = 1;
    sptwb.spt.Lun = 0;
    sptwb.spt.CdbLength = CDB6GENERIC_LENGTH;
    sptwb.spt.SenseInfoLength = 24;
    sptwb.spt.DataIn = SCSI_IOCTL_DATA_IN;
    sptwb.spt.DataTransferLength = 192;
    sptwb.spt.TimeOutValue = 2;
    sptwb.spt.DataBufferOffset =
        offsetof(SCSI_PASS_THROUGH_WITH_BUFFERS,ucDataBuf);
    sptwb.spt.SenseInfoOffset =
        offsetof(SCSI_PASS_THROUGH_WITH_BUFFERS,ucSenseBuf);
    sptwb.spt.Cdb[0] = SCSI_OPCODE_HWTEST_COMMAND;//SCSI_OPCODE_SIGMATEL_WRITE_COMMAND;//
    sptwb.spt.Cdb[1] = HWTEST_DISPLAY_ID; //ALLOCATE_MEDIA;
    sptwb.spt.Cdb[4] = 192;
    length = offsetof(SCSI_PASS_THROUGH_WITH_BUFFERS,ucDataBuf) +
        sptwb.spt.DataTransferLength;

    status = DeviceIoControl(fileHandle,
                             IOCTL_SCSI_PASS_THROUGH,
                             &sptwb,
                             sizeof(SCSI_PASS_THROUGH),
                             &sptwb,
                             length,
                             &returned,
                             FALSE);

    if (!status)
    {
        MessageBox(NULL, "Device I/0 control fail!", "tester", MB_OK);
        errorCode = GetLastError();
        ShowMessage(IntToStr(errorCode));
        PrintError(errorCode);
        CloseHandle(fileHandle);
        return false;
    }

    CloseHandle(fileHandle);
    return true;
*******************************************************
发送SCSI命令以后,firmware可以作出相应的动作,表明通信畅通.
现在的问题是:
(1) DeviceIoControl返回值为0,不知道是什么原因?
(2) firmware端收到我发送过去的SCSI命令作完相应的处理以后,会传回一些数据,我的应用程序到哪里去读出这些数据?
请高手指点,谢谢!
游客

返回顶部