Выключение компьютера через порты

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

  1. VaStaNi

    VaStaNi Member

    Публикаций:
    0
    Регистрация:
    1 июн 2004
    Сообщения:
    203
    Адрес:
    Ukraine
    Самое короткое выключение машинки VIA686 чипсета у меня было так, например:
    Код (Text):
    1.     ORG     0x100
    2.  
    3.     mov     al, 0x57
    4.     mov     dx, 0x402F
    5.     out     dx, al
    6.     int   0x20
    собственно валит машинку, как щелчек тумблера на БП, т.е. "моменто море" )))
    Вообще этот финал выдрат из биоса и является финальной частью обработчика SMI по части PowerOFF APM.
    Собственно я так понимаю SMI "слушает" ACPI пронюхивая периодически его таблицы... особенно по части "SMI Command Port address"
    Как я потом дочитался вкуривая PDF на чипсетину 0x402F и оказался тем самым "SMI Command Port address" VIA производителя. Маны, блин рулят, но сучары буржуйские не дают порой. ТОкма iNtelу РеспектУха!!! :)
     
  2. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    В ACPI этот порт используется для посылки команд включения/выключения ACPI, а команда выключения компьютера передается уже через порты ACPI. Хотя конечно может существовать короткая команда выключения компьютера, направляемая
    в командный порт SMI, но она будет являться недокументированной.
     
  3. lsvmo

    lsvmo New Member

    Публикаций:
    0
    Регистрация:
    21 апр 2008
    Сообщения:
    12
    Ребята, помогите разобраться. Может кто копался с AML кодом.
    Смущает вот что. Касательно _S5_.

    В нормальной записи
    5F 53 35 5F 12 0A 04 0A 05 0A 05 0A 05 0A 05 ----- _S5_...........

    всё понятно, что это
    Name (_S5, Package (0x04)
    {
    0x05,
    0x05,
    0x05,
    0x05
    })

    Есть вот такая запись
    5F 53 35 5F 12 07 04 0A 07 00 00 00 14 42 04 ----- _S5_.........B.

    КАК из неё получилось

    Name (_S5, Package (0x04)
    {
    0x07,
    Zero,
    Zero,
    Zero
    })

    Что означает 07, идущая за 12 - опкодом Package?

    Для получения ASL кода использовал iASL от Intel.
     
  4. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    У меня под рукой нет никакой документации, но понятно, что это как раз и есть длина пакета.
     
  5. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    14 42 04 не относятся к пакету. 00 - опкод Zero.
     
  6. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    linux-2.6.24\drivers\acpi\parser\ :)
     
  7. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    На вопрос "Как получилось?" ответить не сложно. Лучше скажи, как получилось, что в приведенном дампе отсутствует опкод Name.
     
  8. lsvmo

    lsvmo New Member

    Публикаций:
    0
    Регистрация:
    21 апр 2008
    Сообщения:
    12
    Снова ничего не понимаю...
    На одном из компов встретилась такая конструкция:
    5F 53 35 5F 12 06 02 0A 00 0A 07 _S5_.......

    Получается, что
    PM1a_SLP_TYP = 0x00
    PM1b_SLP_TYP = 0x07

    iasl показывает тоже самое.

    Но выключение компа не работает.

    Если же сделать PM1a_SLP_TYP равным 0x07, то всё замечательно выключается.
    Скажите, есть такое правило, что если ноль, то надо делать
    PM1a_SLP_TYP = PM1b_SLP_TYP ???
     
  9. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Прежде всего какой-то странный пакет. Не понятно, куда делить два резервных байта. Есть правило писать SLP_TYPa в PM1a_CNT, а SLP_TYPb в PM1b_CNT. Пропускать запись нужно только тогда, когда PM1x_CNT_BLK равно нулю. Если запись SLP_TYPb в PM1b_CNT делает свое дело, то так и должно быть.
     
  10. lsvmo

    lsvmo New Member

    Публикаций:
    0
    Регистрация:
    21 апр 2008
    Сообщения:
    12
    В том то и дело , что не делает.
    Если писать в оба регистра 0х07, то выключение срабатывает.

    По поводу резервных байт согласен.
    Ещё интересно, что обычно пустое значение кодируется как ноль (цифра 0 ), а тут нормально закодированное значение "ноль", то есть не пустое, а нулевое.

    P.S.
    Может имеет значение, что это таблица по стандарту ACPI 1.0 ?
    У Windows всё выключается, но она, ..., хитрая. Может писать подряд общепринятые значения 0х05 или 0х07 (для универсальности). Какое-нибудь, да сработает.
     
  11. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Вообще по спецификации нужно еще выполнять дополнительные методы. Но я конечно не призываю тебя декодировать код на AML. Может, просто не включен режим ACPI. Или этот пакет вообще не для объекта _S5.
    Это мелочь. Никто и не гарантирует, что нулевое значение должно кодироваться опкодом Zero.
     
  12. Subrealist

    Subrealist Member

    Публикаций:
    0
    Регистрация:
    17 июл 2006
    Сообщения:
    134
    Подскажите, зачем в примере у _BC_ обнуляются _EN регистры.
     
  13. lsvmo

    lsvmo New Member

    Публикаций:
    0
    Регистрация:
    21 апр 2008
    Сообщения:
    12
    Вопрос в десятку!
    Мне тоже будет интересно это узнать.

    Как я считаю, это из пункта 4.7.3.1.2 из спецификации ACPI 4.0 :
    Но также буду рад разъяснениям.