openpilot is an open source driver assistance system. openpilot performs the functions of Automated Lane Centering and Adaptive Cruise Control for over 200 supported car makes and models.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

51 lines
1.2 KiB

bool flash_is_locked(void) {
return (FLASH->CR & FLASH_CR_LOCK);
}
void flash_unlock(void) {
FLASH->KEYR = 0x45670123;
FLASH->KEYR = 0xCDEF89AB;
}
void flash_lock(void) {
FLASH->CR |= FLASH_CR_LOCK;
}
bool flash_erase_sector(uint16_t sector) {
#ifdef BOOTSTUB
// don't erase the bootloader(sector 0)
uint16_t min_sector = 1U;
uint16_t max_sector = 11U;
#else
uint16_t min_sector = LOGGING_FLASH_SECTOR_A;
uint16_t max_sector = LOGGING_FLASH_SECTOR_B;
#endif
bool ret = false;
if ((sector >= min_sector) && (sector <= max_sector) && (!flash_is_locked())) {
FLASH->CR = (sector << 3) | FLASH_CR_SER;
FLASH->CR |= FLASH_CR_STRT;
while ((FLASH->SR & FLASH_SR_BSY) != 0U);
ret = true;
}
return ret;
}
void flash_write_word(uint32_t *prog_ptr, uint32_t data) {
#ifndef BOOTSTUB
// don't write to any region besides the logging region
if ((prog_ptr >= (uint32_t *)LOGGING_FLASH_BASE_A) && (prog_ptr < (uint32_t *)(LOGGING_FLASH_BASE_B + LOGGING_FLASH_SECTOR_SIZE))) {
#endif
uint32_t *pp = prog_ptr;
FLASH->CR = FLASH_CR_PSIZE_1 | FLASH_CR_PG;
*pp = data;
while ((FLASH->SR & FLASH_SR_BSY) != 0U);
#ifndef BOOTSTUB
}
#endif
}
void flush_write_buffer(void) { }