From cdcc14e74ff4eafe7155fcccf53df971ae5e6260 Mon Sep 17 00:00:00 2001 From: Augusto Fraga Giachero Date: Tue, 4 Feb 2025 08:06:53 -0300 Subject: [PATCH 1/3] Print debug information before turning off payload power [afcv4.0] --- port/board/afc-v4/payload.c | 1 + 1 file changed, 1 insertion(+) diff --git a/port/board/afc-v4/payload.c b/port/board/afc-v4/payload.c index 6f75200a0..98684b423 100644 --- a/port/board/afc-v4/payload.c +++ b/port/board/afc-v4/payload.c @@ -411,6 +411,7 @@ void vTaskPayload( void *pvParameters ) case PAYLOAD_FPGA_ON: if ( QUIESCED_req == 1 || PP_good == 0 || DCDC_good == 0 ) { + printf("QUIESCED_req = %d, PP_good = %d, DCDC_good = %d\n", QUIESCED_req, PP_good, DCDC_good); new_state = PAYLOAD_SWITCHING_OFF; } break; From ffac65524055fc7b1e43512e6de1e0bae359b1e2 Mon Sep 17 00:00:00 2001 From: Augusto Fraga Giachero Date: Mon, 17 Feb 2025 14:33:17 -0300 Subject: [PATCH 2/3] Print Payload Power ADC voltage measurement [afcv4.0] --- port/board/afc-v4/payload.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/port/board/afc-v4/payload.c b/port/board/afc-v4/payload.c index 98684b423..60ffc253f 100644 --- a/port/board/afc-v4/payload.c +++ b/port/board/afc-v4/payload.c @@ -46,6 +46,7 @@ #include "eeprom_24xx02.h" #include "i2c_mapping.h" #include "pin_mapping.h" +#include /* payload states * 0 - No power @@ -150,7 +151,7 @@ static void check_fpga_reset( void ) last_state = cur_state; } -uint8_t payload_check_pgood() +uint8_t payload_check_pgood(uint16_t* adc_readout) { /* Threshold set to ~8V */ const uint16_t PAYLOAD_THRESHOLD = 0x9B2; @@ -162,6 +163,7 @@ uint8_t payload_check_pgood() while (Chip_ADC_ReadStatus(LPC_ADC, ADC_CH1, ADC_DR_DONE_STAT) != SET) {} /* Read ADC value */ Chip_ADC_ReadValue(LPC_ADC, ADC_CH1, &dataADC); + *adc_readout = dataADC; if (dataADC > PAYLOAD_THRESHOLD){ return 1; @@ -309,6 +311,8 @@ void vTaskPayload( void *pvParameters ) TickType_t xLastWakeTime; mmc_err err; + uint16_t pp_adc_val; + xLastWakeTime = xTaskGetTickCount(); for ( ;; ) { @@ -358,7 +362,7 @@ void vTaskPayload( void *pvParameters ) xEventGroupClearBits(amc_payload_evt, PAYLOAD_MESSAGE_REBOOT | PAYLOAD_MESSAGE_WARM_RST); } - PP_good = payload_check_pgood(); + PP_good = payload_check_pgood(&pp_adc_val); DCDC_good = gpio_read_pin(PIN_PORT(GPIO_PGOOD_P1V0), PIN_NUMBER(GPIO_PGOOD_P1V0)); switch(state) { @@ -412,6 +416,7 @@ void vTaskPayload( void *pvParameters ) case PAYLOAD_FPGA_ON: if ( QUIESCED_req == 1 || PP_good == 0 || DCDC_good == 0 ) { printf("QUIESCED_req = %d, PP_good = %d, DCDC_good = %d\n", QUIESCED_req, PP_good, DCDC_good); + printf("Payload power ADC value %u\n", pp_adc_val); new_state = PAYLOAD_SWITCHING_OFF; } break; From 29cb5cc9867e554f66a0175ae2d239b03c18c411 Mon Sep 17 00:00:00 2001 From: Augusto Fraga Giachero Date: Mon, 7 Apr 2025 10:23:33 -0300 Subject: [PATCH 3/3] Check payload power voltage twice before updating pp_good [afcv4.0] We observed that a specific AFCv4.0 card suffers a loss of power in the payload power rails event though the MCH indicates that the card is in M4 state. It seems that the MMC detects a voltage dip in the 12V power rail and turns off the DC/DC converters, but we suspect it is a false reading. This is a workaround to try avoiding turning off the payload power if the AMC +12V voltage measurement dips below 8V for a single measurement. --- port/board/afc-v4/payload.c | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/port/board/afc-v4/payload.c b/port/board/afc-v4/payload.c index 60ffc253f..83c0438c1 100644 --- a/port/board/afc-v4/payload.c +++ b/port/board/afc-v4/payload.c @@ -298,7 +298,8 @@ void vTaskPayload( void *pvParameters ) uint8_t new_state = -1; /* Payload power good flag */ - uint8_t PP_good = 0; + uint8_t pp_good = 0; + uint8_t last_pp_goods[2] = {0, 0}; /* Payload DCDCs good flag */ uint8_t DCDC_good = 0; @@ -362,13 +363,19 @@ void vTaskPayload( void *pvParameters ) xEventGroupClearBits(amc_payload_evt, PAYLOAD_MESSAGE_REBOOT | PAYLOAD_MESSAGE_WARM_RST); } - PP_good = payload_check_pgood(&pp_adc_val); + last_pp_goods[1] = last_pp_goods[0]; + last_pp_goods[0] = payload_check_pgood(&pp_adc_val); + + if (last_pp_goods[0] == last_pp_goods[1]) { + pp_good = last_pp_goods[0]; + } + DCDC_good = gpio_read_pin(PIN_PORT(GPIO_PGOOD_P1V0), PIN_NUMBER(GPIO_PGOOD_P1V0)); switch(state) { case PAYLOAD_NO_POWER: - if (PP_good) { + if (pp_good) { new_state = PAYLOAD_POWER_GOOD_WAIT; } break; @@ -383,7 +390,7 @@ void vTaskPayload( void *pvParameters ) hotswap_clear_mask_bit( HOTSWAP_AMC, HOTSWAP_BACKEND_PWR_SHUTDOWN_MASK ); hotswap_clear_mask_bit( HOTSWAP_AMC, HOTSWAP_BACKEND_PWR_FAILURE_MASK ); - if ( QUIESCED_req || ( PP_good == 0 ) ) { + if ( QUIESCED_req || ( pp_good == 0 ) ) { new_state = PAYLOAD_SWITCHING_OFF; } else if ( DCDC_good == 1 ) { new_state = PAYLOAD_STATE_FPGA_SETUP; @@ -414,9 +421,12 @@ void vTaskPayload( void *pvParameters ) break; case PAYLOAD_FPGA_ON: - if ( QUIESCED_req == 1 || PP_good == 0 || DCDC_good == 0 ) { - printf("QUIESCED_req = %d, PP_good = %d, DCDC_good = %d\n", QUIESCED_req, PP_good, DCDC_good); + if (last_pp_goods[0] == 0) { printf("Payload power ADC value %u\n", pp_adc_val); + } + + if ( QUIESCED_req == 1 || pp_good == 0 || DCDC_good == 0 ) { + printf("QUIESCED_req = %d, pp_good = %d, DCDC_good = %d\n", QUIESCED_req, pp_good, DCDC_good); new_state = PAYLOAD_SWITCHING_OFF; } break; @@ -447,7 +457,7 @@ void vTaskPayload( void *pvParameters ) case PAYLOAD_QUIESCED: /* Wait until power goes down to restart the cycle */ - if (PP_good == 0 && DCDC_good == 0) { + if (pp_good == 0 && DCDC_good == 0) { new_state = PAYLOAD_NO_POWER; } break;