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

Discussion in 'WASM.OS.DEVEL' started by T_A_M_A_R_A, Jul 24, 2007.

  1. VaStaNi

    VaStaNi Member

    Blog Posts:
    0
    Joined:
    Jun 1, 2004
    Messages:
    203
    Location:
    Ukraine
    Самое короткое выключение машинки VIA686 чипсета у меня было так, например:
    Code (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

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

    lsvmo New Member

    Blog Posts:
    0
    Joined:
    Apr 21, 2008
    Messages:
    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

    Blog Posts:
    0
    Joined:
    Jun 6, 2007
    Messages:
    820
    У меня под рукой нет никакой документации, но понятно, что это как раз и есть длина пакета.
     
  5. Phantom_84

    Phantom_84 New Member

    Blog Posts:
    0
    Joined:
    Jun 6, 2007
    Messages:
    820
    14 42 04 не относятся к пакету. 00 - опкод Zero.
     
  6. n0name

    n0name New Member

    Blog Posts:
    0
    Joined:
    Jun 5, 2004
    Messages:
    4,336
    Location:
    Russia
    linux-2.6.24\drivers\acpi\parser\ :)
     
  7. Phantom_84

    Phantom_84 New Member

    Blog Posts:
    0
    Joined:
    Jun 6, 2007
    Messages:
    820
    На вопрос "Как получилось?" ответить не сложно. Лучше скажи, как получилось, что в приведенном дампе отсутствует опкод Name.
     
  8. lsvmo

    lsvmo New Member

    Blog Posts:
    0
    Joined:
    Apr 21, 2008
    Messages:
    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

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

    lsvmo New Member

    Blog Posts:
    0
    Joined:
    Apr 21, 2008
    Messages:
    12
    В том то и дело , что не делает.
    Если писать в оба регистра 0х07, то выключение срабатывает.

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

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

    Phantom_84 New Member

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

    Subrealist Member

    Blog Posts:
    0
    Joined:
    Jul 17, 2006
    Messages:
    134
    Подскажите, зачем в примере у _BC_ обнуляются _EN регистры.
     
  13. lsvmo

    lsvmo New Member

    Blog Posts:
    0
    Joined:
    Apr 21, 2008
    Messages:
    12
    Вопрос в десятку!
    Мне тоже будет интересно это узнать.

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