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