Содержание
- За что отвечает ACPI драйвер, и как его удалить ?
- Неизвестное устройство ACPI/ASUS9001 в ноутбуке Asus TUF Gaming FX706IH
- Настройка оборудования на раннем этапе загрузки средствами ACPI (на примере FreeBSD)
- Плохо гуглил
- За дело
- Почему не стоит обновлять драйвера!
- ACPI

Поглядим, какие у нас есть средства отладки и вывода инфы в рамках интерпретатора («виртуальной машины») ACPI. В спецификации ACPI (параграф 19.5.25, с. 733) упоминается особый объект Debug , который операционная система должна «донести» до юзера. Во FreeBSD за это отвечает системная переменная debug.acpi.enable_debug_objects , которую необходимо выставить в единицу:
За что отвечает ACPI драйвер, и как его удалить ?
Промышленный эталон управления питанием компьютера и его устройствами при помощи ОС был нужен технологии как воздух, ведь неизменные конфликты операционной системы и оборудования мешали разработке и того, и другого. BIOS никак не мог угодить операционке, она — ему. Каждый желал изменять устройства по-своему. Представляете, что бы было, если б не существовал ACPI при сегодняшнем обилии разных гаджетов? Даже помыслить страшно. Именно поэтому ведущими IT-компаниями было принято решение отделить «софт от харда» и разработать системную архитектуру, которая брала бы на себя всю тяжесть общения с BIOS’ом. Заодно разработчики не забыли об энергопотреблении, поэтому ACPI еще был должен управлять питанием.
1 декабря 1996 года консорциум, состоящий из Hewlett-Packard Corporation, Intel Corporation, Microsoft Corporation, Phoenix Technologies Ltd. и Toshiba Corporation, объявил о завершении работы над новым стандартом — ACPI, что расшифровывается как Advanced Configuration and Power Interface, или расширенный интерфейс конфигурирования и управления питанием компьютера. ACPI состоял из множества составляющих, главной из которых был специальный участок кода BIOS, обеспечивающий поддержку компьютером новой архитектуры. Другими словами со старым оборудованием новый стандарт был несовместим.
Разумеется, это повлекло за собой обновление парка компьютеров. Как это обычно делается, мы с вами, уважаемые читатели, очень хорошо знаем. За примером даже ходить далеко не нужно — достаточно вспомнить историю с PCI-E. Правда, парк компьютеров еще не полностью обновился, ведь апгрейд обходится достаточно дорого. Но, как ни крути, плата без PCI-E уже считается устаревшей.
С ACPI было точно так же, только польза от него не так сомнительна. Скорее даже наоборот, ведь вместе с ACPI пришел APIC, а это значит, что одно прерывание теперь могло использоваться несколькими устройствами! Для тех пор это была настоящая сенсация. Первым процессором с поддержкой ACPI можно считать самый ранний Celeron, однако поддержка нового интерфейса была реализована настолько криво, что эту функцию приходилось отключать.
Важно также отметить, что ACPI окончательно вытеснил Plug and Play и, по словам создателей, «обеспечил использование существующих интерфейсных разъемов более безопасным и потенциально более эффективным способом». Помимо участка кода BIOS, в состав ACPI также входила улучшенная схема управления питанием (Advanced Power Management), прикладной программный интерфейс (API), специальный машинный язык (ACPI Machine Language) и еще некоторые полезные вещи. Появился новый термин — OS Power Management, где ACPI, разумеется, отводилась главная роль.
Олег БерсеркерМастер (1018) 5 годов назад
Ты мог просто ссылку дать на Вики?
Остальные ответы
ACPI расшифровывается как Advanced Configuration and Power Interface — расширенный интерфейс конфигурирования компьютера и управления питанием. ACPI — та основа, вокруг которого построен, по идее, любой современный компьютер на аппаратном уровне. В системе с ACPI именно этот свод стандартов и правил используется для конфигурирования и работы аппаратных средств — например, для назначения прерываний и ресурсов устройствам на современных шинах (PCI и AGP), для получения информации о работе устройств, для работы дополнительных «энергосберегающих» кнопок и датчиков, или, например, для получения данных об оставшейся в аккумуляторах энергии
Неизвестное устройство ACPI/ASUS9001 в ноутбуке Asus TUF Gaming FX706IH
переставляй Windows.
Это ЯДРО, без него много чего не пашет правильно.
Юрий ХаринУченик (72) 5 годов назад
Это не ядро
Это устройство Intel Smart Connect.
Вы можете отключить Intel Smart Connect в настройках BIOS или установить драйвер Intel Smart Connect, затем перезагрузить систему.
Настройка оборудования на раннем этапе загрузки средствами ACPI (на примере FreeBSD)
Пару лет назад, когда CardBus и FireWire (IEEE 1394) еще были относительно «в ходу», многие производители ноутбуков в своей продукции использовали контроллеры семейства PCIXX21 и PCIXX11 фирмы Texas Instruments: один небольшой чип обеспечивал поддержку не только лишь упомянутых интерфейсов, да и многих популярных стандартов сменных карт памяти.
Такой чип (а именно, PCI7411) стоит и в моей NEC Versa S950. Этот малоизвестный ноутбук я в свое время предпочел даже ThinkPad-серии практически исключительно из-за более лучшей поддержки FreeBSD (оборудования в целом и спящего режима а именно) — специально тестировал в новосибирском Техносити перед покупкой. Долгое время я не пользовался встроенным кард-ридером, по привычке обходясь USB’шными «свистками». Но недавно я обнаружил, что FreeBSD до сего времени его не поддерживает.
И если лет пять-шесть назад это можно было объяснить отсутствием нормального драйвера для этих контроллеров (нужно было что-то скачивать и собирать самому), то теперь я точно знал, что они «из коробки» поддерживаются во FreeBSD драйвером sdhci(4) , о чем прямо сказано на странице руководства (и позже подтвердилось чтением исходников).
Я начал неспешно гуглить на данную тему, и картина стала вырисовываться невеселая. Оказалось, что таких «счастливчиков», как я, немало. Многие постили в рассылки и форумы «портянки» dmesg и pciconf -lv , заводили баги в трекерах (например, OpenBSD PR i386/5843), но решения никто не предлагал. Более того, фактически поставив точку в вопросе, Александр Мотин, автор драйвера sdhci(4) , в 2010 г. написал на форуме, что-де TI документацию на чип не дают, а значит, если производитель сконфигурировал чип неверно, а его настройка через BIOS не предусмотрена, сделать что-либо затруднительно. В свою очередь, Theo de Raadt закрыл i386/5843 со словами: «We do what we can. This vendor, amongst other, have their sdhc controllers locked out and hidden behind little undocumented bits.
We’ve strugged before to find this information, and failed. If you can find this information on some other operating system, or in some vendor documentation, we would be thrilled.»
В отчаянии я загрузился с Ubuntu LiveCD. И очень удивился тому, что в Linux кард-ридер работает. Значит…
Плохо гуглил
Оказывается, еще в 2006 г. Алекс Дубов написал Linux-драйвер для TI FlashMedia ридеров. Я скачал исходники и принялся их изучать, надеясь впоследствии доработать sdhci(4) или даже спортировать драйвер целиком. Сначала я посмотрел список поддерживаемых PCI vendor/device ids, чтобы сравнить с «нашим» драйвером. Он оказался небольшим:
$ cat linux/pci_ids.h #define PCI_VENDOR_ID_TI 0x104c #define PCI_DEVICE_ID_TI_XX21_XX11_FM 0x8033 #define PCI_DEVICE_ID_TI_XX12_FM 0x803b #define PCI_DEVICE_ID_TI_XX20_FM 0xac8f
Число 0x8033 мне уже знакомо по выводу pciconf -lv на моем ноуте (chip=0x8033104c):
none3@pci0:6:7:3: class=0x018000 card=0x83191033 chip=0x8033104c rev=0x00 hdr=0x00 vendor = 'Texas Instruments (TI)' device = 'PCIxx11/21 Integrated FlashMedia Controller' storage

Это тот кард-ридер, который не работает во FreeBSD, но работает в Linux. А вот кусок кода из sdhci.c (FreeBSD):
static const struct sdhci_device < uint32_t model; uint16_t subvendor; char *desc; u_int quirks; >sdhci_devices[] = < < 0x08221180, 0xffff, "RICOH R5C822 SD", SDHCI_QUIRK_FORCE_DMA >, < 0xe8221180, 0xffff, "RICOH SD", SDHCI_QUIRK_FORCE_DMA >, < 0xe8231180, 0xffff, "RICOH R5CE823 SD", SDHCI_QUIRK_LOWER_FREQUENCY >, < 0x8034104c, 0xffff, "TI XX21/XX11 SD", SDHCI_QUIRK_FORCE_DMA >,
Можно заметить, что идентификатор устройства TI XX21/XX11 SD (0x803 4 104c) похож на мой (0x803 3 104c) с точностью до одной цифры. Кроме того, я обратил внимание, что контроллеры CardBus (0x8031104c) и FireWire (0x8032104c) не просто имеют схожие id’шки, но и PCI-селекторы всех устройств отличаются только номером функции, а устройство у них у всех одно и то же:
none1@pci0:6:7:0: class=0x060700 card=0x83191033 chip=0x8031104c rev=0x00 hdr=0x02 vendor = 'Texas Instruments (TI)' device = 'PCIxx21/x515 Cardbus Controller' subclass = PCI-CardBus none2@pci0:6:7:2: class=0x0c0010 card=0x83191033 chip=0x8032104c rev=0x00 hdr=0x00 vendor = 'Texas Instruments (TI)' device = 'OHCI Compliant IEEE-1394 FireWire Controller' bus subclass = FireWire
Вспомнив слова Саши Мотина о том, что чип на самом деле реализует оба контроллера (SDHCI и FlashMedia), я стал искать более целенаправленно, и вскоре наткнулся на еще один пост, а затем на сообщение в рассылке freebsd-mobile@ о похожей (но немного другой) проблеме на HP NC6220. Рабочее решение нигде не предлагалось, но, в отличие от большинства дискуссий, которые сводились к дурацким советам типа «попробуйте последнюю версию драйвера» или банальным «сожалею, но, похоже, вы в пролете», теперь, по крайней мере, стало понятно, что конфигурация чипа как-то отображается в дампе PCI function (а значит, возможно, ее получится поменять), а главное, что таки-доступна документация: PCIXXX21/PCIXXX11 Implementation Guide. И вот тут мне стало по-настоящему интересно.
Забегая вперед, скажу, что удивительнее всего то, что люди, раскопав практически datasheet на «капризный» чип, останавливались в шаге от решения проблемы. Я так и не нашел ни у кого рецепта, как правильно воспользоваться документацией (что и побудило меня написать этот пост). Но обо всем по порядку.
PCIXXX21/PCIXXX11 Implementation Guide — документ о 117 страницах для проектировщиков аппаратуры на базе этих контроллеров. Подробно его разбирать смысла не имеет; самое важное, что я из него почерпнул: контроллер действительно реализует пять функций: CardBus, 1394, FlashMedia, SD Host и SmartCard; начальная конфигурация обычно берется из EEPROM. Главный регистр конфигурации — General Control Register (раздел 12.4.28, с. 65) — находится по адресам 1Eh-1Fh в ROM (нас интересует только нулевой байт, т.к. именно там маскируются функции чипа) и соотвествует PCI offset 86h нулевой функции устройства. Теперь —
За дело
Для начала посмотрим, что нам скажет утилита pciconf(8) про PCI configuration space «головной» (нулевой) функции чипа, т.е., в терминологии FreeBSD, селектора pci0:6:7:0 . Ради краткости я не буду приводить дамп всех 256 байт, а ограничусь лишь интересующим нас, по смещению 86h:
Почему не стоит обновлять драйвера!
# pciconf -rb pci0:6:7:0 0x86 d3
Интересно. Смотрим в табличку на 65-й странице pdf’ки, видим, что тройка в нижнем нибле (полубайте) равна типичному значению бит, отвечающих за top level arbitration, SmartCard socket power control и OHCI 1394, это нас мало интересует. А вот верхний нибл как раз маскирует (включает-выключает) логику остальных контроллеров (таблицу целиком не привожу опять же для экономии места):

0xD это 1101, т.е. установлены биты DISABLE_SC, DISABLE_SD и DISABLE_SKTB, а бит DISABLE_FM сброшен. Следовательно, чтобы «оживить» контроллер SD Host, нам, по логике, надо сбросить DISABLE_SD (разрешить), а DISABLE_FM, напротив, выставить (запретить). Маске 1011 соответсвует значение 0xB, т.е. по сути, нам надо поменять байт 0xD3 на 0xB3. Проблема, однако, в том, что сделать это нужно сильно заранее, до того, как чип будет проинициализирован, вернее, до того, как он определит, какие контроллеры включать.
После того, как система загрузилась, менять конфигурацию бесполезно: все устройства уже «в строю». И вот тут нам на помощь приходит
ACPI
Что такое ACPI и для чего оно нужно, я объяснять не стану: это выходит за рамки топика, к тому же, на Хабре уже был хороший пост на эту тему. В данном случае нам важен вопрос: можно ли пропатчить DSDT до инициализации чипа так, чтобы он включил нужный контроллер (SD Host) и выключил ненужный, для которого у нас нет драйвера (FlashMedia).
Посмотрим, какие у нас есть средства отладки и вывода информации в рамках интерпретатора («виртуальной машины») ACPI. В спецификации ACPI (параграф 19.5.25, с. 733) упоминается специальный объект Debug , который операционная система должна «донести» до пользователя. Во FreeBSD за это отвечает системная переменная debug.acpi.enable_debug_objects , которую нужно выставить в единицу:
# sysctl debug.acpi.enable_debug_objects=1 debug.acpi.enable_debug_objects: 0 -> 1
Теперь мы можем писать произвольные строчки в Debug , а ядро FreeBSD будет выводить их на консоль. Осталось придумать, как заставить ACPI выдавать интересующую нас информацию по просьбе. Для начала сдампим и дизассемблируем DSDT ноута, и поизучаем его:
# acpidump -dt > s950.asl
Я решил найти метод, который вызывается через какое-либо внешнее воздействие (или внутреннее, но периодическое, типа опроса батарейки), при всем этом практически не затрагивая работу «железа». Изучая код DSDT, я наткнулся на любопытный кусок:
Method (_Q0C, 0, NotSerialized) < If (\_SB.PCI0.PEGA) < \_SB.PCI0.PEGP.VGA.SWIH () >Else < Store (0x01, TLST) HKDS (0x0A) >>
Больше нигде метод \_SB.PCI0.PEGP.VGA.SWIH не вызывается, а его название намекает, что это некое переключение дисплея. На клавиатуре многих ноутбуков одна из функциональных клавиш в купе с Fn-модификатором переключает видео-вывод с внутреннего дисплея на внешний. На моей «версе» это F3. Попробуем модифицировать код метода следующим образом:
Method (_Q0C, 0, NotSerialized)
Похожие статьи
-
Во время тестирования собственных конфигураций мне потребовалось отладить код в DSDT. Отладочный вывод работает с помощью команды вида Store (something,...
-
Сейчас несколько слов о том, как это все работает. Принято считать, что it система может находиться в 4 главных состояниях: ACPI ACPI (Advanced...
-
D0 – устройство работает в номинальном режиме. О безопасном сексе с ACPI 1. На оверах и на ROM.BY мне временами встречались статьи (темы в форумах) людей...