Вход на хостинг
IT-новости
20.04.2016 iPhone 2017 года поместят в водонепроницаемый корпус из стекла
Линейка iPhone в новом году серьезно поменяется. В этом уверен аналитический исследователь Мин Чи Ку......
30.07.2015 Ищем уникальный контент для сайта
Ищем уникальный контент для сайта Без уникального контента Ваш сайт обречен на то, что его страницы......
Рисунок 16. Формат блока данных о текущей позиции оптического элемента
Заголовок блока содержит длину считанных из устройства данных. Координаты текущей позиции оптического элемента находятся в поле Absolute CD-ROM Address.
Функция, выполняющая позиционирование оптического элемента устройства на заданный сектор:
int seek(__u32 lba)
{
struct cdrom_generic_command cgc;
struct request_sense sense;
memset((void *)&cgc, 0, sizeof(struct cdrom_generic_command));
memset(&sense, 0, sizeof(sense));
/* Формируем пакетную команду */
cgc.cmd[0] = GPCMD_SEEK; // код команды SEEK (0x2B)
cgc.sense = &sense;
cgc.data_direction = CGC_DATA_NONE; // нет обмена данными
/* Координаты сектора */
lba = __swab32(lba);
memcpy((void *)(cgc.cmd + 2), (void *)&lba, 4);
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);
return -1;
}
return 0;
}
Следующая структура описывает формат блока данных о текущей позиции оптического элемента (см. рис.16):
struct current_position {
__u8 dfc; // Data Format Code
__u8 ctrl :4; // Control
__u8 adr :4; // ADR
__u8 tno; // Track number
__u8 ino; // Index number
__u32 a_addr; // Absolute CD-ROM Address
__u32 r_addr; // Track Relative CD-ROM Address
} __attribute__ ((packed)) cur_pos;
Функция, выполняющая чтение данных о текущей позиции оптического элемента устройства:
void read_subch()
{
__u16 buff_size = 16; // размер запрашиваемых данных (4 байта заголовка + 12 байт данных)
__u8 *data_buff; // указатель на буфер для данных Q-субканала
__u16 sch_length = 0; // размер блока данных Q-субканала
struct cdrom_generic_command cgc;
struct request_sense sense;
memset((void *)&cgc, 0, sizeof(struct cdrom_generic_command));
memset(&sense, 0, sizeof(struct request_sense));
/* Выделяем память */
data_buff = (__u8 *)malloc(buff_size);
memset(data_buff, 0, buff_size);
/* Формируем пакетную команду */
cgc.cmd[0] = GPCMD_READ_SUBCHANNEL; // код команды
cgc.cmd[2] = 0x40; // бит SUBQ установлен – данные Q-субканала считываются
cgc.cmd[3] = 1; // читаем данные о текущей позиции
cgc.sense = &sense;
cgc.data_direction = CGC_DATA_READ; // направление передачи данных