hc
2024-08-12 233ab1bd4c5697f5cdec94e60206e8c6ac609b4c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
/*
 * (C) Copyright 2000-2003
 * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
 *
 * SPDX-License-Identifier:    GPL-2.0+
 */
 
#include <common.h>
#include <status_led.h>
 
/*
 * The purpose of this code is to signal the operational status of a
 * target which usually boots over the network; while running in
 * U-Boot, a status LED is blinking. As soon as a valid BOOTP reply
 * message has been received, the LED is turned off. The Linux
 * kernel, once it is running, will start blinking the LED again,
 * with another frequency.
 */
 
/* ------------------------------------------------------------------------- */
 
typedef struct {
   led_id_t mask;
   int state;
   int period;
   int cnt;
} led_dev_t;
 
led_dev_t led_dev[] = {
   {    CONFIG_LED_STATUS_BIT,
       CONFIG_LED_STATUS_STATE,
       LED_STATUS_PERIOD,
       0,
   },
#if defined(CONFIG_LED_STATUS1)
   {    CONFIG_LED_STATUS_BIT1,
       CONFIG_LED_STATUS_STATE1,
       LED_STATUS_PERIOD1,
       0,
   },
#endif
#if defined(CONFIG_LED_STATUS2)
   {    CONFIG_LED_STATUS_BIT2,
       CONFIG_LED_STATUS_STATE2,
       LED_STATUS_PERIOD2,
       0,
   },
#endif
#if defined(CONFIG_LED_STATUS3)
   {    CONFIG_LED_STATUS_BIT3,
       CONFIG_LED_STATUS_STATE3,
       LED_STATUS_PERIOD3,
       0,
   },
#endif
#if defined(CONFIG_LED_STATUS4)
   {    CONFIG_LED_STATUS_BIT4,
       CONFIG_LED_STATUS_STATE4,
       LED_STATUS_PERIOD4,
       0,
   },
#endif
#if defined(CONFIG_LED_STATUS5)
   {    CONFIG_LED_STATUS_BIT5,
       CONFIG_LED_STATUS_STATE5,
       LED_STATUS_PERIOD5,
       0,
   },
#endif
};
 
#define MAX_LED_DEV    (sizeof(led_dev)/sizeof(led_dev_t))
 
static int status_led_init_done = 0;
 
void status_led_init(void)
{
   led_dev_t *ld;
   int i;
 
   for (i = 0, ld = led_dev; i < MAX_LED_DEV; i++, ld++)
       __led_init (ld->mask, ld->state);
   status_led_init_done = 1;
}
 
void status_led_tick (ulong timestamp)
{
   led_dev_t *ld;
   int i;
 
   if (!status_led_init_done)
       status_led_init ();
 
   for (i = 0, ld = led_dev; i < MAX_LED_DEV; i++, ld++) {
 
       if (ld->state != CONFIG_LED_STATUS_BLINKING)
           continue;
 
       if (++ld->cnt >= ld->period) {
           __led_toggle (ld->mask);
           ld->cnt -= ld->period;
       }
 
   }
}
 
void status_led_set (int led, int state)
{
   led_dev_t *ld;
 
   if (led < 0 || led >= MAX_LED_DEV)
       return;
 
   if (!status_led_init_done)
       status_led_init ();
 
   ld = &led_dev[led];
 
   ld->state = state;
   if (state == CONFIG_LED_STATUS_BLINKING) {
       ld->cnt = 0;        /* always start with full period    */
       state = CONFIG_LED_STATUS_ON;    /* always start with LED _ON_ */
   }
   __led_set (ld->mask, state);
}