From 18eee2c488db374851ff2ec09845134d9f791fb8 Mon Sep 17 00:00:00 2001 From: John Bowler Date: Mon, 23 May 2005 16:19:43 +0000 Subject: Allow leds to work in early user space by getting the device entry in /dev, allow leds to be set to different settings using 'leds'. BKrev: 4292029fJdJ4KZzDf8ka7UNhpcVhkQ --- packages/openslug-init/openslug-init-0.10/leds.c | 190 +++++++++++++++++++++++ packages/openslug-init/openslug-init-0.10/leds.h | 21 +++ 2 files changed, 211 insertions(+) (limited to 'packages/openslug-init') diff --git a/packages/openslug-init/openslug-init-0.10/leds.c b/packages/openslug-init/openslug-init-0.10/leds.c index e69de29bb2..e2120ae5d6 100644 --- a/packages/openslug-init/openslug-init-0.10/leds.c +++ b/packages/openslug-init/openslug-init-0.10/leds.c @@ -0,0 +1,190 @@ + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include "leds.h" + + static int leds; + static int reset; + static int verbose = 0; + enum { + off=0, on=1, blink, unknown, transition=unknown + }; + + + void init_leds(void) + { + int i; + if ((leds = open("/dev/leds", O_RDWR)) < 0) { + int e1 = errno; + if (e1 != ENOENT) { + + fprintf(stderr,"Error: Could not open LEDS device file '/dev/leds' : %s\n", + strerror(e1)); + if(e1 == EACCES) + fprintf(stderr,"Run as root\n"); + exit(1); + } + } + + if (verbose) + printf("leds: initialized.\n"); + } + + void led_ioctl( int cmd, int num ) + { + int i, st; + + if (ioctl(leds, cmd, num) < 0) { + int e1 = errno; + fprintf(stderr, "leds: ioctl(%d,%d): failed to set leds: %s\n", + cmd, num, strerror(e1)); + exit(1); + } + } + + void led_set( int led, int state ) + { + switch (state) { + case off: if (!reset) led_ioctl(N2_LM_OFF, led); break; + case on: led_ioctl(N2_LM_ON, led); break; + case blink: /* Ensure any previous timer gets deleted first and that + * the LED is in a well known state. + */ + if (!reset) led_ioctl(N2_LM_OFF, led); + led_ioctl(N2_LM_BLINK, led); break; + } + } + + int led( int ch ) { + switch (ch) { + case 'r': return LED_RS_RED; + case 'g': return LED_RS_GRN; + case '1': return LED_DISK1; + case '2': return LED_DISK2; + case 'A': reset = 1; return LED_ALL; + default: fprintf(stderr, "leds: %c: unknown LED (use r,g,0,1 or A)\n", ch); + exit(1); + } + } + + int main( int argc, char **argv ) + { + /* Default: switch green on, red off (-A +g). */ + if (argc == 1) { + verbose = 1; + init_leds(); + led_ioctl(N2_LM_ALL_OFF, 0); + led_ioctl(N2_LM_ON, LED_RS_GRN); + } else { + int i, alt=0, state[PHYS_LEDS]; + for(i=0; i 0) { + char *arg = *++argv; + int st; + if (strcmp(arg, "-v") == 0) { + ++verbose; + continue; + } + + switch (*arg) { + case '+': st = on; break; + case '-': st = off; break; + case '!': st = blink; break; + case '/': st = transition; break; + default: fprintf(stderr, "leds: %c: unknown option\n", *arg); + exit(1); + } + + if (st != transition) { + while (*++arg) { + i = led(*arg); + if (i == LED_ALL) + for (i=0; i