Вход на хостинг
IT-новости
20.04.2016 iPhone 2017 года поместят в водонепроницаемый корпус из стекла
Линейка iPhone в новом году серьезно поменяется. В этом уверен аналитический исследователь Мин Чи Ку......
30.07.2015 Ищем уникальный контент для сайта
Ищем уникальный контент для сайта Без уникального контента Ваш сайт обречен на то, что его страницы......
Рисунок 13. Формат данных TOC, Format Field = 10b
Здесь картина аналогичная – первым идёт заголовок размером 4 байта, а за ним расположены записи TOC.
Рассмотрим функцию read_toc(), выполняющую чтение TOC, при условии, что поле Format содержит 00b. Формат дескриптора трека TOC, представленный на рис. 12, описывает структура struct toc:
struct toc {
__u8 res;
__u8 adr_cntl;
__u8 trk_num; // номер трека
__u8 res1;
__u32 lba; // адрес сектора
} __attribute__ ((packed)) *t;
int read_toc()
{
#define PACKET_LEN 12 // длина пакетной команды
#define READ_TOC 0x43 // код команды READ TOC
#define MAX_TOC_LEN 804 // максимальная длина данных TOC (Format = 00b)
int i = 0;
int total_tracks = 0;
__u8 cmd_buff[PACKET_LEN];
__u8 *data_buff;
__u16 toc_length = 0, a;
/* Формируем пакетную команду. Поле Starting Track содержит 0, по команде READ TOC будет выдана информация
* обо всех треках диска, начиная с первого
*/
memset((void *)cmd_buff, 0, PACKET_LEN);
cmd_buff[0] = READ_TOC;
cmd_buff[6] = 0;
/* Размер области памяти, выделенной для данных TOC */
a = MAX_TOC_LEN;
a = __swab16(a);
memcpy((void *)(cmd_buff + 7), (void *)&a, 2);
data_buff = (__u8 *)malloc(MAX_TOC_LEN);
memset(data_buff, 0, MAX_TOC_LEN);
/* Посылаем устройству пакетную команду */
if(send_packet_data_command(MAX_TOC_LEN, cmd_buff) < 0)
return -1;
/* Считываем результат */
for(i = 0;;i += 2) {
IN_P_W(a, 0x170);
// размер данных TOC
if(i == 0) toc_length = __swab16(a);
if(i > toc_length) break;
memcpy((void *)(data_buff + i), (void *)&a, 2);
}
/* Число треков на диске */
total_tracks = data_buff[3];
/* Отобразим результат */
printf("TOC length - %d ", toc_length);
printf("First: %d ", data_buff[2]);
printf("Last: %d ", total_tracks);
/* Выделим память и скопируем туда дескрипторы треков */
t = (struct toc *)malloc(toc_length);