From 8278c8d308c16151ee3964d42575245813e3ea08 Mon Sep 17 00:00:00 2001 From: folkert van heusden Date: Tue, 21 Mar 2023 22:02:15 +0100 Subject: [PATCH] ESP32 --- ESP32/disk_backend.cpp | 1 + ESP32/disk_backend.h | 1 + ESP32/disk_backend_esp32.cpp | 83 ++++++++++++++++++++++++++++++++++++ ESP32/disk_backend_esp32.h | 19 +++++++++ ESP32/esp32.h | 3 ++ ESP32/main.ino | 8 ++-- debugger.cpp | 2 + kw11-l.cpp | 5 +++ rk05.cpp | 8 ---- rl02.cpp | 8 ---- 10 files changed, 119 insertions(+), 19 deletions(-) create mode 120000 ESP32/disk_backend.cpp create mode 120000 ESP32/disk_backend.h create mode 100644 ESP32/disk_backend_esp32.cpp create mode 100644 ESP32/disk_backend_esp32.h diff --git a/ESP32/disk_backend.cpp b/ESP32/disk_backend.cpp new file mode 120000 index 0000000..6acc92c --- /dev/null +++ b/ESP32/disk_backend.cpp @@ -0,0 +1 @@ +../disk_backend.cpp \ No newline at end of file diff --git a/ESP32/disk_backend.h b/ESP32/disk_backend.h new file mode 120000 index 0000000..288f0e0 --- /dev/null +++ b/ESP32/disk_backend.h @@ -0,0 +1 @@ +../disk_backend.h \ No newline at end of file diff --git a/ESP32/disk_backend_esp32.cpp b/ESP32/disk_backend_esp32.cpp new file mode 100644 index 0000000..e0aa2fc --- /dev/null +++ b/ESP32/disk_backend_esp32.cpp @@ -0,0 +1,83 @@ +#include +#include + +#include "disk_backend_esp32.h" +#include "error.h" +#include "log.h" + + +disk_backend_esp32::disk_backend_esp32(const std::string & filename) : + fh(new File32()) +{ + if (!fh->open(filename.c_str(), O_RDWR)) + error_exit(true, "rk05: cannot open \"%s\"", filename.c_str()); +} + +disk_backend_esp32::~disk_backend_esp32() +{ + fh->close(); + + delete fh; +} + +bool disk_backend_esp32::read(const off_t offset, const size_t n, uint8_t *const target) +{ + DOLOG(debug, false, "disk_backend_esp32::read: read %zu bytes from offset %zu", n, offset); + +#if defined(ESP32) + digitalWrite(LED_BUILTIN, LOW); +#endif + + if (!fh->seek(offset)) + DOLOG(ll_error, true, "seek error %s", strerror(errno)); + + yield(); + + if (fh->read(target, n) != size_t(n)) { + DOLOG(debug, true, "fread error: %s", strerror(errno)); + +#if defined(ESP32) + digitalWrite(LED_BUILTIN, HIGH); +#endif + return false; + } + + yield(); + +#if defined(ESP32) + digitalWrite(LED_BUILTIN, HIGH); +#endif + + return true; +} + +bool disk_backend_esp32::write(const off_t offset, const size_t n, const uint8_t *const from) +{ + DOLOG(debug, false, "disk_backend_esp32::write: write %zu bytes to offset %zu", n, offset); + +#if defined(ESP32) + digitalWrite(LED_BUILTIN, LOW); +#endif + + if (!fh->seek(offset)) + DOLOG(ll_error, true, "seek error %s", strerror(errno)); + + yield(); + + if (fh->write(from, n) != n) { + DOLOG(ll_error, true, "RK05 fwrite error %s", strerror(errno)); + +#if defined(ESP32) + digitalWrite(LED_BUILTIN, HIGH); +#endif + return false; + } + + yield(); + +#if defined(ESP32) + digitalWrite(LED_BUILTIN, HIGH); +#endif + + return true; +} diff --git a/ESP32/disk_backend_esp32.h b/ESP32/disk_backend_esp32.h new file mode 100644 index 0000000..a33136a --- /dev/null +++ b/ESP32/disk_backend_esp32.h @@ -0,0 +1,19 @@ +#include + +#include "disk_backend.h" +#include "esp32.h" + + +class disk_backend_esp32 : public disk_backend +{ +private: + File32 *const fh { nullptr }; + +public: + disk_backend_esp32(const std::string & filename); + virtual ~disk_backend_esp32(); + + bool read(const off_t offset, const size_t n, uint8_t *const target); + + bool write(const off_t offset, const size_t n, const uint8_t *const from); +}; diff --git a/ESP32/esp32.h b/ESP32/esp32.h index 6d8dbf0..4deb38a 100644 --- a/ESP32/esp32.h +++ b/ESP32/esp32.h @@ -1,7 +1,10 @@ #pragma once #if defined(ESP32) +#include + #include + #define USE_SDFAT #define SD_FAT_TYPE 1 #include diff --git a/ESP32/main.ino b/ESP32/main.ino index e3197c5..d0ea153 100644 --- a/ESP32/main.ino +++ b/ESP32/main.ino @@ -12,6 +12,8 @@ #include "console_esp32.h" #include "cpu.h" #include "debugger.h" +#include "disk_backend.h" +#include "disk_backend_esp32.h" #include "error.h" #include "esp32.h" #include "gen.h" @@ -104,7 +106,7 @@ void setup_wifi_stations() } // RK05, RL02 files -std::pair, std::vector > select_disk_files(console *const c) +std::pair, std::vector > select_disk_files(console *const c) { c->debug("MISO: %d", int(MISO)); c->debug("MOSI: %d", int(MOSI)); @@ -146,10 +148,10 @@ std::pair, std::vector > select_disk_files fh.close(); if (ch == '1') - return { { selected_file }, { } }; + return { { new disk_backend_esp32(selected_file) }, { } }; if (ch == '2') - return { { }, { selected_file } }; + return { { }, { new disk_backend_esp32(selected_file) } }; } c->put_string_lf("open failed"); diff --git a/debugger.cpp b/debugger.cpp index f0bb155..743e292 100644 --- a/debugger.cpp +++ b/debugger.cpp @@ -7,6 +7,8 @@ #if defined(ESP32) +#include "esp32.h" + void setBootLoader(bus *const b); #endif diff --git a/kw11-l.cpp b/kw11-l.cpp index 2f73bd7..19aa531 100644 --- a/kw11-l.cpp +++ b/kw11-l.cpp @@ -5,6 +5,11 @@ #include "kw11-l.h" #include "utils.h" +#if defined(ESP32) +#include "esp32.h" +#endif + + #if defined(ESP32) void thread_wrapper_kw11(void *p) { diff --git a/rk05.cpp b/rk05.cpp index 9b3fd51..a2d0b06 100644 --- a/rk05.cpp +++ b/rk05.cpp @@ -96,10 +96,6 @@ void rk05::writeByte(const uint16_t addr, const uint8_t v) void rk05::writeWord(const uint16_t addr, uint16_t v) { -#if defined(ESP32) - digitalWrite(LED_BUILTIN, LOW); -#endif - const int reg = (addr - RK05_BASE) / 2; registers[reg] = v; @@ -228,8 +224,4 @@ void rk05::writeWord(const uint16_t addr, uint16_t v) } } } - -#if defined(ESP32) - digitalWrite(LED_BUILTIN, HIGH); -#endif } diff --git a/rl02.cpp b/rl02.cpp index ed81d21..b0a0355 100644 --- a/rl02.cpp +++ b/rl02.cpp @@ -95,10 +95,6 @@ uint32_t rl02::calcOffset(const uint16_t da) void rl02::writeWord(const uint16_t addr, uint16_t v) { -#if defined(ESP32) - digitalWrite(LED_BUILTIN, LOW); -#endif - DOLOG(debug, true, "RL02 write %06o: %06o", addr, v); const int reg = (addr - RL02_BASE) / 2; @@ -157,8 +153,4 @@ void rl02::writeWord(const uint16_t addr, uint16_t v) *disk_read_acitivity = false; } } - -#if defined(ESP32) - digitalWrite(LED_BUILTIN, HIGH); -#endif }