Внимание! Это временный неофициальный архив старой версии форума Полигон Призраков, созданный сочувствующим форуму участником. Этот сайт просуществует лишь до тех пор, пока администрация Полигона не сдержит своё обещание и не откроет официальный архив по адресу old.sannata.org.

Полигон-2

Форум о старых компьютерах

Объявление форума

Если пользуетесь личными сообщениями и получили по электронной почте оповещение о новом письме, не отвечайте, пожалуйста, почтой. Зайдите на форум и ответьте отправителю через ЛС.

Полигон-2 »   Документация »   Програмный ремонт жёстких дисков HDD
RSS

Програмный ремонт жёстких дисков HDD

Програмный (и не только) ремонт классических жёстких дисков HDD /Seagate /Samsung /IBM /Hitachi /HGST /Western Digital

<<Назад  Вперед>> Страницы: 1 2 3 4 5 ... 42 43 44 45 46 * 47 48 49 50 .. 75 76 77 78 79 80
Печать
 
KALDYH
Advanced Member
Технонекромант

Откуда: Кемерово
Всего сообщений: 2355
Рейтинг пользователя: 0


Ссылка


Дата регистрации на форуме:
5 июня 2009
Вдохновившись статьёй Шаклеина об анализе микропрограмм коннергейтов, я решил попробовать сам - и у меня кое-что получилось! Спустя много бессоных ночей и ещё больше потраченного на другие дела времени, я готов выложить предварительные результаты анализа микропрограммы Conner на примере семейства Jaguar, прошивка 4HT2.61. Вычитывалась и анализировалась голая плата, результат выполнения некоторых команд потом перепроверялся на исправном накопителе.

Система команд, по результатам анализа. Цветом выделены команды, не совпадающие с вышеописанными для Seagate Barracuda. Команды приводятся в порядке расположения в таблицах в прошивке. Список команд - полный, но назначение установлено не для всех и не везде точно. Разбирался где-то по аналогии с другими уровнями тестирования у Seagate, где-то по известной таблице команд для CFS540, где-то чистым анализом кода.

Онлайн-команды

. (точка) - статус активности
Pgm 00  Target 200.0.1D  Rd Op  Err 10  Health 0000.0000  Ready

' (апостроф) - таблица статистики ошибок

      Bits  Hard  Firm  Soft  Raw   Hdrt  Wrtr  Seek  Disk  Er
Hd 0   0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0
Hd 1   0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0
Hd 2   0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0
Hd 3   0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0
Total  0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0  


> > - изменить положение синхроимпульса чтения-записи

; (точка с запятой) - статус накопителя
Age Typ Ftr  Hds Gn Thd  Grey  Itg Ofs Spin Rwctl
40  A6  0100  1  B4  24  0407  F6  80  159  1244


" - статус трансфера (см. команду ` барракуд)
Cyl Hd Sct Cnt  Rel  Xfr  Err  Rf Rc    Rty.ctl   Rw  Ef Mf Sf Spc Error
008 0  00  0001 0001 0001 0000 00 00  FF.40.40.14 4C  00 00 00 00  00.00.00


` - не выяснено, некие внутренние переключения

% - статус Mux
:40000000A60100000001  AT`ALCC5SE   '

& - вывод BAR CODE
T>BAR CODE #  `'

! - отобразить регистры каналов чтения-записи (а может, и не только этих)
Adr D0 - 00100800 7F801510 580018B7 000001FF
Adr E0 - 01C80101 000000E0 00000000 00000002
Adr F0 - 00100000 07FD14CA 382113FF FD2B001C


~ - статус команды интерфейса (интересно, что выводится без переноса строки)
Cmd=E0.01.00.00 at=0000.00.01.00.01 Cm=0008.00.00.0001 Fl=00.00.00.0000

[ ] - увеличить/уменьшить слово, адрес которого хранится в переменной F8 (значение не выяснено)
{ } - увеличить/уменьшить адрес, который хранится в переменной F8

0x04 (^D) - переключатель Action code Display/no display (отключение отображается стиранием строки)

0x09 (^I) - см. 3>i

0x0C (^L) - печать версии прошивки

0x10 (^P) - Toggle power chop (в подтверждение ничего не выводит)

0x11 (^Q) - Foreground resume

0x12 (^R) - реинициализация и рекалибровка винта (не сброс всей микропрограммы)

0x13 (^S) - Foreground pause. При этом печатается содержимое регистров процессора:
BRK - Pc=2429 A=00 B=0D C=C5 X=1000 Y=10E0 Sp=13EF

0x14 (^T) - начать тестирование с уровня Age

0x15 (^U) - печать флагов ошибок сервосистемы (в текстовом виде)

0x16 (^V) - Toggle interface command echo display (в подтверждение ничего не выводит)

0x17 (^W) - не выяснено (выводит два байта, только при работе по интерфейсу)

0x18 (^X) - показать содержимое каких-то регистров по определенному адресу (только при работе по интерфейсу, не в командной строке)
At 10AE - 08 00 00 00 03 D7 09 11

0x19 (^Y) - не выяснено

0x1A (^Z) - прерывание текущей программы, запуск теста 00. По ^T на интерфейс не выйдет!

0x05 (^E) - состояние интерфейса
Interface State
   Er-00 BLK.REL-0001 BLK.XFR-0001 Max=03D7.09.11 mlt.siz=00 mlt.rel=00


0x06 (^F) - статус сегментов (полагаю, то же, что и буферы)
BUFFER SEGMENT TABLE
   Blk.xfr                      : 01   Number of segments available : 02
     Number of sectors/segment    : 00   Default number of segments   : 02
     Active MRU pointer           : 120C   Maximum number of segments   : 02
   #  Prev Next Flg Host_Adr Rel Start  |   #  Prev Next Flg Host_Adr Rel Start
   00 0000 0000 20 0000.00.00 00 0000   |   01 0000 0000 20 0000.00.00 00 0010


Общие команды (действуют на всех уровнях)

0x03 - забой символа

/x - смена уровня. Уровни TMOS - 0 (T), 1, 2, 3, 4, 6. Специальные параметры - A, B, D - производят некие внутренние переключения, но уровень не меняют.

L - зациклить следующую комнаду

0x0D - Еnter

@x - метка

| - конец пакетного файла

=x,y - ввести байт y по адресу x в память микроконтроллера

+x - считать байт по адресу x из памяти микроконтроллера

\ - быстрый вызов пакетного файла

* - специальные функции для пакетных файлов:
[q]
  *1     Batch file pause      *6     Stop on err
  *2,xxx Btch file dly x ms    *7,xxx Set btch loop ct
  *3,x   Branch label x        *8,x   Dec btch loop, goto lbl x
  *4,x   Incrmt hd, brnch x    *9     Stop on no err х
[/q]
_x,y - ввести байт y по адресу x в буферную память

Уровень T - основной уровень тестирования

B - ввести Bar Code S/N. Хранится в EEPROM

Dx - вывести логи начиная с x

Ex - печать одного лога x, без параметров - текущего. Если x=0 - очистка лога

Fx,y - выставляем feature бит номер x (0..F) в y (0,1)

H - печать битов Health в текстовом виде. H,,22 - сбросить биты health
[q]
  Health bits
  15 -Fat r/w err  12 -Hi r/w err rt
  11 -Skp asgn err 10 -Hrdwr err
   9 -Xecsv skps    8 -Xcesv alts
   7 -Act fail      6 -Spn fail
   5 -Srv dat fail  4 -Xfer rt warn
   1 -Spn warn      0 -Srv warn
[/q]
J - аналогично E

Nx - установить Age

P - ввести PCB S/N. Хранится в EEPROM

Yx - установить тип

Tx - запустить одиночный тест

# - ввести Drive S/N. Хранится в EEPROM

Уровень 1 - команды работы с памятью микроконтроллера

Ax - установить адрес стека (граница - 4000)

Bx - установить breakpoint

C - продолжить после break'а

Dx - вывод 256 байт памяти

E - не выяснено

Fx,y - найти слово x с адреса y (по умолчанию - 2000)

Gx - запустить код на выполнение с адреса x (>1000)

H - тест оборудования (в случае ошибки пишет "12 Volts unsafe")

M - переместить ПЗУ в ОЗУ (адреса 1000-1200 и 1E00-2000), по сути - инициализация переменных

Px,y - запрограммировать данные y в EEPROM по адресу x (0..3F)

R - производит инициализацию неких портов и подаёт импульс в некий порт

Sx - не установлено

Уровень 2 - работа с подсистемой чтения-записи (микроконтроллер CL-SH359)

Ax,y - показать/изменить тестовое пространство (x - битовая карта опций), см. общую команду A у барракуд
[q]
   b0 all heads   b3 unused       b6 seq out
   b1 all cyls    b4 even cyls    b7 random data
   b2 rnd cyl,hd  b5 odd cyls
   x=8 -> y=min cyl  x=9 -> y=max cyl
   x=A -> y=max hd   x=D -> set default
[/q]
Показ:
Single trk - Hd 0                                                            
Hdr, OTF, ECC, Servo, Window, Splash, Oftk rd, Eqlizr, Dta rty=40, Wrt rty=40


Bx - отобразить буфер x

Cx,y - сравнение буферов. При несовпадении - ошибка Code - 10

D - последовательно выполняет тесты 47, 43, 48, 46, 45? Возможно аналогично 3>D барракуд

Ex - см. T>E

F - добавление/удаление дефектов. Точный формат параметров не установлен, см. также команду 9>F у барракуд

Gx - выводит Log 01 = 01 Skp=0 , (при x=1) - какое-то преобразование номера лога во что-то

Hx - выбор головки

Ix,y,z - показать/изменить адаптивные параметры (хранятся в EEPROM)
x - номер головки
y,z=EITW - четыре полубайта параметров, макс. 3377, для внешней и внутренней зоны соотв.
Без аргументов - просто вывод
>I
        Outer Zone    Inner Zone
        EP I T W      EP I T W
Hd 0 =  2 2 4 4       2 2 4 4      
Hd 1 =  2 2 4 4       2 2 4 4      
Hd 2 =  2 2 4 4       2 2 4 4      
Hd 3 =  2 2 4 4       2 2 4 4

У живого винта:
        Outer Zone    Inner Zone
        EP I T W      EP I T W
Hd 0 =  3 2 3 3       3 1 4 3
Hd 1 =  3 2 3 3       2 1 6 4  


Jx - аналогично E

Kx - устанавливает некую флаговую переменную (один байт)

Mx,y,z - быстрый тест границ адаптивов (см. также 7>M барракуд)

N - тест адаптивов (см. также 7>N барракуд)

Ox,y - см. 3>O

Px,y - заполнение паттерном x буфера y (по умолчанию - буфер 2)

Qx,y - запись/чтение дорожки, x - начальный сектор, z - число секторов

Rx,y - чтение дорожки, x - начальный сектор, z - число секторов

Sx,y - позиционирование на цилиндр x, головка y

Ux - раскрутка шпинделя. x - опции:
0 или без аргумента - обычное
22 - печать меняющегося Pwr
E - останов и печать некоей таблицы (выбега?)
F - печать той же таблицы, но шпиндель при этом не пищит
1 - не менять состояние

Vx,y - чтение/верификация: x - начальный сектор, y - число секторов

Wx,y - запись, параметры те же

X - печать ID секторов на дорожке. На голой плате:
2>X                                                                          
Sct 00  Error 10 77       Sct 10  Error 10 57       Sct 20  Error 10 37      
Sct 01  Error 10 57       Sct 11  Error 10 37       Sct 21  Error 10 17      
Sct 02  Error 10 07       Sct 12  Error 10 E7       Sct 22  Error 10 C7      
Sct 03  Error 10 E7       Sct 13  Error 10 C7       Sct 23  Error 10 A7      
Sct 04  Error 10 C7       Sct 14  Error 10 77       Sct 24  Error 10 57      
Sct 05  Error 10 77       Sct 15  Error 10 57       Sct 25  Error 10 37      
Sct 06  Error 10 57       Sct 16  Error 10 37       Sct 26  Error 10 17      
Sct 07  Error 10 07       Sct 17  Error 10 E7       Sct 27  Error 10 C7      
Sct 08  Error 10 E7       Sct 18  Error 10 C7       Sct 28  Error 10 A7      
Sct 09  Error 10 C7       Sct 19  Error 10 77       Sct 29  Error 10 57      
Sct 0A  Error 10 77       Sct 1A  Error 10 57       Sct 2A  Error 10 37      
Sct 0B  Error 10 57       Sct 1B  Error 10 37       Sct 2B  Error 10 17      
Sct 0C  Error 10 07       Sct 1C  Error 10 E7       Sct 2C  Error 10 C7      
Sct 0D  Error 10 E7       Sct 1D  Error 10 C7       Sct 2D  Error 10 A7      
Sct 0E  Error 10 C7       Sct 1E  Error 10 77       Sct 2E  Error 10 57      
Sct 0F  Error 10 77       Sct 1F  Error 10 57                                

(второе число - Pwr)
На живом винте:
Sct 00  0500.00.00 FF     Sct 10  0500.00.10 FF     Sct 20  0500.00.20 FF
Sct 01  0500.00.01 FF     Sct 11  0500.00.11 FF     Sct 21  0500.00.21 FF
Sct 02  0500.00.02 FF     Sct 12  0500.00.12 FF     Sct 22  0500.00.22 FF
Sct 03  0500.00.03 FF     Sct 13  0500.00.13 FF     Sct 23  0500.00.23 FF
Sct 04  0500.00.04 FF     Sct 14  0500.00.14 FF     Sct 24  0500.00.24 FF
Sct 05  0500.00.05 FF     Sct 15  0500.00.15 FF     Sct 25  0500.00.25 FF
Sct 06  0500.00.06 FF     Sct 16  0500.00.16 FF     Sct 26  0500.00.26 FF
Sct 07  0500.00.07 FF     Sct 17  0500.00.17 FF     Sct 27  0500.00.27 FF
Sct 08  0500.00.08 FF     Sct 18  0500.00.18 FF     Sct 28  0500.00.28 FF
Sct 09  0500.00.09 FF     Sct 19  0500.00.19 FF     Sct 29  0500.00.29 FF
Sct 0A  0500.00.0A FF     Sct 1A  0500.00.1A FF     Sct 2A  0500.00.2A FF
Sct 0B  0500.00.0B FF     Sct 1B  0500.00.1B FF     Sct 2B  0500.00.2B FF
Sct 0C  0500.00.0C FF     Sct 1C  0500.00.1C FF     Sct 2C  0500.00.2C FF
Sct 0D  0500.00.0D FF     Sct 1D  0500.00.1D FF     Sct 2D  0500.00.2D FF
Sct 0E  0500.00.0E FF     Sct 1E  0500.00.1E FF     Sct 2E  0500.00.2E FF
Sct 0F  0500.00.0F FF     Sct 1F  0500.00.1F FF    


Yr,x,yyzz - отобразить/установить управление повтором: r - биты, x - число повторов, см. документацию по барракудам
[q]
   b0 hdr rty      b3 srv rcvry    b6 boost,filtr
   b1 OTF enable   b4 offtrk rd    b7 splash enab
   b2 2 brst ECC   b5 window,thld
   x=rd rty  y=hdr rty  z=wrt rty
[/q]
На пустой плате:
Hdr, OTF, ECC, Servo, Window, Splash, Oftk rd, Eqlizr, Dta rty=40, Wrt rty=40

Z - останов шпинделя

bx - то же что и 2>B

ex - обменять местами младший и старший байт аргумента (регистровой пары d)

p - не выяснено, нечто сложное

rx - длинное чтение сектора x

s - то же что и 2>Z

wx - длинная запись сектора x

y
z
- не выяснено, возможно Write bad data field sync byte и ещё что-то в тот же байт (комады различаются одним внутренним параметром)

Уровень 3 - команды работы с сервосистемой

A - см. 2>A

B - расчёт неких констант для сервосистемы:
Cyl 500
Hd 0 A+B = 7A  C+D = 22  R = 03
Hd 1 A+B = 7C  C+D = 1F  R = 04  


Cx,y - Acceleration Constant Measurement Test: x - внутренний цилиндр (ID), y - внешний цилиндр (OD)

Dx,y,z - тест времени доступа
3>D
Sk length 001 - Access = 01.8
Sk length 002 - Access = 03.9
Sk length 004 - Access = 04.6
Sk length 008 - Access = 05.8
Sk length 25E - Access = 16.1
Sk length 71C - Access = 25.5
Random seek   - Access = 15.9  


E - см. T>E
F - построение графика Moror acceleration


                            Motor Acceleration

                             o   o     ooooooooooooooooo o
               oooooooooooooo ooo o                     o o o
            ooo                                            o oooooo
       ooooo                                                       o
      o                                                             ooooo
ooooo
                                                                         o
o



Peak = 74
Loss = 09%
3>



- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -                                                                                


Gx,y - ввести/отобразить параметры Gain и еще какой-то
Tf=AA AB=CB CD=2E

Hx - см. 2>H

I - тест Gain на цилиндре
Cyl 37C
Gain   50 60 70 80 90 A0 B0 C0 D0
Head 0  .  .  .  .  .  .  .  .  .
Head 1  .  .  .  .  .  .  .  .  .


J - см. T>J

Kx - тест переключения головок
Head switch test
Cyl 008 Hd 0 - 11  FF
Cyl 008 Hd 1 - 11  00  

x - если введено, сбросить offset

Mx,y - перемещение актуатора без обратной связи по положению: x - значение DAC, y (=00,01,01,11) - направление

Nx - построение графика, поиск смещения позиционирования и ширины трека (похоже на команду 7>7 у барракуд)
x - сектор
                                   o
                                    oo




                                      o
                                  o
   Offset 092


   Width 13


                                       o

                                 o


3>                                      o

                              ooo        oo
oooooooooooooooooooooooooooooo             ooooooooooooooooooooooooooooooooooooo                                                                                


Ox,y - тест позиционирования от цилиндра x до y. С настройками Retry по умолчанию выполняется однократно.

P - предположительно график отклонения позиционирования

Qx,y - сертификационная запись/чтение. x - начальный сектор, y - число секторов

R - не установлено

S - см. 2>S

T - тест магнитного замка
3>T
Current = 08 10 18 20 28 30 38 40 48 50 58 60 68 70 78 Unlatched
$3>


U - печать флагов ошибок сервосистемы (в виде сообщений). На исправном винте не печатает ничего. На голой плате:
Spin lock err, Init err, Spin error,
То же самое что онлайн-команда ^U

V - (ничего не выводит, хотя должен) возможно, тест тока потребления шпинделя

Xx - показать амплитуду сервовспышек A, B, C, D и ошибку позиционирования для данного сектора (см. 4>X у барракуд)
x - номер сектора (0..2E) и за ним сразу же селектор A или B (что значит - не знаю)
3>X2EB
A=78 B=76 C=27 D=1F  Pe=02


Y - тест гистерезиса актуатора


                              Actuator Hysteresis


    o = in value
                                                               oo ooooooo
    * = hystersis                                  o oooooooooo  o
                                          ooooooooo o
                              o oooooooooo
                oooooooooooooo o
    oooooooooooo
oooo





- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
3>

*   **    ** ** *** ** *  *   *        *  **  * *  * *     **  *  *
***  ****  *  *   *  * ** *** ******** **  ** * ** * *****  ** ** ******
-------------------------------------------------------------------------------


Zx,y - предположительно, Zap servo burst на текущей дорожке (см. 4>Z у барракуд)
Параметр x тот же самый, что у 3>X

i - график Intg dsply

--------------------------------------------------------------------------------
708                               |               | o
688                               |               | o
608                               |               o
588                               |               o
508                               |              o|
488                               |             o |
408                               |            o  |
388                               |           o   |
308                               |          o    |
288                               |         o     |
208                               |         o     |
188                               |        o      |
108                               |        o      |
088                               |       o       |
008                               |     o         |
--------------------------------------------------------------------------------

                            Intg dsply                                          


b - не устанвлено (должен выводить CHS = .5.6..7..8 ABCD = .Ц_.Ч_.._.Щ avg = .о_.-_.-_.+ Fidv = .Ъ Favg = .Ы..-)

Уровень 4

I - см. 2>I

Mx - некий тест
Без параметров:
C00A H0 P1 Wc2 Th3   .  .  .  .  .  .  .  .  G=4096
C00A H1 P1 Wc2 Th3   .  .  .  .  .  .  .  .  G=4096

x - головка

N - какой-то долгий тест, возможно Napa Servo Adaptive Test

Vx,y - неясно, что-то с чтением/записью

Sx,y - см. 2>S

Y - см. 2>Y

Уровень 6 - работа с пакетными (batch) файлами

Bx - запустить пакетный файл x. В прошивке 4HT2.61 доступны 5, 7, 9, 11, 30, 31, 50

Ex - ввести пакетный файл x. Пользователю есть место в EEPROM на 3 файла.

Dx - отобразить пакетный файл x

K - не выяснено

N - не выяснено

Таблица тестов

Таблица тестов в прошивке выглядит так:
$2C, $34, $32, $1A, $19, $29, $38, 1, 2, 3, 4, 5, 6, 7, 8, 9, $F, $10, $11, $12 $13, $14, $15, $16, $17, $18, $1A, $1B, $20, $21, $22, $23, $24, $25, $26, $27, $28, $29, $2E, $30, $31, $32, $33, $34, $35, $36, $37, $38, $39, $3A, $3B, $40, $3F, $3F, $A, $B, $C, $D, $E, $2A, $2B, $2C, $2D, 0
Тесты до 1-го и после 3F-го не используются: 0A..0E совпадает с 01..05, 2A..2С - с 06/07/09, 2С - с 1A, 19 - с 00.
Соответствующие тестам цепочки подпрограмм найдены, но их назначение точно не установлено.


Пост будет редактироваться с целью исправления найденных ошибок. Далее будет выложен проект IDA и описана структура микропрограммы: карта памяти, переменные, объекты, особенности вызова подпрограмм, и т.п., а также некоторая информация о самом диске.
i8088
Advanced Member


Откуда: г. Баку, Азербайджан
Всего сообщений: 2132
Рейтинг пользователя: 0


Ссылка


Дата регистрации на форуме:
30 янв. 2015
KALDYH, класс, очень полезное исследование!!


KALDYH написал:
[q]
F - добавление/удаление дефектов. Точный формат параметров не установлен, см. также команду 9>F у барракуд
[/q]
Это у U-series, у barracuda тоже 2>F
KALDYH
Advanced Member
Технонекромант

Откуда: Кемерово
Всего сообщений: 2355
Рейтинг пользователя: 0


Ссылка


Дата регистрации на форуме:
5 июня 2009
Тем временем сделал небольшое открытие. В Jaguar применялись как интерфейсный контроллер CL-SH359, как у меня:

так и CL-SH360

а на CL-SH360 есть даташит с описаниями регистров! http://datasheet.datasheetarch...3X1198.pdf

Также по фото глянул, какие существовали версии прошивок. Вижу 4HT2.05A, 4HT2.17, 4HT2.35.
KALDYH
Advanced Member
Технонекромант

Откуда: Кемерово
Всего сообщений: 2355
Рейтинг пользователя: 0


Ссылка


Дата регистрации на форуме:
5 июня 2009
i8088 написал:
[q]
Это у U-series, у barracuda тоже 2>F
[/q]
У барракуд есть как 2>F, так и 9>F. Скорее всего, это одна и та же команда, но в справочниках на них разные описания, и на 9 уровне оно более полное.
i8088
Advanced Member


Откуда: г. Баку, Азербайджан
Всего сообщений: 2132
Рейтинг пользователя: 0


Ссылка


Дата регистрации на форуме:
30 янв. 2015
KALDYH написал:
[q]
У барракуд есть как 2>F, так и 9>F. Скорее всего, это одна и та же команда, но в справочниках на них разные описания, и на 9 уровне оно более полное.
[/q]
Я не припоминаю уровня /9 у Barracuda, сейчас перепроверил на AVALANCE, нет /9 уровня.


8>/9
Command Inactive - No VALID Cert Code Detected
8>

Или у каких-то моделей имеется /9?

AVALANCE у меня завис при попытке просмотреть последовательность тестов C>D, Вы не знаете,
это нормально для него? С диском я ничего не делал, собственно в первый раз подключил его к
терминалу.
KALDYH
Advanced Member
Технонекромант

Откуда: Кемерово
Всего сообщений: 2355
Рейтинг пользователя: 0


Ссылка


Дата регистрации на форуме:
5 июня 2009
i8088 написал:
[q]
AVALANCE у меня завис при попытке просмотреть последовательность тестов C>D, Вы не знаете,
это нормально для него?
[/q]
Не, не знаю, никогда аваланчей не пытал.
i8088
Advanced Member


Откуда: г. Баку, Азербайджан
Всего сообщений: 2132
Рейтинг пользователя: 0


Ссылка


Дата регистрации на форуме:
30 янв. 2015
Жаль что он у меня один всего (на 30GB, одноголовый), сравнить не с чем. Попался
потертый жизнью, но без единого remap-а. У нас вообще Barracuda до 7200.7 очень редки,
MFM-ки и то чаще встречаются.
KALDYH
Advanced Member
Технонекромант

Откуда: Кемерово
Всего сообщений: 2355
Рейтинг пользователя: 0


Ссылка


Дата регистрации на форуме:
5 июня 2009
На этом я, пожалуй, закончу свои исследования коннеров. Осталось только выложить результаты и проект для тех, кто желает покопать его за меня дальше.
Вот образ памяти, с которым я работал: https://drive.google.com/file/...sp=sharing
Файл проекта IDA: https://drive.google.com/file/...sp=sharing

Дамп снимал программой https://drive.google.com/file/...sp=sharing под досом , в принципе можно написать тупой скрипт побайтового чтения для ST_MEM.

Аппаратная часть

Плата Conner семейства Jaguar состоит из следующих компонентов:
  • Интерфейсный контроллер Cirrus Logic CL-SH359-32QC-A или CL-SH360-32QC-B. Возможности:
    - 4 уровня энергосбережения
    - скорость чтения-записи до 32 Мбит/с
    - взаимодействие с МК по опросу портов или по прерываниям
    - гибкий настраиваемый форматтер
    - чтение всей дорожки без участия микроконтроллера
    - дисковый буфер до 64 кб с настраиваемой сегментацией (на плате распаяно 32 кб в виде микросхемы LC36256-70, рядом есть место для второй такой же), скорость обмена до 12 Мбит/с
    - Интерфейс IDE XT/AT, режим PIO или DMA до 4 Мслов/с
    - обработка дефектов на уровне заголовков секторов
    - 16 бит CRC и 88 бит ECC
  • Микроконтроллер Motorola SC415111FU (заказной, даташита нет). Система команд 68HC11, корпус QFP-68.
  • ПЗУ 27C512, корпус PLCC-32, масочное либо однократное.
  • заказной драйвер шпиндельного двигателя 61153-002 (пр-во ST) с внешними силовыми ключами
  • заказной канал чтения-записи 61431-001 (PCA808HCG)
  • пара заказных чипов неустановленного назначения, 61216-1 (пр-ва Cirrus Logic, скорее всего тактовый генератор) и 61189-001 (пр-ва NCR)

Краткое введение в процессорную архитектуру Motorola 68HC11

Семейство МК было представлено в 1985 году, представляет собой дальнейшее развитие 6800. Архитектура - фон-неймановская, что необычно для МК. Адресное пространство - 64к, порты ввода-вывода мапятся на память. Регистры:
- два 8-разрядных аккумулятора A и B, которые могут объединяться в один 16-разрядный регистр В
- два 16-разрядных регистра X и Y
- 16-разрядные регистр стека SP и счётчик команд PC
Набор команд - типичный. Есть целочисленные умножение и деление. Набор периферии - типичный: порты, таймеры, UART (SCI), прерывания. Внутрення память может включать в себя области ROM, RAM, EEPROM, конкретное расположение областей зависит от модели. Особенность - первые 256 байт памяти могут использоваться для быстрого доступа (два байта на команду: 1 байт команда и 1 байт адрес).

Карта адресного пространства

По итогам анализа была получено следующее распределение адресов:
00-BF - регистры ввода-вывода (внешние и внутренние), назначение отдельных регистров (кроме управления EEPROM) не установлено. Мнемоники в проекте взяты от другого МК "от балды".
С0-17F - регистры контроллера CL-SH359, соответствуют адресам 40-FF в даташите. Имена вбиты оттуда.
180-FFF - не используется (читается состояние пустой шины)
1000-13FF - внутреннее ОЗУ (объём 1024 байт). Занято переменными примерно до адреса 1151, далее ссылаются только отдельные указатели. В конце находится стек.
1400-1DFF - не используется (читается состояние пустой шины)
1D00-1FFF - внутренний EEPROM (512 байт). Хранит некоторые переменные, (Age, Type и т.п.), пользовательские пакетные файлы и адаптивы.
2000-FFFF - внешнее ПЗУ. Начинается со строки копирайта. ПЗУ имеет объём 64 кбайт, что равно всему адресному пространству, и как бы "подлежит" под ним - область выше 2000 в чипе ПЗУ ничем не занята, кроме адресов ОЗУ - в них содержатся стартовые значения для инициализации. ПЗУ занято не полностью - в хвосте нули. С адреса FFC8 находится таблица прерываний.
Найти стандартный микроконтроллер с таким же распределением адресного пространства не удалось.

Методика дизассемблирования

Работать с IDA я не умею, поэтому учился на ходу. Действовал так:

Запускаем IDA, выбираем Disassemble a new file. Выбираем считанный 64кб дамп. Выбираем тип процессора Motorola MC6811, остальное не трогаем, нажимаем OK. На следующей странице также нажимаем ОК. Далее нужно выбрать модель микроконтроллера. Подходящего по параметрам там нет (я попытался написать свой конфиг, но не преуспел), поэтому просто нажимаем Cancel. Я первоначально выбрал произвольный наобум, как показала дальнейшая деятельность - не угадал.

Наконец получаем листинг. IDA проводит первичный автоанализ от вектора сброса и находит в нём некоторые функции (выделены голубым и красным), но большая часть дампа в полоске карты раскрашена серым цветом - это данные и цветом хаки - это нераспознанные области. Пора вручную найти всё остальное.

Прежде всего разворачиваем свёрнутые в массивы блоки данных. Ставим курсор на блок и нажимаем U. Неопределённые данные в автокомментариях имеют расшифровку своего значения в ASCII - это нам пригодится.

Прячем неиспользуемые блоки. Выделяем их (курсор на начало, Alt+L, курсор на конец) и из меню View - Hide. Можно также временно спрятать крупные блоки данных.

Переключаемся на вкладку Hex View и визуально находим в нём тестовые строки. Устанавливаем курсор на начало блока и переключаемся обратно в IDA View. Выделяем строку от начала до конца и нажимаем A - строка преобразуется в текстовую константу с автосгенерированным именем. Проходим таким образом по всем дампу.

Замечание: Формат срок - сишные, нуль-терминированные (выделять вместе с нулём). Большинство строк оканчиваются кодом перевода строки $D. Переменные в выводимую строку вставляются управляющими кодами:
02 xx - напечатать байт переменной xx от смещения 1000
06 xx - то же самое, без лидирующих нулей
08 xx - вывести байт как символ

Ну а теперь ищем код.
Замечание по структуре программы: массивы и строковые константы располагаются сразу за подпрограммой. Большинство подпрограмм оканчиваются командой rts - это байт $39 или rti - $3B
Ставим курсор на любой неопределённый блок и нажимаем C - IDA разворачивает этот участок и всё, на что ведут переходы, в код. Разворачиваются целые блоки, так что процесс идёт быстро. Смотрим, похоже получилось или непохоже. Если на что-то осмысленное непохоже - разопределяем обратно клавишей U. Для быстрого перехода далее используйте Ctrl-U

Пройдясь так по всему дампу, находим большую часть кода и относящихся к нему данных (на них появятся метки). Теперь займёмся кодом. Смотрим на слова, подсвеченные красным (о байтах позже). Как известно, регистры X и Y - индексные, поэтому то, что грузится в них командами ldx и ldy - скорее всего указатели. Если навести мышь на число, показывается, куда он ведёт. Ставим курсор на слово и нажимаем O - значение преобразуется в указатель. Делаем так для всего, что похоже на указатели в ПЗУ (числа более 2000) и в ОЗУ/EEPROM (от 1000 до 2000), более мелкие пока не трогаем.

Далее займёмся байтами.
Замечание: для работы с переменными в ОЗУ в подавляющем большинстве случаев используется индексная адресация через регистр X, который большую часть времени хранит константу $1000.
Исходя из этого, увидев команду с аргументом вида $число, x можно с уверенностью утверждать, что на самом деле она ссылается на адрес ($1000+$число). Как показать это наглядно? Ставим курсор на байт, нажимаем Ctrl+R. Выставляем Type - OFF16, Base Address - 0x1000. Адресу 1000 для удобства дадим какую-нибудь метку, например RAM.

Напоследок заглянем в область переменных. Ставим курсор на все по очереди и нажимаем X. Если на неё ссылаются в основном команды, работающие с регистрами d, x, y - это слово, если a и b - это байт. Выбираем нужный тип клавишей D.

Попробуем определить назначение некоторых функций. Видим, например, что на текстовые строки ссылается команда ldd $DEAD, и сразу за ней идёт jsr sub_BEEF (адреса, разумеется, для примера). Очевидно, что это процедура печати в терминал! Перейдём к ней двойным кликом или Enter и поищем ещё её вызовы комбинацией Ctrl+X. Видите, сколько их много? Теперь можно переименовать её кнопкой N во что-нибудь более понятное и привычное.

Про что ещё рассказать? Явные массивы для компактности листинга лучше так и пометить (кнопка в панели инструментов). Разбор кода удобнее вести, давая комментарии (кнопки ":" и ";").

Структура исследовааной микропрограммы Jaguar - 4HT2.61

Информация о диске, извлечённая из прошивки
Дорожек - 0x717
Головок - 0x04
Секторов - 0x2E
Микропрограмма подходит к следующим моделям:
Тип A0 - 4 головы, 716h дорожек
"Conner Peripherals 170MB - CP30171E " feature бит 1 = 1
"Conner Peripherals 170MB - CP30174E " feature бит 1 = 0
Тип A1 - 4 головы, 514h дорожек
"Conner Peripherals 120MB - CP30121E " feature бит 1 = 1
"Conner Peripherals 120MB - CP30124E " feature бит 1 = 0
Тип A2 - 2 головы, 716h дорожек
"Conner Peripherals 85MB - CP30081E " feature бит 1 = 1
"Conner Peripherals 85MB - CP30084E " feature бит 1 = 0, feature бит 40 = 0
"Conner Peripherals 80MB - CP30084E " feature бит 1 = 0, feature бит 40 = 1


Зонного распределения, предположительно, нет (по графику чтения не проверял)
Системные дорожки - 4..7, начиная с 8 идут пользовательские
Кодовых оверлеев нет
Калибровки и адаптивы хранятся в EEPROM
Буферы образуют отдельное адресное пространство, микроконтроллер имеет доступ к нему только через порты цирруса.

Переменные:
(для удобства - только последний байт)
00 - Pgm
01 - error code
02 - Pwr error
03 - Type
04,05 - Health
06,07 - Features
08,09 - состояние шпинделя
14,15 - текущий сектор
16,17 - временный регистр X
18,19 - Cyl
1A - Head
1B - Sect
1C,1D - Sec Count
1E,1F - Rel
20,21 - Xfr
22,23 - Err
26 - Ef
27 - Rw
2A - Spin lock
2C - State flags
2E,2F - Max cyl
30,31 - Min cyl
32 - Max head
35,36 - цилиндр, на который нужно спозиционироваться
37 - ...головка
38 - ...сектор
3D,3E - Spin
4D - Servo Gain
4E - AB
50 - Itg
58 - Offtrack error
59 - GC err
5C,5D - Grey
61 - Servo Threshold
68 - CD
8B - Rf
89,8E,8F,90 - Retry control (rd.hdr.wrt)
92 - Rc
93 - Mf
94 - Error log num
95 - выводимый level
96,97 - внутрикомандная временная переменная
98,99 - второй операнд команды
9A,9B - третий операнд команды
9С - флаг проверки вызова команды:
1 - foreground прерван
2 - есть первый аргумент
4 - есть второй аргумент
A0,A1 - адрес для поиска в памяти скорее всего, временная переменная
A2 - test space
A3 - error.3
AE - display flags
E0-F0 - какой-то временный массив на 16 байт

Данные в EEPROM
Каждая байтовая переменная хранится в трёх байтах. Первый байт как есть, второй - инвертированный байт, третий - XOR AA (10101010). Полагаю, сделано для надёжности и помехозащищённости.
1E00 - Age
1E03 - Type
1E06 и 1E09 - Feature (старший и младший байты соотв.)
1E10 и 1E13 - Health
Далее идут константы:
1E20-1E3F - массив адаптивов (16 слов)
1E40-1E6A - серийник
1E82-1E8E - Barcode S/N
1EF0-1EFA - PCB S/N
С адреса 1F00 и до конца располагается место для пользовательских пакетных файлов.

Таблицы
Найденные массивы табличных данных (как их оформлять в структуры - я не разобрался):

Команды:
889D - таблица переходов по уровням. Записи по 4 байта: первый - вводимый номер уровня, второй - выводимый в строке приветствия символ, 3-4 - указатель на таблицу команд данного уровня минус 3 (цикл поиск в таблице пред-инкрементный, поэтому минус)

883D - команды для всех уровней
8995 - команды уровня 1
8C9E - команды уровня 2
92C2 - команды уровня 3
A423 - команды уровня 4
ABBE - команды уровня 6
AEFA - онлайн-команды
B406 - команды уровня T
Записи по 3 байта: байт символа команды, за ним слово адреса вызываемой подпрограммы.

Селфскан
7B3F - последовательность тестов селфскана (массив 40h байт)
7B7F - массив 41h указателей на последовательности подпрограмм для каждого номера теста (нумерация линейная, от 0 до 40)

Прочие
A237 - массив указателей на текстовые строки расшифровки битов ошибок. Сами строки - сразу за ним.
B537 - таблица расшифровки битов health. Элементы по 4 байта: битовая маска, затем 0, потом ссылка на строку расшифровки.
6D33 - таблица типов накопителя (указатель на неё ведёт на 4 байта раньше). Элементы по 4 байта: байт типа, байт числа головок, слово числа дорожек.
DAB3 - выводимые в паспорте имена моделей

Подпрограммы
Передача параметров в функции - через регистры, если часть параметров не вмещается - через переменные.

Процедуры обработки команд
На входе: регистровая пара d - первый аргумент, переменные 98 и 9A - второй и третий. Наличие аргументов проверяется анализом битовой переменной 9С.
На выходе: d - указатель на выводимое сообщение об ошибке либо a - код ошибки.

Подпрограммы ввода и печати
Находится по адресу 2506, еще одна - по адресу 25F0
На входе: d - указатель на начало выводимой строки. Формат строк - см. выше.
Связанные подпрограммы:
2434 - приём одиночного символа, результат - в регистре a
2459 - печать одиночного символа из регистра a
2549 - использует входной регистр x
25F9 - помещает сообщение по адресу d в очередь на вывод

Контрольная сумма
ПЗУ защищено контрольной суммой. Считается по адресам 1000-1200, 1E00-2000 и 2000-FFFF вместе.

В процессе дополнения...
strelec
Newbie


Откуда: Кемерово
Всего сообщений: 105
Рейтинг пользователя: 0


Ссылка


Дата регистрации на форуме:
3 апр. 2018
Приветствую.
Винт seagate 7200.10 , NHPLUS2HD.
Запустил селф с N2.На 13 тесте долго не реагировал на"."
Подумал, что завис.Передернул питание, селф не стартовал после подачи питания.
Выходит только на уровень F>Pgm=00 Trk=0001690A(0001690A[0180F8]).0(0).01E(01E) Zn=FF Err=00 ErCt=0000 Hlth=0000 CHlth=0000 Ntrdy LBA=00000000.
Как правильно запустить селф опять?
KALDYH
Advanced Member
Технонекромант

Откуда: Кемерово
Всего сообщений: 2355
Рейтинг пользователя: 0


Ссылка


Дата регистрации на форуме:
5 июня 2009
strelec, посылаем ему App по кабелю, считываем системный сектор, проверяем - Age должен показывать 13, cert code и cert table должны быть на месте.
<<Назад  Вперед>> Страницы: 1 2 3 4 5 ... 42 43 44 45 46 * 47 48 49 50 .. 75 76 77 78 79 80
Печать
Полигон-2 »   Документация »   Програмный ремонт жёстких дисков HDD
RSS

0 посетителей просмотрели эту тему за последние 15 минут
В том числе: 0 гостей, 0 скрытых пользователей

Последние RSS
[Москва] LIQUID-Акция. Сливаются разъемы CF
МС7004 и 7004А на AT и XT
Пайка термотрубок
Проммать s478 PEAK 715VL2-HT ( Full-Size SBC)
Подскажите по 386 материке по джамперам.

Самые активные 5 тем RSS