mirror of
https://github.com/ByteWelder/Tactility.git
synced 2026-02-18 19:03:16 +00:00
- Create `Include/` folder for all main projects - Fix some issues here and there (found while moving things) - All includes are now in `Tactility/` subfolder and must be included with that prefix. This fixes issues with clashing POSIX headers (e.g. `<semaphore.h>` versus Tactility's `Semaphore.h`)
109 lines
2.1 KiB
C++
109 lines
2.1 KiB
C++
#ifdef ESP_PLATFORM
|
|
|
|
#include "Tactility/hal/usb/Usb.h"
|
|
#include "Tactility/hal/usb/UsbTusb.h"
|
|
#include "Tactility/hal/SpiSdCard.h"
|
|
#include "Tactility/TactilityHeadless.h"
|
|
|
|
#include <Tactility/Log.h>
|
|
|
|
namespace tt::hal::usb {
|
|
|
|
#define TAG "usb"
|
|
|
|
#define BOOT_FLAG 42
|
|
|
|
struct BootMode {
|
|
uint32_t flag = 0;
|
|
};
|
|
|
|
static Mode currentMode = Mode::Default;
|
|
static RTC_NOINIT_ATTR BootMode bootMode;
|
|
|
|
sdmmc_card_t* _Nullable getCard() {
|
|
auto sdcard = getConfiguration()->sdcard;
|
|
if (sdcard == nullptr) {
|
|
TT_LOG_W(TAG, "No SD card configuration found");
|
|
return nullptr;
|
|
}
|
|
|
|
if (!sdcard->isMounted()) {
|
|
TT_LOG_W(TAG, "SD card not mounted");
|
|
return nullptr;
|
|
}
|
|
|
|
auto spi_sdcard = std::static_pointer_cast<SpiSdCard>(sdcard);
|
|
if (spi_sdcard == nullptr) {
|
|
TT_LOG_W(TAG, "SD card interface is not supported (must be SpiSdCard)");
|
|
return nullptr;
|
|
}
|
|
|
|
auto* card = spi_sdcard->getCard();
|
|
if (card == nullptr) {
|
|
TT_LOG_W(TAG, "SD card has no card object available");
|
|
return nullptr;
|
|
}
|
|
|
|
return card;
|
|
}
|
|
|
|
static bool canStartNewMode() {
|
|
return isSupported() && (currentMode == Mode::Default || currentMode == Mode::None);
|
|
}
|
|
|
|
bool isSupported() {
|
|
return tusbIsSupported();
|
|
}
|
|
|
|
bool startMassStorageWithSdmmc() {
|
|
if (!canStartNewMode()) {
|
|
TT_LOG_E(TAG, "Can't start");
|
|
return false;
|
|
}
|
|
|
|
if (tusbStartMassStorageWithSdmmc()) {
|
|
currentMode = Mode::MassStorageSdmmc;
|
|
return true;
|
|
} else {
|
|
TT_LOG_E(TAG, "Failed to init mass storage");
|
|
return false;
|
|
}
|
|
}
|
|
|
|
void stop() {
|
|
if (canStartNewMode()) {
|
|
return;
|
|
}
|
|
|
|
tusbStop();
|
|
|
|
currentMode = Mode::None;
|
|
}
|
|
|
|
Mode getMode() {
|
|
return currentMode;
|
|
}
|
|
|
|
bool canRebootIntoMassStorageSdmmc() {
|
|
return tusbIsSupported() && getCard() != nullptr;
|
|
}
|
|
|
|
void rebootIntoMassStorageSdmmc() {
|
|
if (tusbIsSupported()) {
|
|
bootMode.flag = BOOT_FLAG;
|
|
esp_restart();
|
|
}
|
|
}
|
|
|
|
bool isUsbBootMode() {
|
|
return bootMode.flag == BOOT_FLAG;
|
|
}
|
|
|
|
void resetUsbBootMode() {
|
|
bootMode.flag = 0;
|
|
}
|
|
|
|
}
|
|
|
|
#endif
|