diff --git a/board/boards/black.h b/board/boards/black.h index ea636334..91719389 100644 --- a/board/boards/black.h +++ b/board/boards/black.h @@ -122,8 +122,6 @@ void black_init(void) { // Initialize harness harness_init(); - // Initialize RTC - rtc_init(); // Enable CAN transceivers black_enable_can_transceivers(true); @@ -168,7 +166,6 @@ const board board_black = { .has_obd = true, .has_spi = false, .has_canfd = false, - .has_rtc_battery = false, .fan_max_rpm = 0U, .avdd_mV = 3300U, .fan_stall_recovery = false, diff --git a/board/boards/board_declarations.h b/board/boards/board_declarations.h index 600dc288..f30216a0 100644 --- a/board/boards/board_declarations.h +++ b/board/boards/board_declarations.h @@ -25,7 +25,6 @@ struct board { const bool has_obd; const bool has_spi; const bool has_canfd; - const bool has_rtc_battery; const uint16_t fan_max_rpm; const uint16_t avdd_mV; const bool fan_stall_recovery; diff --git a/board/boards/cuatro.h b/board/boards/cuatro.h index b8cd3d03..f497f3f6 100644 --- a/board/boards/cuatro.h +++ b/board/boards/cuatro.h @@ -108,7 +108,6 @@ const board board_cuatro = { .has_obd = true, .has_spi = true, .has_canfd = true, - .has_rtc_battery = true, .fan_max_rpm = 6600U, .avdd_mV = 1800U, .fan_stall_recovery = false, diff --git a/board/boards/dos.h b/board/boards/dos.h index 428bbf2a..ca98ad96 100644 --- a/board/boards/dos.h +++ b/board/boards/dos.h @@ -147,8 +147,6 @@ void dos_init(void) { // Initialize harness harness_init(); - // Initialize RTC - rtc_init(); // Enable CAN transceivers dos_enable_can_transceivers(true); @@ -196,7 +194,6 @@ const board board_dos = { .has_spi = false, #endif .has_canfd = false, - .has_rtc_battery = true, .fan_max_rpm = 6500U, .avdd_mV = 3300U, .fan_stall_recovery = true, diff --git a/board/boards/grey.h b/board/boards/grey.h index 8b3bd8ae..75273c1a 100644 --- a/board/boards/grey.h +++ b/board/boards/grey.h @@ -10,7 +10,6 @@ const board board_grey = { .has_obd = false, .has_spi = false, .has_canfd = false, - .has_rtc_battery = false, .fan_max_rpm = 0U, .avdd_mV = 3300U, .fan_stall_recovery = false, diff --git a/board/boards/red.h b/board/boards/red.h index aa8c91be..2ba9f356 100644 --- a/board/boards/red.h +++ b/board/boards/red.h @@ -140,8 +140,6 @@ void red_init(void) { // Initialize harness harness_init(); - // Initialize RTC - rtc_init(); // Enable CAN transceivers red_enable_can_transceivers(true); @@ -180,7 +178,6 @@ const board board_red = { .has_obd = true, .has_spi = false, .has_canfd = true, - .has_rtc_battery = false, .fan_max_rpm = 0U, .avdd_mV = 3300U, .fan_stall_recovery = false, diff --git a/board/boards/red_chiplet.h b/board/boards/red_chiplet.h index eec3d95c..8b0f9333 100644 --- a/board/boards/red_chiplet.h +++ b/board/boards/red_chiplet.h @@ -119,8 +119,6 @@ void red_chiplet_init(void) { // Initialize harness harness_init(); - // Initialize RTC - rtc_init(); // Enable CAN transceivers red_chiplet_enable_can_transceivers(true); diff --git a/board/boards/tres.h b/board/boards/tres.h index 959c93b5..50d55e28 100644 --- a/board/boards/tres.h +++ b/board/boards/tres.h @@ -75,7 +75,6 @@ const board board_tres = { .has_obd = true, .has_spi = true, .has_canfd = true, - .has_rtc_battery = true, .fan_max_rpm = 6600U, .avdd_mV = 1800U, .fan_stall_recovery = false, diff --git a/board/boards/uno.h b/board/boards/uno.h index f4e2016b..3c6ce177 100644 --- a/board/boards/uno.h +++ b/board/boards/uno.h @@ -147,8 +147,6 @@ void uno_init(void) { // Initialize harness harness_init(); - // Initialize RTC - rtc_init(); // Enable CAN transceivers uno_enable_can_transceivers(true); @@ -203,7 +201,6 @@ const board board_uno = { .has_obd = true, .has_spi = false, .has_canfd = false, - .has_rtc_battery = true, .fan_max_rpm = 5100U, .avdd_mV = 3300U, .fan_stall_recovery = false, diff --git a/board/boards/white.h b/board/boards/white.h index 0de29a39..362f525a 100644 --- a/board/boards/white.h +++ b/board/boards/white.h @@ -187,8 +187,6 @@ void white_grey_init(void) { set_gpio_alternate(GPIOC, 11, GPIO_AF7_USART3); set_gpio_pullup(GPIOC, 11, PULL_UP); - // Initialize RTC - rtc_init(); // Enable CAN transceivers white_enable_can_transceivers(true); @@ -231,7 +229,6 @@ const board board_white = { .has_obd = false, .has_spi = false, .has_canfd = false, - .has_rtc_battery = false, .fan_max_rpm = 0U, .avdd_mV = 3300U, .fan_stall_recovery = false, diff --git a/board/drivers/rtc.h b/board/drivers/rtc.h deleted file mode 100644 index df121e3e..00000000 --- a/board/drivers/rtc.h +++ /dev/null @@ -1,79 +0,0 @@ -#define YEAR_OFFSET 2000U - -typedef struct __attribute__((packed)) timestamp_t { - uint16_t year; - uint8_t month; - uint8_t day; - uint8_t weekday; - uint8_t hour; - uint8_t minute; - uint8_t second; -} timestamp_t; - -uint8_t to_bcd(uint16_t value){ - return (((value / 10U) & 0x0FU) << 4U) | ((value % 10U) & 0x0FU); -} - -uint16_t from_bcd(uint8_t value){ - return (((value & 0xF0U) >> 4U) * 10U) + (value & 0x0FU); -} - -void rtc_set_time(timestamp_t time){ - print("Setting RTC time\n"); - - // Disable write protection - disable_bdomain_protection(); - RTC->WPR = 0xCA; - RTC->WPR = 0x53; - - // Enable initialization mode - register_set_bits(&(RTC->ISR), RTC_ISR_INIT); - while((RTC->ISR & RTC_ISR_INITF) == 0){} - - // Set time - RTC->TR = (to_bcd(time.hour) << RTC_TR_HU_Pos) | (to_bcd(time.minute) << RTC_TR_MNU_Pos) | (to_bcd(time.second) << RTC_TR_SU_Pos); - RTC->DR = (to_bcd(time.year - YEAR_OFFSET) << RTC_DR_YU_Pos) | (time.weekday << RTC_DR_WDU_Pos) | (to_bcd(time.month) << RTC_DR_MU_Pos) | (to_bcd(time.day) << RTC_DR_DU_Pos); - - // Set options - register_set(&(RTC->CR), 0U, 0xFCFFFFU); - - // Disable initalization mode - register_clear_bits(&(RTC->ISR), RTC_ISR_INIT); - - // Wait for synchronization - while((RTC->ISR & RTC_ISR_RSF) == 0){} - - // Re-enable write protection - RTC->WPR = 0x00; - enable_bdomain_protection(); -} - -timestamp_t rtc_get_time(void){ - timestamp_t result; - // Init with zero values in case there is no RTC running - result.year = 0U; - result.month = 0U; - result.day = 0U; - result.weekday = 0U; - result.hour = 0U; - result.minute = 0U; - result.second = 0U; - - // Wait until the register sync flag is set - while((RTC->ISR & RTC_ISR_RSF) == 0){} - - // Read time and date registers. Since our HSE > 7*LSE, this should be fine. - uint32_t time = RTC->TR; - uint32_t date = RTC->DR; - - // Parse values - result.year = from_bcd((date & (RTC_DR_YT | RTC_DR_YU)) >> RTC_DR_YU_Pos) + YEAR_OFFSET; - result.month = from_bcd((date & (RTC_DR_MT | RTC_DR_MU)) >> RTC_DR_MU_Pos); - result.day = from_bcd((date & (RTC_DR_DT | RTC_DR_DU)) >> RTC_DR_DU_Pos); - result.weekday = ((date & RTC_DR_WDU) >> RTC_DR_WDU_Pos); - result.hour = from_bcd((time & (RTC_TR_HT | RTC_TR_HU)) >> RTC_TR_HU_Pos); - result.minute = from_bcd((time & (RTC_TR_MNT | RTC_TR_MNU)) >> RTC_TR_MNU_Pos); - result.second = from_bcd((time & (RTC_TR_ST | RTC_TR_SU)) >> RTC_TR_SU_Pos); - - return result; -} diff --git a/board/main.c b/board/main.c index 061a9138..00429e32 100644 --- a/board/main.c +++ b/board/main.c @@ -294,24 +294,6 @@ void EXTI_IRQ_Handler(void) { } } -uint8_t rtc_counter = 0; -void RTC_WKUP_IRQ_Handler(void) { - exti_irq_clear(); - clock_init(); - - rtc_counter++; - if ((rtc_counter % 2U) == 0U) { - current_board->set_led(LED_BLUE, false); - } else { - current_board->set_led(LED_BLUE, true); - } - - if (rtc_counter == __UINT8_MAX__) { - rtc_counter = 1U; - } -} - - int main(void) { // Init interrupt table init_interrupts(true); @@ -422,10 +404,6 @@ int main(void) { // Init IRQs for CAN transceiver and ignition line exti_irq_init(); - // Init RTC Wakeup event on EXTI22 - REGISTER_INTERRUPT(RTC_WKUP_IRQn, RTC_WKUP_IRQ_Handler, 10U, FAULT_INTERRUPT_RATE_EXTI) - rtc_wakeup_init(); - // STOP mode SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk; } diff --git a/board/main_comms.h b/board/main_comms.h index c0d5c516..2c8bf165 100644 --- a/board/main_comms.h +++ b/board/main_comms.h @@ -48,12 +48,6 @@ int get_health_pkt(void *dat) { return sizeof(*health); } -int get_rtc_pkt(void *dat) { - timestamp_t t = rtc_get_time(); - (void)memcpy(dat, &t, sizeof(t)); - return sizeof(t); -} - // send on serial, first byte to select the ring void comms_endpoint2_write(const uint8_t *data, uint32_t len) { uart_ring *ur = get_ring_by_number(data[0]); @@ -71,7 +65,6 @@ void comms_endpoint2_write(const uint8_t *data, uint32_t len) { int comms_control_handler(ControlPacket_t *req, uint8_t *resp) { unsigned int resp_len = 0; uart_ring *ur = NULL; - timestamp_t t; uint32_t time; #ifdef DEBUG_COMMS @@ -82,52 +75,6 @@ int comms_control_handler(ControlPacket_t *req, uint8_t *resp) { #endif switch (req->request) { - // **** 0xa0: get rtc time - case 0xa0: - resp_len = get_rtc_pkt(resp); - break; - // **** 0xa1: set rtc year - case 0xa1: - t = rtc_get_time(); - t.year = req->param1; - rtc_set_time(t); - break; - // **** 0xa2: set rtc month - case 0xa2: - t = rtc_get_time(); - t.month = req->param1; - rtc_set_time(t); - break; - // **** 0xa3: set rtc day - case 0xa3: - t = rtc_get_time(); - t.day = req->param1; - rtc_set_time(t); - break; - // **** 0xa4: set rtc weekday - case 0xa4: - t = rtc_get_time(); - t.weekday = req->param1; - rtc_set_time(t); - break; - // **** 0xa5: set rtc hour - case 0xa5: - t = rtc_get_time(); - t.hour = req->param1; - rtc_set_time(t); - break; - // **** 0xa6: set rtc minute - case 0xa6: - t = rtc_get_time(); - t.minute = req->param1; - rtc_set_time(t); - break; - // **** 0xa7: set rtc second - case 0xa7: - t = rtc_get_time(); - t.second = req->param1; - rtc_set_time(t); - break; // **** 0xa8: get microsecond timer case 0xa8: time = microsecond_timer_get(); diff --git a/board/stm32fx/board.h b/board/stm32fx/board.h index 808f7738..81036118 100644 --- a/board/stm32fx/board.h +++ b/board/stm32fx/board.h @@ -9,8 +9,6 @@ #include "drivers/harness.h" #include "drivers/fan.h" #include "stm32fx/llfan.h" -#include "stm32fx/llrtc.h" -#include "drivers/rtc.h" #include "drivers/clock_source.h" #include "boards/white.h" #include "boards/grey.h" diff --git a/board/stm32fx/llrtc.h b/board/stm32fx/llrtc.h deleted file mode 100644 index a9b61917..00000000 --- a/board/stm32fx/llrtc.h +++ /dev/null @@ -1,69 +0,0 @@ -void enable_bdomain_protection(void) { - register_clear_bits(&(PWR->CR), PWR_CR_DBP); -} - -void disable_bdomain_protection(void) { - register_set_bits(&(PWR->CR), PWR_CR_DBP); -} - -void rtc_init(void){ - uint32_t bdcr_opts = RCC_BDCR_RTCEN; - uint32_t bdcr_mask = (RCC_BDCR_RTCEN | RCC_BDCR_RTCSEL); - if (current_board->has_rtc_battery) { - bdcr_opts |= (RCC_BDCR_RTCSEL_0 | RCC_BDCR_LSEON); - bdcr_mask |= (RCC_BDCR_LSEMOD | RCC_BDCR_LSEBYP | RCC_BDCR_LSEON); - } else { - bdcr_opts |= RCC_BDCR_RTCSEL_1; - RCC->CSR |= RCC_CSR_LSION; - while((RCC->CSR & RCC_CSR_LSIRDY) == 0){} - } - - // Initialize RTC module and clock if not done already. - if((RCC->BDCR & bdcr_mask) != bdcr_opts){ - print("Initializing RTC\n"); - // Reset backup domain - register_set_bits(&(RCC->BDCR), RCC_BDCR_BDRST); - - // Disable write protection - disable_bdomain_protection(); - - // Clear backup domain reset - register_clear_bits(&(RCC->BDCR), RCC_BDCR_BDRST); - - // Set RTC options - register_set(&(RCC->BDCR), bdcr_opts, bdcr_mask); - - // Enable write protection - enable_bdomain_protection(); - } -} - -void rtc_wakeup_init(void) { - EXTI->IMR |= EXTI_IMR_MR22; - EXTI->RTSR |= EXTI_RTSR_TR22; // rising edge - EXTI->FTSR &= ~EXTI_FTSR_TR22; // falling edge - - NVIC_DisableIRQ(RTC_WKUP_IRQn); - - // Disable write protection - disable_bdomain_protection(); - RTC->WPR = 0xCA; - RTC->WPR = 0x53; - - RTC->CR &= ~RTC_CR_WUTE; - while((RTC->ISR & RTC_ISR_WUTWF) == 0){} - - RTC->CR &= ~RTC_CR_WUTIE; - RTC->ISR &= ~RTC_ISR_WUTF; - //PWR->CR |= PWR_CR_CWUF; - - RTC->WUTR = DEEPSLEEP_WAKEUP_DELAY; - // Wakeup timer interrupt enable, wakeup timer enable, select 1Hz rate - RTC->CR |= RTC_CR_WUTE | RTC_CR_WUTIE | RTC_CR_WUCKSEL_2; - - // Re-enable write protection - RTC->WPR = 0x00; - enable_bdomain_protection(); - - NVIC_EnableIRQ(RTC_WKUP_IRQn); -} diff --git a/board/stm32h7/board.h b/board/stm32h7/board.h index d293a54c..f5a8e55a 100644 --- a/board/stm32h7/board.h +++ b/board/stm32h7/board.h @@ -9,10 +9,8 @@ #include "drivers/harness.h" #include "drivers/fan.h" #include "stm32h7/llfan.h" -#include "stm32h7/llrtc.h" #include "stm32h7/lldac.h" #include "drivers/fake_siren.h" -#include "drivers/rtc.h" #include "drivers/clock_source.h" #include "boards/red.h" #include "boards/red_chiplet.h" diff --git a/board/stm32h7/llrtc.h b/board/stm32h7/llrtc.h deleted file mode 100644 index 03787d0d..00000000 --- a/board/stm32h7/llrtc.h +++ /dev/null @@ -1,69 +0,0 @@ -void enable_bdomain_protection(void) { - register_clear_bits(&(PWR->CR1), PWR_CR1_DBP); -} - -void disable_bdomain_protection(void) { - register_set_bits(&(PWR->CR1), PWR_CR1_DBP); -} - -void rtc_init(void){ - uint32_t bdcr_opts = RCC_BDCR_RTCEN; - uint32_t bdcr_mask = (RCC_BDCR_RTCEN | RCC_BDCR_RTCSEL); - if (current_board->has_rtc_battery) { - bdcr_opts |= (RCC_BDCR_LSEDRV_1 | RCC_BDCR_RTCSEL_0 | RCC_BDCR_LSEON); - bdcr_mask |= (RCC_BDCR_LSEDRV | RCC_BDCR_LSEBYP | RCC_BDCR_LSEON); - } else { - bdcr_opts |= RCC_BDCR_RTCSEL_1; - RCC->CSR |= RCC_CSR_LSION; - while((RCC->CSR & RCC_CSR_LSIRDY) == 0){} - } - - // Initialize RTC module and clock if not done already. - if((RCC->BDCR & bdcr_mask) != bdcr_opts){ - print("Initializing RTC\n"); - // Reset backup domain - register_set_bits(&(RCC->BDCR), RCC_BDCR_BDRST); - - // Disable write protection - disable_bdomain_protection(); - - // Clear backup domain reset - register_clear_bits(&(RCC->BDCR), RCC_BDCR_BDRST); - - // Set RTC options - register_set(&(RCC->BDCR), bdcr_opts, bdcr_mask); - - // Enable write protection - enable_bdomain_protection(); - } -} - -void rtc_wakeup_init(void) { - EXTI->IMR1 |= EXTI_IMR1_IM19; - EXTI->RTSR1 |= EXTI_RTSR1_TR19; // rising edge - EXTI->FTSR1 &= ~EXTI_FTSR1_TR19; // falling edge - - NVIC_DisableIRQ(RTC_WKUP_IRQn); - - // Disable write protection - disable_bdomain_protection(); - RTC->WPR = 0xCA; - RTC->WPR = 0x53; - - RTC->CR &= ~RTC_CR_WUTE; - while((RTC->ISR & RTC_ISR_WUTWF) == 0){} - - RTC->CR &= ~RTC_CR_WUTIE; - RTC->ISR &= ~RTC_ISR_WUTF; - //PWR->CR1 |= PWR_CR1_CWUF; - - RTC->WUTR = DEEPSLEEP_WAKEUP_DELAY; - // Wakeup timer interrupt enable, wakeup timer enable, select 1Hz rate - RTC->CR |= RTC_CR_WUTE | RTC_CR_WUTIE | RTC_CR_WUCKSEL_2; - - // Re-enable write protection - RTC->WPR = 0x00; - enable_bdomain_protection(); - - NVIC_EnableIRQ(RTC_WKUP_IRQn); -} diff --git a/python/__init__.py b/python/__init__.py index 304aa135..063602f4 100644 --- a/python/__init__.py +++ b/python/__init__.py @@ -6,7 +6,6 @@ import usb1 import struct import hashlib import binascii -import datetime import logging from functools import wraps, partial from itertools import accumulate @@ -894,21 +893,6 @@ class Panda: def set_heartbeat_disabled(self): self._handle.controlWrite(Panda.REQUEST_OUT, 0xf8, 0, 0, b'') - # ******************* RTC ******************* - def set_datetime(self, dt): - self._handle.controlWrite(Panda.REQUEST_OUT, 0xa1, int(dt.year), 0, b'') - self._handle.controlWrite(Panda.REQUEST_OUT, 0xa2, int(dt.month), 0, b'') - self._handle.controlWrite(Panda.REQUEST_OUT, 0xa3, int(dt.day), 0, b'') - self._handle.controlWrite(Panda.REQUEST_OUT, 0xa4, int(dt.isoweekday()), 0, b'') - self._handle.controlWrite(Panda.REQUEST_OUT, 0xa5, int(dt.hour), 0, b'') - self._handle.controlWrite(Panda.REQUEST_OUT, 0xa6, int(dt.minute), 0, b'') - self._handle.controlWrite(Panda.REQUEST_OUT, 0xa7, int(dt.second), 0, b'') - - def get_datetime(self): - dat = self._handle.controlRead(Panda.REQUEST_IN, 0xa0, 0, 0, 8) - a = struct.unpack("HBBBBBB", dat) - return datetime.datetime(a[0], a[1], a[2], a[4], a[5], a[6]) - # ****************** Timer ***************** def get_microsecond_timer(self): dat = self._handle.controlRead(Panda.REQUEST_IN, 0xa8, 0, 0, 4) diff --git a/tests/rtc_test.py b/tests/rtc_test.py deleted file mode 100755 index 01c9f4dd..00000000 --- a/tests/rtc_test.py +++ /dev/null @@ -1,10 +0,0 @@ -#!/usr/bin/env python -import datetime - -from panda import Panda - -if __name__ == "__main__": - p = Panda() - - p.set_datetime(datetime.datetime.now()) - print(p.get_datetime())