From 69d7394e5c3cef86cf42c2f150e27c7ca21a569f Mon Sep 17 00:00:00 2001 From: Dean Lee Date: Sun, 9 Jul 2023 11:06:10 +0800 Subject: [PATCH] boardd: check fw version when connecting (#28823) * Check fw version when connecting * apply reviews * mv to boardd * don't keep looping --------- Co-authored-by: Adeeb Shihadeh old-commit-hash: b9cffac29c013b82c33d03710e294677cf50b395 --- selfdrive/boardd/boardd.cc | 4 ++++ selfdrive/boardd/panda.cc | 14 +++++++++++++- selfdrive/boardd/panda.h | 1 + 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/selfdrive/boardd/boardd.cc b/selfdrive/boardd/boardd.cc index 866ff1aa20..f4ad918109 100644 --- a/selfdrive/boardd/boardd.cc +++ b/selfdrive/boardd/boardd.cc @@ -200,6 +200,10 @@ Panda *connect(std::string serial="", uint32_t index=0) { } //panda->enable_deepsleep(); + if (!panda->up_to_date()) { + throw std::runtime_error("Panda firmware out of date. Run pandad.py to update."); + } + sync_time(panda.get(), SyncTimeDir::FROM_PANDA); return panda.release(); } diff --git a/selfdrive/boardd/panda.cc b/selfdrive/boardd/panda.cc index 625e4218f7..c20be23d09 100644 --- a/selfdrive/boardd/panda.cc +++ b/selfdrive/boardd/panda.cc @@ -22,7 +22,6 @@ Panda::Panda(std::string serial, uint32_t bus_offset) : bus_offset(bus_offset) { } hw_type = get_hw_type(); - has_rtc = (hw_type == cereal::PandaState::PandaType::UNO) || (hw_type == cereal::PandaState::PandaType::DOS) || (hw_type == cereal::PandaState::PandaType::TRES); @@ -153,6 +152,19 @@ std::optional Panda::get_serial() { return err >= 0 ? std::make_optional(serial_buf) : std::nullopt; } +bool Panda::up_to_date() { + if (auto fw_sig = get_firmware_version()) { + for (auto fn : { "panda.bin.signed", "panda_h7.bin.signed" }) { + auto content = util::read_file(std::string("../../panda/board/obj/") + fn); + if (content.size() >= fw_sig->size() && + memcmp(content.data() + content.size() - fw_sig->size(), fw_sig->data(), fw_sig->size()) == 0) { + return true; + } + } + } + return false; +} + void Panda::set_power_saving(bool power_saving) { handle->control_write(0xe7, power_saving, 0); } diff --git a/selfdrive/boardd/panda.h b/selfdrive/boardd/panda.h index ea93229725..5edca04419 100644 --- a/selfdrive/boardd/panda.h +++ b/selfdrive/boardd/panda.h @@ -72,6 +72,7 @@ public: std::optional get_can_state(uint16_t can_number); void set_loopback(bool loopback); std::optional> get_firmware_version(); + bool up_to_date(); std::optional get_serial(); void set_power_saving(bool power_saving); void enable_deepsleep();