Skip to content

Commit d29ae17

Browse files
committed
use of an allocated buffer for write operation
1 parent 3d63b54 commit d29ae17

File tree

2 files changed

+97
-71
lines changed

2 files changed

+97
-71
lines changed

libraries/UsbMsd/UsbMsd.cpp

Lines changed: 94 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,11 @@ void usb_msd_set_dev_ptr(USBMSD *prt);
1212
/* -------------------------------------------------------------------------- */
1313
/* Add Mass Storage USB capability when present */
1414
/* -------------------------------------------------------------------------- */
15-
#ifdef DO_NOT_USE
15+
1616
void __USBInstallMSD() {}
17-
#endif
1817

19-
USBMSD::USBMSD(std::initializer_list<BlockDevice *> args) {
18+
19+
USBMSD::USBMSD(std::initializer_list<BlockDevice *> args) : msd_buffer(nullptr), msd_buffer_size(0) {
2020
_bd = new BlockDevice *[args.size()];
2121
num = args.size();
2222

@@ -29,7 +29,7 @@ USBMSD::USBMSD(std::initializer_list<BlockDevice *> args) {
2929
/* -------------------------------------------------------------------------- */
3030
/* CONSTRUCTOR -> initalize block device and pass a "hook" to the tu_msd module */
3131
/* -------------------------------------------------------------------------- */
32-
USBMSD::USBMSD(BlockDevice *bd) {
32+
USBMSD::USBMSD(BlockDevice *bd) : msd_buffer(nullptr), msd_buffer_size(0) {
3333
_bd = new BlockDevice *[0];
3434
_bd[0] = bd;
3535
num = 1;
@@ -39,7 +39,9 @@ USBMSD::USBMSD(BlockDevice *bd) {
3939

4040
bool USBMSD::begin(uint8_t lun) {
4141
if(lun < num){
42+
4243
if(_bd[lun]->init() == 0) {
44+
4345
return true;
4446
}
4547
}
@@ -52,6 +54,9 @@ bool USBMSD::begin(uint8_t lun) {
5254
/* -------------------------------------------------------------------------- */
5355
USBMSD::~USBMSD() {
5456
delete []_bd;
57+
if(msd_buffer != nullptr) {
58+
delete []msd_buffer;
59+
}
5560
}
5661

5762
/* -------------------------------------------------------------------------- */
@@ -87,35 +92,74 @@ uint16_t USBMSD::get_block_size(uint8_t lun) {
8792
return _bd[lun]->get_erase_size();
8893
}
8994

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];
90106

107+
if(msd_buffer != nullptr) {
108+
msd_buffer_size = s;
109+
return true;
110+
}
111+
112+
return false;
113+
}
91114

92115
/* -------------------------------------------------------------------------- */
93116
/* READ */
94117
/* -------------------------------------------------------------------------- */
95118
int USBMSD::read(uint8_t lun, uint32_t lba, uint32_t offset, void* buffer, uint32_t bufsize) {
96119

97-
98-
99120
if(!begin(lun)) {
100121
#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) ;
102123
#endif
103124
return MSD_ERROR;
104125
}
105126

127+
uint32_t size_to_return = bufsize;
106128
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;
108133

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;
116141
}
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+
117161
if(retval == 0) {
118-
return bufsize;
162+
return size_to_return;
119163
}
120164
else {
121165
#ifdef DEBUG_MSD
@@ -126,20 +170,16 @@ int USBMSD::read(uint8_t lun, uint32_t lba, uint32_t offset, void* buffer, uint3
126170
}
127171

128172

129-
uint8_t write_buff[512];
130173

131-
void print_u8(uint8_t t) {
132-
if(t < 10) {
133-
Serial1.print('0');
134-
}
135-
Serial1.print(t,HEX);
136-
}
137174

138175
/* -------------------------------------------------------------------------- */
139176
/* WRITE */
140177
/* -------------------------------------------------------------------------- */
141178
int USBMSD::write(uint8_t lun, uint32_t lba, uint32_t offset, uint8_t* buffer, uint32_t bufsize) {
142179

180+
181+
182+
143183
if(lun >= num) {
144184
#ifdef DEBUG_MSD
145185
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
153193
#endif
154194
return MSD_ERROR;
155195
}
156-
157-
196+
197+
uint32_t size_to_return = bufsize;
158198
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;
160202

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
167206

168-
if(bufsize != block_size) {
169-
while(1) {
170-
Serial.println("BUFFSIZE != _bd[lun]->get_erase_size()");
171-
delay(1000);
172-
}
173-
}
174207

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;
181210

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;
184213
}
214+
215+
int err = 0;
185216

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);
204222
}
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+
}
211234

212235
if(err == 0) {
213-
return bufsize;
236+
return size_to_return;
214237
}
215238
#ifdef DEBUG_MSD
216239
mylogadd("WRITE FAILED %i %i %i", lun, lba, offset) ;

libraries/UsbMsd/UsbMsd.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,15 @@ class USBMSD {
1212

1313
private:
1414
BlockDevice **_bd;
15+
uint8_t *msd_buffer;
16+
uint32_t msd_buffer_size;
1517
int num;
1618

1719
public:
1820
USBMSD() = delete;
1921
USBMSD(BlockDevice *bd);
2022
USBMSD(std::initializer_list<BlockDevice *> args);
23+
bool allocate_msd_buffer(uint32_t s);
2124
virtual ~USBMSD();
2225
int read(uint8_t lun, void *buffer, bd_addr_t addr, bd_size_t size);
2326
int write(uint8_t lun,const void *buffer, bd_addr_t addr, bd_size_t size);

0 commit comments

Comments
 (0)