xref: /rk3399_rockchip-uboot/drivers/misc/status_led.c (revision 13cfbe51357bf3275b14046e0031ea2b7fdaf8ce)
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[] = {
30318c0b90SJean-Christophe PLAGNIOL-VILLARD     {	STATUS_LED_BIT,
31318c0b90SJean-Christophe PLAGNIOL-VILLARD 	STATUS_LED_STATE,
32318c0b90SJean-Christophe PLAGNIOL-VILLARD 	STATUS_LED_PERIOD,
33318c0b90SJean-Christophe PLAGNIOL-VILLARD 	0,
34318c0b90SJean-Christophe PLAGNIOL-VILLARD     },
35318c0b90SJean-Christophe PLAGNIOL-VILLARD #if defined(STATUS_LED_BIT1)
36318c0b90SJean-Christophe PLAGNIOL-VILLARD     {	STATUS_LED_BIT1,
37318c0b90SJean-Christophe PLAGNIOL-VILLARD 	STATUS_LED_STATE1,
38318c0b90SJean-Christophe PLAGNIOL-VILLARD 	STATUS_LED_PERIOD1,
39318c0b90SJean-Christophe PLAGNIOL-VILLARD 	0,
40318c0b90SJean-Christophe PLAGNIOL-VILLARD     },
41318c0b90SJean-Christophe PLAGNIOL-VILLARD #endif
42318c0b90SJean-Christophe PLAGNIOL-VILLARD #if defined(STATUS_LED_BIT2)
43318c0b90SJean-Christophe PLAGNIOL-VILLARD     {	STATUS_LED_BIT2,
44318c0b90SJean-Christophe PLAGNIOL-VILLARD 	STATUS_LED_STATE2,
45318c0b90SJean-Christophe PLAGNIOL-VILLARD 	STATUS_LED_PERIOD2,
46318c0b90SJean-Christophe PLAGNIOL-VILLARD 	0,
47318c0b90SJean-Christophe PLAGNIOL-VILLARD     },
48318c0b90SJean-Christophe PLAGNIOL-VILLARD #endif
49318c0b90SJean-Christophe PLAGNIOL-VILLARD #if defined(STATUS_LED_BIT3)
50318c0b90SJean-Christophe PLAGNIOL-VILLARD     {	STATUS_LED_BIT3,
51318c0b90SJean-Christophe PLAGNIOL-VILLARD 	STATUS_LED_STATE3,
52318c0b90SJean-Christophe PLAGNIOL-VILLARD 	STATUS_LED_PERIOD3,
53318c0b90SJean-Christophe PLAGNIOL-VILLARD 	0,
54318c0b90SJean-Christophe PLAGNIOL-VILLARD     },
55318c0b90SJean-Christophe PLAGNIOL-VILLARD #endif
56a8eeaf2fSStefan Roese #if defined(STATUS_LED_BIT4)
57a8eeaf2fSStefan Roese     {	STATUS_LED_BIT4,
58a8eeaf2fSStefan Roese 	STATUS_LED_STATE4,
59a8eeaf2fSStefan Roese 	STATUS_LED_PERIOD4,
60a8eeaf2fSStefan Roese 	0,
61a8eeaf2fSStefan Roese     },
62a8eeaf2fSStefan Roese #endif
63a8eeaf2fSStefan Roese #if defined(STATUS_LED_BIT5)
64a8eeaf2fSStefan Roese     {	STATUS_LED_BIT5,
65a8eeaf2fSStefan Roese 	STATUS_LED_STATE5,
66a8eeaf2fSStefan Roese 	STATUS_LED_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 
76*13cfbe51SBernhard 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 
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 
96318c0b90SJean-Christophe PLAGNIOL-VILLARD 		if (ld->state != STATUS_LED_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 
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;
120318c0b90SJean-Christophe PLAGNIOL-VILLARD 	if (state == STATUS_LED_BLINKING) {
121318c0b90SJean-Christophe PLAGNIOL-VILLARD 		ld->cnt = 0;		/* always start with full period    */
122318c0b90SJean-Christophe PLAGNIOL-VILLARD 		state = STATUS_LED_ON;	/* always start with LED _ON_       */
123318c0b90SJean-Christophe PLAGNIOL-VILLARD 	}
124318c0b90SJean-Christophe PLAGNIOL-VILLARD 	__led_set (ld->mask, state);
125318c0b90SJean-Christophe PLAGNIOL-VILLARD }
126