mirror of
https://github.com/XIVN1987/DAPLink.git
synced 2026-09-27 06:26:16 +00:00
91 lines
2.3 KiB
C
91 lines
2.3 KiB
C
/**
|
|
* @file SWD_flash.c
|
|
* @brief Program target flash through SWD
|
|
*/
|
|
#include "swd_host.h"
|
|
#include "SWD_flash.h"
|
|
|
|
|
|
extern const program_target_t flash_algo;
|
|
|
|
|
|
error_t target_flash_init(uint32_t flash_start, uint32_t func)
|
|
{
|
|
if(func == 0)
|
|
{
|
|
if (0 == swd_set_target_state_hw(RESET_PROGRAM)) {
|
|
return ERROR_RESET;
|
|
}
|
|
|
|
// Download flash programming algorithm to target and initialise.
|
|
if (0 == swd_write_memory(flash_algo.algo_start, (uint8_t *)flash_algo.algo_blob, flash_algo.algo_size)) {
|
|
return ERROR_ALGO_DL;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (0 != swd_flash_syscall_exec(&flash_algo.sys_call_s, flash_algo.init, flash_start, 0, func, 0)) {
|
|
return ERROR_INIT;
|
|
}
|
|
}
|
|
|
|
return ERROR_SUCCESS;
|
|
}
|
|
|
|
error_t target_flash_uninit(uint32_t func)
|
|
{
|
|
if (0 != swd_flash_syscall_exec(&flash_algo.sys_call_s, flash_algo.init, func, 0, 0, 0)) {
|
|
return ERROR_UNINIT;
|
|
}
|
|
|
|
return ERROR_SUCCESS;
|
|
}
|
|
|
|
error_t target_flash_program_page(uint32_t addr, const uint8_t *buf, uint32_t size)
|
|
{
|
|
while (size > 0) {
|
|
uint32_t write_size = size > flash_algo.program_buffer_size ? flash_algo.program_buffer_size : size;
|
|
|
|
// Write page to buffer
|
|
if (!swd_write_memory(flash_algo.program_buffer, (uint8_t *)buf, write_size)) {
|
|
return ERROR_ALGO_DATA_SEQ;
|
|
}
|
|
|
|
// Run flash programming
|
|
if (swd_flash_syscall_exec(&flash_algo.sys_call_s,
|
|
flash_algo.program_page,
|
|
addr,
|
|
flash_algo.program_buffer_size,
|
|
flash_algo.program_buffer,
|
|
0)) {
|
|
return ERROR_WRITE;
|
|
}
|
|
|
|
addr += write_size;
|
|
buf += write_size;
|
|
size -= write_size;
|
|
}
|
|
|
|
return ERROR_SUCCESS;
|
|
}
|
|
|
|
error_t target_flash_erase_sector(uint32_t addr)
|
|
{
|
|
if (0 != swd_flash_syscall_exec(&flash_algo.sys_call_s, flash_algo.erase_sector, addr, 0, 0, 0)) {
|
|
return ERROR_ERASE_SECTOR;
|
|
}
|
|
|
|
return ERROR_SUCCESS;
|
|
}
|
|
|
|
error_t target_flash_erase_chip(void)
|
|
{
|
|
error_t status = ERROR_SUCCESS;
|
|
|
|
if (0 != swd_flash_syscall_exec(&flash_algo.sys_call_s, flash_algo.erase_chip, 0, 0, 0, 0)) {
|
|
return ERROR_ERASE_ALL;
|
|
}
|
|
|
|
return status;
|
|
}
|