SuperIO чип имеет несколько режимов работы: работа с/через LDN (Logical_Device_Number) и через Environment Controller регистры.
До начала обмена с чипом SuperIO через LDN его нужно инициализировать, иначе команды будут проигнорированы. У разных м/с (разных производителей) существуют различные последовательности для инициализации чипа.
Нижеследующий отрывок безжалостно сдёрнут с форума wasm.ru
IT8702F
87h,01h,55h,55h
IT8712F
87h,01h,55h,55h
IT8706R
87h,06h,55h,55h
IT8710F
87h,87h
W83977EF
87h,87h
W83627HF
87h,87h
W83627HF
87h,87h
PC8739x
01h,00h
FDC37M70x
55h
Пример инициализации SIO IT8712F. Имеем таблицу инициализации и собственно циклический код:
initSIO_string db 87h ;
db 1 ;
db 55h ;
db 55h ;
.
.
.
_SIO_init_
mov si, offset initSIO_string
mov dx, 2Eh
mov cx, 4
Loop_Init_SuperIO: ;
mov al, cs:[si]
out dx, al
inc si ; Increment by 1
loop Loop_Init_SuperIO ; Loop while CX != 0
Вместо циклического кода можно увидеть и просто линейный код, где числа инициализации прописаны прямо в программе.
2Eh(4Eh) - регистр адреса
2Fh(4Fh) - регистр данных
Так, проинициализировали. Хорошо. Теперь далее.
Для работы с LDN его нуна сначала задать, то есть сообщить чипу, в каком направлении хотим наследить. Для IT8712F это делается записью номера LDN в 7 регистр. То есть 7 пишем в порт 2Eh, в порт 2Fh пишем нужное значение LDN.
set_LDN_SIO proc near |
rd_SIO_ proc near |
wr_SIO_ proc near |
А для этого случая инициализация уже не нужна.
Адреса этих регистров задаются при первоначальном программировании SuperIO, но как бы являются стандартом.
295h - регистр адреса
296h - регистр данных
Может быть реализовано в виде подпрограммы. Вход в подпрограмму с параметром - номер регистра, а если еще и пишем - тогда данные для записи.
rd_295h proc near |
wr_295h proc near |
Оператор out 0EBh, al - программная задержка.
также для Super I/O иногда используется пара портов A20h/A21h (видимо как расширение к портам 2E(4E)/2F(4F))
Вот пример из AwardPhoenix BIOS:
Отправить комментарий