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

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

?? usbserial.c

?? USB接口轉換成RS232接口驅動程序
?? 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一区二区三区免费野_久草精品视频
国产欧美日韩三区| k8久久久一区二区三区| 欧美三级日韩三级国产三级| 伊人性伊人情综合网| 91福利在线播放| 亚洲午夜三级在线| 欧美高清www午色夜在线视频| 亚洲国产日韩一区二区| 日韩一区二区在线免费观看| 久久99精品久久久| 国产欧美日韩在线视频| av色综合久久天堂av综合| 亚洲精品第1页| 在线综合+亚洲+欧美中文字幕| 天天影视涩香欲综合网| 精品国产乱码久久久久久免费 | 亚洲精品久久7777| 欧美影视一区在线| 蜜桃av一区二区三区电影| 久久蜜桃一区二区| 色婷婷综合在线| 麻豆国产欧美日韩综合精品二区| 国产亚洲女人久久久久毛片| 91蝌蚪porny九色| 五月天丁香久久| 国产欧美日韩精品一区| 在线观看视频91| 久久国产欧美日韩精品| 亚洲视频中文字幕| 日韩一区二区在线看| 成人av在线资源网站| 亚洲成av人在线观看| 久久久久久久久99精品| jlzzjlzz亚洲日本少妇| 日韩精品福利网| 欧美国产在线观看| 91精品国产一区二区人妖| 国产一区二区三区电影在线观看| 日韩伦理免费电影| 精品国产污网站| 中文字幕精品综合| 99久久精品免费精品国产| 亚洲成av人影院| 国产精品五月天| 91精品国产综合久久福利| av一区二区不卡| 狠狠色丁香久久婷婷综合丁香| 亚洲免费视频成人| 久久久综合九色合综国产精品| 在线看不卡av| 不卡视频一二三| 美国一区二区三区在线播放| 亚洲一区中文在线| 中文欧美字幕免费| xnxx国产精品| 欧美一区二区三区日韩| 91精品办公室少妇高潮对白| 国产成人综合网| 美国三级日本三级久久99| 亚洲一区二区五区| 亚洲免费在线电影| 国产精品你懂的在线| 国产亚洲短视频| 精品国产免费一区二区三区四区| 欧美日韩国产一二三| 日本韩国精品在线| 成人激情图片网| 国产精品一区二区男女羞羞无遮挡 | 久久久久综合网| 日韩视频免费观看高清在线视频| 欧美性欧美巨大黑白大战| 色婷婷综合久久久久中文一区二区 | 国产精品毛片a∨一区二区三区| 91精品国产色综合久久不卡电影 | 国产999精品久久久久久| 精品一区二区日韩| 免费看欧美女人艹b| 三级影片在线观看欧美日韩一区二区 | 亚欧色一区w666天堂| 一区二区三区波多野结衣在线观看| 国产精品日日摸夜夜摸av| 国产清纯白嫩初高生在线观看91 | 国产一区二区三区在线观看免费| 另类专区欧美蜜桃臀第一页| 视频一区欧美精品| 美日韩一区二区三区| 久久精品国产精品亚洲综合| 麻豆免费精品视频| 久久www免费人成看片高清| 国产主播一区二区| 国产激情91久久精品导航| 欧美一区二区视频在线观看2020 | 在线观看视频一区二区| 欧美日韩和欧美的一区二区| 欧美日本视频在线| 日韩午夜在线观看| 久久人人爽人人爽| 国产精品入口麻豆原神| 一区二区三区四区中文字幕| 天天影视网天天综合色在线播放| 美女性感视频久久| 国产91精品一区二区麻豆网站| 成人黄色软件下载| 欧美专区日韩专区| 日韩精品一区二区三区中文不卡| 久久毛片高清国产| 一区二区免费在线播放| 免费av网站大全久久| 成人免费黄色在线| 欧美影视一区在线| 久久网这里都是精品| 亚洲欧美在线视频观看| 亚洲va韩国va欧美va精品 | 亚洲国产精品激情在线观看| 亚洲人123区| 日韩成人一级片| 国产精品1024| 欧美高清激情brazzers| 国产欧美日产一区| 日韩黄色一级片| 大桥未久av一区二区三区中文| 欧美亚洲免费在线一区| 久久久久久亚洲综合| 亚洲一区二区三区中文字幕| 国产综合久久久久久鬼色| 91免费在线看| 久久久久久黄色| 亚洲综合一二区| 成人一二三区视频| 欧美高清dvd| 亚洲视频免费在线观看| 久久99精品久久久久| 欧美日韩国产综合久久| 国产欧美视频一区二区| 免费在线看成人av| 91影院在线免费观看| 精品国产乱码久久久久久浪潮 | 日韩成人午夜电影| 99精品视频一区二区三区| 精品国产髙清在线看国产毛片| 亚洲精品一二三区| 成人黄页在线观看| 久久久欧美精品sm网站| 秋霞成人午夜伦在线观看| 91美女片黄在线观看91美女| 久久免费精品国产久精品久久久久| 亚洲v精品v日韩v欧美v专区| 99视频在线观看一区三区| 久久综合久久99| 麻豆精品精品国产自在97香蕉| 在线欧美日韩国产| 亚洲三级小视频| 成人97人人超碰人人99| 久久免费精品国产久精品久久久久| 日韩精品91亚洲二区在线观看| 91免费国产在线| 欧美韩日一区二区三区四区| 国产一区二区久久| 欧美大片日本大片免费观看| 日日嗨av一区二区三区四区| 亚洲国产岛国毛片在线| 国内久久精品视频| 久久综合色一综合色88| 美女尤物国产一区| 欧美一级国产精品| 久久99精品久久久久久| 精品国产乱码久久久久久浪潮 | 国产精品1区2区3区在线观看| 欧美一级爆毛片| 免费国产亚洲视频| 91精品在线麻豆| 日本成人在线一区| 91精品国产色综合久久不卡蜜臀 | 成人av在线播放网址| 国产精品丝袜91| 国产成人精品三级麻豆| 国产日韩欧美麻豆| 成人国产精品免费观看动漫| 国产精品国产自产拍在线| bt欧美亚洲午夜电影天堂| 亚洲欧洲日韩一区二区三区| 99久久99久久免费精品蜜臀| 亚洲免费在线播放| 欧美日韩亚州综合| 蜜臀av亚洲一区中文字幕| 精品美女一区二区| 国产91在线观看丝袜| 亚洲免费视频成人| 91精品国产综合久久香蕉麻豆| 久久草av在线| 亚洲欧洲美洲综合色网| 欧美视频自拍偷拍| 久久成人免费网| 国产精品久久久爽爽爽麻豆色哟哟| 91猫先生在线| 日本欧美大码aⅴ在线播放| 国产日韩欧美在线一区| 色呦呦日韩精品| 青椒成人免费视频| 日本一区二区三区电影|