summaryrefslogtreecommitdiff
path: root/src/drivers
diff options
context:
space:
mode:
authorjacqueline <me@jacqueline.id.au>2023-12-22 16:48:24 +1100
committerjacqueline <me@jacqueline.id.au>2023-12-22 16:48:24 +1100
commit5f0e16e97a773480a3b09c5312c98742e7049f1d (patch)
treefacd2b44740516cfb317ccdde63ac3dc36151b06 /src/drivers
parentd4a0085753b9397ac4a1452520decbeb994bb30c (diff)
downloadtangara-fw-5f0e16e97a773480a3b09c5312c98742e7049f1d.tar.gz
Support changing the usb msc state
Diffstat (limited to 'src/drivers')
-rw-r--r--src/drivers/include/samd.hpp3
-rw-r--r--src/drivers/samd.cpp26
2 files changed, 29 insertions, 0 deletions
diff --git a/src/drivers/include/samd.hpp b/src/drivers/include/samd.hpp
index d9f1ca48..f25f9575 100644
--- a/src/drivers/include/samd.hpp
+++ b/src/drivers/include/samd.hpp
@@ -54,6 +54,9 @@ class Samd {
auto ResetToFlashSamd() -> void;
auto PowerDown() -> void;
+ auto UsbMassStorage(bool en) -> void;
+ auto UsbMassStorage() -> bool;
+
// Not copyable or movable. There should usually only ever be once instance
// of this class, and that instance will likely have a static lifetime.
Samd(const Samd&) = delete;
diff --git a/src/drivers/samd.cpp b/src/drivers/samd.cpp
index f361513e..cf3b9c18 100644
--- a/src/drivers/samd.cpp
+++ b/src/drivers/samd.cpp
@@ -143,4 +143,30 @@ auto Samd::PowerDown() -> void {
ESP_ERROR_CHECK(transaction.Execute(3));
}
+auto Samd::UsbMassStorage(bool en) -> void {
+ I2CTransaction transaction;
+ transaction.start()
+ .write_addr(kAddress, I2C_MASTER_WRITE)
+ .write_ack(Registers::kUsbControl, en)
+ .stop();
+ ESP_ERROR_CHECK(transaction.Execute(3));
+}
+
+auto Samd::UsbMassStorage() -> bool {
+ uint8_t raw_res;
+ I2CTransaction transaction;
+ transaction.start()
+ .write_addr(kAddress, I2C_MASTER_WRITE)
+ .write_ack(Registers::kUsbControl)
+ .start()
+ .write_addr(kAddress, I2C_MASTER_READ)
+ .read(&raw_res, I2C_MASTER_NACK)
+ .stop();
+ esp_err_t res = transaction.Execute(1);
+ if (res != ESP_OK) {
+ return false;
+ }
+ return raw_res & 1;
+}
+
} // namespace drivers