Здравствуйте, 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()
Мое почтение всем.
Пытаюсь определить наличие винчестеров на канале, но так и не пришел к однозначному ответу. Стандарт в этом плане несколько туманен: для идентификации предполагается команда EXECUTE_DEVICE_DIAGNOSTICS, но, к сожалению, она не дает полной информации. Более того, стандарт не определяет поведение для Device1 only конфигураций, а между тем такие конфигурации встречаются. Пытался раскопать исходники linux/BSD, но пока ни к чему конкретному не подобрался. Старый linux драйвер просто берет информацию из CMOS, с новым пока не разобрался. М.б. кто-то знает, как можно получить сведения о конфигурации, или ссылкой одарит хорошей?
Заранее благодарен.
Здравствуйте, 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 тоже не все гладко -- неясно, как долго надо ждать отклика от устройства.
Прошу прощения за такую дотошность, просто я хочу тщательно разобраться, как со стандартом, так и с его реальным применением.
Если не трудно, ответьте поподробнее.
Заренее благодарен.