Про поддержку 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