vasek |
|
Темы:
47
Сообщения:
11853
Участник с: 17 февраля 2013
|
Применение embedded controller для управления устройствами Решился на написание еще одного опуса. Слышу возмущения — опять написал ерунду, чтобы показать себя..... но я уже не в том возрасте, чтобы писать для этой цели ….. как говорится жизнь на закате и писать только ради этогого …. это несеръезно да и не перед кем мне уже заискывать.... Как то уже упоминал, что программирование не моя стихия, не мое это …. а нравился мне всегда реверсинг, но сейчас уже не до него..... а покапаться в чем то похожем хочется ….. поэтому и родилась эта статья — покапать то покапался, но подумал, что может пригодится и другим... embedded controller - дословный перевод - встроенный контроллер, предназначен для управления отдельными устройствами компьютера, наверное, точнее будет сказать для обработки отдельных ACPI-событий. Embedded Controller имеет свой BIOS, который может хранится или в отдельном чипе или входить в состав системного BIOS. В настоящее время увеличивается как количество разных типов компьютеров, так и количество операционных систем (ОС). Чисто теоретически, да и практически, просто не возможно добиться полной совместимости (в части управления устройствами/ACPI-событиями) всех существующих компьютеров и всех существующих ОС . Вот здесь то и возрастает роль embedded controller при управлении различными проблемными устройствами. И вполне возможно, что количество устройств/ACPI-событий, способных осуществлять свои функции управления посредством embedded controller будет со временем увеличиваться. В настоящее время этот перечень не велик и зависит от разработчиков — в разных типах ноутбуков этот перечень отличается. В основном это вентилятор (имеется практически во всех ноутбуках), в других ноутбуках включена функция управления подсветкой монитора и клавиатуры, включение/выключение некоторых устройств, например, Bluetooth и др. Подробное описание всех возможных функций управления embedded controller Intel приведено в документе Embedded Controller Usage in Low Power Embedded Designs Цель данной статьи чисто ознакомительная - ознакомить пользователей Archlinux с возможносью управления определенных устройств компьютера через регистры embedded controller, все будет показно на примере вентилятора (как уже упоминал, возможность управления вентилятором имеется практически во всех типах ноутбуков). В инете эту тему можно нагуглить, но в основном узконаправлено и все публикации посвящены большей частью скрипту acer_ec.pl , и как я понял идет переписывание одной статьи, но в разных вариациях. Основопологающие принципы практически отсутствуют, имеются отдельные скупые заметки и то на иностранных языках. Одним словом общей картины нет ......... а потому и решил все свести в одно место. Просто в свое время пришлось очень долго все лопатить, да и доходить до некоторых вещей самому.....а пользователю, не имеющему опыта работы с байтами, с разными системами исчисления, слабо знающему другие языки копаться во всем этом будет довольно затруднительно. Но пора и приступать к экспериментам..... Условно подход к управлению через embedded controller можно разбить на три способа — названия, конечно, не подходящие, но ничего подходящего не придумал. 1. Ручной (полностью под контролем пользователя - как говорится, все в твоих руках) 2. Полуавтоматический (практически совпадает с 1-ым способом, но для облегчения записи в регистры используется программа). 3. Автоматический (самый простой, даже не нужно загружать модуль, все за тебя продумали) 1. Ручной способ управления. EDIT - Снова изменили .... стало как и прежде zgrep CONFIG_ACPI_EC_DEBUGFS /proc/config.gz CONFIG_ACPI_EC_DEBUGFS=m Управление осуществляется через модуль ec_sys , встроенный в ядро — этот модуль позволяет осуществлять операции чтения/записи в памяти (в регистры) embedded controller. Модуль в общем то предназначен для отладки - CONFIG_ACPI_EC_DEBUGFS=m , но и для наших целей он тоже хорошо подходит. - загружаем модуль - # modprobe ec_sys - проверяем - $ lsmod | grep ec_sys ec_sys 16384 0 После загрузки модуля должна появиться директория /sys/kernel/debug/ec Но если просто загрузить модуль, без параметров, то в дальнейшем не возможно будет провести операции записи значений в регистры. За это отвечает параметр write_support, который по умолчанию равен 0$ modinfo ec_sys -p write_support:Dangerous, reboot and removal of battery may be needed. (bool) Для того чтобы можно было выполнять операции записи необходимо загрузить модуль с данным параметром, равным 1 Для начала, если модуль был загружен, выгружаем его, а потом загружаем по новой, с нужным параметром # modprobe -r ec_sys # modprobe ec_sys write_support=1 Но обращаю внимание на запись в строке parm Dangerous.... вот что пишут на этот счет ….. Но это просто предупреждение ….. просто нужно быть внимательным … но если и ошибетесь, то особо страшного ничего не произойдет.Если все выполнили правильно, то можно посмотреть таблицу значений данных, записанных в регистрах embedded controller. Эти значения хранятся в бинарном файле /sys/kernel/debug/ec/ec0/io, посмотреть эти значения удобнее следующим способом # od -Ax -t x1 /sys/kernel/debug/ec/ec0/io Значения данных в регистрах записаны в 16-ричном виде и изменяются в пределах 00 - ff (или 0 - 255 в 10-ричном исчислении). При этом чем меньше значение записанное в регистре, тем больше физическая величина реального значения контролируемого параметра (выразился непонятно, но дальше это будет понятно на примере).Обозначение регистров — в 16-ричном виде удобно определять прямо по таблице строка - столбец, …. в 10-ричной системе по порядковому номеру элемента в таблице (16 элементов в строке)......но при записи удобнее использовать номера регистров в 10-ричной системе, так как применяется команда dd. Строки и столбцы нумеруются, согласно таблице, 0, 1, 2, 3 ... d, e, f Пример. Регистры для моего вентилятора (у Вас будут другие). Как они определяются, опишу позже. 2E (46) — read 2F (47) — write В них записаны, как видно из таблицы, значения 4a (74 в 10-ричной системе исчисления). Попробуем увеличить мощность вентилятора, а точнее запишем в регистр 2F (47) значение 3a (58). Запись в регистры осуществляется следующей командой (пояснять не буду, вроде и так все понятно) # echo -n -e "\x3a" | sudo dd of="/sys/kernel/debug/ec/ec0/io" bs=1 seek=47 count=1 conv=notrunc 2> /dev/null Ждем 2-3с, слышим, что звук увеличился и проверяем значение # od -Ax -t x1 -j 47 -N 1 /sys/kernel/debug/ec/ec0/io 00002f 3a Возвращаем обратно, т.е. устанавливаем значение 4a # echo -n -e "\x4a" | sudo dd of="/sys/kernel/debug/ec/ec0/io" bs=1 seek=47 count=1 conv=notrunc 2> /dev/null Слышим, что звук притих и проверяем # od -Ax -t x1 -j 47 -N 1 /sys/kernel/debug/ec/ec0/io 00002f 4a Все работает и, как видим, ничего не попортили …. Можно, в принципе, производить запись и такой командой # printf '\x3a' | sudo dd of="/sys/kernel/debug/ec/ec0/io" bs=1 seek=47 count=1 conv=notrunc 2> /dev/null 2. Полуавтоматический способ управления. Основное отличие от 1 способа - использование готовой программы для упрощения операций чтения/записи значений регистров embedded controller . Программа работает только при наличии директории /sys/kernel/debug/ec …... т.е. загрузка модуля ec_sys с параметром write_support=1 обязательна. Пробуем ….... 1. Загружаем модуль ec_sys # modprobe ec_sys write_support=1 2. Скачиваем исходник программы ec_access.c wget ftp://ftp.suse.com/pub/people/trenn/sources/ec/ec_access.c 3. Компилируем $ gcc ~/ec_access.c -o ~/ec_access 4. Читаем таблицу значений регистров # ~/ec_access -r Как видим очень удобная таблица и видим в регистре 2F знакомое значение 4a. Кстати значение регистра по этой таблице вычислять удобнее.5. Попробуем изменить значение 4a на 3a , как это проделали в способе 1, и заметим, что это проще и все делается в 16-ричном исчислении # ~/ec_access -w 2F -v 3a Проверяем # od -Ax -t x1 -j 47 -N 1 /sys/kernel/debug/ec/ec0/io 00002f 3a 6. Возвращаем обратно и проверяем # ~/ec_access -w 2F -v 4a # od -Ax -t x1 -j 47 -N 1 /sys/kernel/debug/ec/ec0/io 00002f 4a Описания опций программы нет, но их, при желании, можно подсмотреть в исходниках. 3. Автоматический способ управления. При использовании этого способа нам не нужно знать, что существует какой то модуль ec_sys т.е. не нужно заботиться ни о загрузке этого модуля ни о том, что у него имеется параметр write_support . А поэтому раз у меня этот модуль загружен, то я его выгружу # modprobe -r ec_sys И проверим - $ lsmod | grep ec_sys ….. пусто Этот способ строится на скрипте acer_ec.pl , который специально разработали для ноутбука Acer. Насколько я понял в этом ноутбуке, используя embedded controller, можно управлять не только мощностью вентилятора, но, как пишут, и подсветкой монитора и др. К сожалению данный тип ноутбука мне при работе ни разу не попадал и сказать об этом ничего не могу. Но этот скрипт я применял и на других ноутбуках ….. этот скрипт не привязан конкретно к ноутбуку Acer …. Кстати, в инете по использованию embedded controller с применением этого скрипта, очень много информации — приводить не буду, кому интересно — найдет сам. Пробуем..... 1. Скачиваем скрипт. Откуда я его скачал, уже не помню, но нашел на GitHub , сверил с имеющимся — и разницы не нашел. 2. Читаем таблицу # perl acer_ec.pl regs Полный вывод не привожу — таблица похожа на таблицу способа 2, но значения регистров приведены в 10-ричном исчислении. Привожу часть таблицы, в которой находятся регистры вентилятора ….............. 0E ….... 0F 10 …......... 255 …..255 20 …......... 75 …....74 Замечу, что 75 — 0x4b , 74 — 0x4a 3. Пробуем изменить значение 4a на 3a , как это проделывали раньше # sudo perl acer_ec.pl := 0x2F 0x3a REG[0x2f] == 0x4a REG[0x2f] := 0x3a REG[0x2f] == 0x4a Проверяем # perl acer_ec.pl regs ….............. 0E ….... 0F 10 …......... 255 …..255 20 …......... 58 …....58 (58 — 0x3a) 4. Возвращаем все на место и проверяем # perl acer_ec.pl := 0x2F 0x4a REG[0x2f] == 0x3a REG[0x2f] := 0x4a REG[0x2f] == 0x3a # perl acer_ec.pl regs ….............. 0E ….... 0F 10 …......... 255 …..255 20 …......... 75 …....74 Ну вот отработали все 3 способа, все работоспособны, а вот какой использовать — каждый решает сам...... безусловно, 3 способ самый простой. 4. Ну и самое последнее — как же определить нужный регистр. Здесь конкретных рекомендаций нет, все зависит от ситуации и нужна смекалка. Конечно, если параметр в Linux не управляется, то нужно заниматься определением регистра в Windows. Рекомендую для этих целей неплохую программу RW-Everything. В этой программе много всяких приблуд, но выбираем EC (embedded controller), появится таблица регистров и их значений, аналогичная показанным выше. В этой таблице непрерывно меняются значения. Например, чтобы определить регистры, ответственные за события вентилятора, любой прогой, умеющей управлять мощностью вентилятора, например, NBFC - NoteBook FanControl, увеличиваем/уменьшаем эту мощность и смотрим в каких регистрах происходит изменение (изменения будут происходит и в других регистрах, но все зависит от ваших действий и наблюдательности). Ну и, конечно, неплохо подстраховаться. Рекомендую зайти на сайт и скачать FanControlConfig для своего ноутбука — этот конфиг является составной частью замечательной проги NBFC - NoteBook FanControl (имеется и для Windows и для Linux), а главное в этом конфиге указаны нужные регистры — например, для моего ноутбуках - привожу выдержки из этого конфига И как видим, это регистры 46 и 47, что в 16-ричном исчислении соответствует 2E и 2F.Хочу отметить также, что в инете ходят готовые скрипты для управления вентилятором на основе embedded controller - управлять как известно, а потому далее необходимо только привязаться к температуре (реперные точки можно выбрать самому или взять из того же FanControlConfig для нужного ноутбука). Ссылки на скрипты не даю, найти их в инете не сложно. В части подсветки монитора, если у кого входит в управление embedded controller, можно определить регистры и из Linux. Для чего - загружаем модуль # modprobe ec_sys - запускаем команду # watch od -Ax -t x1 /sys/kernel/debug/ec/ec0/io и получаем динамическую, непрерывно меняющуюся таблицу значений регистров. Подсветку можно менять в Linux практически всегда, через xrandr …. и смотрим в каком регистре меняются цифирки …. Вообщем нужен подход и определить регистр можно всегда. На этом заканчиваю …... и так написал много лишнего …. PS .... в этом топике подметили, что скаченный скрипт acer_ec.pl не работает - а потому выкладываю свой, возможно я его и менял, уже не помню. Но этот, выложенный, работает точно.
Дополнение. После применения скрипта, точнее перевода управлением куллера из автоматического режима в ручной, этот режим таковым и останется до выключения компьютера (сброс только при выключении, при reboot может не сработать). Чтобы перевести куллер снова в автоматический режим, нужно ввести соответствующее значение в соответствующий регистр. Смотреть здесь для своего ноута. Мой случай записать в регистр 2F (регистр записи) значение FF sudo perl acer_ec.pl := 0x2F 0xFF Использовал для этого информацию конфига для моего ноута, а точнее строку <FanSpeedResetValue>255</FanSpeedResetValue>
Ошибки не исчезают с опытом - они просто умнеют
|
ghost |
|
Темы:
26
Сообщения:
637
Участник с: 07 мая 2013
|
основательно пишешь, продолжай в том же духе. vasek - в твоих блогах узнаю много интересного и полезного... |
Sheykhnur |
|
Темы:
16
Сообщения:
244
Участник с: 05 февраля 2013
|
vasekВот если бы все писали вот такую ерунду, насколько жить было бы легче! А статья действительно полезная. Таких статей — тех, которые по существу, всегда мало.
root@vpupkin# cat /dev/ass > /dev/head
|
vasek |
|
Темы:
47
Сообщения:
11853
Участник с: 17 февраля 2013
|
Сделал два дополнения 1) привел работающий скрипт acer_ec.pl 2) перевод управления куллером из ручного режима в автоматический из работающей системы, без выключения компьютера. Дополнения сделаны при обсуждении проблемы в этом топике, за что благодарен всем, принимавшим участие в обсуждении.
Ошибки не исчезают с опытом - они просто умнеют
|
vasek |
|
Темы:
47
Сообщения:
11853
Участник с: 17 февраля 2013
|
Внес изменение - сейчас модуль ec_sys встроен в ядро zgrep ACPI_EC /proc/config.gz то есть модуль загружать не нужно, чтение значений регистров будет работать без загрузки модуляНо значение параметра write_support=N sudo cat /sys/module/ec_sys/parametyers/write_support N и чтобы выполнить запись в регистр нужно загрузиться с параметром write_support=1, точнее - ec_sys.write_support=1
Ошибки не исчезают с опытом - они просто умнеют
|
Morisson |
|
Темы:
18
Сообщения:
1426
Участник с: 11 января 2017
|
Верхний- до повышени оборотов Нижний- после повышения.. Как найти эти чертовы регистры чтения и записи? |
Morisson |
|
Темы:
18
Сообщения:
1426
Участник с: 11 января 2017
|
Вроде как бы все нормально, но кулер останавливается только в районе ниже 40 градусов. Т.е. постоянно потихонечку тарахтит постоянно. |
Morisson |
|
Темы:
18
Сообщения:
1426
Участник с: 11 января 2017
|
Или может попробовать через DSDT, что вроде как даже полегче.. Только вот у себя секцию с вентилятором найти не могу |
vasek |
|
Темы:
47
Сообщения:
11853
Участник с: 17 февраля 2013
|
MorissonЕсли править DSDT, то нужно понять как устроено управление мощностью вентилятора. Есть несколько способов, например, динамическое изменение (как правило в случае отдельно установленного вентилятора), а есть и ступенчатое, как правило при установке одного вентилятора. У меня, например, стоит 3 спупени - при достижении верхней границы диапазона/ступени возрастает мощность вентилятора. Эти ступени можно грубо определить на слух. Эти же ступени должны быть описаны и в DSDT, например, в моем случае верхняя граница одной из ступени 52 град.С (34 в 16-ричной системе) Там же должны быть описаны trip_point температурные точки (посмотреть их можно в /sys/class/thermal/thermal_zone*).Как то так - но давно не разбирался с этим, а потому многое уже и забылось, могу в чем то и ошибаться. PS - но можно еще применить и прогу для управления мощностью вентилятором, которая позволяет изменять значения температуры (как то приводил в одном из топиков)
Ошибки не исчезают с опытом - они просто умнеют
|
vasek |
|
Темы:
47
Сообщения:
11853
Участник с: 17 февраля 2013
|
MorissonПосмотрел мельком и удивился - очень много измененных значений регистров. С одной стороны это и хорошо - многие параметры заведены на контролер. Смотреть доволно утомительно (плохо читается картинка), но если смотреть значения, которые изменились на много, то можно выделить следующие регистры PS - не учитывал регистры, значения в которых увеличились (чем меньше значение в регистре, тем больше значение параметра). Но, имхо, вряд ли это то, что нужно. Рекомендую следующееСначала определиться с типом управления мощностью вентилятора (если ступенчато, то хорошо заметно на слух) Лучше использовать не скрипт acer_ec.pl , а на прямую (системные значения) - лучше картинка и сразу в 16-ричном исчислении (у меня и hexdump и od прописаны в sudoers) Фиксируем вывод при низкой температуре, увеличиваем температуру градусов до 60-65 и снова фиксируем и еще раз увеличиваем температуру градусов до 80 и снова фиксируем.Отбираем регистры, значения в которых существенно уменьшились. А вот дальше можно и пощупать эти регистры в плотную, например, используя следующий скрипт (хоть замеры и идут в разное время, но кореляция хорошо заметна) cat ~/TTT/TEST/bash/ec.sh PS - awk '{print $16}' | awk '(NR == 3)' - проверяется регистр 2E, расположенный в 16 столбце и в 3 строкеТемпературу повышал, используя утилиту stress - запускаю в одном терминале скрипт показаний регистра, в другом утилиту stress секунд на 15-20 (пример запуска приведен в stress --help) Пример вывода скрипта (1-ая колонка - показания регистра, 2-ая колонка показания температуры)
PS - я 1-ый раз смотрел из винды (есть одна неплохая прога), меняя обороты вентилятора с помощью проги (для fan) - заметил несколько регистров. А дальше уже проверял их в Linux. EDIT 1 - можно еще попробовать поставить из AUR nbfc - контроль/управление вентилятором на основе этих самых регистров. Когда то давно пытался с ней поэкспериментировать, но до конца так дело и не дошло, проще оказалось ручками, если знаешь регистры. Но вот не помню, есть ли там база данных этих регистров для разных ноутбуков или же вписываешь сам. yay -Ss nbfc aur/nbfc-git 1.6.3.r9.g4699d17-1 (+2 0.55%) Cross-platform fan control service for notebooks (Development version) aur/nbfc 1.6.3-1 (+6 0.78%) Cross-platform fan control service for notebooks (STABLE & BETA releases)
Ошибки не исчезают с опытом - они просто умнеют
|