2013-08-21 2 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 для команды записи. Как заполнить данные для cdb [2-5], на которые приходится LBA?

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; Теперь я планирую писать на 2048-м 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, таких как буферы восприятия. Он может не включать в себя все команды и ответы, когда я работаю через него, поскольку он мне нужен, но я медленно, но уверенно добираюсь до вещей.

 Смежные вопросы

  • Нет связанных вопросов^_^