Skip to content

Commit 1f05119

Browse files
authored
Merge pull request #152 from adafruit/msc-unit-ready
set sense code to NOT READY (medium not found) when unit is not ready
2 parents b090d0c + 44b0910 commit 1f05119

File tree

2 files changed

+40
-3
lines changed

2 files changed

+40
-3
lines changed

examples/MassStorage/msc_ramdisk/msc_ramdisk.ino

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,22 @@
1818

1919
Adafruit_USBD_MSC usb_msc;
2020

21+
// Eject button to demonstrate medium is not ready e.g SDCard is not present
22+
// whenever this button is pressed and hold, it will report to host as not ready
23+
#if defined(ARDUINO_SAMD_CIRCUITPLAYGROUND_EXPRESS) || defined(ARDUINO_NRF52840_CIRCUITPLAY)
24+
#define BTN_EJECT 4 // Left Button
25+
bool activeState = true;
26+
27+
#elif defined(ARDUINO_FUNHOUSE_ESP32S2)
28+
#define BTN_EJECT BUTTON_DOWN
29+
bool activeState = true;
30+
31+
#elif defined PIN_BUTTON1
32+
#define BTN_EJECT PIN_BUTTON1
33+
bool activeState = false;
34+
#endif
35+
36+
2137
// the setup function runs once when you press reset or power the board
2238
void setup()
2339
{
@@ -39,6 +55,11 @@ void setup()
3955
// Set Lun ready (RAM disk is always ready)
4056
usb_msc.setUnitReady(true);
4157

58+
#ifdef BTN_EJECT
59+
pinMode(BTN_EJECT, activeState ? INPUT_PULLDOWN : INPUT_PULLUP);
60+
usb_msc.setReadyCallback(msc_ready_callback);
61+
#endif
62+
4263
usb_msc.begin();
4364

4465
Serial.begin(115200);
@@ -50,8 +71,6 @@ void setup()
5071
void loop()
5172
{
5273
// nothing to do
53-
Serial.println("Adafruit TinyUSB Mass Storage RAM Disk example");
54-
delay(1000);
5574
}
5675

5776
// Callback invoked when received READ10 command.
@@ -82,3 +101,14 @@ void msc_flush_callback (void)
82101
{
83102
// nothing to do
84103
}
104+
105+
106+
#ifdef BTN_EJECT
107+
// Invoked when received Test Unit Ready command.
108+
// return true allowing host to read/write this LUN e.g SD card inserted
109+
bool msc_ready_callback(void)
110+
{
111+
// button not active --> medium ready
112+
return digitalRead(BTN_EJECT) != activeState;
113+
}
114+
#endif

src/arduino/msc/Adafruit_USBD_MSC.cpp

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,14 @@ bool tud_msc_test_unit_ready_cb(uint8_t lun) {
173173
_msc_dev->_lun_info[lun].unit_ready = _msc_dev->_lun_info[lun].ready_cb();
174174
}
175175

176-
return _msc_dev->_lun_info[lun].unit_ready;
176+
bool const ret = _msc_dev->_lun_info[lun].unit_ready;
177+
178+
if (!ret) {
179+
// Addition Sense: 3A-00 is NOT FOUND
180+
tud_msc_set_sense(lun, SCSI_SENSE_NOT_READY, 0x3a, 0x00);
181+
}
182+
183+
return ret;
177184
}
178185

179186
// Callback invoked to determine disk's size

0 commit comments

Comments
 (0)