nter0
驱动牛犊
驱动牛犊
  • 注册日期2002-12-10
  • 最后登录2008-11-17
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
阅读:1128回复:3

请教 USB 的SCSI怎样支持多个设备

楼主#
更多 发布于:2007-03-21 17:48
我的系统有Nand 和SD Card , 使用SCSI协议实现了U盘,但是现在只能认出一个设备, 请问怎样让PC知知道我有两个设备
CBW的bLUN总是0
先谢谢大家了

strcut CBW                    //命令块包结构
{
    unsigned long    dSignature;                //包标识符 USBC
    unsigned long    dTag;                    //包识别符
    unsigned long    dDataLength;            //期望传输的数据
    unsigned char    bmFlag;                    //方向标志
    unsigned char    bLUN;                    //LUN
    unsigned char    bCBLength;                //命令块大小
    unsigned char    CBWCB[16];                //命令块
rayyang2000
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2012-09-13
  • 粉丝3
  • 关注0
  • 积分1036分
  • 威望925点
  • 贡献值3点
  • 好评度823点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2007-03-22 08:45
为什么要lun一直是0呢?0和1不是正好是2个设备吗?
天天coding-debugging中----超稀饭memory dump file ======================================================== [b]Windows Device Driver Development and Consulting Service[/b] [color=blue][url]http://www.ybwork.com[/url][/color] ========================================================
shenfei5
驱动牛犊
驱动牛犊
  • 注册日期2007-03-19
  • 最后登录2007-04-10
  • 粉丝0
  • 关注0
  • 积分90分
  • 威望10点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2007-03-22 08:48
枚举时,你给设备设置了一个地址吗?一个设备至少要一个单独的地址!你的代码写的在全点。偶看看?
shenfei5@163.com
nter0
驱动牛犊
驱动牛犊
  • 注册日期2002-12-10
  • 最后登录2008-11-17
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
地板#
发布于:2007-03-23 23:53
__align(32) SCSI_DATA_STANDARD_INQUIRY g_StandardInquiry_1 =
{
    SCSI_DEVICE,    // PeriphQualifier:3, PeriphDevType:5        
    0x80,                            //bDevTypeModifier = (RMB:1, DevTypeModifier:7)
                                    // Attention:  0x80--removable disk, only support one partion, PD-DRM requirement
                                    //            0x00--local disk, can support multi-partions, 2005-1-17 , By ccyu
    0,                                // bVersion = (ISOVersion:2, ECMAVersion:3, ANSIVersion:3)
    0x01,                            // bDeviceCapability = (AENC:1, TrmIOP:1, fReserved1:2, ResponseFormat:4)
    0x00,                            // sizeof(SCSI_DATA_STANDARD_INQUIRY) - 5,    // bAdditionalLength (n-5)
    0,                                // bReserved2
    0,                                // bReserved3
    0,                                // bDeviceSup    port = (RelAddr: 1, WBus32:1, WBus16:1, Sync:1,
                                    //                Linked:1, Reserved4:1, CmdQueue:1, SoftReset:1)
    {'U','S','B','2','.','0',' ',' '},                    // sVendorID[8]
    {'S','D','_','M','M','C',' ','C','A','R','D',' ',' ',' ',' ',' '},    // sProductID[16]
    {'1','.','1','0'}                                // sProductRevision[4]    
};

__align(32) SCSI_DATA_STANDARD_INQUIRY g_StandardInquiry_2 =
{
    SCSI_DEVICE,    // PeriphQualifier:3, PeriphDevType:5
    0x80,                            // bDevTypeModifier = (RMB:1, DevTypeModifier:7)
    0,                                // bVersion = (ISOVersion:2, ECMAVersion:3, ANSIVersion:3)
    0,                                // bDeviceCapability = (AENC:1, TrmIOP:1, fReserved1:2, ResponseFormat:4)
    sizeof(SCSI_DATA_STANDARD_INQUIRY) - 5,    // bAdditionalLength (n-5)

    0,                                // bReserved2
    0,                                // bReserved3

    0,                                // bDeviceSup    port = (RelAddr: 1, WBus32:1, WBus16:1, Sync:1,
                                    //                        Linked:1, Reserved4:1, CmdQueue:1, SoftReset:1)

    {'U','S','B','2','.','0',' ',' '},                    // sVendorID[8]
    {'M','e','d','i','a',' ','P','l','a','y','e','r',' ',' ',' ',' '},    // sProductID[16]
    {'2','.','0','0'}
};

上边是设备描述表


    case SCSI_CMD_INQUIRY:
            {
                struct SCSIInquiry* pInquiry = (struct SCSIInquiry*)&SCSICBW->CBWCB[0];

                MASS_DRIVE_GetIsExistent(FIRST_TIME,SCSICBW->bLUN);
                if((pInquiry->Reserved1 == 0x01) && (pInquiry->PageCode == 0x80))        //3request SCSI serial number for DRM
                {
                    packetLen = MIN(SCSICBW->dDataLength, sizeof(SerialPage));
                    USBSlave_WriteMSCEP(SerialPage, packetLen);
                }
                else// considering all other commands as standard INQUARY command response
                {
                    packetLen = MIN(SCSICBW->dDataLength, sizeof(SCSI_DATA_STANDARD_INQUIRY));
                    if(SCSICBW->bLUN == SCSI_SDCARD_LUN)
                    {
                        USBSlave_WriteMSCEP((void *)&g_StandardInquiry_1, packetLen);
                    }
                    else
                    {
                        USBSlave_WriteMSCEP((void *)&g_StandardInquiry_2, packetLen);
                    }
                }
                SCSI_SetSenseKey(SCSICBW->bLUN, SCSI_SENSEKEY_NOSENSE,SCSI_ASC_NO_ADDITIONAL_SENSE_INFO);
            }
            break;
游客

返回顶部