24
24
#include " Adafruit_SPIFlash.h"
25
25
#include " Adafruit_TinyUSB.h"
26
26
27
+ // --------------------------------------------------------------------+
28
+ // External Flash Config
29
+ // --------------------------------------------------------------------+
30
+
27
31
// Uncomment to run example with FRAM
28
32
// #define FRAM_CS A5
29
33
// #define FRAM_SPI SPI
55
59
56
60
Adafruit_SPIFlash flash (&flashTransport);
57
61
58
- // File system object on external flash from SdFat
62
+ // External Flash File system
59
63
FatFileSystem fatfs;
60
64
61
- const int chipSelect = 10 ;
65
+ // --------------------------------------------------------------------+
66
+ // SDCard Config
67
+ // --------------------------------------------------------------------+
62
68
63
- // File system on SD Card
69
+ #if defined(ARDUINO_PYPORTAL_M4) || defined(ARDUINO_PYPORTAL_M4_TITANO)
70
+ // PyPortal has on-board card reader
71
+ #define SDCARD_CS 32
72
+ #define SDCARD_DETECT 33
73
+ #else
74
+ #define SDCARD_CS 10
75
+ // no detect
76
+ #endif
77
+
78
+ // SDCard File system
64
79
SdFat sd;
65
80
66
81
// USB Mass Storage object
67
82
Adafruit_USBD_MSC usb_msc;
68
83
69
84
// Set to true when PC write to flash
70
85
bool sd_changed = false ;
86
+ bool sd_inited = false ;
71
87
bool flash_changed = false ;
72
88
73
89
// the setup function runs once when you press reset or power the board
74
90
void setup ()
75
91
{
76
92
pinMode (LED_BUILTIN, OUTPUT);
77
93
78
- // MSC with 2 Logical Units
94
+ Serial.begin (115200 );
95
+
96
+ // MSC with 2 Logical Units: LUN0: External Flash, LUN1: SDCard
79
97
usb_msc.setMaxLun (2 );
80
98
81
99
usb_msc.setID (0 , " Adafruit" , " External Flash" , " 1.0" );
@@ -98,21 +116,43 @@ void setup()
98
116
flash_changed = true ; // to print contents initially
99
117
100
118
// ------------- Lun 1 for SD card -------------//
101
- if ( sd.begin (chipSelect, SD_SCK_MHZ (50 )) )
102
- {
103
- uint32_t block_count = sd.card ()->cardSize ();
104
- usb_msc.setCapacity (1 , block_count, 512 );
105
- usb_msc.setReadWriteCallback (1 , sdcard_read_cb, sdcard_write_cb, sdcard_flush_cb);
106
- usb_msc.setUnitReady (1 , true );
119
+ #ifdef SDCARD_DETECT
120
+ // DETECT pin is available, detect card present on the fly with test unit ready
121
+ pinMode (SDCARD_DETECT, INPUT);
122
+ usb_msc.setReadyCallback (1 , sdcard_ready_callback);
123
+ #else
124
+ // no DETECT pin, card must be inserted when powered on
125
+ init_sdcard ();
126
+ sd_inited = true ;
127
+ usb_msc.setUnitReady (1 , true );
128
+ #endif
129
+
130
+ // while ( !Serial ) delay(10); // wait for native usb
131
+ Serial.println (" Adafruit TinyUSB Mass Storage External Flash + SD Card example" );
132
+ delay (1000 );
133
+ }
134
+
135
+ bool init_sdcard (void )
136
+ {
137
+ Serial.print (" Init SDCard ... " );
107
138
108
- sd_changed = true ; // to print contents initially
139
+ if ( !sd.begin (SDCARD_CS, SD_SCK_MHZ (50 )) )
140
+ {
141
+ Serial.print (" Failed" );
142
+ return false ;
109
143
}
110
144
111
- Serial.begin (115200 );
112
- // while ( !Serial ) delay(10); // wait for native usb
145
+ uint32_t block_count = sd.card ()->cardSize ();
146
+ usb_msc.setCapacity (1 , block_count, 512 );
147
+ usb_msc.setReadWriteCallback (1 , sdcard_read_cb, sdcard_write_cb, sdcard_flush_cb);
113
148
114
- Serial.println (" Adafruit TinyUSB Mass Storage External Flash + SD Card example" );
115
- delay (1000 );
149
+ sd_changed = true ; // to print contents initially
150
+
151
+ Serial.print (" OK, Card size = " );
152
+ Serial.print (block_count * 512 / (1024 *1024 ));
153
+ Serial.println (" MB" );
154
+
155
+ return true ;
116
156
}
117
157
118
158
void print_rootdir (File* rdir)
@@ -204,6 +244,31 @@ void sdcard_flush_cb (void)
204
244
digitalWrite (LED_BUILTIN, LOW);
205
245
}
206
246
247
+ #ifdef SDCARD_DETECT
248
+ // Invoked when received Test Unit Ready command.
249
+ // return true allowing host to read/write this LUN e.g SD card inserted
250
+ bool sdcard_ready_callback (void )
251
+ {
252
+ // Card is inserted
253
+ if ( digitalRead (SDCARD_DETECT) == HIGH )
254
+ {
255
+ // init SD card if not already
256
+ if ( !sd_inited )
257
+ {
258
+ sd_inited = init_sdcard ();
259
+ }
260
+ }else
261
+ {
262
+ sd_inited = false ;
263
+ usb_msc.setReadWriteCallback (1 , NULL , NULL , NULL );
264
+ }
265
+
266
+ Serial.println (sd_inited);
267
+
268
+ return sd_inited;
269
+ }
270
+ #endif
271
+
207
272
// --------------------------------------------------------------------+
208
273
// External Flash callbacks
209
274
// --------------------------------------------------------------------+
0 commit comments