Adafruit_CPFS/Adafruit_CPFS.h
Liz c0b49b9146 update sdfat include in header
this fixes a compilation error that otherwise occurs with the philhower rp2040 bsp since there is a conflict with the internal sdfat library and the adafruit fork sdfat library
2025-06-03 18:12:15 -04:00

118 lines
4.9 KiB
C++

// SPDX-FileCopyrightText: 2023 P Burgess for Adafruit Industries
//
// SPDX-License-Identifier: MIT
/*!
* @file Adafruit_CPFS.h
*
* This is a barebones library to:
*
* - Make a CircuitPython-capable board's flash filesystem accessible to
* Arduino code.
* - Make this same drive accessible to a host computer over USB.
*
* This is an "80/20" library to cover the most common use case, with least
* code and documentation, for non-technical users: if a board supports
* CircuitPython, then Arduino code and a host computer can both access that
* drive. Flash formatting is done by installing CircuitPython once
* (pre-built for just about everything), no special steps. That's it.
* NOT for SD cards, special flash partitioning, etc. Those can always be
* implemented manually using the Adafruit_TinyUSB library, but this is
* not the code for it. Keeping it really simple.
*
* Adafruit invests time and resources providing this open source code,
* please support Adafruit and open-source hardware by purchasing
* products from Adafruit!
*
* Written by Phil "Paint Your Dragon" Burgess for Adafruit Industries.
*
* MIT license, all text here must be included in any redistribution.
*
*/
#pragma once
#if defined(USE_TINYUSB) || defined(ESP32)
#include <SdFat_Adafruit_Fork.h>
/*!
@brief Adafruit_CPFS is a minimal class to assist in using a board's
CIRCUITPY flash filesystem with Arduino code, and making it
available to a host computer over USB.
All functions here are currently static -- you do not need to
declare an object (unless you want to). Since there's only one
CIRCUITPY filesystem, library state is maintained internally
and any of these functions can be called directly,
e.g. Adafruit_CPFS::begin(). Putting the functions inside a
class simply avoids namespace issues.
*/
class Adafruit_CPFS {
public:
/*!
@brief Adafruit_CPFS constructor. No arguments. User code is not
required to declare an object (all functions are static and can
be invoked directly without an object), but it's still an option
if the resulting code reads easier for you (e.g. using
object.func() rather than class::func() syntax), all good.
*/
Adafruit_CPFS(void){};
/*!
@brief Adafruit_CPFS destructor.
*/
~Adafruit_CPFS(void){};
/*!
@brief Access a board's CIRCUITPY flash filesystem, making it
available to code and to a host computer over USB.
IMPORTANT: this function should always be called BEFORE
Serial.begin().
@param msc OPTIONAL Enable mass storage connection to host computer
over USB (if connected at boot time). Default is
true. If set false, flash filesystem can be read
by user code, but is not accessible on host.
@param cs OPTIONAL SPI flash chip-select pin. This should ONLY be
used on "Haxpress" boards (QT Py or Trinket M0
with flash chip retrofitted). For most boards,
including unmodified QT Py or Trinket M0, do not
pass any arguments.
@param spi OPTIONAL Pointer to SPI peripheral interfaced with flash
chip. Again, only for a couple of Haxpress M0
boards.
@param idle OPTIONAL Relevant to RP2040 devices only. Selects whether
second core should be paused when writing/erasing
flash. Default is true, and should ONLY be changed
in super esoteric cases that require special
linker setup. Failure to handle this correctly
will cause crash and flash corruption.
@return FatVolume* On success, a non-NULL pointer to a FatVolume
object, where files can then be opened and accessed.
NULL on error (uninitialized CIRCUITPY drive, or
invalid cs/spi combo)..
*/
static FatVolume *begin(bool msc = true, int cs = -1, void *spi = NULL,
bool idle = true);
/*!
@brief Checks if USB-connected host computer has made any changes
(new or altered files) to the drive. Code can use this if it
needs to auto-restart on change.
@return 1/true if host computer has written to drive, 0/false otherwise.
*/
static bool changed(void);
/*!
@brief Acknowledge and reset status of changed() polling. Change-
sensitive code can call this to distinguish subsequent
changed() calls.
*/
static void change_ack(void);
};
#else
#error "Requires TinyUSB stack. From the Arduino IDE 'Tools' menu,"
#error "select 'USB Stack -> Adafruit TinyUSB' and recompile."
#endif // end USE_TINYUSB || ESP32