Я думаю, что мое отсутствие аппаратных знаний мешает мне в этой проблеме.
Тогда давайте начнем с основ. Индикаторными светодиодами можно управлять несколькими способами:
Светодиод управляется непосредственно периферийным чипом / устройством. В этой ситуации процессор и драйвер ядра не будут контролировать светодиод. Обычно это касается светодиодов "активность" и "скорость соединения" на разъеме Ethernet RJ-45; Эти светодиоды будут находиться под прямым / эксклюзивным контролем физического устройства Ethernet.
Светодиод управляется контактом GPIO (вход / выход общего назначения) ЦП или SoC.
Светодиод является выходом внешней логики (например, микросхема ПЛИС).
Светодиод является выходом на периферийный чип.
Последние три ситуации могут быть не различимы в исходном коде. Один бит в регистре порта или устройства включит или выключит светодиод. Проверьте файл заголовка на предмет того, что будут контролировать другие биты в регистре. В зависимости от архитектуры процессора регистр будет считываться / записываться с использованием инструкций ввода-вывода или инструкций извлечения / сохранения памяти.
Обратите внимание, что светодиод часто является источником тока и привязан к логическому высокому напряжению, поэтому светодиод включается заземлением контакта путем записи значения 0
бит. И наоборот, светодиод обычно выключается путем записи 1
битного значения. Поскольку изменяется только один бит регистра, перед изменением битов обычно требуется чтение всего регистра. Сам регистр может быть критической областью, которая потребует приобретения (и освобождения) мьютекса или спин-блокировки для защиты всей операции.
Проверка исходного кода
Если драйверы устройства проприетарные, значит, вы облажались. В противном случае вы сможете получить исходный код. Ваш дистрибутив должен предоставить свой исходный код. Существуют онлайновые средства просмотра, такие как это дерево ядра Linux со встроенными гиперссылками. Если драйверы отсутствуют в основном дереве исходного кода ядра, вам следует попросить производителя оборудования предоставить исходный код в соответствии с условиями лицензии GPL.
Вы упомянули четыре показателя:
- беспроводная связь
- зимняя спячка
- подключение Bluetooth
- аккумулятор
Получите выходные данные команды lsmod
, в которой будут перечислены модули времени выполнения, добавленные в ядро. Из списка модулей необходимо определить, какие драйверы соответствуют функциональности этих светодиодов, например, беспроводные сети, питание и т.д. Предполагая, что этот ThinkPad имеет чип беспроводного контроллера Intel, вам нужно будет заглянуть в каталог drivers/net/wireless/iwlwifi
. Проверьте файлы Kconfig
и Makefile
в этом каталоге драйверов на предмет соответствия между фактическим именем устройства HW, символами конфигурации, встроенными модулями .ko
и соответствующим исходным кодом.
Просмотрите исходный код драйвера для манипулирования индикаторным светодиодом. Если операция не закомментирована, вам придется искать битовую операцию, или макрос, или вызов процедуры. Существует много способов организовать этот код в зависимости от модульности кода или от того, были ли использованы методы ООП, и эти светодиодные операции заключены в процедуры в каком-либо другом драйвере. Остерегайтесь текста (исполняемого кода) в макросах (т.е. #define
) и в заголовочных файлах. То есть просмотр только .c
файлов был бы ошибкой. Также помните, что некоторый код устройства может находиться в arch/xxx/platform
или arch/xxx/machine
, особенно для встроенных одноплатных компьютеров.