void BSL430_writeByte(uint32_t addr, char data) { while (FCTL3 & BUSY) ; __data20_write_char(addr, data); while (FCTL3 & BUSY) ; if (data != __data20_read_char(addr)) { putchar_('E'); } }
/**********************************************************************//** * @brief Erases a single segment of memory containing the address FarPtr. * * @param FarPtr The address location within the segment of memory to be * erased. * * @return none **************************************************************************/ void flashEraseSegment(unsigned long FarPtr) { FCTL3 = FWKEY; FCTL1 = FWKEY + ERASE; __data20_write_char(FarPtr, 0x00); // Dummy write to start erase while (FCTL3 & BUSY ); FCTL1 = FWKEY; FCTL3 = FWKEY + LOCK; }
mp_ret_t mp_flash_write(mp_flash_t *flash, mp_flash_addr_t offset, int size, void *out_mem) { mp_flash_addr_t addr = flash->base+offset; unsigned char *ptr; int a; FCTL3 = FWKEY; // Clear Lock bit FCTL1 = FWKEY+ERASE; // Set Erase bit __data20_write_char(addr, 0); FCTL1 = FWKEY + WRT; // Set WRT bit for write operation ptr = (unsigned char *)out_mem; for(a=0; a<size; a++, ptr++) { __data20_write_char(addr+a, *ptr); } FCTL1 = FWKEY; FCTL3 = FWKEY+LOCK; return(TRUE); }
/****************************************************************************** * @fn dl2rc * * @brief Copy the DL image to the RC image location. * * NOTE: Assumes that DL image at least fills lower flash. * Assumes that DL image ends on a flash page boundary. * * @param None. * * @return None. */ static void dl2rc(void) { uint32 addr = DATA_OFFSET; uint32 addr2 = HI_ROM_BEG; uint16 *ptr; preamble_t preamble; uint16 buf; uint8 cnt = 0; vddWait(VDD_MIN_OTA); HalOTARead(DATA_OFFSET+PREAMBLE_OFFSET, (uint8 *)&preamble, sizeof(preamble_t), HAL_OTA_DL); FCTL3 = FWKEY; // Clear Lock bit. for (ptr = (uint16 *)LO_ROM_BEG; ptr <= (uint16 *)LO_ROM_END ; ) { FCTL1 = FWKEY + ERASE; // Set Erase bit. *ptr = 0; // Dummy write to erase Flash segment. FCTL1 = FWKEY + WRT; // Set WRT bit for write operation do { HalXNVRead(addr, (uint8 *)&buf, 2); *ptr++ = buf; addr += 2; } while (--cnt); // Wrap a uint8 once to count 256 * 2 = 512. } for (; addr < preamble.programLength+DATA_OFFSET; ) { FCTL1 = FWKEY + ERASE; // Set Erase bit. __data20_write_char(addr2,0); // Dummy write to erase Flash segment. FCTL1 = FWKEY + WRT; // Set WRT bit for write operation do { HalXNVRead(addr, (uint8 *)&buf, 2); __data20_write_short(addr2, buf); addr2 += 2; addr += 2; } while (--cnt); // Wrap a uint8 once to count 256 * 2 = 512. } FCTL1 = FWKEY; // Clear WRT bit FCTL3 = FWKEY + LOCK; // Set LOCK bit }
/**********************************************************************//** * @brief Erases the (multiple) segment(s) of memory including address * locations Memstart through Memend. * * @param Memstart The starting address location identifying a segment of * memory to be erased * * @param Memend The ending address location identifying a segment of * memory to be erased * * @return none **************************************************************************/ void flashErase(unsigned long Memstart, unsigned long Memend) { unsigned long FarPtr = Memstart; // Start of record memory array FCTL3 = FWKEY; // Unlock Flash memory for write do { if ( (FarPtr & 0xFFFF) == 0x0000) // Use bit 12 to toggle LED P1OUT ^= 0x01; FCTL1 = FWKEY + ERASE; __data20_write_char(FarPtr, 0x00); // Dummy write to activate while (FCTL3 & BUSY ); // Segment erase FarPtr += 0x0200; // Point to next segment } while (FarPtr < Memend); FCTL1 = FWKEY; FCTL3 = FWKEY + LOCK; }
char BSL430_eraseLocation(char block_erase, unsigned long addr) { char exceptions; if (LockedStatus == UNLOCKED) { exceptions = SUCCESSFUL_OPERATION; #ifdef RAM_BASED_BSL while (FCTL3 & BUSY) ; #endif FCTL3 = FwRamKey; // Clear Lock bit FCTL1 = FwRamKey + ERASE; // Set Erase bit __data20_write_char(addr, 0); // Dummy write to erase Flash seg #ifdef RAM_BASED_BSL while (FCTL3 & BUSY) ; #endif FCTL3 = FwRamKey + LOCK; // Set LOCK bit } else { exceptions = BSL_LOCKED; } return exceptions; }