static int kl_gen_flash_done(struct target_flash *f) { struct kinetis_flash *kf = (struct kinetis_flash *)f; if (unsafe_enabled) return 0; if (target_mem_read8(f->t, FLASH_SECURITY_BYTE_ADDRESS) == FLASH_SECURITY_BYTE_UNSECURED) return 0; /* Load the security byte based on the alignment (determine 8 byte phrases * vs 4 byte phrases). */ if (kf->write_len == 8) { uint32_t vals[2]; vals[0] = target_mem_read32(f->t, FLASH_SECURITY_BYTE_ADDRESS-4); vals[1] = target_mem_read32(f->t, FLASH_SECURITY_BYTE_ADDRESS); vals[1] = (vals[1] & 0xffffff00) | FLASH_SECURITY_BYTE_UNSECURED; kl_gen_command(f->t, FTFE_CMD_PROGRAM_PHRASE, FLASH_SECURITY_BYTE_ADDRESS - 4, (uint8_t*)vals); } else { uint32_t val = target_mem_read32(f->t, FLASH_SECURITY_BYTE_ADDRESS); val = (val & 0xffffff00) | FLASH_SECURITY_BYTE_UNSECURED; kl_gen_command(f->t, FTFA_CMD_PROGRAM_LONGWORD, FLASH_SECURITY_BYTE_ADDRESS, (uint8_t*)&val); } return 0; }
static int kl_gen_flash_write(struct target_flash *f, target_addr dest, const void *src, size_t len) { struct kinetis_flash *kf = (struct kinetis_flash *)f; /* Ensure we don't write something horrible over the security byte */ if (!unsafe_enabled && (dest <= FLASH_SECURITY_BYTE_ADDRESS) && ((dest + len) > FLASH_SECURITY_BYTE_ADDRESS)) { ((uint8_t*)src)[FLASH_SECURITY_BYTE_ADDRESS - dest] = FLASH_SECURITY_BYTE_UNSECURED; } /* Determine write command based on the alignment. */ uint8_t write_cmd; if (kf->write_len == K64_WRITE_LEN) { write_cmd = FTFE_CMD_PROGRAM_PHRASE; } else { write_cmd = FTFA_CMD_PROGRAM_LONGWORD; } while (len) { if (kl_gen_command(f->t, write_cmd, dest, src)) { len -= kf->write_len; dest += kf->write_len; src += kf->write_len; } else { return 1; } } return 0; }
static int kl_gen_flash_erase(struct target_flash *f, target_addr addr, size_t len) { while (len) { if (kl_gen_command(f->t, FTFA_CMD_ERASE_SECTOR, addr, NULL)) { len -= KL_GEN_PAGESIZE; addr += KL_GEN_PAGESIZE; } else { return 1; } } return 0; }
static int kl_gen_flash_erase(struct target_flash *f, target_addr addr, size_t len) { while (len) { if (kl_gen_command(f->t, FTFA_CMD_ERASE_SECTOR, addr, NULL)) { /* Different targets have different flash erase sizes */ len -= f->blocksize; addr += f->blocksize; } else { return 1; } } return 0; }
static int kl_gen_flash_write(struct target_flash *f, target_addr dest, const void *src, size_t len) { while (len) { if (kl_gen_command(f->t, FTFA_CMD_PROGRAM_LONGWORD, dest, src)) { len -= 4; dest += 4; src += 4; } else { return 1; } } return 0; }