now works on pico (W) with internal storage only

This commit is contained in:
Jeff Epler 2023-05-24 16:20:43 -05:00
parent 5b95956eac
commit 32ec9fae84
No known key found for this signature in database
GPG key ID: D5BF15AB975AB4DE
3 changed files with 108 additions and 83 deletions

View file

@ -1,6 +1,10 @@
#ifndef CONSOLE_H
#define CONSOLE_H
extern int _kbhit(void);
uint8_t _getch(void);
void _putch(uint8 ch);
/* see main.c for definition */
uint8 mask8bit = 0x7f; // TO be used for masking 8 bit characters (XMODEM related)

View file

@ -0,0 +1,91 @@
// =========================================================================================
// Define SdFat as alias for SD
// =========================================================================================
#include <SdFat.h> // One SD library to rule them all - Greinman SdFat from Library Manager
#include <Adafruit_SPIFlash.h>
#include <Adafruit_TinyUSB.h>
#include "../../console.h"
Adafruit_FlashTransport_RP2040 flashTransport;
Adafruit_SPIFlash flash(&flashTransport);
FatFileSystem SD; // Filesystem object from SdFat
Adafruit_USBD_MSC usb_msc; // USB mass storage object
// =========================================================================================
// Define Board-Data
// GP25 green onboard LED
// =========================================================================================
#define LED 25 // GPIO25
#define LEDinv 0
#define board_pico
#define board_analog_io
#define board_digital_io
#define BOARD "Raspberry Pi Pico (internal storage)"
// FUNCTIONS REQUIRED FOR USB MASS STORAGE ---------------------------------
static bool msc_changed = true; // Is set true on filesystem changes
// Callback on READ10 command.
int32_t msc_read_cb(uint32_t lba, void *buffer, uint32_t bufsize) {
return flash.readBlocks(lba, (uint8_t *)buffer, bufsize / 512) ? bufsize : -1;
}
// Callback on WRITE10 command.
int32_t msc_write_cb(uint32_t lba, uint8_t *buffer, uint32_t bufsize) {
digitalWrite(LED_BUILTIN, HIGH);
return flash.writeBlocks(lba, buffer, bufsize / 512) ? bufsize : -1;
}
// Callback on WRITE10 completion.
void msc_flush_cb(void) {
flash.syncBlocks(); // Sync with flash
SD.cacheClear(); // Clear filesystem cache to force refresh
digitalWrite(LED_BUILTIN, LOW);
msc_changed = true;
}
void _puthex32(uint32_t x) {
_puthex16(x >> 16);
_puthex16(x & 0xffff);
}
bool port_init_early() {
_puts("port_init_early()");
_puts("X");
// USB mass storage / filesystem setup (do BEFORE Serial init)
if (!flash.begin()) { _puts("!flash_begin()"); return false; }
_puts("Y");
// Set disk vendor id, product id and revision
usb_msc.setID("Adafruit", "Internal Flash", "1.0");
_puts("Z");
// Set disk size, block size is 512 regardless of spi flash page size
_puthex32(flash.pageSize());
_putcon(' ');
_puthex32(flash.numPages());
usb_msc.setCapacity(flash.pageSize() * flash.numPages() / 512, 512);
_puts("A");
usb_msc.setReadWriteCallback(msc_read_cb, msc_write_cb, msc_flush_cb);
_puts("B");
usb_msc.setUnitReady(true); // MSC is ready for read/write
_puts("C");
if (!usb_msc.begin()) {
_puts("!usb_msc.begin()"); return false;
} else {
_puts("usb_msc.begin() OK");
}
_puts("D");
return true;
}
bool port_flash_begin() {
_puts("port_flash_begin()");
if (!SD.begin(&flash)) { // Start filesystem on the flash
_puts("!SD.begin()"); return false;
}
_puts("E");
_puts("port_flash_begin success");
return true;
}

View file

@ -23,8 +23,9 @@
#include <SPI.h>
// #include <SdFat.h> // One SD library to rule them all - Greinman SdFat from Library Manager
#include <ESP8266SdFat.h> // SdFat-version from RP2040 arduino-core
#include <SdFat.h> // One SD library to rule them all - Greinman SdFat from Library Manager
#include <Adafruit_SPIFlash.h>
#include <Adafruit_TinyUSB.h>
// =========================================================================================
// Board definitions go into the "hardware" folder, if you use a board different than the
@ -32,7 +33,7 @@
// =========================================================================================
// Raspberry Pi Pico - normal (LED = GPIO25)
#include "hardware/pico/pico_sd_spi.h"
#include "hardware/pico/pico_internalflash.h"
// Raspberry Pi Pico W(iFi) (LED = GPIO32)
// #include "hardware/pico/pico_w_sd_spi.h"
@ -80,6 +81,7 @@ void setup(void) {
pinMode(LED, OUTPUT);
digitalWrite(LED, LOW);
// =========================================================================================
// Serial Port Definition
// =========================================================================================
@ -100,6 +102,8 @@ void setup(void) {
// Serial2.setTX(20); // Pin 26
// =========================================================================================
port_init_early();
// _clrscr();
// _puts("Opening serial-port...\r\n");
Serial.begin(SERIALSPD);
@ -129,13 +133,7 @@ void setup(void) {
_puts("CP/M Emulator \e[1mv" VERSION "\e[0m by \e[1mMarcelo Dantas\e[0m\r\n");
_puts("----------------------------------------------\r\n");
_puts(" running on Raspberry Pi [\e[1m Pico \e[0m]\r\n");
// _puts(" running on Raspberry Pi [\e[1mPico-W\e[0m]\r\n");
_puts(" compiled with RP2040 [\e[1mv3.0.0\e[0m] \r\n");
_puts(" and ESP8266SdFat [\e[1mv2.1.1\e[0m] \r\n");
// _puts(" and SDFat [\e[1mv2.2.0\e[0m] \r\n");
_puts("----------------------------------------------\r\n");
_puts("Revision [\e[1m");
_puts(GL_REV);
_puts("\e[0m]\r\n");
_puts("BIOS at [\e[1m0x");
@ -166,79 +164,10 @@ void setup(void) {
_puts("CPU-Clock [\e[1m250Mhz\e[0m]\r\n");
// =========================================================================================
// SPIINIT !! ONLY !! for ESP32-Boards = #define board_esp32
// =========================================================================================
#if defined board_esp32
_puts("Initializing SPI [ ");
SPI.begin(SPIINIT);
_puts("\e[1mDone\e[0m ]\r\n");
#endif
// =========================================================================================
// Redefine SPI-Pins - if needed : (SPI.) = SPI0 / (SPI1.) = SPI1
// =========================================================================================
SPI.setRX(16); // MISO
SPI.setCS(17); // Card Select
SPI.setSCK(18); // Clock
SPI.setTX(19); // MOSI
// =========================================================================================
// Setup SD card writing settings
// Info at: https://github.com/greiman/SdFat/issues/285#issuecomment-823562829
// =========================================================================================
// older SDINIT config
#define SDINIT SS, SD_SCK_MHZ(SDMHZ)
// #define SPI_SPEED SPI_FULL_SPEED // full speed is 50Mhz - to fast for the most SDCard
// #define SPI_FULL_SPEED SD_SCK_MHZ(50) // full speed is 50Mhz - to fast for the most SDCard
// older SD_CONFIG sample
// #define SD_CONFIG SdSpiConfig(5, DEDICATED_SPI, SPI_FULL_SPEED, &SPI)
// =========================================================================================
// NEW SD_CONFIG formerly SDINIT
// =========================================================================================
#define SDFAT_FILE_TYPE 1 // Uncomment for Due, Teensy or RPi Pico
#define ENABLE_DEDICATED_SPI 1 // Dedicated SPI 1=ON 0=OFF
#define SDMHZ_TXT "19" // for outputing SDMHZ-Text
// normal is 12Mhz because of https://www.pschatzmann.ch/home/2021/03/14/rasperry-pico-with-the-sdfat-library/
#define SDMHZ 19 // setting 19 Mhz for SPI-Bus
#define SS 17
// select required SPI-Bus : (&SPI) = SPI0 / (&SPI1) = SPI1
#define SD_CONFIG SdSpiConfig(SS, DEDICATED_SPI, SD_SCK_MHZ(SDMHZ), &SPI)
// #define SD_CONFIG SdSpiConfig(SS, DEDICATED_SPI, SPI_FULL_SPEED, &SPI)
// =========================================================================================
// =========================================================================================
// SPI SD Calibrate Test
// =========================================================================================
// int CALMHZ;
// CALMHZ=50;
// #define CALMHZ 50
// #define SD_CALIBRATE SdSpiConfig(SS, DEDICATED_SPI, SD_SCK_MHZ(CALMHZ), &SPI)
// _puts("While begin...\r\n");
// while (!SD.begin(SD_CALIBRATE) && CALMHZ > 1) {
//
// Serial.printf("SD-Access failed at MHZ: %d \r\n", CALMHZ);
// CALMHZ = CALMHZ - 1;
// #define SD_CALIBRATE SdSpiConfig(SS, DEDICATED_SPI, SD_SCK_MHZ(CALMHZ), &SPI)
//
// }
// Serial.printf("DEBUG: SD-Access failed at MHZ: %d \r\n", CALMHZ);
// _puts("While end...\r\n");
_puts("Init MicroSD-Card [ \e[1m");
// old SDINIT
// if (SD.begin(SDINIT)) {
// NEW SDCONFIG = formerly SDINIT
if (SD.begin(SD_CONFIG)) {
_puts(SDMHZ_TXT);
_puts("Mhz\e[0m]\r\n");
_puts("----------------------------------------------");
_puts("Init Storage [ \e[1m");
if (port_flash_begin()) {
_puts("OK \e[0m]\r\n");
_puts("----------------------------------------------");
if (VersionCCP >= 0x10 || SD.exists(CCPname)) {
@ -273,10 +202,11 @@ if (SD.begin(SD_CONFIG)) {
_puts("Unable to load CP/M CCP.\r\nCPU halted.\r\n");
}
} else {
_puts("Unable to initialize SD card.\r\nCPU halted.\r\n");
_puts("ERR \e[0m]\r\nUnable to initialize SD card.\r\nCPU halted.\r\n");
}
}
// if loop is reached, blink LED forever to signal error
void loop(void) {
digitalWrite(LED, HIGH^LEDinv);
delay(DELAY);