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

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

?? usbserial.c

?? linux 下usb to com 的驅動
?? C
?? 第 1 頁 / 共 4 頁
字號:
   cause the "hotplug" program to pull in whatever module is necessary
   via modprobe, and modprobe will load usbserial because the serial
   drivers depend on it.
*/
static int                            serial_refcount;
static struct tty_driver              serial_tty_driver;
static struct tty_struct              *serial_tty[SERIAL_TTY_MINORS];
static struct termios                 *serial_termios[SERIAL_TTY_MINORS];
static struct termios                 *serial_termios_locked[SERIAL_TTY_MINORS];
static struct usb_serial              *serial_table[SERIAL_TTY_MINORS]; /* initially all NULL */

LIST_HEAD(usb_serial_driver_list);

static struct usb_serial *get_serial_by_minor(int minor)
{
  return serial_table[minor];
}

static struct usb_serial *get_free_serial(int num_ports, int *minor)
{
  struct usb_serial *serial = NULL;
  int               i, j;
  int               good_spot;

  dbg(__FUNCTION__ " %d", num_ports);

  *minor = 0;
  for(i = 0; i < SERIAL_TTY_MINORS; ++i) {
    if(serial_table[i])
      continue;

    good_spot = 1;
    for(j = 1; j <= num_ports - 1; ++j)
      if(serial_table[i + j])
        good_spot = 0;
    if(good_spot == 0)
      continue;

    if(!(serial = kmalloc(sizeof(struct usb_serial), GFP_KERNEL))) {
      err(__FUNCTION__ " - Out of memory");
      return NULL;
    }

    memset(serial, 0, sizeof(struct usb_serial));
    serial->magic = USB_SERIAL_MAGIC;
    serial_table[i] = serial;
    *minor = i;
    dbg(__FUNCTION__ " - minor base = %d", *minor);
    for(i = *minor + 1; (i < (*minor + num_ports)) && (i < SERIAL_TTY_MINORS); ++i)
      serial_table[i] = serial;
    return serial;
  }

  return NULL;
}

static void return_serial(struct usb_serial *serial)
{
  int i;

  dbg(__FUNCTION__);

  if(serial == NULL)
    return;

  for(i = 0; i < serial->num_ports; ++i) {
    serial_table[serial->minor + i] = NULL;
  }

  return;
}

#ifdef USES_EZUSB_FUNCTIONS

/* EZ-USB Control and Status Register.  Bit 0 controls 8051 reset */
#define CPUCS_REG 0x7F92

int ezusb_writememory(struct usb_serial *serial, int address, unsigned char *data, int length, __u8 bRequest)
{
  int           result;
  unsigned char *transfer_buffer = kmalloc(length, GFP_KERNEL);

  //	dbg("ezusb_writememory %x, %d", address, length);
  if(!transfer_buffer) {
    err(__FUNCTION__ " - kmalloc(%d) failed.", length);
    return -ENOMEM;
  }

  memcpy(transfer_buffer, data, length);
  result = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0), bRequest, 0x40, address, 0, transfer_buffer,
                           length, 300);
  kfree(transfer_buffer);
  return result;
}

int ezusb_set_reset(struct usb_serial *serial, unsigned char reset_bit)
{
  int response;
  dbg(__FUNCTION__ " - %d", reset_bit);
  response = ezusb_writememory(serial, CPUCS_REG, &reset_bit, 1, 0xa0);
  if(response < 0) {
    err(__FUNCTION__ "- %d failed", reset_bit);
  }

  return response;
}
#endif /* USES_EZUSB_FUNCTIONS */

/*****************************************************************************
 * Driver tty interface functions
 *****************************************************************************/
static int serial_open(struct tty_struct *tty, struct file *filp)
{
  struct usb_serial       *serial;
  struct usb_serial_port  *port;
  int                     portNumber;

  dbg(__FUNCTION__);

  /* initialize the pointer incase something fails */
  tty->driver_data = NULL;

  /* get the serial object associated with this tty pointer */
  serial = get_serial_by_minor(MINOR(tty->device));

  if(serial_paranoia_check(serial, __FUNCTION__)) {
    return -ENODEV;
  }

  MOD_INC_USE_COUNT;

  /* set up our port structure making the tty driver remember our port object, and us it */
  portNumber = MINOR(tty->device) - serial->minor;
  port = &serial->port[portNumber];
  tty->driver_data = port;
  port->tty = tty;

  /* pass on to the driver specific version of this function if it is available */
  if(serial->type->open) {
    return(serial->type->open(port, filp));
  }
  else {
    return(generic_open(port, filp));
  }
}

static void serial_close(struct tty_struct *tty, struct file *filp)
{
  struct usb_serial_port  *port = (struct usb_serial_port *)tty->driver_data;
  struct usb_serial       *serial = get_usb_serial(port, __FUNCTION__);

  if(!serial) {
    return;
  }

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

  if(!port->active) {
    dbg(__FUNCTION__ " - port not opened");
    return;
  }

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

  MOD_DEC_USE_COUNT;
}

static int serial_write(struct tty_struct *tty, int from_user, const unsigned char *buf, int count)
{
  struct usb_serial_port  *port = (struct usb_serial_port *)tty->driver_data;
  struct usb_serial       *serial = get_usb_serial(port, __FUNCTION__);

  if(!serial) {
    return -ENODEV;
  }

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

  if(!port->active) {
    dbg(__FUNCTION__ " - port not opened");
    return -EINVAL;
  }

  /* pass on to the driver specific version of this function if it is available */
  if(serial->type->write) {
    return(serial->type->write(port, from_user, buf, count));
  }
  else {
    return(generic_write(port, from_user, buf, count));
  }
}

static int serial_write_room(struct tty_struct *tty)
{
  struct usb_serial_port  *port = (struct usb_serial_port *)tty->driver_data;
  struct usb_serial       *serial = get_usb_serial(port, __FUNCTION__);

  if(!serial) {
    return -ENODEV;
  }

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

  if(!port->active) {
    dbg(__FUNCTION__ " - port not open");
    return -EINVAL;
  }

  /* pass on to the driver specific version of this function if it is available */
  if(serial->type->write_room) {
    return(serial->type->write_room(port));
  }
  else {
    return(generic_write_room(port));
  }
}

static int serial_chars_in_buffer(struct tty_struct *tty)
{
  struct usb_serial_port  *port = (struct usb_serial_port *)tty->driver_data;
  struct usb_serial       *serial = get_usb_serial(port, __FUNCTION__);

  if(!serial) {
    return -ENODEV;
  }

  if(!port->active) {
    dbg(__FUNCTION__ " - port not open");
    return -EINVAL;
  }

  /* pass on to the driver specific version of this function if it is available */
  if(serial->type->chars_in_buffer) {
    return(serial->type->chars_in_buffer(port));
  }
  else {
    return(generic_chars_in_buffer(port));
  }
}

static void serial_throttle(struct tty_struct *tty)
{
  struct usb_serial_port  *port = (struct usb_serial_port *)tty->driver_data;
  struct usb_serial       *serial = get_usb_serial(port, __FUNCTION__);

  if(!serial) {
    return;
  }

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

  if(!port->active) {
    dbg(__FUNCTION__ " - port not open");
    return;
  }

  /* pass on to the driver specific version of this function */
  if(serial->type->throttle) {
    serial->type->throttle(port);
  }

  return;
}

static void serial_unthrottle(struct tty_struct *tty)
{
  struct usb_serial_port  *port = (struct usb_serial_port *)tty->driver_data;
  struct usb_serial       *serial = get_usb_serial(port, __FUNCTION__);

  if(!serial) {
    return;
  }

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

  if(!port->active) {
    dbg(__FUNCTION__ " - port not open");
    return;
  }

  /* pass on to the driver specific version of this function */
  if(serial->type->unthrottle) {
    serial->type->unthrottle(port);
  }

  return;
}

static int serial_ioctl(struct tty_struct *tty, struct file *file, unsigned int cmd, unsigned long arg)
{
  struct usb_serial_port  *port = (struct usb_serial_port *)tty->driver_data;
  struct usb_serial       *serial = get_usb_serial(port, __FUNCTION__);

  if(!serial) {
    return -ENODEV;
  }

  dbg(__FUNCTION__ " - port %d, cmd 0x%.4x", port->number, cmd);

  if(!port->active) {
    dbg(__FUNCTION__ " - port not open");
    return -ENODEV;
  }

  /* pass on to the driver specific version of this function if it is available */
  if(serial->type->ioctl) {
    return(serial->type->ioctl(port, file, cmd, arg));
  }
  else {
    return -ENOIOCTLCMD;
  }
}

static void serial_set_termios(struct tty_struct *tty, struct termios *old)
{
  struct usb_serial_port  *port = (struct usb_serial_port *)tty->driver_data;
  struct usb_serial       *serial = get_usb_serial(port, __FUNCTION__);

  if(!serial) {
    return;
  }

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

  if(!port->active) {
    dbg(__FUNCTION__ " - port not open");
    return;
  }

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

  return;
}

static void serial_break(struct tty_struct *tty, int break_state)
{
  struct usb_serial_port  *port = (struct usb_serial_port *)tty->driver_data;
  struct usb_serial       *serial = get_usb_serial(port, __FUNCTION__);

  if(!serial) {
    return;
  }

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

  if(!port->active) {
    dbg(__FUNCTION__ " - port not open");
    return;
  }

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产午夜亚洲精品不卡| 久久亚洲春色中文字幕久久久| 91在线视频网址| 国产v日产∨综合v精品视频| 国产福利精品一区二区| 国产精品一区在线| 国产精品羞羞答答xxdd| 国产乱子轮精品视频| 欧美日韩中文国产| 99综合电影在线视频| 久久精品免费看| 天堂一区二区在线| 亚洲久草在线视频| 2020国产精品自拍| 日韩精品中文字幕在线一区| 日本黄色一区二区| 成人avav影音| 在线不卡欧美精品一区二区三区| 国产日韩亚洲欧美综合| 国产欧美一区二区精品性| 久久久国产精华| 国产色产综合色产在线视频| 国产精品日产欧美久久久久| 亚洲男人的天堂av| 亚洲一区二区在线观看视频| 午夜av一区二区三区| 男女性色大片免费观看一区二区 | 欧美日韩国产大片| 日韩一区二区三区精品视频| 久久午夜羞羞影院免费观看| 国产精品免费丝袜| 午夜av一区二区三区| 久久精工是国产品牌吗| 国产成人综合在线| 在线观看视频一区二区欧美日韩| 精品视频色一区| 亚洲精品在线网站| 综合在线观看色| 亚洲va在线va天堂| 国产综合成人久久大片91| 国产69精品一区二区亚洲孕妇| 色综合色狠狠天天综合色| 欧美精品 国产精品| 国产午夜精品在线观看| 亚洲综合一区二区精品导航| 久久精品国产99国产精品| 国产成人av资源| 欧美精品色综合| 欧美国产日韩在线观看| 日日夜夜精品视频天天综合网| 日韩一区二区在线观看| 久久久电影一区二区三区| 天堂成人免费av电影一区| 青娱乐精品视频在线| 国产成人激情av| 欧美日韩亚洲另类| 国产精品福利一区二区| 午夜一区二区三区视频| 成人永久免费视频| 欧美成人a在线| 色吊一区二区三区| 成人国产精品免费网站| 91精品麻豆日日躁夜夜躁| 国产精品嫩草影院av蜜臀| 免费精品视频在线| 在线观看日韩av先锋影音电影院| 久久久国产精品午夜一区ai换脸| 亚洲图片欧美一区| 白白色亚洲国产精品| 欧美xxxxx牲另类人与| 亚洲国产乱码最新视频| av网站免费线看精品| 精品对白一区国产伦| 日韩精品一区二| 亚洲日本在线a| 国产高清在线精品| 日韩欧美一区在线| 免费看黄色91| 3atv一区二区三区| 午夜精品一区在线观看| 欧洲人成人精品| 亚洲综合色噜噜狠狠| 99re这里只有精品6| 亚洲精品国产a久久久久久| 色婷婷久久久综合中文字幕| 国产精品欧美一级免费| 成人美女视频在线观看18| 久久久亚洲综合| 成人app网站| 亚洲.国产.中文慕字在线| 欧美精品 日韩| 国产精品一二三在| 久久精品网站免费观看| 亚洲欧美日韩一区| 成人av网站在线观看免费| 亚洲欧洲在线观看av| 欧美丰满少妇xxxbbb| 欧美日韩精品专区| 2023国产精华国产精品| 欧美日韩一区三区四区| 自拍偷拍亚洲综合| 成人网在线播放| 国产精品色在线观看| 国产精品69毛片高清亚洲| 久久久亚洲精品一区二区三区 | 久久国产尿小便嘘嘘尿| 久久精品99国产国产精| 国产精品伦一区二区三级视频| 91美女在线观看| 日韩1区2区日韩1区2区| 国产精品婷婷午夜在线观看| 色诱视频网站一区| 日韩制服丝袜av| 国产精品久久久久久久久免费丝袜 | 色悠悠亚洲一区二区| 欧美国产1区2区| 91丨九色丨蝌蚪富婆spa| 亚洲欧美偷拍三级| 欧美无砖专区一中文字| 天天影视涩香欲综合网| 日韩欧美国产精品| 国产999精品久久久久久 | 美国欧美日韩国产在线播放| 精品久久久久99| 春色校园综合激情亚洲| **性色生活片久久毛片| 欧美视频一区二区| 久久成人精品无人区| 亚洲国产精品av| 91久久线看在观草草青青| 五月综合激情婷婷六月色窝| 欧美精品一区二区三区四区| 成人av网站大全| 偷窥少妇高潮呻吟av久久免费| 日韩欧美在线综合网| 高潮精品一区videoshd| 亚洲精品福利视频网站| 91精品国产aⅴ一区二区| 国产精品一区二区三区四区| 亚洲男人电影天堂| 日韩欧美不卡一区| 99riav一区二区三区| 婷婷综合久久一区二区三区| 国产午夜精品一区二区| 欧美三区在线视频| 国产精品亚洲第一区在线暖暖韩国 | 国产精品久久久久久亚洲伦| 欧美亚洲一区二区三区四区| 国产一区免费电影| 一区二区三区日本| 精品福利一区二区三区免费视频| 99久久精品免费| 久久精品国产**网站演员| 亚洲免费看黄网站| 久久亚洲一级片| 欧美在线你懂得| 亚洲欧美日韩一区| 午夜精品久久久久久久久久久| 亚洲成人在线观看视频| 日韩精品乱码免费| 精品中文av资源站在线观看| 国产成人av影院| 欧美乱妇15p| 中文字幕精品在线不卡| 国产精品黄色在线观看| 亚洲第一av色| 风间由美一区二区三区在线观看| 91精品福利视频| 欧美第一区第二区| 亚洲一区二区三区四区在线免费观看| 亚洲成人黄色小说| 国产精品99久| 欧美夫妻性生活| 国产精品女人毛片| 懂色av一区二区在线播放| 欧美三级电影网| 午夜精品久久久久久不卡8050| 久久99久久久久久久久久久| 中文字幕中文在线不卡住| 国产麻豆一精品一av一免费| 国产91在线观看丝袜| 色婷婷av一区| 国产精品色一区二区三区| 麻豆成人免费电影| 欧美色中文字幕| 久久成人免费网站| 日韩综合在线视频| 懂色av一区二区三区免费看| 久久综合久色欧美综合狠狠| 91麻豆精品国产91| 欧美久久久久久久久久| 一本色道a无线码一区v| 91视频在线观看| www.亚洲色图| 99精品国产99久久久久久白柏| 国产成人av一区二区| 国产精品18久久久久久久久久久久| 久久精品国产色蜜蜜麻豆| 伦理电影国产精品| 久久99精品国产|