Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions SConscript
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,8 @@ def build_project(project_name, project, extra_flags):
'.',
'..',
panda_root,
f"{panda_root}/include/",
f"{panda_root}/include/board/",
f"{panda_root}/board/",
f"{panda_root}/../opendbc/safety/",
]
Expand Down
3 changes: 2 additions & 1 deletion board/bootstub.c
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,8 @@
#define MIN_VERSION 2

// ********************* Includes *********************
#include "config.h"
#include "board_config.h"
#include "stm_config.h"

#include "drivers/led.h"
#include "drivers/pwm.h"
Expand Down
1 change: 1 addition & 0 deletions board/comms_definitions.h
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
#pragma once
typedef struct {
uint8_t request;
uint16_t param1;
Expand Down
2 changes: 1 addition & 1 deletion board/critical.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
// ********************* Critical section helpers *********************
uint8_t global_critical_depth = 0U;

static volatile bool interrupts_enabled = false;
volatile bool interrupts_enabled = false;

void enable_interrupts(void) {
interrupts_enabled = true;
Expand Down
1 change: 1 addition & 0 deletions board/critical_declarations.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ void enable_interrupts(void);
void disable_interrupts(void);

extern uint8_t global_critical_depth;
extern volatile bool interrupts_enabled;

#define ENTER_CRITICAL() \
__disable_irq(); \
Expand Down
8 changes: 0 additions & 8 deletions board/drivers/can_common.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,14 +17,6 @@ int can_silent = ALL_CAN_SILENT;
bool can_loopback = false;

// ********************* instantiate queues *********************
#define can_buffer(x, size) \
static CANPacket_t elems_##x[size]; \
extern can_ring can_##x; \
can_ring can_##x = { .w_ptr = 0, .r_ptr = 0, .fifo_size = (size), .elems = (CANPacket_t *)&(elems_##x) };

#define CAN_RX_BUFFER_SIZE 4096U
#define CAN_TX_BUFFER_SIZE 416U

#ifdef STM32H7
// ITCM RAM and DTCM RAM are the fastest for Cortex-M7 core access
__attribute__((section(".axisram"))) can_buffer(rx_q, CAN_RX_BUFFER_SIZE)
Expand Down
24 changes: 22 additions & 2 deletions board/drivers/can_common_declarations.h
Original file line number Diff line number Diff line change
@@ -1,4 +1,9 @@
#pragma once
#include <stdbool.h>
#include <stdint.h>
#include "can.h"
#include "health.h"
#include "safety.h"

typedef struct {
volatile uint32_t w_ptr;
Expand All @@ -7,6 +12,18 @@ typedef struct {
CANPacket_t *elems;
} can_ring;

#define can_buffer(x, size) \
static CANPacket_t elems_##x[size]; \
can_ring can_##x = { .w_ptr = 0, .r_ptr = 0, .fifo_size = (size), .elems = (CANPacket_t *)&(elems_##x) };

#define CAN_RX_BUFFER_SIZE 4096U
#define CAN_TX_BUFFER_SIZE 416U

extern can_ring can_rx_q;
extern can_ring can_tx1_q;
extern can_ring can_tx2_q;
extern can_ring can_tx3_q;

typedef struct {
uint8_t bus_lookup;
uint8_t can_num_lookup;
Expand Down Expand Up @@ -75,14 +92,17 @@ extern bus_config_t bus_config[BUS_CONFIG_ARRAY_SIZE];
#define CAN_NUM_FROM_BUS_NUM(num) (bus_config[num].can_num_lookup)

void can_init_all(void);
void can_clear(can_ring *q);
void can_set_orientation(bool flipped);
#ifdef PANDA_JUNGLE
void can_set_forwarding(uint8_t from, uint8_t to);
#endif
void ignition_can_hook(CANPacket_t *to_push);
bool can_tx_check_min_slots_free(uint32_t min);
uint8_t calculate_checksum(const uint8_t *dat, uint32_t len);
void can_set_checksum(CANPacket_t *packet);
extern uint8_t calculate_checksum(const uint8_t *dat, uint32_t len);
extern void can_set_checksum(CANPacket_t *packet);
bool can_check_checksum(CANPacket_t *packet);
void can_send(CANPacket_t *to_push, uint8_t bus_number, bool skip_tx_hook);
bool is_speed_valid(uint32_t speed, const uint32_t *all_speeds, uint8_t len);

extern bool safety_tx_hook(CANPacket_t *to_send);
1 change: 1 addition & 0 deletions board/drivers/fan.h
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
#include "fan_declarations.h"
#include "utils.h"

struct fan_state_t fan_state;

Expand Down
21 changes: 5 additions & 16 deletions board/drivers/gpio.h
Original file line number Diff line number Diff line change
@@ -1,19 +1,6 @@
#define MODE_INPUT 0
#define MODE_OUTPUT 1
#define MODE_ALTERNATE 2
#define MODE_ANALOG 3

#define PULL_NONE 0
#define PULL_UP 1
#define PULL_DOWN 2

#define OUTPUT_TYPE_PUSH_PULL 0U
#define OUTPUT_TYPE_OPEN_DRAIN 1U

typedef struct {
GPIO_TypeDef * const bank;
uint8_t pin;
} gpio_t;
#include "drivers/gpio_declarations.h"
#include "critical_declarations.h"
#include "drivers/registers.h"

void set_gpio_mode(GPIO_TypeDef *GPIO, unsigned int pin, unsigned int mode) {
ENTER_CRITICAL();
Expand Down Expand Up @@ -68,12 +55,14 @@ int get_gpio_input(const GPIO_TypeDef *GPIO, unsigned int pin) {
return (GPIO->IDR & (1UL << pin)) == (1UL << pin);
}

// cppcheck-suppress[misra-c2012-9.3,misra-c2012-8.7]
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

try not to suppress any misra errors like these, let's fix them instead

void gpio_set_all_output(gpio_t *pins, uint8_t num_pins, bool enabled) {
for (uint8_t i = 0; i < num_pins; i++) {
set_gpio_output(pins[i].bank, pins[i].pin, enabled);
}
}

// cppcheck-suppress[misra-c2012-9.3,misra-c2012-8.7]
void gpio_set_bitmask(gpio_t *pins, uint8_t num_pins, uint32_t bitmask) {
for (uint8_t i = 0; i < num_pins; i++) {
set_gpio_output(pins[i].bank, pins[i].pin, (bitmask >> i) & 1U);
Expand Down
2 changes: 2 additions & 0 deletions board/drivers/registers.h
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
#pragma once
#include "registers_declarations.h"
#include "critical_declarations.h"

static reg register_map[REGISTER_MAP_SIZE];

Expand Down
1 change: 1 addition & 0 deletions board/faults.h
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
#pragma once
#include "faults_declarations.h"

uint8_t fault_status = FAULT_STATUS_NONE;
Expand Down
1 change: 1 addition & 0 deletions board/health.h
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
// When changing these structs, python/__init__.py needs to be kept up to date!
#pragma once

#define HEALTH_PACKET_VERSION 16
struct __attribute__((packed)) health_t {
Expand Down
3 changes: 2 additions & 1 deletion board/jungle/main.c
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
// ********************* Includes *********************
#include "board/config.h"
#include "board_config.h"
#include "board/stm_config.h"

#include "safety.h"

Expand Down
1 change: 1 addition & 0 deletions board/libc.h
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
// **** libc ****
#pragma once

void delay(uint32_t a) {
volatile uint32_t i;
Expand Down
3 changes: 2 additions & 1 deletion board/main.c
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
// ********************* Includes *********************
#include "config.h"
#include "board_config.h"
#include "stm_config.h"

#include "drivers/led.h"
#include "drivers/pwm.h"
Expand Down
1 change: 1 addition & 0 deletions board/main_declarations.h
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
#pragma once
#include "platform_definitions.h"

// ******************** Prototypes ********************
void print(const char *a);
Expand Down
6 changes: 5 additions & 1 deletion board/utils.h
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
#ifndef UTILS_DEFINITION_H
#define UTILS_DEFINITION_H
#include <stdint.h>
// cppcheck-suppress-macro misra-c2012-1.2; allow __typeof__ extension
#define MIN(a, b) ({ \
__typeof__ (a) _a = (a); \
Expand Down Expand Up @@ -42,6 +45,7 @@

// compute the time elapsed (in microseconds) from 2 counter samples
// case where ts < ts_last is ok: overflow is properly re-casted into uint32_t
uint32_t get_ts_elapsed(uint32_t ts, uint32_t ts_last) {
static inline uint32_t get_ts_elapsed(uint32_t ts, uint32_t ts_last) {
return ts - ts_last;
}
#endif //UTILS_DEFINITION_H
11 changes: 3 additions & 8 deletions board/config.h → include/board/board_config.h
Original file line number Diff line number Diff line change
Expand Up @@ -32,13 +32,8 @@
#endif
#endif

// platform includes
#ifdef STM32H7
#include "stm32h7/stm32h7_config.h"
#elif defined(STM32F4)
#include "stm32f4/stm32f4_config.h"
#ifndef BOOTSTUB
#include "main_definitions.h"
#else
// TODO: uncomment this, cppcheck complains
// building for tests
//#include "fake_stm.h"
#include "bootstub_definitions.h"
#endif
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
#include "platform_definitions.h"
#include "utils.h"
// ******************** Prototypes ********************
void print(const char *a){ UNUSED(a); }
void puth(uint8_t i){ UNUSED(i); }
Expand Down
30 changes: 30 additions & 0 deletions include/board/drivers/gpio_declarations.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
#pragma once
#include <stdbool.h>
#include "platform_definitions.h"

#define MODE_INPUT 0
#define MODE_OUTPUT 1
#define MODE_ALTERNATE 2
#define MODE_ANALOG 3

#define PULL_NONE 0
#define PULL_UP 1
#define PULL_DOWN 2

#define OUTPUT_TYPE_PUSH_PULL 0U
#define OUTPUT_TYPE_OPEN_DRAIN 1U

typedef struct {
GPIO_TypeDef * const bank;
uint8_t pin;
} gpio_t;

void set_gpio_mode(GPIO_TypeDef *GPIO, unsigned int pin, unsigned int mode);
void set_gpio_output(GPIO_TypeDef *GPIO, unsigned int pin, bool enabled);
void set_gpio_output_type(GPIO_TypeDef *GPIO, unsigned int pin, unsigned int output_type);
void set_gpio_alternate(GPIO_TypeDef *GPIO, unsigned int pin, unsigned int mode);
void set_gpio_pullup(GPIO_TypeDef *GPIO, unsigned int pin, unsigned int mode);
int get_gpio_input(const GPIO_TypeDef *GPIO, unsigned int pin);
void gpio_set_all_output(gpio_t *pins, uint8_t num_pins, bool enabled);
void gpio_set_bitmask(gpio_t *pins, uint8_t num_pins, uint32_t bitmask);
bool detect_with_pull(GPIO_TypeDef *GPIO, int pin, int mode);
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
#pragma once
#include "main_declarations.h"

// ********************* Globals **********************
Expand Down
15 changes: 15 additions & 0 deletions include/board/platform_definitions.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
/* Platform includes that provide definitions that a lot drivers need, e.g.:
__enable_irq
__disable_irq
GPIO_TypeDef
TIM_TypeDef
IRQn_Type
USART_TypeDef
CAN_TypeDef
*/
#pragma once
#ifdef STM32H7
#include "stm32h7/stm32h7_platform_definitions.h"
#elif defined(STM32F4)
#include "stm32f4/stm32f4_platform_definitions.h"
#endif
Original file line number Diff line number Diff line change
@@ -1,44 +1,9 @@
#include "stm32f4/inc/stm32f4xx.h"
#include "stm32f4/inc/stm32f4xx_hal_gpio_ex.h"
#define MCU_IDCODE 0x463U

#define CORE_FREQ 96U // in MHz
#define APB1_FREQ (CORE_FREQ/2U)
#define APB1_TIMER_FREQ (APB1_FREQ*2U) // APB1 is multiplied by 2 for the timer peripherals
#define APB2_FREQ (CORE_FREQ/2U)
#define APB2_TIMER_FREQ (APB2_FREQ*2U) // APB2 is multiplied by 2 for the timer peripherals

#define BOOTLOADER_ADDRESS 0x1FFF0004U

// Around (1Mbps / 8 bits/byte / 12 bytes per message)
#define CAN_INTERRUPT_RATE 12000U

#define MAX_LED_FADE 8192U

#define NUM_INTERRUPTS 102U // There are 102 external interrupt sources (see stm32f413.h)

#define TICK_TIMER_IRQ TIM1_BRK_TIM9_IRQn
#define TICK_TIMER TIM9

#define MICROSECOND_TIMER TIM2

#define INTERRUPT_TIMER_IRQ TIM6_DAC_IRQn
#define INTERRUPT_TIMER TIM6

#define IND_WDG IWDG

#define PROVISION_CHUNK_ADDRESS 0x1FFF79E0U
#define DEVICE_SERIAL_NUMBER_ADDRESS 0x1FFF79C0U

#include "can.h"
#include "comms_definitions.h"

#ifndef BOOTSTUB
#include "main_definitions.h"
#else
#include "bootstub_declarations.h"
#endif

#include "libc.h"
#include "critical.h"
#include "faults.h"
Expand Down
35 changes: 35 additions & 0 deletions include/board/stm32f4/stm32f4_platform_definitions.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
#pragma once
#include "stm32f4/inc/stm32f4xx.h"
#include "stm32f4/inc/stm32f4xx_hal_gpio_ex.h"
#define MCU_IDCODE 0x463U

#define CORE_FREQ 96U // in MHz
#define APB1_FREQ (CORE_FREQ / 2U)
#define APB1_TIMER_FREQ \
(APB1_FREQ * 2U) // APB1 is multiplied by 2 for the timer peripherals
#define APB2_FREQ (CORE_FREQ / 2U)
#define APB2_TIMER_FREQ \
(APB2_FREQ * 2U) // APB2 is multiplied by 2 for the timer peripherals

#define BOOTLOADER_ADDRESS 0x1FFF0004U

// Around (1Mbps / 8 bits/byte / 12 bytes per message)
#define CAN_INTERRUPT_RATE 12000U

#define MAX_LED_FADE 8192U

#define NUM_INTERRUPTS \
102U // There are 102 external interrupt sources (see stm32f413.h)

#define TICK_TIMER_IRQ TIM1_BRK_TIM9_IRQn
#define TICK_TIMER TIM9

#define MICROSECOND_TIMER TIM2

#define INTERRUPT_TIMER_IRQ TIM6_DAC_IRQn
#define INTERRUPT_TIMER TIM6

#define IND_WDG IWDG

#define PROVISION_CHUNK_ADDRESS 0x1FFF79E0U
#define DEVICE_SERIAL_NUMBER_ADDRESS 0x1FFF79C0U
Loading
Loading