• usb学习笔记


    框架

    在这里插入图片描述
    usb 驱动是基于usb core 的,设备插上之后,host 层自然会进行识别,设备驱动通过core层的接口操作设备,而不用直接面对usb硬件。对于应用层需要封装成一个usb 的设备。
    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述在这里插入图片描述
    在这里插入图片描述

    驱动是基于urb 数据进行操作的。

    在这里插入图片描述

     49 static void usb_mouse_irq(struct urb *urb)
     50 {   
     51     struct usb_mouse *mouse = urb->context;
     52     signed char *data = mouse->data;
     53     struct input_dev *dev = mouse->dev;
     54     int status;
     55     
     56     switch (urb->status) {
     57     case 0:         /* success */
     58         break;
     59     case -ECONNRESET:   /* unlink */
     60     case -ENOENT:
     61     case -ESHUTDOWN:
     62         return;
     63     /* -EPIPE:  should clear the halt */
     64     default:        /* error */
     65         goto resubmit;
     66     }
     67     
     68     input_report_key(dev, BTN_LEFT,   data[0] & 0x01);
     69     input_report_key(dev, BTN_RIGHT,  data[0] & 0x02);
     70     input_report_key(dev, BTN_MIDDLE, data[0] & 0x04);
     71     input_report_key(dev, BTN_SIDE,   data[0] & 0x08);
     72     input_report_key(dev, BTN_EXTRA,  data[0] & 0x10);
     73     
     74     input_report_rel(dev, REL_X,     data[1]);
     75     input_report_rel(dev, REL_Y,     data[2]);
     76     input_report_rel(dev, REL_WHEEL, data[3]);
     77     
     78     input_sync(dev);
    ... 
    }
    106 static int usb_mouse_probe(struct usb_interface *intf, const struct usb_device_id *id)
    107 {
    111     struct usb_mouse *mouse;
    112     struct input_dev *input_dev;
    137     mouse->irq = usb_alloc_urb(0, GFP_KERNEL);
    138     if (!mouse->irq)
    139         goto fail2;
    175     input_set_drvdata(input_dev, mouse);
    180     usb_fill_int_urb(mouse->irq, dev, pipe, mouse->data,
    181              (maxp > 8 ? 8 : maxp),
    182              usb_mouse_irq, mouse, endpoint->bInterval);
    186     error = input_register_device(mouse->dev);
    187     if (error)
    188         goto fail3;
    ...
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
  • 相关阅读:
    Docker入门
    Java多线程
    你一定可以读懂的Linux中的变量、数组、和算数运算与测试看这篇就足够了
    vue部署相关
    Elasticsearch 8.9 Bulk批量给索引增加数据源码
    机器学习实战:Python基于GBM梯度提升机进行预测(十四)
    LeetCode 535(C#)
    Java网络编程
    算力,承载AI无限可能
    ps命令应用(查看进程)
  • 原文地址:https://blog.csdn.net/qq_27087571/article/details/132818591