Как «общаться» с USB-устройством через мой модуль? - PullRequest
1 голос
/ 24 марта 2019

Я написал свой модуль для геймпада, подключенный через USB. Я уже проверил, что мой установленный модуль успешно обнаруживает мое устройство и даже вызывает метод «probe»:

    static struct usb_driver driver =
{
    .name = "Driver#1",
    .id_table = table,
    .probe = probe,
    .disconnect = disconnect,
};

Я также написал специальную функцию urb , которая должна "разговаривать" с моим устройством

usb_fill_int_urb(j->irq_in, udev,
             usb_rcvintpipe(udev, ep_irq_in->bEndpointAddress), //!
             j->idata, 32, irq_hh,
             j, ep_irq_in->bInterval); 

Но я не могу понять, как инициализировать действие irq_in. Я предполагаю, что мне нужно что-то нажать, и некоторая информация должна быть записана в j->idata. Я также сделал

usb_submit_urb(j->irq_in, GFP_KERNEL);

Но ничего не происходит! Зачем? Моя функция зондирования:

static void irq_hh(struct urb *urb)
{
    struct devicec *j = urb->context;/*В какую структура из всех процессов дб заполнена после приёма данных???*/
        char *data = j->idata;
    printk(KERN_INFO "irq_hh: %s", data);
}

static int probe(struct usb_interface *intf, const struct usb_device_id *id)
{
    struct usb_device *udev; //!
    struct usb_endpoint_descriptor *ep_irq_in;  

    int ep_irq_in_idx, error;
    printk(KERN_INFO "probe...%X",id->idVendor);
    j = kzalloc(sizeof(struct devicec), GFP_KERNEL);
    udev = interface_to_usbdev(intf);
    j->irq_in = usb_alloc_urb(0, GFP_KERNEL); 
    //--------------------------------------
    j->udev = udev;
    j->intf = intf;
    //--------------------------------------
    usb_make_path(udev, j->phys, sizeof(j->phys));
    strlcat(j->phys, "/input101", sizeof(j->phys));
    printk(KERN_INFO "%s",j->phys);

    ep_irq_in_idx = 0;
    ep_irq_in = &intf->cur_altsetting->endpoint[ep_irq_in_idx].desc;

    usb_fill_int_urb(j->irq_in, udev,
             usb_rcvintpipe(udev, ep_irq_in->bEndpointAddress), //!
             j->idata, 32, irq_hh,
             j, ep_irq_in->bInterval); 

    j->irq_in->transfer_dma = j->idata_dma;
    j->irq_in->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;

    error = usb_submit_urb(j->irq_in, GFP_KERNEL);

    printk(KERN_INFO "%d",error);

    return 0;
}
...