예제 #1
0
파일: kinetis.c 프로젝트: ChuckM/blackmagic
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;
}
예제 #2
0
파일: kinetis.c 프로젝트: ChuckM/blackmagic
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;
}
예제 #3
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;
}
예제 #4
0
파일: kinetis.c 프로젝트: ChuckM/blackmagic
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;
}
예제 #5
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;
}