1318c0b90SJean-Christophe PLAGNIOL-VILLARD /*
2318c0b90SJean-Christophe PLAGNIOL-VILLARD * (C) Copyright 2000-2003
3318c0b90SJean-Christophe PLAGNIOL-VILLARD * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
4318c0b90SJean-Christophe PLAGNIOL-VILLARD *
51a459660SWolfgang Denk * SPDX-License-Identifier: GPL-2.0+
6318c0b90SJean-Christophe PLAGNIOL-VILLARD */
7318c0b90SJean-Christophe PLAGNIOL-VILLARD
8318c0b90SJean-Christophe PLAGNIOL-VILLARD #include <common.h>
9318c0b90SJean-Christophe PLAGNIOL-VILLARD #include <status_led.h>
10318c0b90SJean-Christophe PLAGNIOL-VILLARD
11318c0b90SJean-Christophe PLAGNIOL-VILLARD /*
12318c0b90SJean-Christophe PLAGNIOL-VILLARD * The purpose of this code is to signal the operational status of a
13318c0b90SJean-Christophe PLAGNIOL-VILLARD * target which usually boots over the network; while running in
14318c0b90SJean-Christophe PLAGNIOL-VILLARD * U-Boot, a status LED is blinking. As soon as a valid BOOTP reply
15318c0b90SJean-Christophe PLAGNIOL-VILLARD * message has been received, the LED is turned off. The Linux
16318c0b90SJean-Christophe PLAGNIOL-VILLARD * kernel, once it is running, will start blinking the LED again,
17318c0b90SJean-Christophe PLAGNIOL-VILLARD * with another frequency.
18318c0b90SJean-Christophe PLAGNIOL-VILLARD */
19318c0b90SJean-Christophe PLAGNIOL-VILLARD
20318c0b90SJean-Christophe PLAGNIOL-VILLARD /* ------------------------------------------------------------------------- */
21318c0b90SJean-Christophe PLAGNIOL-VILLARD
22318c0b90SJean-Christophe PLAGNIOL-VILLARD typedef struct {
23318c0b90SJean-Christophe PLAGNIOL-VILLARD led_id_t mask;
24318c0b90SJean-Christophe PLAGNIOL-VILLARD int state;
25318c0b90SJean-Christophe PLAGNIOL-VILLARD int period;
26318c0b90SJean-Christophe PLAGNIOL-VILLARD int cnt;
27318c0b90SJean-Christophe PLAGNIOL-VILLARD } led_dev_t;
28318c0b90SJean-Christophe PLAGNIOL-VILLARD
29318c0b90SJean-Christophe PLAGNIOL-VILLARD led_dev_t led_dev[] = {
30*2d8d190cSUri Mashiach { CONFIG_LED_STATUS_BIT,
31*2d8d190cSUri Mashiach CONFIG_LED_STATUS_STATE,
32*2d8d190cSUri Mashiach LED_STATUS_PERIOD,
33318c0b90SJean-Christophe PLAGNIOL-VILLARD 0,
34318c0b90SJean-Christophe PLAGNIOL-VILLARD },
35*2d8d190cSUri Mashiach #if defined(CONFIG_LED_STATUS1)
36*2d8d190cSUri Mashiach { CONFIG_LED_STATUS_BIT1,
37*2d8d190cSUri Mashiach CONFIG_LED_STATUS_STATE1,
38*2d8d190cSUri Mashiach LED_STATUS_PERIOD1,
39318c0b90SJean-Christophe PLAGNIOL-VILLARD 0,
40318c0b90SJean-Christophe PLAGNIOL-VILLARD },
41318c0b90SJean-Christophe PLAGNIOL-VILLARD #endif
42*2d8d190cSUri Mashiach #if defined(CONFIG_LED_STATUS2)
43*2d8d190cSUri Mashiach { CONFIG_LED_STATUS_BIT2,
44*2d8d190cSUri Mashiach CONFIG_LED_STATUS_STATE2,
45*2d8d190cSUri Mashiach LED_STATUS_PERIOD2,
46318c0b90SJean-Christophe PLAGNIOL-VILLARD 0,
47318c0b90SJean-Christophe PLAGNIOL-VILLARD },
48318c0b90SJean-Christophe PLAGNIOL-VILLARD #endif
49*2d8d190cSUri Mashiach #if defined(CONFIG_LED_STATUS3)
50*2d8d190cSUri Mashiach { CONFIG_LED_STATUS_BIT3,
51*2d8d190cSUri Mashiach CONFIG_LED_STATUS_STATE3,
52*2d8d190cSUri Mashiach LED_STATUS_PERIOD3,
53318c0b90SJean-Christophe PLAGNIOL-VILLARD 0,
54318c0b90SJean-Christophe PLAGNIOL-VILLARD },
55318c0b90SJean-Christophe PLAGNIOL-VILLARD #endif
56*2d8d190cSUri Mashiach #if defined(CONFIG_LED_STATUS4)
57*2d8d190cSUri Mashiach { CONFIG_LED_STATUS_BIT4,
58*2d8d190cSUri Mashiach CONFIG_LED_STATUS_STATE4,
59*2d8d190cSUri Mashiach LED_STATUS_PERIOD4,
60a8eeaf2fSStefan Roese 0,
61a8eeaf2fSStefan Roese },
62a8eeaf2fSStefan Roese #endif
63*2d8d190cSUri Mashiach #if defined(CONFIG_LED_STATUS5)
64*2d8d190cSUri Mashiach { CONFIG_LED_STATUS_BIT5,
65*2d8d190cSUri Mashiach CONFIG_LED_STATUS_STATE5,
66*2d8d190cSUri Mashiach LED_STATUS_PERIOD5,
67a8eeaf2fSStefan Roese 0,
68a8eeaf2fSStefan Roese },
69a8eeaf2fSStefan Roese #endif
70318c0b90SJean-Christophe PLAGNIOL-VILLARD };
71318c0b90SJean-Christophe PLAGNIOL-VILLARD
72318c0b90SJean-Christophe PLAGNIOL-VILLARD #define MAX_LED_DEV (sizeof(led_dev)/sizeof(led_dev_t))
73318c0b90SJean-Christophe PLAGNIOL-VILLARD
74318c0b90SJean-Christophe PLAGNIOL-VILLARD static int status_led_init_done = 0;
75318c0b90SJean-Christophe PLAGNIOL-VILLARD
status_led_init(void)7613cfbe51SBernhard Nortmann void status_led_init(void)
77318c0b90SJean-Christophe PLAGNIOL-VILLARD {
78318c0b90SJean-Christophe PLAGNIOL-VILLARD led_dev_t *ld;
79318c0b90SJean-Christophe PLAGNIOL-VILLARD int i;
80318c0b90SJean-Christophe PLAGNIOL-VILLARD
81318c0b90SJean-Christophe PLAGNIOL-VILLARD for (i = 0, ld = led_dev; i < MAX_LED_DEV; i++, ld++)
82318c0b90SJean-Christophe PLAGNIOL-VILLARD __led_init (ld->mask, ld->state);
83318c0b90SJean-Christophe PLAGNIOL-VILLARD status_led_init_done = 1;
84318c0b90SJean-Christophe PLAGNIOL-VILLARD }
85318c0b90SJean-Christophe PLAGNIOL-VILLARD
status_led_tick(ulong timestamp)86318c0b90SJean-Christophe PLAGNIOL-VILLARD void status_led_tick (ulong timestamp)
87318c0b90SJean-Christophe PLAGNIOL-VILLARD {
88318c0b90SJean-Christophe PLAGNIOL-VILLARD led_dev_t *ld;
89318c0b90SJean-Christophe PLAGNIOL-VILLARD int i;
90318c0b90SJean-Christophe PLAGNIOL-VILLARD
91318c0b90SJean-Christophe PLAGNIOL-VILLARD if (!status_led_init_done)
92318c0b90SJean-Christophe PLAGNIOL-VILLARD status_led_init ();
93318c0b90SJean-Christophe PLAGNIOL-VILLARD
94318c0b90SJean-Christophe PLAGNIOL-VILLARD for (i = 0, ld = led_dev; i < MAX_LED_DEV; i++, ld++) {
95318c0b90SJean-Christophe PLAGNIOL-VILLARD
96*2d8d190cSUri Mashiach if (ld->state != CONFIG_LED_STATUS_BLINKING)
97318c0b90SJean-Christophe PLAGNIOL-VILLARD continue;
98318c0b90SJean-Christophe PLAGNIOL-VILLARD
99318c0b90SJean-Christophe PLAGNIOL-VILLARD if (++ld->cnt >= ld->period) {
100318c0b90SJean-Christophe PLAGNIOL-VILLARD __led_toggle (ld->mask);
101318c0b90SJean-Christophe PLAGNIOL-VILLARD ld->cnt -= ld->period;
102318c0b90SJean-Christophe PLAGNIOL-VILLARD }
103318c0b90SJean-Christophe PLAGNIOL-VILLARD
104318c0b90SJean-Christophe PLAGNIOL-VILLARD }
105318c0b90SJean-Christophe PLAGNIOL-VILLARD }
106318c0b90SJean-Christophe PLAGNIOL-VILLARD
status_led_set(int led,int state)107318c0b90SJean-Christophe PLAGNIOL-VILLARD void status_led_set (int led, int state)
108318c0b90SJean-Christophe PLAGNIOL-VILLARD {
109318c0b90SJean-Christophe PLAGNIOL-VILLARD led_dev_t *ld;
110318c0b90SJean-Christophe PLAGNIOL-VILLARD
111318c0b90SJean-Christophe PLAGNIOL-VILLARD if (led < 0 || led >= MAX_LED_DEV)
112318c0b90SJean-Christophe PLAGNIOL-VILLARD return;
113318c0b90SJean-Christophe PLAGNIOL-VILLARD
114318c0b90SJean-Christophe PLAGNIOL-VILLARD if (!status_led_init_done)
115318c0b90SJean-Christophe PLAGNIOL-VILLARD status_led_init ();
116318c0b90SJean-Christophe PLAGNIOL-VILLARD
117318c0b90SJean-Christophe PLAGNIOL-VILLARD ld = &led_dev[led];
118318c0b90SJean-Christophe PLAGNIOL-VILLARD
119318c0b90SJean-Christophe PLAGNIOL-VILLARD ld->state = state;
120*2d8d190cSUri Mashiach if (state == CONFIG_LED_STATUS_BLINKING) {
121318c0b90SJean-Christophe PLAGNIOL-VILLARD ld->cnt = 0; /* always start with full period */
122*2d8d190cSUri Mashiach state = CONFIG_LED_STATUS_ON; /* always start with LED _ON_ */
123318c0b90SJean-Christophe PLAGNIOL-VILLARD }
124318c0b90SJean-Christophe PLAGNIOL-VILLARD __led_set (ld->mask, state);
125318c0b90SJean-Christophe PLAGNIOL-VILLARD }
126