usb鼠标驱动注解及测试

[11-20 15:53:39]   来源:http://www.88dzw.com  arm嵌入式   阅读:8872

文章摘要:}if (!ep)return 0;/* NOTE:? only 0x07ff bits are for packet size... */return le16_to_cpu(ep->desc.wMaxPacketSize);}*///返回对应端点能够传输的最大的数据包,鼠标的返回的最大数据包为4个字节,第0个字节:bit 0、1、2、3、4分别代表左、右、中、SIDE、EXTRA键的按下情况第1个字节:表示鼠标的水平位移第2个字节:表示鼠标的垂直位移第3个字节:REL_WHEEL位移if (!(mouse = kmalloc(sizeof(struct usb_mouse), GFP

usb鼠标驱动注解及测试,标签:arm嵌入式系统,arm系统,http://www.88dzw.com

  }

  if (!ep)

  return 0;

  /* NOTE:? only 0x07ff bits are for packet size... */

  return le16_to_cpu(ep->desc.wMaxPacketSize);

  }

  */

  //返回对应端点能够传输的最大的数据包,鼠标的返回的最大数据包为4个字节,

  第0个字节:bit 0、1、2、3、4分别代表左、右、中、SIDE、EXTRA键的按下情况

  第1个字节:表示鼠标的水平位移

  第2个字节:表示鼠标的垂直位移

  第3个字节:REL_WHEEL位移

  if (!(mouse = kmalloc(sizeof(struct usb_mouse), GFP_KERNEL)))

  return -ENOMEM;

  memset(mouse, 0, sizeof(struct usb_mouse));

  mouse->data = usb_buffer_alloc(dev, 8, SLAB_ATOMIC, &mouse->data_dma);

  /*

  申请用于urb用于数据传输的内存,注意:这里将返回“mouse->data”和“mouse->data_dma”

  mouse->data:记录了用于普通传输用的内存指针

  mouse->data_dma:记录了用于DMA传输的内存指针

  如果是DMA 方式的传输,那么usb core 就应该使用mouse->data_dma

  */

  if (!mouse->data) {

  kfree(mouse);

  return -ENOMEM;

  }

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

  if (!mouse->irq) {

  usb_buffer_free(dev, 8, mouse->data, mouse->data_dma);

  kfree(mouse);

  return -ENODEV;

  }

  mouse->usbdev = dev;

  mouse->dev.evbit[0] = BIT(EV_KEY) | BIT(EV_REL);

  //设置input系统响应按键和REL(相对结果)事件

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

  mouse->dev.relbit[0] = BIT(REL_X) | BIT(REL_Y);

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

  mouse->dev.relbit[0] |= BIT(REL_WHEEL);

  //设置input系统响应的码表及rel表

  mouse->dev.private = mouse;

  mouse->dev.open = usb_mouse_open;

  mouse->dev.close = usb_mouse_close;

  usb_make_path(dev, path, 64);

  sprintf(mouse->phys, "%s/input0", path);

  mouse->dev.name = mouse->name;

  mouse->dev.phys = mouse->phys;

  usb_to_input_id(dev, &mouse->dev.id);

  /*

  usb_to_input_id(const struct usb_device *dev, struct input_id *id)

  {

  id->bustype = BUS_USB;

  id->vendor = le16_to_cpu(dev->descriptor.idVendor);

  id->product = le16_to_cpu(dev->descriptor.idProduct);

  id->version = le16_to_cpu(dev->descriptor.bcdDevice);

  }

  struct usb_device 中有一个成员struct usb_device_descriptor,而struct usb_device_descriptor 中的成员__u16 bcdDevice,表示的是制造商指定的产品的版本号,制造商id 和产品id 来标志一个设备.bcdDevice 一共16 位,是以bcd码的方式保存的信息,也就是说,每4 位代表一个十进制的数,比如0011 0110 1001 0111 就代表的3697.

  业内为每家公司编一个号,这样便于管理,比如三星的编号就是0x0839,那么三星的产品中就会在其设备描述符中idVendor 的烙上0x0839.而三星自己的每种产品也会有个编号,和Digimax 410 对应的编号就是0x000a,而bcdDevice_lo 和bcdDevice_hi 共同组成一个具体设备的编号(device release

  number),bcd 就意味着这个编号是二进制的格式.

  */

  mouse->dev.dev = &intf->dev;

  if (dev->manufacturer)

  strcat(mouse->name, dev->manufacturer);

  if (dev->product)

  sprintf(mouse->name, "%s %s", mouse->name, dev->product);

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


Tag:arm嵌入式arm嵌入式系统,arm系统arm嵌入式

《usb鼠标驱动注解及测试》相关文章

分类导航
最新更新
热门排行