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

 

  210.     /*

  211.      * 填充鼠标设备结构体中的节点名。usb_make_path 用来获取 USB 设备在 Sysfs 中的路径,格式

  212.      * 为:usb-usb 总线号-路径名。

  213.      */

  214.     usb_make_path(dev, mouse->phys, sizeof(mouse->phys));

  215.     strlcat(mouse->phys, "/input0", sizeof(mouse->phys));

  216.     /* 将鼠标设备的名称赋给鼠标设备内嵌的输入子系统结构体 */

  217.     input_dev->name = mouse->name;

  218.     /* 将鼠标设备的设备节点名赋给鼠标设备内嵌的输入子系统结构体 */

  219.     input_dev->phys = mouse->phys;

  220.     /*

  221.      * input_dev 中的 input_id 结构体,用来存储厂商、设备类型和设备的编号,这个函数是将设备描述符

  222.      * 中的编号赋给内嵌的输入子系统结构体

  223.      */

  224.     usb_to_input_id(dev, &input_dev->id);

  225.     /* cdev 是设备所属类别(class device) */

  226.     input_dev->cdev.dev = &intf->dev;

  227.     /* evbit 用来描述事件,EV_KEY 是按键事件,EV_REL 是相对坐标事件 */

  228.     input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_REL);

  229.     /* keybit 表示键值,包括左键、右键和中键 */

  230.     input_dev->keybit[LONG(BTN_MOUSE)] = BIT(BTN_LEFT) | BIT(BTN_RIGHT) | BIT(BTN_MIDDLE);

  231.     /* relbit 用于表示相对坐标值 */

  232.     input_dev->relbit[0] = BIT(REL_X) | BIT(REL_Y);

  233.     /* 有的鼠标还有其它按键 */

  234.     input_dev->keybit[LONG(BTN_MOUSE)] |= BIT(BTN_SIDE) | BIT(BTN_EXTRA);

  235.     /* 中键滚轮的滚动值 */

  236.     input_dev->relbit[0] |= BIT(REL_WHEEL);

  237.     /* input_dev 的 private 数据项用于表示当前输入设备的种类,这里将鼠标结构体对象赋给它 */

  238.     input_dev->private = mouse;

  239.     /* 填充输入设备打开函数指针 */

  240.     input_dev->open = usb_mouse_open;

  241.     /* 填充输入设备关闭函数指针 */

  242.     input_dev->close = usb_mouse_close;

  243.     /*

  244.      * 填充构建 urb,将刚才填充好的 mouse 结构体的数据填充进 urb 结构体中,在 open 中递交 urb。

  245.      * 当 urb 包含一个即将传输的 DMA 缓冲区时应该设置 URB_NO_TRANSFER_DMA_MAP。USB核心使用

  246.      * transfer_dma变量所指向的缓冲区,而不是transfer_buffer变量所指向的。

  247.      * URB_NO_SETUP_DMA_MAP 用于 Setup 包,URB_NO_TRANSFER_DMA_MAP 用于所有 Data 包。

  248.      */

  249.     usb_fill_int_urb(mouse->irq, dev, pipe, mouse->data,

  250.              (maxp > 8 ? 8 : maxp),

  251.              usb_mouse_irq, mouse, endpoint->bInterval);

  252.     mouse->irq->transfer_dma = mouse->data_dma;

  253.     mouse->irq->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;

  254.     /* 向系统注册输入设备 */

  255.     input_register_device(mouse->dev);

  256.     /*

  257.      * 一般在 probe 函数中,都需要将设备相关信息保存在一个 usb_interface 结构体中,以便以后通过

  258.      * usb_get_intfdata 获取使用。这里鼠标设备结构体信息将保存在 intf 接口结构体内嵌的设备结构体中

  259.      * 的 driver_data 数据成员中,即 intf->dev->dirver_data = mouse。

  260.      */

  261.     usb_set_intfdata(intf, mouse);

  262.     return 0;

  263. fail2: usb_buffer_free(dev, 8, mouse->data, mouse->data_dma);

  264. fail1: input_free_device(input_dev);

  265.     kfree(mouse);

  266.     return -ENOMEM;

  267. }

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

责任编辑:小草

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