#include #include #include #include "pico/stdlib.h" #include "pico/bootrom.h" #include "msgpackpp.h" #include "halfsiphash.h" static constexpr uint8_t hash_key[8] = {}; struct RebootingBootsel { static constexpr int8_t ext_id = 1; auto as_tuple() const { return std::tie(); } }; struct Envelope { static constexpr int8_t ext_id = 0; uint32_t checksum; std::vector payload; auto as_tuple() const { return std::tie(checksum, payload); } }; static std::vector pack_envelope(const std::vector &payload) { uint32_t checksum = halfsiphash::hash32(payload.data(), payload.size(), hash_key); msgpackpp::packer p; p.pack(Envelope{checksum, payload}); return p.get_payload(); } static void send_bytes(const std::vector &data) { for (auto b : data) { putchar(b); } stdio_flush(); } int main() { stdio_init_all(); while (true) { int c = getchar_timeout_us(100000); if (c == 'p') { printf("p"); } else if (c == 'b') { msgpackpp::packer inner; inner.pack(RebootingBootsel{}); auto msg = pack_envelope(inner.get_payload()); send_bytes(msg); sleep_ms(100); reset_usb_boot(0, 0); } } }