From 647c62286081945b7dc51f7309a2eddaf59ac44c Mon Sep 17 00:00:00 2001 From: radex Date: Thu, 16 May 2024 22:24:47 +0200 Subject: [PATCH] sd card bullshit --- firmware/platformio.ini | 6 +- firmware/src/main.cpp | 220 +++++++++++++++++++++++++++++--- firmware/src/sd_pinout.txt | 10 ++ pcb/MainBoard/audio.kicad_sch | 10 ++ pcb/MainBoard/microsd.kicad_sch | 10 ++ text.pxm | Bin 0 -> 219299 bytes 6 files changed, 234 insertions(+), 22 deletions(-) create mode 100644 firmware/src/sd_pinout.txt create mode 100644 text.pxm diff --git a/firmware/platformio.ini b/firmware/platformio.ini index 15e64fa..aa0bbc0 100644 --- a/firmware/platformio.ini +++ b/firmware/platformio.ini @@ -12,4 +12,8 @@ platform = raspberrypi board = pico framework = arduino -lib_deps = fastled/FastLED@^3.6.0 +lib_deps = + fastled/FastLED@^3.6.0 + ; arduino-libraries/SD@^1.2.4 + khoih-prog/RP2040_SD@^1.0.1 + diff --git a/firmware/src/main.cpp b/firmware/src/main.cpp index 6bdfcdd..22888c4 100644 --- a/firmware/src/main.cpp +++ b/firmware/src/main.cpp @@ -4,9 +4,12 @@ #include "pico/multicore.h" #include "hardware/gpio.h" #include "mbed_wait_api.h" -#include "audio.h" +#include +// #include +#include +// #include "audio.h" -#define Serial Serial1 +// #define Serial Serial1 #define COL_SER 20 #define COL_OE 21 @@ -57,12 +60,142 @@ void life_setup(); void life_step(); extern bool cells[ROW_COUNT * COL_COUNT]; +void printDirectory(File dir, int numTabs); + void setup() { + pinMode(16, INPUT); + pinMode(17, OUTPUT); + digitalWrite(17, HIGH); + pinMode(18, OUTPUT); + pinMode(19, OUTPUT); + pinMode(28, INPUT_PULLUP); + // pinMode(23, OUTPUT); + + delay(2000); Serial.begin(115200); Serial.println("Hello worldd!"); - init_audio(); + SPI.begin(); + + while (digitalRead(28) == HIGH) { + Serial.println("SD card not connected, waiting..."); + delay(1000); + } + + Serial.println(BOARD_NAME); + Serial.println(RP2040_SD_VERSION); + + Serial.print("Initializing SD card with SS = "); + Serial.println(PIN_SPI_SS); + Serial.print("SCK = "); + Serial.println(PIN_SPI_SCK); + Serial.print("MOSI = "); + Serial.println(PIN_SPI_MOSI); + Serial.print("MISO = "); + Serial.println(PIN_SPI_MISO); + + if (!SD.begin(PIN_SPI_SS)) + { + Serial.println("Initialization failed!"); + Serial.print("Error code: "); + // Serial.println(SD.card.errorCode(), HEX); + return; + } + + Serial.println("initialization done."); + + // delay(2000); + // return; + + // open the file. note that only one file can be open at a time, + // so you have to close this one before opening another. + File myFile = SD.open("test2.txt", FILE_WRITE); + + // if the file opened okay, write to it: + if (myFile) { + Serial.print("Writing to test.txt..."); + myFile.println("testing 1, 2, 3."); + // close the file: + myFile.close(); + Serial.println("done."); + } else { + // if the file didn't open, print an error: + Serial.println("error opening test.txt"); + } + + // re-open the file for reading: + myFile = SD.open("test2.txt"); + if (myFile) { + Serial.println("test.txt:"); + + // read from the file until there's nothing else in it: + while (myFile.available()) { + Serial.write(myFile.read()); + } + // close the file: + myFile.close(); + } else { + // if the file didn't open, print an error: + Serial.println("error opening test.txt"); + } +/* + Serial.print("Clusters: "); + Serial.println(SD.volume.clusterCount()); + Serial.print("Blocks x Cluster: "); + Serial.println(SD.volume.blocksPerCluster()); + + Serial.print("Total Blocks: "); + Serial.println(SD.volume.blocksPerCluster() * SD.volume.clusterCount()); + Serial.println(); + + // print the type and size of the first FAT-type volume + uint32_t volumesize; + Serial.print("Volume type is: FAT"); + Serial.println(SD.volume.fatType(), DEC); + + volumesize = SD.volume.blocksPerCluster(); // clusters are collections of blocks + volumesize *= SD.volume.clusterCount(); // we'll have a lot of clusters + volumesize /= 2; // SD card blocks are always 512 bytes (2 blocks are 1 KB) + Serial.print("Volume size (KB): "); + Serial.println(volumesize); + Serial.print("Volume size (MB): "); + volumesize /= 1024; + Serial.println(volumesize); + Serial.print("Volume size (GB): "); + Serial.println((float)volumesize / 1024.0);*/ + + File root = SD.open("/"); + + printDirectory(root, 0); + + // Serial.println("\nFiles found on the card (name, date and size in bytes): "); + // SD.root.openRoot(SD.volume); + + // list all files in the card with date and size + // SD.root.ls(LS_R | LS_DATE | LS_SIZE); + // SD.root.close(); + +/* + Serial.print("Initializing SD card..."); + + if (!SD.begin(17)) { + Serial.println("initialization failed!"); + Serial.print("Error code: "); + Serial.println(SD.card.errorCode(), HEX); + while (1); + } +*/ + + // if (!SD.begin(17)) { + // Serial.println("initialization failed!"); + // Serial.print("Error code: "); + // Serial.println(SD.card.errorCode(), HEX); + // while (1); + // } + + return; + memset(framebuffer, 0, sizeof(framebuffer)); // disable output @@ -98,19 +231,62 @@ void setup() { // launch core1 // NOTE: For some reason, without delay, core1 doesn't start? - // delay(500); - // multicore_reset_core1(); - // multicore_launch_core1(main2); + delay(500); + multicore_reset_core1(); + multicore_launch_core1(main2); // setup_audio(); - life_setup(); + // life_setup(); + + // // copy cells to framebuffer + // for (int y = 0; y < ROW_COUNT; y++) { + // for (int x = 0; x < COL_COUNT; x++) { + // framebuffer[y * ROW_COUNT + x] = cells[y * ROW_COUNT + x] ? 255 : 0; + // } + // } +} + +void printDirectory(File dir, int numTabs) { + + while (true) { + + File entry = dir.openNextFile(); + + if (! entry) { + + // no more files + + break; - // copy cells to framebuffer - for (int y = 0; y < ROW_COUNT; y++) { - for (int x = 0; x < COL_COUNT; x++) { - framebuffer[y * ROW_COUNT + x] = cells[y * ROW_COUNT + x] ? 255 : 0; } + + for (uint8_t i = 0; i < numTabs; i++) { + + Serial.print('\t'); + + } + + Serial.print(entry.name()); + + if (entry.isDirectory()) { + + Serial.println("/"); + + printDirectory(entry, numTabs + 1); + + } else { + + // files have sizes, directories do not + + Serial.print("\t\t"); + + Serial.println(entry.size(), DEC); + + } + + entry.close(); + } } @@ -122,6 +298,8 @@ void main2() { } void loop() { + + return; if (Serial.available() > 0) { char c = Serial.read(); if (c == 'p') { @@ -156,16 +334,16 @@ void loop() { } // game of life step - auto now = millis(); - if (now - frameLastChangedAt > 100) { - frameLastChangedAt = now; - life_step(); - for (int y = 0; y < ROW_COUNT; y++) { - for (int x = 0; x < COL_COUNT; x++) { - framebuffer[y * ROW_COUNT + x] = cells[y * ROW_COUNT + x] ? 255 : 0; - } - } - } + // auto now = millis(); + // if (now - frameLastChangedAt > 100) { + // frameLastChangedAt = now; + // life_step(); + // for (int y = 0; y < ROW_COUNT; y++) { + // for (int x = 0; x < COL_COUNT; x++) { + // framebuffer[y * ROW_COUNT + x] = cells[y * ROW_COUNT + x] ? 255 : 0; + // } + // } + // } // hide output outputEnable(ROW_OE, false); diff --git a/firmware/src/sd_pinout.txt b/firmware/src/sd_pinout.txt new file mode 100644 index 0000000..a8d2c60 --- /dev/null +++ b/firmware/src/sd_pinout.txt @@ -0,0 +1,10 @@ + + 17 +DAT1 GND +3V3 CS SHLD + 2 4 6 8 10 + 1 3 5 7 9 +DET MISO CLK MOSI DAT2 +28 16 18 19 + + + diff --git a/pcb/MainBoard/audio.kicad_sch b/pcb/MainBoard/audio.kicad_sch index 58c7516..1e9058a 100644 --- a/pcb/MainBoard/audio.kicad_sch +++ b/pcb/MainBoard/audio.kicad_sch @@ -787,6 +787,16 @@ ) (uuid "e5922f6b-454e-4ae4-8eea-d9bb45efbb04") ) + (text "220R is VERY loud" + (exclude_from_sim no) + (at 60.96 35.814 0) + (effects + (font + (size 1.27 1.27) + ) + ) + (uuid "3a8e57bf-0b15-44ce-b0e8-e3c71fc72ce9") + ) (text "Taken from \"Hardware design with RP2040\"" (exclude_from_sim no) (at 89.916 30.48 0) diff --git a/pcb/MainBoard/microsd.kicad_sch b/pcb/MainBoard/microsd.kicad_sch index 5d446bf..e73506d 100644 --- a/pcb/MainBoard/microsd.kicad_sch +++ b/pcb/MainBoard/microsd.kicad_sch @@ -1522,6 +1522,16 @@ ) (uuid "7aa8ee28-1ea5-4ed7-b314-6cc6d8065b11") ) + (text "active low" + (exclude_from_sim no) + (at 46.99 85.598 0) + (effects + (font + (size 1.27 1.27) + ) + ) + (uuid "3a490f36-86d1-4720-ba6f-9c7dfeba899d") + ) (hierarchical_label "SD_MOSI" (shape input) (at 54.61 64.77 180) diff --git a/text.pxm b/text.pxm new file mode 100644 index 0000000000000000000000000000000000000000..3223944b137be2b45d1146c67dd83ad793b7cf9c GIT binary patch literal 219299 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 literal 0 HcmV?d00001