GPIO LEDS

From ArmadeusWiki
Revision as of 10:08, 10 July 2012 by Jorasse (Talk | contribs) (Usage)

Jump to: navigation, search

How to use leds-gpio driver to manage states of connected leds of your Armadeus board.

Introduction

You can manage a led connected to a GPIO pin. The LED management is similar with the standard GPIO sysfs driver, but you have some new features like triggers (e.g. "heartbeat" LED blinks like a heart at the rate oh the CPU load) . Here are the GPIO used for the user LED for each APF board:

  • APF9328: PORT A / bit 2
  • APF27: GPIO_PORTF | 14
  • APF28: PINID_GPMI_RDY1 (Bank 0 - pin 21)
  • APF51: GPIO_PORTA | 2

Configuration

First, you need to enable the leds-gpio driver in your kernel and some triggers like the "heartbeat" trigger to make the LED flash like a heartbeat.

Device Drivers  --->
     --- LED support
         [*] LED Class Support
              *** LED drivers *** 
         <*> LED Support for GPIO connected LEDs
              [*] Platform device bindings for GPIO LEDs
              *** LED Triggers ***
         [*]   LED Trigger support
         <*>     LED Timer Trigger
         <*>     LED Heartbeat Trigger
         <*>     LED backlight Trigger
         <*>     LED Default ON Trigger

Then, in your apfXX-dev.c, you would need to define your LED before the variable platform_devices[]. This code is already implemented for the APF27, APF28 and APF51 so the source code hereafter (for the APF27) is only present as a reference sample to understand how to activate a GPIO LED driver.

#include <linux/leds.h>

/* GPIO LED */
#if defined(CONFIG_LEDS_GPIO) || defined(CONFIG_LEDS_GPIO_MODULE)
static struct gpio_led apf27dev_led[] = {
	{
		.name = "apfdev:green:user",
		.default_trigger = "heartbeat",
		.gpio = (GPIO_PORTF | 14),
		.active_low = 1,
	},
};

static struct gpio_led_platform_data apf27dev_led_data = {
	.num_leds	= ARRAY_SIZE(apf27dev_led),
	.leds		= apf27dev_led
};

static struct platform_device apf27dev_led_dev = {
	.name		= "leds-gpio",
	.id		= -1,
	.dev		= {
		.platform_data	= &apf27dev_led_data,
	},
};
#endif /* CONFIG_LEDS_GPIO */

Add the LED to get it managed by the kernel.

static struct platform_device *platform_devices[] __initdata = {
#if defined(CONFIG_LEDS_GPIO) || defined(CONFIG_LEDS_GPIO_MODULE)
	&apf27dev_led_dev,
#endif
	ALSA_SOUND

};

Then rebuild and update your bard with the new kernel. Upon the next kernel boot you should see the LED flash like a heartbeat (if you have activated the "heartbeat" trigger)

Usage

# ls /sys/class/leds/apfdev\:green\:user/
brightness      max_brightness  subsystem       uevent
device          power           trigger

You can change the trigger behaviors. By default, Heartbeat is selected:

# cat /sys/class/leds/apfdev\:green\:user/trigger 
none nand-disk mmc0 timer [heartbeat] backlight gpio default-on 

# echo none > /sys/class/leds/apfdev\:green\:user/trigger 

Switch on and off the LED

# cat /sys/class/leds/apfdev\:green\:user/max_brightness > /sys/class/leds/apfde
v\:green\:user/brightness 

# echo 0 > /sys/class/leds/apfdev\:green\:user/brightness 

Links