C Linux USB驱动程序|使用USB_控件_msg()接收到错误

C Linux USB驱动程序|使用USB_控件_msg()接收到错误,c,linux,usb,driver,C,Linux,Usb,Driver,我是Linux驱动程序开发新手,到目前为止我非常喜欢它!然而,我遇到了一个问题,我无法解决它。我试图向我的设备发送一条GET_STATUS RequestType控制消息,并在数据变量中读回响应,然后打印出来,但是当我将usb_control_msg代码添加到探测函数时,我的Ubuntu虚拟机冻结了。当我将usb_control_msg代码添加到下面的open函数时,我在打开设备文件时收到一个错误(“消息太长”)。我只是想得到我的设备的状态,但是open函数似乎是我唯一可以插入usb_contr

我是Linux驱动程序开发新手,到目前为止我非常喜欢它!然而,我遇到了一个问题,我无法解决它。我试图向我的设备发送一条GET_STATUS RequestType控制消息,并在数据变量中读回响应,然后打印出来,但是当我将usb_control_msg代码添加到探测函数时,我的Ubuntu虚拟机冻结了。当我将usb_control_msg代码添加到下面的open函数时,我在打开设备文件时收到一个错误(“消息太长”)。我只是想得到我的设备的状态,但是open函数似乎是我唯一可以插入usb_control_msg代码的地方,而不用冻结我的ubuntuvm。我是否误解了usb_control_msg函数的工作原理

非常感谢你的帮助

代码:

static int xb1\u打开(结构索引节点*索引节点,结构文件*文件){
printk(KERN_INFO“打开函数调用…”);
结构xb1_控制器*dev;
结构usb_接口*接口;
int subminor;
int-retval=0;
subminor=iminor(inode);
接口=usb_查找_接口(&xb1_驱动程序,subminor);
if(!接口){
printk(KERN_INFO)“无法在open中找到接口
功能);
retval=-ENODEV;
转到出口;
}
dev=usb_get_intfdata(接口);
如果(!dev){
printk(KERN_INFO“无法在open中找到开发结构
功能);
retval=-ENODEV;
转到出口;
}
usb接口(dev->int\u-in\u-urb,dev->udev,usb接口管道(dev-
>udev,dev->int_in_endpoint->bEndpointAddress),
dev->int\u在\u缓冲区中,dev->int\u在\u端点中-
>wMaxPacketSize,xb1_int_in_回调,
dev,dev->int_in_endpoint->bInterval);
dev->int_in_running=1;
retval=usb\u submit\u urb(dev->int\u in\u urb,GFP\u内核);
如果(返回){
printk(内核信息“无法在打开的城市中提交int”
功能);
dev->int_in_running=0;
转到出口;
}
文件->私有_数据=dev;
u8数据[8];
retval=usb_控制消息(dev,usb_rcvctrlpipe(dev->udev,0),0x00,
0xa3、0x0000、0x0和数据、大小(数据),
5);
如果(返回值<0){
printk(内核信息“usb控制消息失败|返回=%d”,
检索);
}
否则{
printk(KERN_INFO“数据:%phC”,数据);
}
出口:
返回返回;
}

您同时使用usb\u submit\u urb和usb\u control\u msg,这是错误的。您需要使用任意一个,具体取决于上下文。

您同时使用usb\u submit\u urb和usb\u control\u msg,这是错误的。根据上下文,您需要使用任意一个

static int xb1_open(struct inode *inode, struct file *file) {

    printk(KERN_INFO "open function called..");

    struct xb1_controller *dev;
    struct usb_interface *interface;
    int subminor;
    int retval = 0;

    subminor = iminor(inode);

    interface = usb_find_interface(&xb1_driver, subminor);
    if(!interface) {
        printk(KERN_INFO "Unable to locate interface in open   
               function");
        retval = -ENODEV;
        goto exit;
    }

    dev = usb_get_intfdata(interface);
        if(!dev) {
            printk(KERN_INFO "Unable to locate dev structure in open   
                   function");
            retval = -ENODEV;
            goto exit;
        }

    usb_fill_int_urb(dev->int_in_urb, dev->udev, usb_rcvintpipe(dev- 
                 >udev, dev->int_in_endpoint->bEndpointAddress),
                 dev->int_in_buffer, dev->int_in_endpoint- 
                 >wMaxPacketSize, xb1_int_in_callback,
                 dev, dev->int_in_endpoint->bInterval);

    dev->int_in_running = 1;

    retval = usb_submit_urb(dev->int_in_urb, GFP_KERNEL);
    if(retval) {
        printk(KERN_INFO "Unable to submit int_in_urb in open 
               function");
        dev->int_in_running = 0;
        goto exit;
    }

    file->private_data = dev;

    u8 data[8];

    retval = usb_control_msg(dev, usb_rcvctrlpipe(dev->udev, 0), 0x00,   
                             0xa3, 0x0000, 0x0, &data, sizeof(data),  
                             5);
    if(retval < 0) {
        printk(KERN_INFO "usb_control_msg failed | Retval = %d", 
               retval);
    }
    else {
        printk(KERN_INFO "data: %phC", data);
    }

exit:
    return retval;
}