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

Function rpmsgdev_read

drivers/misc/rpmsgdev.c:389–443  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

387 ****************************************************************************/
388
389static ssize_t rpmsgdev_read(FAR struct file *filep, FAR char *buffer,
390 size_t buflen)
391{
392 FAR struct rpmsgdev_s *dev;
393 FAR struct rpmsgdev_priv_s *priv;
394 struct rpmsgdev_read_s msg;
395 struct iovec read;
396 uint32_t command;
397 ssize_t ret;
398
399 if (buffer == NULL)
400 {
401 return -EINVAL;
402 }
403
404 /* Recover our private data from the struct file instance */
405
406 dev = filep->f_inode->i_private;
407 priv = filep->f_priv;
408 DEBUGASSERT(dev != NULL && priv != NULL);
409
410 /* Call the host to perform the read */
411
412 read.iov_base = buffer;
413 read.iov_len = 0;
414
415 msg.filep = priv->filep;
416 msg.count = buflen;
417 command = dev->flags & RPMSGDEV_NOFRAG_READ ?
418 RPMSGDEV_READ_NOFRAG : RPMSGDEV_READ;
419
420 for (; ; )
421 {
422 ret = rpmsgdev_send_recv(dev, command, true, &msg.header,
423 sizeof(msg) - 1, &read);
424 if (ret != -EAGAIN || read.iov_len > 0 || priv->nonblock)
425 {
426 break;
427 }
428
429 /* If open with block mode and return -EAGAIN, should wait the
430 * perr device ready and try again until read success or some
431 * other errors occur.
432 */
433
434 ret = rpmsgdev_wait(filep, POLLIN);
435 if (ret < 0)
436 {
437 rpmsgdeverr("read wait failed, ret=%d\n", ret);
438 break;
439 }
440 }
441
442 return read.iov_len ? read.iov_len : ret;
443}
444
445/****************************************************************************
446 * Name: rpmsgdev_write

Callers

nothing calls this directly

Calls 2

rpmsgdev_send_recvFunction · 0.85
rpmsgdev_waitFunction · 0.85

Tested by

no test coverage detected