예제 #1
0
bool AuthPwd(u8* pwd)
{
	int i;
	for(i=0;i<16;i++)
	{
		if(mcu_scfg.pwd[i]!=pwd[i])
		{
			if(mcu_scfg.max_auth_num[0]!=0)
			{
				mcu_scfg.max_auth_num[0]--;
				if(mcu_scfg.max_auth_num[0]!=0)
				{
					mcu_scfg.checksum=checksum((u8 *)&mcu_scfg,sizeof(MCU_CFG)-1);
					if(!FLASH_Earse(MCU_CFG_BASE,MCU_CFG_BASE+sizeof(mcu_scfg)-1))
						return FALSE;
					if(!FLASH_Program(MCU_CFG_BASE,(u8 *)&mcu_scfg,sizeof(mcu_scfg)))
						return FALSE;
				}
				else
					EarseAndResetAll();
			}
			return FALSE;
		}
	}
	pwd_authed=TRUE;
	return TRUE;
}
예제 #2
0
파일: flash.c 프로젝트: abtink/openthread
uint32_t utilsFlashWrite(uint32_t aAddress, uint8_t *aData, uint32_t aSize)
{
    if (FLASH_Program(&sFlashConfig, aAddress, (uint32_t *)aData, aSize) != kStatus_FLASH_Success)
    {
        aSize = 0;
    }

    return aSize;
}
예제 #3
0
bool SetPwd(u8* data)
{
	memcpy(mcu_scfg.max_auth_num,data,ALL_PWD_LEN-PWD_FLAG_LEN);
	mcu_scfg.pwdflag[0]=FISH_MAN;
	mcu_scfg.checksum=checksum((u8 *)&mcu_scfg,sizeof(MCU_CFG)-1);
	if(!FLASH_Earse(MCU_CFG_BASE,MCU_CFG_BASE+sizeof(mcu_scfg)-1))
		return FALSE;
	if(!FLASH_Program(MCU_CFG_BASE,(u8 *)&mcu_scfg,sizeof(mcu_scfg)))
		return FALSE;
	pwd_authed=TRUE;
	return TRUE;	
}
예제 #4
0
void EarseAndResetAll(void)
{
	u32 i;
	memset((u8 *)&mcu_scfg,0,sizeof(MCU_CFG));
	for(i=0;i<32;i++)
		mcu_scfg.FlashLock[i]=0xFF;
	mcu_scfg.flag=FISH_MAN;
	mcu_scfg.checksum=checksum((u8 *)&mcu_scfg,sizeof(MCU_CFG)-1);
	OfflineEarseMCURAM();
	OfflineEarseMCUFLASH();
	FLASH_Earse(MCU_CFG_BASE,MCU_CFG_BASE+sizeof(mcu_scfg)-1);
	FLASH_Program(MCU_CFG_BASE,(u8 *)&mcu_scfg,sizeof(mcu_scfg));
}
예제 #5
0
static int
mk64f12_flash_write(const struct hal_flash *dev, uint32_t address,
        const void *src, uint32_t len)
{
    uint8_t padded[MK64F12_FLASH_ALIGN];
    uint8_t pad_len;

    if (address % MK64F12_FLASH_ALIGN) {
        /*
         * Unaligned write.
         */
        return -1;
    }

    pad_len = len & (MK64F12_FLASH_ALIGN - 1);
    if (pad_len) {
        /*
         * FLASH_Program also needs length to be aligned to 8 bytes.
         * Pad these writes.
         */
        len -= pad_len;
        memcpy(padded, (uint8_t *)src + len, pad_len);
        memset(padded + pad_len, 0xff, sizeof(padded) - pad_len);
    }
    if (len) {
        if (FLASH_Program(&mk64f12_config, address, (uint32_t *)src, len) !=
            kStatus_Success) {
            return -1;
        }
    }
    if (pad_len) {
        if (FLASH_Program(&mk64f12_config, address + len, (uint32_t *)padded,
                          MK64F12_FLASH_ALIGN) != kStatus_Success) {
            return -1;
        }
    }
    return 0;
}
예제 #6
0
bool OfflineProgramMCURAM(u32 StartAddr,u8 * data, u32 lg)
{
	u32 ReAddr=StartAddr+mcu_scfg.flash_offset;
	if(mcu_scfg.ram_done)
		return FALSE;
	if(((ReAddr<MCU_RAM_BASE)||(ReAddr>=MCU_RAM_BASE+MCU_RAM_SIZE))
		||((ReAddr+lg-1<MCU_RAM_BASE)||(ReAddr+lg-1>=MCU_RAM_BASE+MCU_RAM_SIZE)))
		return FALSE;
	if(!FLASH_Program(ReAddr,data,lg))
		return FALSE;
	mcu_scfg.ram_map[(ReAddr-MCU_RAM_BASE)/PRO_PAGE_SIZE]=TRUE;
	mcu_scfg.ram_map[(ReAddr+lg-1-MCU_RAM_BASE)/PRO_PAGE_SIZE]=TRUE;
	return TRUE;
}
예제 #7
0
bool SetRamDone(bool done)
{ 
	if((done!=mcu_scfg.ram_done))
	{
		mcu_scfg.ram_done=done;
		mcu_scfg.checksum=checksum((u8 *)&mcu_scfg,sizeof(MCU_CFG)-1);
		if(!mcu_scfg.ram_done)
			OfflineEarseMCURAM();
		if(!FLASH_Earse(MCU_CFG_BASE,MCU_CFG_BASE+sizeof(mcu_scfg)-1))
			return FALSE;
		if(!FLASH_Program(MCU_CFG_BASE,(u8 *)&mcu_scfg,sizeof(mcu_scfg)))
			return FALSE;	
	}
	return TRUE;	
}
예제 #8
0
static int flash_mcux_write(struct device *dev, off_t offset,
				const void *data, size_t len)
{
	struct flash_priv *priv = dev->driver_data;
	u32_t addr;
	status_t rc;
	int key;

	addr = offset + priv->config.PFlashBlockBase;

	key = irq_lock();
	rc = FLASH_Program(&priv->config, addr, (u32_t *) data, len);
	irq_unlock(key);

	return (rc == kStatus_Success) ? 0 : -EINVAL;
}
예제 #9
0
static int flash_mcux_write(struct device *dev, off_t offset,
				const void *data, size_t len)
{
	struct flash_priv *priv = dev->driver_data;
	u32_t addr;
	status_t rc;
	unsigned int key;

	if (k_sem_take(&priv->write_lock, K_NO_WAIT)) {
		return -EACCES;
	}

	addr = offset + priv->pflash_block_base;

	key = irq_lock();
	rc = FLASH_Program(&priv->config, addr, (uint8_t *) data, len);
	irq_unlock(key);

	k_sem_give(&priv->write_lock);

	return (rc == kStatus_Success) ? 0 : -EINVAL;
}