OSStatus internalFlashErase(uint32_t StartAddress, uint32_t EndAddress) { platform_log_trace(); OSStatus err = kNoErr; uint32_t StartSector, EndSector, i = 0, j = 0; /* Get the sector where start the user flash area */ StartSector = _GetSector(StartAddress); EndSector = _GetSector(EndAddress); for(i = StartSector; i <= EndSector; i += 8) { /* Device voltage range supposed to be [2.7V to 3.6V], the operation will be done by word */ _GetAddress(i, &StartAddress, &EndAddress); for(j=StartAddress; j<=EndAddress; j+=8){ if( (*(uint32_t *)(j))!=0xFFFFFFFF ) break; } if( j>EndAddress ) continue; require_action(FLASH_EraseSector(i, VoltageRange_3) == FLASH_COMPLETE, exit, err = kWriteErr); } exit: return err; }
OSStatus internalFlashErase(uint32_t start_address, uint32_t end_address) { platform_log_trace(); uint32_t i; OSStatus err = kNoErr; uint32_t page_start_address, page_end_address; uint32_t page_start_number, page_end_number; platform_mcu_powersave_disable(); require_action( flash_unlock( start_address, end_address, &page_start_address, &page_end_address ) == FLASH_RC_OK, exit, err = kGeneralErr ); page_start_number = page_start_address/512; page_end_number = page_end_address/512; require_action( page_end_number >= page_start_number + 16, exit, err = kUnsupportedErr); for ( i = page_start_number; i <= page_end_number; i+=16 ) { require_action( flash_erase_page( i * 512, IFLASH_ERASE_PAGES_16) == FLASH_RC_OK, exit, err = kGeneralErr ); } require_action( flash_lock( start_address, end_address, NULL, NULL ) == FLASH_RC_OK, exit, err = kGeneralErr ); exit: platform_mcu_powersave_enable(); return err; }
OSStatus internalFlashInitialize( void ) { platform_log_trace(); FLASH_Unlock(); /* Clear pending flags (if any) */ FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR|FLASH_FLAG_PGSERR); return kNoErr; }
static OSStatus internalFlashInitialize( void ) { platform_log_trace(); OSStatus err = kNoErr; platform_mcu_powersave_disable(); require_action( flash_init(FLASH_ACCESS_MODE_128, 6) == FLASH_RC_OK, exit, err = kGeneralErr ); exit: platform_mcu_powersave_enable(); return err; }
OSStatus internalFlashInitialize( void ) { platform_log_trace(); uint32_t ul_rc; ul_rc = flash_init(FLASH_ACCESS_MODE_128, 6);//TBD! 3-4 wait in 128bit, 1 in 64bit if (ul_rc != FLASH_RC_OK) { platform_log("flash err:%d",ul_rc); return kGeneralErr; } return kNoErr; }
OSStatus spiFlashErase(uint32_t StartAddress, uint32_t EndAddress) { platform_log_trace(); OSStatus err = kNoErr; uint32_t StartSector, EndSector, i = 0; /* Get the sector where start the user flash area */ StartSector = StartAddress>>12; EndSector = EndAddress>>12; for(i = StartSector; i <= EndSector; i += 1) { require_action(sflash_sector_erase(&sflash_handle, i<<12) == kNoErr, exit, err = kWriteErr); } exit: return err; }
OSStatus spiFlashErase(uint32_t StartAddress, uint32_t EndAddress) { platform_log_trace(); OSStatus err = kNoErr; uint32_t StartSector, EndSector, i = 0; /* Get the sector where start the user flash area */ StartSector = StartAddress>>12; EndSector = EndAddress>>12; for(i = StartSector; i <= EndSector; i += 1) { /* Device voltage range supposed to be [2.7V to 3.6V], the operation will be done by word */ require_action(sflash_sector_erase(&sflash_handle, i<<12) == kNoErr, exit, err = kWriteErr); } exit: return err; }
OSStatus internalFlashWrite(volatile uint32_t* flash_address, uint32_t* data ,uint32_t data_length) { platform_log_trace(); OSStatus err = kNoErr; uint32_t start_address = * flash_address; platform_mcu_powersave_disable(); //mem_flash_op_enter(); require_action( flash_unlock( start_address, start_address + data_length - 1, NULL, NULL ) == FLASH_RC_OK, exit, err = kGeneralErr ); require_action( flash_write((*flash_address), data, data_length, false) == FLASH_RC_OK, exit, err = kGeneralErr ); *flash_address += data_length; require_action( flash_lock( start_address, start_address + data_length - 1, NULL, NULL ) == FLASH_RC_OK, exit, err = kGeneralErr ); //mem_flash_op_exit(); exit: platform_mcu_powersave_enable(); return err; }
OSStatus internalFlashWrite(volatile uint32_t* flash_address, uint32_t* data ,uint32_t data_length) { platform_log_trace(); OSStatus err = kNoErr; //page write length IFLASH_PAGE_SIZE uint32_t rc ; mem_flash_op_enter(); #if SAMG55 rc = flash_write((*flash_address), data, data_length, false); #else rc = flash_write((*flash_address), data, data_length, true); #endif mem_flash_op_exit(); if (rc != FLASH_RC_OK) { platform_log("flash err: %d",rc); return kGeneralErr; } *flash_address += data_length; exit: return err; }
OSStatus internalFlashWrite(volatile uint32_t* FlashAddress, uint32_t* Data ,uint32_t DataLength) { platform_log_trace(); OSStatus err = kNoErr; uint32_t i = 0; uint32_t dataInRam; u8 startNumber; uint32_t DataLength32 = DataLength; /*First bytes that are not 32bit align*/ if(*FlashAddress%4){ startNumber = 4-(*FlashAddress)%4; err = internalFlashByteWrite(FlashAddress, (uint8_t *)Data, startNumber); require_noerr(err, exit); DataLength32 = DataLength - startNumber; Data = (uint32_t *)((u32)Data + startNumber); } /*Program flash by words*/ for (i = 0; (i < DataLength32/4) && (*FlashAddress <= (FLASH_END_ADDRESS-3)); i++) { /* Device voltage range supposed to be [2.7V to 3.6V], the operation will be done by word */ dataInRam = *(Data+i); require_action(FLASH_ProgramWord(*FlashAddress, dataInRam) == FLASH_COMPLETE, exit, err = kWriteErr); require_action(*(uint32_t*)*FlashAddress == dataInRam, exit, err = kChecksumErr); /* Increment FLASH destination address */ *FlashAddress += 4; } /*Last bytes that cannot be write by a 32 bit word*/ err = internalFlashByteWrite(FlashAddress, (uint8_t *)Data + i*4, DataLength32-i*4); require_noerr(err, exit); exit: return err; }
OSStatus internalFlashErase(uint32_t start_address, uint32_t end_address) { platform_log_trace(); OSStatus err = kNoErr; uint32_t page_addr = start_address; uint32_t page_off = page_addr % (IFLASH_PAGE_SIZE*16); uint32_t rc, erased = 0; uint32_t size = end_address - start_address; if (page_off) { platform_log("flash: erase address must be 16 page aligned"); page_addr = page_addr - page_off; platform_log("flash: erase from %x", (unsigned)page_addr); } for (erased = 0; erased < size;) { rc = flash_erase_page((uint32_t)page_addr, IFLASH_ERASE_PAGES_16); erased += IFLASH_PAGE_SIZE*16; page_addr += IFLASH_PAGE_SIZE*16; if (rc != FLASH_RC_OK) { platform_log("flash: %x erase error", (unsigned)page_addr); return kGeneralErr; } } return err; }