Работа ACPI включение COM портов.

Тема в разделе "WASM.OS.DEVEL", создана пользователем DRAHM, 21 июн 2007.

  1. DRAHM

    DRAHM New Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2006
    Сообщения:
    12
    Достоим привет!
    Дело токого рода не так давно писал программку которая с помощью драйвера giveio обращается
    на прямую к COM порту и все колом! (не выдавал порт ни каких сигналов при OUT а IN возвращала
    всегда 255) потом написал драйвер котораый в режиме ядра обращался к порту, тоже самое.
    Где то нашел токой код вставил в драйвер (в свой или giveio нет разници) и все везде
    заработало.


    cli
    mov edx,2eh ;адрес регистра ACPI - может быть 370h, 3f0h
    mov ebx,[3f8h] ;адрес com порта
    xor ecx,ecx ;логический номер устройства ACPI
    PortEnable1:
    inc cl
    cmp cl,7 ; ищем в промежутке 1...7
    jnc PortEnablex
    mov al,055h ; открываем доступ к регистрам ACPI
    out dx,al
    jmp short $+2
    mov al,87h
    out dx,al ;reset ACPI
    jmp short $+2
    out dx,al ;reset ACPI
    jmp short $+2
    mov al,7 ;команда адреса
    out dx,al
    jmp short $+2
    inc edx ;на регистр данных
    mov al,cl
    out dx,al ;пишем адрес
    jmp short $+2
    dec edx
    mov al,61h ;команда младшего адреса порта
    out dx,al
    jmp short $+2
    inc edx
    in al,dx ;читаем младший адрес
    dec edx
    cmp al,bl ;совпадает с нашим портом?
    jnz PortEnable1 ;нет, не наше устройство
    mov al,60h ;команда старшего адреса порта
    out dx,al
    jmp short $+2
    inc edx
    in al,dx ;читаем
    dec edx
    cmp al,bh ;совпадает с нашим портом?
    jnz PortEnable1 ;нет, не наше устройство
    ; устройство найдено
    mov al,70h ;команда прерывания порта
    out dx,al
    jmp short $+2
    inc edx
    mov eax,[4] ;номер прерывания из реестра
    out dx,al ;устанавливаем
    jmp short $+2
    dec edx
    mov al,30h ;команда enable device
    out dx,al
    jmp short $+2
    inc edx
    mov al,1 ;открываем устройство
    out dx,al
    jmp short $+2
    dec edx
    xor ecx,ecx
    PortEnablex:
    mov al,0aah ;закрываем доступ к регистрам ACPI
    out dx,al

    sti

    А теперь в суть.
    Может ли кто подбросить более подробную инф. по ACPI желательно на русском ?
    Или может этот код можно подробней прокоментировать ?
    Все рву строку.
     
  2. _BC_

    _BC_ БЦ

    Публикаций:
    0
    Регистрация:
    20 янв 2005
    Сообщения:
    759
    здесь не ACPI, а работа с Super I/O. И заточен код под какие-то конкретные SIO-чипы (а именно с открытием по 55 87 87 или 55 и 87 87), т.е. на всех остальных он работать не будет.
    Доп. инфу проще всего раздобыть, узнав (например, с помощью проги CPU-Z или аналогов) название своего SIO-чипа, а затем найти и скачать даташит на него.
    Для сабжа есть и альтернативный вариант -- отключать порты не на уровне отрубания девайсов Super I/O, а до него -- средствами чипсета (напр., регистр LPC_EN на интеловских).
     
  3. DRAHM

    DRAHM New Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2006
    Сообщения:
    12
    _ВС_ тебе сугубо "ВНИМАНИЕ ДОРОГО !!!".

    А CPU-Z только какой чипсет у меня показывает.
     
  4. _BC_

    _BC_ БЦ

    Публикаций:
    0
    Регистрация:
    20 янв 2005
    Сообщения:
    759
    модель Super I/O он тоже показывает -- оно у него обозвано как Sensor. Не опознать (т.е. когда выводит числом вместо имени чипа) может только новые (м.б. еще редкие), в этом случае можно попробовать HWiNFO32 или еще какую прогу с той же оперы. В HWiNFO32 это строка Mainboard --> Super-IO/LPC Chip
     
  5. DRAHM

    DRAHM New Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2006
    Сообщения:
    12
    Ага нашел LPC IO W83687THF только производителя не знаю на чипе кроме номера ничего нет
    даташит пока не нашел да _BC_ не обессуть так как я "работю над собой и постаянно расширяю свой кругозор" и вот такое дело нужен какойнибудь исходничек желательно на ASM где в DOSе включают и работают с какимнибудь устройством подключенным к PCI шине , а так ДОБРА И ЗДОРОВЬЯ тебе, всё
    ушел.
     
  6. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    1. Берешь описание устройства
    2. Конфигурируешь его (через конфигурационное адресное пространство)
    3. Работаешь с ним
    как пример, включение и конфигурирование HPET на ICH5
    Код (Text):
    1. enable_hpet:
    2.     mov eax, 0x8000F8D0 ; выбираем шину, устройство, функцию (B0:D31:F0 (LPC)) и смещение в конфигурационном пространстве устройства (0xD0)
    3.     mov edx, 0xCF8 ; I/O адрес CONFIG_ADDRESS
    4.     out dx, eax
    5.     mov edx, 0xCFC ; I/O адрес CONFIG_DATA
    6.     in eax, dx ; читаем 4 байта из конфигурационного пространства по смещению 0xD0
    7.     and eax, 0xFFFE7FFF ; выбираем пространство адресов HPET (0xFED00000-0xFED003FF)
    8.     or eax, 0x20000 ; включаем декодирование этого пространства со стороны LPC
    9.     out dx, eax ; вносим изменения
    10. ; конфигурация HPET
    11.     mov ebx, 0xFED00000 ; базовый адрес регистров HPET
    12.     and dword [ebx + 0x10], 0xFFFFFFFC
    13.     and dword [ebx + 0xF0], 0 ; обнуляем счетчик
    14.     mov edx, dword [ebx + 0x104]
    15.     mov eax, 0x2F4C
    16.     mov dword [ebx + 0x100], eax
    17.     mov dword [ebx + 0x108], 0x100000 ; установить значение компаратора
    18.     and dword [ebx + 0x20], 0xFFFFFFF8 ; сбросить регистр статуса
    19.     shr eax, 9
    20.     lea eax, dword [eax * 2 + 0x10]
    21.     mov dword [0xFEC00000], eax
    22.     mov dword [0xFEC00010], 0x00000020 ; конфигурирование I/O APIC
    23.     sti
    24.     or  dword [ebx + 0x10], 1 ; включить таймер
     
  7. _BC_

    _BC_ БЦ

    Публикаций:
    0
    Регистрация:
    20 янв 2005
    Сообщения:
    759
    это Winbond. Даташит -- W83627THF W83627THG Winbond LPC I/O.
    http://www.google.com/search?hl=ru&ie=UTF-8&oe=UTF-8&q=W83627THF%20W83627THG%20%22Winbond%20LPC%20I/O%22
    Вышеприведенный код с ним (навскидку) совместим.

    Код включения/выключения какого-либо девайса -- это смотря на каком уровне делать, и смотря какой девайс. Часть может быть отключена в SIO-чипе, другая часть (самая обширная) -- средствами чипсета. В обоих случаях код будет зависеть от моделей соответственно SIO и чипсета. Плюс до кучи независимое отключение/усыпление некоторых внешних устройств, ихними же средствами. Есть еще конечно ACPI и APM, но это, так сказать, на любителя. ;)
     
  8. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    самый, имхо, независимый от аппаратной части, способ
     
  9. DRAHM

    DRAHM New Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2006
    Сообщения:
    12
    ОТ ДУШИ ДУШЕ ДУШЕВНО сами знаете.Интересная микросхемка. Интересно еще вот про архитектуру (286,386,486) можно найти много примеров и информации но дальше все становится сложнее такое чувство что держится все это под "конспёрой" или я плохо ищу или вобще это сечас не актуально?
    Да reiЗer внеси ясность пожалуста откуда взялся этот адрес
    mov dword [0xFEC00000], eax
    mov dword [0xFEC00010], 0x00000020 ; конфигурирование I/O APIC
    видь пространство адресов HPET (0xFED00000-0xFED003FF)
     
  10. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    ACPI_BASE afair,
     
  11. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    DRAHM
    0xFEC00000-0xFEC01000 - стандартное пространство адресов I/O APIC
    Код (Text):
    1. mov eax, 0x2F4C
    2. ...
    3. shr eax, 9
    4. lea eax, dword [eax * 2 + 0x10]
    грубо говоря, EAX теперь хранит индекс в таблице перенаправлений прерываний I/O APIC-а
    работа с регистрами I/O APIC, которые не отображены на адресное пространство напрямую, идет через специальные регистры I/O APIC расположенные по 0xFEC00000 (выбор регистра) и 0xFEC00010 (получение содержимого регистра или запись в него), так вот сначала выбираем регистр
    Код (Text):
    1. mov dword [0xFEC00000], eax
    а потом записываем в него
    Код (Text):
    1. mov dword [0xFEC00010], 0x00000020
    0x20 - номер вектора прерывания (есть суть номер дескриптора в IDT)
     
  12. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    в смысле?
     
  13. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    DRAHM
    Да, все становиться сложнее.

    Во времена i286,i386,i486 то же было разнообразие машин. Так что и там были проблемы, с поиском информации. Хотя тогда она и была открытой. Эти времена я почти не застал.

    А вот в современные машины почти не описаны на русском. Видать это связанно с перестройкой. Если поискать в интернете, то на английском можно найти документацию почти на все оборудования. Правда некоторые производители скрывают свои стандарты.
     
  14. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    offtop
    Pavia
    может чего знаешь по этому поводу
    а то складывается ощущение, что это действительно тайна
    буду благодарен
     
  15. alutov

    alutov New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    5
    Привет всем!
    Небольшие пояснения по приведенному выше коду. Этот код я действительно писал, используя документацию под чип
    Winbond W83977TF, но там были адреса для SIO 3f0h,370h. У меня на домашней машине стоит ICH5, у него адрес 2eh.
    Гоняя код на 3 разных машинах, я заметил, что логический номер устройства на разных чипах разный, поэтому я ищу порт по его адресу. Винда его не трогает при включении-выключении порта. Адрес порта и номер прерывания брал из реестра. Винда включает - выключает порты таким же образом - я ставил Айсом брейки на порт 2eh. А вообще-то интересно на каких чипах этот код не идет.
     
  16. _BC_

    _BC_ БЦ

    Публикаций:
    0
    Регистрация:
    20 янв 2005
    Сообщения:
    759
    alutov
    ну дык, 2Eh как конфиг для SIO появился где-то начиная с ICH/ICH0 (~1999), а именно, когда на чипсетах появился LPC-интерфейс. А W83977TF -- не LPC, по даташиту он ~1998 года, когда LPC возможно еще и в помине не было, отсюда и SIO-конфиг на 3F0h, а не 2Eh.
    Винда сама вообще-то не умеет работать с Super I/O. Включением/выключением устройств средствами SIO она всецело обязана соответствующим методам объектов-устройств в DSDT биоса. C самим SIO работает AML-интерпретатор, при выполнении этих методов -- именно он выполняет собственно I/O в/из SIO-порты. Надо полагать, именно отсюда появилось слово "ACPI" в комментах к коду и названии этой темы -- перехватываемый айсом I/O с портами 2Eh/2Fh видимо шел из acpi.sys. ;)

    Из декомпиленной DSDT можно кстати почерпнуть работу с недокументированными SIO-чипами (и не только), т.е. с недоступными даташитами -- там работа с ним как на ладони, рипнуть алго оттуда можно быстрее, чем из дизасма биоса.
    Код (Text):
    1.                 Method (ENFG, 0, NotSerialized)
    2.                 {
    3.                     Store (0x87, INDP)
    4.                     Store (0x01, INDP)
    5.                     Store (0x55, INDP)
    6.                     Store (0x55, INDP)
    7.                     Or (POWC, 0x80, POWC)
    8.                 }
     
  17. alutov

    alutov New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    5
    Пока не нашел понятного описания DSDD, где она находится в памяти и как достать из нее данные.
    И везде в общих чертах пишется об AML - интерпретаторе...
     
  18. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    alutov
    Читай документацию ACPI.
    RSDP->RSDT->FADT->DSDT

    RSDP ищется в первом мегабайте, а именно либо
    ->В первом килобайте Extended BIOS Data Area(EBDA). Адрес EBDA лежит здесь 40:0Eh
    ->E0000h-FFFFFh
    Ищешь сигнатуру “RSD PTR ” выровнена по 16 Байтной границе.

    Дальше
    В RSDP ищешь RsdtAddress это смещение +16 4 байта или 32 bit physical address of the RSDT.

    Дальше разбираешь RSDT
    смотришь длину.
    Со смещения 36 точки входа для различных таблиц. Число точек входа определяется через длину таблицы.
    Точка входа 4 байта physical address

    Ищешь FADT
    Разбираешь FADT
    Там со смещения 40 будет Physical address of the DSDT.

    DSDT представляет собой таблицу плюс набор данных в AML коде, который может быть переведен в ASL.
    AML - бинарные коды, ASL - естественный язык.
    У Intel есть утилиты для конвертации.
     
  19. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    alutov
    тут
    также можешь глянуть эту тему
    ASL-компилятор и AML-интерпретатор от Intel тут
     
  20. alutov

    alutov New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    5
    Спасибо, изучаю.