Вход на хостинг
IT-новости
20.04.2016 iPhone 2017 года поместят в водонепроницаемый корпус из стекла
Линейка iPhone в новом году серьезно поменяется. В этом уверен аналитический исследователь Мин Чи Ку......
30.07.2015 Ищем уникальный контент для сайта
Ищем уникальный контент для сайта Без уникального контента Ваш сайт обречен на то, что его страницы......
__u8 point; // POINT
__u8 min; // AMIN
__u8 sec; // ASEC
__u8 frame; // AFRAME
__u8 zero; // 0
__u8 pmin; // PMIN
__u8 psec; // PSEC
__u8 pframe; // PFRAME
} __attribute__ ((packed)) pma_t;
Обмен данными с sg-драйвером выполняет функция send_cmd(). Параметры функции:
n cmd – указатель на командный пакет;
n cmdlen – длина командного пакета;
n direction – направление передачи данных;
n data – указатель на блок памяти для данных, передаваемых устройству или принимаемых от устройства. Если обмен данными не предусмотрен, этот параметр содержит значение NULL;
n datalen – размер блока данных, на который указывает data. Если data == NULL, то datalen == 0
n timeout – значения time-out.
int send_cmd(__u8 *cmd, __u8 cmdlen, unsigned int direction, __u8 *data, __u32 datalen, unsigned int timeout)
{
int k = 0;
sg_io_hdr_t io_hdr;
/* В sense_buffer будет сохранена информация о состоянии устройства после выполнения команды */
__u8 sense_buffer[32];
/* Формируем запрос к sg-драйверу – заполняем поля структуры sg_io_hdr_t необходимыми значениями */
memset(&io_hdr, 0, sizeof(sg_io_hdr_t));
io_hdr.interface_id = 'S';
io_hdr.cmd_len = cmdlen; // длина команды
io_hdr.mx_sb_len = sizeof(sense_buffer);
io_hdr.dxfer_direction = direction; // направление передачи данных
io_hdr.dxfer_len = datalen; // размер данных
io_hdr.dxferp = data; // указатель на блок данных
io_hdr.cmdp = cmd; // указатель на командный пакет
io_hdr.sbp = sense_buffer;
io_hdr.timeout = timeout;
/* Посылаем устройству команду */
if(ioctl(sg_fd, SG_IO, &io_hdr) < 0) {
perror("SG_IO ioctl");
return -1;
}
/* Отобразим содержимое sense_buffer, если при выполнении команды произошла ошибка. Это позволит установить причину ошибки */
if((io_hdr.info & SG_INFO_OK_MASK) != SG_INFO_OK) {
if (io_hdr.sb_len_wr > 0) {
printf("Sense data: ");
for (k = 0; k < io_hdr.sb_len_wr; ++k) {
if ((k > 0) && (0 == (k % 10))) printf(" ");
printf("0x%02x ", sense_buffer[k]);
}
printf(" ");
}
if(io_hdr.masked_status)
printf("SCSI status=0x%x ", io_hdr.status);
if(io_hdr.host_status)
printf("Host_status=0x%x ", io_hdr.host_status);
if(io_hdr.driver_status)
printf("Driver_status=0x%x ", io_hdr.driver_status);
return -1;
}
return 0;
}
Проверку готовности устройства к приему команды выполняет функция test_unit_ready():
int test_unit_ready()
{
__u8 testCmdBlk[6];
/* Prepare TEST UNIT command */
memset(testCmdBlk, 0, 6);
if(send_cmd(testCmdBlk, 6, SG_DXFER_NONE, NULL, 0, 20000) < 0) {