@@ -156,14 +156,12 @@ enum mhu_error_t clear_and_wait_for_signal (
156
156
/**
157
157
* @brief For simplicity, require:
158
158
* - the buffer address to be 4-byte aligned.
159
- * - the buffer size to be a multiple of 4.
160
159
*/
161
160
static enum mhu_error_t validate_buffer_params (uintptr_t buf_addr ,
162
161
size_t buf_size )
163
162
{
164
163
if ((buf_addr == 0 ) ||
165
164
(!IS_ALIGNED (buf_addr , 4 )) ||
166
- (!IS_ALIGNED (buf_size , 4 )) ||
167
165
(buf_size == 0 )) {
168
166
return MHU_ERR_VALIDATE_BUFFER_PARAMS_INVALID_ARG ;
169
167
}
@@ -284,6 +282,8 @@ enum mhu_error_t mhu_send_data(void *mhu_sender_dev, const uint8_t *send_buffer,
284
282
uint8_t num_channels ;
285
283
uint8_t chan = 0 ;
286
284
uint32_t * buffer ;
285
+ uint32_t t_buffer ;
286
+ size_t bytes_left ;
287
287
288
288
assert (dev != NULL );
289
289
assert (dev -> base != (uintptr_t )NULL );
@@ -307,11 +307,23 @@ enum mhu_error_t mhu_send_data(void *mhu_sender_dev, const uint8_t *send_buffer,
307
307
chan ++ ;
308
308
309
309
buffer = (uint32_t * )send_buffer ;
310
- for (size_t i = 0 ; i < size ; i += 4 ) {
311
- mhu_v3_err = mhu_v3_x_doorbell_write (dev , chan , * buffer ++ );
310
+ bytes_left = size ;
311
+ while (bytes_left > 0 ) {
312
+ if (bytes_left >= 4 ) {
313
+ t_buffer = * buffer ++ ;
314
+ bytes_left -= 4 ;
315
+ } else {
316
+ /* a few bytes still to send, pad the remaining bytes */
317
+ t_buffer = 0 ;
318
+ memcpy (& t_buffer , (uint32_t * )buffer , bytes_left );
319
+
320
+ bytes_left = 0 ;
321
+ }
322
+ mhu_v3_err = mhu_v3_x_doorbell_write (dev , chan , t_buffer );
312
323
if (mhu_v3_err != MHU_V_3_X_ERR_NONE ) {
313
324
return mhu_v3_err ;
314
325
}
326
+
315
327
if (++ chan == (num_channels - 1 )) {
316
328
/* Using the last channel for notifications */
317
329
mhu_err = signal_and_wait_for_clear (dev , MHU_NOTIFY_VALUE );
@@ -368,6 +380,8 @@ enum mhu_error_t mhu_receive_data(void *mhu_receiver_dev,
368
380
uint8_t num_channels ;
369
381
uint8_t chan = 0 ;
370
382
uint32_t * buffer ;
383
+ uint32_t t_buffer ;
384
+ size_t bytes_left ;
371
385
372
386
assert (dev != NULL );
373
387
assert (dev -> base != (uintptr_t )NULL );
@@ -401,14 +415,25 @@ enum mhu_error_t mhu_receive_data(void *mhu_receiver_dev,
401
415
}
402
416
403
417
buffer = (uint32_t * )receive_buffer ;
404
- for (size_t i = 0 ; i < msg_len ; i += 4 ) {
405
- mhu_v3_err = mhu_v3_x_doorbell_read (dev , chan , buffer ++ );
418
+ bytes_left = msg_len ;
419
+ while (bytes_left > 0 ) {
420
+ if (bytes_left >= 4 ) {
421
+ mhu_v3_err = mhu_v3_x_doorbell_read (dev , chan , buffer ++ );
422
+ bytes_left -= 4 ;
423
+ } else {
424
+ /* a few bytes still to receive, pad the remaining bytes */
425
+ t_buffer = 0 ;
426
+ mhu_v3_err = mhu_v3_x_doorbell_read (dev , chan , & t_buffer );
427
+
428
+ memcpy ((uint32_t * )buffer , & t_buffer , bytes_left );
429
+ bytes_left = 0 ;
430
+ }
406
431
if (mhu_v3_err != MHU_V_3_X_ERR_NONE ) {
407
432
return mhu_v3_err ;
408
433
}
409
434
410
435
/* Only wait for next transfer if there is still missing data. */
411
- if (++ chan == (num_channels - 1 ) && (msg_len - i ) > 4 ) {
436
+ if (( ++ chan == (num_channels - 1 )) && (bytes_left > 0 ) ) {
412
437
/* Busy wait for next transfer */
413
438
mhu_err = clear_and_wait_for_signal (dev , MHU_NOTIFY_VALUE );
414
439
if (mhu_err != MHU_ERR_NONE ) {
0 commit comments