Skip to content

Commit bbc3a30

Browse files
committed
add support for setWritableCallback()
1 parent 10119b7 commit bbc3a30

File tree

4 files changed

+23
-18
lines changed

4 files changed

+23
-18
lines changed

examples/MassStorage/msc_external_flash/msc_external_flash.ino

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@ void loop()
146146
// return number of copied bytes (must be multiple of block size)
147147
int32_t msc_read_cb (uint32_t lba, void* buffer, uint32_t bufsize)
148148
{
149-
// Note: SPIFLash Bock API: readBlocks/writeBlocks/syncBlocks
149+
// Note: SPIFLash Block API: readBlocks/writeBlocks/syncBlocks
150150
// already include 4K sector caching internally. We don't need to cache it, yahhhh!!
151151
return flash.readBlocks(lba, (uint8_t*) buffer, bufsize/512) ? bufsize : -1;
152152
}
@@ -158,7 +158,7 @@ int32_t msc_write_cb (uint32_t lba, uint8_t* buffer, uint32_t bufsize)
158158
{
159159
digitalWrite(LED_BUILTIN, HIGH);
160160

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

src/arduino/msc/Adafruit_USBD_MSC.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,10 @@ 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, writable_callback_t cb) {
116+
_lun_info[lun].writable_cb = cb;
117+
}
118+
115119
bool Adafruit_USBD_MSC::begin(void) {
116120
if (!TinyUSBDevice.addInterface(*this)) {
117121
return false;
@@ -256,6 +260,17 @@ void tud_msc_write10_complete_cb(uint8_t lun) {
256260
return _msc_dev->_lun_info[lun].fl_cb();
257261
}
258262

263+
// Invoked to check if device is writable as part of SCSI WRITE10
264+
// Default mode is writable
265+
bool tud_msc_is_writable_cb(uint8_t lun)
266+
{
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: 6 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,20 @@ 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) { setWritableCallback(0, cb); }
7376

7477
// from Adafruit_USBD_Interface
7578
virtual uint16_t getInterfaceDescriptor(uint8_t itfnum, uint8_t *buf,
7679
uint16_t bufsize);
7780

7881
private:
79-
enum { MAX_LUN = 2 };
82+
enum { MAX_LUN = 2 }; // TODO make it configurable
8083
struct {
8184
read_callback_t rd_cb;
8285
write_callback_t wr_cb;
8386
flush_callback_t fl_cb;
8487
ready_callback_t ready_cb;
88+
writable_callback_t writable_cb;
8589

8690
const char *_inquiry_vid;
8791
const char *_inquiry_pid;
@@ -107,6 +111,7 @@ class Adafruit_USBD_MSC : public Adafruit_USBD_Interface {
107111
friend int32_t tud_msc_write10_cb(uint8_t lun, uint32_t lba, uint32_t offset,
108112
uint8_t *buffer, uint32_t bufsize);
109113
friend void tud_msc_write10_complete_cb(uint8_t lun);
114+
friend bool tud_msc_is_writable_cb(uint8_t lun);
110115
};
111116

112117
#endif /* ADAFRUIT_USBD_MSC_H_ */

tools/update_tinyusb.py

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

0 commit comments

Comments
 (0)