mirror of
https://github.com/infiniteCable2/panda.git
synced 2026-02-18 09:13:52 +08:00
@@ -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,
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
22
board/main.c
22
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;
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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"
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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)
|
||||
|
||||
@@ -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())
|
||||
Reference in New Issue
Block a user