implement IHEX for the GUI (#718)

* implement IHEX for the GUI
* use already loaded file's content to write into the flash
* fix clang casting
pull/721/head
Anatoli Klassen 2018-06-27 17:16:25 +02:00 zatwierdzone przez Jerry Jacobs
rodzic 6db0fc243f
commit 1ec89bf7a2
1 zmienionych plików z 69 dodań i 37 usunięć

Wyświetl plik

@ -306,49 +306,81 @@ stlink_gui_populate_filemem_view (gpointer data)
g_return_val_if_fail (gui != NULL, NULL);
g_return_val_if_fail (gui->filename != NULL, NULL);
file = g_file_new_for_path (gui->filename);
input_stream = G_INPUT_STREAM (g_file_read (file, NULL, &err));
if (err) {
stlink_gui_set_info_error_message (gui, err->message);
g_error_free (err);
goto out;
}
if (g_str_has_suffix (gui->filename, ".hex")) {
// If the file has prefix .hex - try to interpret it as Intel-HEX.
// It's difficult to merge the world of standard functions and GLib,
// so do it simple - load whole file into buffer and copy the data
// to the destination afterwards.
// We loose meanwhile the displaying of the progress and need
// double memory.
file_info = g_file_input_stream_query_info (G_FILE_INPUT_STREAM (input_stream),
G_FILE_ATTRIBUTE_STANDARD_SIZE, NULL, &err);
if (err) {
stlink_gui_set_info_error_message (gui, err->message);
g_error_free (err);
goto out_input;
}
if (gui->file_mem.memory) {
g_free (gui->file_mem.memory);
}
gui->file_mem.size = g_file_info_get_size (file_info);
gui->file_mem.memory = g_malloc (gui->file_mem.size);
uint8_t* mem = NULL;
size_t size = 0;
uint32_t begin = 0;
int res = stlink_parse_ihex (gui->filename, 0, &mem, &size, &begin);
for (off = 0; off < (gint) gui->file_mem.size; off += MEM_READ_SIZE) {
guint n_read = MEM_READ_SIZE;
if (res == 0) {
if (gui->file_mem.memory) {
g_free (gui->file_mem.memory);
}
gui->file_mem.size = size;
gui->file_mem.memory = g_malloc (size);
gui->file_mem.base = begin;
if (off + MEM_READ_SIZE > (gint) gui->file_mem.size) {
n_read = (guint) gui->file_mem.size - off;
}
memcpy (gui->file_mem.memory, mem, size);
}
else {
stlink_gui_set_info_error_message (gui, "Cannot interpret the file as Intel-HEX");
}
if (g_input_stream_read (G_INPUT_STREAM (input_stream),
&buffer, n_read, NULL, &err) == -1) {
stlink_gui_set_info_error_message (gui, err->message);
g_error_free (err);
goto out_input;
}
memcpy (gui->file_mem.memory + off, buffer, n_read);
gui->progress.fraction = (gdouble) (off + n_read) / gui->file_mem.size;
}
g_idle_add ((GSourceFunc) stlink_gui_update_filemem_view, gui);
free(mem);
}
else {
file = g_file_new_for_path (gui->filename);
input_stream = G_INPUT_STREAM (g_file_read (file, NULL, &err));
if (err) {
stlink_gui_set_info_error_message (gui, err->message);
g_error_free (err);
goto out;
}
file_info = g_file_input_stream_query_info (G_FILE_INPUT_STREAM (input_stream),
G_FILE_ATTRIBUTE_STANDARD_SIZE, NULL, &err);
if (err) {
stlink_gui_set_info_error_message (gui, err->message);
g_error_free (err);
goto out_input;
}
if (gui->file_mem.memory) {
g_free (gui->file_mem.memory);
}
gui->file_mem.size = g_file_info_get_size (file_info);
gui->file_mem.memory = g_malloc (gui->file_mem.size);
for (off = 0; off < (gint) gui->file_mem.size; off += MEM_READ_SIZE) {
guint n_read = MEM_READ_SIZE;
if (off + MEM_READ_SIZE > (gint) gui->file_mem.size) {
n_read = (guint) gui->file_mem.size - off;
}
if (g_input_stream_read (G_INPUT_STREAM (input_stream),
&buffer, n_read, NULL, &err) == -1) {
stlink_gui_set_info_error_message (gui, err->message);
g_error_free (err);
goto out_input;
}
memcpy (gui->file_mem.memory + off, buffer, n_read);
gui->progress.fraction = (gdouble) (off + n_read) / gui->file_mem.size;
}
out_input:
g_object_unref (input_stream);
g_object_unref (input_stream);
out:
g_object_unref (file);
g_object_unref (file);
}
g_idle_add ((GSourceFunc) stlink_gui_update_filemem_view, gui);
return NULL;
}
@ -661,7 +693,7 @@ stlink_gui_write_flash (gpointer data)
g_return_val_if_fail ((gui->sl != NULL), NULL);
g_return_val_if_fail ((gui->filename != NULL), NULL);
if (stlink_fwrite_flash(gui->sl, gui->filename, gui->sl->flash_base) < 0) {
if (stlink_mwrite_flash(gui->sl, gui->file_mem.memory, (uint32_t)gui->file_mem.size, gui->sl->flash_base) < 0) {
stlink_gui_set_info_error_message (gui, "Failed to write to flash");
}