now works on pico (W) with internal storage only
This commit is contained in:
parent
5b95956eac
commit
32ec9fae84
3 changed files with 108 additions and 83 deletions
|
|
@ -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)
|
||||
|
|
|
|||
91
hardware/pico/pico_internalflash.h
Normal file
91
hardware/pico/pico_internalflash.h
Normal 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;
|
||||
}
|
||||
|
||||
|
|
@ -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,78 +164,9 @@ 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("Init Storage [ \e[1m");
|
||||
if (port_flash_begin()) {
|
||||
_puts("OK \e[0m]\r\n");
|
||||
_puts("----------------------------------------------");
|
||||
|
||||
|
||||
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Reference in a new issue