static rt_size_t _write(rt_device_t dev, rt_off_t pos, const void *buffer, rt_size_t size)
{
    rt_err_t err;
    struct rt_vbus_dev *vdev = dev->user_data;

    RT_ASSERT(vdev->chnr != 0);

    if (rt_interrupt_get_nest() == 0)
    {
        /* Thread context. */
        err = rt_vbus_post(vdev->chnr, vdev->req.prio,
                           buffer, size, RT_WAITING_FOREVER);
    }
    else
    {
        /* Interrupt context. */
        err = rt_vbus_post(vdev->chnr, vdev->req.prio,
                           buffer, size, 0);
    }

    if (err)
    {
        rt_set_errno(err);
        return 0;
    }

    return size;
}
Example #2
0
static ssize_t vbus_chnx_write(struct file *filp,
			       const char __user *buf, size_t size,
			       loff_t *offp)
{
	int res;
	unsigned long chnr = (unsigned long)(filp->private_data);
	char *kbuf = kmalloc(size, GFP_KERNEL);

	if (!kbuf)
		return -ENOMEM;

	res = copy_from_user(kbuf, buf, size);
	if (res < 0)
		return -EFAULT;

	res = rt_vbus_post(chnr, _ctxs[chnr].prio, kbuf, size);

	kfree(kbuf);

	/* We simplified the things by treating the signal as error. */
	if (unlikely(res)) {
		/* Make sure the error is returned as negative values. */
		if (res < 0)
			return res;
		else
			return -res;
	} else
		return size;
}