MCPcopy Create free account
hub / github.com/apache/nuttx / rpmsgdev_write

Function rpmsgdev_write

drivers/misc/rpmsgdev.c:464–539  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

462 ****************************************************************************/
463
464static ssize_t rpmsgdev_write(FAR struct file *filep, const char *buffer,
465 size_t buflen)
466{
467 FAR struct rpmsgdev_s *dev;
468 FAR struct rpmsgdev_priv_s *priv;
469 FAR struct rpmsgdev_write_s *msg;
470 uint32_t space;
471 size_t written = 0;
472 int ret = 0;
473
474 if (buffer == NULL)
475 {
476 return -EINVAL;
477 }
478
479 /* Recover our private data from the struct file instance */
480
481 dev = filep->f_inode->i_private;
482 priv = filep->f_priv;
483 DEBUGASSERT(dev != NULL && priv != NULL);
484
485 /* Perform the rpmsg write */
486
487 while (written < buflen)
488 {
489 msg = rpmsgdev_get_tx_payload_buffer(dev, &space);
490 if (msg == NULL)
491 {
492 ret = -ENOMEM;
493 break;
494 }
495
496 space -= sizeof(*msg) - 1;
497 if (space >= buflen - written)
498 {
499 space = buflen - written;
500 }
501 else if ((dev->flags & RPMSGDEV_NOFRAG_WRITE) != 0)
502 {
503 rpmsg_release_tx_buffer(&dev->ept, msg);
504 ret = -EMSGSIZE;
505 break;
506 }
507
508 msg->filep = priv->filep;
509 msg->count = space;
510 memcpy(msg->buf, buffer + written, space);
511
512 ret = rpmsgdev_send_recv(dev, RPMSGDEV_WRITE, false, &msg->header,
513 sizeof(*msg) - 1 + space, NULL);
514 if (ret >= 0)
515 {
516 written += ret;
517 continue;
518 }
519
520 if (ret != -EAGAIN || priv->nonblock || written != 0)
521 {

Callers

nothing calls this directly

Calls 4

rpmsgdev_send_recvFunction · 0.85
rpmsgdev_waitFunction · 0.85
memcpyFunction · 0.50

Tested by

no test coverage detected