Вход на хостинг
IT-новости
20.04.2016 iPhone 2017 года поместят в водонепроницаемый корпус из стекла
Линейка iPhone в новом году серьезно поменяется. В этом уверен аналитический исследователь Мин Чи Ку......
30.07.2015 Ищем уникальный контент для сайта
Ищем уникальный контент для сайта Без уникального контента Ваш сайт обречен на то, что его страницы......
cgc.buffer = data_buff;
cgc.buflen = buff_size;
buff_size = __swab16(buff_size);
memcpy((void *)(cgc.cmd + 7), (void *)&buff_size, 2);
if(ioctl(fd, CDROM_SEND_PACKET, &cgc) < 0) {
perror("ioctl");
printf("Sense key - 0x%02x ", sense.sense_key);
printf("ASC - 0x%02x ", sense.asc);
printf("ASCQ - 0x%02x ", sense.ascq);
exit(-1);
}
/* Размер считанных данных */
memcpy(&sch_length, data_buff + 2, 2);
sch_length = __swab16(sch_length);
printf("Sub-channel data length - %d ", sch_length);
memset((void *)&cur_pos, 0, 12);
memcpy((void *)&cur_pos, data_buff + 4, 12);
printf("Data format code - %d ", cur_pos.dfc);
printf("ADR - %d ", cur_pos.adr);
printf("Track number - %d ", cur_pos.tno);
/* Текущая позиция оптического элемента */
cur_pos.a_addr = __swab32(cur_pos.a_addr);
printf("Current position - %u ", cur_pos.a_addr);
/* Освобождаем память и выходим */
free(data_buff);
return;
}
Полный листинг программы позиционирования оптического элемента и чтения текущей позиции находится в файле IOCTL/read_subch.c.
Результаты работы программы показали, что разные приводы выполняют команду позиционирования с разной точностью. Из двух имеющихся в моём распоряжении приводов лучший результат показал TEAC – из 30 попыток позиционирования на разные сектора не было зафиксировано ни одного промаха. У MITSUMI картина прямо противоположная: из 30 попыток ни одного точного попадания в заданный сектор, постоянные перелеты. Результаты работы программы для разных типов привода находятся в каталоге IOCTL/RESULT, файлы TEAC и MITSUMI.
Кроме спецификатора CDROM_SEND_PACKET, в файле <linux/cdrom.h> определён целый набор специализированных команд, выполняющих определенное действие и не требующих формирования командного пакета в том объеме, который был нами рассмотрен в предыдущих примерах. Это в значительной степени упрощает работу с устройством. Например, команда для открытия и закрытия лотка CD-ROM выглядит следующим образом:
ioctl(fd, CDROMEJECT); // открыть лоток CD-ROM
ioctl(fd, CDROMCLOSETRAY); // закрыть его
Рассмотрим пример функции, которая считывает TOC компакт-диска.
#define CD_DEVICE "/dev/cdrom"
int read_toc()
{
int fd, i;
/* Структура struct cdrom_tochdr содержит заголовок содержимого TOC, структура struct cdrom_tocentry –
* дескриптор трека. Обе структуры определены в файле <linux/cdrom.h>
*/
struct cdrom_tochdr hdr;
struct cdrom_tocentry toc;
/* Открываем файл устройства */