diff --git a/drivers/dv_display/dv_display.cpp b/drivers/dv_display/dv_display.cpp index c5c25b55..dd7a3bfa 100644 --- a/drivers/dv_display/dv_display.cpp +++ b/drivers/dv_display/dv_display.cpp @@ -118,6 +118,10 @@ namespace pimoroni { } } + void DVDisplay::reset() { + swd_reset(); + } + uint8_t DVDisplay::get_gpio() { return i2c->reg_read_uint8(I2C_ADDR, I2C_REG_GPIO); } diff --git a/drivers/dv_display/dv_display.hpp b/drivers/dv_display/dv_display.hpp index c5bab8e1..6527c1a0 100644 --- a/drivers/dv_display/dv_display.hpp +++ b/drivers/dv_display/dv_display.hpp @@ -129,6 +129,7 @@ namespace pimoroni { void init(uint16_t width, uint16_t height, Mode mode = MODE_RGB555); void flip(); + void reset(); // 32 colour palette mode. Note that palette entries range from 0-31, // but when writing colour values the palette entry is in bits 6-2, so the diff --git a/drivers/dv_display/swd_load.cpp b/drivers/dv_display/swd_load.cpp index df180b65..0ec1c7d4 100644 --- a/drivers/dv_display/swd_load.cpp +++ b/drivers/dv_display/swd_load.cpp @@ -339,20 +339,30 @@ static bool start(uint pc, uint sp) { return true; } -bool swd_load_program(const uint* addresses, const uint** data, const uint* data_len_in_bytes, uint num_sections, uint pc = 0x20000001, uint sp = 0x20042000, bool use_xip_as_ram = false) { +static bool swd_reset_internal() { gpio_init(2); gpio_init(3); gpio_disable_pulls(2); gpio_pull_up(3); - mp_printf(&mp_plat_print, "Connecting\n"); - bool ok = connect(true, 0xf); mp_printf(&mp_plat_print, "Reset %s\n", ok ? "OK" : "Fail"); + return ok; +} + +bool swd_reset() { + bool ok = swd_reset_internal(); + unload_pio(); + return ok; +} + +static bool swd_load_program_internal(const uint* addresses, const uint** data, const uint* data_len_in_bytes, uint num_sections, uint pc, uint sp, bool use_xip_as_ram) { + bool ok = swd_reset_internal(); if (!ok) { return false; } + mp_printf(&mp_plat_print, "Connecting\n"); ok = connect(false, 0); mp_printf(&mp_plat_print, "Connected core 0 %s\n", ok ? "OK" : "Fail"); @@ -382,6 +392,11 @@ bool swd_load_program(const uint* addresses, const uint** data, const uint* data ok |= start(0, 0x20041000); - unload_pio(); return ok; } + +bool swd_load_program(const uint* addresses, const uint** data, const uint* data_len_in_bytes, uint num_sections, uint pc = 0x20000001, uint sp = 0x20042000, bool use_xip_as_ram = false) { + bool ok = swd_load_program_internal(addresses, data, data_len_in_bytes, num_sections, pc, sp, use_xip_as_ram); + unload_pio(); + return ok; +} \ No newline at end of file diff --git a/drivers/dv_display/swd_load.hpp b/drivers/dv_display/swd_load.hpp index 75d0a81a..b2c08347 100644 --- a/drivers/dv_display/swd_load.hpp +++ b/drivers/dv_display/swd_load.hpp @@ -1 +1,2 @@ -bool swd_load_program(const uint* addresses, const uint** data, const uint* data_len_in_bytes, uint num_sections, uint pc = 0x20000001, uint sp = 0x20042000, bool use_xip_as_ram = false); \ No newline at end of file +bool swd_load_program(const uint* addresses, const uint** data, const uint* data_len_in_bytes, uint num_sections, uint pc = 0x20000001, uint sp = 0x20042000, bool use_xip_as_ram = false); +bool swd_reset(); \ No newline at end of file