Продвинутое моргание светодиодом (LED triggers)

Материал из virt2real wiki
Перейти к: навигация, поиск

Благодаря существующей в ядре Linux поддержке системы LED Trigger есть возможность назначить на любой пин GPIO функцию отображения какой-то активности. Например, текущая активность процессора, обращения к microSD карте, обращения к NAND и т.д. Всем известный пример - моргание светодиода HDD на системном блоке обычного компьютера. Суть та же.

Содержание

Настройки ядра

Для того чтобы была доступна такая возможность, ядро должно быть собрано с включёнными нижеуказанными пунктами. Каждый тип переключателей (Triggers) отвечает за конкретную функцию.

Device Drivers  --->
    --- LED support
        [*] LED Class Support
             *** LED drivers *** 
        [*] LED Support for GPIO connected LEDs 
        <*> LED Support for GPIO connected LEDs
        [*] LED Trigger support

             *** LED Triggers ***
        <*> LED Timer Trigger
        <*> LED One-shot Trigger
        <*> LED Heartbeat Trigger
        <*> LED backlight Trigger
        [*] LED CPU Trigger
        <*> LED GPIO Trigger
        < > LED Default ON Trigger

Помимо этих стандартных триггеров в системе могут быть дополнительные триггеры, создаваемые драйверами оборудования. Например, драйвер Wi-Fi добавляет триггер rfkill0, и т.д.

Кроме включения этих настроек в ядре ещё требуется инициализировать индикаторы. Индикатором может быть что угодно, подключенное к пину GPIO. Обычно в роли индикатора выступают светодиоды. Инициализация индикаторов (так же как и любого другого оборудования) происходит в файле kernel/arch/arm/mach-davinci/board-dm365-evm.c Блок инициализации начинается с комментария /* LED triggers block */

По-умолчанию в ядре, входящем в состав Virt2real SDK, имеются два индикатора - красный и зелёный светодиоды, имеющиеся на плате Virt2real. Назначение их функционала производится в файле uEnv.txt путём изменения значения параметров redled и greenled. Например, чтобы заставить зелёный светодиод отображать текущую активность процессора, надо в файле uEnv.txt создать параметр greenled=cpu0 А чтобы красный светодиод показывал активность microSD карты - параметр redled=mmc0 Короче, всё просто.

После загрузки системы при имеющихся активных индикаторах ими можно произвольно управлять - менять функционал, включать/выключать, и т.д.

Использование триггеров

Перечень активных индикаторов можно посмотреть в каталоге /sys/class/leds

cd /sys/class/leds
ls
v2r:green:user@ v2r:red:user@

Здесь мы видим два каталога, каждый из которых соответствует индикатору с именем, заданным при инициализации ядра (в файле board-dm365-evm.c).

Если перейти в любой из этих каталогов, увидим управляющие файлы

cd v2r\:green\:user
brightness      max_brightness      subsystem@      uevent      device@      power/      trigger

Файл brightness задаёт яркость светодиода. Для обычных светодиодов есть только два варианта - либо светодиод погашен, либо светится. Для выключения светодиода надо записать 0 в этот файл

echo 0 > brightness

А чтобы зажечь светодиод - любое значение больше нуля

echo 1 > brightness

При записи любого значение в файл brightness теряется ранее назначенная функция индикация активности. Т.е. светодиод будет просто гореть или не гореть.

За назначение функционала отображения какой-то активности отвечает файл trigger

cat trigger
[none] nand-disk mmc0 mmc1 timer oneshot heartbeat backlight gpio cpu0 rfkill0

В этом файле имеется список всех доступных триггеров. Скобками [ ] отмечен текущий триггер. Т.е. то за что сейчас отвечает этот наш индикатор.

Чтобы заставить светодиод моргать, отображая текущую активность процессора, надо записать в файл trigger значение cpu0

echo cpu0 > trigger

Всё, теперь зелёный светодиодик будет моргать. Чем чаще моргает - тем сильнее загружен процессор.

Описание триггеров

none - отсутствие действия (светодиод постоянно потушен)

nand-disk - обращения к NAND

mmc0 - обращения к microSD (MMC0)

mmc1 - обращения к Wi-Fi модулю (MMC1)

timer - повторяющееся срабатывания таймера

oneshot - однократное срабатывание таймера

heartbeat - "пульс системы". Чем чаще бьётся - тем больше средняя загрузка системы (load average)

backlight

gpio - обращения к GPIO

cpu0 - активность центрального процессора

rfkill0 - активность драйвера Wi-Fi


Нюансы

При назначении некоторых функций в текущем каталоге могут появиться дополнительные файлы конфигурации, для подробной настройки индикации. Например, если задать триггер gpio, то появятся вот такие файлы

echo gpio > trigger
ls 
brightness   gpio   power/   uevent   desired_brightness   inverted   subsystem@   device@   max_brightness   trigger

Здесь нас больше всего интересует файл gpio, в котором можно задать номер GPIO, который будет мониториться

echo 7 > gpio

Так как мониторинг состояния пина GPIO происходит с помощью прерываний, эта функция доступна не на всех пинах.


Наглядная видеодемонстрация

На видео синий светодиод отвечает за индикацию питания платы (светится постоянно), зелёный светодиод - активность процессора, красный светодиод - активность microSD карточки

Дополнительная литература

https://www.kernel.org/doc/Documentation/leds/leds-class.txt

https://www.kernel.org/doc/Documentation/leds/