Skip to content

Commit 681d4ef

Browse files
authored
Merge pull request #147 from adafruit/msc-writable-callback
Msc writable callback
2 parents 466c6a2 + d977715 commit 681d4ef

File tree

7 files changed

+28
-18
lines changed

7 files changed

+28
-18
lines changed

examples/MassStorage/msc_external_flash/msc_external_flash.ino

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@
1717
* Note: Adafruit fork of SdFat enabled ENABLE_EXTENDED_TRANSFER_CLASS and FAT12_SUPPORT
1818
* in SdFatConfig.h, which is needed to run SdFat on external flash. You can use original
1919
* SdFat library and manually change those macros
20+
*
21+
* Note2: If your flash is not formatted as FAT12 previously, you could format it using
22+
* follow sketch https://github.com/adafruit/Adafruit_SPIFlash/tree/master/examples/SdFat_format
2023
*/
2124

2225
#include "SPI.h"
@@ -143,7 +146,7 @@ void loop()
143146
// return number of copied bytes (must be multiple of block size)
144147
int32_t msc_read_cb (uint32_t lba, void* buffer, uint32_t bufsize)
145148
{
146-
// Note: SPIFLash Bock API: readBlocks/writeBlocks/syncBlocks
149+
// Note: SPIFLash Block API: readBlocks/writeBlocks/syncBlocks
147150
// already include 4K sector caching internally. We don't need to cache it, yahhhh!!
148151
return flash.readBlocks(lba, (uint8_t*) buffer, bufsize/512) ? bufsize : -1;
149152
}
@@ -155,7 +158,7 @@ int32_t msc_write_cb (uint32_t lba, uint8_t* buffer, uint32_t bufsize)
155158
{
156159
digitalWrite(LED_BUILTIN, HIGH);
157160

158-
// Note: SPIFLash Bock API: readBlocks/writeBlocks/syncBlocks
161+
// Note: SPIFLash Block API: readBlocks/writeBlocks/syncBlocks
159162
// already include 4K sector caching internally. We don't need to cache it, yahhhh!!
160163
return flash.writeBlocks(lba, buffer, bufsize/512) ? bufsize : -1;
161164
}

examples/MassStorage/msc_sdfat/.funhouse.test.skip

Whitespace-only changes.

examples/MassStorage/msc_sdfat/.magtag.test.skip

Whitespace-only changes.

examples/MassStorage/msc_sdfat/.metroesp32s2.test.skip

Whitespace-only changes.

src/arduino/msc/Adafruit_USBD_MSC.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,11 @@ void Adafruit_USBD_MSC::setReadyCallback(uint8_t lun, ready_callback_t cb) {
112112
_lun_info[lun].ready_cb = cb;
113113
}
114114

115+
void Adafruit_USBD_MSC::setWritableCallback(uint8_t lun,
116+
writable_callback_t cb) {
117+
_lun_info[lun].writable_cb = cb;
118+
}
119+
115120
bool Adafruit_USBD_MSC::begin(void) {
116121
if (!TinyUSBDevice.addInterface(*this)) {
117122
return false;
@@ -256,6 +261,16 @@ void tud_msc_write10_complete_cb(uint8_t lun) {
256261
return _msc_dev->_lun_info[lun].fl_cb();
257262
}
258263

264+
// Invoked to check if device is writable as part of SCSI WRITE10
265+
// Default mode is writable
266+
bool tud_msc_is_writable_cb(uint8_t lun) {
267+
if (!(_msc_dev && _msc_dev->_lun_info[lun].writable_cb)) {
268+
return true;
269+
}
270+
271+
return _msc_dev->_lun_info[lun].writable_cb();
272+
}
273+
259274
} // extern "C"
260275

261276
#endif // TUSB_OPT_DEVICE_ENABLED

src/arduino/msc/Adafruit_USBD_MSC.h

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ class Adafruit_USBD_MSC : public Adafruit_USBD_Interface {
3535
uint32_t bufsize);
3636
typedef void (*flush_callback_t)(void);
3737
typedef bool (*ready_callback_t)(void);
38+
typedef bool (*writable_callback_t)(void);
3839

3940
Adafruit_USBD_MSC(void);
4041

@@ -51,6 +52,7 @@ class Adafruit_USBD_MSC : public Adafruit_USBD_Interface {
5152
void setReadWriteCallback(uint8_t lun, read_callback_t rd_cb,
5253
write_callback_t wr_cb, flush_callback_t fl_cb);
5354
void setReadyCallback(uint8_t lun, ready_callback_t cb);
55+
void setWritableCallback(uint8_t lun, writable_callback_t cb);
5456

5557
//------------- Single LUN API -------------//
5658
void setID(const char *vendor_id, const char *product_id,
@@ -70,18 +72,22 @@ class Adafruit_USBD_MSC : public Adafruit_USBD_Interface {
7072
}
7173

7274
void setReadyCallback(ready_callback_t cb) { setReadyCallback(0, cb); }
75+
void setWritableCallback(writable_callback_t cb) {
76+
setWritableCallback(0, cb);
77+
}
7378

7479
// from Adafruit_USBD_Interface
7580
virtual uint16_t getInterfaceDescriptor(uint8_t itfnum, uint8_t *buf,
7681
uint16_t bufsize);
7782

7883
private:
79-
enum { MAX_LUN = 2 };
84+
enum { MAX_LUN = 2 }; // TODO make it configurable
8085
struct {
8186
read_callback_t rd_cb;
8287
write_callback_t wr_cb;
8388
flush_callback_t fl_cb;
8489
ready_callback_t ready_cb;
90+
writable_callback_t writable_cb;
8591

8692
const char *_inquiry_vid;
8793
const char *_inquiry_pid;
@@ -107,6 +113,7 @@ class Adafruit_USBD_MSC : public Adafruit_USBD_Interface {
107113
friend int32_t tud_msc_write10_cb(uint8_t lun, uint32_t lba, uint32_t offset,
108114
uint8_t *buffer, uint32_t bufsize);
109115
friend void tud_msc_write10_complete_cb(uint8_t lun);
116+
friend bool tud_msc_is_writable_cb(uint8_t lun);
110117
};
111118

112119
#endif /* ADAFRUIT_USBD_MSC_H_ */

tools/update_tinyusb.py

Lines changed: 0 additions & 15 deletions
This file was deleted.

0 commit comments

Comments
 (0)