360 игровой контроллер проблема с драйвером устройства Linux при вызове функции моего зонда - PullRequest
0 голосов
/ 27 марта 2012

Я пытаюсь узнать драйвер устройства USB для Linux. Я выбрал контроллер MS XBOX 360. Я заметил, что есть универсальный драйвер (xpad.ko) для Linux. Излишне говорить, что мой код основан на xpad.c. В любом случае, я построил свой драйвер (360.ko). modprobe -r для текущего драйвера (xpad, led_class, даже usbhid). также в черный список драйвера xpad. Сделал insmod на моем драйвере (360.ko). USBcore регистрирует мой драйвер (usbcore: зарегистрирован новый драйвер интерфейса Microsoft Xbox 360 Controller). Тем не менее, он не вызывает мой usb_360_probe (). Любые подсказки ?????

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-generic

Ответы [ 3 ]

1 голос
/ 28 марта 2012

Ваша функция проверки будет вызвана, когда будет найдено устройство, вставленное с данным идентификатором продукта с идентификатором поставщика. У вас есть указанное устройство? Это вставлено?

0 голосов
/ 28 марта 2012

Ребята я нашел решение. vedasolutions был прав. Идентификатор продукта был неверным. Зонд () вызывается, как только я меняю идентификатор продукта. Кроме того, я должен повысить уровень регистрации, чтобы увидеть мое сообщение. Для простоты я просто вынул KERN_INFO в printk, который записывает все сообщения в dmesg. В любом случае спасибо.

Однако у меня есть еще одна проблема :(. Теперь мой зонд вызывается несколько раз. 4 раза, что приводит к исключению нулевого указателя. Похоже, что зонд не удался, поэтому он пытается повторить зонд снова. Вот лог dmesg ---->

(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 Microsoft Corp. Контроллер Xbox360

Дескриптор устройства: Длина 18 bDescriptorType 1 bcdUSB 2.00 bDeviceClass 255 Специальный класс поставщика bDeviceSubClass 255 Специальный подкласс поставщика Протокол bDeviceProtocol 255 для конкретного поставщика bMaxPacketSize0 8 idVendor 0x045e Microsoft Corp. idProduct 0x028e Контроллер Xbox360 bcdDevice 1.14 iManufacturer 1 iProduct 2 iSerial 3 bNumConfigurations 1 Дескриптор конфигурации: Длина 9 bDescriptorType 2 wTotalLength 153 bNumInterfaces 4 bConfigurationValue 1 iConfiguration 0 bmAttributes 0xa0 (Питание от шины) Удаленное пробуждение MaxPower 500 мА Дескриптор интерфейса: Длина 9 bDescriptorType 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 (ПРОБЛЕМА ?????? !!!) Описатель конечной точки: Длина 7 bDescriptorType 5 bEndpointAddress 0x81 EP 1 IN bmAttributes 3 Тип передачи Прерывание Тип синхронизации Нет Данные типа использования wMaxPacketSize 0x0020 1x 32 байта bInterval 4 * /

0 голосов
/ 27 марта 2012

Где вы инициируете структуру cdev? Исходя из моего опыта, я просто делаю структуру cdev, а затем рассказываю ядру об этом. Ваша структура file_operations отвечает за вызов функции. Я не вижу ни одной из этих структур в вашей программе драйверов. Теперь я довольно новичок в написании драйверов, но я знаю, что все драйверы должны инициировать структуру cdev, структуру file_operation и структуру открытого файла, чтобы что-то делать. Одна книга, которая мне очень помогает, - это бесплатный PDF-файл, в котором вы можете найти драйверы для устройств Google Linux 3-е издание. Может быть, это помогает. Удачи.

...