From aab03bc4b6ab02be7db3fd60f034a84d79ad93b4 Mon Sep 17 00:00:00 2001 From: Radek Date: Wed, 6 Nov 2024 16:09:42 +0000 Subject: [PATCH 01/16] Make can_print.py work on a all busses (#2070) * Enable CAN3 printer (#1991) again (cherry picked from commit 2b94e4fef710a22313b99d8c5b723d8db5e9c8bd) * print messages with same address but on different bus --- board/jungle/scripts/can_printer.py | 18 +++++++++++------- tests/can_printer.py | 18 +++++++++++------- 2 files changed, 22 insertions(+), 14 deletions(-) diff --git a/board/jungle/scripts/can_printer.py b/board/jungle/scripts/can_printer.py index 05cc802aa6..292421a5c6 100755 --- a/board/jungle/scripts/can_printer.py +++ b/board/jungle/scripts/can_printer.py @@ -19,20 +19,24 @@ def can_printer(): start = sec_since_boot() lp = sec_since_boot() - msgs = defaultdict(list) + all_msgs = defaultdict(list) + canbus = os.getenv("CAN") + if canbus == "3": + p.set_obd(True) + canbus = "1" + while True: can_recv = p.can_recv() - for address,dat, src in can_recv: - if canbus is None or str(src) == canbus: - msgs[address].append((dat, src)) + for addr, dat, bus in can_recv: + if canbus is None or str(bus) == canbus: + all_msgs[(addr, bus)].append((dat)) if sec_since_boot() - lp > 0.1: dd = chr(27) + "[2J" dd += "%5.2f\n" % (sec_since_boot() - start) - for k, v in sorted(msgs.items()): - last_msg, last_src = v[-1] - dd += "%d: %s(%6d): %s\n" % (last_src, "%04X(%4d)" % (k, k), len(v), binascii.hexlify(last_msg).decode()) + for (addr, bus), dat_log in sorted(all_msgs.items()): + dd += "%d: %s(%6d): %s\n" % (bus, "%04X(%4d)" % (addr, addr), len(dat_log), binascii.hexlify(dat_log[-1]).decode()) print(dd) lp = sec_since_boot() diff --git a/tests/can_printer.py b/tests/can_printer.py index 791f8e75dc..404bc9dcf7 100755 --- a/tests/can_printer.py +++ b/tests/can_printer.py @@ -20,20 +20,24 @@ def can_printer(): start = sec_since_boot() lp = sec_since_boot() - msgs = defaultdict(list) + all_msgs = defaultdict(list) + canbus = os.getenv("CAN") + if canbus == "3": + p.set_obd(True) + canbus = "1" + while True: can_recv = p.can_recv() - for address, dat, src in can_recv: - if canbus is None or str(src) == canbus: - msgs[address].append((dat, src)) + for addr, dat, bus in can_recv: + if canbus is None or str(bus) == canbus: + all_msgs[(addr, bus)].append((dat)) if sec_since_boot() - lp > 0.1: dd = chr(27) + "[2J" dd += "%5.2f\n" % (sec_since_boot() - start) - for k, v in sorted(msgs.items()): - last_msg, last_src = v[-1] - dd += "%d: %s(%6d): %s\n" % (last_src, "%04X(%4d)" % (k, k), len(v), binascii.hexlify(last_msg).decode()) + for (addr, bus), dat_log in sorted(all_msgs.items()): + dd += "%d: %s(%6d): %s\n" % (bus, "%04X(%4d)" % (addr, addr), len(dat_log), binascii.hexlify(dat_log[-1]).decode()) print(dd) lp = sec_since_boot() From ae4f753582c1034f09e690a70912030c858644f2 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Thu, 7 Nov 2024 16:55:30 -0800 Subject: [PATCH 02/16] spi: add helper for getting bootloader ID (#2074) * spi: add helper for getting bootloader ID * fix mypy --------- Co-authored-by: Comma Device --- python/spi.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/python/spi.py b/python/spi.py index a6832beaed..5be1e56b6b 100644 --- a/python/spi.py +++ b/python/spi.py @@ -397,6 +397,9 @@ def read(self, address: int, length: int): data = [struct.pack('>I', address), struct.pack('B', length - 1)] return self._cmd(0x11, data=data, read_bytes=length) + def get_bootloader_id(self): + return self.read(0x1FF1E7FE, 1) + def get_chip_id(self) -> int: r = self._cmd(0x02, read_bytes=3) assert r[0] == 1 # response length - 1 From dec9223f9726e400e4a4eb91ca19fffcd745f97a Mon Sep 17 00:00:00 2001 From: Robbe Derks Date: Wed, 13 Nov 2024 16:09:13 +0100 Subject: [PATCH 03/16] cuatro sound (#1861) * fake siren works * this receives something * microphone in SAI1 POC * this receives audio again * double buffer DMA? * RX DMA works * wip * needs cleanup, but this plays * cleanup of playback * print mic * deal with stereo in * the DMA from SAI1 -> SAI4 doesn't work yet * this puts mic data in a buf * this gets sound to the 845 * wip: still garbage from the mic * inefficient, but it does record the mic * sine isn't used * comment out mic for now * fix misra * remove mic * more cleanup * add amp enable/disable * no more debug * newline --------- Co-authored-by: Comma Device --- board/boards/black.h | 3 +- board/boards/board_declarations.h | 2 + board/boards/cuatro.h | 18 +++++- board/boards/dos.h | 3 +- board/boards/grey.h | 3 +- board/boards/red.h | 3 +- board/boards/tres.h | 3 +- board/boards/uno.h | 3 +- board/boards/unused_funcs.h | 4 ++ board/boards/white.h | 3 +- board/faults_declarations.h | 1 + board/main.c | 1 + board/stm32f4/board.h | 3 + board/stm32h7/board.h | 1 + board/stm32h7/peripherals.h | 6 +- board/stm32h7/sound.h | 95 +++++++++++++++++++++++++++++++ 16 files changed, 143 insertions(+), 9 deletions(-) create mode 100644 board/stm32h7/sound.h diff --git a/board/boards/black.h b/board/boards/black.h index 45e0126cc4..133c11fb2d 100644 --- a/board/boards/black.h +++ b/board/boards/black.h @@ -182,5 +182,6 @@ board board_black = { .set_fan_enabled = unused_set_fan_enabled, .set_ir_power = unused_set_ir_power, .set_siren = unused_set_siren, - .read_som_gpio = unused_read_som_gpio + .read_som_gpio = unused_read_som_gpio, + .set_amp_enabled = unused_set_amp_enabled }; diff --git a/board/boards/board_declarations.h b/board/boards/board_declarations.h index dbb29ffb79..61e9ce2d8e 100644 --- a/board/boards/board_declarations.h +++ b/board/boards/board_declarations.h @@ -24,6 +24,7 @@ typedef void (*board_set_fan_enabled)(bool enabled); typedef void (*board_set_siren)(bool enabled); typedef void (*board_set_bootkick)(BootState state); typedef bool (*board_read_som_gpio)(void); +typedef void (*board_set_amp_enabled)(bool enabled); struct board { harness_configuration *harness_config; @@ -49,6 +50,7 @@ struct board { board_set_siren set_siren; board_set_bootkick set_bootkick; board_read_som_gpio read_som_gpio; + board_set_amp_enabled set_amp_enabled; }; // ******************* Definitions ******************** diff --git a/board/boards/cuatro.h b/board/boards/cuatro.h index 545f87da8b..4a6b5da096 100644 --- a/board/boards/cuatro.h +++ b/board/boards/cuatro.h @@ -75,6 +75,10 @@ static void cuatro_set_siren(bool enabled){ beeper_enable(enabled); } +static void cuatro_set_amp_enabled(bool enabled){ + set_gpio_output(GPIOA, 5, enabled); +} + static void cuatro_init(void) { red_chiplet_init(); @@ -128,6 +132,17 @@ static void cuatro_init(void) { // Beeper set_gpio_alternate(GPIOD, 14, GPIO_AF2_TIM4); beeper_init(); + + // Sound codec + cuatro_set_amp_enabled(false); + set_gpio_alternate(GPIOA, 2, GPIO_AF8_SAI4); // SAI4_SCK_B + set_gpio_alternate(GPIOC, 0, GPIO_AF8_SAI4); // SAI4_FS_B + set_gpio_alternate(GPIOD, 11, GPIO_AF10_SAI4); // SAI4_SD_A + set_gpio_alternate(GPIOE, 3, GPIO_AF8_SAI4); // SAI4_SD_B + set_gpio_alternate(GPIOE, 4, GPIO_AF2_SAI1); // SAI1_D2 + set_gpio_alternate(GPIOE, 5, GPIO_AF2_SAI1); // SAI1_CK2 + set_gpio_alternate(GPIOE, 6, GPIO_AF10_SAI4); // SAI4_MCLK_B + sound_init(); } board board_cuatro = { @@ -153,5 +168,6 @@ board board_cuatro = { .set_ir_power = tres_set_ir_power, .set_siren = cuatro_set_siren, .set_bootkick = cuatro_set_bootkick, - .read_som_gpio = tres_read_som_gpio + .read_som_gpio = tres_read_som_gpio, + .set_amp_enabled = cuatro_set_amp_enabled }; diff --git a/board/boards/dos.h b/board/boards/dos.h index 2c2fd5d4d6..d96cee4ca4 100644 --- a/board/boards/dos.h +++ b/board/boards/dos.h @@ -211,5 +211,6 @@ board board_dos = { .set_ir_power = dos_set_ir_power, .set_siren = dos_set_siren, .set_bootkick = dos_set_bootkick, - .read_som_gpio = dos_read_som_gpio + .read_som_gpio = dos_read_som_gpio, + .set_amp_enabled = unused_set_amp_enabled }; diff --git a/board/boards/grey.h b/board/boards/grey.h index c5c5321f6e..b3e40bc6fe 100644 --- a/board/boards/grey.h +++ b/board/boards/grey.h @@ -31,5 +31,6 @@ board board_grey = { .set_fan_enabled = unused_set_fan_enabled, .set_ir_power = unused_set_ir_power, .set_siren = unused_set_siren, - .read_som_gpio = unused_read_som_gpio + .read_som_gpio = unused_read_som_gpio, + .set_amp_enabled = unused_set_amp_enabled }; diff --git a/board/boards/red.h b/board/boards/red.h index ac062772f0..f1d8d9c44b 100644 --- a/board/boards/red.h +++ b/board/boards/red.h @@ -194,5 +194,6 @@ board board_red = { .set_fan_enabled = unused_set_fan_enabled, .set_ir_power = unused_set_ir_power, .set_siren = unused_set_siren, - .read_som_gpio = unused_read_som_gpio + .read_som_gpio = unused_read_som_gpio, + .set_amp_enabled = unused_set_amp_enabled }; diff --git a/board/boards/tres.h b/board/boards/tres.h index 1e5c8fe0ea..f0602ae60b 100644 --- a/board/boards/tres.h +++ b/board/boards/tres.h @@ -97,5 +97,6 @@ board board_tres = { .set_ir_power = tres_set_ir_power, .set_siren = fake_siren_set, .set_bootkick = tres_set_bootkick, - .read_som_gpio = tres_read_som_gpio + .read_som_gpio = tres_read_som_gpio, + .set_amp_enabled = unused_set_amp_enabled }; diff --git a/board/boards/uno.h b/board/boards/uno.h index 2e74c249dc..d1728f1f9f 100644 --- a/board/boards/uno.h +++ b/board/boards/uno.h @@ -218,5 +218,6 @@ board board_uno = { .set_ir_power = uno_set_ir_power, .set_siren = unused_set_siren, .set_bootkick = uno_set_bootkick, - .read_som_gpio = unused_read_som_gpio + .read_som_gpio = unused_read_som_gpio, + .set_amp_enabled = unused_set_amp_enabled }; diff --git a/board/boards/unused_funcs.h b/board/boards/unused_funcs.h index e9c18c76a3..588cf63654 100644 --- a/board/boards/unused_funcs.h +++ b/board/boards/unused_funcs.h @@ -26,3 +26,7 @@ void unused_set_bootkick(BootState state) { bool unused_read_som_gpio(void) { return false; } + +void unused_set_amp_enabled(bool enabled) { + UNUSED(enabled); +} diff --git a/board/boards/white.h b/board/boards/white.h index 2ef8de27a4..c4a2559353 100644 --- a/board/boards/white.h +++ b/board/boards/white.h @@ -211,5 +211,6 @@ board board_white = { .set_fan_enabled = unused_set_fan_enabled, .set_ir_power = unused_set_ir_power, .set_siren = unused_set_siren, - .read_som_gpio = unused_read_som_gpio + .read_som_gpio = unused_read_som_gpio, + .set_amp_enabled = unused_set_amp_enabled }; diff --git a/board/faults_declarations.h b/board/faults_declarations.h index 4ef03087ba..eab9fcc08b 100644 --- a/board/faults_declarations.h +++ b/board/faults_declarations.h @@ -32,6 +32,7 @@ #define FAULT_INTERRUPT_RATE_UART_7 (1UL << 24) #define FAULT_SIREN_MALFUNCTION (1UL << 25) #define FAULT_HEARTBEAT_LOOP_WATCHDOG (1UL << 26) +#define FAULT_INTERRUPT_RATE_SOUND_DMA (1UL << 27) // Permanent faults #define PERMANENT_FAULTS 0U diff --git a/board/main.c b/board/main.c index 0c2e9575fb..b1dc685417 100644 --- a/board/main.c +++ b/board/main.c @@ -158,6 +158,7 @@ static void tick_handler(void) { usb_tick(); harness_tick(); simple_watchdog_kick(); + sound_tick(); // re-init everything that uses harness status if (harness.status != prev_harness_status) { diff --git a/board/stm32f4/board.h b/board/stm32f4/board.h index bf95d58eaa..0cbaae6025 100644 --- a/board/stm32f4/board.h +++ b/board/stm32f4/board.h @@ -16,6 +16,9 @@ #include "boards/uno.h" #include "boards/dos.h" +// Unused functions on F4 +void sound_tick(void) {} + void detect_board_type(void) { // SPI lines floating: white (TODO: is this reliable? Not really, we have to enable ESP/GPS to be able to detect this on the UART) set_gpio_output(GPIOC, 14, 1); diff --git a/board/stm32h7/board.h b/board/stm32h7/board.h index 6fbadcb633..ea4812245e 100644 --- a/board/stm32h7/board.h +++ b/board/stm32h7/board.h @@ -12,6 +12,7 @@ #include "stm32h7/lldac.h" #include "drivers/beeper.h" #include "drivers/fake_siren.h" +#include "stm32h7/sound.h" #include "drivers/clock_source.h" #include "boards/red.h" #include "boards/red_chiplet.h" diff --git a/board/stm32h7/peripherals.h b/board/stm32h7/peripherals.h index 8b1cae2a68..f0bd727fdf 100644 --- a/board/stm32h7/peripherals.h +++ b/board/stm32h7/peripherals.h @@ -101,13 +101,14 @@ void peripherals_init(void) { RCC->AHB4ENR |= RCC_AHB4ENR_GPIOFEN; RCC->AHB4ENR |= RCC_AHB4ENR_GPIOGEN; - // Enable CPU access to SRAM1 and SRAM2 (in domain D2) for DMA + // Enable CPU access to SRAMs for DMA RCC->AHB2ENR |= RCC_AHB2ENR_SRAM1EN | RCC_AHB2ENR_SRAM2EN; // Supplemental RCC->AHB1ENR |= RCC_AHB1ENR_DMA1EN; // DAC DMA RCC->AHB1ENR |= RCC_AHB1ENR_DMA2EN; // SPI DMA RCC->APB4ENR |= RCC_APB4ENR_SYSCFGEN; + RCC->AHB4ENR |= RCC_AHB4ENR_BDMAEN; // Audio DMA // Connectivity RCC->APB2ENR |= RCC_APB2ENR_SPI4EN; // SPI @@ -122,6 +123,9 @@ void peripherals_init(void) { RCC->AHB1ENR |= RCC_AHB1ENR_ADC12EN; // Enable ADC12 clocks RCC->APB1LENR |= RCC_APB1LENR_DAC12EN; // DAC + // Audio + RCC->APB4ENR |= RCC_APB4ENR_SAI4EN; // SAI4 + // Timers RCC->APB2ENR |= RCC_APB2ENR_TIM1EN; // clock source timer RCC->APB1LENR |= RCC_APB1LENR_TIM2EN; // main counter diff --git a/board/stm32h7/sound.h b/board/stm32h7/sound.h new file mode 100644 index 0000000000..9228b16134 --- /dev/null +++ b/board/stm32h7/sound.h @@ -0,0 +1,95 @@ + +#define SOUND_RX_BUF_SIZE 2000U +#define SOUND_TX_BUF_SIZE (SOUND_RX_BUF_SIZE/2U) + +__attribute__((section(".sram4"))) static uint16_t sound_rx_buf[2][SOUND_RX_BUF_SIZE]; + +typedef enum { + OFF = 0, + IDLE = 1, + PLAYING = 2, +} SoundStatus; +static SoundStatus sound_status = OFF; + +// Playback processing +static void BDMA_Channel0_IRQ_Handler(void) { + __attribute__((section(".sram4"))) static uint16_t tx_buf[SOUND_TX_BUF_SIZE]; + + BDMA->IFCR |= BDMA_IFCR_CGIF0; // clear flag + + // process samples (shift to 12b and bias to be unsigned) + // since we are playing mono and receiving stereo, we take every other sample + uint8_t buf_idx = (((BDMA_Channel0->CCR & BDMA_CCR_CT) >> BDMA_CCR_CT_Pos) == 1U) ? 0U : 1U; + for (uint16_t i=0U; i < SOUND_RX_BUF_SIZE; i += 2U) { + tx_buf[i/2U] = ((sound_rx_buf[buf_idx][i] + (1UL << 14)) >> 3); + } + + if (sound_status == OFF) { + current_board->set_amp_enabled(true); + } + sound_status = PLAYING; + + DMA1->LIFCR |= 0xF40; + DMA1_Stream1->CR &= ~DMA_SxCR_EN; + register_set(&DMA1_Stream1->M0AR, (uint32_t) tx_buf, 0xFFFFFFFFU); + DMA1_Stream1->NDTR = SOUND_TX_BUF_SIZE; + DMA1_Stream1->CR |= DMA_SxCR_EN; +} + +void sound_tick(void) { + switch (sound_status) { + case IDLE: + current_board->set_amp_enabled(false); + sound_status = OFF; + break; + case PLAYING: + sound_status = IDLE; + break; + default: + break; + } +} + +void sound_init(void) { + REGISTER_INTERRUPT(BDMA_Channel0_IRQn, BDMA_Channel0_IRQ_Handler, 64U, FAULT_INTERRUPT_RATE_SOUND_DMA) + + // Init DAC + register_set(&DAC1->MCR, 0U, 0xFFFFFFFFU); + register_set(&DAC1->CR, DAC_CR_TEN1 | (6U << DAC_CR_TSEL1_Pos) | DAC_CR_DMAEN1, 0xFFFFFFFFU); + register_set_bits(&DAC1->CR, DAC_CR_EN1); + + // Setup DMAMUX (DAC_CH1_DMA as input) + register_set(&DMAMUX1_Channel1->CCR, 67U, DMAMUX_CxCR_DMAREQ_ID_Msk); + + // Setup DMA + register_set(&DMA1_Stream1->PAR, (uint32_t) &(DAC1->DHR12R1), 0xFFFFFFFFU); + register_set(&DMA1_Stream1->FCR, 0U, 0x00000083U); + DMA1_Stream1->CR = (0b11UL << DMA_SxCR_PL_Pos) | (0b01UL << DMA_SxCR_MSIZE_Pos) | (0b01UL << DMA_SxCR_PSIZE_Pos) | DMA_SxCR_MINC | (1U << DMA_SxCR_DIR_Pos); + + // Init trigger timer (48kHz) + register_set(&TIM7->PSC, 0U, 0xFFFFU); + register_set(&TIM7->ARR, 2494U, 0xFFFFU); + register_set(&TIM7->CR2, (0b10U << TIM_CR2_MMS_Pos), TIM_CR2_MMS_Msk); + register_set(&TIM7->CR1, TIM_CR1_ARPE | TIM_CR1_URS, 0x088EU); + TIM7->SR = 0U; + TIM7->CR1 |= TIM_CR1_CEN; + + // stereo audio in + register_set(&SAI4_Block_B->CR1, SAI_xCR1_DMAEN | (0b00UL << SAI_xCR1_SYNCEN_Pos) | (0b100U << SAI_xCR1_DS_Pos) | (0b11U << SAI_xCR1_MODE_Pos), 0x0FFB3FEFU); + register_set(&SAI4_Block_B->CR2, (0b001U << SAI_xCR2_FTH_Pos), 0xFFFBU); + register_set(&SAI4_Block_B->FRCR, (31U << SAI_xFRCR_FRL_Pos), 0x7FFFFU); + register_set(&SAI4_Block_B->SLOTR, (0b11UL << SAI_xSLOTR_SLOTEN_Pos) | (1UL << SAI_xSLOTR_NBSLOT_Pos) | (0b01UL << SAI_xSLOTR_SLOTSZ_Pos), 0xFFFF0FDFU); // NBSLOT definition is vague + + // init sound DMA (SAI4_B -> memory, double buffers) + register_set(&BDMA_Channel0->CPAR, (uint32_t) &(SAI4_Block_B->DR), 0xFFFFFFFFU); + register_set(&BDMA_Channel0->CM0AR, (uint32_t) sound_rx_buf[0], 0xFFFFFFFFU); + register_set(&BDMA_Channel0->CM1AR, (uint32_t) sound_rx_buf[1], 0xFFFFFFFFU); + BDMA_Channel0->CNDTR = SOUND_RX_BUF_SIZE; + register_set(&BDMA_Channel0->CCR, BDMA_CCR_DBM | (0b01UL << BDMA_CCR_MSIZE_Pos) | (0b01UL << BDMA_CCR_PSIZE_Pos) | BDMA_CCR_MINC | BDMA_CCR_CIRC | BDMA_CCR_TCIE, 0xFFFFU); + register_set(&DMAMUX2_Channel0->CCR, 16U, DMAMUX_CxCR_DMAREQ_ID_Msk); // SAI4_B_DMA + register_set_bits(&BDMA_Channel0->CCR, BDMA_CCR_EN); + + // enable all initted blocks + register_set_bits(&SAI4_Block_B->CR1, SAI_xCR1_SAIEN); + NVIC_EnableIRQ(BDMA_Channel0_IRQn); +} From 39c966fb271ebe3cd589272c0fb3a45eb0c54280 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Thu, 14 Nov 2024 01:04:59 -0800 Subject: [PATCH 04/16] sound: little cleaner idle handling (#2078) Co-authored-by: Comma Device --- board/stm32h7/sound.h | 25 +++++++------------------ 1 file changed, 7 insertions(+), 18 deletions(-) diff --git a/board/stm32h7/sound.h b/board/stm32h7/sound.h index 9228b16134..53f7276bde 100644 --- a/board/stm32h7/sound.h +++ b/board/stm32h7/sound.h @@ -1,15 +1,9 @@ - #define SOUND_RX_BUF_SIZE 2000U #define SOUND_TX_BUF_SIZE (SOUND_RX_BUF_SIZE/2U) __attribute__((section(".sram4"))) static uint16_t sound_rx_buf[2][SOUND_RX_BUF_SIZE]; -typedef enum { - OFF = 0, - IDLE = 1, - PLAYING = 2, -} SoundStatus; -static SoundStatus sound_status = OFF; +static uint8_t sound_idle_count; // Playback processing static void BDMA_Channel0_IRQ_Handler(void) { @@ -24,10 +18,10 @@ static void BDMA_Channel0_IRQ_Handler(void) { tx_buf[i/2U] = ((sound_rx_buf[buf_idx][i] + (1UL << 14)) >> 3); } - if (sound_status == OFF) { + if (sound_idle_count == 0U) { current_board->set_amp_enabled(true); } - sound_status = PLAYING; + sound_idle_count = 2U; DMA1->LIFCR |= 0xF40; DMA1_Stream1->CR &= ~DMA_SxCR_EN; @@ -37,16 +31,11 @@ static void BDMA_Channel0_IRQ_Handler(void) { } void sound_tick(void) { - switch (sound_status) { - case IDLE: + if (sound_idle_count > 0U) { + sound_idle_count--; + if (sound_idle_count == 0U) { current_board->set_amp_enabled(false); - sound_status = OFF; - break; - case PLAYING: - sound_status = IDLE; - break; - default: - break; + } } } From a67f3650c8f28ae2eebfbc561f0e68ed84b87d46 Mon Sep 17 00:00:00 2001 From: Robbe Derks Date: Thu, 14 Nov 2024 11:28:28 +0100 Subject: [PATCH 05/16] Increase MISRA to 2min max (#2079) increase to 2min max --- .github/workflows/test.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 221bce0096..367cf2dc36 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -99,7 +99,7 @@ jobs: - name: Build FW run: ${{ env.RUN }} "scons -j$(nproc)" - name: Run MISRA C:2012 analysis - timeout-minutes: 1 + timeout-minutes: 2 run: ${{ env.RUN }} "cd tests/misra && ./test_misra.sh" - name: MISRA mutation tests timeout-minutes: 5 From 742d961b07e602bb143086632d0f8150f4882f5f Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Thu, 14 Nov 2024 17:05:44 -0800 Subject: [PATCH 06/16] Lower siren duration to 3s (#2080) --- board/main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/board/main.c b/board/main.c index b1dc685417..aaea95d089 100644 --- a/board/main.c +++ b/board/main.c @@ -241,7 +241,7 @@ static void tick_handler(void) { print(" seconds. Safety is set to SILENT mode.\n"); if (controls_allowed_countdown > 0U) { - siren_countdown = 5U; + siren_countdown = 3U; controls_allowed_countdown = 0U; } From acc15afaa0bea090c045a624f940e98cc521b701 Mon Sep 17 00:00:00 2001 From: Robbe Derks Date: Fri, 15 Nov 2024 15:35:30 +0100 Subject: [PATCH 07/16] Fix sound playback artifacts (#2082) this stays in sync Co-authored-by: Comma Device --- board/stm32h7/peripherals.h | 1 + board/stm32h7/sound.h | 17 +++++++++-------- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/board/stm32h7/peripherals.h b/board/stm32h7/peripherals.h index f0bd727fdf..c6874b8ac3 100644 --- a/board/stm32h7/peripherals.h +++ b/board/stm32h7/peripherals.h @@ -135,6 +135,7 @@ void peripherals_init(void) { RCC->APB1LENR |= RCC_APB1LENR_TIM7EN; // DMA trigger timer RCC->APB2ENR |= RCC_APB2ENR_TIM8EN; // tick timer RCC->APB1LENR |= RCC_APB1LENR_TIM12EN; // slow loop + RCC->APB1LENR |= RCC_APB1LENR_TIM5EN; // sound trigger timer #ifdef PANDA_JUNGLE RCC->AHB3ENR |= RCC_AHB3ENR_SDMMC1EN; // SDMMC diff --git a/board/stm32h7/sound.h b/board/stm32h7/sound.h index 53f7276bde..f40a22e5b2 100644 --- a/board/stm32h7/sound.h +++ b/board/stm32h7/sound.h @@ -44,7 +44,7 @@ void sound_init(void) { // Init DAC register_set(&DAC1->MCR, 0U, 0xFFFFFFFFU); - register_set(&DAC1->CR, DAC_CR_TEN1 | (6U << DAC_CR_TSEL1_Pos) | DAC_CR_DMAEN1, 0xFFFFFFFFU); + register_set(&DAC1->CR, DAC_CR_TEN1 | (4U << DAC_CR_TSEL1_Pos) | DAC_CR_DMAEN1, 0xFFFFFFFFU); register_set_bits(&DAC1->CR, DAC_CR_EN1); // Setup DMAMUX (DAC_CH1_DMA as input) @@ -55,13 +55,14 @@ void sound_init(void) { register_set(&DMA1_Stream1->FCR, 0U, 0x00000083U); DMA1_Stream1->CR = (0b11UL << DMA_SxCR_PL_Pos) | (0b01UL << DMA_SxCR_MSIZE_Pos) | (0b01UL << DMA_SxCR_PSIZE_Pos) | DMA_SxCR_MINC | (1U << DMA_SxCR_DIR_Pos); - // Init trigger timer (48kHz) - register_set(&TIM7->PSC, 0U, 0xFFFFU); - register_set(&TIM7->ARR, 2494U, 0xFFFFU); - register_set(&TIM7->CR2, (0b10U << TIM_CR2_MMS_Pos), TIM_CR2_MMS_Msk); - register_set(&TIM7->CR1, TIM_CR1_ARPE | TIM_CR1_URS, 0x088EU); - TIM7->SR = 0U; - TIM7->CR1 |= TIM_CR1_CEN; + // Init trigger timer (little slower than 48kHz, pulled in sync by SAI4_FS_B) + register_set(&TIM5->PSC, 2600U, 0xFFFFU); + register_set(&TIM5->ARR, 100U, 0xFFFFFFFFU); // not important + register_set(&TIM5->AF1, (0b0010UL << TIM5_AF1_ETRSEL_Pos), TIM5_AF1_ETRSEL_Msk); + register_set(&TIM5->CR2, (0b010U << TIM_CR2_MMS_Pos), TIM_CR2_MMS_Msk); + register_set(&TIM5->SMCR, TIM_SMCR_ECE | (0b00111UL << TIM_SMCR_TS_Pos)| (0b0100UL << TIM_SMCR_SMS_Pos), 0x31FFF7U); + TIM5->CNT = 0U; TIM5->SR = 0U; + TIM5->CR1 |= TIM_CR1_CEN; // stereo audio in register_set(&SAI4_Block_B->CR1, SAI_xCR1_DMAEN | (0b00UL << SAI_xCR1_SYNCEN_Pos) | (0b100U << SAI_xCR1_DS_Pos) | (0b11U << SAI_xCR1_MODE_Pos), 0x0FFB3FEFU); From 422e3e0c0f458c721517454cefcd22407576e9d5 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Mon, 18 Nov 2024 14:50:17 -0800 Subject: [PATCH 08/16] H7 sound: fix noise with empty stream (#2083) fix noise Co-authored-by: Comma Device --- board/stm32h7/sound.h | 37 +++++++++++++++++++++++-------------- 1 file changed, 23 insertions(+), 14 deletions(-) diff --git a/board/stm32h7/sound.h b/board/stm32h7/sound.h index f40a22e5b2..6251936c62 100644 --- a/board/stm32h7/sound.h +++ b/board/stm32h7/sound.h @@ -5,23 +5,41 @@ __attribute__((section(".sram4"))) static uint16_t sound_rx_buf[2][SOUND_RX_BUF_ static uint8_t sound_idle_count; +void sound_tick(void) { + if (sound_idle_count > 0U) { + sound_idle_count--; + if (sound_idle_count == 0U) { + current_board->set_amp_enabled(false); + } + } +} + // Playback processing static void BDMA_Channel0_IRQ_Handler(void) { __attribute__((section(".sram4"))) static uint16_t tx_buf[SOUND_TX_BUF_SIZE]; BDMA->IFCR |= BDMA_IFCR_CGIF0; // clear flag - // process samples (shift to 12b and bias to be unsigned) - // since we are playing mono and receiving stereo, we take every other sample uint8_t buf_idx = (((BDMA_Channel0->CCR & BDMA_CCR_CT) >> BDMA_CCR_CT_Pos) == 1U) ? 0U : 1U; + + // process samples (shift to 12b and bias to be unsigned) + bool sound_playing = false; for (uint16_t i=0U; i < SOUND_RX_BUF_SIZE; i += 2U) { + // since we are playing mono and receiving stereo, we take every other sample tx_buf[i/2U] = ((sound_rx_buf[buf_idx][i] + (1UL << 14)) >> 3); + if (sound_rx_buf[buf_idx][i] > 0U) { + sound_playing = true; + } } - if (sound_idle_count == 0U) { - current_board->set_amp_enabled(true); + // manage amp state + if (sound_playing) { + if (sound_idle_count == 0U) { + current_board->set_amp_enabled(true); + } + sound_idle_count = 4U; } - sound_idle_count = 2U; + sound_tick(); DMA1->LIFCR |= 0xF40; DMA1_Stream1->CR &= ~DMA_SxCR_EN; @@ -30,15 +48,6 @@ static void BDMA_Channel0_IRQ_Handler(void) { DMA1_Stream1->CR |= DMA_SxCR_EN; } -void sound_tick(void) { - if (sound_idle_count > 0U) { - sound_idle_count--; - if (sound_idle_count == 0U) { - current_board->set_amp_enabled(false); - } - } -} - void sound_init(void) { REGISTER_INTERRUPT(BDMA_Channel0_IRQn, BDMA_Channel0_IRQ_Handler, 64U, FAULT_INTERRUPT_RATE_SOUND_DMA) From 998a63936087a3d90cd29df88375d786491a78f8 Mon Sep 17 00:00:00 2001 From: Maxime Desroches Date: Wed, 20 Nov 2024 19:22:14 -0800 Subject: [PATCH 09/16] python: catch exceptions in DFU (#2084) * try * also this --- python/dfu.py | 13 ++++++++----- python/spi.py | 3 ++- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/python/dfu.py b/python/dfu.py index 9beba45e55..4394d2502d 100644 --- a/python/dfu.py +++ b/python/dfu.py @@ -100,11 +100,14 @@ def spi_list() -> list[str]: def st_serial_to_dfu_serial(st: str, mcu_type: McuType = McuType.F4): if st is None or st == "none": return None - uid_base = struct.unpack("H" * 6, bytes.fromhex(st)) - if mcu_type == McuType.H7: - return binascii.hexlify(struct.pack("!HHH", uid_base[1] + uid_base[5], uid_base[0] + uid_base[4], uid_base[3])).upper().decode("utf-8") - else: - return binascii.hexlify(struct.pack("!HHH", uid_base[1] + uid_base[5], uid_base[0] + uid_base[4] + 0xA, uid_base[3])).upper().decode("utf-8") + try: + uid_base = struct.unpack("H" * 6, bytes.fromhex(st)) + if mcu_type == McuType.H7: + return binascii.hexlify(struct.pack("!HHH", uid_base[1] + uid_base[5], uid_base[0] + uid_base[4], uid_base[3])).upper().decode("utf-8") + else: + return binascii.hexlify(struct.pack("!HHH", uid_base[1] + uid_base[5], uid_base[0] + uid_base[4] + 0xA, uid_base[3])).upper().decode("utf-8") + except struct.error: + return None def get_mcu_type(self) -> McuType: return self._mcu_type diff --git a/python/spi.py b/python/spi.py index 5be1e56b6b..2b086dc2b3 100644 --- a/python/spi.py +++ b/python/spi.py @@ -402,7 +402,8 @@ def get_bootloader_id(self): def get_chip_id(self) -> int: r = self._cmd(0x02, read_bytes=3) - assert r[0] == 1 # response length - 1 + if r[0] != 1: # response length - 1 + raise PandaSpiException("incorrect response length") return ((r[1] << 8) + r[2]) def go_cmd(self, address: int) -> None: From 4a11d52e07c9dff5f48d4fd20397f2612786ea8f Mon Sep 17 00:00:00 2001 From: Willem Melching Date: Thu, 21 Nov 2024 11:04:09 -0800 Subject: [PATCH 10/16] Control over FD flag of CAN messages (#2085) * Control over FD flag of CAN messages * misra --- board/can_declarations.h | 2 +- board/drivers/bxcan.h | 3 +++ board/drivers/can_common.h | 10 +++++----- board/drivers/can_common_declarations.h | 1 + board/drivers/fdcan.h | 15 +++++++++++---- board/main_comms.h | 4 ++++ python/__init__.py | 15 +++++++++------ tests/libpanda/libpanda_py.py | 2 +- 8 files changed, 35 insertions(+), 17 deletions(-) diff --git a/board/can_declarations.h b/board/can_declarations.h index 569e2939ac..878d9c77e2 100644 --- a/board/can_declarations.h +++ b/board/can_declarations.h @@ -13,7 +13,7 @@ #endif typedef struct { - unsigned char reserved : 1; + unsigned char fd : 1; unsigned char bus : 3; unsigned char data_len_code : 4; // lookup length with dlc_to_len unsigned char rejected : 1; diff --git a/board/drivers/bxcan.h b/board/drivers/bxcan.h index e4c72c61aa..721a7ee492 100644 --- a/board/drivers/bxcan.h +++ b/board/drivers/bxcan.h @@ -89,6 +89,7 @@ void process_can(uint8_t can_number) { if ((CANx->TSR & CAN_TSR_RQCP0) == CAN_TSR_RQCP0) { if ((CANx->TSR & CAN_TSR_TXOK0) == CAN_TSR_TXOK0) { CANPacket_t to_push; + to_push.fd = 0U; to_push.returned = 1U; to_push.rejected = 0U; to_push.extended = (CANx->sTxMailBox[0].TIR >> 2) & 0x1U; @@ -144,6 +145,7 @@ void can_rx(uint8_t can_number) { // add to my fifo CANPacket_t to_push; + to_push.fd = 0U; to_push.returned = 0U; to_push.rejected = 0U; to_push.extended = (CANx->sFIFOMailBox[0].RIR >> 2) & 0x1U; @@ -159,6 +161,7 @@ void can_rx(uint8_t can_number) { if (bus_fwd_num != -1) { CANPacket_t to_send; + to_send.fd = 0U; to_send.returned = 0U; to_send.rejected = 0U; to_send.extended = to_push.extended; // TXRQ diff --git a/board/drivers/can_common.h b/board/drivers/can_common.h index 5a074e775c..0f24a77c1b 100644 --- a/board/drivers/can_common.h +++ b/board/drivers/can_common.h @@ -131,10 +131,10 @@ void can_clear(can_ring *q) { // Helpers // Panda: Bus 0=CAN1 Bus 1=CAN2 Bus 2=CAN3 bus_config_t bus_config[BUS_CONFIG_ARRAY_SIZE] = { - { .bus_lookup = 0U, .can_num_lookup = 0U, .forwarding_bus = -1, .can_speed = 5000U, .can_data_speed = 20000U, .canfd_enabled = false, .brs_enabled = false, .canfd_non_iso = false }, - { .bus_lookup = 1U, .can_num_lookup = 1U, .forwarding_bus = -1, .can_speed = 5000U, .can_data_speed = 20000U, .canfd_enabled = false, .brs_enabled = false, .canfd_non_iso = false }, - { .bus_lookup = 2U, .can_num_lookup = 2U, .forwarding_bus = -1, .can_speed = 5000U, .can_data_speed = 20000U, .canfd_enabled = false, .brs_enabled = false, .canfd_non_iso = false }, - { .bus_lookup = 0xFFU, .can_num_lookup = 0xFFU, .forwarding_bus = -1, .can_speed = 333U, .can_data_speed = 333U, .canfd_enabled = false, .brs_enabled = false, .canfd_non_iso = false }, + { .bus_lookup = 0U, .can_num_lookup = 0U, .forwarding_bus = -1, .can_speed = 5000U, .can_data_speed = 20000U, .canfd_auto = false, .canfd_enabled = false, .brs_enabled = false, .canfd_non_iso = false }, + { .bus_lookup = 1U, .can_num_lookup = 1U, .forwarding_bus = -1, .can_speed = 5000U, .can_data_speed = 20000U, .canfd_auto = false, .canfd_enabled = false, .brs_enabled = false, .canfd_non_iso = false }, + { .bus_lookup = 2U, .can_num_lookup = 2U, .forwarding_bus = -1, .can_speed = 5000U, .can_data_speed = 20000U, .canfd_auto = false, .canfd_enabled = false, .brs_enabled = false, .canfd_non_iso = false }, + { .bus_lookup = 0xFFU, .can_num_lookup = 0xFFU, .forwarding_bus = -1, .can_speed = 333U, .can_data_speed = 333U, .canfd_auto = false, .canfd_enabled = false, .brs_enabled = false, .canfd_non_iso = false }, }; void can_init_all(void) { @@ -165,7 +165,7 @@ void ignition_can_hook(CANPacket_t *to_push) { if (bus == 0) { int addr = GET_ADDR(to_push); int len = GET_LEN(to_push); - + // GM exception if ((addr == 0x1F1) && (len == 8)) { // SystemPowerMode (2=Run, 3=Crank Request) diff --git a/board/drivers/can_common_declarations.h b/board/drivers/can_common_declarations.h index 1a3518c2a8..57bf87d9c7 100644 --- a/board/drivers/can_common_declarations.h +++ b/board/drivers/can_common_declarations.h @@ -13,6 +13,7 @@ typedef struct { int8_t forwarding_bus; uint32_t can_speed; uint32_t can_data_speed; + bool canfd_auto; bool canfd_enabled; bool brs_enabled; bool canfd_non_iso; diff --git a/board/drivers/fdcan.h b/board/drivers/fdcan.h index 0144aa17c2..eaf50caaab 100644 --- a/board/drivers/fdcan.h +++ b/board/drivers/fdcan.h @@ -100,7 +100,11 @@ void process_can(uint8_t can_number) { fifo = (canfd_fifo *)(TxFIFOSA + (tx_index * FDCAN_TX_FIFO_EL_SIZE)); fifo->header[0] = (to_send.extended << 30) | ((to_send.extended != 0U) ? (to_send.addr) : (to_send.addr << 18)); - uint32_t canfd_enabled_header = bus_config[can_number].canfd_enabled ? (1UL << 21) : 0UL; + + // If canfd_auto is set, outgoing packets will be automatically sent as CAN-FD if an incoming CAN-FD packet was seen + bool fd = bus_config[can_number].canfd_auto ? bus_config[can_number].canfd_enabled : (bool)(to_send.fd > 0U); + uint32_t canfd_enabled_header = fd ? (1UL << 21) : 0UL; + uint32_t brs_enabled_header = bus_config[can_number].brs_enabled ? (1UL << 20) : 0UL; fifo->header[1] = (to_send.data_len_code << 16) | canfd_enabled_header | brs_enabled_header; @@ -115,6 +119,7 @@ void process_can(uint8_t can_number) { // Send back to USB CANPacket_t to_push; + to_push.fd = fd; to_push.returned = 1U; to_push.rejected = 0U; to_push.extended = to_send.extended; @@ -168,6 +173,10 @@ void can_rx(uint8_t can_number) { // getting address fifo = (canfd_fifo *)(RxFIFO0SA + (rx_fifo_idx * FDCAN_RX_FIFO_0_EL_SIZE)); + bool canfd_frame = ((fifo->header[1] >> 21) & 0x1U); + bool brs_frame = ((fifo->header[1] >> 20) & 0x1U); + + to_push.fd = canfd_frame; to_push.returned = 0U; to_push.rejected = 0U; to_push.extended = (fifo->header[0] >> 30) & 0x1U; @@ -175,9 +184,6 @@ void can_rx(uint8_t can_number) { to_push.bus = bus_number; to_push.data_len_code = ((fifo->header[1] >> 16) & 0xFU); - bool canfd_frame = ((fifo->header[1] >> 21) & 0x1U); - bool brs_frame = ((fifo->header[1] >> 20) & 0x1U); - uint8_t data_len_w = (dlc_to_len[to_push.data_len_code] / 4U); data_len_w += ((dlc_to_len[to_push.data_len_code] % 4U) > 0U) ? 1U : 0U; for (unsigned int i = 0; i < data_len_w; i++) { @@ -193,6 +199,7 @@ void can_rx(uint8_t can_number) { if (bus_fwd_num != -1) { CANPacket_t to_send; + to_send.fd = to_push.fd; to_send.returned = 0U; to_send.rejected = 0U; to_send.extended = to_push.extended; diff --git a/board/main_comms.h b/board/main_comms.h index 7d754d050f..6cc2e429c3 100644 --- a/board/main_comms.h +++ b/board/main_comms.h @@ -317,6 +317,10 @@ int comms_control_handler(ControlPacket_t *req, uint8_t *resp) { case 0xe7: set_power_save_state(req->param1); break; + // **** 0xe8: set can-fd auto swithing mode + case 0xe8: + bus_config[req->param1].canfd_auto = req->param2 > 0U; + break; // **** 0xf1: Clear CAN ring buffer. case 0xf1: if (req->param1 == 0xFFFFU) { diff --git a/python/__init__.py b/python/__init__.py index 14d324ab93..d6d3ebc594 100644 --- a/python/__init__.py +++ b/python/__init__.py @@ -31,7 +31,7 @@ def calculate_checksum(data): res ^= b return res -def pack_can_buffer(arr): +def pack_can_buffer(arr, fd=False): snds = [b''] for address, dat, bus in arr: assert len(dat) in LEN_TO_DLC @@ -41,7 +41,7 @@ def pack_can_buffer(arr): data_len_code = LEN_TO_DLC[len(dat)] header = bytearray(CANPACKET_HEAD_SIZE) word_4b = address << 3 | extended << 2 - header[0] = (data_len_code << 4) | (bus << 1) + header[0] = (data_len_code << 4) | (bus << 1) | int(fd) header[1] = word_4b & 0xFF header[2] = (word_4b >> 8) & 0xFF header[3] = (word_4b >> 16) & 0xFF @@ -807,6 +807,9 @@ def set_can_data_speed_kbps(self, bus, speed): def set_canfd_non_iso(self, bus, non_iso): self._handle.controlWrite(Panda.REQUEST_OUT, 0xfc, bus, int(non_iso), b'') + def set_canfd_auto(self, bus, auto): + self._handle.controlWrite(Panda.REQUEST_OUT, 0xe8, bus, int(auto), b'') + def set_uart_baud(self, uart, rate): self._handle.controlWrite(Panda.REQUEST_OUT, 0xe4, uart, int(rate / 300), b'') @@ -828,15 +831,15 @@ def can_reset_communications(self): self._handle.controlWrite(Panda.REQUEST_OUT, 0xc0, 0, 0, b'') @ensure_can_packet_version - def can_send_many(self, arr, timeout=CAN_SEND_TIMEOUT_MS): - snds = pack_can_buffer(arr) + def can_send_many(self, arr, *, fd=False, timeout=CAN_SEND_TIMEOUT_MS): + snds = pack_can_buffer(arr, fd=fd) for tx in snds: while len(tx) > 0: bs = self._handle.bulkWrite(3, tx, timeout=timeout) tx = tx[bs:] - def can_send(self, addr, dat, bus, timeout=CAN_SEND_TIMEOUT_MS): - self.can_send_many([[addr, dat, bus]], timeout=timeout) + def can_send(self, addr, dat, bus, *, fd=False, timeout=CAN_SEND_TIMEOUT_MS): + self.can_send_many([[addr, dat, bus]], fd=fd, timeout=timeout) @ensure_can_packet_version def can_recv(self): diff --git a/tests/libpanda/libpanda_py.py b/tests/libpanda/libpanda_py.py index 6f888ac60e..d24640b9dc 100644 --- a/tests/libpanda/libpanda_py.py +++ b/tests/libpanda/libpanda_py.py @@ -12,7 +12,7 @@ ffi.cdef(""" typedef struct { - unsigned char reserved : 1; + unsigned char fd : 1; unsigned char bus : 3; unsigned char data_len_code : 4; unsigned char rejected : 1; From 2fbf0c5ff86f2e94021d7c937b9f8eb6839af484 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Thu, 21 Nov 2024 11:07:57 -0800 Subject: [PATCH 11/16] fix indendation --- board/main_comms.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/board/main_comms.h b/board/main_comms.h index 6cc2e429c3..e366b19a09 100644 --- a/board/main_comms.h +++ b/board/main_comms.h @@ -319,8 +319,8 @@ int comms_control_handler(ControlPacket_t *req, uint8_t *resp) { break; // **** 0xe8: set can-fd auto swithing mode case 0xe8: - bus_config[req->param1].canfd_auto = req->param2 > 0U; - break; + bus_config[req->param1].canfd_auto = req->param2 > 0U; + break; // **** 0xf1: Clear CAN ring buffer. case 0xf1: if (req->param1 == 0xFFFFU) { From b770745342dc52fe30434763532e4c73887c71ca Mon Sep 17 00:00:00 2001 From: Maxime Desroches Date: Thu, 21 Nov 2024 11:48:02 -0800 Subject: [PATCH 12/16] ci: split MISRA linter and MISRA mutation (#2086) * sep * this --- .github/workflows/test.yaml | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 367cf2dc36..52c2a06103 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -88,8 +88,8 @@ jobs: scons -j$(nproc) ${{ matrix.flags }} && \ tests/safety/test.sh" - misra: - name: MISRA C:2012 + misra_linter: + name: MISRA C:2012 Linter runs-on: ubuntu-latest timeout-minutes: 20 steps: @@ -101,6 +101,17 @@ jobs: - name: Run MISRA C:2012 analysis timeout-minutes: 2 run: ${{ env.RUN }} "cd tests/misra && ./test_misra.sh" + + misra_mutation: + name: MISRA C:2012 Mutation + runs-on: ubuntu-latest + timeout-minutes: 20 + steps: + - uses: actions/checkout@v2 + - name: Build Docker image + run: eval "$BUILD" + - name: Build FW + run: ${{ env.RUN }} "scons -j$(nproc)" - name: MISRA mutation tests timeout-minutes: 5 run: ${{ env.RUN }} "cd tests/misra && pytest -n8 test_mutation.py" From cfbc3ff835d711c5afc733c964b5283ff5a998c6 Mon Sep 17 00:00:00 2001 From: Willem Melching Date: Fri, 22 Nov 2024 10:29:11 -0800 Subject: [PATCH 13/16] Ensure auto switching FD is off in Python (#2087) --- python/__init__.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/python/__init__.py b/python/__init__.py index d6d3ebc594..88ccf897a1 100644 --- a/python/__init__.py +++ b/python/__init__.py @@ -324,6 +324,10 @@ def connect(self, claim=True, wait=False): # reset comms self.can_reset_communications() + # disable automatic CAN-FD switching + for bus in range(PANDA_BUS_CNT): + self.set_canfd_auto(bus, False) + # set CAN speed for bus in range(PANDA_BUS_CNT): self.set_can_speed_kbps(bus, self._can_speed_kbps) From 5761ab58ea36beba2ddf07709590b591e04312bd Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Fri, 22 Nov 2024 19:33:04 -0800 Subject: [PATCH 14/16] what was that doing there? --- board/recover.py | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/board/recover.py b/board/recover.py index c149e948d1..6268a07d96 100755 --- a/board/recover.py +++ b/board/recover.py @@ -2,21 +2,15 @@ import os import time import subprocess -import argparse from panda import Panda, PandaDFU board_path = os.path.dirname(os.path.realpath(__file__)) if __name__ == "__main__": - parser = argparse.ArgumentParser() - parser.add_argument("--all", action="store_true", help="Recover all Panda devices") - args = parser.parse_args() - subprocess.check_call(f"scons -C {board_path}/.. -j$(nproc) {board_path}", shell=True) - serials = Panda.list() if args.all else [None] - for s in serials: + for s in Panda.list(): with Panda(serial=s) as p: print(f"putting {p.get_usb_serial()} in DFU mode") p.reset(enter_bootstub=True) From 4dc203376afbd20914373ec721610d20a851add5 Mon Sep 17 00:00:00 2001 From: Robbe Derks Date: Fri, 29 Nov 2024 17:37:33 +0100 Subject: [PATCH 15/16] more open drains (#2091) also open drain Co-authored-by: Comma Device --- board/boards/cuatro.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/board/boards/cuatro.h b/board/boards/cuatro.h index 4a6b5da096..3d87318b02 100644 --- a/board/boards/cuatro.h +++ b/board/boards/cuatro.h @@ -87,6 +87,10 @@ static void cuatro_init(void) { set_gpio_output_type(GPIOB, 2, OUTPUT_TYPE_OPEN_DRAIN); set_gpio_output_type(GPIOD, 15, OUTPUT_TYPE_OPEN_DRAIN); + // more open drain + set_gpio_output_type(GPIOD, 3, OUTPUT_TYPE_OPEN_DRAIN); // FAN_EN + set_gpio_output_type(GPIOC, 12, OUTPUT_TYPE_OPEN_DRAIN); // VBAT_EN + // Power readout set_gpio_mode(GPIOC, 5, MODE_ANALOG); set_gpio_mode(GPIOA, 6, MODE_ANALOG); From c7cc2deaf046403899b5bcc964b9f48bfd508534 Mon Sep 17 00:00:00 2001 From: Robbe Derks Date: Fri, 29 Nov 2024 17:41:03 +0100 Subject: [PATCH 16/16] Cuatro: no ir (#2093) no ir --- board/boards/cuatro.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/board/boards/cuatro.h b/board/boards/cuatro.h index 3d87318b02..90d0627517 100644 --- a/board/boards/cuatro.h +++ b/board/boards/cuatro.h @@ -169,7 +169,7 @@ board board_cuatro = { .read_voltage_mV = cuatro_read_voltage_mV, .read_current_mA = cuatro_read_current_mA, .set_fan_enabled = cuatro_set_fan_enabled, - .set_ir_power = tres_set_ir_power, + .set_ir_power = unused_set_ir_power, .set_siren = cuatro_set_siren, .set_bootkick = cuatro_set_bootkick, .read_som_gpio = tres_read_som_gpio,