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

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

?? usbserial.c

?? linux 下usb to com 的驅動
?? 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一区二区三区免费野_久草精品视频
亚洲自拍另类综合| 欧美大片日本大片免费观看| 国产一区视频网站| 精品一区二区三区香蕉蜜桃| 人人爽香蕉精品| 男男视频亚洲欧美| 狠狠色狠狠色综合日日91app| 久久狠狠亚洲综合| 国产美女主播视频一区| 国产91精品欧美| 大陆成人av片| 色婷婷亚洲综合| 欧美日韩精品二区第二页| 欧美日韩视频专区在线播放| 欧美一级一区二区| 精品国产91九色蝌蚪| 久久久久久久久久美女| 日韩毛片一二三区| 五月天一区二区三区| 精品一区二区三区免费播放| 国产精品77777竹菊影视小说| 成人av在线一区二区三区| 日本伦理一区二区| 日韩女优毛片在线| 国产精品久久久一本精品| 一区二区三区蜜桃网| 日本视频中文字幕一区二区三区| 国产综合久久久久久久久久久久 | 一本大道久久a久久综合| 色天天综合久久久久综合片| 91精品一区二区三区在线观看| 日韩精品一区二区三区三区免费 | youjizz国产精品| 欧美亚洲愉拍一区二区| 久久亚洲捆绑美女| 樱花草国产18久久久久| 国产精品一区二区在线观看不卡| 成人av免费网站| 7777精品伊人久久久大香线蕉最新版| 欧美成人一区二区三区片免费 | 91美女在线视频| 欧美一区二区免费视频| 成人免费小视频| 国产一区久久久| 欧美亚洲另类激情小说| 中文字幕va一区二区三区| 日韩精品电影在线观看| 一本到高清视频免费精品| 日韩视频中午一区| 亚洲chinese男男1069| 成人午夜av影视| www成人在线观看| 亚洲动漫第一页| 91在线观看高清| 7777精品伊人久久久大香线蕉经典版下载 | 自拍av一区二区三区| 亚洲午夜在线观看视频在线| gogo大胆日本视频一区| 久久久亚洲精品一区二区三区| 国产精品国产三级国产有无不卡| 精一区二区三区| 欧美午夜精品一区二区蜜桃 | 欧美日韩国产综合一区二区三区| 国产精品美女一区二区三区 | 亚洲成人动漫在线观看| 色综合久久99| 国产精品国产精品国产专区不蜜 | 五月天亚洲精品| 91久久精品一区二区三| 1024成人网| 国产91精品精华液一区二区三区| 久久九九久久九九| 国产自产视频一区二区三区| 久久综合999| 国产一区二区三区| 国产日韩欧美精品在线| 日韩中文字幕亚洲一区二区va在线| 色老汉av一区二区三区| 亚洲一级片在线观看| 欧美一a一片一级一片| 中文字幕中文乱码欧美一区二区| 视频一区二区不卡| 欧美日本在线视频| 日本中文在线一区| 26uuu国产电影一区二区| 国产精品自拍网站| 日韩你懂的在线播放| 韩国三级中文字幕hd久久精品| 2023国产一二三区日本精品2022| 老色鬼精品视频在线观看播放| 欧美大片在线观看一区二区| 国产精品2024| 亚洲嫩草精品久久| 欧美日韩一区二区在线视频| 日本视频一区二区| 国产欧美一区二区三区在线老狼| 99免费精品视频| 日韩中文字幕91| 久久众筹精品私拍模特| 99精品视频一区二区| 亚洲国产视频在线| 日韩精品中文字幕在线一区| 成人av影院在线| 亚洲18女电影在线观看| 精品理论电影在线观看| 99国产精品国产精品久久| 亚洲一级二级三级在线免费观看| 日韩一区二区免费高清| 国产成人精品免费在线| 最新不卡av在线| 精品美女一区二区| 国产在线乱码一区二区三区| 一区二区三区四区激情| 欧美精品一区二区高清在线观看| 99久久er热在这里只有精品15| 日韩av不卡在线观看| 国产精品国产三级国产aⅴ入口 | 视频一区中文字幕| 国产精品沙发午睡系列990531| 欧美午夜精品电影| 国产麻豆精品在线| 亚洲v精品v日韩v欧美v专区| 国产精品美女久久久久aⅴ国产馆| 欧美美女网站色| 97久久超碰精品国产| 久草中文综合在线| 亚洲一区影音先锋| 欧美xxxx在线观看| 欧美三级一区二区| 91丨porny丨户外露出| 国产精品亚洲专一区二区三区| 亚洲福利视频导航| 中文字幕中文字幕一区二区| 久久久久九九视频| 日韩欧美你懂的| 欧美夫妻性生活| 91国产精品成人| 经典三级视频一区| 五月婷婷综合激情| 亚洲男人天堂av| 中文字幕欧美激情| 精品国产一区二区在线观看| 欧美久久久影院| 欧美久久久一区| 欧美三级在线看| 欧美日韩小视频| 欧美亚洲国产一区二区三区va| 成人视屏免费看| 成人精品在线视频观看| 国产精品一区二区在线播放| 国产一区二区毛片| 国产一区二区伦理片| 久久99精品久久久久婷婷| 久久精品国产秦先生| 蜜臀久久99精品久久久久宅男 | 国产精品12区| 国产精品中文字幕一区二区三区| 国内精品久久久久影院一蜜桃| 看电影不卡的网站| 国产一区二区在线免费观看| 麻豆精品久久精品色综合| 久久爱www久久做| 国产真实乱子伦精品视频| 国产精品自产自拍| 成人免费毛片app| 一本一道波多野结衣一区二区| 91在线观看视频| 欧美日韩国产影片| 欧美va天堂va视频va在线| 久久久久久久久久电影| 国产精品三级电影| 亚洲国产中文字幕在线视频综合| 日韩精品欧美精品| 激情亚洲综合在线| 99精品欧美一区二区三区小说 | 日韩专区在线视频| 亚洲国产综合91精品麻豆| 日本亚洲欧美天堂免费| 国产乱子轮精品视频| 成人免费毛片app| 99久久久无码国产精品| 制服丝袜亚洲播放| 国产亚洲短视频| 亚洲高清一区二区三区| 激情综合亚洲精品| av在线这里只有精品| 欧美日韩视频在线一区二区| 精品国精品国产| 自拍偷自拍亚洲精品播放| 日韩综合在线视频| 国产一区三区三区| www.欧美.com| 67194成人在线观看| 国产色91在线| 亚洲黄一区二区三区| 美国精品在线观看| 色婷婷综合久久久久中文| 欧美变态口味重另类| 自拍偷拍国产亚洲| 国产乱人伦偷精品视频免下载|