@@ -58,7 +58,7 @@ using namespace arduino;
58
58
#define DEFAULT_CONFIGURATION (1 )
59
59
60
60
// max packet size
61
- #define MAX_PACKET 64
61
+ #define MAX_PACKET MSD_MAX_PACKET_SIZE
62
62
63
63
// CSW Status
64
64
enum Status {
@@ -68,49 +68,20 @@ enum Status {
68
68
};
69
69
70
70
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),
72
72
_initialized(false ), _media_removed(false ), _bd(bd)
73
73
{
74
74
PluggableUSBD ().plug (this );
75
75
}
76
76
77
77
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),
79
79
_initialized(false ), _media_removed(false ), _bd(bd)
80
80
{
81
81
PluggableUSBD ().plug (this );
82
82
}
83
83
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" );
114
85
115
86
void USBMSD::init (EndpointResolver& resolver)
116
87
{
@@ -131,7 +102,7 @@ void USBMSD::init(EndpointResolver& resolver)
131
102
_page = NULL ;
132
103
connect ();
133
104
134
- _t.start (write_chunk );
105
+ _t.start (mbed::callback ( this , &USBMSD::process) );
135
106
}
136
107
137
108
USBMSD::~USBMSD ()
@@ -212,6 +183,12 @@ void USBMSD::disconnect()
212
183
213
184
void USBMSD::process ()
214
185
{
186
+ while (1 ) {
187
+ if (_initialized) {
188
+ _queue.dispatch ();
189
+ // yield();
190
+ }
191
+ }
215
192
}
216
193
217
194
void USBMSD::attach (mbed::Callback<void ()> cb)
@@ -228,27 +205,17 @@ int USBMSD::disk_read(uint8_t *data, uint64_t block, uint8_t count)
228
205
// this operation must be executed in another thread
229
206
mbed::bd_addr_t addr = block * _bd->get_erase_size ();
230
207
mbed::bd_size_t size = count * _bd->get_erase_size ();
231
- /*
232
- return _bd->read(data, addr, size);
233
- */
208
+ #ifdef NRF52840_XXAA
234
209
memcpy (data, (void *)(addr + 0x80000 ), size);
210
+ #else
211
+ _bd->read (data, addr, size);
212
+ #endif
235
213
return 0 ;
236
214
}
237
215
238
216
int USBMSD::disk_write (const uint8_t *data, uint64_t block, uint8_t count)
239
217
{
240
218
// 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
- /*
252
219
mbed::bd_addr_t addr = block * _bd->get_erase_size ();
253
220
mbed::bd_size_t size = count * _bd->get_erase_size ();
254
221
int ret = _bd->erase (addr, size);
@@ -257,7 +224,6 @@ int USBMSD::disk_write(const uint8_t *data, uint64_t block, uint8_t count)
257
224
}
258
225
259
226
return _bd->program (data, addr, size);
260
- */
261
227
}
262
228
263
229
int USBMSD::disk_initialize ()
@@ -283,12 +249,12 @@ int USBMSD::disk_status()
283
249
284
250
void USBMSD::_isr_out ()
285
251
{
286
- _out ();
252
+ _out_task. call ();
287
253
}
288
254
289
255
void USBMSD::_isr_in ()
290
256
{
291
- _in ();
257
+ _in_task. call ();
292
258
}
293
259
294
260
void USBMSD::callback_state_change (USBDevice::DeviceState new_state)
@@ -415,24 +381,24 @@ const uint8_t *USBMSD::configuration_desc(uint8_t index)
415
381
416
382
void USBMSD::_out ()
417
383
{
418
- // _mutex.lock();
384
+ _mutex.lock ();
419
385
420
386
_bulk_out_size = read_finish (_bulk_out);
421
387
_out_ready = true ;
422
388
_process ();
423
389
424
- // _mutex.unlock();
390
+ _mutex.unlock ();
425
391
}
426
392
427
393
void USBMSD::_in ()
428
394
{
429
- // _mutex.lock();
395
+ _mutex.lock ();
430
396
431
397
write_finish (_bulk_in);
432
398
_in_ready = true ;
433
399
_process ();
434
400
435
- // _mutex.unlock();
401
+ _mutex.unlock ();
436
402
}
437
403
438
404
void USBMSD::_reset ()
0 commit comments