Skip to content

Commit 25f18b1

Browse files
committed
PluggableUSBMSD: fix functionality on Portenta
1 parent e9b9bc9 commit 25f18b1

File tree

2 files changed

+34
-59
lines changed

2 files changed

+34
-59
lines changed

libraries/USBMSD/PluggableUSBMSD.h

+13-4
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@
2222
#include "USBDescriptor.h"
2323
#include "USBDevice_Types.h"
2424
#include "platform/Callback.h"
25+
#include "drivers/internal/PolledQueue.h"
26+
#include "drivers/internal/Task.h"
2527
#include "BlockDevice.h"
2628
#include "Mutex.h"
2729

@@ -31,6 +33,12 @@
3133
#include "Callback.h"
3234
#include "rtos/Thread.h"
3335

36+
#if defined(MBED_CONF_TARGET_USB_SPEED) && (MBED_CONF_TARGET_USB_SPEED == USE_USB_OTG_HS)
37+
#define MSD_MAX_PACKET_SIZE 512
38+
#else
39+
#define MSD_MAX_PACKET_SIZE 64
40+
#endif
41+
3442
namespace arduino {
3543

3644
/**
@@ -251,15 +259,16 @@ class USBMSD: public internal::PluggableUSBModule {
251259
// endpoints
252260
usb_ep_t _bulk_in;
253261
usb_ep_t _bulk_out;
254-
uint8_t _bulk_in_buf[64];
255-
uint8_t _bulk_out_buf[64];
262+
uint8_t _bulk_in_buf[MSD_MAX_PACKET_SIZE];
263+
uint8_t _bulk_out_buf[MSD_MAX_PACKET_SIZE];
256264
bool _out_ready;
257265
bool _in_ready;
258266
uint32_t _bulk_out_size;
259267

260268
// Interrupt to thread deferral
261-
mbed::Callback<void()> _in_task;
262-
mbed::Callback<void()> _out_task;
269+
events::PolledQueue _queue;
270+
events::Task<void()> _in_task;
271+
events::Task<void()> _out_task;
263272
mbed::Callback<void()> _reset_task;
264273
mbed::Callback<void()> _control_task;
265274
mbed::Callback<void()> _configure_task;

libraries/USBMSD/USBMSD.cpp

+21-55
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ using namespace arduino;
5858
#define DEFAULT_CONFIGURATION (1)
5959

6060
// max packet size
61-
#define MAX_PACKET 64
61+
#define MAX_PACKET MSD_MAX_PACKET_SIZE
6262

6363
// CSW Status
6464
enum Status {
@@ -68,49 +68,20 @@ enum Status {
6868
};
6969

7070
USBMSD::USBMSD(mbed::BlockDevice *bd, bool connect_blocking, uint16_t vendor_id, uint16_t product_id, uint16_t product_release)
71-
: arduino::internal::PluggableUSBModule(1),
71+
: arduino::internal::PluggableUSBModule(1), _in_task(&_queue), _out_task(&_queue),
7272
_initialized(false), _media_removed(false), _bd(bd)
7373
{
7474
PluggableUSBD().plug(this);
7575
}
7676

7777
USBMSD::USBMSD(USBPhy *phy, mbed::BlockDevice *bd, uint16_t vendor_id, uint16_t product_id, uint16_t product_release)
78-
: arduino::internal::PluggableUSBModule(1),
78+
: arduino::internal::PluggableUSBModule(1), _in_task(&_queue), _out_task(&_queue),
7979
_initialized(false), _media_removed(false), _bd(bd)
8080
{
8181
PluggableUSBD().plug(this);
8282
}
8383

84-
static rtos::Thread _t(osPriorityHigh, 32 * 1024, NULL, "msd");
85-
86-
struct disk_info {
87-
uint64_t block;
88-
uint8_t count;
89-
mbed::BlockDevice *_bd;
90-
uint8_t data[4096];
91-
};
92-
93-
static rtos::Mail<struct disk_info, 16> mail_box;
94-
95-
static int _writes_i = 0;
96-
97-
static void write_chunk() {
98-
while (true) {
99-
osEvent evt = mail_box.get();
100-
if (evt.status == osEventMail) {
101-
struct disk_info *info = (struct disk_info*)evt.value.p;
102-
mbed::bd_addr_t addr = info->block * info->_bd->get_erase_size();
103-
mbed::bd_size_t size = info->count * info->_bd->get_erase_size();
104-
105-
int ret = info->_bd->erase(addr, size);
106-
if (ret != 0) {
107-
return;
108-
}
109-
ret = info->_bd->program(info->data, addr, size);
110-
mail_box.free(info);
111-
}
112-
}
113-
}
84+
static rtos::Thread _t(osPriorityNormal, 32 * 1024, NULL, "msd");
11485

11586
void USBMSD::init(EndpointResolver& resolver)
11687
{
@@ -131,7 +102,7 @@ void USBMSD::init(EndpointResolver& resolver)
131102
_page = NULL;
132103
connect();
133104

134-
_t.start(write_chunk);
105+
_t.start(mbed::callback(this, &USBMSD::process));
135106
}
136107

137108
USBMSD::~USBMSD()
@@ -212,6 +183,12 @@ void USBMSD::disconnect()
212183

213184
void USBMSD::process()
214185
{
186+
while (1) {
187+
if (_initialized) {
188+
_queue.dispatch();
189+
//yield();
190+
}
191+
}
215192
}
216193

217194
void USBMSD::attach(mbed::Callback<void()> cb)
@@ -228,27 +205,17 @@ int USBMSD::disk_read(uint8_t *data, uint64_t block, uint8_t count)
228205
// this operation must be executed in another thread
229206
mbed::bd_addr_t addr = block * _bd->get_erase_size();
230207
mbed::bd_size_t size = count * _bd->get_erase_size();
231-
/*
232-
return _bd->read(data, addr, size);
233-
*/
208+
#ifdef NRF52840_XXAA
234209
memcpy(data, (void*)(addr + 0x80000), size);
210+
#else
211+
_bd->read(data, addr, size);
212+
#endif
235213
return 0;
236214
}
237215

238216
int USBMSD::disk_write(const uint8_t *data, uint64_t block, uint8_t count)
239217
{
240218
// this operation must be executed in another thread
241-
struct disk_info* info = mail_box.alloc();
242-
if (info == NULL) {
243-
return -1;
244-
}
245-
memcpy(info->data, data, _bd->get_erase_size());
246-
info->block = block;
247-
info->count = count;
248-
info->_bd = _bd;
249-
mail_box.put(info);
250-
return 0;
251-
/*
252219
mbed::bd_addr_t addr = block * _bd->get_erase_size();
253220
mbed::bd_size_t size = count * _bd->get_erase_size();
254221
int ret = _bd->erase(addr, size);
@@ -257,7 +224,6 @@ int USBMSD::disk_write(const uint8_t *data, uint64_t block, uint8_t count)
257224
}
258225

259226
return _bd->program(data, addr, size);
260-
*/
261227
}
262228

263229
int USBMSD::disk_initialize()
@@ -283,12 +249,12 @@ int USBMSD::disk_status()
283249

284250
void USBMSD::_isr_out()
285251
{
286-
_out();
252+
_out_task.call();
287253
}
288254

289255
void USBMSD::_isr_in()
290256
{
291-
_in();
257+
_in_task.call();
292258
}
293259

294260
void USBMSD::callback_state_change(USBDevice::DeviceState new_state)
@@ -415,24 +381,24 @@ const uint8_t *USBMSD::configuration_desc(uint8_t index)
415381

416382
void USBMSD::_out()
417383
{
418-
//_mutex.lock();
384+
_mutex.lock();
419385

420386
_bulk_out_size = read_finish(_bulk_out);
421387
_out_ready = true;
422388
_process();
423389

424-
//_mutex.unlock();
390+
_mutex.unlock();
425391
}
426392

427393
void USBMSD::_in()
428394
{
429-
//_mutex.lock();
395+
_mutex.lock();
430396

431397
write_finish(_bulk_in);
432398
_in_ready = true;
433399
_process();
434400

435-
//_mutex.unlock();
401+
_mutex.unlock();
436402
}
437403

438404
void USBMSD::_reset()

0 commit comments

Comments
 (0)