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