0

我是 SCSI 编程的新手,因此很抱歉提出基本问题。我通过 6 字节 CDB 向磁带设备发送了 SCSI 查询命令

ccb = (Exec_IO_CCB *)( 缓冲区 + header_size );

ccb->ccb_length = sizeof(Exec_IO_CCB);

ccb->cam_opcode = 0x1;

ccb->connect_id = 0;

ccb->sense_buf_ptr = (long)(header_size + ccb->ccb_length);

ccb->sense_buf_length = MAX_SENSE_LEN;

ccb->time_out = CAM_TIMEOUT;

ccb->cdb_length = 6;

/* 对于 INQUIRY 设置 cam_flags 和 cdb[0] */

ccb->cam_flags = NO_DATA;

ccb->cdb[0] = 查询;/* 0x12 用于查询命令的 SCSI 操作码 */

ccb->cdb[1] = 0;

ccb->cdb[2] = 0;

ccb->cdb[3] = 0;

ccb->cdb[4] = 3200;

ccb->cdb[5] = 0;

SCSI 命令成功。如何捕获 INQUIRY 命令的输出,以便我可以获得供应商 ID / 产品 ID ?

我已按如下方式声明了 Execute I/O SCSI 缓冲区

类型定义结构{

long        ccb_address;            /* Address of this CCB               */
short       ccb_length;             /* CAM Control Block Length          */
char        cam_opcode;             /* CAM Operation Code                */
char        status;                 /* CAM Status                        */
long        connect_id;             /* Connect ID - no fields supported  */
long        cam_flags;              /* CAM Flags                         */
long        pd_pointer;             /* Peripheral driver pointer         */
long        next_ccb_ptr;           /* Next CCB Pointer                  */
long        req_map_info;           /* Request mapping information       */
long        call_on_comp;           /* Callback on completion            */
long        data_buf_ptr;           /* Data Buffer Pointer               */
long        data_xfer_length;       /* Data transfer length              */
long        sense_buf_ptr;          /* Sense information buffer pointer  */
char        sense_buf_length;       /* Sense information buffer length   */
char        cdb_length;             /* Command Descriptor Block (CDB)    **
                                    **  length                           */
short       num_sg_entries;         /* Number of scatter/gather entries  */
long        vendor_unique;          /* Vendor Unique field               */
char        scsi_status;            /* SCSI status                       */
char        auto_resid;             /* Auto sense residual length        */
short       reserved;               /* Reserved                          */
long        resid_length;           /* Residual length                   */
char        cdb[12];                /* Command Descriptor Block (CDB)    */
long        time_out;               /* Time-out value                    */
long        msg_buf_ptr;            /* Message buffer pointer            */
short       msg_buf_length;         /* Message buffer length             */
short       vu_flags;               /* Vendor-unique flags               */
char        tag_queue_act;          /* Tagged Queue action               */
char        tag_id;                 /* Tag ID (target only)              */
char        init_id;                /* Initiator ID (target only)        */
char        reserved2;              /* Reserved                          */

} 执行_IO_CCB;

这种结构永远不会捕获 SCSI 输出?

我已将查询结构声明如下。但我不确定 Inquire 命令将如何填充 Inquiry_Data 结构数据?

类型定义结构{

short data_valid;           /* Flag that indicates whether or not the */
                            /*   structure has been filled in with    */
                            /*   inquiry data from the device.        */
byte  periph_qual;
byte  periph_dev_type;
byte  rmb;
byte  iso_version;
byte  ecma_version;
byte  ansi_version;
byte  resp_data_format;
byte  rel_adr;
byte  sync;
byte  linked;
byte  cmd_que;
byte  sft_rst;
char  vendor_id[9];
char  prod_id[17];
char  prod_rev[5];
char  reserved;

} 查询数据;

4

1 回答 1

0

您为 cdb[4] 分配了一个 short 的第一件事,但 cdb[4] 是一个字节。由于编译器会截断,因此分配可能会在此处放置 0。由于字节 3 和 4 是分配长度,因此您已告诉目标不要发送任何内容。也许你想将 32 分配给 cdb[4]; 但由于您的 Inquiry_Data 结构是 44 字节,您可能希望将 44 分配给 cdb[4]。

于 2013-08-26T14:24:52.813 回答