vsf_err_t stm32swj_fl_poll_result(struct stm32_fl_t *fl, struct stm32_fl_result_t *result) { uint32_t buff_tmp[2]; uint8_t i; // read result and sync // sync is 4-byte BEFORE result if (adi_memap_read_buf32(fl->base + STM32_FL_SYNC_OFFSET, (uint8_t *)buff_tmp, sizeof(buff_tmp))) { LOG_ERROR(ERRMSG_FAILURE_OPERATION, "read flashloader sync"); return ERRCODE_FAILURE_OPERATION; } for (i = 0; i < dimof(buff_tmp); i++) { buff_tmp[i] = LE_TO_SYS_U32(buff_tmp[i]); } if (0 == buff_tmp[0]) { result->result = buff_tmp[1]; return VSFERR_NONE; } return VSFERR_NOT_READY; }
static vsf_err_t nuc100swj_init_iap(void) { uint32_t reg; uint8_t verify_buff[sizeof(iap_code)]; if (cm_dp_halt()) { LOG_ERROR(ERRMSG_FAILURE_OPERATION, "halt nuc100"); return ERRCODE_FAILURE_OPERATION; } // enable isp clock and ispen bit reg = NUC100_REG_AHBCLK_ISPEN; if (adi_memap_write_reg32(NUC100_REG_AHBCLK, ®, 0)) { return VSFERR_FAIL; } reg = NUC100_REG_ISPCON_ISPFF | NUC100_REG_ISPCON_LDUEN | NUC100_REG_ISPCON_CFGUEN | NUC100_REG_ISPCON_ISPEN; if (adi_memap_write_reg32(NUC100_REG_ISPCON, ®, 1)) { return VSFERR_FAIL; } // write iap_code if (adi_memap_write_buf32(NUC100_IAP_BASE, (uint8_t*)iap_code, sizeof(iap_code))) { LOG_ERROR(ERRMSG_FAILURE_OPERATION, "load iap_code to SRAM"); return ERRCODE_FAILURE_OPERATION; } // verify iap_code memset(verify_buff, 0, sizeof(iap_code)); if (adi_memap_read_buf32(NUC100_IAP_BASE, verify_buff, sizeof(iap_code))) { LOG_ERROR(ERRMSG_FAILURE_OPERATION, "read flash_loader"); return ERRCODE_FAILURE_OPERATION; } if (memcmp(verify_buff, iap_code, sizeof(iap_code))) { LOG_ERROR(ERRMSG_FAILURE_OPERATION, "verify flash_loader"); return ERRCODE_FAILURE_OPERATION; } // write pc reg = NUC100_IAP_BASE + 1; if (cm_write_core_register(CM_COREREG_PC, ®)) { LOG_ERROR(ERRMSG_FAILURE_OPERATION, "write PC"); return ERRCODE_FAILURE_OPERATION; } if (cm_dp_resume()) { LOG_ERROR(ERRMSG_FAILURE_OPERATION, "run iap"); return ERRCODE_FAILURE_OPERATION; } return VSFERR_NONE; }
static vsf_err_t nuc400swj_init_iap(void) { uint32_t reg; uint8_t verify_buff[sizeof(iap_code)]; if (cm_dp_halt()) { LOG_ERROR(ERRMSG_FAILURE_OPERATION, "halt nuc400"); return ERRCODE_FAILURE_OPERATION; } if (nuc400swj_unlock()) { LOG_ERROR(ERRMSG_FAILURE_OPERATION, "unlock NUC chip"); return ERRCODE_FAILURE_OPERATION; } if (nuc400swj_fmc_enable()) { LOG_ERROR(ERRMSG_FAILURE_OPERATION, "enable FMC"); return ERRCODE_FAILURE_OPERATION; } // write iap_code if (adi_memap_write_buf32(NUC400_IAP_BASE, (uint8_t*)iap_code, sizeof(iap_code))) { LOG_ERROR(ERRMSG_FAILURE_OPERATION, "load iap_code to SRAM"); return ERRCODE_FAILURE_OPERATION; } // verify iap_code memset(verify_buff, 0, sizeof(iap_code)); if (adi_memap_read_buf32(NUC400_IAP_BASE, verify_buff, sizeof(iap_code))) { LOG_ERROR(ERRMSG_FAILURE_OPERATION, "read flash_loader"); return ERRCODE_FAILURE_OPERATION; } if (memcmp(verify_buff, iap_code, sizeof(iap_code))) { LOG_ERROR(ERRMSG_FAILURE_OPERATION, "verify flash_loader"); return ERRCODE_FAILURE_OPERATION; } // write pc reg = NUC400_IAP_BASE + 1; if (cm_write_core_register(CM_COREREG_PC, ®)) { LOG_ERROR(ERRMSG_FAILURE_OPERATION, "write PC"); return ERRCODE_FAILURE_OPERATION; } if (cm_dp_resume()) { LOG_ERROR(ERRMSG_FAILURE_OPERATION, "run iap"); return ERRCODE_FAILURE_OPERATION; } return VSFERR_NONE; }
static vsf_err_t kinetisswj_iap_init(struct kinetis_fl_t *fl) { uint8_t verify_buff[sizeof(iap_code)]; uint32_t reg; if (cm_dp_halt()) { LOG_ERROR(ERRMSG_FAILURE_OPERATION, "halt lpc1000"); return ERRCODE_FAILURE_OPERATION; } // write iap_code to target SRAM if (adi_memap_write_buf32(KINETIS_IAP_BASE, (uint8_t*)iap_code, sizeof(iap_code))) { LOG_ERROR(ERRMSG_FAILURE_OPERATION, "load iap_code to SRAM"); return ERRCODE_FAILURE_OPERATION; } // verify iap_code memset(verify_buff, 0, sizeof(iap_code)); if (adi_memap_read_buf32(KINETIS_IAP_BASE, verify_buff, sizeof(iap_code))) { LOG_ERROR(ERRMSG_FAILURE_OPERATION, "read flash_loader"); return ERRCODE_FAILURE_OPERATION; } if (memcmp(verify_buff, iap_code, sizeof(iap_code))) { LOG_ERROR(ERRMSG_FAILURE_OPERATION, "verify flash_loader"); return ERRCODE_FAILURE_OPERATION; } // write pc reg = KINETIS_IAP_BASE + 1; if (cm_write_core_register(CM_COREREG_PC, ®)) { LOG_ERROR(ERRMSG_FAILURE_OPERATION, "write PC"); return ERRCODE_FAILURE_OPERATION; } if (cm_dp_resume()) { LOG_ERROR(ERRMSG_FAILURE_OPERATION, "run iap"); return ERRCODE_FAILURE_OPERATION; } fl->iap_cnt = 0; return VSFERR_NONE; }
vsf_err_t stm32swj_fl_init(struct stm32_fl_t *fl) { uint32_t reg; uint8_t verify_buff[sizeof(fl_code)]; // download flash_loader if (cm_dp_halt()) { LOG_ERROR(ERRMSG_FAILURE_OPERATION, "halt stm32"); return ERRCODE_FAILURE_OPERATION; } // write code to target SRAM if (adi_memap_write_buf32(fl->base, fl_code, sizeof(fl_code))) { LOG_ERROR(ERRMSG_FAILURE_OPERATION, "load flash_loader to SRAM"); return ERRCODE_FAILURE_OPERATION; } // verify fl_code memset(verify_buff, 0, sizeof(fl_code)); if (adi_memap_read_buf32(fl->base, verify_buff, sizeof(fl_code))) { LOG_ERROR(ERRMSG_FAILURE_OPERATION, "read flash_loader"); return ERRCODE_FAILURE_OPERATION; } if (memcmp(verify_buff, fl_code, sizeof(fl_code))) { LOG_ERROR(ERRMSG_FAILURE_OPERATION, "verify flash_loader"); return ERRCODE_FAILURE_OPERATION; } reg = fl->base + 1; if (cm_write_core_register(CM_COREREG_PC, ®)) { LOG_ERROR(ERRMSG_FAILURE_OPERATION, "write PC"); return ERRCODE_FAILURE_OPERATION; } if (cm_dp_resume()) { LOG_ERROR(ERRMSG_FAILURE_OPERATION, "run flash_loader"); return ERRCODE_FAILURE_OPERATION; } fl->cnt = 0; return VSFERR_NONE; }
static vsf_err_t kinetisswj_iap_poll_result(struct kinetis_fl_t *fl, struct kinetisswj_iap_rpl_t *result) { uint32_t result_buff[4]; REFERENCE_PARAMETER(fl); if (adi_memap_read_buf32(KINETIS_IAP_SYNC_ADDR, (uint8_t *)result_buff, sizeof(result_buff))) { LOG_ERROR(ERRMSG_FAILURE_OPERATION, "read iap sync"); return ERRCODE_FAILURE_OPERATION; } result->sync = LE_TO_SYS_U32(result_buff[0]); result->iap_cnt = LE_TO_SYS_U32(result_buff[1]); result->fail = LE_TO_SYS_U32(result_buff[2]); result->result = LE_TO_SYS_U32(result_buff[3]); return (0 == result->sync) ? VSFERR_NONE : VSFERR_NOT_READY; }
static vsf_err_t nuc400swj_init_iap(void) { uint32_t reg; uint8_t verify_buff[sizeof(iap_code)]; uint32_t fuse_data[4]; if (cm_dp_halt()) { LOG_ERROR(ERRMSG_FAILURE_OPERATION, "halt nuc400"); return ERRCODE_FAILURE_OPERATION; } if (nuc400swj_unlock()) { LOG_ERROR(ERRMSG_FAILURE_OPERATION, "unlock NUC chip"); return ERRCODE_FAILURE_OPERATION; } if (nuc400swj_fmc_enable()) { LOG_ERROR(ERRMSG_FAILURE_OPERATION, "enable FMC"); return ERRCODE_FAILURE_OPERATION; } chip_protected = false; if (nuc400swj_isp_run(NUC400_REG_ISPCMD_READ, NUC400_REG_CFG_BA, (uint32_t *)fuse_data, 4, true)) { return ERRCODE_FAILURE_OPERATION; } if ((fuse_data[0] != 0xFFFFFFFF) || (fuse_data[1] != 0xFFFFFFFF) || (fuse_data[2] != 0xFFFFFFFF)) { uint32_t crc32 = 0; struct crc_t crc8 = {CRC_BITLEN_8, 0xFF, 0x07}; uint8_t *fuse_byte = (uint8_t *)fuse_data; uint8_t i; for (i = 0; i < 4; i++) { crc8.result = 0xFF; crc_calc(&crc8, &fuse_byte[i + 0], 1); crc_calc(&crc8, &fuse_byte[i + 4], 1); crc_calc(&crc8, &fuse_byte[i + 8], 1); crc32 |= crc8.result << (i * 8); } if (crc32 == fuse_data[3]) { // checksum ok, option bytes valid // check if read protected if (!(fuse_data[0] & 0x00000002)) { // read protected chip_protected = true; LOG_INFO("chip protected"); return VSFERR_NONE; } } } // write iap_code if (adi_memap_write_buf32(NUC400_IAP_BASE, (uint8_t*)iap_code, sizeof(iap_code))) { LOG_ERROR(ERRMSG_FAILURE_OPERATION, "load iap_code to SRAM"); return ERRCODE_FAILURE_OPERATION; } // verify iap_code memset(verify_buff, 0, sizeof(iap_code)); if (adi_memap_read_buf32(NUC400_IAP_BASE, verify_buff, sizeof(iap_code))) { LOG_ERROR(ERRMSG_FAILURE_OPERATION, "read flash_loader"); return ERRCODE_FAILURE_OPERATION; } if (memcmp(verify_buff, iap_code, sizeof(iap_code))) { LOG_ERROR(ERRMSG_FAILURE_OPERATION, "verify flash_loader"); return ERRCODE_FAILURE_OPERATION; } // write pc reg = NUC400_IAP_BASE + 1; if (cm_write_core_register(CM_COREREG_PC, ®)) { LOG_ERROR(ERRMSG_FAILURE_OPERATION, "write PC"); return ERRCODE_FAILURE_OPERATION; } if (cm_dp_resume()) { LOG_ERROR(ERRMSG_FAILURE_OPERATION, "run iap"); return ERRCODE_FAILURE_OPERATION; } return VSFERR_NONE; }