Про поддержку LED в linux
Поддержка миганием светодиодов встроена в ядро Линукс, что позволяет существенно упростить работу со светодиодами, подключенными к любому свободному gpio.
Ядро может взять на себя самостоятельную функцию по отображению с помощью светодиода, например, активность работы hdd или активность процессора и пр. Все доступные варианты использования светодиодов с помощью драйвера ядра можно найти в интернете, здесь только отражаю то, как это всё настраивается.
Как мигать светодиодом, используя ядро linux.
В ядре нужно включить поддержку LED: CONFIG_LEDS_CLASS, CONFIG_LEDS_GPIO, все опции CONFIG_LEDS_TRIGGERS.
В файле конфигурации целевой платформы для сборки ядра (для процессоров семейства kirkwood этим файлом может быть /arch/arm/mach-kirkwood/db88f6281-bp-setup.c) нужно создать некие структурки, которые должны выглядеть как-то так:
static struct gpio_led tr628m1_led_pins[] = {
{
.name = "tr628m1:green:Rs232Act",
.gpio = 47,
.active_low = 1,
.default_trigger = "oneshot"
}
};
static struct gpio_led_platform_data tr628m1_data = {
.leds = tr628m1_led_pins,
.num_leds = ARRAY_SIZE(tr628m1_led_pins),
};
static struct platform_device tr628m1_leds = {
.name = "leds-gpio",
.id = -1,
.dev = {
.platform_data = &tr628m1_data,
},
};
И затем вызвать функцию:
platform_device_register(&tr628m1_leds);
После загрузки ядра и запуска файловой системы следует проинициализировать gpio, с помощью которого планируется управлять светодиодом:
echo 47 > /sys/class/gpio/export
После выполнения этой операции появится интерфейс в файловой системе /sys для работы со светодиодом.
# ls -l /sys/class/leds/ lrwxrwxrwx 1 root root 0 Jan 1 1970 tr628m1:green:Rs232Act -> ../../devices/platform/leds-gpio/leds/tr628m1:green:Rs232Act
Следует отметить, что существует набор триггеров, с помощью которых можно манипулировать светодиодом и от того, какой из триггеров сейчас активный, становятся доступным те или иные свойства.
Так, например, в данном случае активным является триггер "oneshot" и набор доступных опций для него выглядит как-то так:
# ls -l /sys/class/leds/tr628m1\:green\:Rs232Act/ -rw-r--r-- 1 root root 4096 Apr 19 01:20 brightness -rw-r--r-- 1 root root 4096 Sep 29 2015 delay_off -rw-r--r-- 1 root root 4096 Sep 29 2015 delay_on lrwxrwxrwx 1 root root 0 Apr 19 01:20 device -> ../../../leds-gpio -rw-r--r-- 1 root root 4096 Apr 19 01:20 invert -r--r--r-- 1 root root 4096 Apr 19 01:20 max_brightness --w------- 1 root root 4096 Apr 19 01:20 shot lrwxrwxrwx 1 root root 0 Apr 19 01:20 subsystem -> ../../../../../class/leds -rw-r--r-- 1 root root 4096 Apr 19 01:20 trigger -rw-r--r-- 1 root root 4096 Apr 19 01:20 uevent
Поэтому чтобы триггер "oneshot" отрабатывал с нужным нам временем, можно настроить следующие свойства:
echo 50 > /sys/class/leds/tr628m1\:green\:Rs232Act/delay_off echo 50 > /sys/class/leds/tr628m1\:green\:Rs232Act/delay_on
Для активации триггера oneshot можно из консоли выполнить команду:
echo 1 > /sys/class/leds/tr628m1\:green\:Rs232Act/shot
либо из программы выполнить незатейливую функцию следующего вида:
FILE *file;
char *fname = "/sys/class/leds/tr628m1:green:Rs232Act/shot";
file = fopen(fname,"w");
if (file) {
fputc ('1', file);
fclose (file);
}
Список доступных триггеров можно посмотреть так (скобками обозначен активный триггер):
# cat /sys/class/leds/tr628m1\:green\:Rs232Act/trigger none timer [oneshot] default-on netdev
Для смены типа триггера можно выполнить команду:
echo timer > /sys/class/leds/tr628m1\:green\:Rs232Act/trigger


