Commit f1186497 authored by Paul PERONNARD's avatar Paul PERONNARD

ertm14: indicate BIST result with the front panel LED

parent 176b78b8
Pipeline #5157 passed with stage
in 4 minutes and 3 seconds
...@@ -433,6 +433,7 @@ int bist_summary( struct bist_stage *bist ) ...@@ -433,6 +433,7 @@ int bist_summary( struct bist_stage *bist )
else if (stat & BIST_STATUS_ERROR) else if (stat & BIST_STATUS_ERROR)
{ {
pp_printf("ERROR"); pp_printf("ERROR");
led_status_set(&board.leds.sync, LED_COLOR_2, i, i);
n_errors++; n_errors++;
} }
else else
...@@ -448,7 +449,11 @@ int bist_summary( struct bist_stage *bist ) ...@@ -448,7 +449,11 @@ int bist_summary( struct bist_stage *bist )
if( n_errors ) if( n_errors )
pp_printf("--------------------------------\nBIST FAILED with %d ERRORS!\n\n\n", n_errors ); pp_printf("--------------------------------\nBIST FAILED with %d ERRORS!\n\n\n", n_errors );
else else
{
led_status_set(&board.leds.sync, LED_COLOR_2, 0, 4);
led_status_set(&board.leds.sync, LED_COLOR_2, 1, 6);
pp_printf("BIST PASSED.\n"); pp_printf("BIST PASSED.\n");
}
return n_errors > 0 ? -1 : 0; return n_errors > 0 ? -1 : 0;
} }
...@@ -2531,6 +2536,8 @@ int wrc_board_early_init() ...@@ -2531,6 +2536,8 @@ int wrc_board_early_init()
timer_delay_ms(200); timer_delay_ms(200);
ep_enable( &wrc_endpoint_dev, 1, 1); ep_enable( &wrc_endpoint_dev, 1, 1);
timer_delay_ms(200); timer_delay_ms(200);
led_action( &board.leds.sync, LED_COLOR_2, LED_STATUS );
bist_summary( ertm_bist ); bist_summary( ertm_bist );
return ll; return ll;
...@@ -2847,17 +2854,17 @@ int ertm14_update_leds( void ) ...@@ -2847,17 +2854,17 @@ int ertm14_update_leds( void )
if( ptp_servo_state == WR_TRACK_PHASE && ptp_state == PPS_SLAVE ) if( ptp_servo_state == WR_TRACK_PHASE && ptp_state == PPS_SLAVE )
{ {
led_action( &board.leds.sync, LED_COLOR_1, LED_ON ); led_action( &board.leds.sync, LED_COLOR_1, LED_ON );
led_action( &board.leds.sync, LED_COLOR_2, LED_OFF ); //led_action( &board.leds.sync, LED_COLOR_2, LED_OFF );
} }
else if ( ptp_state == PPS_LISTENING || ptp_state == PPS_INITIALIZING ) else if ( ptp_state == PPS_LISTENING || ptp_state == PPS_INITIALIZING )
{ {
led_action( &board.leds.sync, LED_COLOR_1, LED_OFF ); led_action( &board.leds.sync, LED_COLOR_1, LED_OFF );
led_action( &board.leds.sync, LED_COLOR_2, LED_OFF ); //led_action( &board.leds.sync, LED_COLOR_2, LED_OFF );
} }
else if ( ptp_state == PPS_SLAVE ) else if ( ptp_state == PPS_SLAVE )
{ {
led_action( &board.leds.sync, LED_COLOR_1, LED_BLINK ); led_action( &board.leds.sync, LED_COLOR_1, LED_BLINK );
led_action( &board.leds.sync, LED_COLOR_2, LED_OFF ); //led_action( &board.leds.sync, LED_COLOR_2, LED_OFF );
} }
prev_ptp_servo_state = ptp_servo_state; prev_ptp_servo_state = ptp_servo_state;
......
...@@ -46,6 +46,13 @@ int led_create(struct led_device *led, struct gpio_pin *pin1, struct gpio_pin *p ...@@ -46,6 +46,13 @@ int led_create(struct led_device *led, struct gpio_pin *pin1, struct gpio_pin *p
led->type = type; led->type = type;
led->state[0] = default_state; led->state[0] = default_state;
led->state[1] = default_state; led->state[1] = default_state;
for (int ii = 0; ii < LED_STATUS_MAX; ii++)
{
led->status[0].blink_counters[ii] = 0;
led->status[0].nb_blinks[ii] = 0;
led->status[1].blink_counters[ii] = 0;
led->status[1].nb_blinks[ii] = 0;
}
return 0; return 0;
} }
...@@ -79,6 +86,51 @@ void leds_init() ...@@ -79,6 +86,51 @@ void leds_init()
leds[i] = NULL; leds[i] = NULL;
} }
static void led_status_update(struct led_device *led, int led_idx, int32_t t)
{
static int blink_index = 0;
static int v_prev = 0;
static int v_toggled = 0;
static int led_on = 0;
if( led->blink_period == 0 )
return;
if (0 == led->status[led_idx].nb_blinks[blink_index])
{
if (++blink_index == LED_STATUS_MAX)
blink_index = 0;
return;
}
t %= led->blink_period;
int v = t < led->blink_period_on ? 1 : 0;
if (v_prev != v){
v_toggled = 1;
}
v_prev = v;
if (v_toggled)
{
led_on = v;
v_toggled = 0;
if (led_on) led->status[led_idx].blink_counters[blink_index]++;
if (led->status[led_idx].blink_counters[blink_index] > led->status[led_idx].nb_blinks[blink_index])
{
led_on = 0;
}
// wait before going to the next status code
if (led->status[led_idx].blink_counters[blink_index] > led->status[led_idx].nb_blinks[blink_index] + 1)
{
led->status[led_idx].blink_counters[blink_index] = 0;
if (++blink_index == LED_STATUS_MAX)
blink_index = 0;
}
}
gen_gpio_out(led->pins[led_idx], led_on);
}
static void led_update_single(struct led_device *led) static void led_update_single(struct led_device *led)
{ {
int n = (led->type & 0xf) == LED_TYPE_DUAL_COLOR ? 2 : 1; int n = (led->type & 0xf) == LED_TYPE_DUAL_COLOR ? 2 : 1;
...@@ -118,15 +170,20 @@ static void led_update_single(struct led_device *led) ...@@ -118,15 +170,20 @@ static void led_update_single(struct led_device *led)
if( led->blink_period == 0 ) if( led->blink_period == 0 )
break; break;
t %= led->blink_period; t %= led->blink_period;
v = t < led->blink_period_on ? 1 : 0; v = t < led->blink_period_on ? 1 : 0;
if (led->type & LED_TYPE_INVERT) if (led->type & LED_TYPE_INVERT)
v = 1 - v; v = 1 - v;
gen_gpio_out(led->pins[i], v); gen_gpio_out(led->pins[i], v);
break; break;
} }
case LED_STATUS:
{
led_status_update(led, i, t);
break;
}
default: default:
break; break;
...@@ -141,4 +198,17 @@ void leds_update() ...@@ -141,4 +198,17 @@ void leds_update()
if (leds[i]) if (leds[i])
led_update_single(leds[i]); led_update_single(leds[i]);
} }
void led_status_set(struct led_device *led, uint8_t colors, uint8_t blink_index, uint8_t nb_blinks)
{
if (colors & LED_COLOR_1)
{
led->status[0].nb_blinks[blink_index] = nb_blinks;
}
if (colors & LED_COLOR_2)
{
led->status[1].nb_blinks[blink_index] = nb_blinks;
}
}
#endif /* BOARD_MAX_LEDS */ #endif /* BOARD_MAX_LEDS */
...@@ -35,15 +35,25 @@ struct gpio_pin; ...@@ -35,15 +35,25 @@ struct gpio_pin;
#define LED_BLINK 2 #define LED_BLINK 2
#define LED_BLINK_SINGLE (1<<4) #define LED_BLINK_SINGLE (1<<4)
#define LED_BLINK_SINGLE_NEGATIVE (1<<5) #define LED_BLINK_SINGLE_NEGATIVE (1<<5)
#define LED_STATUS (1<<6)
#define LED_COLOR_1 (1<<0) #define LED_COLOR_1 (1<<0)
#define LED_COLOR_2 (1<<1) #define LED_COLOR_2 (1<<1)
#define LED_COLOR_BOTH ( (1<<0)|(1<<1) ) #define LED_COLOR_BOTH ( (1<<0)|(1<<1) )
#define LED_STATUS_MAX 32
struct led_status
{
uint8_t blink_counters[LED_STATUS_MAX];
uint8_t nb_blinks[LED_STATUS_MAX];
};
struct led_device struct led_device
{ {
uint8_t type; uint8_t type;
uint8_t state[2]; uint8_t state[2];
struct led_status status[2];
uint8_t color; uint8_t color;
uint16_t blink_period_on; uint16_t blink_period_on;
uint16_t blink_period; uint16_t blink_period;
...@@ -51,7 +61,6 @@ struct led_device ...@@ -51,7 +61,6 @@ struct led_device
struct gpio_pin* pins[2]; struct gpio_pin* pins[2];
}; };
int led_create( struct led_device* led, struct gpio_pin* pin1, struct gpio_pin* pin2, int type, int default_state ); int led_create( struct led_device* led, struct gpio_pin* pin1, struct gpio_pin* pin2, int type, int default_state );
void led_action( struct led_device *led, int colors, int action ); void led_action( struct led_device *led, int colors, int action );
void led_set_blink_timing( struct led_device *led, int period, int period_on ); void led_set_blink_timing( struct led_device *led, int period, int period_on );
...@@ -59,4 +68,6 @@ void led_set_blink_timing( struct led_device *led, int period, int period_on ); ...@@ -59,4 +68,6 @@ void led_set_blink_timing( struct led_device *led, int period, int period_on );
void leds_init(void); void leds_init(void);
void leds_update(void); void leds_update(void);
void led_status_set(struct led_device *led, uint8_t led_color, uint8_t blink_index, uint8_t nb_blinks);
#endif #endif
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment