@@ -12,11 +12,11 @@ void usb_msd_set_dev_ptr(USBMSD *prt);
12
12
/* -------------------------------------------------------------------------- */
13
13
/* Add Mass Storage USB capability when present */
14
14
/* -------------------------------------------------------------------------- */
15
- # ifdef DO_NOT_USE
15
+
16
16
void __USBInstallMSD () {}
17
- #endif
18
17
19
- USBMSD::USBMSD (std::initializer_list<BlockDevice *> args) {
18
+
19
+ USBMSD::USBMSD (std::initializer_list<BlockDevice *> args) : msd_buffer(nullptr ), msd_buffer_size(0 ) {
20
20
_bd = new BlockDevice *[args.size ()];
21
21
num = args.size ();
22
22
@@ -29,7 +29,7 @@ USBMSD::USBMSD(std::initializer_list<BlockDevice *> args) {
29
29
/* -------------------------------------------------------------------------- */
30
30
/* CONSTRUCTOR -> initalize block device and pass a "hook" to the tu_msd module */
31
31
/* -------------------------------------------------------------------------- */
32
- USBMSD::USBMSD (BlockDevice *bd) {
32
+ USBMSD::USBMSD (BlockDevice *bd) : msd_buffer( nullptr ), msd_buffer_size( 0 ) {
33
33
_bd = new BlockDevice *[0 ];
34
34
_bd[0 ] = bd;
35
35
num = 1 ;
@@ -39,7 +39,9 @@ USBMSD::USBMSD(BlockDevice *bd) {
39
39
40
40
bool USBMSD::begin (uint8_t lun) {
41
41
if (lun < num){
42
+
42
43
if (_bd[lun]->init () == 0 ) {
44
+
43
45
return true ;
44
46
}
45
47
}
@@ -52,6 +54,9 @@ bool USBMSD::begin(uint8_t lun) {
52
54
/* -------------------------------------------------------------------------- */
53
55
USBMSD::~USBMSD () {
54
56
delete [] _bd;
57
+ if (msd_buffer != nullptr ) {
58
+ delete [] msd_buffer;
59
+ }
55
60
}
56
61
57
62
/* -------------------------------------------------------------------------- */
@@ -87,35 +92,74 @@ uint16_t USBMSD::get_block_size(uint8_t lun) {
87
92
return _bd[lun]->get_erase_size ();
88
93
}
89
94
95
+ bool USBMSD::allocate_msd_buffer (uint32_t s) {
96
+ if (msd_buffer != nullptr && s == msd_buffer_size) {
97
+ return true ;
98
+ }
99
+
100
+ if (msd_buffer != nullptr ) {
101
+ delete [] msd_buffer;
102
+ msd_buffer = nullptr ;
103
+ }
104
+
105
+ msd_buffer = new uint8_t [s];
90
106
107
+ if (msd_buffer != nullptr ) {
108
+ msd_buffer_size = s;
109
+ return true ;
110
+ }
111
+
112
+ return false ;
113
+ }
91
114
92
115
/* -------------------------------------------------------------------------- */
93
116
/* READ */
94
117
/* -------------------------------------------------------------------------- */
95
118
int USBMSD::read (uint8_t lun, uint32_t lba, uint32_t offset, void * buffer, uint32_t bufsize) {
96
119
97
-
98
-
99
120
if (!begin (lun)) {
100
121
#ifdef DEBUG_MSD
101
- mylogadd (" READ FAILED 1 %i %i %i" , lun, lba, offset) ;
122
+ mylogadd (" READ FAILED 1 %i %i %i %i " , lun, lba, offset, bufsize ) ;
102
123
#endif
103
124
return MSD_ERROR;
104
125
}
105
126
127
+ uint32_t size_to_return = bufsize;
106
128
bd_size_t block_size = _bd[lun]->get_erase_size ();
107
- bd_addr_t block_address = (bd_addr_t )((lba * block_size) + offset);
129
+ bd_addr_t requested_address = (bd_addr_t )((lba * block_size) + offset);
130
+ uint32_t block_offset = (requested_address % block_size);
131
+ bd_addr_t block_address = requested_address - block_offset;
132
+ uint8_t *buf_out = (uint8_t *)buffer;
108
133
109
- Serial1. print ( " R BLOCK ADDRESS " );
110
- Serial1. print (block_address ) ;
111
- Serial1. print ( " " );
112
- Serial1. println (block_address, HEX) ;
113
- int retval = 1 ;
114
- if (lun < num ) {
115
- retval = _bd[lun]-> read (buffer, block_address, ( bd_size_t )bufsize) ;
134
+ # ifdef DEBUG_MSD
135
+ // mylogadd("READ %i %i %i %i - %i", lun, lba, offset, bufsize, requested_address ) ;
136
+ # endif
137
+
138
+
139
+ if (! allocate_msd_buffer (block_size) ) {
140
+ return MSD_ERROR ;
116
141
}
142
+
143
+ int retval = 0 ;
144
+
145
+ while (bufsize > 0 && retval == 0 ) {
146
+ retval = _bd[lun]->read (msd_buffer, block_address, block_size);
147
+ uint32_t bytes_to_copy = bufsize > (block_size - block_offset) ? (block_size - block_offset) : bufsize;
148
+
149
+ for (int i = 0 ; i < bytes_to_copy; i++) {
150
+ *(buf_out+i) = *(msd_buffer + block_offset + i);
151
+ }
152
+
153
+
154
+ // memcpy(buf_out, msd_buffer + block_offset, bytes_to_copy);
155
+ block_offset = 0 ;
156
+ block_address += block_size;
157
+ bufsize -= bytes_to_copy;
158
+ buf_out += bytes_to_copy;
159
+ }
160
+
117
161
if (retval == 0 ) {
118
- return bufsize ;
162
+ return size_to_return ;
119
163
}
120
164
else {
121
165
#ifdef DEBUG_MSD
@@ -126,20 +170,16 @@ int USBMSD::read(uint8_t lun, uint32_t lba, uint32_t offset, void* buffer, uint3
126
170
}
127
171
128
172
129
- uint8_t write_buff[512 ];
130
173
131
- void print_u8 (uint8_t t) {
132
- if (t < 10 ) {
133
- Serial1.print (' 0' );
134
- }
135
- Serial1.print (t,HEX);
136
- }
137
174
138
175
/* -------------------------------------------------------------------------- */
139
176
/* WRITE */
140
177
/* -------------------------------------------------------------------------- */
141
178
int USBMSD::write (uint8_t lun, uint32_t lba, uint32_t offset, uint8_t * buffer, uint32_t bufsize) {
142
179
180
+
181
+
182
+
143
183
if (lun >= num) {
144
184
#ifdef DEBUG_MSD
145
185
mylogadd (" WRITE FAILED 1 %i %i %i" , lun, lba, offset) ;
@@ -153,64 +193,47 @@ int USBMSD::write(uint8_t lun, uint32_t lba, uint32_t offset, uint8_t* buffer, u
153
193
#endif
154
194
return MSD_ERROR;
155
195
}
156
-
157
-
196
+
197
+ uint32_t size_to_return = bufsize;
158
198
bd_size_t block_size = _bd[lun]->get_erase_size ();
159
- bd_addr_t block_address = (bd_addr_t )((lba * block_size) + offset);
199
+ bd_addr_t requested_address = (bd_addr_t )((lba * block_size) + offset);
200
+ uint32_t block_offset = (requested_address % block_size);
201
+ bd_addr_t block_address = requested_address - block_offset;
160
202
161
- if (offset != 0 ) {
162
- while (1 ) {
163
- Serial.println (" OFFSET != 0" );
164
- delay (1000 );
165
- }
166
- }
203
+ #ifdef DEBUG_MSD
204
+ mylogadd (" WRITE %i %i %i %i - %X" , lun, lba, offset, bufsize, requested_address) ;
205
+ #endif
167
206
168
- if (bufsize != block_size) {
169
- while (1 ) {
170
- Serial.println (" BUFFSIZE != _bd[lun]->get_erase_size()" );
171
- delay (1000 );
172
- }
173
- }
174
207
175
- if (block_size != 512 ) {
176
- while (1 ) {
177
- Serial.println (" BUFFSIZE != 512" );
178
- delay (1000 );
179
- }
180
- }
208
+
209
+ uint8_t *buf_out = (uint8_t *)buffer;
181
210
182
- for ( int i = 0 ;i < 512 ; i++ ) {
183
- write_buff[i] = buffer[i] ;
211
+ if (! allocate_msd_buffer (block_size) ) {
212
+ return MSD_ERROR ;
184
213
}
214
+
215
+ int err = 0 ;
185
216
186
- Serial1.print (" W BLOCK ADDRESS " );
187
- Serial1.print (block_address) ;
188
- Serial1.print (" " );
189
- Serial1.print (block_address, HEX) ;
190
- Serial1.print (" " );
191
- Serial1.println ((uint32_t )write_buff);
192
-
193
- int err = _bd[lun]->erase (block_address,block_size);
194
- if (err == 0 ) {
195
- err = _bd[lun]->program (write_buff, block_address, block_size);
196
- }
197
-
198
- int index = 0 ;
199
- for (int i = 0 ; i < 16 ; i++) {
200
- for (int j = 0 ; j < 32 ; j++) {
201
- print_u8 (write_buff[index]);
202
- Serial1.print (" " );
203
- index++;
217
+ while (bufsize > 0 && err == 0 ) {
218
+ err = _bd[lun]->read (msd_buffer, block_address, block_size);
219
+ uint32_t bytes_to_copy = bufsize > (block_size - block_offset) ? (block_size - block_offset) : bufsize;
220
+ for (int i = 0 ; i < bytes_to_copy; i++) {
221
+ *(msd_buffer + block_offset + i) = *(buf_out+i);
204
222
}
205
- Serial1.println ();
206
-
207
-
208
- }
209
-
210
-
223
+ if (err == 0 ) {
224
+ _bd[lun]->erase (block_address,block_size);
225
+ }
226
+ if (err == 0 ) {
227
+ err = _bd[lun]->program (msd_buffer, block_address, block_size);
228
+ }
229
+ block_offset = 0 ;
230
+ block_address += block_size;
231
+ bufsize -= bytes_to_copy;
232
+ buf_out += bytes_to_copy;
233
+ }
211
234
212
235
if (err == 0 ) {
213
- return bufsize ;
236
+ return size_to_return ;
214
237
}
215
238
#ifdef DEBUG_MSD
216
239
mylogadd (" WRITE FAILED %i %i %i" , lun, lba, offset) ;
0 commit comments