earlephilhower / arduino-pico

Raspberry Pi Pico Arduino core, for all RP2040 and RP2350 boards
GNU Lesser General Public License v2.1
2.03k stars 422 forks source link

SD library compilation errors #1398

Closed obdevel closed 1 year ago

obdevel commented 1 year ago

I'm getting compilation errors when trying to use the SD library. The SD card reader is on the back of a TFT LCD display which is already working fine using the TFT_eSPI library.

Latest core version 3.1.1 Arduino IDE 1.8.19 macOS 12.3.1 Pico W

I've created a minimal test sketch based on the example given in a recent discussion (https://github.com/earlephilhower/arduino-pico/discussions/925):

#include <SPI.h>
#include <SD.h>

#define SPI1_MOSI 11
#define SPI1_MISO 8
#define SPI1_SCK 10
#define SD_CS 0

void setup() {

  Serial.begin(115200);
  while (!(Serial));

  Serial.printf("\n\n> SD card test\n\n");

  sd_card_test();

  Serial.printf("\n> setup complete\n");
}

void loop() {

}

bool sd_card_test(void) {

  bool card_present, ret = true;
  char data_buffer[1024];
  size_t bytes_read;
  File f;

  SPI1.setTX(SPI1_MOSI);
  SPI1.setRX(SPI1_MISO);
  SPI1.setSCK(SPI1_SCK);
  SPI1.setCS(SD_CS);

  card_present = SD.begin(SD_CS, SPI1);

  if (card_present) {
    Serial.printf("> SD card is present\n");

    f = SD.open("config.txt", "r");

    if (!f) {
      Serial.printf("> ** error opening config file\n");
      ret = false;
    }

    bytes_read = f.readBytes(data_buffer, sizeof(data_buffer));
    Serial.printf("> ** read %u bytes from config file\n", bytes_read);

    if (bytes_read == 0) {
      ret = false;
    }

    f.close();

  } else {
    Serial.printf("> ** SD card is not present\n");
    ret = false;
  }

  SD.end();
  return ret;
}
Compiling library "SD"
/Users/xxx/Library/Arduino15/packages/rp2040/tools/pqt-gcc/1.5.0-b-c7bab52/bin/arm-none-eabi-g++ -I /var/folders/03/s3pv8qk91w78m4_st_nbxl5m0000gn/T/arduino_build_129695/core -c -Wall -Wextra -Werror=return-type -Wno-ignored-qualifiers -DCFG_TUSB_MCU=OPT_MCU_RP2040 -DUSBD_PID=0xf00a -DUSBD_VID=0x2e8a -DUSBD_MAX_POWER_MA=250 "-DUSB_MANUFACTURER=\"Raspberry Pi\"" "-DUSB_PRODUCT=\"Pico W\"" -DPICO_CYW43_ARCH_THREADSAFE_BACKGROUND=1 -DCYW43_LWIP=1 -DLWIP_IPV6=0 -DLWIP_IPV4=1 -DLWIP_IGMP=1 -DLWIP_CHECKSUM_CTRL_PER_NETIF=1 "-DARDUINO_VARIANT=\"rpipicow\"" -DTARGET_RP2040 -march=armv6-m -mcpu=cortex-m0plus -mthumb -ffunction-sections -fdata-sections -fno-exceptions -DARM_MATH_CM0_FAMILY -DARM_MATH_CM0_PLUS -MMD -iprefix/Users/xxx/Library/Arduino15/packages/rp2040/hardware/rp2040/3.1.1/ @/Users/xxx/Library/Arduino15/packages/rp2040/hardware/rp2040/3.1.1/lib/platform_inc.txt -I/Users/xxx/Library/Arduino15/packages/rp2040/hardware/rp2040/3.1.1/include -fno-rtti -std=gnu++17 -g -pipe -DF_CPU=133000000L -DARDUINO=10819 -DARDUINO_RASPBERRY_PI_PICO_W "-DBOARD_NAME=\"RASPBERRY_PI_PICO_W\"" -DARDUINO_ARCH_RP2040 -Os -DWIFICC=CYW43_COUNTRY_WORLDWIDE -I/Users/xxx/Library/Arduino15/packages/rp2040/hardware/rp2040/3.1.1/cores/rp2040 -I/Users/xxx/Library/Arduino15/packages/rp2040/hardware/rp2040/3.1.1/variants/rpipicow -I/Users/xxx/Library/Arduino15/packages/rp2040/hardware/rp2040/3.1.1/libraries/SPI/src -I/Users/xxx/Library/Arduino15/packages/rp2040/hardware/rp2040/3.1.1/libraries/SD/src -I/Users/xxx/Library/Arduino15/packages/rp2040/hardware/rp2040/3.1.1/libraries/SDFS/src -I/Users/xxx/Documents/Arduino/libraries/SdFat/src /Users/xxx/Library/Arduino15/packages/rp2040/hardware/rp2040/3.1.1/libraries/SD/src/SD.cpp -o /var/folders/03/s3pv8qk91w78m4_st_nbxl5m0000gn/T/arduino_build_129695/libraries/SD/SD.cpp.o
In file included from /Users/xxx/Library/Arduino15/packages/rp2040/hardware/rp2040/3.1.1/libraries/SDFS/src/SDFS.h:35,
                 from /Users/xxx/Library/Arduino15/packages/rp2040/hardware/rp2040/3.1.1/libraries/SD/src/SD.h:24,
                 from /Users/xxx/Library/Arduino15/packages/rp2040/hardware/rp2040/3.1.1/libraries/SD/src/SD.cpp:1:
/Users/xxx/Documents/Arduino/libraries/SdFat/src/SdFat.h:448:2: warning: #warning File not defined because __has_include(FS.h) [-Wcpp]
  448 | #warning File not defined because __has_include(FS.h)
      |  ^~~~~~~
/Users/xxx/Library/Arduino15/packages/rp2040/tools/pqt-gcc/1.5.0-b-c7bab52/bin/arm-none-eabi-ar rcs /var/folders/03/s3pv8qk91w78m4_st_nbxl5m0000gn/T/arduino_build_129695/libraries/SD/SD.a /var/folders/03/s3pv8qk91w78m4_st_nbxl5m0000gn/T/arduino_build_129695/libraries/SD/SD.cpp.o
Compiling library "SDFS"
/Users/xxx/Library/Arduino15/packages/rp2040/tools/pqt-gcc/1.5.0-b-c7bab52/bin/arm-none-eabi-g++ -I /var/folders/03/s3pv8qk91w78m4_st_nbxl5m0000gn/T/arduino_build_129695/core -c -Wall -Wextra -Werror=return-type -Wno-ignored-qualifiers -DCFG_TUSB_MCU=OPT_MCU_RP2040 -DUSBD_PID=0xf00a -DUSBD_VID=0x2e8a -DUSBD_MAX_POWER_MA=250 "-DUSB_MANUFACTURER=\"Raspberry Pi\"" "-DUSB_PRODUCT=\"Pico W\"" -DPICO_CYW43_ARCH_THREADSAFE_BACKGROUND=1 -DCYW43_LWIP=1 -DLWIP_IPV6=0 -DLWIP_IPV4=1 -DLWIP_IGMP=1 -DLWIP_CHECKSUM_CTRL_PER_NETIF=1 "-DARDUINO_VARIANT=\"rpipicow\"" -DTARGET_RP2040 -march=armv6-m -mcpu=cortex-m0plus -mthumb -ffunction-sections -fdata-sections -fno-exceptions -DARM_MATH_CM0_FAMILY -DARM_MATH_CM0_PLUS -MMD -iprefix/Users/xxx/Library/Arduino15/packages/rp2040/hardware/rp2040/3.1.1/ @/Users/xxx/Library/Arduino15/packages/rp2040/hardware/rp2040/3.1.1/lib/platform_inc.txt -I/Users/xxx/Library/Arduino15/packages/rp2040/hardware/rp2040/3.1.1/include -fno-rtti -std=gnu++17 -g -pipe -DF_CPU=133000000L -DARDUINO=10819 -DARDUINO_RASPBERRY_PI_PICO_W "-DBOARD_NAME=\"RASPBERRY_PI_PICO_W\"" -DARDUINO_ARCH_RP2040 -Os -DWIFICC=CYW43_COUNTRY_WORLDWIDE -I/Users/xxx/Library/Arduino15/packages/rp2040/hardware/rp2040/3.1.1/cores/rp2040 -I/Users/xxx/Library/Arduino15/packages/rp2040/hardware/rp2040/3.1.1/variants/rpipicow -I/Users/xxx/Library/Arduino15/packages/rp2040/hardware/rp2040/3.1.1/libraries/SPI/src -I/Users/xxx/Library/Arduino15/packages/rp2040/hardware/rp2040/3.1.1/libraries/SD/src -I/Users/xxx/Library/Arduino15/packages/rp2040/hardware/rp2040/3.1.1/libraries/SDFS/src -I/Users/xxx/Documents/Arduino/libraries/SdFat/src /Users/xxx/Library/Arduino15/packages/rp2040/hardware/rp2040/3.1.1/libraries/SDFS/src/SDFS.cpp -o /var/folders/03/s3pv8qk91w78m4_st_nbxl5m0000gn/T/arduino_build_129695/libraries/SDFS/SDFS.cpp.o
In file included from /Users/xxx/Library/Arduino15/packages/rp2040/hardware/rp2040/3.1.1/libraries/SDFS/src/SDFS.h:35,
                 from /Users/xxx/Library/Arduino15/packages/rp2040/hardware/rp2040/3.1.1/libraries/SDFS/src/SDFS.cpp:27:
/Users/xxx/Documents/Arduino/libraries/SdFat/src/SdFat.h:448:2: warning: #warning File not defined because __has_include(FS.h) [-Wcpp]
  448 | #warning File not defined because __has_include(FS.h)
      |  ^~~~~~~
/Users/xxx/Library/Arduino15/packages/rp2040/hardware/rp2040/3.1.1/libraries/SDFS/src/SDFS.cpp: In member function 'virtual fs::FileImplPtr sdfs::SDFSImpl::open(const char*, fs::OpenMode, fs::AccessMode)':
/Users/xxx/Library/Arduino15/packages/rp2040/hardware/rp2040/3.1.1/libraries/SDFS/src/SDFS.cpp:66:25: error: conversion from 'FsFile' to non-scalar type 'File32' requested
   66 |     File32 fd = _fs.open(path, flags);
      |                 ~~~~~~~~^~~~~~~~~~~~~
/Users/xxx/Library/Arduino15/packages/rp2040/hardware/rp2040/3.1.1/libraries/SDFS/src/SDFS.cpp: In member function 'virtual fs::DirImplPtr sdfs::SDFSImpl::openDir(const char*)':
/Users/xxx/Library/Arduino15/packages/rp2040/hardware/rp2040/3.1.1/libraries/SDFS/src/SDFS.cpp:95:41: error: no match for 'operator=' (operand types are 'File32' and 'FsFile')
   95 |         dirFile = _fs.open("/", O_RDONLY);
      |                                         ^
In file included from /Users/xxx/Documents/Arduino/libraries/SdFat/src/FatLib/FatVolume.h:27,
                 from /Users/xxx/Documents/Arduino/libraries/SdFat/src/FatLib/FatLib.h:28,
                 from /Users/xxx/Documents/Arduino/libraries/SdFat/src/SdFat.h:32,
                 from /Users/xxx/Library/Arduino15/packages/rp2040/hardware/rp2040/3.1.1/libraries/SDFS/src/SDFS.h:35,
                 from /Users/xxx/Library/Arduino15/packages/rp2040/hardware/rp2040/3.1.1/libraries/SDFS/src/SDFS.cpp:27:
/Users/xxx/Documents/Arduino/libraries/SdFat/src/FatLib/FatFile.h:1023:7: note: candidate: 'constexpr File32& File32::operator=(const File32&)'
 1023 | class File32 : public StreamFile<FatFile, uint32_t> {
      |       ^~~~~~
/Users/xxx/Documents/Arduino/libraries/SdFat/src/FatLib/FatFile.h:1023:7: note:   no known conversion for argument 1 from 'FsFile' to 'const File32&'
/Users/xxx/Documents/Arduino/libraries/SdFat/src/FatLib/FatFile.h:1023:7: note: candidate: 'constexpr File32& File32::operator=(File32&&)'
/Users/xxx/Documents/Arduino/libraries/SdFat/src/FatLib/FatFile.h:1023:7: note:   no known conversion for argument 1 from 'FsFile' to 'File32&&'
/Users/xxx/Library/Arduino15/packages/rp2040/hardware/rp2040/3.1.1/libraries/SDFS/src/SDFS.cpp:98:45: error: no match for 'operator=' (operand types are 'File32' and 'FsFile')
   98 |         dirFile = _fs.open(pathStr, O_RDONLY);
      |                                             ^
In file included from /Users/xxx/Documents/Arduino/libraries/SdFat/src/FatLib/FatVolume.h:27,
                 from /Users/xxx/Documents/Arduino/libraries/SdFat/src/FatLib/FatLib.h:28,
                 from /Users/xxx/Documents/Arduino/libraries/SdFat/src/SdFat.h:32,
                 from /Users/xxx/Library/Arduino15/packages/rp2040/hardware/rp2040/3.1.1/libraries/SDFS/src/SDFS.h:35,
                 from /Users/xxx/Library/Arduino15/packages/rp2040/hardware/rp2040/3.1.1/libraries/SDFS/src/SDFS.cpp:27:
/Users/xxx/Documents/Arduino/libraries/SdFat/src/FatLib/FatFile.h:1023:7: note: candidate: 'constexpr File32& File32::operator=(const File32&)'
 1023 | class File32 : public StreamFile<FatFile, uint32_t> {
      |       ^~~~~~
/Users/xxx/Documents/Arduino/libraries/SdFat/src/FatLib/FatFile.h:1023:7: note:   no known conversion for argument 1 from 'FsFile' to 'const File32&'
/Users/xxx/Documents/Arduino/libraries/SdFat/src/FatLib/FatFile.h:1023:7: note: candidate: 'constexpr File32& File32::operator=(File32&&)'
/Users/xxx/Documents/Arduino/libraries/SdFat/src/FatLib/FatFile.h:1023:7: note:   no known conversion for argument 1 from 'FsFile' to 'File32&&'
/Users/xxx/Library/Arduino15/packages/rp2040/hardware/rp2040/3.1.1/libraries/SDFS/src/SDFS.cpp:108:49: error: no match for 'operator=' (operand types are 'File32' and 'FsFile')
  108 |                 dirFile = _fs.open("/", O_RDONLY);
      |                                                 ^
In file included from /Users/xxx/Documents/Arduino/libraries/SdFat/src/FatLib/FatVolume.h:27,
                 from /Users/xxx/Documents/Arduino/libraries/SdFat/src/FatLib/FatLib.h:28,
                 from /Users/xxx/Documents/Arduino/libraries/SdFat/src/SdFat.h:32,
                 from /Users/xxx/Library/Arduino15/packages/rp2040/hardware/rp2040/3.1.1/libraries/SDFS/src/SDFS.h:35,
                 from /Users/xxx/Library/Arduino15/packages/rp2040/hardware/rp2040/3.1.1/libraries/SDFS/src/SDFS.cpp:27:
/Users/xxx/Documents/Arduino/libraries/SdFat/src/FatLib/FatFile.h:1023:7: note: candidate: 'constexpr File32& File32::operator=(const File32&)'
 1023 | class File32 : public StreamFile<FatFile, uint32_t> {
      |       ^~~~~~
/Users/xxx/Documents/Arduino/libraries/SdFat/src/FatLib/FatFile.h:1023:7: note:   no known conversion for argument 1 from 'FsFile' to 'const File32&'
/Users/xxx/Documents/Arduino/libraries/SdFat/src/FatLib/FatFile.h:1023:7: note: candidate: 'constexpr File32& File32::operator=(File32&&)'
/Users/xxx/Documents/Arduino/libraries/SdFat/src/FatLib/FatFile.h:1023:7: note:   no known conversion for argument 1 from 'FsFile' to 'File32&&'
/Users/xxx/Library/Arduino15/packages/rp2040/hardware/rp2040/3.1.1/libraries/SDFS/src/SDFS.cpp:113:53: error: no match for 'operator=' (operand types are 'File32' and 'FsFile')
  113 |                 dirFile = _fs.open(pathStr, O_RDONLY);
      |                                                     ^
In file included from /Users/xxx/Documents/Arduino/libraries/SdFat/src/FatLib/FatVolume.h:27,
                 from /Users/xxx/Documents/Arduino/libraries/SdFat/src/FatLib/FatLib.h:28,
                 from /Users/xxx/Documents/Arduino/libraries/SdFat/src/SdFat.h:32,
                 from /Users/xxx/Library/Arduino15/packages/rp2040/hardware/rp2040/3.1.1/libraries/SDFS/src/SDFS.h:35,
                 from /Users/xxx/Library/Arduino15/packages/rp2040/hardware/rp2040/3.1.1/libraries/SDFS/src/SDFS.cpp:27:
/Users/xxx/Documents/Arduino/libraries/SdFat/src/FatLib/FatFile.h:1023:7: note: candidate: 'constexpr File32& File32::operator=(const File32&)'
 1023 | class File32 : public StreamFile<FatFile, uint32_t> {
      |       ^~~~~~
/Users/xxx/Documents/Arduino/libraries/SdFat/src/FatLib/FatFile.h:1023:7: note:   no known conversion for argument 1 from 'FsFile' to 'const File32&'
/Users/xxx/Documents/Arduino/libraries/SdFat/src/FatLib/FatFile.h:1023:7: note: candidate: 'constexpr File32& File32::operator=(File32&&)'
/Users/xxx/Documents/Arduino/libraries/SdFat/src/FatLib/FatFile.h:1023:7: note:   no known conversion for argument 1 from 'FsFile' to 'File32&&'
/Users/xxx/Library/Arduino15/packages/rp2040/hardware/rp2040/3.1.1/libraries/SDFS/src/SDFS.cpp:123:45: error: no match for 'operator=' (operand types are 'File32' and 'FsFile')
  123 |             dirFile = _fs.open("/", O_RDONLY);
      |                                             ^
In file included from /Users/xxx/Documents/Arduino/libraries/SdFat/src/FatLib/FatVolume.h:27,
                 from /Users/xxx/Documents/Arduino/libraries/SdFat/src/FatLib/FatLib.h:28,
                 from /Users/xxx/Documents/Arduino/libraries/SdFat/src/SdFat.h:32,
                 from /Users/xxx/Library/Arduino15/packages/rp2040/hardware/rp2040/3.1.1/libraries/SDFS/src/SDFS.h:35,
                 from /Users/xxx/Library/Arduino15/packages/rp2040/hardware/rp2040/3.1.1/libraries/SDFS/src/SDFS.cpp:27:
/Users/xxx/Documents/Arduino/libraries/SdFat/src/FatLib/FatFile.h:1023:7: note: candidate: 'constexpr File32& File32::operator=(const File32&)'
 1023 | class File32 : public StreamFile<FatFile, uint32_t> {
      |       ^~~~~~
/Users/xxx/Documents/Arduino/libraries/SdFat/src/FatLib/FatFile.h:1023:7: note:   no known conversion for argument 1 from 'FsFile' to 'const File32&'
/Users/xxx/Documents/Arduino/libraries/SdFat/src/FatLib/FatFile.h:1023:7: note: candidate: 'constexpr File32& File32::operator=(File32&&)'
/Users/xxx/Documents/Arduino/libraries/SdFat/src/FatLib/FatFile.h:1023:7: note:   no known conversion for argument 1 from 'FsFile' to 'File32&&'
/Users/xxx/Library/Arduino15/packages/rp2040/hardware/rp2040/3.1.1/libraries/SDFS/src/SDFS.cpp:128:49: error: no match for 'operator=' (operand types are 'File32' and 'FsFile')
  128 |             dirFile = _fs.open(pathStr, O_RDONLY);
      |                                                 ^
In file included from /Users/xxx/Documents/Arduino/libraries/SdFat/src/FatLib/FatVolume.h:27,
                 from /Users/xxx/Documents/Arduino/libraries/SdFat/src/FatLib/FatLib.h:28,
                 from /Users/xxx/Documents/Arduino/libraries/SdFat/src/SdFat.h:32,
                 from /Users/xxx/Library/Arduino15/packages/rp2040/hardware/rp2040/3.1.1/libraries/SDFS/src/SDFS.h:35,
                 from /Users/xxx/Library/Arduino15/packages/rp2040/hardware/rp2040/3.1.1/libraries/SDFS/src/SDFS.cpp:27:
/Users/xxx/Documents/Arduino/libraries/SdFat/src/FatLib/FatFile.h:1023:7: note: candidate: 'constexpr File32& File32::operator=(const File32&)'
 1023 | class File32 : public StreamFile<FatFile, uint32_t> {
      |       ^~~~~~
/Users/xxx/Documents/Arduino/libraries/SdFat/src/FatLib/FatFile.h:1023:7: note:   no known conversion for argument 1 from 'FsFile' to 'const File32&'
/Users/xxx/Documents/Arduino/libraries/SdFat/src/FatLib/FatFile.h:1023:7: note: candidate: 'constexpr File32& File32::operator=(File32&&)'
/Users/xxx/Documents/Arduino/libraries/SdFat/src/FatLib/FatFile.h:1023:7: note:   no known conversion for argument 1 from 'FsFile' to 'File32&&'
Multiple libraries were found for "SD.h"
 Used: /Users/xxx/Library/Arduino15/packages/rp2040/hardware/rp2040/3.1.1/libraries/SD
 Not used: /Applications/Arduino.app/Contents/Java/libraries/SD
Multiple libraries were found for "SdFat.h"
 Used: /Users/xxx/Documents/Arduino/libraries/SdFat
 Not used: /Users/xxx/Library/Arduino15/packages/rp2040/hardware/rp2040/3.1.1/libraries/ESP8266SdFat
Using library SPI at version 1.0 in folder: /Users/xxx/Library/Arduino15/packages/rp2040/hardware/rp2040/3.1.1/libraries/SPI 
Using library SD at version 2.0.0 in folder: /Users/xxx/Library/Arduino15/packages/rp2040/hardware/rp2040/3.1.1/libraries/SD 
Using library SDFS at version 0.1.0 in folder: /Users/xxx/Library/Arduino15/packages/rp2040/hardware/rp2040/3.1.1/libraries/SDFS 
Using library SdFat at version 2.2.2 in folder: /Users/xxx/Documents/Arduino/libraries/SdFat 
exit status 1
Error compiling for board Raspberry Pi Pico W.
earlephilhower commented 1 year ago

You're trying to use the upstream SDFAT, not the one included with this core. Remove that other copy and you should be good.

obdevel commented 1 year ago

Thanks, that fixed it. I just need to remember to put the other one back when working with AVRs !