HDD detection
От: Chichikadze Израиль http://mika0x65.livejournal.com
Дата: 23.11.07 22:08
Оценка:
Мое почтение всем.

Пытаюсь определить наличие винчестеров на канале, но так и не пришел к однозначному ответу. Стандарт в этом плане несколько туманен: для идентификации предполагается команда EXECUTE_DEVICE_DIAGNOSTICS, но, к сожалению, она не дает полной информации. Более того, стандарт не определяет поведение для Device1 only конфигураций, а между тем такие конфигурации встречаются. Пытался раскопать исходники linux/BSD, но пока ни к чему конкретному не подобрался. Старый linux драйвер просто берет информацию из CMOS, с новым пока не разобрался. М.б. кто-то знает, как можно получить сведения о конфигурации, или ссылкой одарит хорошей?

Заранее благодарен.
Re: HDD detection
От: Alter_ Украина http://alter.org.ua
Дата: 24.11.07 19:35
Оценка: 6 (2)
Здравствуйте, Chichikadze, Вы писали:

C>Пытаюсь определить наличие винчестеров на канале, но так и не пришел к однозначному ответу. Стандарт в этом плане несколько туманен: для идентификации предполагается команда EXECUTE_DEVICE_DIAGNOSTICS, но, к сожалению, она не дает полной информации. Более того, стандарт не определяет поведение для Device1 only конфигураций, а между тем такие конфигурации встречаются. Пытался раскопать исходники linux/BSD, но пока ни к чему конкретному не подобрался. Старый linux драйвер просто берет информацию из CMOS, с новым пока не разобрался. М.б. кто-то знает, как можно получить сведения о конфигурации, или ссылкой одарит хорошей?


ATA_IDENTIFY вам должно помочь. Во всяком случае для EIDE/ATA.
Для AT IDE имени IBM еще метод AnybodyHome подходит (но это только наличие).
Посмотрите исходники http://alter.org.ua/soft/win/uniata, функции FindDevices(), CheckDevice(), UniataAnybodyHome(), IssueIdentify()
--
Alter, http://alter.org.ua
Re[2]: HDD detection
От: Chichikadze Израиль http://mika0x65.livejournal.com
Дата: 24.11.07 23:26
Оценка:
Здравствуйте, Alter_, Вы писали:

A_>Здравствуйте, Chichikadze, Вы писали:



A_>ATA_IDENTIFY вам должно помочь. Во всяком случае для EIDE/ATA.


Спасибо! Но исходник непростой, поэтому, спрошу наперед: вы, часом, не используете такой метод:

1. Послать IDENTIFY_DEVICE устройству.
2. Подождать прерывания.
3. Если прерывания нет, значит устройство не подключено.

?

Заранее благодарен.
Re[3]: HDD detection
От: Alter_ Украина http://alter.org.ua
Дата: 25.11.07 02:06
Оценка:
Здравствуйте, Chichikadze, Вы писали:

C>Спасибо! Но исходник непростой, поэтому, спрошу наперед: вы, часом, не используете такой метод:


C>1. Послать IDENTIFY_DEVICE устройству.

C>2. Подождать прерывания.
C>3. Если прерывания нет, значит устройство не подключено.

Самый надежный метод — AnybodyHome (запись в регистр данных и верификация чтения)
Если он дает добро, тогда ATA_IDENTIFY (и ждем DRQ с таймаутом, по сути — прерывание, как вы и говорите) или
если найдена сигнатура ATAPI — ATAPI_IDENTIFY.
Если же появился статус ошибки — скорее всего перед нами древний винт, который ATA_IDENTIFY не умеет.
Ну и после считывания IDENTIFY блока почитать еще, пока DRQ не снимется, т.к. некоторые железки отдают больше данных.
--
Alter, http://alter.org.ua
Re[4]: HDD detection
От: Chichikadze Израиль http://mika0x65.livejournal.com
Дата: 25.11.07 21:08
Оценка:
Здравствуйте, Alter_, Вы писали:

A_>Самый надежный метод — AnybodyHome (запись в регистр данных и верификация чтения)


Разобрал более-менее AnybodyHome. Теперь, с позволения вопросы:

1. Сам алгоритм, как я понял, выглядит так (относящаяся ко мне часть):

1. Подождать 10 мсек. //зачем?..
2. Записать значение 0х55 в регистр счетчика секторов. Эта команда выполняется 2 раза, опять же, неясно зачем.
3. Подождать 5 мсек.
4. Считать регистр счетчика секторов, проверить, вернулось ли наше число.
5. Повторить шаги 2 — 5, но с числом 0хАА.

По этому коду (и по соответствию его стандарту) у меня масса вопросов. Почему именно такие числа и промежутки времени? Такой алгоритм почерпнут из стандарта? Гарантирует ли он определение наличия винчестеров? Нужна ли дополнительная проверка?

Помимо этого, есть вопросы относительно самого стандарта. В стандарте сказано:

In a single device configuration where Device 0 is the only device and the host selects Device 1, Device 0 shall
respond as follows:
1) A write to the Device Control register shall complete as if Device 0 was the selected device;
2) A write to a Command Block register, other than the Command register, shall complete as if
Device 0 was selected;
3) A write to the Command register shall be ignored, except for EXECUTE DEVICE DIAGNOSTIC;
4) If the device does not implement the PACKET Command feature set, a read of the Control Block or
Command Block registers, other than the Status or Alternate Status registers, shall complete as if
Device 0 was selected. A read of the Status or Alternate status register shall return the value 00h.;
5) If the device implements the PACKET Command feature set, a read of the Control Block or
Command Block registers shall return the value 00h.


Это, как я понимаю, противоречит Вашему алгоритму, т.к. в Device0 only конфигурации Device0 может полностью отвечать за Device1. Более того, далее следует:

NOTE — Even though Device 1 is not present, the register content may appear valid for Device
1. Further means may be necessary to determine the existence of Device 1 (e.g., issuing a
command).


Соотвественно вопрос: я неправильно понял стандарт? Просто, как я понял, такой способ определения подходит для ATAPI устройств, но не для АТА.

Device1 only конфигурации стандарт вообще не описывает .

С IDENTIFY_DEVICE тоже не все гладко -- неясно, как долго надо ждать отклика от устройства.

Прошу прощения за такую дотошность, просто я хочу тщательно разобраться, как со стандартом, так и с его реальным применением.

Если не трудно, ответьте поподробнее.

Заренее благодарен.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.