Skip to content
Open
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
151 changes: 147 additions & 4 deletions SConscript
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,103 @@ def to_c_uint32(x):
return "{" + 'U,'.join(map(str, nums)) + "U}"


def build_project(project_name, project, main, extra_flags):
common_driver_sources = [
"./board/stm32h7/interrupt_handlers.c",
"./board/stm32h7/peripherals.c",
"./board/stm32h7/clock.c",
"./board/stm32h7/llfdcan.c",
"./board/stm32h7/llusb.c",
"./board/stm32h7/llspi.c",
"./board/stm32h7/lluart.c",
"./board/stm32h7/lladc.c",
"./board/drivers/gpio.c",
"./board/drivers/registers.c",
"./board/drivers/interrupts.c",
"./board/drivers/timers.c",
"./board/drivers/pwm.c",
"./board/drivers/led.c",
"./board/drivers/can_common.c",
"./board/drivers/fdcan.c",
"./board/drivers/uart.c",
"./board/drivers/spi.c",
"./board/drivers/usb.c",
"./board/can_comms.c",
]

panda_extra_driver_sources = [
"./board/stm32h7/board.c",
"./board/stm32h7/llfan.c",
"./board/stm32h7/lli2c.c",
"./board/stm32h7/sound.c",
"./board/boards/unused_funcs.c",
"./board/boards/red.c",
"./board/boards/tres.c",
"./board/boards/cuatro.c",
"./board/drivers/simple_watchdog.c",
"./board/drivers/bootkick.c",
"./board/drivers/clock_source.c",
"./board/drivers/fan.c",
"./board/drivers/harness.c",
"./board/drivers/fake_siren.c",
"./board/sys/power_saving.c",
"./board/main_comms.c",
]

jungle_extra_driver_sources = [
"./board/jungle/stm32h7/board.c",
"./board/jungle/boards/board_v2.c",
"./board/jungle/main_comms.c",
]

body_extra_driver_sources = [
"./board/body/stm32h7/board.c",
"./board/body/boards/board_body.c",
]

bootstub_common_driver_sources = [
"./board/stm32h7/interrupt_handlers.c",
"./board/stm32h7/peripherals.c",
"./board/stm32h7/clock.c",
"./board/stm32h7/llflash.c",
"./board/stm32h7/llusb.c",
"./board/stm32h7/llspi.c",
"./board/stm32h7/lladc.c",
"./board/drivers/gpio.c",
"./board/drivers/registers.c",
"./board/drivers/interrupts.c",
"./board/drivers/timers.c",
"./board/drivers/pwm.c",
"./board/drivers/led.c",
"./board/drivers/spi.c",
"./board/drivers/usb.c",
]

panda_extra_bootstub_driver_sources = [
"./board/stm32h7/board.c",
"./board/stm32h7/llfan.c",
"./board/stm32h7/lli2c.c",
"./board/stm32h7/sound.c",
"./board/boards/unused_funcs.c",
"./board/boards/red.c",
"./board/boards/tres.c",
"./board/boards/cuatro.c",
"./board/drivers/harness.c",
"./board/drivers/fan.c",
"./board/drivers/fake_siren.c",
"./board/drivers/clock_source.c",
]

jungle_extra_bootstub_driver_sources = [
"./board/jungle/stm32h7/board.c",
"./board/jungle/boards/board_v2.c",
]

body_extra_bootstub_driver_sources = [
"./board/body/stm32h7/board.c",
"./board/body/boards/board_body.c",
]

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

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

startup = env.Object(project["STARTUP_FILE"])
libc_obj = env.Object("./board/libc.c")
crc_obj = env.Object("./board/crc.c")
provision_obj = env.Object("./board/provision.c")
critical_obj = env.Object("./board/sys/critical.c")
faults_obj = env.Object("./board/sys/faults.c")
main_globals_obj = env.Object("./board/main_globals.c")
gitversion_obj = env.Object("./board/obj/gitversion.c")

drv_env = env.Clone()
drv_env.Append(CFLAGS="-DDRIVER_BUILD")
early_init_obj = drv_env.Object("./board/early_init.c")

# Build bootstub
bs_env = env.Clone()
bs_env.Append(CFLAGS="-DBOOTSTUB", ASFLAGS="-DBOOTSTUB", LINKFLAGS="-DBOOTSTUB")
bs_env['OBJPREFIX'] = Dir(f'{project_dir}/bs_')
bs_drv_env = bs_env.Clone()
bs_drv_env.Append(CFLAGS="-DDRIVER_BUILD")
bs_all_driver_sources = bootstub_common_driver_sources + (extra_bootstub_driver_sources or [])
bs_driver_objs = [bs_drv_env.Object(src) for src in bs_all_driver_sources]
bs_elf = bs_env.Program(f"{project_dir}/bootstub.elf", [
startup,
"./board/crypto/rsa.c",
"./board/crypto/sha.c",
libc_obj,
crc_obj,
provision_obj,
critical_obj,
faults_obj,
gitversion_obj,
bs_env.Object("./board/bootstub_globals.c"),
bs_drv_env.Object("./board/early_init.c"),
bs_drv_env.Object("./board/flasher.c"),
] + bs_driver_objs + [
"./board/bootstub.c",
])
bs_env.Objcopy(f"./board/obj/bootstub.{project_name}.bin", bs_elf)

# Build + sign main (aka app)
driver_sources = common_driver_sources + (extra_driver_sources or [])
driver_objs = [drv_env.Object(src) for src in driver_sources]
main_elf = env.Program(f"{project_dir}/main.elf", [
startup,
libc_obj,
crc_obj,
provision_obj,
critical_obj,
faults_obj,
main_globals_obj,
gitversion_obj,
early_init_obj,
] + driver_objs + [
main
], LINKFLAGS=[f"-Wl,--section-start,.isr_vector={project['APP_START_ADDRESS']}"] + flags)
main_bin = env.Objcopy(f"{project_dir}/main.bin", main_elf)
Expand All @@ -141,6 +274,10 @@ base_project_h7 = {
with open("board/obj/gitversion.h", "w") as f:
version = get_version(BUILDER, BUILD_TYPE)
f.write(f'extern const uint8_t gitversion[{len(version)+1}];\n')

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

with open("board/obj/version", "w") as f:
Expand All @@ -161,16 +298,22 @@ common_flags += [f"-DHEALTH_PACKET_VERSION=0x{hh:08X}U", f"-DCAN_PACKET_VERSION_
f"-DJUNGLE_HEALTH_PACKET_VERSION=0x{jh:08X}U"]

# panda fw
build_project("panda_h7", base_project_h7, "./board/main.c", [])
build_project("panda_h7", base_project_h7, "./board/main.c", [],
extra_driver_sources=panda_extra_driver_sources,
extra_bootstub_driver_sources=panda_extra_bootstub_driver_sources)

# panda jungle fw
flags = [
"-DPANDA_JUNGLE",
]
build_project("panda_jungle_h7", base_project_h7, "./board/jungle/main.c", flags)
build_project("panda_jungle_h7", base_project_h7, "./board/jungle/main.c", flags,
extra_driver_sources=jungle_extra_driver_sources,
extra_bootstub_driver_sources=jungle_extra_bootstub_driver_sources)

# body fw
build_project("body_h7", base_project_h7, "./board/body/main.c", ["-DPANDA_BODY"])
build_project("body_h7", base_project_h7, "./board/body/main.c", ["-DPANDA_BODY"],
extra_driver_sources=body_extra_driver_sources,
extra_bootstub_driver_sources=body_extra_bootstub_driver_sources)

# test files
SConscript('tests/libpanda/SConscript')
139 changes: 139 additions & 0 deletions board/boards/cuatro.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,139 @@
#include "board/config.h"
#include "board/boards/unused_funcs.h"
#include "board/boards/tres.h"
#include "board/boards/cuatro.h"
#include "board/drivers/fake_siren.h"

// ////////////////////////// //
// Cuatro (STM32H7) + Harness //
// ////////////////////////// //

static void cuatro_enable_can_transceiver(uint8_t transceiver, bool enabled) {
switch (transceiver) {
case 1U:
set_gpio_output(GPIOB, 7, !enabled);
break;
case 2U:
set_gpio_output(GPIOB, 10, !enabled);
break;
case 3U:
set_gpio_output(GPIOD, 8, !enabled);
break;
case 4U:
set_gpio_output(GPIOB, 11, !enabled);
break;
default:
break;
}
}

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

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

static void cuatro_set_fan_enabled(bool enabled) {
set_gpio_output(GPIOD, 3, !enabled);
}

static void cuatro_set_bootkick(BootState state) {
set_gpio_output(GPIOA, 0, state != BOOT_BOOTKICK);
// DC_IN rising edge wakes SOM from ship mode
set_gpio_output(GPIOC, 11, state != BOOT_BOOTKICK);
}

static void cuatro_set_amp_enabled(bool enabled) {
set_gpio_output(GPIOB, 0, enabled);
}

static void cuatro_init(void) {
common_init_gpio();

// open drain
set_gpio_output_type(GPIOD, 3, OUTPUT_TYPE_OPEN_DRAIN); // FAN_EN
set_gpio_output_type(GPIOC, 11, OUTPUT_TYPE_OPEN_DRAIN); // DC_IN_EN_N

// Power readout
set_gpio_mode(GPIOC, 5, MODE_ANALOG);
set_gpio_mode(GPIOA, 6, MODE_ANALOG);

// CAN transceiver enables
set_gpio_pullup(GPIOB, 7, PULL_NONE);
set_gpio_mode(GPIOB, 7, MODE_OUTPUT);
set_gpio_pullup(GPIOD, 8, PULL_NONE);
set_gpio_mode(GPIOD, 8, MODE_OUTPUT);

// FDCAN3, different pins on this package than the rest of the reds
set_gpio_pullup(GPIOD, 12, PULL_NONE);
set_gpio_alternate(GPIOD, 12, GPIO_AF5_FDCAN3);
set_gpio_pullup(GPIOD, 13, PULL_NONE);
set_gpio_alternate(GPIOD, 13, GPIO_AF5_FDCAN3);

// C2: SOM GPIO used as input (fan control at boot)
set_gpio_mode(GPIOC, 2, MODE_INPUT);
set_gpio_pullup(GPIOC, 2, PULL_DOWN);

// SOM bootkick + reset lines
cuatro_set_bootkick(BOOT_BOOTKICK);

// SOM debugging UART
gpio_uart7_init();
uart_init(&uart_ring_som_debug, 115200);

// fan setup
set_gpio_alternate(GPIOC, 8, GPIO_AF2_TIM3);
register_set_bits(&(GPIOC->OTYPER), GPIO_OTYPER_OT8); // open drain

// Clock source
clock_source_init(true);

// 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_AF3_DFSDM1); // DFSDM1_DATIN3
set_gpio_alternate(GPIOE, 9, GPIO_AF3_DFSDM1); // DFSDM1_CKOUT
set_gpio_alternate(GPIOE, 6, GPIO_AF10_SAI4); // SAI4_MCLK_B
sound_init();
}

static harness_configuration cuatro_harness_config = {
.GPIO_SBU1 = GPIOC,
.GPIO_SBU2 = GPIOA,
.GPIO_relay_SBU1 = GPIOA,
.GPIO_relay_SBU2 = GPIOA,
.pin_SBU1 = 4,
.pin_SBU2 = 1,
.pin_relay_SBU1 = 9,
.pin_relay_SBU2 = 3,
.adc_signal_SBU1 = ADC_CHANNEL_DEFAULT(ADC1, 4),
.adc_signal_SBU2 = ADC_CHANNEL_DEFAULT(ADC1, 17)
};

board board_cuatro = {
.harness_config = &cuatro_harness_config,
.has_spi = true,
.has_fan = true,
.avdd_mV = 1800U,
.fan_enable_cooldown_time = 3U,
.init = cuatro_init,
.init_bootloader = unused_init_bootloader,
.enable_can_transceiver = cuatro_enable_can_transceiver,
.led_GPIO = {GPIOC, GPIOC, GPIOC},
.led_pin = {6, 7, 9},
.led_pwm_channels = {1, 2, 4},
.set_can_mode = tres_set_can_mode,
.read_voltage_mV = cuatro_read_voltage_mV,
.read_current_mA = cuatro_read_current_mA,
.set_fan_enabled = cuatro_set_fan_enabled,
.set_ir_power = unused_set_ir_power,
.set_siren = fake_siren_set,
.set_bootkick = cuatro_set_bootkick,
.read_som_gpio = tres_read_som_gpio,
.set_amp_enabled = cuatro_set_amp_enabled
};
Loading
Loading