2013-08-21 40 views
1

我是SCSI CDB編程的新手。我已經一些一段代碼使用6byte CDB創建SCSI 10字節CDB

ccb = (Exec_IO_CCB *)(buffer + header_size); 
ccb->ccb_length = sizeof(Exec_IO_CCB);   
ccb->cam_opcode = 0x1;  
ccb->connect_id = 0;  
ccb->data_buf_ptr = (long)(header_size + ccb->ccb_length + MAX_SENSE_LEN);  
ccb->data_xfer_length = (long)(XFER_BUFSIZE - ccb->data_buf_ptr);  
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;  
ccb->cam_flags = DATA_OUT;  
ccb->cdb[0] = 0xA; /* 0xA SCSI Opcode for write operation */  
ccb->cdb[1] = 0;  
ccb->cdb[2] = (ccb->data_xfer_length & 0xFF0000) >> 16;  
ccb->cdb[3] = (ccb->data_xfer_length & 0xFF00) >> 8;  
ccb->cdb[4] = (ccb->data_xfer_length & 0xFF);  
ccb->cdb[5] = 0; 

從上面的代碼我不理解CDB [2]和CDB如何[3]推導爲寫入命令寫入?

在類似的路線上,我正在嘗試開發10字節的CDB用於寫入命令。 如何填寫關於LBA的cdb [2-5]的數據?

ccb->cam_flags = DATA_OUT;  
ccb->cdb[0] = 0x2A;  /* 0x2A SCSI Opcode for write10 CDB */  
ccb->cdb[1] = 0;  
ccb->cdb[2] = ??  
ccb->cdb[3] = ??  
ccb->cdb[4] = ??  
ccb->cdb[5] = ??  
ccb->cdb[6] = 0;  
ccb->cdb[7] = (ccb->data_xfer_length & 0xFF);  
ccb->cdb[8] = (ccb->data_xfer_length & 0xFF);  
ccb->cdb[9] = 0; 

回答

0

看看SCSI SBC標準。這是SBC-3的草稿形式,但WRITE(6)和(10)在相當一段時間沒有改變:http://www.t10.org/ftp/t10/document.05/05-344r0.pdf。對於WRITE(6),cdb [2]和cdb [3]是邏輯塊地址的低16位,而不是傳輸長度。傳輸長度是您要編寫的塊的數量。地址是設備上您要開始編寫它們的地方。如果它在磁盤的一開始,它是LBA 0.如果設備有512字節塊,並且您想要開始寫入1 MiB,則您的地址是LBA 2048.

+0

非常感謝您的信息。 – arun

+0

我無法打開文檔。對不起再次提出基本問題。我在cdb [2]和cdb [3]上沒有得到太多的清晰度? ccb-> cdb [2] =(ccb-> data_xfer_length&0xFF0000)>> 16; ccb-> cdb [3] =(ccb-> data_xfer_length&0xFF00)>> 8; – arun

+0

ok ..明白了..現在我已經構建了10字節的寫入CDB ccb-> cam_flags = DATA_OUT; ccb-> cdb [0] = 0x2A; ccb-> cdb [1] = 0; ccb-> cdb [2] = 0; ccb-> cdb [3] = 0; ccb-> cdb [4] = 0; ccb-> cdb [5] = 2048; ccb-> cdb [6] = 0; \t ccb-> cdb [7] =(ccb-> data_xfer_length&0xFF); \t ccb-> cdb [8] =(ccb-> data_xfer_length&0xFF); \t ccb-> cdb [9] = 0; 現在我打算寫在2048th LBA,因此我已經把它放在cdb [5] 。希望我是對的。 – arun

0

您不能將2048放入字節5中,因爲字節5是一個字節而2048是短的。而是使用cdb [4] =((2048 & 0xFF00)>> 8)和cdb [5] =(2048 & 0xFF)。同樣對於cdb [7],您已經分配了data_xfer_length的低位字節,但它應該是高位字節。

0

要輕鬆形成CDB命令,您可以使用libscsicmd它既可以形成cdbs,也可以解析SCSI應答的結果,如感應緩衝區。它可能不包括所有的命令和回覆,因爲我需要的時候通過它來處理它,但我慢慢地但肯定地做到了。