From 65a1f09a903cb2bcef9bcd576b5146407dd77ecd Mon Sep 17 00:00:00 2001 From: jacqueline Date: Fri, 18 Aug 2023 12:32:18 +1000 Subject: Support app console commands for the samd --- src/drivers/samd.cpp | 55 +++++++++++++++++++++++++--------------------------- 1 file changed, 26 insertions(+), 29 deletions(-) (limited to 'src/drivers/samd.cpp') diff --git a/src/drivers/samd.cpp b/src/drivers/samd.cpp index e87fc9d8..3c37b6c6 100644 --- a/src/drivers/samd.cpp +++ b/src/drivers/samd.cpp @@ -13,11 +13,12 @@ #include "hal/i2c_types.h" #include "i2c.hpp" -enum Registers { - kRegisterVersion = 0, - kRegisterCharge = 1, - kRegisterUsbMsc = 2, - kRegisterFlashing = 3, +enum Registers : uint8_t { + kSamdFirmwareVersion = 0, + kChargeStatus = 1, + kUsbStatus = 2, + kPowerControl = 3, + kUsbControl = 4, }; static const uint8_t kAddress = 0x45; @@ -33,13 +34,13 @@ Samd::Samd() { I2CTransaction transaction; transaction.start() .write_addr(kAddress, I2C_MASTER_WRITE) - .write_ack(kRegisterVersion) + .write_ack(Registers::kSamdFirmwareVersion) + .start() .write_addr(kAddress, I2C_MASTER_READ) .read(&raw_res, I2C_MASTER_NACK) .stop(); - ESP_LOGI(kTag, "checking samd firmware rev"); - transaction.Execute(); - ESP_LOGI(kTag, "samd firmware: %u", raw_res); + ESP_ERROR_CHECK(transaction.Execute()); + ESP_LOGI(kTag, "samd firmware rev: %u", raw_res); } Samd::~Samd() {} @@ -48,12 +49,13 @@ auto Samd::ReadChargeStatus() -> std::optional { I2CTransaction transaction; transaction.start() .write_addr(kAddress, I2C_MASTER_WRITE) - .write_ack(kRegisterCharge) + .write_ack(Registers::kChargeStatus) + .start() .write_addr(kAddress, I2C_MASTER_READ) .read(&raw_res, I2C_MASTER_NACK) .stop(); ESP_LOGI(kTag, "checking charge status"); - transaction.Execute(); + ESP_ERROR_CHECK(transaction.Execute()); ESP_LOGI(kTag, "raw charge status: %x", raw_res); uint8_t usb_state = raw_res & 0b11; @@ -77,37 +79,32 @@ auto Samd::ReadChargeStatus() -> std::optional { } } -auto Samd::WriteAllowUsbMsc(bool is_allowed) -> void { - 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 { +auto Samd::ReadUsbStatus() -> UsbStatus { uint8_t raw_res; I2CTransaction transaction; transaction.start() .write_addr(kAddress, I2C_MASTER_WRITE) - .write_ack(kRegisterVersion) + .write_ack(Registers::kUsbStatus) + .start() .write_addr(kAddress, I2C_MASTER_READ) .read(&raw_res, I2C_MASTER_NACK) .stop(); + ESP_LOGI(kTag, "checking usb status"); 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; transaction.start() .write_addr(kAddress, I2C_MASTER_WRITE) - .write_ack(kRegisterFlashing, is_enabled) + .write_ack(Registers::kUsbControl, 0b100) .stop(); ESP_ERROR_CHECK(transaction.Execute()); } -- cgit v1.2.3