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 * 5*1a459660SWolfgang 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 56318c0b90SJean-Christophe PLAGNIOL-VILLARD }; 57318c0b90SJean-Christophe PLAGNIOL-VILLARD 58318c0b90SJean-Christophe PLAGNIOL-VILLARD #define MAX_LED_DEV (sizeof(led_dev)/sizeof(led_dev_t)) 59318c0b90SJean-Christophe PLAGNIOL-VILLARD 60318c0b90SJean-Christophe PLAGNIOL-VILLARD static int status_led_init_done = 0; 61318c0b90SJean-Christophe PLAGNIOL-VILLARD 62318c0b90SJean-Christophe PLAGNIOL-VILLARD static void status_led_init (void) 63318c0b90SJean-Christophe PLAGNIOL-VILLARD { 64318c0b90SJean-Christophe PLAGNIOL-VILLARD led_dev_t *ld; 65318c0b90SJean-Christophe PLAGNIOL-VILLARD int i; 66318c0b90SJean-Christophe PLAGNIOL-VILLARD 67318c0b90SJean-Christophe PLAGNIOL-VILLARD for (i = 0, ld = led_dev; i < MAX_LED_DEV; i++, ld++) 68318c0b90SJean-Christophe PLAGNIOL-VILLARD __led_init (ld->mask, ld->state); 69318c0b90SJean-Christophe PLAGNIOL-VILLARD status_led_init_done = 1; 70318c0b90SJean-Christophe PLAGNIOL-VILLARD } 71318c0b90SJean-Christophe PLAGNIOL-VILLARD 72318c0b90SJean-Christophe PLAGNIOL-VILLARD void status_led_tick (ulong timestamp) 73318c0b90SJean-Christophe PLAGNIOL-VILLARD { 74318c0b90SJean-Christophe PLAGNIOL-VILLARD led_dev_t *ld; 75318c0b90SJean-Christophe PLAGNIOL-VILLARD int i; 76318c0b90SJean-Christophe PLAGNIOL-VILLARD 77318c0b90SJean-Christophe PLAGNIOL-VILLARD if (!status_led_init_done) 78318c0b90SJean-Christophe PLAGNIOL-VILLARD status_led_init (); 79318c0b90SJean-Christophe PLAGNIOL-VILLARD 80318c0b90SJean-Christophe PLAGNIOL-VILLARD for (i = 0, ld = led_dev; i < MAX_LED_DEV; i++, ld++) { 81318c0b90SJean-Christophe PLAGNIOL-VILLARD 82318c0b90SJean-Christophe PLAGNIOL-VILLARD if (ld->state != STATUS_LED_BLINKING) 83318c0b90SJean-Christophe PLAGNIOL-VILLARD continue; 84318c0b90SJean-Christophe PLAGNIOL-VILLARD 85318c0b90SJean-Christophe PLAGNIOL-VILLARD if (++ld->cnt >= ld->period) { 86318c0b90SJean-Christophe PLAGNIOL-VILLARD __led_toggle (ld->mask); 87318c0b90SJean-Christophe PLAGNIOL-VILLARD ld->cnt -= ld->period; 88318c0b90SJean-Christophe PLAGNIOL-VILLARD } 89318c0b90SJean-Christophe PLAGNIOL-VILLARD 90318c0b90SJean-Christophe PLAGNIOL-VILLARD } 91318c0b90SJean-Christophe PLAGNIOL-VILLARD } 92318c0b90SJean-Christophe PLAGNIOL-VILLARD 93318c0b90SJean-Christophe PLAGNIOL-VILLARD void status_led_set (int led, int state) 94318c0b90SJean-Christophe PLAGNIOL-VILLARD { 95318c0b90SJean-Christophe PLAGNIOL-VILLARD led_dev_t *ld; 96318c0b90SJean-Christophe PLAGNIOL-VILLARD 97318c0b90SJean-Christophe PLAGNIOL-VILLARD if (led < 0 || led >= MAX_LED_DEV) 98318c0b90SJean-Christophe PLAGNIOL-VILLARD return; 99318c0b90SJean-Christophe PLAGNIOL-VILLARD 100318c0b90SJean-Christophe PLAGNIOL-VILLARD if (!status_led_init_done) 101318c0b90SJean-Christophe PLAGNIOL-VILLARD status_led_init (); 102318c0b90SJean-Christophe PLAGNIOL-VILLARD 103318c0b90SJean-Christophe PLAGNIOL-VILLARD ld = &led_dev[led]; 104318c0b90SJean-Christophe PLAGNIOL-VILLARD 105318c0b90SJean-Christophe PLAGNIOL-VILLARD ld->state = state; 106318c0b90SJean-Christophe PLAGNIOL-VILLARD if (state == STATUS_LED_BLINKING) { 107318c0b90SJean-Christophe PLAGNIOL-VILLARD ld->cnt = 0; /* always start with full period */ 108318c0b90SJean-Christophe PLAGNIOL-VILLARD state = STATUS_LED_ON; /* always start with LED _ON_ */ 109318c0b90SJean-Christophe PLAGNIOL-VILLARD } 110318c0b90SJean-Christophe PLAGNIOL-VILLARD __led_set (ld->mask, state); 111318c0b90SJean-Christophe PLAGNIOL-VILLARD } 112