forked from arduino/ArduinoCore-mbed
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathSingleton.cpp
100 lines (83 loc) · 2.19 KB
/
Singleton.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
#include "Arduino.h"
#include "PluggableUSBMSD.h"
#include "FlashIAPBlockDevice.h"
#include "FATFileSystem.h"
using namespace arduino;
/*
struct disk_info {
mbed::bd_addr_t addr;
mbed::bd_size_t size;
uint8_t data[4096];
bool erase;
};
static rtos::Thread _t(osPriorityHigh, 32 * 1024, NULL, "msd");
static rtos::Mail<struct disk_info, 16> mail_box;
class FlashIAPBlockDeviceMutexFriendly: public FlashIAPBlockDevice {
public:
FlashIAPBlockDeviceMutexFriendly(uint32_t address, uint32_t size) : FlashIAPBlockDevice(address, size)
{
_base = address;
}
void begin() {
_t.start(mbed::callback(this, &FlashIAPBlockDeviceMutexFriendly::deferred_action));
}
int read(void *buffer, mbed::bd_addr_t virtual_address, mbed::bd_size_t size) {
memcpy(buffer, (void*)(virtual_address + _base), size);
return 0;
}
int erase(mbed::bd_addr_t virtual_address, mbed::bd_size_t size) {
struct disk_info* info = mail_box.alloc();
if (info == NULL) {
return -1;
}
info->addr = virtual_address;
info->size = size;
info->erase = true;
mail_box.put(info);
}
int program(const void *buffer, mbed::bd_addr_t virtual_address, mbed::bd_size_t size) {
struct disk_info* info = mail_box.alloc();
if (info == NULL) {
return -1;
}
info->addr = virtual_address;
info->size = size;
info->erase = false;
memcpy(info->data, buffer, get_erase_size());
mail_box.put(info);
}
void deferred_action() {
while (true) {
osEvent evt = mail_box.get();
if (evt.status == osEventMail) {
struct disk_info *info = (struct disk_info*)evt.value.p;
if (info->erase == true) {
FlashIAPBlockDevice::erase(info->addr, info->size);
} else {
FlashIAPBlockDevice::program(info->data, info->addr, info->size);
}
mail_box.free(info);
}
}
}
private:
uint32_t _base;
};
*/
//static FlashIAPBlockDeviceMutexFriendly bd(0x80000, 0x80000);
#ifdef NRF52840_XXAA
static FlashIAPBlockDevice bd(0x80000, 0x80000);
void USBMSD::begin()
{
int err = getFileSystem().mount(&bd);
if (err) {
err = getFileSystem().reformat(&bd);
}
}
mbed::FATFileSystem& USBMSD::getFileSystem()
{
static mbed::FATFileSystem fs("fs");
return fs;
}
USBMSD MassStorage(&bd);
#endif