xref: /rk3399_rockchip-uboot/drivers/misc/status_led.c (revision 2d8d190c8394b43c0989cdb04a50cb48d4e1f8da)
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