@@ -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
6464enum Status {
@@ -68,49 +68,20 @@ enum Status {
6868};
6969
7070USBMSD::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
7777USBMSD::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
11586void 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
137108USBMSD::~USBMSD ()
@@ -212,6 +183,12 @@ void USBMSD::disconnect()
212183
213184void USBMSD::process ()
214185{
186+ while (1 ) {
187+ if (_initialized) {
188+ _queue.dispatch ();
189+ // yield();
190+ }
191+ }
215192}
216193
217194void 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
238216int 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
263229int USBMSD::disk_initialize ()
@@ -283,12 +249,12 @@ int USBMSD::disk_status()
283249
284250void USBMSD::_isr_out ()
285251{
286- _out ();
252+ _out_task. call ();
287253}
288254
289255void USBMSD::_isr_in ()
290256{
291- _in ();
257+ _in_task. call ();
292258}
293259
294260void USBMSD::callback_state_change (USBDevice::DeviceState new_state)
@@ -415,24 +381,24 @@ const uint8_t *USBMSD::configuration_desc(uint8_t index)
415381
416382void 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
427393void 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
438404void USBMSD::_reset ()
0 commit comments