C-Net Week
#23
31 июля 2002 |
|
Железо - CDROM в ваш дом: документация по ATAPI(IDE) CD-ROM
CDROM в ваш дом... После того как я подключил к своему спеку PC-клаву, PC-мышку и HDD, мне стало интересно, а можно ли подключить к спеку CDROM ? В принципе то можно конечно :) Разъем то ведь IDE-стандарта. Но вся проблема в том, что контроллер у меня от господина Nemo :( и как только я подрубил шлейф к своему samsung x24 он так сразу и офигел :( перестал реагировать вообще на любые кнопки... Что ж туда ему загнал контроллер от Немо я пока не разобрался :( но вот кое-какую инфу об управлении CDROM'ом вообще и в частности я нашел в интернете. Возможно она покажется кому-то интересна. ATAPI(IDE) CD Информация к размышлению Константин Норватов (C) 1997 Данный документ никоим образом не является полным описанием стандартного ATAPI-CD. Здесь были собраны только основные данные, необходимые для общего понимания принципов функционирования. Предполагается знание (хотя бы в общих чертах) IDE-интерфейса (стандарт ходил под именем ATA-R4C.*). Для желающих быстро заполучить исходники для управления CD-ROM могу порекомендовать драйвер VIDE-CDD.SYS. Он проще всего поддается дизассемблированию и содержит достаточно неплохой код. Кроме того, в исходных текстах драйвера CD для Linux содержится много полезной информации, хотя ориентация на "юниксоидный" тип запросов мешает использованию этих текстов для компиляции под MS-DOS. Соглашения и используемые сокращения. При указании конкретных адресов подразумевается, что CD является мастером, адрес контроллера - 170h. Если у Вас используются другие адреса, вместо 17x необходимо подставить 1Fx, 1E8+x или 168+x. Тик = 18.2 герца. Данные длиной в слово или двойное слово в/из CD идут в формате co старшим первым байтом (в отличие от PC, где первый байт - младший). AP - Atapi пакет, 12 байт передаваемых в CD-Rom. Содержат команду и основные данные для нее. ВНИМАНИЕ: возможно существуют устройства c пакетом длиной в 16 байт. Однако, подавляющее большинство драйверов не анализируют и не поддерживают такой формат. Для определения размера пакета используется ATA-команда A1h. AK- Atapi команда M - минуты S - секунды F - номер фрейма(1/75 секунды) Часто используемые биты регистра состояния (177h): BSY - бит 80h DRQ - бит 08h CHK - бит 01h I. Определение наличия CD в системе Для проверки присутствия Atapi-CD устройства необходимо: 1. На нужном шлейфе выбрать требуемое устройство (Master/Slave) в регистре 176h. 2. Проверить отсутствие BSY 3. Если занято-устройства нет. Далее можно дать команду общего сброса (вывести код 8 в регистр 177h и подождать 1-3 тика), либо попробовать обойтись без этого. Если CD находится в состоянии нормального ожидания команды, сброс давать не обязательно. 3. В порты 174h и 175h записать нечто, отличающееся от 14EBh. 4. В порт 177h вывести команду ECh и подождать пару тиков. 5. Проверить порт 174h (д.б. = 14h) и порт 175h (д.б. = EBh). При этом надо учитывать, что в регистрах должна будет установлена ошибка (177h - 51h, 171h - 04h). Это нормально. Если все условия соблюдены, то можно считать, что на IDE-шлейфе присутствует Atapi устройство. Для уточнения типа устройства можно воспользоваться уже Atapi-командами. Данный алгоритм может применяться только тогда, когда достоверно известно, что CD до этого не выполнял команд. В противном случае бит BSY может быть установлен. Если необходимо, проверку регистра состояния можно смягчить, проверяя только наличие самого ATA устройства записью в регистры. II. Выполнение команд Для выполнения AK необходимо (работа без прерываний): 1. Выбрать соответствующее устройство (Master/Slave) в порту 176h 2. Дождаться готовности (BSY и DRQ = 0). Драйверы ждут до 10-20 секунд. Если готовности нет - можно попытаться сбросить привод. 3. Установить желательный размер блока в регистрах 174h (мл.) и 175h (ст. часть) Если команда не возвращает данные, это можно и не делать. Для DMA-шных обменов в этот момент надо установить и другие регистры. 4. В 177h записать команду A0h. В ответ на это устройство может установить BSY на время подготовки к приему AP. 5. Дождаться требования данных (DRQ=1 и BSY=0). (обычно ждать не надо - драйв выставляет требование сразу). При этом в регистре 172h два младших бита должны иметь значение 01. 6. В режиме словной пересылки записать в порт 170h 6 слов AP. 7. Дождаться готовности (BSY=0). (В зависимости от типа команды и других обстоятельств, драйв может выполнять команду за время от тысячных долей секунды до десятков секунд (Если, например, плохо читается сектор диска). 8. Проверить бит DRQ и если он установлен, то считать из регистров 174h и 175h длину передаваемого блока. 9. Если длина =0 или бит DRQh в 177h не установлен - п. 11, иначе произвести обмен данными через порт 170h. При этом два младших бита регистра 172h могут принимать значение 00 (при передаче данных в CD) или 02 (при приеме данных из CD). 10.Если команда не закончила обмен (бит BSY=1), то повторить с п 7. 11.После завершения команды два младших бита регистра 172 обычно принимают значение 03, что означает готовность драйва к выдаче статуса завершения команды. При этом можно проанализировать результат завершения команды (регистры 177h и 171h). При ошибках можно использовать ATAPI-функцию 03h для получения более детальной информации. III. Типы команд По режимам обмена команды можно разделить на три группы: а) Управления Как правило, все данные находятся в AP. В некоторых командах применяется дополнительно пересылаемый блок данных. Результат можно определить по регистрам ошибок (171h и 177h) или с помощью дополнительной команды получения состояния. б) Передачи данных Адресные данные и параметры передачи находятся в AP Поскольку пишущие CD не рассматриваются (мне они не известны), то блок данных, передаваемых в CD, отсутствует. Если в команде подразумевается передача данных из CD и нет ошибок, CD драйв выдает в ответ на команду блок (блоки) данных. в) Получения информации Все данные о запросе находятся в AP. В ответ на команду СD выдает блок данных. IV. ATA команды У CD есть несколько вспомогательных команд, которые исполняются так же, как и команды обычного IDE-винчестера. При этом назначение регистров совпадает с назачением по ATA. Вот основные команды: A0h - Команда передачи AP. A1h - Идентификация привода. Аналог команды ECh для IDE-винчестера, но формат выходного блока другой (описан в приложении C). ECh - Воспринимается как ошибка, но в регистрах 174h и 175h устанавливается сигнатура 14EBh - признак Atapi устройства. 08h - Програмный сброс. Выполняет процедуру начальной инициализации. Также, могут выполняться некоторые команды управления сохранением энергии, установки возможностей и пр. Во многих приводах они воспринимаются как правильные команды, но реально не исполняются или исполняются частично. V. Команды в ATAPI-пакетах Первый байт в AP является кодом команды. Это единственный байт, который анализируется всегда. Остальные 11 байт содержат информацию, зависящую от конкретной команды. ------------------------------ Команда 00h - пустышка, проверяет готовность Пакет: db 0 db 11*dup(0) ; * Ничего не делает, может применяться для проверки смены диска ПРИМЕЧАНИЯ: 1) Первая команда после смены диска будет отвергнута с кодом ошибки "смена носителя". 2) Здесь и далее: данные помеченные "*", как правило, не анализируются CD, но для совместимости должны быть установлены в 0. ------------------------------ Команда 01h - Установить головку на начало диска Пакет: db 01h db 12*dup(0) ; * Команда управляющая (практически не используется). ------------------------------ Команда 03h - читать состояние привода Пакет: db 03h db 3*dup(0) ; * db Len ; длина выходного блока db 7*dup(0) ; * На выходе таблица из 12h байт, в которой самыми интересными являются байты 2, 0С и 0D - это три байта кода ошибки последней операции. ------------------------------ Команда 012h - читать строку параметров изготовителя драйва Пакет: db 12h db 0h,0h ; иногда здесь устанавливаются некие параметры db 0h ; * db Len ; длина выходной строки db 7*dup(0) ; * Драйв выдает некую строку изготовителя (в формате изготовителя) Зависит от типа CD-Rom. Иногда применяется в драйверах для проверки соответствия драйвера и устройства. Структура выходного блока: 0 db 1Fh - тип устройства (CD =5) E0h - для CD = 1 db 7Fh - = 0 (для совм. со SCSI-1) 80h - поддерживаются сменные носители 2 db 0 - версии ISO, ECMA и ANSI. 3 db 0 - для совместимости со SCSI-2 4 db ? - длина оставшегося блока 5 db 2 dup(?) - резервные 7 db 0 - для совместимости со SCSI-2 8 db 8 dup(?) - строка изготовителя (там бывает 'ATAPI') 10h db 10h dup(?) - название продукции 20h db 4 dup(?) - ревизия Текстовые поля образуют одну строку, разделенную пробелами. ------------------------------ Команда 01Bh - управление треем и прочее Пакет: db 1Bh db 3*dup(0) ; * db Func ; подфункция db 7*dup(0) ; * Команда управляющая. Подфункции: 0-войти в режим Sleep 1-остановить проигрыв./чтение 2-выдвинуть трей 3-закрыть трей ------------------------------ Команда 01Eh - блокировка трея Пакет: db 1Eh db 3*dup(?) ; * db Func ; подфункция db 7*dup(?) ; * Команда управляющая. Младший бит Func = 0 - разблокировать трей = 1 - заблокировать трей ------------------------------ Команда 025h - получить размер вставленного диска в секторах. Пакет: db 25h db 11*dup(0) ; * Команда информационная. Пользователю в ответ передается блок из 8 байт: dd Sectors ; число секторов на текущем диске dd SectSize ; размер сектора(как правило, не зависит от диска и равен 930h) ------------------------------ Команда 02Bh - Seek Пакет: db 2Bh db 2*dup(0) ; * db M,S,F ; куда позиционироваться db 6*dup(0) ; * Команда управляющая. ------------------------------ Команда 042h - смешанная информация (чтение субканала) Пакет: db 42h db ScMsf ; 0/2-тип выдачи адресов(номер сектора или MSF) db FullInfo ; вариант запроса(полный/краткий - бит 40h) db Func ; подфункция (только для полного запроса) db 3*dup(0) ; * dw Length ; Длина таблицы db 3*dup(0) ; * Команда информационная, выдает блок следующей информации: 00h dw состояние проигрывания аудио: 00h - неизвестно или не поддерживается 11h - Играет аудио 12h - Аудио стоит 13h - Аудио остановилось на конце 14h - Открыта дверь или ошибка запуска 15h - Прочее 02h dw длина последующих данных(0 - нет) 04h и далее присутствует при наличии бита 40h в FullInfo и зависят от Func Func не равен 2 или 3 04h db 01h (формат данных субканала = 1) 05h db Ctrl/Addr 06h db TrackNumber 07h db Point or Index 08h db 0 09h db 3*dup(?) -MSF/SECTOR на диске 0Ch db 0 0Dh db 3*dup(?) -MSF/SECTOR на дорожке Подфункция 2 (Получить UPC код) 04h db 02h (формат данных субканала = 2) 05h db 3h*dup(?) 08h db 80h -флажок наличия UPC (если нет, то UPC отсутствует) 09h db 0Ch*dup(?) - здесь хранится UPC код (6 цифр в BCD коде) 15h db 3*dup(?) - Положение чего-то на диске в формате MSF Подфункция 3 (получить ISRC код) 04h db 03h (формат данных субканала = 2) 05h db Ctrl/Addr 06h db TrackNumber -не всегда используется. 07h db ? 08h db 80h -флажок присутствия (аналогично функции 02h) 09h db далее запись ISRC ------------------------------ Команда 043h - информация о дорожках (READ TOC) Пакет: db 43h db ScMsf ; 0/2 -тип выдачи адресов(номер сектора или MSF) db 4*dup(0); * db BegTrk ; начальная дорожка(от 1, 0 заменяется на 1) dw Length ; Длина таблицы db Func ; варианты выдачи информации (0/40h/80h) db 2*dup(0) ; * Команда информационная, выдает таблицу дорожек. Максимальная длина таблицы 8*64h+4 байт или 64h (100.) дорожек. Func =00h ;получить обычную таблицу дорожек =40h ;получить таблицу сессий =80h ;получить обычную таблицу в расширенном формате Общий формат таблицы : dw Len ;длина последующих полей в байтах db BegTrk ;первая дорожка db EndTrk ;последняя дорожка d? <track_Def>;описание дорожек Описание дорожек м.б. трех форматов: 1) 5 байт на дорожку (внутренний формат, наружу из CD не выдается): db Ctrl/Addr;тип дорожки и флаги db Index ;индекс дорожки (номер) db*3 Start ;адрес начала дорожки 2)8 байт на дорожку (Func=0h/40h): db ? db Ctrl/Addr ;тип дорожки и флаги db TrackNumber ;номер дорожки db ? db*4 Start ;адрес начала дорожки 3) 11 байт на дорожку (Func = 80h): db Res1 db Ctrl/Addr ;тип дорожки db Res2 db Index ;индекс дорожки db Res3 db Res4 db Res5 db*4 Start ; адрес начала дорожки Ctrl/Addr - тип дорожки(то-же, что и в MSCDEX, но переставлены тетрады): Ctrl (младшая тетрада, отдельные биты): 01 - есть pre-emphasis 02 - разрешено копирование 04 - дорожка данных 08 - 4 канала (а не 2) Addr (старшая тетрада, коды): 0-нет субканала 1-в субканале закодирована позиция 2-в субканале закодирован UPC 3-в субканале закодирован ISRC прочее - зарезервировано Самые распространенные коды: 14h - ROM 10h - audio Index - кодируется в BCD и для обычной дорожки находится в интервале 01-99. Коды A0 и выше имеют специальное значение, они не соответстуют физическим дорожкам на диске, а носят служебный характер - информируют о числе дорожек, начале диска, конце диска и т.п. Start - в зависимости от запроса, может быть либо номером сектора, либо адресом сектора в формате MSF. ------------------------------ Команда 044h - информация о реальных метках положения (Read HEADER) Пакет: db 44h db SL ; бит 2 - что записывать в выходной буфер (исходный номер сектора или считанный) db 0 ; * db M,S,F ; Номер сектора db 0 ; * dw Len ; длина выдаваемой информаци db 3*dup(0); * Команда информационная, выдает следующую таблицу из 8 байт: db SectorType ; тип формата сектора (data mode) db 4*dup(0) db M,S,F ; адрес сектора Пакет выдается только в том случае, если CD смог считать заданный сектор и определить его тип. ------------------------------ Команда 045h - проигрывать audio в терминах блоков (длина - слово) Пакет: db 45h db 0 ; * dd StartBlock ; блок начала проигрывания (-1 - с тек. положения) db ? dw Length ; число блоков db 3*dup() ; * Команда управляющая. ------------------------------ Команда 047h - проигрывать audio в стиле MSF Пакет: db 47h db 2*dup(?) ; * db M,S,F ; начало отрезка (FF:FF:FF - текущая позиция) db M,S,F ; конец отрезка db 3*dup(?) ; * Команда управляющая. ------------------------------ Команда 04Bh - Start/stop audio Пакет : db 4Bh db 7*dup(0) ; * db Func db 3*dup(0) ; * Команда управляющая. Младший бит Func =0 - остановить =1 - запустить ------------------------------ Команда 04Eh - остановить проигрывание Пакет: db 4eh db 11*dup(?) ; * Команда управляющая. ------------------------------ Команда 055h - установить параметры Пакет: db 55h db ? ;бит 1 -сохранять в NVRAM (?) db Page ;требуемая страница параметров db 4 dup (?) dw Length ;длина таблицы db 3*dup(0);* Команда управляющая, коды и формат страниц описан в команде 5Ah. ------------------------------ Команда 05Ah - получить параметры Пакет: db 5Ah db ? db Page -определяет требуемые параметры, состоит из двух битовых полей: 3Fh - номер требуемой страницы параметров: 01h - параметры исправления ошибок 0Dh - общие параметры 0Eh - аудио-управление 2Ah - параметры устройства (только читается) 3Fh - все странички C0 - биты типа требуемой страницы: 00 - текущие значения 01 - измененные значения 10 - значения по умолчанию 11 - сохраненные значения db 4 dup (?) dw Length ;длина таблицы db 3*dup(0) ;* Команда информационная, выдает соответствующую страничку параметров. Общий заголовок: 00h dw Длина всего блока (без первого слова) 02h db Состояние привода 03h db 5 dup(?); Заголовок каждой страницы: 08h db Номер страницы из запроса 09h db Длина страницы Страница 01 -исправление ошибо 0Ah db Параметр исправления ошибок 0Bh db Счетчик повторов чтения Страница 0D - общие параметры 0Ah db ? 0Bh db Множитель таймера не активности 0Ch dw Число S единиц в M единице для формата MSF (60) 0Eh dw Число F единиц в S единице для формата MSF (75) Страница 0E - аудио параметры 0Ah db ? параметр не исп., но изменяется 0Bh db 2 dup(?) 0Dh db ? =0 LBA всегда равен номеру сектора, cтарший бит указывает правильность следующего поля 0Eh dw 0 Число логических блоков в секунду для проигрывания. (как правило не используется) 10h db мл. тетрада - биты выходного порта канала 0 11h db громкость канала 0 12h db мл. тетрада - биты выходного порта канала 1 13h db громкость канала 1 14h db мл. тетрада - биты выходного порта канала 2 15h db громкость канала 2 16h db мл. тетрада - биты выходного порта канала 3 17h db громкость канала 3 Страница 2Ah - параметры устройства (только чтение) ; биты присутствия/отсутствия функций 0Ch db 01h -проигрывание аудио 02h -композитный аудио/ видео поток 04h -Digital out to port 1 08h -Digital out to port 2 10h -чтение секторов Mode 2 Form 1 20h -чтение секторов Mode 2 Form 2 40h -Чтение многосессионных дисков 80h - ? 0Dh db 01h - Чтение RedBook через команду Read-CD 02h - Чтение RedBook "with accurate stream" 04h - Чтение субканала 08h - Поддержка деинтерливинга данных субканала 10h - Поддержка "C2 error pointers" 20h - Поддержка чтения ISRC 40h - Поддержка чтения UPC 80h - ? 0Eh db 01h-блокировка носителя 02h-чтение статуса блокировки 04h-Disk prevent jumper present 08h-команда выброса носителя 10h-? E0h-Тип загрузчика: 0 - Caddy 1 - Tray 2 - Pop-Up 3 - Reserved 4 - Ченджер с индивидуально меняемыми дисками 5 - Картридж 6 - Reserved 7 - Reserved 0Fh db 01h-Раздельная регулировка каналов 02h-Раздельный комутатор каналов 04h-Информация о наличии диска 08h- 10h- 20h- 40h- 80h- 10h dw Максимальная скорость обмена в килобайтах 13h db Число градаций регулировки громкости 14h dw Размер буфера в килобайтах 16h dw Текущая скорость обмена ;--иногда может отсутствовать- 18h db ? 19h db 01h - Digital out по фронту/спаду сигнала BCKF 02h - LRCK индицирует левый/правый канал 04h - данные в формате LSB/MSB 08h 10h BCKs:0 - 32 20h | 1 - 16 40h / 2 - 24 3 - 24(I^2S) 80h - ? Длина каждой из страниц может быть разной. Здесь описаны только те поля, которые более-менее стандартны. Если запрашиваются все странички (код 3Fh), то в выходном блоке будет присутствовать один общий заголовок и последовательно расположенные странички со своими заголовками. ------------------------------ Команда 0A5h - проигрывать audio в терминах блоков Пакет: db A5h db 0 ; * dd StartBlock ; блок начала проигрывания|-1 c текущего положения dd Length ; число блоков db 2*dup(?) ; * Команда управляющая. ------------------------------ Команда 0B9h - читать данные Пакет: db B9h ; db Fmt ; может быть = 00h годится любой формат ; 08h обычный CD-диск (Желтая книга) ; 10h разновидности ; 14h/ Green XA db 0 ; * db M,S,F; начало чтения db M,S,F; конец чтения db Flg ; флаги читаемого куска сектора: ; 01h три ; 02h неиспользуемых ; 04h бита (?) ; 08h EDC/Zero/ECC ; 10h основное тело сектора (data) ; 20h описатель адреса сектора (head) ; 40h данные субканала (sub) ; 80h начальные синхробайты (sync) ; передаются только те части секторов,для которых ; установлены биты. Передаваемые части сектора должны идти подряд,без пропусков db 0 ; всегда д.б. =0, иначе ошибка (?) db 0 ; * Команда передачи данные. Если начало=конец, производится позиционирование на указанную позицию и тест читабельности. В этом случае данные не передаются. ------------------------------ Команда 0BEh - читать данные в терминах секторов Пакет: db BEh ; db Fmt ; dd Sec ; начало чтения (исп. только 24 бита db 0 ; * dw ScNum; Число секторов db Flg ; флаги читаемого куска сектора (как в B9h) db 0 ; всегда д.б. =0,иначе ошибка (?) db 0 ; * Команда полностью аналогична команде B9, за исключением задания адресов области чтения в терминах секторов. ============================== Примечание b42(b-reeze) В приложении к cweek, вы сможете найти примеры написания команд на C для PC, а так же ряд документов, которые шли как приложение к данному. (не включены в сам номер из-за сложности форматирования текста) ============================== P.S. Изначально этот документ составлялся исключительно для внутреннего использования по причине невозможности найти фирменное описание стандарта на ATAPI-CD. Поскольку вся информация бралась из дизассемблированных драйверов,исходных текстов Linux'а, отдизассемблированной прошивки ACER665, a также из описания SCSI-пакетов и стандарта на ATAPI, то вполне возможны определенные расхождения со стандартом (в существовании которого я не уверен). Несмотря на это, мне кажется, что даже такое описание представляет определенную ценность. В данное описание не попала команда специального чтения данных (028h/0A8h) - у меня нет четких данных о ее работе, а также несколько других, которые не используются в драйверах и поддерживаются не всеми приводами. Это касается команд потрекового проигрывания Audio-CD, команд смены диска в многодисковых приводах и т.п. У меня осталась еще кое-какая информация, например, тексты CD-драйверов, прошивок и т.п., которые были сочтены несущественными или излишне громоздкими. Если необходимо, можно вставить в этот документ выдержки из драйверов. Для любителей "подробных описаний" могу порекомендовать стандарт SCSI-2 (X3T9.2).Там есть большое количество интересной информации, но солидный объем (более 20 тыс. строк или около 1.7 Mb), некоторые отличия SCSI от ATAPI и "замусоренность" лишними деталями усложняют получение нужных сведений. При необходимости более детального ознакомления с процессом обмена (обмен по DMA, перекрывающиеся команды и т.п.) можно прочитать стандарт на ATAPI устройства (X3T10). Однако, описание конкретных CD команд там отсутствует (есть ссылка на SCSI). Предложения, замечания, ругань и т.п. просьба направлять по адресу 2:5030/163.44 Константин Норватов (Konstantin Norvatoff, KonNor) Также, можно попробовать найти меня по адресу: konnor@small.spb.su ============================== Примечание2: b42(b-reeze) К моменту написания данной статьи мне все-таки удалось подключить CDROM к контроллеру NEMO вместе с HDD. Причем HDD, как master disk, а CDROM как slave. Так же хотелось бы уточнить по поводу команд в примерах пакетов для управления CDROM. Запись типа db 3*dup(0), означает что код #00 следует повторить 3 раза. Надеюсь данная статья, поможет разобраться с управлением CDROM и в ближайшее время мы получим полноценную работу с CD на ZX.
Другие статьи номера:
Похожие статьи:
В этот день... 21 ноября