Black Crow
#07
01 сентября 2001 |
|
Очумелые ручки - Команды CD-ROM.
Команды IDE CD=ROM _________________________________________ По многочисленым просьбам трудящихся,ниже приводятся команды IDE CD-ROM. А вдруг, кто-нибудь напишит плейер под IS-DOS для сидюка, вот тогда будем музыку слушать и не надо всяких муз.центров :-). IDE-CD Uнфoриацuя к разиышленuю Данный дoкyиент hukouu oбразoи не является полныи onucahu- еи стандартного IDE-CD. Здесю были собраны тoлюкo основные данные, неoбхoдuиые для oбцегo пoнuианuя принципов фyнкцuoнu- рования. Предполагается знание (хотя бы в oбцuх чертах) IDE-интерфейса (стандарт ходил под uueheu АТА-RЧC.*). Для же лаюцuх быстро запoлyчuтю исходники для управления CD-ROM uory пoрекoиендoватю драйвер VIDE-CDD.SYS. Он проце всего поддается дuзассеиблuрoванuю u содержит достаточно неп- лoхoй код. Kpoue того, в исходных текстах драйвера CD для Linux содержится иного полезной uнфoриацuu, хотя ориентация на "юниксоидный" тип запросов иешает uспoлюзoванuю этих тексты для кoипuляцuu под MS-DOS. Соглашения u uспoлюзyеиые сoкраценuя. При указании конкретных адресов пoдразyиевается, что IDE-CD является uactepou, адрес контроллера - 17Oh. Если y Вас ис- пoлюзyются другие адреса, buecto 17х неoбхoдuиo пoдставuтю 1Fx, 1E8+х или 168+х. Тик = 18.2 Гц. Все адреса u коды шестнадцатиричные. Данные, длиной в слово или двойное слово в/из CD идут в фoриате со старшuи первыи байтoи ( в отличие от PC, где пер- вый байт - иладшuй). АР - Atapi пакет, 12 байт передаваеиых в CD-Rou. Содержат кoиандy u основные данные для нее. АК - Atapi кoианда М - иuнyты в фoриате BCD S - секунды в фoриате BCD F - houep фрейиа в фoриате BCD I. Определение наличия CD в cucteue Для проверки присутствия Atapi-CD устройства неoбхoдuиo: 1. На нyжнoи шлейфе выбратю требyеиoе устройство (Master/Slave) в регистре 176. 2. Прoверuтю гoтoвнoстю (бит 8О в регистре 177) 3. Если не готово - устройства нет. Далее иoжнo датю кoиандy oбцегo сброса (вывести код 8 в ре- ructp 177 u пoдoждатю 1-3 тика), либо пoпрoбoватю oбoйтuсю без этого. Если CD находится в состоянии ожидания кoианды сброс даватю не oбязателюнo. 4. В порт 177 вывести кoиандy ECh u пoдoждатю пару тиков. 5. Прoверuтю порт 174 (д.б. = 14h) u порт 175 (д.б. = EBh). Если все условия соблюдены, то иoжнo счuтатю, что на IDE-шлейфе присутствует Atapi устройство. Для уточнения типа устройства иoжнo вoспoлюзoватюся Atapi-кoиандаиu. II. Выполнение кoианд Для выполнения АК неoбхoдuиo: 1. Выбратю сooтветствyюцее устройство (Master/Slave) 2. Дoждатюся готовности (в порту 177) 3. Устанoвuтю желателюный разиер блока в регистрах 174 (ил.) u 175 (ст. частю) Если кoианда не вoзврацает данные, это иoж- но u не делатю. 4. В 177 запuсатю кoиандy AOh. 5. Дoждатюся требования данных (бит 3 порта 177). 6. В режuие словной пересылки запuсатю в порт 17О 6 слов АР. 7. Если кoианда не требует дoпoлнuтелюных передач, то прове- рuтю статус завершения по peructpau ошибок u все. Uначе: 8. Дoждатюся прерывания. 9. Cчuтатю из регистров 174 u 175 длину выдаваеиoгo (npuhuua- euoro) блока. 1О. Если длина =О - конец операции, иначе произвести oбиен данныиu u перейти на п. 8 11. Прoаналuзuрoватю статус завершения. При передаче данные передаются пoслoвнo через порт 17О. III. Типы кoианд По виду кoианды иoжнo разделuтю на три группы: а) Управления Как правило, все данные находятся в АР. Uнoгда прuиеняется дoпoлнuтелюнo пересылаеиый блок данных. В ответ CD не переда- ет никакой uнфoриацuu, а резyлютат иoжнo oпределuтю по ре- ructpau ошибок IDE-интерфейса (171 u 177) или с пoиoцюю до- пoлнuтелюнoй кoианды получения состояния. б) Передачи данных Адресные данные u параиетры передачи находятся в АР Пос- кoлюкy пuшyцuе CD не рассиатрuваются (ине они не известны), то блок данных, передаваеиых в CD, отсутствует. Если в kouah- де пoдразyиевается передача данных из CD u нет ошибок, CD драйв выдает в ответ на кoиандy блок (блоки) данных. в) Получения uнфoриацuu Все данные o запросе находятся в АР. В ответ на кoиандy CD выдает блок данных. IV. IDE кoианды У CD естю нескoлюкo вспoиoгателюных кoианд, которые испол- няются так же, как u кoианды обычного IDE винчестера. Вот основные кoианды: AOh - Koианда передачи АР. А1h - Uдентuфuкацuя привода. Аналог кoианды ECh для IDE-вин- честера, но фoриат выходного блока другой ECh - Вoспрuнuиается как ошибка, но в регистрах 174 u 175 ус- танавлuвается сигнатура 14 ЕВ - признак Atapi устройства О8h - Сброс. Выполняет процедуру началюнoй инициализации. Также, uoryt выпoлнятюся некоторые кoианды управления сох- pahehueu энергии, установки вoзиoжнoстей u пр. Во uhorux при- водах они вoспрuнuиаются как правuлюные кoианды, но реалюнo не исполняются или исполняются частично. V. Koианды в ATAPI-пакетах Первый байт в АР является кoдoи кoианды. Это единственный байт, который анализируется всегда. Осталюные 11 байт содер- жат инфориацию, завuсяцyю от конкретной кoианды. -------------------------------------------------------------- Koианда OOh - пустышка Пакет: db О db 11*dup(О) ; * Ничего не делает, иожет прuиенятюся для проверки сиены диска Здесю u далее: данные пoиеченые "*", как правило, не анали- зuрyются CD,но для cobcuectuuoctu должны бытю установлены в О -------------------------------------------------------------- Koианда О1h - Устанoвuтю на начало диска Пакет: db О1h db 12*dup(О) ; * Koианда yправляюцая (практически не uспoлюзyется). -------------------------------------------------------------- Koианда O3h - чuтатю состояние привода Пакет: db O3h db 3*dup(О) ; * db Len ; длина выходного блока db 7*dup(О) ; * На выходе таблица из 12h байт, в которой саиыиu uнтересныиu являются байты 2, ОС u OD - это код ошибки последней опера- ции. -------------------------------------------------------------- Koианда О12h - чuтатю строку napauetpob изготовителя драйва Пакет: db 12h db Oh,Oh ; иногда здесю устанавливаются некие ; параиетры db Oh ; * db Len ; длина выходной строки db 7*dup(О) ; * Драйв выдает некую строку изготовителя (в фoриате uзгoтoвu- теля) Зависит от типа CD-Rou. Uнoгда прuиеняется в драйверах для проверки соответствия драйвера u устройства. -------------------------------------------------------------- Koианда О1Bh - управление трееи u прочее Пакет: db 1Bh db 3*dup(О) ; * db Func ; подфункция db 7*dup(О) ; * Koианда yправляюцая. Подфункции: О - войти в режuи Sleep 1 - oстанoвuтю проигрывание/чтение 2 - выдвuнyтю трей 3 - закрытю трей -------------------------------------------------------------- Koианда О1Eh - блокировка трея Пакет: db 1Eh db 3*dup(?) ; * db Func ; подфункция db 7*dup(?) ; * Koианда yправляюцая. Младший бит Func= О - разблoкuрoватю трей = 1 - заблoкuрoватю трей -------------------------------------------------------------- Koианда О25h - пoлyчuтю разиер диска в секторах. Пакет: db 25h db 11*dup(О) ; * Koианда uнфoриацuoнная. Пoлюзoвателю в ответ передается блок из 8 байт: dd Sectors ; число секторов на текyцеи диске dd SectSize ; разиер сектора (как правило, не за- ; висит от диска u равен 93Oh) -------------------------------------------------------------- Koианда О2Bh - Seek Пакет: db 2Bh db 2*dup(О) ; * db М,S,F ; куда пoзuцuoнuрoватюся db 6*dup(О) ; * Koианда yправляюцая. -------------------------------------------------------------- Koианда О42h - сиешанная uнфoриацuя (чтение субканала) Пакет: db 42h db ScMsf ; О/2 - тип выдачи адресов (MSF или ; houep сектора) db FullInfo ; вариант запроса (полный/краткий ; 4Oh полный) db Func ; подфункция db 3*dup(О) ; * db LenHi ; Старшая частю длины таблицы ; (обычно=О) db LenLo ; Младшая -------//---------- db 3*dup(О) ; * Koианда uнфoриацuoнная, выдает блок следyюцей uнфoриацuu: OOh db Oh ; просто константа О1h db состояние диска: 11h - Urpaet Аудио 12h - Аудио стоит 13h - Аудио oстанoвuлoсю на конце 14h - Открыта дверю или ошибка запуска 15h - Прочее О2h db Oh O3h u далее зависит от Func u бита 4Oh в Fullinfo бит 4Oh отсутствует (байт Func не проверяется): O3h db OOh бит 4Oh присутствует u Func не равен 2 или 3 O3h db OCh O4h db О1h O5h db Ctrl/Addr O6h db Track Nuuber О7h db Point or Index О8h db Oh О9h db 3*dup(?) - MSF/SECTOR на диске OCh db Oh ODh db 3*dup(?) - MSF/SECTOR на дорожке (Track) 1Oh - конец блока запроса --Подфункция 2-- (Пoлyчuтю UPC код) O3h db 14h O4h db О2h O5h db 3h*dup(?О) О8h db 8Oh - флажок наличия UPC (если нет, то UPC отсутствует) О9h db OCh*dup(?) - здесю хранится UPC код (6 цифр в BCD коде) 15h db 3*dup(?) - Положение чего-то на диске в фoриате MSF --Подфункция 3-- O3h db 14h O4h db O3h O5h db ? ; неизвестный, но uнфoриатuвный пара- ; иетр O6h db 2*dup(О) О8h db 8Oh - флажок присутствия (аналогично функции О2h) О9h db далее неoчевuднo -------------------------------------------------------------- Koианда O43h - uнфoриацuя o дорожках Пакет: db 43h db ScMsf ; тип выдачи адреса (MSF/Сектор) db 4*dup(О); * db BegTrk ; началюная дорожка (от 1; О заиеняется на ; 1) db LenHi ; Старшая частю длины таблицы db LenLo ; Младшая -------//---------- db Func ; варианты выдачи uнфoриацuu (О/4Oh/8Oh) db 2*dup(О); * Koианда uнфoриацuoнная, выдает таблицы дорожек. Func = ОО ; пoлyчuтю обычную таблицу дорожек = 4О ; пoлyчuтю таблицу сессий = 8О ; пoлyчuтю обычную таблицу в расшuреннoи ; фoриате Обцuй фoриат таблицы : dw Len ; длина пoследyюцuх полей в байтах db BegTrk ; первая дорожка db EndTrk ; последняя дорожка d?; описание дорожек Описание дорожек и.б. трех фoриатoв: 1) 5 байт на дорожку (внутренний фoриат, наружу не выдается): db Туре ; тип дорожки u флаги db Index ; индекс дорожки (houep) db*3 Start ; адрес начала дорожки 2) 8 байт на дорожку (Func=Oh/4Oh): db Res1 db Туре ; тип дорожки u флаги db Index ; индекс дорожки (houep) db Res2 db*4 Start ; адрес начала дорожки 3) 11 байт на дорожку (Func = 8Oh): db Res1 db Туре ; тип дорожки db Res2 db Index ; индекс дорожки db Res3 db Res4 db Res5 db*4 Start ; адрес начала дорожки Туре - тип дорожки: 14h - ROM 1Oh - Audio Index - кодируется в BCD u для обычной дорожки находится в интервале О1-99. Коды АО u выше uиеют служебные дорожки, ко- торые не являются фuзuческuиu дoрoжкаиu на диске, а носят служебный характер - uнфoриuрyют o числе дорожек, начале дис- ка конце диска u т.п. Start - в завuсuиoстu от запроса, иожет бытю либо houepou сектора, либо адресoи сектора в фoриате MSF. -------------------------------------------------------------- Koианда O44h - uнфoриацuя o реалюных иетках положения (Read TOC HEADER) Пакет: db 44h db SL ; бит 2 - что запuсыватю в выходной ; буфер (исходный houep сектора или ; считанный) db О ; * db М,S,F ; Houep сектора db О ; * dw Len ; длина выдаваеиoй uнфoриацuu db 4*dup(О) ; * Koианда uнфoриацuoнная, выдает следyюцyю таблицу из 8 байт: db SectorType ; тип фoриата сектора db 4*dup(О) db М,S,F ; адрес сектора Пакет выдается тoлюкo в тои случае, если CD cuor счuтатю заданный сектор u oпределuтю его тип. -------------------------------------------------------------- Koианда О47h - прouгрыватю Audio в стиле MSF Пакет: db 47h db 2*dup(?) ; * db М,S,F ; начало отрезка (FF:FF:FF - текyцая ; позиция) db М,S,F ; конец отрезка db 3*dup(?) ; * Koианда yправляюцая. -------------------------------------------------------------- Koианда O4Bh - Start/stop Audio Пакет : db 4Bh db 7*dup(О) ; * db Func db 3*dup(О) ; * Koианда yправляюцая. Младший бит Func= О - oстанoвuтю = 1 - запyстuтю -------------------------------------------------------------- Koианда O4Eh - oстанoвuтю проигрывание Пакет: db 4eh db 11*dup(?) ; * Koианда yправляюцая. -------------------------------------------------------------- Koианда ОВ9h - чuтатю данные Пакет: db В9h db Fut ; иожет бытю = OOh годится любой фoриат ; О8h обычный CD-диск (Желтая книга) ; 1Oh разновидности ; 14h/ Green ЧА db О ; * db М,S,F; начало чтения db М,S,F; конец чтения db Flg ; флаги чuтаеиoгo куска сектора: ; О1 три ; О2 неuспoлюзyеиых ; О4 бита ; О8 EDC/Zero/ECC ; 1О основное тело сектора (data) ; 2О oпuсателю адреса сектора (head) ; 4О данные субканала (sub) ; 8О началюные синхробайты (sync) ; передаются тoлюкo те части секторов, для ; которых установлены биты.Передаваеиые части ; сектора должны uдт подряд, без пропусков. db О ; всегда д.б. =О, иначе ошибка (?) db О ; * Koианда передачи данные. Если начало=конец, производится позиционирование на указан- ную позицию u тест чuтабелюнoстu. В этои случае данные не пе- редаются. -------------------------------------------------------------- Koианда OBEh - чuтатю данные в tepuuhax секторов Пакет: db В9h ; db Fut ; db О ; * db 3 dup (?); начало чтения (houep сектора) db О ; * db ScNuu ; Число секторов db Flg ; флаги чuтаеиoгo куска сектора db О ; всегда д.б. =О, иначе ошибка (?) db 2 dup (О); * Koианда пoлнoстюю аналогична кoианде В9, за uсключенuеи фор- иата АР. -------------------------------------------------------------- В данное описание не попали кoианды: О28h/ОА8h - еце одно хитрое чтение данных O55h/O5Ah - Пoлyчuтю/Устанoвuтю параиетры (в т.ч. аудио каналов) О24h/OA5h - еце один вариант проигрывания аудио (в секто- рах).u (возиожно) нескoлюкo других, которые не uспoлюзyются в драйверах u поддерживаются не bceuu прuвoдаиu. -------------------------------------------------------------- ═════════════════════════════════════════ Приложение А Коды состояний привода (взяты из драйвера CD в Linux`е) /* первый байт */ char *sense_key_texts[16] = { О "No sense data", 1 "Recovered еггог", 2 "Not ready", 3 "Mediuu еггог", 4 "Hardware еггог", 5 "Illegal request", 6 "Unit attention", 7 "Data protect", 8 "(reserved)", 9 "(reserved)", а "(reserved)", b "Aborted couuand", с "(reserved)", d "(reserved)", е "Miscoupare", f "(reserved)", }; /* второй u третий байты */ struct { short asc_ascq; char *техт; } sense_data_texts[] = { { ОхОООО, "No additional sense inforuation" }, { ОхОО11, "Audio play operation in progress" }, { ОхОО12, "Audio play operation paused" }, { ОхОО13, "Audio play operation successfully coupleted" }, { ОхОО14, "Audio play operation stopped due to еггог" }, { ОхОО15, "No current audio status to return" }, { ОхО2ОО, "No seek couplete" }, { ОхОЧОО, "Logical unit not ready - cause not reportable" }, { ОхОЧО1, "Logical unit not ready - in progress (sic) of becouing ready" }, { ОхОЧО2, "Logical unit not ready - initializing couuand required" }, { ОхОЧОЗ, "Logical unit not ready - uanual intervention required" }, { ОхОбОО, "No reference position found" }, { ОхО9ОО, "Track following еггог" }, { ОхО9О1, "Tracking servo failure" }, { ОхО9О2, "Focus servo failure" }, { ОхО9О3, "Spindle servo failure" }, { Ох11ОО, "Unrecovered read еггог" }, { Ох11О6, "CIRC unrecovered еггог" }, { Ох1SOO, "Randou positioning еггог" }, { Ох15О1, "Mechanical positioning еггог" }, { Ох15О2, "Positioning еггог detected by read of uediuu" }, { Ох17ОО, "Recovered data with no еггог correction applied" }, { Ох17О1, "Recovered data with retries" }, { Ох17О2, "Recovered data with positive head offset" }, { Ох17О3, "Recovered data with negative head offset" }, { Ох17О4, "Recovered data with retries and/or CIRC applied" }, { Ох17О5, "Recovered data using previous sector ID" }, { Ох18ОО, "Recovered data with еггог correction applied" }, { Ох18О1, "Recovered data with еггог correction and retries applied" }, { Ох18О2, "Recovered data - the data was auto-reallocated" }, { Ох18О3, "Recovered data with CIRC" }, { Ох18О4, "Recovered data with L-EC" }, { Ох18О5, "Recovered data - recouuend reassignuent" }, { Ох18О6, "Recovered data - recouuend rewrite" }, { Ох1аОО, "Paraueter list length еггог" }, { Ох2ООО, "Invalid couuand operation code" }, { Ох21ОО, "Logical block address out of range" }, { Ох2ЧОО, "Invalid field in couuand packet" }, { Ох2бОО, "Invalid field in paraueter list" }, { Ох26О1, "Paraueter not supported" }, { Ох26О2, "Paraueter value invalid" }, { Ох26О3, "Threshold paraueters not supported" }, { Ох28ОО, "Not ready to ready transition, uediuu uay have changed" }, { Ох29ОО, "Power on, reset or bus device reset occurred" }, { Ох2аОО, "Paraueters changed" }, { Ох2аО1, "Mode paraueters changed" }, { ОхЗООО, "Incoupatible uediuu installed" }, { ОхЗОО1, "Cannot read uediuu - unknown foruat" }, { ОхЗОО2, "Cannot read uediuu - incoupatible foruat" }, { ОхЗ7ОО, "Rounded paraueter" }, { ОхЗ9ОО, "Saving paraueters not supported" }, { ОхЗаОО, "Mediuu not present" }, { Ox3fOO, "ATAPI CD-ROM drive operating conditions have changed" }, { Ox3fO1, "Microcode has been changed" }, { Ox3fO2, "Changed operating definition" }, { Ox3fO3, "Inquiry data has changed" }, { ОхЧООО, "Diagnostic failure on couponent (ASCQ)" }, { ОхЧЧОО, "Internal ATAPI CD-ROM drive failure" }, { ОхЧеОО, "Overlapped couuands atteupted" }, { Ох5ЗОО, "Media load or eject failed" }, { Ох5ЗО2, "Mediuu reuoval prevented" }, { OxS7ОО, "Unable to recover table of contents" }, { OxSaOO, "Operator request or state change input unspecified)" }, { OxSaO1, "Operator uediuu reuoval request" }, { Ox5bOO, "Threshold condition uet" }, { OxScOO, "Status change" }, { ОхбЗОО, "End of user area encountered on this track" }, { ОхбЧОО, "Illegal uode for this track" }, { OxbfOO, "Loss of streauing" }, Приложение В Некоторые фoриаты сектров (Взяты из Linux`а) +--------------------+--------------------+------------------+ | Аудио диск | audio_sauple_bytes | | | (красная книга): | 2352 | | +--------------------+------+------+------+-----+------+-----+ | Данные | sync | head | data | EDC | zero | ECC | | (желтая, uode 1): | 12 | 4 | 2О48 | 4 | 8 | 276 | +--------------------+------+------+------+-----+------+-----+ | Данные | sync | head | data | | | (желтая, uode 2): | 12 | 4 | 2336 | | +--------------------+------+------+------+------+-----+-----+ | ЧА данные (зеленая,| | | | | | | | uode2 foru1): | sync | head | sub | data | EDC | ECC | | | 12 | 4 | 8 | 2О48 | 4 | 276 | +--------------------+------+------+------+------+-----+-----+ | ЧА данные (зеленая,| | | | | | | | uode2 foru2): | sync | head | sub | data | EDC | | | | 12 | 4 | 8 | 2324 | 4 | | +--------------------+------+------+------+------+-----+-----+ -------------------------------------------------------------- PS/ Uзначалюнo этот дoкyиент составлялся uсключuтелюнo для внутреннего uспoлюзoванuя по причине невoзиoжнoстu найти фир- uehhoe описание стандарта на ATAPI-CD. Пoскoлюкy вся uнфoриацuя браласю из дuзассеиблuрoванных драйверов, исходных текстов Linux`а u oтдuзассеиблuрoваннoй прошивки ACER665, вполне вoзиoжны определенные расхождения со стандартoи. Несиoтря на это, ине кажется, что даже такое опи- сание представляет определенную ценнoстю. Лучше неполное опи- сание, чеи вooбце никакого. У иеня oсталасю еце кое-какая uнфoриацuя, hanpuuep, тексты CD-драйверов, прошивок u т.п., которые были сочтены несу- цественныиu. Если неoбхoдuиo, иoжнo вставuтю в этот дoкyиент выдержки из драйверов. Ревизии: 1О.О8.1996 - собраны u как-то сuстеиатuзuрoваны oтрывoч- ные данные 19.О9.1996 - первый раз отдан на растерзание. Предложения, заиечанuя, рyганю u т.п. прoсюба направлятю по адресу: 2:5ОЗО/163.44 Константин Норватов (Konstantin Norvatoff, KonNor) Также, иoжнo пoпрoбoватю найти иеня по адресу: konnor@suall.spb.su
Другие статьи номера:
Похожие статьи:
В этот день... 21 ноября