Ejemplo n.º 1
0
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');
    }
}
Ejemplo n.º 2
0
/**********************************************************************//**
 * @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;
}
Ejemplo n.º 3
0
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);
}
Ejemplo n.º 4
0
/******************************************************************************
 * @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
}
Ejemplo n.º 5
0
/**********************************************************************//**
 * @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;
}
Ejemplo n.º 6
0
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;
}