diff --git a/left/src/bootloader.c b/left/src/bootloader.c new file mode 100644 index 0000000..7da5481 --- /dev/null +++ b/left/src/bootloader.c @@ -0,0 +1,20 @@ +#include "bootloader.h" + +__attribute__((used, section(".BootloaderConfig"))) const bootloader_config_t BootloaderConfig = { + .tag = 0x6766636B, // Magic Number + .enabledPeripherals = 0xE2, // Enabled Peripheral: I2C + .i2cSlaveAddress = 0x10, // Use user-defined I2C address + .peripheralDetectionTimeoutMs = 3000, // Use user-defined timeout (ms) + .clockFlags = 0xFF, // Disable High speed mode + .clockDivider = 0xFF, // Use clock divider (0) +}; + +void JumpToBootloader(void) { + uint32_t runBootloaderAddress; + void (*runBootloader)(void * arg); + // Read the function address from the ROM API tree. + runBootloaderAddress = **(uint32_t **)(0x1c00001c); + runBootloader = (void (*)(void * arg))runBootloaderAddress; + // Start the bootloader. + runBootloader(NULL); +} diff --git a/left/src/bootloader.h b/left/src/bootloader.h new file mode 100644 index 0000000..3bb6d58 --- /dev/null +++ b/left/src/bootloader.h @@ -0,0 +1,32 @@ +#ifndef __BOOTLOADER_H__ +#define __BOOTLOADER_H__ + +// Includes: + + #include + #include + +// Typedefs: + + typedef struct { + uint32_t tag; // Magic number to verify bootloader configuration is valid. Must be set to 'kcfg'. + uint32_t reserved[3]; + uint8_t enabledPeripherals; // Bitfield of peripherals to enable. + // bit 0 - LPUART, bit 1 - I2C, bit 2 - SPI, bit 3 - CAN, bit 4 - USB + uint8_t i2cSlaveAddress; // If not 0xFF, used as the 7-bit I2C slave address. + // If 0xFF, defaults to 0x10 for I2C slave address. + uint16_t peripheralDetectionTimeoutMs; // Timeout in milliseconds for active peripheral detection. + // If 0xFFFF, defaults to 5 seconds. + uint16_t reserved2[2]; + uint32_t reserved3; + uint8_t clockFlags; // The flags in the clockFlags configuration field are enabled if the corresponding bit is cleared (0). + // bit 0 - HighSpeed Enable high speed mode (i.e., 48 MHz). + uint8_t clockDivider; // Inverted value of the divider to use for core and bus clocks when in high speed mode. + } bootloader_config_t; + + +// Functions: + + extern void JumpToBootloader(void); + +#endif diff --git a/left/src/main.c b/left/src/main.c index d4bd488..2b100a7 100644 --- a/left/src/main.c +++ b/left/src/main.c @@ -25,41 +25,6 @@ key_matrix_t keyMatrix = { volatile bool DisableKeyMatrixScanState; -typedef struct { - uint32_t tag; // Magic number to verify bootloader configuration is valid. Must be set to 'kcfg'. - uint32_t reserved[3]; - uint8_t enabledPeripherals; // Bitfield of peripherals to enable. - // bit 0 - LPUART, bit 1 - I2C, bit 2 - SPI, bit 3 - CAN, bit 4 - USB - uint8_t i2cSlaveAddress; // If not 0xFF, used as the 7-bit I2C slave address. - // If 0xFF, defaults to 0x10 for I2C slave address. - uint16_t peripheralDetectionTimeoutMs; // Timeout in milliseconds for active peripheral detection. - // If 0xFFFF, defaults to 5 seconds. - uint16_t reserved2[2]; - uint32_t reserved3; - uint8_t clockFlags; // The flags in the clockFlags configuration field are enabled if the corresponding bit is cleared (0). - // bit 0 - HighSpeed Enable high speed mode (i.e., 48 MHz). - uint8_t clockDivider; // Inverted value of the divider to use for core and bus clocks when in high speed mode. -} bootloader_config_t; - -__attribute__((used, section(".BootloaderConfig"))) const bootloader_config_t BootloaderConfig = { - .tag = 0x6766636B, // Magic Number - .enabledPeripherals = 0xE2, // Enabled Peripheral: I2C - .i2cSlaveAddress = 0x10, // Use user-defined I2C address - .peripheralDetectionTimeoutMs = 3000, // Use user-defined timeout (ms) - .clockFlags = 0xFF, // Disable High speed mode - .clockDivider = 0xFF, // Use clock divider (0) -}; - -void JumpToBootloader() { - uint32_t runBootloaderAddress; - void (*runBootloader)(void * arg); - // Read the function address from the ROM API tree. - runBootloaderAddress = **(uint32_t **)(0x1c00001c); - runBootloader = (void (*)(void * arg))runBootloaderAddress; - // Start the bootloader. - runBootloader(NULL); -} - int main(void) { InitClock();