static void getOnePieceOfRoomInfo(uint8_t index, uint8_t* buff) { uint32_t addr = getFlashAddress(index); uint16_t tmpCRC[2] = {0, 0}; stRoomInfo tmpInfo[2]; memset((uint8_t *)&tmpInfo[0], 0, sizeof(stRoomInfo)); memset((uint8_t *)&tmpInfo[1], 0, sizeof(stRoomInfo)); Flash_Read((uint8_t *)&tmpInfo[0], addr, sizeof(stRoomInfo)); Flash_Read((uint8_t *)&tmpInfo[1], addr + FLASH_SECTOR_SIZE, sizeof(stRoomInfo)); tmpCRC[0] = CRC16((uint8_t *)&tmpInfo[0], sizeof(stRoomInfo) - sizeof(uint16_t)); tmpCRC[1] = CRC16((uint8_t *)&tmpInfo[1], sizeof(stRoomInfo) - sizeof(uint16_t)); if ((tmpCRC[0] == tmpInfo[0].crc) && (tmpCRC[1]== tmpInfo[1].crc)) { memcpy(buff, (uint8_t *)&tmpInfo[0], sizeof(stRoomInfo)); } else if(tmpCRC[0] == tmpInfo[0].crc) { memcpy(buff, (uint8_t *)&tmpInfo[0], sizeof(stRoomInfo)); } else if(tmpCRC[1]== tmpInfo[1].crc) { memcpy(buff, (uint8_t *)&tmpInfo[1], sizeof(stRoomInfo)); } else { bitMapFlashDateError |= (1 << index); } }
void programFlashTask(void* p){ int sector = flashSectorToWrite; uint32_t size = flashSizeToWrite; uint8_t* source = (uint8_t*)flashAddressToWrite; if(sector >= 0 && sector < MAX_USER_PATCHES && size <= 128*1024){ uint32_t addr = getFlashAddress(sector); eeprom_unlock(); int ret = eeprom_erase(addr); if(ret == 0) ret = eeprom_write_block(addr, source, size); eeprom_lock(); registry.init(); if(ret == 0){ // load and run program int pc = registry.getNumberOfPatches()-MAX_USER_PATCHES+sector; program.loadProgram(pc); // program.loadDynamicProgram(source, size); program.resetProgram(false); }else{ setErrorMessage(PROGRAM_ERROR, "Failed to write program to flash"); } }else if(sector == 0xff && size < MAX_SYSEX_FIRMWARE_SIZE){ flashFirmware(source, size); }else{ setErrorMessage(PROGRAM_ERROR, "Invalid flash program command"); } vTaskDelete(NULL); }
static void eraseFlashProgram(int sector){ uint32_t addr = getFlashAddress(sector); eeprom_unlock(); int ret = eeprom_erase(addr); eeprom_lock(); if(ret != 0) setErrorMessage(PROGRAM_ERROR, "Failed to erase flash sector"); }
void saveRoomInfo(uint8_t index) { uint32_t addr = getFlashAddress(index); roomInfo[index].crc = CRC16((uint8_t *)&roomInfo[index], sizeof(stRoomInfo) - sizeof(uint16_t)); Flash_EraseSector(addr); Flash_EraseSector(addr + FLASH_SECTOR_SIZE); Flash_PageWrite((uint8_t *)&roomInfo[index], addr, sizeof(stRoomInfo)); Flash_PageWrite((uint8_t *)&roomInfo[index], addr + FLASH_SECTOR_SIZE, sizeof(stRoomInfo)); bitMapFlashDateError &= ~(1 << index); }
PatchDefinition* ProgramManager::getPatchDefinitionFromFlash(uint8_t sector){ if(sector >= MAX_USER_PATCHES) return NULL; uint32_t addr = getFlashAddress(sector); ProgramHeader* header = (ProgramHeader*)addr; DynamicPatchDefinition* def = &flashPatches[sector]; uint32_t size = (uint32_t)header->endAddress - (uint32_t)header->linkAddress; if(header->magic == 0xDADAC0DE && size <= 80*1024){ if(def->load((void*)addr, size) && def->verify()) return def; } return NULL; }