|
Простейший ремонт накопителя на примере Seagate ST380020A 80 Гб
Андрей Костров
Железо, номер #014, стр. 014-134-1
Эта история началась до банальности просто: мой товарищ попросил отремонтировать его хард. В ходе расспросов мне удалось выяснить суть проблемы: накопитель не определялся в BIOS, а если определялся, то работу с ним можно охарактеризовать одним емким словом: «тормоззза!». Накопитель был от Seagate модель ST380020A емкостью 80 гигабайт. Он использовался как восьмидесятигигабайтная «дискета», поэтому имел весьма помятый внешний вид. Я согласился помочь, естественно, не гарантировав успешный результат ремонта :).
Лобовая диагностика
Дома я подключил HDD к своему компу как Secondary Master, после чего попытался определить его средствами BIOS. Как и ожидалось, накопитель не определился. Тогда последовало решение протестировать винт с помощью программы mhdd. В ходе работы с mhdd накопилась следующая интересная статистика: из десяти попыток выполнения команды id (идентификация диска) только одна завершилась успешно, причем определялся накопитель до неприличия долго. В процессе тестирования мне удалось подметить одну интересную особенность: в случае провала попытки идентификации накопитель устанавливал бит BSY=1 (то есть HDD в данный момент занят) в регистре состояния накопителя и больше не реагировал на внешние раздражители. Заинтересовавшись этим фактом, я принял волевое решение написать свой вариант программы определения параметров HDD :).
Разработка программы определения HDD
Итак, перед нами стоит задача написать программу для идентификации накопителя, но сначала надо разобраться, что такое паспорт накопителя и для чего он предназначен. В паспорте диска содержится информация о характеристиках и конфигурации HDD, он располагается или в служебной зоне, или в ПЗУ (где именно, зависит от производителя и модели винта) и занимает один сектор, то есть 512 байт. Когда ты подключаешь винт к своему компу, то все параметры BIOS считывает именно из его паспорта. Если более подробно, то к параметрам относятся название накопителя, его серийный номер, версия микропрограммы, объем кэш-памяти, информация о геометрии диска, поддержка S.M.A.R.T. и многое другое. Однако наша программа из всего этого многообразия использует только информацию о названии HDD, его серийном номере и версии микропрограммы, так как, во-первых, мне было достаточно и этих параметров, а во-вторых, программа писалась как учебное пособие, и я не хотел сильно ее усложнять.
Я намеренно не стал приводить формат паспорта HDD, так как при желании ты можешь сам найти его в Интернете, но нам понадобится знать местонахождения трех вышеописанных параметров в нем. Привожу их смещения в словах по порядку появления:
10-19 слово – серийный номер накопителя в ASCI кодировке;
23-27 слово – версия микропрограммы накопителя в ASCI кодировке;
27-46 слово – название модели накопителя в ASCI кодировке.
Информация проверенная – можешь поверить мне на слово :). Напоследок осталось узнать код команды идентификации HDD, он равен ECh (в шестнадцатеричной системе исчисления).
Теперь можно составить алгоритм функционирования программы:
1) выбрать накопитель с помощью регистра выбора HDD;
2) дождаться сброса бита BSY;
3) записать команду идентификации в регистр команд;
4) снова дождаться сброса BSY, считав содержимое регистра состояния;
5) считать паспорт диска из базового регистра и загрузить его в выделенный буфер;
6) произвести выборку необходимых параметров из буфера;
7) завершить программу.
Исходный код программы и ты сможешь найти на диске. Если у тебя была возможность ознакомиться с моей предыдущей статьей, то ты без проблем разберешься и с этой программой, но на всякий случай я прокомментирую следующие участки кода:
С помощью этого куска программы мы реализуем функцию выбора накопителя.
mov dx, Port + 6
mov al, 10100000b or (HDD shl 4)
out dx, al
jmp $+2
Затем мы загружаем команду идентификации в регистр команд.
inc dx
mov al, 0ech
out dx, al
jmp $+2
Далее нам нужно убедиться, что устройство успело обработать задание, поэтому надо проверить бит BSY в регистре состояний.
_Wait: in al, dx
test al, 80h
jnz _Wait
Когда накопитель успешно выполнил команду, то нам надо считать паспорт диска из базового регистра и скопировать его в выделенный буфер.
mov dx, Port
lea di, Buffer
mov cx, 100h
_load: in ax, dx
jmp $+2
stosw
loop _load
А сейчас придется немного напрячь мозжечок, так как я покажу способ выборки нужного тебе параметра из паспорта HDD на примере его названия.
lea si, Buffer+36h
При помощи этой команды мы загрузили в регистр si адрес буфера с паспортом накопителя плюс какое то непонятное смещение 36h, но если ты разделишь его на два, а затем переведешь в десятичную систему исчисления, то в результате у тебя получится число 27, а это, как ты помнишь, начальное слово названия модели накопителя.
Затем нам надо организовать цикл, чтобы считать девять слов названия HDD.
mov cx, 13h
_model lodsw
mov dx, ax
xchg dh, dl
mov ah, 02h
int 21h
xchg dh, dl
mov ah, 02h
int 21h
loop _model
Тебе может показаться странным способ вывода символа на экран, но я уже рассказывал, что информация с винта читается как бы задом наперед (например, если у тебя накопитель фирмы Samsung, то, считав первое слово названия, ты получишь «as» вместо «sa»), поэтому мы меняем местами старшие и младшие значения регистра dx, выводим первый символ названия, затем снова повторяем операцию обмена и выводим второй символ, далее проделываем вышеописанное для оставшихся восьми слов.
Напоследок напоминаю: если хочешь сменить Secondary channel на Primary channel, то в строке Port equ 170h, измени число 170h на 1f0h, а если нужно сменить режим Master на Slave, то в строке HDD equ 0, нолик измени на единичку.
Возвращаемся к ремонту харда
Скомпилировав программу, я натравил ее на ремонтируемый хард. К моему большому удивлению программа успешно выполнилась, вернув правильные значения (я их сверил с легендой на корпусе HDD), более того, прога работала без тормозов, и все попытки ее применения были удачными. Тогда я снова решил использовать mhdd. Методика тестирования заключалась в подаче HDD команды init (инициализация). Она работает следующим образом: сначала на винт подается сигнал программного сброса, затем загружается команда рекалибровки (код 10h), по этой команде накопитель устанавливает свои головки на нулевой цилиндр. Но меня ждало разочарование – винт установил бит BSY в единицу и отказался выполнять оба действия. Приятель, ты не находишь, что симптомы очень схожи с поведением накопителя при его инициализации? Я так тоже подумал и решил написать свой вариант init, но в отличие от mhdd, у нас будет init наполовину :). Программа будет загружать команду рекалибровки, не посылая сигнала reset. Далее будет происходить анализ управляющих регистров накопителя и по результатам выводиться надпись об успешном завершении или об ошибке, в последнем случае еще выводится содержимое регистра ошибок.
Разработка программы «инициализации» HDD
Прежде чем начать писать прогу, я расскажу тебе об управляющем регистре (3f6h – для Primary channel и 376h – для Secondary channel). У него используются всего два бита:
Бит №1 (я напоминаю, что нумерация в регистрах идет с нуля, поэтому №1, фактически, не первый, а второй разряд) – бит разрешения/запрета прерывания от устройства, то есть, если установить его в единицу, то прерывания от устройства запрещены, иначе – прерывания разрешены.
Бит №2 – бит программного сброса (software reset), если установить его в единицу, то произойдет программный сброс всех устройств, которые подключены к данному каналу. Сброс будет действовать до тех пор, бит сброса не будет установлен в ноль.
Теперь снова можно составить функциональную схему алгоритма:
1) выбрать накопитель с помощью регистра выбора HDD;
2) дождаться сброса бита BSY;
3) запретить прерывания от устройства, записав единицу в 3f6h-376h;
4) дождаться сброса бита BSY;
5) загрузить команду в регистр команд;
6) проверить биты BSY и ERR в регистре состояния накопителя;
7) если биты BSY и ERR сброшены, то вывести сообщение о том, что все круто :) и перейти к пункту 9;
8) если бит ERR установлен в единицу, то вывести сообщение о том, что все плохо, произвести анализ регистра ошибок и вывести его содержимое на экран;
9) разрешить прерывания от устройства;
10) завершить программу.
Исходный код программы ты также сможешь найти на диске. Я практически не буду его комментировать, так как он на три четверти состоит из кода, который я приводил в своей предыдущей статье (использования регистров HDD для диагностики) – мы лишь рассмотрим, как должна выглядеть операция запрещения прерываний от устройства.
mov dx, 376h
mov al, 02h
out dx, al
jmp $ + 2
На примере четко видно, что мы записали в регистр 376h (я работал с Secondary channel) число 02, таким образом запретив прерывания от устройства. Если ты внимательно изучил исходник, то должен был обратить внимание на отсутствие части кода, отвечающей за разрешение прерываний от девайса, так вот я предлагаю тебе дописать его самостоятельно в качестве закрепления материала.
И снова к харду
После компиляции я опробовал программу на глюкавом винте, и тут меня ждал второй сюрприз: программа успешно завершилась, выдав сообщение о выполненной рекалибровке. Для очистки совести я добавил в прогу подпрограмму сброса накопителя, в результате чего винт отправился в глубокий нокаут :). Приятель, нам удалось локализовать проблему: винт не может корректно отработать сигнал reset! Простыми словами, если послать reset, то HDD, обломавшись, уйдет в даун, установив в единицу бит BSY, а если попробовать тупо записать команду, то, возможно, будет успешный результат. Воистину, чем тупее, тем лучше!
Первоначально у меня появилось три варианта причины возникновения проблемы:
1) повреждение контакта или дорожки, по которой идет сигнал reset (самый простой вариант – ремонт сводится к пропайке контакта/дорожки, нужен паяльник и прямые руки);
2) повреждение модуля служебной информации накопителя, отвечающего за поведение харда при програмном сбросе (ремонтируется форматированием служебной зоны HDD и перезаписи «служебки» харда – для этих операций нужны спецсредства);
3) повреждение управляющего микроконтроллера (самый паскудный вариант – обычно такое не лечится).
Так как я пытался отремонтировать накопитель в домашних условиях, то, к сожалению, мог выполнить ремонт только для неисправности, описанной в первом пункте. Я крайне сомневаюсь, что у тебя дома есть полностью оборудованная, профессиональная паяльная станция и набор специального программного обеспечения, который стоит очень больших денег.
Для начала я попытался визуально определить, нет ли повреждения на месте, где контакт от интерфейсного разъема припаивается к плате-контроллеру. Для справки: «гермоблок» или «банка» – так называют металлический корпус, в котором располагается механическая часть накопителя, а плата-контроллер – это печатная плата, которая прикручена под гермоблоком. Не надо путать ее с контроллером HDD! Затем мне пришлось разобрать винт, отделив гермоблок от этой самой платы-контроллера. Часто при сборке накопителей используют специальные болты (с шестигранником), поэтому нужно позаботиться о наличии специальной отвертки. При желании или от жадности :) можно самому изготовить такую отвертку, немного подточив жало у обычной «плоской» отвертки, но если при сборке использовались болты низкого качества, то после получасовых страданий ты добьешься лишь того, что разворотишь шляпку болта, и снять его можно будет, лишь сточив шляпку, а затем выкрутив его пассатижами.
Так как наш хард от Seagate, сначала надо избавиться от фирменного сигейтовского презерватива :).
В ходе изучения платы-контроллера меня постигло второе разочарование: интерфейсный контакт, место припайки контакта к печатной плате и дорожка, по которой проходит сигнал reset, оказались без повреждений. Тогда я забил на ремонт накопителя и решил немного поэкспериментировать :). Эксперимент сводился к тому, что я подключил плату-контроллер без гермоблока, чтобы посмотреть на ее поведение, и в частности, чтобы выяснить, что покажут нам системные регистры. Вскоре стало понятно, что в отсутствие гермоблока контроллер устанавливает в единицу бит BSY регистра состояния и уходит в глубины самосозерцания (что, в принципе, логично). Ты не прослеживаешь никакой закономерности? Лично у меня возникло подозрение, что причина неисправности всего лишь в слабом контакте между гермоблоком и платой-контроллером. Вооружившись тонким шилом, я немного подогнул пластины на контактной площадке гермоблока и протер этиловым спиртом контакты на контроллере. Следует заметить, что я так жестоко издевался только над контактами, по которым передаются управляющие сигналы, а контакты, по которым на двигатель накопителя подается питание, оставил в покое, так как хард успешно раскручивался до нужных оборотов и не наблюдалось эффекта падения оборотов блинов в процессе работы (такое происходит, когда падает напряжение на двигателе винта, при этом слышен характерный звук). Трижды осенив себя и хард крестным знамением :), я прикрутил обратно плату-контроллер к гермоблоку. После того как свежесобранный накопитель был подключен к моему компу, BIOS бодро отрапортовал, что обнаружен еще один винт.
Разбор полетов
Как ты видишь, чтобы ремонтировать современные жесткие диски, необязательно иметь дорогостоящее паяльное оборудование и специальное программное обеспечение. Конечно, я не отрицаю, что в домашних условиях ты имеешь возможность проводить только самые примитивные ремонтные работы, но зато можешь диагностировать 80% типов неисправностей накопителей, что гарантирует тебе повышение собственной компьютерной квалификации (что самое важное) и интересное времяпрепровождение (я надеюсь на это). К тому же можно сделать вывод, что даже самые страшные глюки и проблемы твоего винта не означают, что ремонт будет отличаться особой сложностью. Суди сам, чтобы отремонтировать героя сегодняшней статьи, из инструментов и аксессуаров мне понадобились отвертка шестигранником, шило и пол-литровая бутылка с медицинским спиртом, из которой 50 миллилитров было использовано на протирку контактов, а остальное – на промывку твоего покорного слуги и его товарища... изнутри :). На этой мажорной ноте я хотел бы завершить свой рассказ и пожелать тебе успехов в дальнейшем изучении компьютера.
| |