Re: how can i make the skeleton read function blocking function?

"Wael Adel" <[email protected]>
Newsgroups gmane.linux.usb.devel
Message-ID <[email protected]>
i have tried the driver now on a small application in which i print
what i receive from the gadget so
when the gadget sends "hello" for example, the application just prints
some noise characters.

i thinks that copy_to_user does not work right or its location should
be adjusted?
does copy_to_user arguments are: destination,source,count respectively ?

here is my code till now:

*********************************************************************************
static void skel_read_bulk_callback(struct urb *urb, struct pt_regs *regs)
{
	struct usb_skel *dev;
	struct my_data *mine = (struct my_data *)urb->context;
	complete(&(mine->done));
	dev = mine->dev;
	up(&dev->limit_sem);
}

static ssize_t skel_read(struct file *file, char *user_buffer, size_t
count, loff_t *ppos)

{
// 	struct completion done;
// 	struct usb_skel *dev;
	int retval = 0;
	struct urb *urb = NULL;
	char *buf = NULL;

	size_t readsize = min(count, (size_t)MAX_TRANSFER);

	mydata1.dev = (struct usb_skel *)file->private_data;

	/* verify that we actually have some data to read */
	if (count == 0)
		goto exit;

	/* limit the number of URBs in flight to stop a user from using up all RAM */
	if (      down_interruptible( & (mydata1.dev->limit_sem) )     )
	{
		retval = -ERESTARTSYS;
		goto exit;
	}

	init_completion(& (  mydata1.done) );

	/* create a urb, and a buffer for it, and copy the data to the urb */
	urb = usb_alloc_urb(0, GFP_KERNEL);
	if (!urb) {
		retval = -ENOMEM;
		goto error;
	}

	buf = usb_buffer_alloc(mydata1.dev->udev, readsize, GFP_KERNEL,
&urb->transfer_dma);
	if (!buf) {
		retval = -ENOMEM;
		goto error;
	}

	/* initialize the urb properly */
	usb_fill_bulk_urb(urb, mydata1.dev->udev,
			  usb_rcvbulkpipe(mydata1.dev->udev, mydata1.dev->bulk_in_endpointAddr),
			  buf, readsize, skel_read_bulk_callback, &mydata1);
	urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;

	/* send the data out the bulk port */
	retval = usb_submit_urb(urb, GFP_KERNEL);
	if (retval) {
		err("%s - failed submitting read urb, error %d", __FUNCTION__, retval);
		goto error;
	}

	wait_for_completion(  &(mydata1.done)  );

	if (   copy_to_user( mydata1.dev->bulk_in_buffer,
user_buffer,urb->actual_length) )
		retval = -EFAULT;
	else
		retval = urb->actual_length;

	
	/* free up our allocated buffer */
	usb_buffer_free(urb->dev, urb->transfer_buffer_length,
			urb->transfer_buffer, urb->transfer_dma);
	/* release our reference to this urb, the USB core will eventually
free it entirely */
	usb_free_urb(urb);

	return retval;

exit:
	return retval;

error:
	usb_buffer_free(mydata1.dev->udev, readsize, buf, urb->transfer_dma);
	usb_free_urb(urb);
	up(  &(mydata1.dev->limit_sem) );
	return retval;
}
****************************************************************************************

so when the gadget sends "hello", i tried to print what the host
receives and the size of data it receives , it prints the size correct
as 5 for "hello" but when i print what it receives i got some noise
characters.so what is still wrong i dont know?

-------------------------------------------------------------------------
This SF.net email is sponsored by DB2 Express
Download DB2 Express C - the FREE version of DB2 express and take
control of your XML. No limits. Just data. Click to get it now.
http://sourceforge.net/powerbar/db2/
_______________________________________________
[email protected]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.