Готовы для десктопа

Dec 10, 2014 23:33

Сколько программистов нужно чтобы зажечь лампочку на capslock?

Без шуток - я вот был не в теме, железкам со времен синклера порты не щекотал. Почитал про ACPI и ОХУЕЛ БЛЯДЬ НАХУЙ СУКА КАКОЙ ПИЗДЕЦ.

Оригинал взят у nponeccop в Готовы для десктопа
Решил я тут разобраться с разными лампочками и кнопочками на нетбуке, раз уж со сном порешилось.

Оказывается, в Линуксе пилят свой WMI-стек. Производители виндовых ноутбуков срут в винду через ACPI SCI всякими евентами от кнопок и устройств, а винда эти евенты (не все но почти все) умеет обрабатывать стандартными своими драйверами.

А линукс в дремучие времена 2.6 не умел вообще никак, и там придумали некий первый вариант с sparse_keymap, который срал в юзерспейс всякими меджик намберами, которые проходили через acpid в хуки - скрипты на баше, дешифрущие наборы циферок в коллбеки. А в коллбеках уж юзер что хочет то и делает. И иногда даже не сам а какие-то готовые скрипты конфигурит.

Теперь же роль виндовых драйверов исполняют - вы не поверите - драйвера. Например, кнопки яркости судя по всему (мне лень было проверять до конца) обрабабывает драйвер видеокарты и от юзермода ничего не требуется. События от кнопок питания обрабатывает заведующий питанием systemd. События от кнопки отключения вайфая - rfkill. А события от кнопок громкости, судя по всему, Х11. Т.е. acpid нужен (как и в винде) только для тех нескольких нестандартных функций или для дополнительной обработки стандартных (например рисовать нотификации или иной гуй). Более того, из 20 меджик намберов осталось 3, а остальные стандартизировались в человекочитаемые имена, и понятие монструозного распознавателя кодов спецкнопок 100500 моделей буков постепенно уходит в прошлое.

Ну это по кнопочкам. По лампочкам же ситуация похуже. Есть специальный класс устройств - лампочки. Но драйвера лампочек какие-то дебильные, неполные и захардкожены в другие дрова. У меня лампочек много, специально загрузился в винде проверил что все работают (притом что я юзермод блоатвари никакой не ставил от производителя ноута). А на линуксе не работает даже капслок.

Драйверов лампочек оказалось два - один в беспроводной сетевухе (логично), но там он никак не включается. Почему не включается - непонятно, люди на каком-то отличном от моего железе умудрялись им программно мигать записывая какие-то странные битики совсем в другое место.

Второй почти нормальный - только а) инвертированный (0 включен 1 выключен) б) зашит в старую версию дров и в новых отсутствует.

В качестве оправдания линуксоидам сойдет следующий факт. ACPI BIOS написан вендорами через жопу. Если его раскомпилить (он в специальном неполном ДСЛ в виде байткода) а потом пытаться скомпилить обратно - то ничего не выходит, поскольку в 100500 мест нарушен стандарт. Вот линуксоиды сначала пытались делать, чтобы ядро само патчило этот байткод при загрузке и исправляло косяки, но в конце концов пришли к майкрософтовскому подходу - ебошить адхок хаки чтобы запускалось на любом имеющимся в дикой природе кривом фирмваре.

Да, и пилят открытый биос. Но основная проблема с написанием опенсорсного биоса в том же месте. Эти события на материнке генерирует какой-нибудь хилый микроконтроллер со своим собственным фирмварей, и они оба совершенно нестандартные. Доходит до того, что вместо того чтобы пытаться работать с контроллером так же, как работает закрытый биос, пишут прошивку к этому контроллеру. Благо даташиты бывает что есть, а документации на внутриматеринский высокоуровневый протокол между двумя чипами у вендоров не бывает.
Previous post Next post
Up