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; }
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; }
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; }
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)); }
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; }
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; }
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; }
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; }
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; }