yushui213
驱动小牛
驱动小牛
  • 注册日期2006-04-17
  • 最后登录2016-01-09
  • 粉丝1
  • 关注0
  • 积分1015分
  • 威望115点
  • 贡献值0点
  • 好评度102点
  • 原创分0分
  • 专家分0分
阅读:2406回复:3

USB驱动关于读数据的问题

楼主#
更多 发布于:2007-11-18 15:45
请教各位大大:

我在做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]
);

这就是我的问题:
为什么在回调函数中收到了数据,但是无法传输给应用程序?
我该如何传输给应用程序?

谢谢大大们!!
lyqx888
驱动牛犊
驱动牛犊
  • 注册日期2007-03-16
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望37点
  • 贡献值0点
  • 好评度16点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2007-11-19 09:09
读操作我行,写操作我有点问题加我QQ联系:
419309040
lyqx888
驱动牛犊
驱动牛犊
  • 注册日期2007-03-16
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望37点
  • 贡献值0点
  • 好评度16点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2007-11-19 09:11
读操作我行,写操作我有点问题加我QQ联系:
419309040
lyqx888
驱动牛犊
驱动牛犊
  • 注册日期2007-03-16
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望37点
  • 贡献值0点
  • 好评度16点
  • 原创分0分
  • 专家分0分
地板#
发布于:2007-11-19 09:14
读的话我没有问题,加我QQ:419309040&&MSN:lyqx888@hotmail.com
yushui213
驱动小牛
驱动小牛
  • 注册日期2006-04-17
  • 最后登录2016-01-09
  • 粉丝1
  • 关注0
  • 积分1015分
  • 威望115点
  • 贡献值0点
  • 好评度102点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2007-11-19 10:49
还是没人回,这个论坛的人好少。。。
cyliu
论坛版主
论坛版主
  • 注册日期2003-06-13
  • 最后登录2014-04-11
  • 粉丝5
  • 关注0
  • 积分1238分
  • 威望2531点
  • 贡献值0点
  • 好评度577点
  • 原创分14分
  • 专家分10分
5楼#
发布于:2007-11-19 15:58
既然你在回调函数能够得到,就应该在回调函数中想办法送到应用层。

你要判断usb_submit_urb返回值,如果是pending的话就应该在回调中发送数据。

注意回调应该不包含应用上下文中,所以需要保存上下文信息。

或者在read中等待,如果callback受到数据,就唤醒,把数据copy到应用空间。
走走看看开源好 Solaris vs Linux
cyliu
论坛版主
论坛版主
  • 注册日期2003-06-13
  • 最后登录2014-04-11
  • 粉丝5
  • 关注0
  • 积分1238分
  • 威望2531点
  • 贡献值0点
  • 好评度577点
  • 原创分14分
  • 专家分10分
6楼#
发布于:2007-11-19 16:01
写了好多,都没有了,白写了 。

简单说,你要判断ret返回值,然后再决定是否copy到应用空间。如果返回值是pending,就需要在callback中返回数据到应用层。

注意:callback应该不再应用上下文中,所以想办法解决这个问题。

提供一个方法:

read后如pending,就waiting, 然后callback唤醒并把数据copy到应用层.
走走看看开源好 Solaris vs Linux
cyliu
论坛版主
论坛版主
  • 注册日期2003-06-13
  • 最后登录2014-04-11
  • 粉丝5
  • 关注0
  • 积分1238分
  • 威望2531点
  • 贡献值0点
  • 好评度577点
  • 原创分14分
  • 专家分10分
7楼#
发布于:2007-11-19 16:01
写了好多,都没有了,白写了 。

简单说,你要判断ret返回值,然后再决定是否copy到应用空间。如果返回值是pending,就需要在callback中返回数据到应用层。

注意:callback应该不再应用上下文中,所以想办法解决这个问题。

提供一个方法:

read后如pending,就waiting, 然后callback唤醒并把数据copy到应用层.
走走看看开源好 Solaris vs Linux
yushui213
驱动小牛
驱动小牛
  • 注册日期2006-04-17
  • 最后登录2016-01-09
  • 粉丝1
  • 关注0
  • 积分1015分
  • 威望115点
  • 贡献值0点
  • 好评度102点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2007-11-20 11:32
解决了。
原来interrupt端点也可以使用函数usb_bulk_msg。
yushui213
驱动小牛
驱动小牛
  • 注册日期2006-04-17
  • 最后登录2016-01-09
  • 粉丝1
  • 关注0
  • 积分1015分
  • 威望115点
  • 贡献值0点
  • 好评度102点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2007-11-20 11:40
刚才没看到楼上兄弟的回答

在这感谢你!
谢谢
游客

返回顶部