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