Board.KolibriOS.org

Официальный форум KolibriOS
Текущее время: Вт ноя 21, 2017 4:49 pm

Часовой пояс: UTC+03:00




Начать новую тему  Ответить на тему  [ 40 сообщений ]  На страницу Пред. 1 2 3
Автор Сообщение
 Заголовок сообщения: Re: Выключение ПК.
СообщениеДобавлено: Пн окт 17, 2011 1:38 pm 
Не в сети
Kernel Developer
Аватара пользователя

Зарегистрирован: Чт сен 03, 2009 1:52 pm
Сообщения: 1600
diamond'а нет, так что отвечать, видимо, придётся мне. В первых версиях ACPI регистр PM1a_CNT_BLK обязан был находиться в I/O пространстве, и на это рассчитывает код diamond'а, сейчас соответствующее поле в FADT всё ещё существует, но "is superseded by the X_PM1a_CNT_BLK field" в том же FADT; новое поле X_PM1a_CNT_BLK - уже стандартная для ACPI структура, умеющая описывать ресурсы в разнообразных пространствах, включая IO и MMIO.

Так всё-таки, где дамп FADT? В Linux его можно взять в /proc/acpi/fadt, в Windows - HKLM\HARDWARE\ACPI\FADT.

_________________
Сделаем мир лучше!


Вернуться к началу
 Заголовок сообщения: Re: Выключение ПК.
СообщениеДобавлено: Пн окт 17, 2011 1:47 pm 
Не в сети
Kernel Developer
Аватара пользователя

Зарегистрирован: Пт авг 14, 2009 1:46 am
Сообщения: 1291
Нет у меня на E350 ни линукса, ни винды. И поставить пока не могу (встроенный он, долго отвинчивать).
Подскажите как эти таблицы из Колибри выцарапать -- где они лежат?


Вернуться к началу
 Заголовок сообщения: Re: Выключение ПК.
СообщениеДобавлено: Пн окт 17, 2011 2:18 pm 
Не в сети
Kernel Developer
Аватара пользователя

Зарегистрирован: Чт сен 03, 2009 1:52 pm
Сообщения: 1600
art_zh, если охота писать код на ассемблере, то берёшь код из kernel.asm между комментариями "scan for RSDP" и "ebx is linear address of FADT" и получаешь линейный адрес в ebx, размер в dword[ebx+4]. Если охота возиться с С, то Serge прокомментирует по acpica лучше меня.

_________________
Сделаем мир лучше!


Вернуться к началу
 Заголовок сообщения: Re: Выключение ПК.
СообщениеДобавлено: Пн окт 17, 2011 3:37 pm 
Не в сети
Kernel Developer

Зарегистрирован: Ср мар 08, 2006 6:25 pm
Сообщения: 3929
AcpiGbl_FADT локальная копия FADT в ACPICA. Или воспользоваться drivers/devman/acpinfo. Таблица находится аналогично MADT. Переменная ядра acpi_rsdt_base хранит физический адрес RSDT. В исходниках L4:Ka есть вывод FADT.
Спойлер: Показать
Код:
typedef struct __attribute__((packed))
{
    u32_t           sig;
    u32_t           len;
    u8_t            rev;
    u8_t            csum;
    char            oem_id[ACPI_OEM_ID_SIZE];
    char            oem_tid[ACPI_OEM_TABLE_ID_SIZE];
    u32_t           oem_rev;
    u32_t           creator_id;
    u32_t           creator_rev;
}acpi_thead_t;

typedef struct __attribute__((packed)){
    acpi_thead_t    Header;             /* Common ACPI table header */
    u32_t           Facs;               /* 32-bit physical address of FACS */
    u32_t           Dsdt;               /* 32-bit physical address of DSDT */
    u8_t            Model;              /* System Interrupt Model (ACPI 1.0) - not used in ACPI 2.0+ */
    u8_t            PreferredProfile;   /* Conveys preferred power management profile to OSPM. */
    u16_t           SciInterrupt;       /* System vector of SCI interrupt */
    u32_t           SmiCommand;         /* 32-bit Port address of SMI command port */
    u8_t            AcpiEnable;         /* Value to write to smi_cmd to enable ACPI */
    u8_t            AcpiDisable;        /* Value to write to smi_cmd to disable ACPI */
    u8_t            S4BiosRequest;      /* Value to write to SMI CMD to enter S4BIOS state */
    u8_t            PstateControl;      /* Processor performance state control*/
    u32_t           Pm1aEventBlock;     /* 32-bit Port address of Power Mgt 1a Event Reg Blk */
    u32_t           Pm1bEventBlock;     /* 32-bit Port address of Power Mgt 1b Event Reg Blk */
    u32_t           Pm1aControlBlock;   /* 32-bit Port address of Power Mgt 1a Control Reg Blk */
    u32_t           Pm1bControlBlock;   /* 32-bit Port address of Power Mgt 1b Control Reg Blk */
    u32_t           Pm2ControlBlock;    /* 32-bit Port address of Power Mgt 2 Control Reg Blk */
    u32_t           PmTimerBlock;       /* 32-bit Port address of Power Mgt Timer Ctrl Reg Blk */
    u32_t           Gpe0Block;          /* 32-bit Port address of General Purpose Event 0 Reg Blk */
    u32_t           Gpe1Block;          /* 32-bit Port address of General Purpose Event 1 Reg Blk */
    u8_t            Pm1EventLength;     /* Byte Length of ports at Pm1xEventBlock */
    u8_t            Pm1ControlLength;   /* Byte Length of ports at Pm1xControlBlock */
    u8_t            Pm2ControlLength;   /* Byte Length of ports at Pm2ControlBlock */
    u8_t            PmTimerLength;      /* Byte Length of ports at PmTimerBlock */
    u8_t            Gpe0BlockLength;    /* Byte Length of ports at Gpe0Block */
    u8_t            Gpe1BlockLength;    /* Byte Length of ports at Gpe1Block */
    u8_t            Gpe1Base;           /* Offset in GPE number space where GPE1 events start */
    u8_t            CstControl;         /* Support for the _CST object and C States change notification */
    u16_t           C2Latency;          /* Worst case HW latency to enter/exit C2 state */
    u16_t           C3Latency;          /* Worst case HW latency to enter/exit C3 state */
    u16_t           FlushSize;          /* Processor's memory cache line width, in bytes */
    u16_t           FlushStride;        /* Number of flush strides that need to be read */
    u8_t            DutyOffset;         /* Processor duty cycle index in processor's P_CNT reg*/
    u8_t            DutyWidth;          /* Processor duty cycle value bit width in P_CNT register.*/
    u8_t            DayAlarm;           /* Index to day-of-month alarm in RTC CMOS RAM */
    u8_t            MonthAlarm;         /* Index to month-of-year alarm in RTC CMOS RAM */
    u8_t            Century;            /* Index to century in RTC CMOS RAM */
    u16_t           BootFlags;          /* IA-PC Boot Architecture Flags. See Table 5-10 for description */
    u8_t            Reserved;           /* Reserved, must be zero */
    u32_t           Flags;              /* Miscellaneous flag bits (see below for individual flags) */
    acpi_address_t  ResetRegister;      /* 64-bit address of the Reset register */
    u8_t            ResetValue;         /* Value to write to the ResetRegister port to reset the system */
    u8_t            Reserved4[3];       /* Reserved, must be zero */
    u64_t           XFacs;              /* 64-bit physical address of FACS */
    u64_t           XDsdt;              /* 64-bit physical address of DSDT */
    acpi_address_t  XPm1aEventBlock;    /* 64-bit Extended Power Mgt 1a Event Reg Blk address */
    acpi_address_t  XPm1bEventBlock;    /* 64-bit Extended Power Mgt 1b Event Reg Blk address */
    acpi_address_t  XPm1aControlBlock;  /* 64-bit Extended Power Mgt 1a Control Reg Blk address */
    acpi_address_t  XPm1bControlBlock;  /* 64-bit Extended Power Mgt 1b Control Reg Blk address */
    acpi_address_t  XPm2ControlBlock;   /* 64-bit Extended Power Mgt 2 Control Reg Blk address */
    acpi_address_t  XPmTimerBlock;      /* 64-bit Extended Power Mgt Timer Ctrl Reg Blk address */
    acpi_address_t  XGpe0Block;         /* 64-bit Extended General Purpose Event 0 Reg Blk address */
    acpi_address_t  XGpe1Block;         /* 64-bit Extended General Purpose Event 1 Reg Blk address */
} acpi_fadt_t;

static void dump_fadt(acpi_fadt_t *fadt)
{

    printf("FACS base: %x DSDT base: %x\n", fadt->Facs, fadt->Dsdt);

    u8_t p = fadt->PreferredProfile;
    printf("PreferredProfile: %s\n" ,
            p == 0 ? "Unspecified"  :
            p == 1 ? "Desktop"      :
            p == 2 ? "Mobile"       :
            p == 3 ? "Workstation"  :
            p == 4 ? "Enterprise Server" :
            p == 5 ? "SOHO Server"  :
            p == 6 ? "Appliance PC" : "Unknown");

    printf("SciInterrupt:   %d\n"
           "SmiCommand:     %x\n"
           "AcpiEnable:     %x\n"
           "AcpiDisable:    %x\n"
           "S4BiosRequest:  %x\n"
           "PstateControl:  %x\n"
           "Pm1aEventBlock: %x\n"
           "Pm1bEventBlock: %x\n\n",
           fadt->SciInterrupt,
           fadt->SmiCommand,
           fadt->AcpiDisable,
           fadt->S4BiosRequest,
           fadt->PstateControl,
           fadt->Pm1aEventBlock,
           fadt->Pm1bEventBlock);
};

        fadt = (acpi_fadt_t*)rsdt_find(rsdt, 0x50434146);


Вернуться к началу
 Заголовок сообщения: Re: Выключение ПК.
СообщениеДобавлено: Вс окт 23, 2011 9:26 pm 
Не в сети
Kernel Developer
Аватара пользователя

Зарегистрирован: Пт авг 14, 2009 1:46 am
Сообщения: 1291
CleverMouse писал(а):
Так всё-таки, где дамп FADT? В Linux его можно взять в /proc/acpi/fadt, в Windows - HKLM\HARDWARE\ACPI\FADT.

Поставил на Е350 SuSe 11.4, в /proc вообще не оказалось подкаталога acpi :shock: .
Включил в GRUB опцию acpi=on, чтоб без вопросов -- то же самое.
Прилагаю /var/log/boot.msg, может там есть что-то полезное.

Дамп из-под Колибри пока не доделал, хронический цейтнот...


Вложения:
boot.7z [11.51 КБ]
108 скачиваний

_________________
Узкий специалист подобен флюсу: полнота его - односторонняя.
Козьма Прутков
Вернуться к началу
 Заголовок сообщения: Re: Выключение ПК.
СообщениеДобавлено: Пн окт 24, 2011 1:48 pm 
Не в сети
Kernel Developer
Аватара пользователя

Зарегистрирован: Чт сен 03, 2009 1:52 pm
Сообщения: 1600
Ох уж эти линуксы, вечно чего-нибудь меняют. Из лога видно только, что FADT находится по адресу 6fce38b0h и имеет длину 0F4h, а DSDT - 6fcde150h и имеет длину 575fh. Можно сдампить через dd if=/dev/mem of=fadt bs=1 skip=$((0x6fce38b0)) count=$((0xf4)), если, конечно, там и /dev/mem заодно не отменили, а ОС не потопталась по памяти из-под таблиц. Заодно уж и DSDT тогда можно сдампить, dd if=/dev/mem of=dsdt bs=1 skip=$((0x6fcde150)) count=$((0x575f)).

_________________
Сделаем мир лучше!


Вернуться к началу
 Заголовок сообщения: Re: Выключение ПК.
СообщениеДобавлено: Пн окт 24, 2011 10:52 pm 
Не в сети
Аватара пользователя

Зарегистрирован: Вт авг 25, 2009 4:45 pm
Сообщения: 788
можно проще, через acpidump - сдампить те таблицы, которые надо указать.


Вернуться к началу
 Заголовок сообщения: Re: Выключение ПК.
СообщениеДобавлено: Чт окт 27, 2011 12:33 pm 
Не в сети
Kernel Developer
Аватара пользователя

Зарегистрирован: Пт авг 14, 2009 1:46 am
Сообщения: 1291
Спасибо XVilka, через acpidump прошло (а через /dev/mem - нет).


Вложения:
dumpacpi.7z [30.39 КБ]
121 скачивание

_________________
Узкий специалист подобен флюсу: полнота его - односторонняя.
Козьма Прутков
Вернуться к началу
 Заголовок сообщения: Re: Выключение ПК.
СообщениеДобавлено: Пн ноя 07, 2011 4:01 pm 
Не в сети
Kernel Developer
Аватара пользователя

Зарегистрирован: Чт сен 03, 2009 1:52 pm
Сообщения: 1600
Таблицы выглядят нормально. После подстановки констант код выключения по идее разворачивается в
Код:
; enter SCI mode
        mov     al, 0A0h
        out     0B2h, al
        mov     edx, 804h
@@:
        in      ax, dx
        test    al, 1
        jz      @b
; power off
        mov     edx, 804h
        in      ax, dx
        and     ax, 203h
        or      ah, 34h
        out     dx, ax
        jmp     $

Если запустить прямо такой код, он выключит машину, зависнет в первом цикле или зависнет на jmp $?

_________________
Сделаем мир лучше!


Вернуться к началу
 Заголовок сообщения: Re: Выключение ПК.
СообщениеДобавлено: Пт фев 03, 2012 1:11 am 
Не в сети
Kernel Developer
Аватара пользователя

Зарегистрирован: Пт авг 14, 2009 1:46 am
Сообщения: 1291
Миль пардон, только сегодня увидел Ваш вопрос, набил ради интереса этот код и прогнал на реальном железе в Колибри-А (там in/out работает в юзермоде с любыми портами).

Машина зависла наглухо, но без отключки. Просто умерла с включенным экраном.
Когда решил оттрассировать по шагам в MTBEBUGе - машина совершенно правильно выключилась (с полной остановкой всего) на предпоследней команде, не доходя до jmp $ .
Выход из цикла произошёл на самом первом прогоне (ax == 0х0001)

Да, но я вообще-то не за этим сюда зашёл.

Я тут в последнее время изучаю (в жестко- :twisted:извращённой форме) несчастный Acer ao522. В целом - очень неплохая машинка, не сравнить со снулыми атомами. Колибри на ней завелась с пол-оборота, ATIшный драйвер работает изумительно (спасибо, Serge!), клавиатура и тачпад - в полном порядке. Только три минуса -

-1) USB-устройства (даже загрузочные флешки) не распознаются BIOSом ни при каких настройках. Чтобы загрузиться, приходится лезть в потроха, вытаскивать лицензионный NTFS-жд и ставить туда что-нибудь православное;

-2) сеть еще долго будет ждать своего драйвера; ну и наконец

-3) не выключается, зараза! - причем не только ACPI-отключка не пашет, но даже и мой "прямой" рубильник. Выпинывает на PEREGRUZKy

да и еще вот инфа по сабжу :
Цитата:
говорят, обращение к отдельным портам, а также и ACPI-регистрам, может быть оформлено на IO_TRAP с автоматической генерацией SMI.

если это так, то все равно что есть ACPI-подсистема, что ее нет - нужен будет свой драйвер PM под конкретную невыключаемую платформу...


Вернуться к началу
Показать сообщения за:  Поле сортировки  
Начать новую тему  Ответить на тему  [ 40 сообщений ]  На страницу Пред. 1 2 3

Часовой пояс: UTC+03:00


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Limited
Русская поддержка phpBB