LED usage on DVEVM
From Texas Instruments Embedded Processors Wiki
This article describes the usage of the 8 user controlled LEDs on DM6446 DVEVM.
Contents |
Hardware
On DM6446 DVEVM there are 8 user controllable LEDs available. These are controlled using I2C device PCF 8574A (I2C address 0x38).
See page 27 of TMS320DM6446 EVM schematic and section 2.4 (page 2-7) of Davinci-DM644x EVM Technical Reference.
Software
In MontaVisata Linux kernel and recent git kernel device driver to control LEDs is located in
arch/arm/mach-davinci/leds-evm.c
It controls four LEDs:
- "red" -> DS1
- "amber" -> DS2
- "green" -> DS3
- "blue" -> DS4
Note: Actually, all LEDs on DM6446 DVEVM are green :) But ARMs LED framework defines only these four colors. This seems to be the reason why only four of the 8 possible LEDs are controlled using this framework.
LED at DS8 is defined as "timer LED" and can be controlled by kernel configuration option CONFIG_LEDS_TIMER.
Note: CONFIG_LEDS_TIMER can only be set if CONFIG_GENERIC_CLOCKEVENTS is not set. Therefore this option isn't available in default DM6446 DVEVM git kernel configuration.
Usage
The 8 user controlled LEDs can be switched by user space software or by device drivers.
User space
From user space, you can control the four above LEDs via sysfs:
> echo claim > /sys/devices/system/leds/leds0/event > echo green on > /sys/devices/system/leds/leds0/event > echo red on > /sys/devices/system/leds/leds0/event > echo red off > /sys/devices/system/leds/leds0/event > echo amber on > /sys/devices/system/leds/leds0/event > echo blue on > /sys/devices/system/leds/leds0/event > echo release > /sys/devices/system/leds/leds0/event
Note: the release turns off the LED's!
Example program
/**********************************************************************
* EVM_LED_BLINKING.C
* Eric Tanner 2007.
*
* Simple program to blink the LEDs on the DaVinci
* EVM using the the LED port expander PCF8574A at I2C Slave Address 0x38.
* I2C Support and I2C device interface must be turned on in the kernel.
*
**************************************************************************/
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/ioctl.h>
#include <errno.h>
#include <signal.h>
#define I2C_DEVICE "/dev/i2c/0"
#define I2C_DEV_ADDR 0x38
#define I2C_SLAVE 0x0703
int main()
{
int i2c_fd;
int state = 0;
unsigned char val = 0x00;
int ret;
struct timespec req = {
.tv_sec = 0,
.tv_nsec = 100000000,
};
if((i2c_fd = open(I2C_DEVICE,O_RDWR)) < 0) {
printf("Unable to open the i2c port!\n");
exit(1);
}
if(ioctl(i2c_fd, I2C_SLAVE, I2C_DEV_ADDR)== -1) {
close( i2c_fd );
printf("Unable to setup the i2c port!\n");
exit(1);
}
do {
val <<= 1;
val |= 0x01;
if(val == 0xFF)
val = 0xFE;
write( i2c_fd, &val, 1);
} while (!nanosleep (&req, NULL));
close ( i2c_fd );
printf ("End.\n");
return 0;
}
Device drivers
Device drivers can use function call
leds_event(led_{green,amber,red,blue}_{on,off});
including
#include <asm/leds.h>Leave a Comment
