示例#1
0
void ApplicationSettings::saveToFlash(){
  eeprom_unlock();
  //   if(eeprom_erase(APPLICATION_SETTINGS_ADDR) == 0)
  eeprom_erase_sector(APPLICATION_SETTINGS_SECTOR);
  eeprom_write_block(APPLICATION_SETTINGS_ADDR, this, sizeof(*this));
  eeprom_lock();
}
示例#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);
  }
示例#3
0
 void flashFirmware(uint8_t* source, uint32_t size){
   __disable_irq(); // Disable ALL interrupts. Can only be executed in Privileged modes.
   setLed(RED);
   eeprom_unlock();
   if(size > (16+16+64+128)*1024){
     eeprom_erase_sector(FLASH_Sector_6);
     toggleLed(); // inline
   }
   if(size > (16+16+64)*1024){
     eeprom_erase_sector(FLASH_Sector_5);
     toggleLed();
   }
   if(size > (16+16)*1024){
     eeprom_erase_sector(FLASH_Sector_4);
     toggleLed();
   }
   if(size > 16*1024){
     eeprom_erase_sector(FLASH_Sector_3);
     toggleLed();
   }
   eeprom_erase_sector(FLASH_Sector_2);
   toggleLed();
   eeprom_write_block(ADDR_FLASH_SECTOR_2, source, size);
   eeprom_lock();
   eeprom_wait();
   NVIC_SystemReset(); // (static inline)
 }
示例#4
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");
}
示例#5
0
文件: dSPI.c 项目: aranni/GWYNE64
// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
void init_serial_memories(void)
{
  
  SPICR1 = 0x50;    // SPI enabled, No interrupt, 
                    // Master Mode, CPOL=0, CPHA=0, MSB first
  SPICR2 = 0x00;		// MODFEN=0, Normal pin (MISO & MOSI)
  SPIBR = 0x00;		  // BaudRate = 12.5 MHz 


  PTS |= 0x80;      // CS for serial FLASH
  DDRS |= 0x80;

  PORTE |= 0x80;    // CS for serial EEPROM
  DDRE |= 0x80;

  eeprom_unlock();

  
}
示例#6
0
void ApplicationSettings::clearFlash(){
  eeprom_unlock();
  eeprom_erase_sector(APPLICATION_SETTINGS_SECTOR);
  //  eeprom_erase(APPLICATION_SETTINGS_ADDR);
  eeprom_lock();
}