From 2ecdbf6d1f46ba1a2239b0cd7431e8227e6494ba Mon Sep 17 00:00:00 2001 From: Dreaded_X Date: Wed, 2 Jun 2021 22:56:40 +0200 Subject: [PATCH] Redid i2c upload to work with stm32 client device --- src/main.cpp | 59 ++++++++++++++++++++++++++++++++-------------------- 1 file changed, 36 insertions(+), 23 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index f915b88..bdc8467 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -116,7 +116,9 @@ void write_data(std::unique_ptr& ser, uint8_t* data, uint16_t le } // Check CRC - if (crc32(data, length) != read_length(ser)) { + uint32_t c = crc32(data, length); + std::cout << std::hex << c << std::dec << '\n'; + if (c != read_length(ser)) { throw std::runtime_error("CRC Mismatch"); } } @@ -128,7 +130,7 @@ void read_data(std::unique_ptr& ser, uint8_t* data, uint16_t len } // @todo We need to check if we are already in the bootloader -void program_stm32(std::unique_ptr& ser, std::string filename) { +void program_dfu(std::unique_ptr& ser, std::string filename) { ser->flushInput(); ser->flushOutput(); ser->flush(); @@ -232,33 +234,44 @@ void program_i2c(std::unique_ptr& ser, std::string filename, uin throw std::runtime_error("Failed to read byte"); } - if (r == 0x02) { - std::cout << "Restarting target to bootloader...\n"; + std::cout << "Waiting for the target to be ready... (target: 0x" << std::hex << (uint32_t)address << std::dec << ")\n"; + + if (r == 0xFE) { + throw std::runtime_error("Please reboot device to bootloader first!"); } else if (r != 0x01) { - std::cerr << "Response: " << r << ", " << std::hex << (uint32_t)r << '\n'; + std::cout << "Response: " << r << ", " << std::hex << (uint32_t)r << '\n'; throw std::runtime_error("Invalid response"); } - std::cout << "Waiting for the target to be ready... (target: 0x" << std::hex << (uint32_t)address << std::dec << ")\n"; - wait_for_ack(ser); - char version_string[16] = {0}; - read_data(ser, reinterpret_cast(version_string), sizeof(version_string)); - std::cout << "Bootloader version: " << std::string(version_string, 16) << '\n'; + std::cout << "Sending upload command\n"; + wait_for_ack(ser); + std::cout << "Sending length\n"; + wait_for_ack(ser); + + + std::cout << "Sending data...\n"; + wait_for_ack(ser); + + // @todo Implement this // Track progress - std::cout << "Programming...\n"; - for (uint16_t progress = 0; ; progress = read_length(ser)) { - std::cout << "Progress: " << progress << '/' << length << '\r'; - if (progress == length) { - break; - } - } - std::cout << '\n'; + // std::cout << "Programming...\n"; + // for (uint16_t progress = 0; ; progress = read_length(ser)) { + // std::cout << "Progress: " << progress << '/' << length << '\r'; + // if (progress == length) { + // break; + // } + // } + // std::cout << '\n'; - // Wait for otherside to signal we are done + std::cout << "Validating data...\n"; wait_for_ack(ser); + + std::cout << "Programming...\n"; + wait_for_ack(ser); + std::cout << "Done!\n"; } @@ -274,8 +287,8 @@ int main(int argc, const char** argv) { app.add_option("filename", filename, "File to upload")->required(); app.add_option("--dev,-d", device, "Serial device to use")->default_val("/dev/ttyUSB0"); - app.add_subcommand("stm", "Program STM32 mcu")->callback([&] { - program_stm32(ser, filename); + app.add_subcommand("dfu", "Program STM32 mcu using dfu mode")->callback([&] { + program_dfu(ser, filename); }); CLI::App* rom = app.add_subcommand("rom", "Program ROM/RAM")->callback([&] { @@ -292,8 +305,8 @@ int main(int argc, const char** argv) { // CLI::App* bload = app.add_subcommand("bload", "Upload for bload"); app.parse_complete_callback([&] { - std::cout << "Initializing serial\n"; - ser = std::make_unique("/dev/ttyUSB0", 115200, serial::Timeout::simpleTimeout(1000)); + std::cout << "Initializing serial (" << device << ")\n"; + ser = std::make_unique(device, 115200, serial::Timeout::simpleTimeout(30000)); if (!ser->isOpen()) { throw std::runtime_error("Port is not open");