2013-08-22 2 views
0

SCSI 프로그래밍에 익숙하지 않아서 기본적인 질문을해서 죄송합니다. SCSI 조회 명령을 6 바이트 CDB를 통해 테이프 장치로 보냈습니다.SCSI 문의 데이터

ccb = (Exec_IO_CCB *) (buffer + 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;

/* 메시지 cam_flags 및 CDB를 세트 [0] */

ccb-> cam_flags = NO_DATA;

ccb-> cdb [0] = INQUIRY;/* 0x12 문의 명령 용 SCSI Opcode */

ccb-> cdb [1] = 0;

ccb-> cdb [2] = 0;

ccb-> cdb [3] = 0;

ccb-> cdb [4] = 3200;

ccb-> cdb [5] = 0;

SCSI 명령이 성공적으로 수행되었습니다. 내가 얻을 수있는 INQUIRY 명령의 출력을 어떻게 캡처합니까? 공급 업체 ID/제품 ID ??

제가

타입 정의 구조체 {

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       */ 

} Exec_IO_CCB를 다음과 같이은/O 버퍼 SCSI I 실행 선언;

이 구조는 절대로 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; 

Inquiry_Data};

+0

위의 질문 조회 명령의 출력을 캡처하는 데 도움이 될 수 있습니까 ?? – arun

답변

0

cdb [4]를 짧게 지정했지만 cdb [4]는 1 바이트입니다. 컴파일러가자를 것이기 때문에 할당은 아마도 0을 넣을 것입니다. 바이트 3과 4는 할당 길이이므로 대상에게 아무 것도 보내지 말라고 지시했습니다. 어쩌면 당신은 32를 cdb [4]에게 할당하려고합니다. 하지만 Inquiry_Data 구조가 44 바이트이기 때문에 44를 cdb [4]에 할당하려고합니다.

+0

ok .. 이제 46 바이트에 해당하는 16 진수를 할당했습니다. 문제가 해결되기를 바랍니다. 이제 CDB의 새로운 버전은 다음과 같습니다. ccb-> cam_flags = NO_DATA; ccb-> cdb [0] = 0x12; \t ccb-> cdb [1] = 0; ccb-> cdb [2] = 0; ccb-> cdb [3] = 0; ccb-> cdb [4] = 0x2E; ccb-> cdb [5] = 0; – arun

+0

cdb [4] 외에도 inquiry 명령이 데이터 전송을 일으키기 때문에 cam_flags의 NO_DATA가 올바르지 않다고 생각합니다. –

+0

CAM 플래그를 설정해야하는 이유가 있습니까? 나는 DATA_IN, DATA_OUT, DIS_DISC, INIT_SYNCH 등으로 시도했다. 여전히 Inquiry 명령을위한 어떤 데이터도 얻지 못한다. – arun