阅读:2406回复:3
USB驱动关于读数据的问题
请教各位大大:
我在做Linux下的USB驱动,利用骨架程序修改生成自己的一个驱动 由于骨架程序中的端点类型是bulk的,而我的USB设备是interrupt类型的,所以我就修改了其中关于这一部分的代码,写操作现在可以了,但是对于读操作还存在一个问题: 就是,我在读操作时,fill了一个urb,然后把它submit,如下: usb_fill_int_urb( urb, dev->udev, usb_rcvintpipe(dev->udev, dev->interrupt_in_endpointAddr), dev->interrupt_in_buffer, bytes_read, my_read_interrupt_callback, dev, 250 /*dev->interrupt_out_interval*/ ); retval = usb_submit_urb(urb, GFP_KERNEL); 随后,把读到的数据拷贝到用户缓冲区 if(!retval) { if (copy_to_user(buffer, dev->interrupt_in_buffer, bytes_read)) { retval = -EFAULT; } else { retval = bytes_read; } } 但是,应用程序没有收到这些数据。 于是,我在回调函数中my_read_interrupt_callback将收到的数据打印出来,发现确实是收到了,如下: static void my_read_interrupt_callback(struct urb *urb, struct pt_regs *regs) { // For debug char *tmpDbg; struct usb_yport *dev; dev = (struct usb_yport *)urb->context; // For debug tmpDbg= (char*)(urb->transfer_buffer); /* sync/async unlink faults aren't errors */ if ( urb->status && !(urb->status == -ENOENT || urb->status == -ECONNRESET || urb->status == -ESHUTDOWN) ) { dbg("%s - nonzero read interrupt status received: %d", __FUNCTION__, urb->status); } else { printk(KERN_ALERT "\n status is "); printk("%d\n", urb->status); } printk(KERN_ALERT "\n device buffer(callback): %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X \n", tmpDbg[0], tmpDbg[1], tmpDbg[2], tmpDbg[3], tmpDbg[4], tmpDbg[5], tmpDbg[6], tmpDbg[7], tmpDbg[8], tmpDbg[9], tmpDbg[10], tmpDbg[11], tmpDbg[12], tmpDbg[13], tmpDbg[14], tmpDbg[15] ); 这就是我的问题: 为什么在回调函数中收到了数据,但是无法传输给应用程序? 我该如何传输给应用程序? 谢谢大大们!! |
|
沙发#
发布于:2007-11-19 09:09
读操作我行,写操作我有点问题加我QQ联系:
419309040 |
|
板凳#
发布于:2007-11-19 09:11
读操作我行,写操作我有点问题加我QQ联系:
419309040 |
|
地板#
发布于:2007-11-19 09:14
读的话我没有问题,加我QQ:419309040&&MSN:lyqx888@hotmail.com
|
|
地下室#
发布于:2007-11-19 10:49
还是没人回,这个论坛的人好少。。。
|
|
5楼#
发布于:2007-11-19 15:58
既然你在回调函数能够得到,就应该在回调函数中想办法送到应用层。
你要判断usb_submit_urb返回值,如果是pending的话就应该在回调中发送数据。 注意回调应该不包含应用上下文中,所以需要保存上下文信息。 或者在read中等待,如果callback受到数据,就唤醒,把数据copy到应用空间。 |
|
|
6楼#
发布于:2007-11-19 16:01
写了好多,都没有了,白写了 。
简单说,你要判断ret返回值,然后再决定是否copy到应用空间。如果返回值是pending,就需要在callback中返回数据到应用层。 注意:callback应该不再应用上下文中,所以想办法解决这个问题。 提供一个方法: read后如pending,就waiting, 然后callback唤醒并把数据copy到应用层. |
|
|
7楼#
发布于:2007-11-19 16:01
写了好多,都没有了,白写了 。
简单说,你要判断ret返回值,然后再决定是否copy到应用空间。如果返回值是pending,就需要在callback中返回数据到应用层。 注意:callback应该不再应用上下文中,所以想办法解决这个问题。 提供一个方法: read后如pending,就waiting, 然后callback唤醒并把数据copy到应用层. |
|
|
8楼#
发布于:2007-11-20 11:32
解决了。
原来interrupt端点也可以使用函数usb_bulk_msg。 |
|
9楼#
发布于:2007-11-20 11:40
刚才没看到楼上兄弟的回答
在这感谢你! 谢谢 |
|