Esempio n. 1
0
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);
    }
}
Esempio n. 2
0
  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);
  }
Esempio n. 3
0
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");
}
Esempio n. 4
0
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);
}
Esempio n. 5
0
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;
}