diff --git a/blackmagic/bm_if.c b/blackmagic/bm_if.c index c4530c65..52b72dbf 100644 --- a/blackmagic/bm_if.c +++ b/blackmagic/bm_if.c @@ -528,6 +528,34 @@ int bm_write_flash(uint32_t addr, const void *data, uint32_t len) { return ret; } +/** + * Write target memory. + * + * @param addr + * Address to write to + * + * @param data + * The data to write + * + * @param len + * Length of the data + * + * @return + * -2: Write failed + * -1: Not connected + * 1: Success + */ +int bm_mem_write(uint32_t addr, const void *data, uint32_t len) { + int ret = -1; + + if (cur_target) { + target_print_en = false; + ret = target_mem_write(cur_target, addr, data, len) ? -2 : 1; + } + + return ret; +} + /** * Read target memory * diff --git a/blackmagic/bm_if.h b/blackmagic/bm_if.h index e2ae1e3b..2705711a 100644 --- a/blackmagic/bm_if.h +++ b/blackmagic/bm_if.h @@ -29,6 +29,7 @@ void bm_set_enabled(bool enabled); int bm_connect(void); int bm_erase_flash_all(void); int bm_write_flash(uint32_t addr, const void *data, uint32_t len); +int bm_mem_write(uint32_t addr, const void *data, uint32_t len); int bm_mem_read(uint32_t addr, void *data, uint32_t len); int bm_reboot(void); void bm_halt_req(void); diff --git a/commands.c b/commands.c index 592b84a8..988f2d7c 100644 --- a/commands.c +++ b/commands.c @@ -1504,6 +1504,7 @@ void commands_process_packet(unsigned char *data, unsigned int len, case COMM_BM_MAP_PINS_NRF5X: case COMM_BM_MEM_READ: case COMM_GET_IMU_CALIBRATION: + case COMM_BM_MEM_WRITE: if (!is_blocking) { memcpy(blocking_thread_cmd_buffer, data - 1, len + 1); blocking_thread_cmd_len = len + 1; @@ -2197,6 +2198,20 @@ static THD_FUNCTION(blocking_thread, arg) { send_func_blocking(send_buffer, ind + read_len); } } break; + + case COMM_BM_MEM_WRITE: { + int32_t ind = 0; + uint32_t addr = buffer_get_uint32(data, &ind); + + int res = bm_mem_write(addr, data + ind, len - ind); + + ind = 0; + send_buffer[ind++] = packet_id; + buffer_append_int16(send_buffer, res, &ind); + if (send_func_blocking) { + send_func_blocking(send_buffer, ind); + } + } break; #endif case COMM_GET_IMU_CALIBRATION: { int32_t ind = 0; diff --git a/datatypes.h b/datatypes.h index 42595fad..2f930baf 100644 --- a/datatypes.h +++ b/datatypes.h @@ -1045,6 +1045,8 @@ typedef enum { COMM_IO_BOARD_GET_ALL, COMM_IO_BOARD_SET_PWM, COMM_IO_BOARD_SET_DIGITAL, + + COMM_BM_MEM_WRITE, } COMM_PACKET_ID; // CAN commands