2017-11-04 15 views
0

私はUSBの初めです。私はusbドライバを学びたいと思います。私は既存のusbkbdコードでキーボードのコードをテストしています。現在私の意図は各キープレスで完全なコールバックを呼び出すことです。私はusbkbd、hid-genericをシステムから削除し、depmod edを削除しました。キーボードの各キーを押すたびにUSBデバイスが切断されます

各キーを押すたびに、デバイスが切断され、プローブがコールされているのにコールバックされていないことがdmesgでわかります。

INPUT:dmesgの:

[ 5846.796941] usb 2-2: new low-speed USB device number 47 using xhci_hcd 
[ 5846.935078] usb 2-2: New USB device found, idVendor=1a2c, idProduct=0002 
[ 5846.935082] usb 2-2: New USB device strings: Mfr=1, Product=2, SerialNumber=0 
[ 5846.935084] usb 2-2: Product: USB Keykoard 
[ 5846.935086] usb 2-2: Manufacturer: USB 
[ 5846.935290] usb 2-2: ep 0x81 - rounding interval to 64 microframes, ep desc says 80 microframes 
[ 5846.935297] usb 2-2: ep 0x82 - rounding interval to 64 microframes, ep desc says 80 microframes 
[ 5846.935718] usb_test: usb_kbd_probe : probe is called for kbd 
[ 5846.935722] usb_test: usb_kbd_probe : bNumEndpoints = 1,bInterfaceNumber = 0 
[ 5846.935725] usb_test: usb_kbd_probe : error = 0 
[ 5846.935727] usb_test: usb_kbd_probe : usb_fill_int_urb, bInterval = 10 
[ 5846.935803] usb_test: usb_kbd_probe : probe is called for kbd 
[ 5846.935805] usb_test: usb_kbd_probe : bNumEndpoints = 1,bInterfaceNumber = 1 
[ 5846.935807] usb_test: usb_kbd_probe : error = 0 
[ 5846.935809] usb_test: usb_kbd_probe : usb_fill_int_urb, bInterval = 10 
[ 5847.466506] usbcore: registered new interface driver usbhid 
[ 5847.466510] usbhid: USB HID core driver 

[ 6108.600030] usb 2-2: USB disconnect, device number 47 

[ 6109.384486] usb 2-2: new low-speed USB device number 48 using xhci_hcd 
[ 6109.578129] usb 2-2: New USB device found, idVendor=1a2c, idProduct=0002 
[ 6109.578133] usb 2-2: New USB device strings: Mfr=1, Product=2, SerialNumber=0 
[ 6109.578135] usb 2-2: Product: USB Keykoard 
[ 6109.578137] usb 2-2: Manufacturer: USB 
[ 6109.578284] usb 2-2: ep 0x81 - rounding interval to 64 microframes, ep desc says 80 microframes 
[ 6109.578291] usb 2-2: ep 0x82 - rounding interval to 64 microframes, ep desc says 80 microframes 
[ 6109.579300] usb_test: usb_kbd_probe : probe is called for kbd 
[ 6109.579313] usb_test: usb_kbd_probe : bNumEndpoints = 1,bInterfaceNumber = 0 
[ 6109.579321] usb_test: usb_kbd_probe : error = 0 
[ 6109.579322] usb_test: usb_kbd_probe : usb_fill_int_urb, bInterval = 10 
[ 6109.579453] usb_test: usb_kbd_probe : probe is called for kbd 
[ 6109.579456] usb_test: usb_kbd_probe : bNumEndpoints = 1,bInterfaceNumber = 1 
[ 6109.579460] usb_test: usb_kbd_probe : error = 0 
[ 6109.579461] usb_test: usb_kbd_probe : usb_fill_int_urb, bInterval = 10 

コードは次のとおりです。

#define DEBUG 
#include <linux/kernel.h> 
#include <linux/slab.h> 
#include <linux/module.h> 
#include <linux/init.h> 
#include <linux/usb/input.h> 
#include <linux/hid.h> 


MODULE_AUTHOR("XYZ"); 
MODULE_DESCRIPTION(""); 
MODULE_LICENSE("GPL"); 

struct usb_kbd { 
    struct usb_device *usbdev; 
    unsigned char old[8]; 
    struct urb *irq; 
    unsigned char newleds; 

    unsigned char *new; 
    dma_addr_t new_dma; 

    bool led_urb_submitted; 
}; 

static void usb_kbd_irq(struct urb *urb) 
{ 
    struct usb_kbd *kbd = urb->context; 
    int i; 
    pr_debug("usb_kbd_irq : compete is called\n"); 
    switch (urb->status) { 
     case 0:   /* success */ 
       break; 
     case -ECONNRESET: /* unlink */ 
     case -ENOENT: 
     case -ESHUTDOWN: 
     return; 

     default:  /* error */ 
       goto resubmit; 
    } 

resubmit: 
    if (usb_submit_urb (urb, GFP_ATOMIC)) 
     hid_err(urb->dev, "can't resubmit intr, %s-%s/input0, status %d", 
     kbd->usbdev->bus->bus_name, 
     kbd->usbdev->devpath, i); 
} 

static int usb_kbd_alloc_mem(struct usb_device *dev, struct usb_kbd *kbd) 
{ 
    if (!(kbd->irq = usb_alloc_urb(0, GFP_KERNEL))) 
     return -1; 
    if (!(kbd->new = usb_alloc_coherent(dev, 8, GFP_ATOMIC, &kbd->new_dma))) 
     return -2; 

    return 0; 
} 

static void usb_kbd_free_mem(struct usb_device *dev, struct usb_kbd *kbd) 
{ 
    usb_free_urb(kbd->irq); 
    usb_free_coherent(dev, 8, kbd->new, kbd->new_dma); 
} 

static int usb_kbd_probe(struct usb_interface *iface, 
      const struct usb_device_id *id) 
{ 
    struct usb_device *dev = interface_to_usbdev(iface); 
    struct usb_host_interface *interface; 
    struct usb_endpoint_descriptor *endpoint; 
    struct usb_kbd *kbd; 
    int i, pipe, maxp; 
    int error = -ENOMEM; 

    pr_debug("usb_kbd_probe : probe is called for kbd\n"); 
    interface = iface->cur_altsetting; 

    pr_debug("usb_kbd_probe : bNumEndpoints = %d,bInterfaceNumber = %d\n", 
    interface->desc.bNumEndpoints, 
    interface->desc.bInterfaceNumber); 
    if (interface->desc.bNumEndpoints != 1) 
     return -ENODEV; 

    endpoint = &interface->endpoint[0].desc; 
    if (!usb_endpoint_is_int_in(endpoint)) 
     return -ENODEV; 

    pipe = usb_rcvintpipe(dev, endpoint->bEndpointAddress); 
    maxp = usb_maxpacket(dev, pipe, usb_pipeout(pipe)); 

    kbd = kzalloc(sizeof(struct usb_kbd), GFP_KERNEL); 

    error = usb_kbd_alloc_mem(dev, kbd); 
    pr_debug("usb_kbd_probe : error = %d\n", error); 
    if (error < 0) { 
     pr_debug("usb_kbd_probe : falied to usb_kbd_alloc_mem\n"); 
     goto fail2; 
    } 

    kbd->usbdev = dev; 

    pr_debug("usb_kbd_probe : usb_fill_int_urb, bInterval = %d\n", 
     endpoint->bInterval); 

    usb_fill_int_urb(kbd->irq, dev, pipe, 
      kbd->new, (maxp > 8 ? 8 : maxp), 
      usb_kbd_irq, kbd, endpoint->bInterval); 

    // kbd->irq->transfer_dma = kbd->new_dma; 
    // kbd->irq->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; 

    usb_set_intfdata(iface, kbd); 
    return 0; 
fail2: 
    usb_kbd_free_mem(dev, kbd); 
    kfree(kbd); 
    return error; 
} 

static void usb_kbd_disconnect(struct usb_interface *intf) 
{ 
    struct usb_kbd *kbd = usb_get_intfdata (intf); 

    usb_set_intfdata(intf, NULL); 
    if (kbd) { 
     usb_kill_urb(kbd->irq); 
     usb_kbd_free_mem(interface_to_usbdev(intf), kbd); 
     kfree(kbd); 
    } 
} 

static struct usb_device_id usb_kbd_id_table [] = { 
    { USB_DEVICE(0x1a2c, 0x0002) }, 
    { USB_DEVICE(0x0000, 0x0538) }, 
    { }      /* Terminating entry */ 
}; 

MODULE_DEVICE_TABLE (usb, usb_kbd_id_table); 

static struct usb_driver usb_kbd_driver = { 
    .name =  "usbkbd_new", 
    .probe = usb_kbd_probe, 
    .disconnect = usb_kbd_disconnect, 
    .id_table = usb_kbd_id_table, 
}; 

module_usb_driver(usb_kbd_driver); 

任意の助けをいただければ幸いです。

コードは適切ですか?

どのように動作するはずですか?

キーを押すたびに切断する理由は何ですか?

おかげで、 プリタム

+0

どこかにケーブルや接続が緩んでいる可能性があります。 –

+0

私はこのケースをクロスチェックしました。しかし、私は、キーボードの各キーがUSBポートに接続されていることに気づいた、それは切断デバイスとプローブが呼び出されて表示されています。 – pritam

答えて

0

URBは、フィルアップした後に提出する必要があります。 タイムアウトが発生し、デバイスがコアから切断されています...

私が誤解している場合は、私に修正してください。

関連する問題