LinuxUSB鼠标驱动程序
来源:优易学  2010-1-19 17:42:40   【优易学:中国教育考试门户网】   资料下载   IT书店

 

  120. /*

  121. * 打开鼠标设备时,开始提交在 probe 函数中构建的 urb,进入 urb 周期。

  122. */

  123. static int usb_mouse_open(struct input_dev *dev)

  124. {

  125.     struct usb_mouse *mouse = dev->private;

  126.     mouse->irq->dev = mouse->usbdev;

  127.     if (usb_submit_urb(mouse->irq, GFP_KERNEL))

  128.         return -EIO;

  129.     return 0;

  130. }

  131. /*

  132. * 关闭鼠标设备时,结束 urb 生命周期。

  133. */

  134. static void usb_mouse_close(struct input_dev *dev)

  135. {

  136.     struct usb_mouse *mouse = dev->private;

  137.     usb_kill_urb(mouse->irq);

  138. }

  139. /*

  140. * 驱动程序的探测函数

  141. */

  142. static int usb_mouse_probe(struct usb_interface *intf, const struct usb_device_id *id)

  143. {

  144.     /*

  145.      * 接口结构体包含于设备结构体中,interface_to_usbdev 是通过接口结构体获得它的设备结构体。

  146.      * usb_host_interface 是用于描述接口设置的结构体,内嵌在接口结构体 usb_interface 中。

  147.      * usb_endpoint_descriptor 是端点描述符结构体,内嵌在端点结构体 usb_host_endpoint 中,而端点

  148.      * 结构体内嵌在接口设置结构体中。

  149.      */

  150.     struct usb_device *dev = interface_to_usbdev(intf);

  151.     struct usb_host_interface *interface;

  152.     struct usb_endpoint_descriptor *endpoint;

  153.     struct usb_mouse *mouse;

  154.     struct input_dev *input_dev;

  155.     int pipe, maxp;

  156.     interface = intf->cur_altsetting;

  157.     /* 鼠标仅有一个 interrupt 类型的 in 端点,不满足此要求的设备均报错 */

  158.     if (interface->desc.bNumEndpoints != 1)

  159.         return -ENODEV;

  160.     endpoint = &interface->endpoint[0].desc;

  161.     if (!usb_endpoint_is_int_in(endpoint))

  162.         return -ENODEV;

  163.     /*

  164.      * 返回对应端点能够传输的最大的数据包,鼠标的返回的最大数据包为4个字节,数据包具体内容在 urb

  165.      * 回调函数中有详细说明。

  166.      */

  167.     pipe = usb_rcvintpipe(dev, endpoint->bEndpointAddress);

  168.     maxp = usb_maxpacket(dev, pipe, usb_pipeout(pipe));

  169.     /* 为 mouse 设备结构体分配内存 */

  170.     mouse = kzalloc(sizeof(struct usb_mouse), GFP_KERNEL);

  171.     /* input_dev */

  172.     input_dev = input_allocate_device();

  173.     if (!mouse || !input_dev)

  174.         goto fail1;

  175.     /*

  176.      * 申请内存空间用于数据传输,data 为指向该空间的地址,data_dma 则是这块内存空间的 dma 映射,

  177.      * 即这块内存空间对应的 dma 地址。在使用 dma 传输的情况下,则使用 data_dma 指向的 dma 区域,

  178.      * 否则使用 data 指向的普通内存区域进行传输。

  179.      * GFP_ATOMIC 表示不等待,GFP_KERNEL 是普通的优先级,可以睡眠等待,由于鼠标使用中断传输方式,

  180.      * 不允许睡眠状态,data 又是周期性获取鼠标事件的存储区,因此使用 GFP_ATOMIC 优先级,如果不能

  181.      * 分配到内存则立即返回 0。

  182.      */

  183.     mouse->data = usb_buffer_alloc(dev, 8, GFP_ATOMIC, &mouse->data_dma);

  184.     if (!mouse->data)

  185.         goto fail1;

  186.     /*

  187.      * 为 urb 结构体申请内存空间,第一个参数表示等时传输时需要传送包的数量,其它传输方式则为0。

  188.      * 申请的内存将通过下面即将见到的 usb_fill_int_urb 函数进行填充。

  189.      */

  190.     mouse->irq = usb_alloc_urb(0, GFP_KERNEL);

  191.     if (!mouse->irq)

  192.         goto fail2;

  193.     /* 填充 usb 设备结构体和输入设备结构体 */

  194.     mouse->usbdev = dev;

  195.     mouse->dev = input_dev;

  196.     /* 获取鼠标设备的名称 */

  197.     if (dev->manufacturer)

  198.         strlcpy(mouse->name, dev->manufacturer, sizeof(mouse->name));

  199.     if (dev->product)

  200.     {

  201.         if (dev->manufacturer)

  202.             strlcat(mouse->name, " ", sizeof(mouse->name));

  203.         strlcat(mouse->name, dev->product, sizeof(mouse->name));

  204.     }

  205.     if (!strlen(mouse->name))

  206.         snprintf(mouse->name, sizeof(mouse->name),

  207.              "USB HIDBP Mouse %04x:%04x",

  208.              le16_to_cpu(dev->descriptor.idVendor),

  209.              le16_to_cpu(dev->descriptor.idProduct));

上一页  [1] [2] [3] [4] [5] 下一页

责任编辑:小草

文章搜索:
 相关文章
热点资讯
热门课程培训