亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? usbserial.c

?? USB接口轉換成RS232接口驅動程序
?? C
?? 第 1 頁 / 共 4 頁
字號:

  /* pass on to the driver specific version of this function if it is
           available */
  if(serial->type->break_ctl) {
    serial->type->break_ctl(port, break_state);
  }
}

/*****************************************************************************
 * generic devices specific driver functions
 *****************************************************************************/
static int generic_open(struct usb_serial_port *port, struct file *filp)
{
  struct usb_serial *serial = port->serial;
  unsigned long     flags;
  int               result;

  if(port_paranoia_check(port, __FUNCTION__))
    return -ENODEV;

  MOD_INC_USE_COUNT;

  dbg(__FUNCTION__ " - port %d", port->number);

  spin_lock_irqsave(&port->port_lock, flags);

  ++port->open_count;

  if(!port->active) {
    port->active = 1;

    /* force low_latency on so that our tty_push actually forces the data through, 
		   otherwise it is scheduled, and with high data rates (like with OHCI) data
		   can get lost. */
    port->tty->low_latency = 1;

    /* if we have a bulk interrupt, start reading from it */
    if(serial->num_bulk_in) {
      /* Start reading from the device */
      FILL_BULK_URB(port->read_urb, serial->dev, usb_rcvbulkpipe(serial->dev, port->bulk_in_endpointAddress),
                    port->read_urb->transfer_buffer, port->read_urb->transfer_buffer_length,
                    ((serial->type->read_bulk_callback) ? serial->type->read_bulk_callback : generic_read_bulk_callback),
                    port);
      result = usb_submit_urb(port->read_urb);
      if(result)
        err(__FUNCTION__ " - failed resubmitting read urb, error %d", result);
    }
  }

  spin_unlock_irqrestore(&port->port_lock, flags);

  return 0;
}

static void generic_close(struct usb_serial_port *port, struct file *filp)
{
  struct usb_serial *serial = port->serial;
  unsigned long     flags;

  dbg(__FUNCTION__ " - port %d", port->number);

  spin_lock_irqsave(&port->port_lock, flags);

  --port->open_count;

  if(port->open_count <= 0) {
    /* shutdown any bulk reads that might be going on */
    if(serial->num_bulk_out)
      usb_unlink_urb(port->write_urb);
    if(serial->num_bulk_in)
      usb_unlink_urb(port->read_urb);

    port->active = 0;
    port->open_count = 0;
  }

  spin_unlock_irqrestore(&port->port_lock, flags);
  MOD_DEC_USE_COUNT;
}

static int generic_write(struct usb_serial_port *port, int from_user, const unsigned char *buf, int count)
{
  struct usb_serial *serial = port->serial;
  unsigned long     flags;
  int               result;

  dbg(__FUNCTION__ " - port %d", port->number);

  if(count == 0) {
    dbg(__FUNCTION__ " - write request of 0 bytes");
    return(0);
  }

  /* only do something if we have a bulk out endpoint */
  if(serial->num_bulk_out) {
    if(port->write_urb->status == -EINPROGRESS) {
      dbg(__FUNCTION__ " - already writing");
      return(0);
    }

    spin_lock_irqsave(&port->port_lock, flags);
    count = (count > port->bulk_out_size) ? port->bulk_out_size : count;

    usb_serial_debug_data(__FILE__, __FUNCTION__, count, buf);

    if(from_user) {
      copy_from_user(port->write_urb->transfer_buffer, buf, count);
    }
    else {
      memcpy(port->write_urb->transfer_buffer, buf, count);
    }

    /* set up our urb */
    FILL_BULK_URB(port->write_urb, serial->dev, usb_sndbulkpipe(serial->dev, port->bulk_out_endpointAddress),
                  port->write_urb->transfer_buffer, count,
                  ((serial->type->write_bulk_callback) ? serial->type->write_bulk_callback : generic_write_bulk_callback),
                  port);

    /* send the data out the bulk port */
    result = usb_submit_urb(port->write_urb);
    if(result) {
      err(__FUNCTION__ " - failed submitting write urb, error %d", result);
      spin_unlock_irqrestore(&port->port_lock, flags);
      return 0;
    }

    spin_unlock_irqrestore(&port->port_lock, flags);
    return(count);
  }

  /* no bulk out, so return 0 bytes written */
  return(0);
}

static int generic_write_room(struct usb_serial_port *port)
{
  struct usb_serial *serial = port->serial;
  int               room = 0;

  dbg(__FUNCTION__ " - port %d", port->number);

  if(serial->num_bulk_out)
    if(port->write_urb->status != -EINPROGRESS)
      room = port->bulk_out_size;

  dbg(__FUNCTION__ " - returns %d", room);
  return(room);
}

static int generic_chars_in_buffer(struct usb_serial_port *port)
{
  struct usb_serial *serial = port->serial;
  int               chars = 0;

  dbg(__FUNCTION__ " - port %d", port->number);

  if(serial->num_bulk_out)
    if(port->write_urb->status == -EINPROGRESS)
      chars = port->write_urb->transfer_buffer_length;

  dbg(__FUNCTION__ " - returns %d", chars);
  return(chars);
}

static void generic_read_bulk_callback(struct urb *urb)
{
  struct usb_serial_port  *port = (struct usb_serial_port *)urb->context;
  struct usb_serial       *serial = get_usb_serial(port, __FUNCTION__);
  struct tty_struct       *tty;
  unsigned char           *data = urb->transfer_buffer;
  int                     i;
  int                     result;

  dbg(__FUNCTION__ " - port %d", port->number);

  if(!serial) {
    dbg(__FUNCTION__ " - bad serial pointer, exiting");
    return;
  }

  if(urb->status) {
    dbg(__FUNCTION__ " - nonzero read bulk status received: %d", urb->status);
    return;
  }

  usb_serial_debug_data(__FILE__, __FUNCTION__, urb->actual_length, data);

  tty = port->tty;
  if(urb->actual_length) {
    for(i = 0; i < urb->actual_length; ++i) {
      /* if we insert more than TTY_FLIPBUF_SIZE characters, we drop them. */
      if(tty->flip.count >= TTY_FLIPBUF_SIZE) {
        tty_flip_buffer_push(tty);
      }

      /* this doesn't actually push the data through unless tty->low_latency is set */
      tty_insert_flip_char(tty, data[i], 0);
    }

    tty_flip_buffer_push(tty);
  }

  /* Continue trying to always read  */
  FILL_BULK_URB(port->read_urb, serial->dev, usb_rcvbulkpipe(serial->dev, port->bulk_in_endpointAddress),
                port->read_urb->transfer_buffer, port->read_urb->transfer_buffer_length,
                ((serial->type->read_bulk_callback) ? serial->type->read_bulk_callback : generic_read_bulk_callback),
                port);
  result = usb_submit_urb(port->read_urb);
  if(result)
    err(__FUNCTION__ " - failed resubmitting read urb, error %d", result);
}

static void generic_write_bulk_callback(struct urb *urb)
{
  struct usb_serial_port  *port = (struct usb_serial_port *)urb->context;
  struct usb_serial       *serial = get_usb_serial(port, __FUNCTION__);

  dbg(__FUNCTION__ " - port %d", port->number);

  if(!serial) {
    dbg(__FUNCTION__ " - bad serial pointer, exiting");
    return;
  }

  if(urb->status) {
    dbg(__FUNCTION__ " - nonzero write bulk status received: %d", urb->status);
    return;
  }

  queue_task(&port->tqueue, &tq_immediate);
  mark_bh(IMMEDIATE_BH);

  return;
}

#ifdef CONFIG_USB_SERIAL_GENERIC
static void generic_shutdown(struct usb_serial *serial)
{
  int i;

  dbg(__FUNCTION__);

  /* stop reads and writes on all ports */
  for(i = 0; i < serial->num_ports; ++i) {
    while(serial->port[i].open_count > 0) {
      generic_close(&serial->port[i], NULL);
    }
  }
}
#endif
static void port_softint(void *private)
{
  struct usb_serial_port  *port = (struct usb_serial_port *)private;
  struct usb_serial       *serial = get_usb_serial(port, __FUNCTION__);
  struct tty_struct       *tty;

  dbg(__FUNCTION__ " - port %d", port->number);

  if(!serial) {
    return;
  }

  tty = port->tty;
  if((tty->flags & (1 << TTY_DO_WRITE_WAKEUP)) && tty->ldisc.write_wakeup) {
    dbg(__FUNCTION__ " - write wakeup call.");
    (tty->ldisc.write_wakeup) (tty);
  }

  wake_up_interruptible(&tty->write_wait);
}

static void *usb_serial_probe(struct usb_device *dev, unsigned int ifnum, const struct usb_device_id *id)
{
  struct usb_serial               *serial = NULL;
  struct usb_serial_port          *port;
  struct usb_interface            *interface;
  struct usb_interface_descriptor *iface_desc;
  struct usb_endpoint_descriptor  *endpoint;
  struct usb_endpoint_descriptor  *interrupt_in_endpoint[MAX_NUM_PORTS];
  struct usb_endpoint_descriptor  *bulk_in_endpoint[MAX_NUM_PORTS];
  struct usb_endpoint_descriptor  *bulk_out_endpoint[MAX_NUM_PORTS];
  struct usb_serial_device_type   *type = NULL;
  struct list_head                *tmp;
  int                             found;
  int                             minor;
  int                             buffer_size;
  int                             i;
  char                            interrupt_pipe;
  char                            bulk_in_pipe;
  char                            bulk_out_pipe;
  int                             num_interrupt_in = 0;
  int                             num_bulk_in = 0;
  int                             num_bulk_out = 0;
  int                             num_ports;
  int                             max_endpoints;
  const struct usb_device_id      *id_pattern = NULL;

  /* loop through our list of known serial converters, and see if this
	   device matches. */
  found = 0;
  interface = &dev->actconfig->interface[ifnum];
  list_for_each(tmp, &usb_serial_driver_list) {
    type = list_entry(tmp, struct usb_serial_device_type, driver_list);
    id_pattern = usb_match_id(dev, interface, type->id_table);
    if(id_pattern != NULL) {
      dbg("descriptor matches");
      found = 1;
      break;
    }
  }

  if(!found) {
    /* no match */
    dbg("none matched");
    return(NULL);
  }

  /* descriptor matches, let's find the endpoints needed */
  interrupt_pipe = bulk_in_pipe = bulk_out_pipe = HAS_NOT;

  /* check out the endpoints */
  iface_desc = &interface->altsetting[0];
  for(i = 0; i < iface_desc->bNumEndpoints; ++i) {
    endpoint = &iface_desc->endpoint[i];

    if((endpoint->bEndpointAddress & 0x80) && ((endpoint->bmAttributes & 3) == 0x02)) {
      /* we found a bulk in endpoint */
      dbg("found bulk in");
      bulk_in_pipe = HAS;
      bulk_in_endpoint[num_bulk_in] = endpoint;
      ++num_bulk_in;
    }

    if(((endpoint->bEndpointAddress & 0x80) == 0x00) && ((endpoint->bmAttributes & 3) == 0x02)) {
      /* we found a bulk out endpoint */
      dbg("found bulk out");
      bulk_out_pipe = HAS;
      bulk_out_endpoint[num_bulk_out] = endpoint;
      ++num_bulk_out;
    }

    if((endpoint->bEndpointAddress & 0x80) && ((endpoint->bmAttributes & 3) == 0x03)) {
      /* we found a interrupt in endpoint */
      dbg("found interrupt in");
      interrupt_pipe = HAS;
      interrupt_in_endpoint[num_interrupt_in] = endpoint;
      ++num_interrupt_in;
    }
  }

  /* verify that we found all of the endpoints that we need */
  if
  (
    !(
      (interrupt_pipe & type->needs_interrupt_in) &&
      (bulk_in_pipe & type->needs_bulk_in) &&
      (bulk_out_pipe & type->needs_bulk_out)
    )

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美日韩欧美一区二区| 国产精品欧美一区喷水| 久久久美女毛片| 中文字幕日本乱码精品影院| 午夜精品久久久久影视| 国产精品123| 69av一区二区三区| 国产精品美女久久久久高潮| 免费成人你懂的| 色婷婷综合五月| 国产精品剧情在线亚洲| 久久国产综合精品| 欧美色手机在线观看| 国产精品毛片高清在线完整版| 美女脱光内衣内裤视频久久网站| 色综合天天狠狠| 国产精品视频一二| 国产在线精品不卡| 欧美不卡激情三级在线观看| 天堂蜜桃91精品| 欧美在线影院一区二区| 日韩伦理免费电影| 成人永久看片免费视频天堂| 26uuu精品一区二区| 日韩精品一二三四| 欧美撒尿777hd撒尿| 亚洲欧美国产77777| 成人av网址在线观看| 久久精品在这里| 激情图片小说一区| 精品国产乱码久久久久久蜜臀| 日韩精品免费专区| 91精品国产免费| 日韩电影在线一区二区三区| 91精品欧美久久久久久动漫| 丝袜国产日韩另类美女| 欧美欧美欧美欧美| 日本成人中文字幕| 日韩一级片在线观看| 麻豆视频一区二区| 精品国产麻豆免费人成网站| 精品在线观看免费| 久久亚洲私人国产精品va媚药| 国产精品影视天天线| 国产婷婷色一区二区三区四区 | 激情亚洲综合在线| 日韩免费看网站| 国产一区福利在线| 国产欧美日韩精品a在线观看| 东方aⅴ免费观看久久av| 亚洲国产精品激情在线观看| 99久久精品国产一区二区三区| 亚洲三级免费观看| 欧美猛男gaygay网站| 蜜臀久久99精品久久久久久9| 精品少妇一区二区三区| 国产精品一区三区| 亚洲免费观看高清在线观看| 欧美性猛交xxxx乱大交退制版| 视频一区二区三区中文字幕| 欧美va在线播放| 成人激情文学综合网| 亚洲激情图片小说视频| 在线成人av网站| 国产成人h网站| 亚洲综合视频在线观看| 欧美成人乱码一区二区三区| 成人app网站| 午夜久久久久久电影| 日韩一区二区视频| 成人激情小说网站| 日本在线不卡视频| 欧美激情一区二区三区不卡| 欧美色精品天天在线观看视频| 狠狠色2019综合网| 亚洲美女屁股眼交| 精品国产一区二区三区久久久蜜月| 成人爱爱电影网址| 青青草精品视频| 一区二区三区中文免费| 精品日韩欧美一区二区| 在线免费观看日本欧美| 国产美女娇喘av呻吟久久| 亚洲一区二区三区爽爽爽爽爽| 精品国产乱码久久久久久浪潮| 欧美又粗又大又爽| 国产传媒日韩欧美成人| 日本午夜一区二区| 伊人色综合久久天天| 久久九九久久九九| 欧美一区二区美女| 日本高清成人免费播放| 国产不卡高清在线观看视频| 日韩精品国产欧美| 亚洲一区在线看| 国产精品国模大尺度视频| 26uuu久久综合| 欧美成人精品二区三区99精品| 欧美在线免费观看亚洲| 97se狠狠狠综合亚洲狠狠| 国产一区二区三区日韩| 日韩成人精品视频| 亚洲国产一区二区在线播放| 成人免费在线视频| 国产欧美一二三区| 国产日韩亚洲欧美综合| 欧美精品一区二区三区视频| 日韩一级二级三级精品视频| 7878成人国产在线观看| 欧美日韩精品一区二区三区四区| 91在线视频网址| 94-欧美-setu| fc2成人免费人成在线观看播放| 国产一区二区三区免费看| 韩国女主播成人在线| 久久电影国产免费久久电影| 日本v片在线高清不卡在线观看| 亚洲一区自拍偷拍| 手机精品视频在线观看| 日韩精品国产精品| 免费一级片91| 精品亚洲国产成人av制服丝袜| 蜜臀av性久久久久蜜臀aⅴ四虎| 日韩和欧美一区二区三区| 视频一区国产视频| 久久国产成人午夜av影院| 久久se这里有精品| 国产一区二区视频在线播放| 懂色av中文字幕一区二区三区| 成人午夜伦理影院| 91美女视频网站| 欧美日韩一区二区三区在线| 51久久夜色精品国产麻豆| 精品裸体舞一区二区三区| 久久视频一区二区| 中文字幕在线不卡国产视频| 亚洲欧美一区二区三区国产精品| 亚洲一线二线三线视频| 麻豆久久久久久久| 大美女一区二区三区| 在线视频欧美精品| 欧美一区二区三区视频免费| 久久亚洲精华国产精华液| 亚洲欧洲日韩综合一区二区| 亚洲午夜国产一区99re久久| 久久国产精品99久久人人澡| 国产91在线观看丝袜| 欧美亚洲自拍偷拍| 精品国产人成亚洲区| 亚洲精品日韩综合观看成人91| 国产一区二区三区高清播放| 91免费版pro下载短视频| 欧美天堂一区二区三区| 精品日韩在线观看| 亚洲免费电影在线| 久久99久国产精品黄毛片色诱| 成人在线视频首页| 日韩欧美123| 亚洲精品免费看| 国产一区二区三区蝌蚪| 欧美亚洲综合色| 国产午夜精品久久| 日本欧美大码aⅴ在线播放| 成人免费av资源| 日韩美女视频在线| 一区二区三区四区激情| 国产麻豆视频精品| 欧美高清www午色夜在线视频| 国产精品每日更新| 久久精品国产精品青草| 在线免费亚洲电影| 国产精品久久久久久久第一福利| 日本不卡123| 欧美日韩黄视频| 亚洲视频免费在线观看| 国产精品一级片在线观看| 欧美日韩色一区| 亚洲视频免费观看| 国产乱码精品一区二区三区忘忧草 | 色婷婷久久综合| 国产亚洲美州欧州综合国| 日韩中文欧美在线| 欧美日韩一区精品| 亚洲欧美综合在线精品| 国产激情精品久久久第一区二区| 日韩你懂的电影在线观看| 一区二区三区产品免费精品久久75 | aaa欧美日韩| 国产亚洲综合av| 久久国产精品99精品国产 | 成年人网站91| 欧美变态口味重另类| 日本欧美一区二区三区| 欧美男生操女生| 午夜电影网一区| 欧美日韩精品系列| 亚洲综合999| 精品视频一区二区不卡| 亚洲精品欧美在线| 在线看国产一区二区|