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 <adeebshihadeh@gmail.com>
old-commit-hash: b9cffac29c
beeps
Dean Lee 2 years ago committed by GitHub
parent 2d88501e21
commit 69d7394e5c
  1. 4
      selfdrive/boardd/boardd.cc
  2. 14
      selfdrive/boardd/panda.cc
  3. 1
      selfdrive/boardd/panda.h

@ -200,6 +200,10 @@ Panda *connect(std::string serial="", uint32_t index=0) {
} }
//panda->enable_deepsleep(); //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); sync_time(panda.get(), SyncTimeDir::FROM_PANDA);
return panda.release(); return panda.release();
} }

@ -22,7 +22,6 @@ Panda::Panda(std::string serial, uint32_t bus_offset) : bus_offset(bus_offset) {
} }
hw_type = get_hw_type(); hw_type = get_hw_type();
has_rtc = (hw_type == cereal::PandaState::PandaType::UNO) || has_rtc = (hw_type == cereal::PandaState::PandaType::UNO) ||
(hw_type == cereal::PandaState::PandaType::DOS) || (hw_type == cereal::PandaState::PandaType::DOS) ||
(hw_type == cereal::PandaState::PandaType::TRES); (hw_type == cereal::PandaState::PandaType::TRES);
@ -153,6 +152,19 @@ std::optional<std::string> Panda::get_serial() {
return err >= 0 ? std::make_optional(serial_buf) : std::nullopt; 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) { void Panda::set_power_saving(bool power_saving) {
handle->control_write(0xe7, power_saving, 0); handle->control_write(0xe7, power_saving, 0);
} }

@ -72,6 +72,7 @@ public:
std::optional<can_health_t> get_can_state(uint16_t can_number); std::optional<can_health_t> get_can_state(uint16_t can_number);
void set_loopback(bool loopback); void set_loopback(bool loopback);
std::optional<std::vector<uint8_t>> get_firmware_version(); std::optional<std::vector<uint8_t>> get_firmware_version();
bool up_to_date();
std::optional<std::string> get_serial(); std::optional<std::string> get_serial();
void set_power_saving(bool power_saving); void set_power_saving(bool power_saving);
void enable_deepsleep(); void enable_deepsleep();

Loading…
Cancel
Save