Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
45 commits
Select commit Hold shift + click to select a range
04a8b29
progress
jakubberkop Nov 28, 2025
9763825
Progress 2
jakubberkop Nov 28, 2025
1a6eea0
Don't break the setup code...
jakubberkop Nov 28, 2025
a4f4114
Body is building
jakubberkop Dec 4, 2025
6fe0aa8
Building all of the things
jakubberkop Dec 4, 2025
4dcab98
Progress
jakubberkop Dec 4, 2025
c7dbeb3
Progress
jakubberkop Dec 5, 2025
4afc68f
Misra fixups
jakubberkop Dec 5, 2025
125da1a
Analyze all files with misra
jakubberkop Dec 5, 2025
2555ade
Cleanup
jakubberkop Dec 5, 2025
603b5fe
Build script cleanup
jakubberkop Dec 5, 2025
9d20caa
Cleanup
jakubberkop Dec 5, 2025
715fdde
Cleanup
jakubberkop Dec 5, 2025
c9a5b09
Cleanup
jakubberkop Dec 5, 2025
bbad485
Verify debugging flags
jakubberkop Dec 5, 2025
f637a49
Misra fixups
jakubberkop Dec 5, 2025
b28dea5
Misra test fixups
jakubberkop Dec 5, 2025
d25b617
Misra fixups
jakubberkop Dec 5, 2025
43aaa6d
Misra test - specify files manually
jakubberkop Dec 5, 2025
83c3699
Misra fixups
jakubberkop Dec 5, 2025
405df47
Misra fixups
jakubberkop Dec 5, 2025
a9ed788
Misra fixups
jakubberkop Dec 5, 2025
23db5d6
Silence misra errors raised by opendbc
jakubberkop Dec 5, 2025
161266a
Cleanups build script
jakubberkop Dec 5, 2025
6fa9adf
Misra fixups
jakubberkop Dec 5, 2025
6b3caeb
Misra fixups
jakubberkop Dec 5, 2025
eeefaa5
Fix TODO
jakubberkop Dec 5, 2025
7a6fb5e
Misra cleanups
jakubberkop Jan 6, 2026
ee5e3dd
Sort file names arguments
jakubberkop Jan 6, 2026
9d5c048
Fix missing interrupt handlers
jakubberkop Jan 13, 2026
cc8a415
Reapply e42367d
jakubberkop Jan 13, 2026
7b2da83
fix RSA bug introduced
robbederks Jan 14, 2026
ad1c691
fix can buffers?
robbederks Jan 14, 2026
3811735
Restore files to match the master branch. Remove extra misra suppress…
jakubberkop Jan 15, 2026
8b68ab8
Comment weak linking in the linker script, to raise an error if requi…
jakubberkop Jan 15, 2026
e42f179
Merge branch 'master' of ssh://github.com/commaai/panda into source_a…
adeebshihadeh Feb 4, 2026
81e7161
Merge branch 'master' of ssh://github.com/commaai/panda into source_a…
adeebshihadeh Feb 4, 2026
13727f6
drivers.h
adeebshihadeh Feb 4, 2026
8d52c33
fix build
adeebshihadeh Feb 4, 2026
f636923
lldrivers.h
adeebshihadeh Feb 4, 2026
60ebe64
boards.h
adeebshihadeh Feb 5, 2026
fa9be4a
less diff
adeebshihadeh Feb 5, 2026
17f2cc6
lil less
adeebshihadeh Feb 6, 2026
7a206f8
less .h
adeebshihadeh Feb 6, 2026
e970323
mv a lil more
adeebshihadeh Feb 6, 2026
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: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ a.out
dist/
build/
pandacan.egg-info/
obj/
/board/obj/
examples/output.csv
.DS_Store
.vscode*
Expand Down
118 changes: 101 additions & 17 deletions SConscript
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ def to_c_uint32(x):
return "{" + 'U,'.join(map(str, nums)) + "U}"


def build_project(project_name, project, main, extra_flags):
def build_project(project_name, project, main, shared, extra_flags):
project_dir = Dir(f'./board/obj/{project_name}/')

flags = project["FLAGS"] + extra_flags + common_flags + [
Expand Down Expand Up @@ -100,28 +100,73 @@ def build_project(project_name, project, main, extra_flags):

startup = env.Object(project["STARTUP_FILE"])

shared += [
"./crypto/rsa.c",
"./crypto/sha.c",
"./board/libc.c",
"./board/early_init.c",
"./board/drivers/critical.c",
"./board/drivers/led.c",
"./board/drivers/pwm.c",
"./board/drivers/gpio.c",
"./board/drivers/fake_siren.c",
"./board/stm32h7/lli2c.c",
"./board/stm32h7/clock.c",
"./board/drivers/clock_source.c",
"./board/stm32h7/sound.c",
"./board/stm32h7/llflash.c",
"./board/stm32h7/stm32h7_config.c",
"./board/drivers/registers.c",
"./board/drivers/interrupts.c",
"./board/stm32h7/interrupt_handlers.c",
"./board/provision.c",
"./board/stm32h7/peripherals.c",
"./board/stm32h7/llusb.c",
"./board/drivers/usb.c",
"./board/drivers/spi.c",
"./board/drivers/timers.c",
"./board/stm32h7/lladc.c",
"./board/stm32h7/llspi.c",
"./board/drivers/faults.c",
"./board/boards/unused_funcs.c",
"./board/utils.c",
"./board/globals.c",
"./board/obj/gitversion.c",
"./board/stm32h7/lluart.c",
"./board/drivers/uart.c",
]

# Build bootstub
bs_env = env.Clone()
bs_obj_dir = Dir(f'./board/obj/{project_name}/bootstub')
bs_env = env.Clone(OBJPREFIX=bs_obj_dir)

bs_env.Append(CFLAGS="-DBOOTSTUB", ASFLAGS="-DBOOTSTUB", LINKFLAGS="-DBOOTSTUB")
bs_elf = bs_env.Program(f"{project_dir}/bootstub.elf", [
startup,
"./crypto/rsa.c",
"./crypto/sha.c",
"./board/bootstub.c",
])
"./board/drivers/flasher.c",
] + shared)
bs_env.Objcopy(f"./board/obj/bootstub.{project_name}.bin", bs_elf)

# Build + sign main (aka app)
main_elf = env.Program(f"{project_dir}/main.elf", [
startup,
main
], LINKFLAGS=[f"-Wl,--section-start,.isr_vector={project['APP_START_ADDRESS']}"] + flags)
"./board/can_comms.c",
"./board/drivers/fan.c",
"./board/drivers/power_saving.c",
"./board/stm32h7/llfdcan.c",
"./board/drivers/harness.c",
"./board/drivers/bootkick.c",
"./board/stm32h7/llfan.c",
"./board/drivers/fdcan.c",
"./board/drivers/can_common.c",
main,
] + shared, LINKFLAGS=[f"-Wl,--section-start,.isr_vector={project['APP_START_ADDRESS']}"] + flags)
main_bin = env.Objcopy(f"{project_dir}/main.bin", main_elf)
sign_py = File(f"./crypto/sign.py").srcnode().relpath
sign_py = File(f"crypto/sign.py").srcnode().relpath
env.Command(f"./board/obj/{project_name}.bin.signed", main_bin, f"SETLEN=1 {sign_py} $SOURCE $TARGET {cert_fn}")



base_project_h7 = {
"STARTUP_FILE": "./board/stm32h7/startup_stm32h7x5xx.s",
"LINKER_SCRIPT": "./board/stm32h7/stm32h7x5_flash.ld",
Expand All @@ -137,32 +182,71 @@ base_project_h7 = {
}

# Common autogenerated includes
with open("board/obj/gitversion.h", "w") as f:
with open("./board/obj/gitversion.c", "w") as f:
version = get_version(BUILDER, BUILD_TYPE)
f.write(f'extern const uint8_t gitversion[{len(version)+1}];\n')
f.write('#include "gitversion.h"\n')
f.write(f'const uint8_t gitversion[{len(version)+1}] = "{version}";\n')

with open("board/obj/version", "w") as f:
with open("./board/obj/gitversion.h", "w") as f:
version = get_version(BUILDER, BUILD_TYPE)
f.write("#pragma once\n")
f.write("#include <stdint.h>\n")
f.write(f'extern const uint8_t gitversion[{len(version)+1}];\n')

with open("./board/obj/version", "w") as f:
f.write(f'{get_version(BUILDER, BUILD_TYPE)}')

certs = [get_key_header(n) for n in ["debug", "release"]]
with open("board/obj/cert.h", "w") as f:
with open("./board/obj/cert.h", "w") as f:
for cert in certs:
f.write("\n".join(cert) + "\n")

# panda fw
build_project("panda_h7", base_project_h7, "./board/main.c", [])
panda_main = [
"./board/main_comms.c",
"./board/main.c",
"./board/drivers/simple_watchdog.c",
]

panda_shared = [
"./board/stm32h7/board.c",
"./board/boards/tres.c",
"./board/boards/red.c",
"./board/boards/cuatro.c",
"./board/main_definitions.c"
]

build_project("panda_h7", base_project_h7, panda_main, panda_shared, ["-DPANDA"])

# panda jungle fw
flags = [
"-DPANDA_JUNGLE",
]
if os.getenv("FINAL_PROVISIONING"):
flags += ["-DFINAL_PROVISIONING"]
build_project("panda_jungle_h7", base_project_h7, "./board/jungle/main.c", flags)

jungle_main = [
"./board/jungle/main_comms.c",
"./board/jungle/main.c",
]
jungle_shared = [
"./board/jungle/stm32h7/board.c",
"./board/jungle/boards/board_v2.c",
]
build_project("panda_jungle_h7", base_project_h7, jungle_main, jungle_shared, flags)

# body fw
build_project("body_h7", base_project_h7, "./board/body/main.c", ["-DPANDA_BODY"])
body_main = [
"./board/body/main.c",
"./board/body/main_comms.c",
]
body_shared = [
"./board/body/boards/board_body.c",
"./board/body/stm32h7/board.c",
"./board/body/motor_control.c",
"./board/body/motor_encoder.c"
]

build_project("body_h7", base_project_h7, body_main, body_shared, ["-DPANDA_BODY"])

# test files
if GetOption('extras'):
Expand Down
62 changes: 0 additions & 62 deletions board/boards/board_declarations.h

This file was deleted.

107 changes: 107 additions & 0 deletions board/boards/boards.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
#pragma once

#include <stdint.h>
#include <stdbool.h>

#include "board/config.h"

// ======================= BOOT STATE =======================

typedef enum {
BOOT_STANDBY,
BOOT_BOOTKICK,
BOOT_RESET,
} BootState;

// ======================= BOARD FUNCTION TYPES =======================

typedef bool (*board_get_button)(void);
typedef bool (*board_read_som_gpio)(void);
typedef float (*board_get_channel_power)(uint8_t channel);
typedef uint16_t (*board_get_sbu_mV)(uint8_t channel, uint8_t sbu);
typedef uint32_t (*board_read_current_mA)(void);
typedef uint32_t (*board_read_voltage_mV)(void);
typedef void (*board_board_tick)(void);
typedef void (*board_enable_can_transceiver)(uint8_t transceiver, bool enabled);
typedef void (*board_enable_header_pin)(uint8_t pin_num, bool enabled);
typedef void (*board_init_bootloader)(void);
typedef void (*board_init)(void);
typedef void (*board_set_amp_enabled)(bool enabled);
typedef void (*board_set_bootkick)(BootState state);
typedef void (*board_set_can_mode)(uint8_t mode);
typedef void (*board_set_fan_enabled)(bool enabled);
typedef void (*board_set_harness_orientation)(uint8_t orientation);
typedef void (*board_set_ignition)(bool enabled);
typedef void (*board_set_individual_ignition)(uint8_t bitmask);
typedef void (*board_set_ir_power)(uint8_t percentage);
typedef void (*board_set_panda_individual_power)(uint8_t port_num, bool enabled);
typedef void (*board_set_panda_power)(bool enabled);
typedef void (*board_set_siren)(bool enabled);

// ======================= BOARD STRUCT =======================

typedef struct board {
struct harness_configuration *harness_config;
GPIO_TypeDef * const led_GPIO[3];
const uint8_t led_pin[3];
const uint8_t led_pwm_channels[3]; // leave at 0 to disable PWM
const bool has_spi;
const bool has_fan;
const uint16_t avdd_mV;
const uint8_t fan_enable_cooldown_time;
board_init init;
board_init_bootloader init_bootloader;
board_board_tick board_tick;
board_set_panda_power set_panda_power;
board_get_button get_button;
board_enable_can_transceiver enable_can_transceiver;
board_set_can_mode set_can_mode;
board_read_voltage_mV read_voltage_mV;
board_read_current_mA read_current_mA;
board_set_ir_power set_ir_power;
board_set_fan_enabled set_fan_enabled;
board_set_siren set_siren;
board_set_bootkick set_bootkick;
board_read_som_gpio read_som_gpio;
board_set_amp_enabled set_amp_enabled;
board_set_panda_individual_power set_panda_individual_power;
board_set_ignition set_ignition;
board_set_individual_ignition set_individual_ignition;
board_set_harness_orientation set_harness_orientation;
board_enable_header_pin enable_header_pin;
board_get_channel_power get_channel_power;
board_get_sbu_mV get_sbu_mV;
} board;

// ======================= UNUSED FUNCS =======================

void unused_init_bootloader(void);
void unused_set_ir_power(uint8_t percentage);
void unused_set_fan_enabled(bool enabled);
void unused_set_siren(bool enabled);
uint32_t unused_read_current(void);
void unused_set_bootkick(BootState state);
bool unused_read_som_gpio(void);
void unused_set_amp_enabled(bool enabled);

// ======================= RED =======================
// Red Panda (STM32H7) + Harness

struct harness_configuration;

extern struct harness_configuration red_harness_config;
extern struct board board_red;

uint32_t red_read_voltage_mV(void);

// ======================= TRES =======================

extern struct board board_tres;

void tres_set_can_mode(uint8_t mode);
bool tres_read_som_gpio(void);

// ======================= CUATRO =======================
// Cuatro (STM32H7) + Harness

extern struct board board_cuatro;
7 changes: 4 additions & 3 deletions board/boards/cuatro.h → board/boards/cuatro.c
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
#pragma once

#include "board_declarations.h"
#include "board/config.h"
#include "board/boards/boards.h"
#include "board/drivers/drivers.h"
#include "board/stm32h7/lldrivers.h"

// ////////////////////////// //
// Cuatro (STM32H7) + Harness //
Expand Down
10 changes: 5 additions & 5 deletions board/boards/red.h → board/boards/red.c
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#pragma once
#include "boards.h"

#include "board_declarations.h"
#include "board/globals.h"

// ///////////////////////////// //
// Red Panda (STM32H7) + Harness //
Expand Down Expand Up @@ -67,7 +67,7 @@ static void red_set_can_mode(uint8_t mode) {
}
}

static uint32_t red_read_voltage_mV(void){
uint32_t red_read_voltage_mV(void){
return adc_get_mV(&(const adc_signal_t) ADC_CHANNEL_DEFAULT(ADC1, 2)) * 11U;
}

Expand Down Expand Up @@ -98,7 +98,7 @@ static void red_init(void) {
set_gpio_output(GPIOB, 14, 1);
}

static harness_configuration red_harness_config = {
harness_configuration red_harness_config = {
.GPIO_SBU1 = GPIOC,
.GPIO_SBU2 = GPIOA,
.GPIO_relay_SBU1 = GPIOC,
Expand All @@ -111,7 +111,7 @@ static harness_configuration red_harness_config = {
.adc_signal_SBU2 = ADC_CHANNEL_DEFAULT(ADC1, 17)
};

board board_red = {
struct board board_red = {
.set_bootkick = unused_set_bootkick,
.harness_config = &red_harness_config,
.has_spi = false,
Expand Down
Loading
Loading