_asm
{
// записали адрес, равный 0x87 (начальная стадия входа)
mov dx, 0x2e
mov al, 0x87
out dx, al
// записали адрес, равный 0x87 (конечная стадия входа)
mov dx, 0x2e
mov al, 0x87
out dx, al
// записали адрес, равный 0x07 (шаг 1 выбора устройства)
mov dx, 0x2e
mov al, 0x07
out dx, al
// записали по адресу 0x07 значение 0x08 (шаг 2 выбора устройства)
mov dx, 0x2f
mov al, 0x08
out dx, al
// записали адрес, равный 0x30 (шаг 1 активации устройства)
mov dx, 0x2e
mov al, 0x30
out dx, al
mov dx, 0x2f
in al, dx
or al, 0x01
// записали по адресу 0x30 значение 0x01 (шаг 2 активации устройства)
out dx, al
// записали адрес, равный 0xf5 (шаг 1 настройки устройства)
mov dx, 0x2e
mov al, 0xf5
out dx, al
mov dx, 0x2f
in al, dx
and al, 0xe7
// записали по адресу 0xf5 значение ???00??? (шаг 2 настройки устройства)
out dx, al
// записали адрес, равный 0xf7 (шаг 1 запрета сброса от прерываний мыши и клавиатуры)
mov dx, 0x2e
mov al, 0xf7
out dx, al
mov dx, 0x2f
in al, dx
and al, 0x3F
// записали по адресу 0xf7 значение 00??????b (шаг 2 запрета сброса от прерываний мыши и клавиатуры)
out dx, al
// записали адрес, равный 0xf6 (шаг 1 запуска устройства)
mov dx, 0x2e
mov al, 0xf6
out dx, al
// записали по адресу 0xf6 значение 0x03 (шаг 2 запуска устройства)
mov dx, 0x2f
mov al, 0x03
out dx, al
// записали адрес, равный 0xAA = вышли
mov dx, 0x2e
mov al, 0xAA
out dx, al
}
Программирование Watchdog Timer
Задается интервал таймера, запускается таймер. Когда таймер сработал происходит перезагрузка системы. Мне это нужно для того, чтобы перезагружаться при зависании программы(программа постоянно сбрасывает таймер).
Открыл прямой доступ к портам с помощью GIVEIO.sys.
Написал на TASM вставку(вставка в программу на BCB 6.0), которая запускает таймер с 2-ух сек. интервалом:
Код:
_asm
{
// выбираем логическое устройство - WDTO#
mov dx, 0x07
mov al, 0x08
out dx, al
// активируем WDTO#
mov dx, 0x30
mov al, 0x01
out dx, al
// настройка: нет ускорения счета, подсчет секунд
mov dx, 0xf5
mov al, 0x00
out dx, al
// запрещаем сброс (не в 0, а в нач. зн.) счетчика по прерыванию от мыши и клавиатуры
//mov dx, 0xf7
//mov al, 0x00
//out dx, al
// запускаем двухсекундный таймер
mov dx, 0xf6
mov al, 0x02
out dx, al
}
{
// выбираем логическое устройство - WDTO#
mov dx, 0x07
mov al, 0x08
out dx, al
// активируем WDTO#
mov dx, 0x30
mov al, 0x01
out dx, al
// настройка: нет ускорения счета, подсчет секунд
mov dx, 0xf5
mov al, 0x00
out dx, al
// запрещаем сброс (не в 0, а в нач. зн.) счетчика по прерыванию от мыши и клавиатуры
//mov dx, 0xf7
//mov al, 0x00
//out dx, al
// запускаем двухсекундный таймер
mov dx, 0xf6
mov al, 0x02
out dx, al
}
Вставка не сработала: система через две секунды не перезагрузилась.
Пробовал использовать еще функцию ресета, но тоже не сработало.
Подскажите пожалуйста в чем причина?
PS:Ссылка на datasheet:
http://www.winbond-usa.com/products/winbond_products/pdfs/PCIC/W83627EHF_W83627EHG.pdf
Задача решена! Все оказалось не так просто, помог кусочек кода драйвера присланого производителями IOWA-8522.