5

У меня есть недорогой дешевый ноутбук Thinkpad SL 500.

Меня беспокоят два светодиода, один для беспроводного подключения, а другой для режима гибернации, которые вообще не загораются, хотя они и работают, я попробовал это на Windows.

Поэтому я хотел бы написать для них драйвер ядра, ничего особенного, это просто хорошая идея поиграться с ядром.

Мой вопрос заключается в том, какой методологии мне следует систематически следовать, чтобы выяснить, какие устройства отвечают за эти светодиоды (в общем, не обязательно специфичные для моего оборудования), и какие драйверы отвечают за два других работающих светодиода, Bluetooth и индикатор батареи?

И когда я говорю методологию, я действительно имею в виду методологию, шаг за шагом, с обоснованиями для каждого шага, как в ответе я дал кому - то здесь: Что делает && означает в аннулируетесь * р = && а;

Я хорошо разбираюсь в больших репозиториях кода, использую статические анализаторы кода и другие, но я думаю, что мое отсутствие знаний об оборудовании мешает мне решить эту проблему.

PS: я использую ArchLinux, так что почти последняя версия ядра.

1 ответ1

3

Я думаю, что мое отсутствие аппаратных знаний мешает мне в этой проблеме.

Тогда давайте начнем с основ. Индикаторными светодиодами можно управлять несколькими способами:

  • Светодиод управляется непосредственно периферийным чипом / устройством. В этой ситуации процессор и драйвер ядра не будут контролировать светодиод. Обычно это касается светодиодов "активность" и "скорость соединения" на разъеме 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 , особенно для встроенных одноплатных компьютеров.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .