首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >360游戏控制器Linux设备驱动程序调用我的探测函数的问题

360游戏控制器Linux设备驱动程序调用我的探测函数的问题
EN

Stack Overflow用户
提问于 2012-03-27 05:11:07
回答 3查看 1.3K关注 0票数 0

我正在尝试学习USB Linux设备驱动程序。我选择了微软的Xbox360控制器。我注意到有一个用于Linux的通用驱动程序(xpad.ko)。不用说,我的代码是基于xpad.c的。无论如何,我构建了我的驱动程序(360.ko)。当前驱动程序(xpad,led_class,甚至usbhid)上的modprobe -r。还包括列入黑名单的xpad驱动程序。撞到了我的司机(360.ko)。USBcore注册我的驱动程序(usbcore:注册的新接口驱动程序微软Xbox360控制器)。但是,它不会调用我的usb_360_probe()。有线索吗?

代码语言:javascript
复制
static struct usb_driver uDriver = {
     .name =         "Microsoft Xbox 360 Controller",
     .probe =        usb_360_probe,
     .disconnect =   usb_360_disconnect,
     .id_table =     skel_table,

};

#define USB_360_VENDOR_ID 0x045E
#define USB_360_PRODUCT_ID 0x0202//0x0289//0x028E //I tried all these product IDs!

static struct usb_device_id skel_table[] = {
 { USB_DEVICE(USB_360_VENDOR_ID, USB_360_PRODUCT_ID) },
 {},
 };

static int usb_360_probe(struct usb_interface *intf, const struct usb_device_id*id)
{
printk(KERN_INFO, "(360)usb_360_probe.\n");

}

static int __init usb_360_init(void)
{
int result;

printk(KERN_INFO, "(360)usb_360_init.\n");

/* register this driver with the USB subsystem */
 result = usb_register(&uDriver);
 if (result)
 {
    printk(KERN_INFO, "(360)usb_register failed.\n");
 }

  printk(KERN_INFO, "(360)usb_register succeeded.\n");

 return result;
 }

static void __exit usb_360_exit(void)
{


/* deregister this driver with the USB subsystem */
usb_deregister(&uDriver);
printk(KERN_INFO, "(360)usb_unregister succeeded.\n");
}

module_init(usb_360_init);
module_exit(usb_360_exit);

//我使用printk(KERN_INFO)来处理dmesg消息。它适用于我的其他字符驱动程序。

内核:2.6.32-21-通用

EN

回答 3

Stack Overflow用户

发布于 2012-03-28 18:41:38

当找到使用给定的供应商id产品id插入的设备时,将调用您的探测函数。你有那个设备吗?插入了吗?

票数 1
EN

Stack Overflow用户

发布于 2012-03-27 13:49:11

在哪里启动cdev结构?根据我的经验,我基本上只是创建了一个cdev结构,然后告诉内核它。您的file_operations结构负责调用该函数。我在你的驱动程序中没有看到任何这样的结构。现在我还是个写驱动程序的新手,但我知道所有的驱动程序都需要初始化cdev结构、file_operation结构和打开文件结构才能做任何事情。有一本书对我帮助很大,那就是免费的pdf,你可以在谷歌上搜索linux设备驱动程序第三版。也许这对你有帮助。祝好运。

票数 0
EN

Stack Overflow用户

发布于 2012-03-29 01:20:05

伙计们我找到解决方案了。vedasolutions是对的。产品Id错误。只要我更改了产品id,就会调用probe()。此外,我必须提高日志记录级别才能看到我的消息。为了简单起见,我只去掉了printk中的KERN_INFO,它将所有消息记录在dmesg中。不管怎样,谢谢你。

然而,我有另一个问题:(。现在,我的探测器被多次调用。4次,并导致空指针异常。探测器似乎失败了,因此它正在重试再次探测。这是dmesg的日志->

代码语言:javascript
复制
(360)usb_360_init.
[410803.812983] usbcore: registered new interface driver Microsoft Xbox 360 Controller
[410803.813017] (360)usb_register succeeded.
[410816.146730] usb 2-1: new full speed USB device using uhci_hcd and address 9
[410816.318924] usb 2-1: configuration #1 chosen from 1 choice
[410816.332264] (360)usb_360_probe.
[410816.332281] (360)usb_360_probe device found!!.
[input: 360 as /devices/pci0000:00/0000:02:00.0/usb2/2-1/2-1.0/input/input4
[410816.372435] (360)probe succeeded.
[410816.372509] Microsoft Xbox 360 Controller: probe of 2-1:1.0 failed with error 1
[410816.372624] (360)usb_360_probe.
[410816.372626] (360)usb_360_probe device found!!.
input: 360 as /devices/pci0000:00/0000:02:00.0/usb2/2-1/2- 1:1.1/input/input5
[410816.372739] (360)probe succeeded.
[410816.372748] Microsoft Xbox 360 Controller: probe of 2-1:1.1 failed with error 1
[410816.374083] (360)usb_360_probe.
[410816.374088] (360)usb_360_probe device found!!.
input: 360 as /devices/pci0000:00/0000:02:00.0/usb2/2-1/2-1:1.2/input/input6
[410816.374852] (360)probe succeeded.
[410816.374871] Microsoft Xbox 360 Controller: probe of 2-1:1.2 failed with error 1
[410816.378827] (360)usb_360_probe.
[410816.379168] (360)usb_360_probe device found!!.
[410816.380925] BUG: unable to handle kernel NULL pointer dereference at 00000006
[410816.380967] IP: [<f84ae438>] usb_360_probe+0x1a8/0x318 [360]
[410816.381485] *pde = bf838067 
[410816.381601] Oops: 0000 [#1] SMP 
[410816.381643] last sysfs file:        [410816.382272] Pid: 44, comm: khubd Not tainted     

(2.6.32-21-generic #32-Ubuntu) VMware Virtual Platform

lsusb -v显示:

/*总线002设备003: ID 045e:028e微软公司Xbox360控制器

设备描述符: bLength 18 bDescriptorType 1 bcdUSB 2.00 bDeviceClass 255供应商特定类bDeviceSubClass 255供应商特定子类bDeviceProtocol 255供应商特定协议bMaxPacketSize0 8 idVendor 0x045e微软公司idProduct 0x028e Xbox360控制器bcdDevice 1.14 iManufacturer 1 iProduct 2iSerial 3 bNumConfigurations 1配置描述符: bLength 9 bDescriptorType 2 wTotalLength 153 bNumInterfaces 4 bConfigurationValue 1 iConfiguration 0 bmAttributes 0xa0 (总线供电)远程唤醒MaxPower 500 Bus接口描述符: bLength 9bDescriptorType 4 bInterfaceNumber 0 bAlternateSetting 0 bNumEndpoints 2 bInterfaceClass 255供应商特定类别bInterfaceSubClass 93 bInterfaceProtocol 1 iInterface 0 **无法识别: 11 21 00 01 01 25 81 14 00 00 00 13 01 08 00 00 (PROBLEM??????!!!)端点描述符:bLength 7 bDescriptorType 5 bEndpointAddress 0x81 EP 1 IN bmAttributes 3传输类型中断同步类型无使用类型数据wMaxPacketSize 0x0020 1x 32字节bInterval 4 */

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9879941

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档