Support app console commands for the samd

custom
jacqueline 2 years ago
parent d8533c42df
commit 65a1f09a90
  1. 58
      src/app_console/app_console.cpp
  2. 2
      src/app_console/include/app_console.hpp
  3. 8
      src/drivers/include/samd.hpp
  4. 55
      src/drivers/samd.cpp
  5. 6
      src/system_fsm/booting.cpp

@ -38,6 +38,7 @@ namespace console {
std::weak_ptr<database::Database> AppConsole::sDatabase; std::weak_ptr<database::Database> AppConsole::sDatabase;
audio::TrackQueue* AppConsole::sTrackQueue; audio::TrackQueue* AppConsole::sTrackQueue;
drivers::Bluetooth* AppConsole::sBluetooth; drivers::Bluetooth* AppConsole::sBluetooth;
drivers::Samd* AppConsole::sSamd;
int CmdListDir(int argc, char** argv) { int CmdListDir(int argc, char** argv) {
auto lock = AppConsole::sDatabase.lock(); auto lock = AppConsole::sDatabase.lock();
@ -481,6 +482,62 @@ void RegisterBtList() {
esp_console_cmd_register(&cmd); esp_console_cmd_register(&cmd);
} }
int CmdSamd(int argc, char** argv) {
static const std::string usage = "usage: samd [flash|charge]";
if (argc != 2) {
std::cout << usage << std::endl;
return 1;
}
std::string cmd{argv[1]};
if (cmd == "flash") {
std::cout << "resetting samd..." << std::endl;
vTaskDelay(pdMS_TO_TICKS(5));
AppConsole::sSamd->ResetToFlashSamd();
} else if (cmd == "charge") {
auto res = AppConsole::sSamd->ReadChargeStatus();
if (res) {
switch (res.value()) {
case drivers::Samd::ChargeStatus::kNoBattery:
std::cout << "kNoBattery" << std::endl;
break;
case drivers::Samd::ChargeStatus::kBatteryCritical:
std::cout << "kBatteryCritical" << std::endl;
break;
case drivers::Samd::ChargeStatus::kDischarging:
std::cout << "kDischarging" << std::endl;
break;
case drivers::Samd::ChargeStatus::kChargingRegular:
std::cout << "kChargingRegular" << std::endl;
break;
case drivers::Samd::ChargeStatus::kChargingFast:
std::cout << "kChargingFast" << std::endl;
break;
case drivers::Samd::ChargeStatus::kFullCharge:
std::cout << "kFullCharge" << std::endl;
break;
}
} else {
std::cout << "unknown" << std::endl;
}
} else {
std::cout << usage << std::endl;
return 1;
}
return 0;
}
void RegisterSamd() {
esp_console_cmd_t cmd{.command = "samd",
.help = "",
.hint = NULL,
.func = &CmdSamd,
.argtable = NULL};
esp_console_cmd_register(&cmd);
}
auto AppConsole::RegisterExtraComponents() -> void { auto AppConsole::RegisterExtraComponents() -> void {
RegisterListDir(); RegisterListDir();
RegisterPlayFile(); RegisterPlayFile();
@ -495,6 +552,7 @@ auto AppConsole::RegisterExtraComponents() -> void {
RegisterDbDump(); RegisterDbDump();
RegisterTaskStates(); RegisterTaskStates();
RegisterBtList(); RegisterBtList();
RegisterSamd();
} }
} // namespace console } // namespace console

@ -11,6 +11,7 @@
#include "bluetooth.hpp" #include "bluetooth.hpp"
#include "console.hpp" #include "console.hpp"
#include "database.hpp" #include "database.hpp"
#include "samd.hpp"
#include "track_queue.hpp" #include "track_queue.hpp"
namespace console { namespace console {
@ -20,6 +21,7 @@ class AppConsole : public Console {
static std::weak_ptr<database::Database> sDatabase; static std::weak_ptr<database::Database> sDatabase;
static audio::TrackQueue* sTrackQueue; static audio::TrackQueue* sTrackQueue;
static drivers::Bluetooth* sBluetooth; static drivers::Bluetooth* sBluetooth;
static drivers::Samd* sSamd;
protected: protected:
virtual auto RegisterExtraComponents() -> void; virtual auto RegisterExtraComponents() -> void;

@ -34,7 +34,7 @@ class Samd {
auto ReadChargeStatus() -> std::optional<ChargeStatus>; auto ReadChargeStatus() -> std::optional<ChargeStatus>;
enum class UsbMscStatus { enum class UsbStatus {
// There is no compatible usb host attached. // There is no compatible usb host attached.
kDetached, kDetached,
// There is a compatible usb host attached, but USB MSC is not currently // There is a compatible usb host attached, but USB MSC is not currently
@ -44,11 +44,9 @@ class Samd {
kAttachedMounted, kAttachedMounted,
}; };
auto WriteAllowUsbMsc(bool is_allowed) -> void; auto ReadUsbStatus() -> UsbStatus;
auto ReadUsbMscStatus() -> UsbMscStatus;
auto ReadFlashingEnabled() -> bool; auto ResetToFlashSamd() -> void;
auto WriteFlashingEnabled(bool) -> void;
}; };
} // namespace drivers } // namespace drivers

@ -13,11 +13,12 @@
#include "hal/i2c_types.h" #include "hal/i2c_types.h"
#include "i2c.hpp" #include "i2c.hpp"
enum Registers { enum Registers : uint8_t {
kRegisterVersion = 0, kSamdFirmwareVersion = 0,
kRegisterCharge = 1, kChargeStatus = 1,
kRegisterUsbMsc = 2, kUsbStatus = 2,
kRegisterFlashing = 3, kPowerControl = 3,
kUsbControl = 4,
}; };
static const uint8_t kAddress = 0x45; static const uint8_t kAddress = 0x45;
@ -33,13 +34,13 @@ Samd::Samd() {
I2CTransaction transaction; I2CTransaction transaction;
transaction.start() transaction.start()
.write_addr(kAddress, I2C_MASTER_WRITE) .write_addr(kAddress, I2C_MASTER_WRITE)
.write_ack(kRegisterVersion) .write_ack(Registers::kSamdFirmwareVersion)
.start()
.write_addr(kAddress, I2C_MASTER_READ) .write_addr(kAddress, I2C_MASTER_READ)
.read(&raw_res, I2C_MASTER_NACK) .read(&raw_res, I2C_MASTER_NACK)
.stop(); .stop();
ESP_LOGI(kTag, "checking samd firmware rev"); ESP_ERROR_CHECK(transaction.Execute());
transaction.Execute(); ESP_LOGI(kTag, "samd firmware rev: %u", raw_res);
ESP_LOGI(kTag, "samd firmware: %u", raw_res);
} }
Samd::~Samd() {} Samd::~Samd() {}
@ -48,12 +49,13 @@ auto Samd::ReadChargeStatus() -> std::optional<ChargeStatus> {
I2CTransaction transaction; I2CTransaction transaction;
transaction.start() transaction.start()
.write_addr(kAddress, I2C_MASTER_WRITE) .write_addr(kAddress, I2C_MASTER_WRITE)
.write_ack(kRegisterCharge) .write_ack(Registers::kChargeStatus)
.start()
.write_addr(kAddress, I2C_MASTER_READ) .write_addr(kAddress, I2C_MASTER_READ)
.read(&raw_res, I2C_MASTER_NACK) .read(&raw_res, I2C_MASTER_NACK)
.stop(); .stop();
ESP_LOGI(kTag, "checking charge status"); ESP_LOGI(kTag, "checking charge status");
transaction.Execute(); ESP_ERROR_CHECK(transaction.Execute());
ESP_LOGI(kTag, "raw charge status: %x", raw_res); ESP_LOGI(kTag, "raw charge status: %x", raw_res);
uint8_t usb_state = raw_res & 0b11; uint8_t usb_state = raw_res & 0b11;
@ -77,37 +79,32 @@ auto Samd::ReadChargeStatus() -> std::optional<ChargeStatus> {
} }
} }
auto Samd::WriteAllowUsbMsc(bool is_allowed) -> void { auto Samd::ReadUsbStatus() -> UsbStatus {
I2CTransaction transaction;
transaction.start()
.write_addr(kAddress, I2C_MASTER_WRITE)
.write_ack(kRegisterUsbMsc, is_allowed)
.stop();
transaction.Execute();
}
auto Samd::ReadUsbMscStatus() -> UsbMscStatus {
return UsbMscStatus::kDetached;
}
auto Samd::ReadFlashingEnabled() -> bool {
uint8_t raw_res; uint8_t raw_res;
I2CTransaction transaction; I2CTransaction transaction;
transaction.start() transaction.start()
.write_addr(kAddress, I2C_MASTER_WRITE) .write_addr(kAddress, I2C_MASTER_WRITE)
.write_ack(kRegisterVersion) .write_ack(Registers::kUsbStatus)
.start()
.write_addr(kAddress, I2C_MASTER_READ) .write_addr(kAddress, I2C_MASTER_READ)
.read(&raw_res, I2C_MASTER_NACK) .read(&raw_res, I2C_MASTER_NACK)
.stop(); .stop();
ESP_LOGI(kTag, "checking usb status");
ESP_ERROR_CHECK(transaction.Execute()); ESP_ERROR_CHECK(transaction.Execute());
return raw_res; ESP_LOGI(kTag, "raw usb status: %x", raw_res);
if (!(raw_res & 0b1)) {
return UsbStatus::kDetached;
}
return (raw_res & 0b10) ? UsbStatus::kAttachedMounted
: UsbStatus::kAttachedIdle;
} }
auto Samd::WriteFlashingEnabled(bool is_enabled) -> void { auto Samd::ResetToFlashSamd() -> void {
I2CTransaction transaction; I2CTransaction transaction;
transaction.start() transaction.start()
.write_addr(kAddress, I2C_MASTER_WRITE) .write_addr(kAddress, I2C_MASTER_WRITE)
.write_ack(kRegisterFlashing, is_enabled) .write_ack(Registers::kUsbControl, 0b100)
.stop(); .stop();
ESP_ERROR_CHECK(transaction.Execute()); ESP_ERROR_CHECK(transaction.Execute());
} }

@ -16,6 +16,7 @@
#include "lvgl/lvgl.h" #include "lvgl/lvgl.h"
#include "nvs.hpp" #include "nvs.hpp"
#include "relative_wheel.hpp" #include "relative_wheel.hpp"
#include "samd.hpp"
#include "spi.hpp" #include "spi.hpp"
#include "system_events.hpp" #include "system_events.hpp"
#include "system_fsm.hpp" #include "system_fsm.hpp"
@ -86,6 +87,7 @@ auto Booting::exit() -> void {
sAppConsole = new console::AppConsole(); sAppConsole = new console::AppConsole();
sAppConsole->sTrackQueue = sTrackQueue.get(); sAppConsole->sTrackQueue = sTrackQueue.get();
sAppConsole->sBluetooth = sBluetooth.get(); sAppConsole->sBluetooth = sBluetooth.get();
sAppConsole->sSamd = sSamd.get();
sAppConsole->Launch(); sAppConsole->Launch();
} }
@ -94,8 +96,8 @@ auto Booting::react(const BootComplete& ev) -> void {
// It's possible that the SAMD is currently exposing the SD card as a USB // It's possible that the SAMD is currently exposing the SD card as a USB
// device. Make sure we don't immediately try to claim it. // device. Make sure we don't immediately try to claim it.
if (sSamd && sSamd->ReadUsbMscStatus() == if (sSamd &&
drivers::Samd::UsbMscStatus::kAttachedMounted) { sSamd->ReadUsbStatus() == drivers::Samd::UsbStatus::kAttachedMounted) {
transit<Unmounted>(); transit<Unmounted>();
} }
transit<Running>(); transit<Running>();

Loading…
Cancel
Save