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

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

?? dmascc.c

?? linux和2410結合開發(fā) 用他可以生成2410所需的zImage文件
?? C
?? 第 1 頁 / 共 3 頁
字號:
  int scc_base = card_base + hw[type].scc_offset;  char *chipnames[] = CHIPNAMES;  /* Allocate memory */  info = kmalloc(sizeof(struct scc_info), GFP_KERNEL | GFP_DMA);  if (!info) {    printk("dmascc: could not allocate memory for %s at %#3x\n",	   hw[type].name, card_base);    return -1;  }  /* Initialize what is necessary for write_scc and write_scc_data */  memset(info, 0, sizeof(struct scc_info));  priv = &info->priv[0];  priv->type = type;  priv->card_base = card_base;  priv->scc_cmd = scc_base + SCCA_CMD;  priv->scc_data = scc_base + SCCA_DATA;  /* Reset SCC */  write_scc(priv, R9, FHWRES | MIE | NV);  /* Determine type of chip by enabling SDLC/HDLC enhancements */  write_scc(priv, R15, SHDLCE);  if (!read_scc(priv, R15)) {    /* WR7' not present. This is an ordinary Z8530 SCC. */    chip = Z8530;  } else {    /* Put one character in TX FIFO */    write_scc_data(priv, 0, 0);    if (read_scc(priv, R0) & Tx_BUF_EMP) {      /* TX FIFO not full. This is a Z85230 ESCC with a 4-byte FIFO. */      chip = Z85230;    } else {      /* TX FIFO full. This is a Z85C30 SCC with a 1-byte FIFO. */      chip = Z85C30;    }  }  write_scc(priv, R15, 0);  /* Start IRQ auto-detection */  sti();  irqs = probe_irq_on();  /* Enable interrupts */  if (type == TYPE_TWIN) {    outb(0, card_base + TWIN_DMA_CFG);    inb(card_base + TWIN_CLR_TMR1);    inb(card_base + TWIN_CLR_TMR2);    outb((info->twin_serial_cfg = TWIN_EI), card_base + TWIN_SERIAL_CFG);  } else {    write_scc(priv, R15, CTSIE);    write_scc(priv, R0, RES_EXT_INT);    write_scc(priv, R1, EXT_INT_ENAB);  }  /* Start timer */  outb(1, tmr_base + TMR_CNT1);  outb(0, tmr_base + TMR_CNT1);  /* Wait and detect IRQ */  time = jiffies; while (jiffies - time < 2 + HZ / TMR_0_HZ);  irq = probe_irq_off(irqs);  /* Clear pending interrupt, disable interrupts */  if (type == TYPE_TWIN) {    inb(card_base + TWIN_CLR_TMR1);  } else {    write_scc(priv, R1, 0);    write_scc(priv, R15, 0);    write_scc(priv, R0, RES_EXT_INT);  }  if (irq <= 0) {    printk("dmascc: could not find irq of %s at %#3x (irq=%d)\n",	   hw[type].name, card_base, irq);    kfree(info);    return -1;  }  /* Set up data structures */  for (i = 0; i < 2; i++) {    dev = &info->dev[i];    priv = &info->priv[i];    priv->type = type;    priv->chip = chip;    priv->dev = dev;    priv->info = info;    priv->channel = i;    priv->card_base = card_base;    priv->scc_cmd = scc_base + (i ? SCCB_CMD : SCCA_CMD);    priv->scc_data = scc_base + (i ? SCCB_DATA : SCCA_DATA);    priv->tmr_cnt = tmr_base + (i ? TMR_CNT2 : TMR_CNT1);    priv->tmr_ctrl = tmr_base + TMR_CTRL;    priv->tmr_mode = i ? 0xb0 : 0x70;    priv->param.pclk_hz = hw[type].pclk_hz;    priv->param.brg_tc = -1;    priv->param.clocks = TCTRxCP | RCRTxCP;    priv->param.persist = 256;    priv->param.dma = -1;    priv->rx_task.routine = rx_bh;    priv->rx_task.data = priv;    dev->priv = priv;#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,0)    if (sizeof(dev->name) == sizeof(char *)) dev->name = priv->name;#endif    sprintf(dev->name, "dmascc%i", 2*n+i);    dev->base_addr = card_base;    dev->irq = irq;    dev->open = scc_open;    dev->stop = scc_close;    dev->do_ioctl = scc_ioctl;    dev->hard_start_xmit = scc_send_packet;    dev->get_stats = scc_get_stats;    dev->hard_header = ax25_encapsulate;    dev->rebuild_header = ax25_rebuild_header;    dev->set_mac_address = scc_set_mac_address;    dev->type = ARPHRD_AX25;    dev->hard_header_len = 73;    dev->mtu = 1500;    dev->addr_len = 7;    dev->tx_queue_len = 64;    memcpy(dev->broadcast, ax25_broadcast, 7);    memcpy(dev->dev_addr, ax25_test, 7);    rtnl_lock();    if (register_netdevice(dev)) {      printk("dmascc: could not register %s\n", dev->name);    }    rtnl_unlock();  }  request_region(card_base, hw[type].io_size, "dmascc");  info->next = first;  first = info;  printk("dmascc: found %s (%s) at %#3x, irq %d\n", hw[type].name,	 chipnames[chip], card_base, irq);  return 0;}/* Driver functions */static void write_scc(struct scc_priv *priv, int reg, int val) {  unsigned long flags;  switch (priv->type) {  case TYPE_S5:    if (reg) outb(reg, priv->scc_cmd);    outb(val, priv->scc_cmd);    return;  case TYPE_TWIN:    if (reg) outb_p(reg, priv->scc_cmd);    outb_p(val, priv->scc_cmd);    return;  default:    save_flags(flags);    cli();    outb_p(0, priv->card_base + PI_DREQ_MASK);    if (reg) outb_p(reg, priv->scc_cmd);    outb_p(val, priv->scc_cmd);    outb(1, priv->card_base + PI_DREQ_MASK);    restore_flags(flags);    return;  }}static void write_scc_data(struct scc_priv *priv, int val, int fast) {  unsigned long flags;  switch (priv->type) {  case TYPE_S5:    outb(val, priv->scc_data);    return;  case TYPE_TWIN:    outb_p(val, priv->scc_data);    return;  default:    if (fast) outb_p(val, priv->scc_data);    else {      save_flags(flags);      cli();      outb_p(0, priv->card_base + PI_DREQ_MASK);      outb_p(val, priv->scc_data);      outb(1, priv->card_base + PI_DREQ_MASK);      restore_flags(flags);    }    return;  }}static int read_scc(struct scc_priv *priv, int reg) {  int rc;  unsigned long flags;  switch (priv->type) {  case TYPE_S5:    if (reg) outb(reg, priv->scc_cmd);    return inb(priv->scc_cmd);  case TYPE_TWIN:    if (reg) outb_p(reg, priv->scc_cmd);    return inb_p(priv->scc_cmd);  default:    save_flags(flags);    cli();    outb_p(0, priv->card_base + PI_DREQ_MASK);    if (reg) outb_p(reg, priv->scc_cmd);    rc = inb_p(priv->scc_cmd);    outb(1, priv->card_base + PI_DREQ_MASK);    restore_flags(flags);    return rc;  }}static int read_scc_data(struct scc_priv *priv) {  int rc;  unsigned long flags;  switch (priv->type) {  case TYPE_S5:    return inb(priv->scc_data);  case TYPE_TWIN:    return inb_p(priv->scc_data);  default:    save_flags(flags);    cli();    outb_p(0, priv->card_base + PI_DREQ_MASK);    rc = inb_p(priv->scc_data);    outb(1, priv->card_base + PI_DREQ_MASK);    restore_flags(flags);    return rc;  }}static int scc_open(struct net_device *dev) {  struct scc_priv *priv = dev->priv;  struct scc_info *info = priv->info;  int card_base = priv->card_base;  MOD_INC_USE_COUNT;  /* Request IRQ if not already used by other channel */  if (!info->irq_used) {    if (request_irq(dev->irq, scc_isr, 0, "dmascc", info)) {      MOD_DEC_USE_COUNT;      return -EAGAIN;    }  }  info->irq_used++;  /* Request DMA if required */  if (priv->param.dma >= 0) {    if (request_dma(priv->param.dma, "dmascc")) {      if (--info->irq_used == 0) free_irq(dev->irq, info);      MOD_DEC_USE_COUNT;      return -EAGAIN;    } else {      unsigned long flags = claim_dma_lock();      clear_dma_ff(priv->param.dma);      release_dma_lock(flags);    }  }  /* Initialize local variables */  priv->rx_ptr = 0;  priv->rx_over = 0;  priv->rx_head = priv->rx_tail = priv->rx_count = 0;  priv->state = IDLE;  priv->tx_head = priv->tx_tail = priv->tx_count = 0;  priv->tx_ptr = 0;  /* Reset channel */  write_scc(priv, R9, (priv->channel ? CHRB : CHRA) | MIE | NV);  /* X1 clock, SDLC mode */  write_scc(priv, R4, SDLC | X1CLK);  /* DMA */  write_scc(priv, R1, EXT_INT_ENAB | WT_FN_RDYFN);  /* 8 bit RX char, RX disable */  write_scc(priv, R3, Rx8);  /* 8 bit TX char, TX disable */  write_scc(priv, R5, Tx8);  /* SDLC address field */  write_scc(priv, R6, 0);  /* SDLC flag */  write_scc(priv, R7, FLAG);  switch (priv->chip) {  case Z85C30:    /* Select WR7' */    write_scc(priv, R15, SHDLCE);    /* Auto EOM reset */    write_scc(priv, R7, AUTOEOM);    write_scc(priv, R15, 0);    break;  case Z85230:    /* Select WR7' */    write_scc(priv, R15, SHDLCE);    /* The following bits are set (see 2.5.2.1):       - Automatic EOM reset       - Interrupt request if RX FIFO is half full         This bit should be ignored in DMA mode (according to the         documentation), but actually isn't. The receiver doesn't work if         it is set. Thus, we have to clear it in DMA mode.       - Interrupt/DMA request if TX FIFO is completely empty         a) If set, the ESCC behaves as if it had no TX FIFO (Z85C30            compatibility).         b) If cleared, DMA requests may follow each other very quickly,            filling up the TX FIFO.            Advantage: TX works even in case of high bus latency.            Disadvantage: Edge-triggered DMA request circuitry may miss                          a request. No more data is delivered, resulting                          in a TX FIFO underrun.         Both PI2 and S5SCC/DMA seem to work fine with TXFIFOE cleared.         The PackeTwin doesn't. I don't know about the PI, but let's	 assume it behaves like the PI2.    */    if (priv->param.dma >= 0) {      if (priv->type == TYPE_TWIN) write_scc(priv, R7, AUTOEOM | TXFIFOE);      else write_scc(priv, R7, AUTOEOM);    } else {      write_scc(priv, R7, AUTOEOM | RXFIFOH);    }    write_scc(priv, R15, 0);    break;  }  /* Preset CRC, NRZ(I) encoding */  write_scc(priv, R10, CRCPS | (priv->param.nrzi ? NRZI : NRZ));  /* Configure baud rate generator */  if (priv->param.brg_tc >= 0) {    /* Program BR generator */    write_scc(priv, R12, priv->param.brg_tc & 0xFF);    write_scc(priv, R13, (priv->param.brg_tc>>8) & 0xFF);    /* BRG source = SYS CLK; enable BRG; DTR REQ function (required by       PackeTwin, not connected on the PI2); set DPLL source to BRG */    write_scc(priv, R14, SSBR | DTRREQ | BRSRC | BRENABL);    /* Enable DPLL */    write_scc(priv, R14, SEARCH | DTRREQ | BRSRC | BRENABL);  } else {    /* Disable BR generator */    write_scc(priv, R14, DTRREQ | BRSRC);  }  /* Configure clocks */  if (priv->type == TYPE_TWIN) {    /* Disable external TX clock receiver */    outb((info->twin_serial_cfg &=	    ~(priv->channel ? TWIN_EXTCLKB : TWIN_EXTCLKA)), 	   card_base + TWIN_SERIAL_CFG);  }  write_scc(priv, R11, priv->param.clocks);  if ((priv->type == TYPE_TWIN) && !(priv->param.clocks & TRxCOI)) {    /* Enable external TX clock receiver */    outb((info->twin_serial_cfg |=	    (priv->channel ? TWIN_EXTCLKB : TWIN_EXTCLKA)),	   card_base + TWIN_SERIAL_CFG);  }  /* Configure PackeTwin */  if (priv->type == TYPE_TWIN) {    /* Assert DTR, enable interrupts */    outb((info->twin_serial_cfg |= TWIN_EI |	    (priv->channel ? TWIN_DTRB_ON : TWIN_DTRA_ON)),	   card_base + TWIN_SERIAL_CFG);  }  /* Read current status */  priv->rr0 = read_scc(priv, R0);  /* Enable DCD interrupt */  write_scc(priv, R15, DCDIE);  netif_start_queue(dev);  return 0;}static int scc_close(struct net_device *dev) {  struct scc_priv *priv = dev->priv;  struct scc_info *info = priv->info;  int card_base = priv->card_base;  netif_stop_queue(dev);  if (priv->type == TYPE_TWIN) {    /* Drop DTR */    outb((info->twin_serial_cfg &=	    (priv->channel ? ~TWIN_DTRB_ON : ~TWIN_DTRA_ON)),	   card_base + TWIN_SERIAL_CFG);  }  /* Reset channel, free DMA and IRQ */  write_scc(priv, R9, (priv->channel ? CHRB : CHRA) | MIE | NV);  if (priv->param.dma >= 0) {    if (priv->type == TYPE_TWIN) outb(0, card_base + TWIN_DMA_CFG);    free_dma(priv->param.dma);  }  if (--info->irq_used == 0) free_irq(dev->irq, info);  MOD_DEC_USE_COUNT;  return 0;}static int scc_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) {  struct scc_priv *priv = dev->priv;    switch (cmd) {  case SIOCGSCCPARAM:    if (copy_to_user(ifr->ifr_data, &priv->param, sizeof(struct scc_param)))      return -EFAULT;    return 0;  case SIOCSSCCPARAM:    if (!capable(CAP_NET_ADMIN)) return -EPERM;    if (netif_running(dev)) return -EAGAIN;    if (copy_from_user(&priv->param, ifr->ifr_data, sizeof(struct scc_param)))      return -EFAULT;    return 0;  default:    return -EINVAL;  }}static int scc_send_packet(struct sk_buff *skb, struct net_device *dev) {  struct scc_priv *priv = dev->priv;  unsigned long flags;  int i;  /* Temporarily stop the scheduler feeding us packets */  netif_stop_queue(dev);  /* Transfer data to DMA buffer */  i = priv->tx_head;  memcpy(priv->tx_buf[i], skb->data+1, skb->len-1);  priv->tx_len[i] = skb->len-1;  /* Clear interrupts while we touch our circular buffers */  save_flags(flags);  cli();  /* Move the ring buffer's head */  priv->tx_head = (i + 1) % NUM_TX_BUF;  priv->tx_count++;  /* If we just filled up the last buffer, leave queue stopped.     The higher layers must wait until we have a DMA buffer     to accept the data. */  if (priv->tx_count < NUM_TX_BUF) netif_wake_queue(dev);  /* Set new TX state */  if (priv->state == IDLE) {    /* Assert RTS, start timer */    priv->state = TX_HEAD;    priv->tx_start = jiffies;    write_scc(priv, R5, TxCRC_ENAB | RTS | TxENAB | Tx8);    write_scc(priv, R15, 0);    start_timer(priv, priv->param.txdelay, 0);  }  /* Turn interrupts back on and free buffer */  restore_flags(flags);  dev_kfree_skb(skb);  return 0;}static struct net_device_stats *scc_get_stats(struct net_device *dev) {  struct scc_priv *priv = dev->priv;  return &priv->stats;}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美日韩综合色| 亚洲精品日韩综合观看成人91| 欧美日韩一区不卡| 91黄色激情网站| 在线欧美小视频| 欧美日韩一卡二卡三卡| 欧美日韩成人在线一区| 56国语精品自产拍在线观看| 欧美高清一级片在线| 欧美一区二区在线免费观看| 欧美一区日本一区韩国一区| 日韩免费一区二区三区在线播放| 欧美大白屁股肥臀xxxxxx| 精品99999| 国产精品污www在线观看| 日韩毛片精品高清免费| 亚洲国产成人av好男人在线观看| 三级一区在线视频先锋| 久久成人精品无人区| 国产夫妻精品视频| 91丨porny丨国产入口| 欧美午夜影院一区| 日韩一区二区精品在线观看| 久久久亚洲精品石原莉奈| 自拍偷拍欧美激情| 午夜精品久久久久久不卡8050| 久久国产欧美日韩精品| 成人永久aaa| 91福利视频久久久久| 欧美一级高清大全免费观看| 久久久精品一品道一区| 亚洲欧美偷拍卡通变态| 日本最新不卡在线| 成人国产在线观看| 欧美电影在哪看比较好| 久久亚洲捆绑美女| 一区二区三区免费在线观看| 青青草国产精品97视觉盛宴| 国产成人在线视频网址| 欧美视频中文字幕| 久久久久九九视频| 亚洲第一久久影院| 国产精一区二区三区| 日本精品视频一区二区| 久久综合成人精品亚洲另类欧美 | 亚洲电影第三页| 国产综合成人久久大片91| 91美女片黄在线观看91美女| 91精品欧美久久久久久动漫| 亚洲国产高清aⅴ视频| 偷拍一区二区三区四区| 风流少妇一区二区| 欧美一区二区福利在线| 中文字幕日韩一区二区| 久久99热这里只有精品| 欧美自拍丝袜亚洲| 国产日韩欧美一区二区三区乱码 | 亚洲欧洲精品一区二区三区| 日韩精品久久久久久| 91香蕉视频mp4| 久久影院午夜片一区| 天天综合日日夜夜精品| 99v久久综合狠狠综合久久| 日韩精品中文字幕一区二区三区| 亚洲日本电影在线| 国产成人亚洲综合a∨婷婷 | 秋霞影院一区二区| 色哟哟一区二区| 欧美韩国一区二区| 精品亚洲国内自在自线福利| 欧美伦理视频网站| 一区二区高清视频在线观看| 成人网页在线观看| 国产午夜精品久久久久久免费视| 蜜桃视频一区二区三区| 欧美日本在线看| 亚洲一区欧美一区| 色素色在线综合| 国产精品久久久久久久岛一牛影视| 久久99九九99精品| 91精品国产入口在线| 亚洲一区在线观看视频| 91老师片黄在线观看| 国产精品不卡一区| 国产精品一级片在线观看| 2024国产精品| 精品一区二区在线免费观看| 777久久久精品| 日韩av在线免费观看不卡| 欧美日韩一区三区| 亚洲成人免费电影| 欧美日韩精品一区二区天天拍小说| 亚洲女爱视频在线| 在线免费观看日韩欧美| 亚洲毛片av在线| 色综合色狠狠天天综合色| 国产精品国产三级国产| 成人天堂资源www在线| 国产精品视频一二| 99久久er热在这里只有精品15| 国产精品丝袜久久久久久app| 成人午夜大片免费观看| 一区免费观看视频| 色菇凉天天综合网| 亚洲一区二区视频| 欧美日韩视频在线观看一区二区三区 | 风间由美一区二区av101| 久久精品免费在线观看| 高清不卡一区二区在线| 国产精品久久久久久久久搜平片 | 91精品久久久久久久久99蜜臂| 亚洲成av人片在线| 88在线观看91蜜桃国自产| 三级不卡在线观看| 日韩一区二区三区免费观看| 国产一区二区0| 国产精品视频观看| 色综合久久久久久久| 一区二区日韩av| 欧美一级欧美一级在线播放| 激情五月激情综合网| 中文字幕欧美国产| 在线一区二区视频| 美女视频网站久久| 国产精品私房写真福利视频| 91久久人澡人人添人人爽欧美| 亚洲与欧洲av电影| 精品久久久久久久久久久院品网| 欧美电影精品一区二区| 国产成人亚洲综合a∨婷婷| 亚洲天堂av一区| 欧美日韩精品免费| 狠狠色丁香九九婷婷综合五月| 欧美激情综合在线| 欧洲精品在线观看| 蜜臀av国产精品久久久久| 日本一区二区三区电影| 在线观看三级视频欧美| 美女任你摸久久| 国产精品护士白丝一区av| 欧美色中文字幕| 国产一区 二区| 亚洲精品日日夜夜| 精品欧美一区二区久久| 色综合天天性综合| 天天做天天摸天天爽国产一区| 久久婷婷国产综合国色天香| 色一情一伦一子一伦一区| 美女脱光内衣内裤视频久久网站| 中文字幕在线不卡| 日韩一区二区三区高清免费看看| 成人av网站免费观看| 日本不卡中文字幕| 亚洲精品乱码久久久久久日本蜜臀| 欧美一区日韩一区| 日本精品免费观看高清观看| 国产老妇另类xxxxx| 亚洲成av人综合在线观看| 中文字幕av一区二区三区高 | 亚洲靠逼com| 精品国产百合女同互慰| 欧洲人成人精品| 成人一区二区视频| 精品制服美女久久| 亚洲午夜一区二区| 国产精品久久久久久久久果冻传媒| 欧美一级xxx| 欧美午夜精品久久久久久超碰 | 欧美裸体bbwbbwbbw| 99精品在线观看视频| 国产黄色精品视频| 手机精品视频在线观看| 亚洲精品视频免费看| 国产精品美女久久久久久| 精品少妇一区二区三区在线播放| 色综合久久中文综合久久牛| 国产成人精品亚洲777人妖 | 欧美亚洲国产一区二区三区va| 国产精品一级二级三级| 久久国产综合精品| 亚洲成人av福利| 亚洲综合色噜噜狠狠| 欧美韩国日本综合| 久久精品一区四区| 久久人人超碰精品| 日韩精品专区在线影院重磅| 91精品蜜臀在线一区尤物| 欧美日韩二区三区| 欧美少妇一区二区| 欧美偷拍一区二区| 91久久一区二区| 在线观看日韩av先锋影音电影院| 成人激情开心网| 国产91丝袜在线观看| 国产凹凸在线观看一区二区| 国产成人无遮挡在线视频| 国产黄色精品视频| 欧美精品一区二区三区四区 | 中文子幕无线码一区tr| 久久久美女毛片|