微波EDA网,见证研发工程师的成长!
首页 > 测试测量 > 测试测量技术文库 > usb鼠标驱动注解及测试

usb鼠标驱动注解及测试

时间:10-12 来源:互联网 点击:

pipein(pipe));

  ep = udev->ep_out[epnum];

  } else {

  WARN_ON(usb_pipeout(pipe));

  ep = udev->ep_in[epnum];

  }

  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);

  if (!strlen(mouse->name))

  sprintf(mouse->name, "USB HIDBP Mouse %04x:%04x",

  mouse->dev.id.vendor, mouse->dev.id.product);

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

  (maxp > 8 ? 8 : maxp),

  usb_mouse_irq, mouse, endpoint->bInterval);

  /*

  static inline void usb_fill_int_urb (struct urb *urb,

  struct usb_device *dev,

  unsigned int pipe,

  void *transfer_buffer,

  int buffer_length,

  usb_complete_t complete,

  void *context,

  int interval)

  {

  spin_lock_init(urb->lock);

  urb->dev = dev;

  urb->pipe = pipe;

  urb->transfer_buffer = transfer_buffer;//如果不使用DMA传输方式,则使用这个缓冲指针。如何用DMA则使用transfer_DMA,这个值会在后面单独给URB赋

  urb->transfer_buffer_length = buffer_length;

  urb->complete = complete;

urb->context = conte

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top