mirror of https://github.com/XIVN1987/DAPLink
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
90 lines
2.3 KiB
90 lines
2.3 KiB
/** |
|
* @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; |
|
}
|
|
|