Linux kernel USB_get_intfdata方法后Linux USB驱动程序崩溃
我正在为USB设备编写自己的字符驱动程序,该设备需要使用ctrl传输进行简单的写入,使用中断传输进行读取。我的设备有2个接口,对于zero接口,我可以得到中断端点,所以基本上我不需要处理第二个接口,它包含bulk,ISCO,所以当bInterfaceNumber为1时,我从probe函数返回-ENODEV。下面是代码片段Linux kernel USB_get_intfdata方法后Linux USB驱动程序崩溃,linux-kernel,linux-device-driver,Linux Kernel,Linux Device Driver,我正在为USB设备编写自己的字符驱动程序,该设备需要使用ctrl传输进行简单的写入,使用中断传输进行读取。我的设备有2个接口,对于zero接口,我可以得到中断端点,所以基本上我不需要处理第二个接口,它包含bulk,ISCO,所以当bInterfaceNumber为1时,我从probe函数返回-ENODEV。下面是代码片段 static int USBTestMode_Probe(struct usb_interface *interface, const struct usb_device_id
static int USBTestMode_Probe(struct usb_interface *interface, const struct usb_device_id *id)
{
if(interface->cur_altsetting->desc.bInterfaceNumber != 0)
{
return -ENODEV;
}
struct usb_device *udev = interface_to_usbdev(interface);
struct usb_test_mode_dev * testModeDev = NULL;
struct usb_host_interface *iface_desc;
struct usb_endpoint_descriptor *endpoint;
int i, int_end_size;
int retval = -ENODEV;
TestModeclass.name = "testmode%d";
TestModeclass.fops = &USBTestModefops;
testModeDev = kzalloc(sizeof(struct usb_test_mode_dev),GFP_KERNEL);
strcpy(testModeDev->buffer , "mydata");
printk("size::%d\n", sizeof(struct usb_test_mode_dev));
printk("testModeDev size::%d\n", sizeof(testModeDev));
printk("name :%s\n",testModeDev->buffer);
if(testModeDev == NULL)
{
printk("No Memory ):");
goto exit;
}
testModeDev->udev = usb_get_dev(udev);
testModeDev->interface = interface;
iface_desc = interface->cur_altsetting;
testModeDev->int_in_endpoint = kzalloc(sizeof(struct usb_endpoint_descriptor),GFP_KERNEL);
for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) {
endpoint = &iface_desc->endpoint[i].desc;
if (((endpoint->bEndpointAddress & USB_ENDPOINT_DIR_MASK)
== USB_DIR_IN)
&& ((endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK)
== USB_ENDPOINT_XFER_INT))
memcpy(testModeDev->int_in_endpoint , endpoint ,sizeof(endpoint));
}
if (! testModeDev->int_in_endpoint) {
printk("could not find interrupt in endpoint");
goto error;
}
printk("endpoint packetSize :%d\n",testModeDev->int_in_endpoint->wMaxPacketSize);
printk("endpoint value :%d\n",testModeDev->int_in_endpoint->bEndpointAddress);
int_end_size = le16_to_cpu(testModeDev->int_in_endpoint->wMaxPacketSize);
testModeDev->int_in_buffer = kzalloc(int_end_size, GFP_KERNEL);
printk("endpoint packetSize :%d\n",testModeDev->int_in_endpoint->wMaxPacketSize);
printk("endpoint value :%d\n",testModeDev->int_in_endpoint->bEndpointAddress);
if (! testModeDev->int_in_buffer) {
printk("could not allocate int_in_buffer");
retval = -ENOMEM;
goto error;
}
testModeDev->int_in_urb = usb_alloc_urb(0, GFP_KERNEL);
if (! testModeDev->int_in_urb) {
printk("could not allocate int_in_urb");
retval = -ENOMEM;
goto error;
}
printk("endpoint packetSize :%d\n",testModeDev->int_in_endpoint->wMaxPacketSize);
printk("endpoint value :%d\n",testModeDev->int_in_endpoint->bEndpointAddress);
// Save our data pointer in this interface device.
usb_set_intfdata(interface, testModeDev);
printk("endpoint packetSize :%d\n",testModeDev->int_in_endpoint->wMaxPacketSize);
printk("endpoint value :%d\n",testModeDev->int_in_endpoint->bEndpointAddress);
// We can register the device now, as it is ready.
retval = usb_register_dev(interface, &TestModeclass);
if (retval) {
printk("not able to get a minor for this device.");
usb_set_intfdata(interface, NULL);
goto error;
}
testModeDev->minor = interface->minor;
printk("TestUSB now attached to /dev/TestMode%d\n",
interface->minor - 0);
error:
TestMode_delete(testModeDev);
exit:
return retval;
return 0;
}
当我试图访问端点中的dev->int\u时,模块崩溃,甚至缓冲区仍然是空的。为什么我的数据结构保存在probe中被覆盖。这是因为我的设备有多个接口。请帮帮我。如果你想要我的字符设备的数据结构,下面是代码
struct usb_test_mode_dev {
struct usb_device *udev;
unsigned char *int_in_buffer;
struct usb_interface *interface;
struct usb_endpoint_descriptor *int_in_endpoint;
struct urb *int_in_urb;
unsigned char minor;
char buffer[20];
};
提前谢谢
usb_set_intfdata(interface, testModeDev); is at wrong place , should be called before return in probe method
usb_set_intfdata(interface, testModeDev); is at wrong place , should be called before return in probe method