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

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

?? ethernetif.c

?? 一個單片機實現以太網通信的程序
?? C
?? 第 1 頁 / 共 2 頁
字號:

struct pbuf *
low_level_input(struct netif *netif)
{
	struct EtherDev *dev = netif->state;
	struct pbuf *skb = NULL;
	u16_t rxbyte, *rdptr;
	u16_t i, RxStatus, RxLen, GoodPacket, tmplen;
	/* Check packet ready or not */
		ior(0xf0);			/* Dummy read */
		rxbyte = inb(DM9KDATA);	/* Got most updated data */
		/* Status check: this byte must be 0 or 1 */
   		/* packet ready to receive check */
		if (rxbyte == DM9K_PKT_RDY) {
			/* A packet ready now  & Get status/length */
			GoodPacket = TRUE;
			outb(0xf2, DM9KADDR);
			#if 0
			if (dev->io_mode == DM9K_BYTE_MODE) {
				/* Byte mode */
				RxStatus = inb(DM9KDATA)+(inb(DM9KDATA) << 8);
				RxLen    = inb(DM9KDATA)+(inb(DM9KDATA) << 8);
			} else 
			#endif 
			if (dev->io_mode == DM9K_WORD_MODE) {
				/* Word mode */
				RxStatus = inw(DM9KDATA);
				RxLen    = inw(DM9KDATA);
			} 

			/* Packet Status check */
			if (RxLen < 0x40) { 
				GoodPacket = FALSE; 
				//dev->runt_length_counter++; 
			}
			
			if (RxLen > DM9K_PKT_MAX) { 
				DEBUGF(DM9K_DEBUG | DBG_TRACE, ("<DM9K> RST: RX Len:%x\n", RxLen));
				//dev->long_length_counter++; 
			}
			
			if (RxStatus & 0xbf00) {
				GoodPacket = FALSE;
				if (RxStatus & 0x100) 
					//dev->rx_fifo_errors++;
					;
				if (RxStatus & 0x200) 
					//dev->rx_crc_errors++;
					;
				if (RxStatus & 0x8000) 
					//dev->rx_length_errors++;
					;
			}

			/* Move data from DM9K */
		if ( GoodPacket && ((skb = pbuf_alloc(PBUF_LINK,RxLen, PBUF_POOL)) != NULL ) ) {
			rdptr = skb->payload;			
			/* Read received packet from RX SARM */
			#if 0
			if (dev->io_mode == DM9K_BYTE_MODE) {
						/* Byte mode */
				for (i=0; i<RxLen; i++)
				rdptr[i]=inb(DM9KDATA);
				} else 
			#endif 
			if (dev->io_mode == DM9K_WORD_MODE) {
						/* Word mode */
				tmplen = (RxLen + 1) / 2;
					    r_pack(tmplen, rdptr);
					   
				//for (i=0;i<tmplen;i++)
				
			     //*((u16_t *)rdptr++) = inw(DM9KDATA);
				}
					/* Pass to upper layer */
					dev->rx_packets++; 
					return(skb);					
				} else {
				    if (skb!=NULL) pbuf_free(skb);
					tmplen = (RxLen + 1) / 2;
					drop(tmplen);
					//dev->drop_packets++; 
					return(NULL);
			}
		}

	return (NULL);
}


/*
  Read a word data from SROM
*/


/*
  Set DM9K multicast address
*/
#if 0

static u16_t read_srom_word( int offset)
{
	iow( 0xc, offset);
	iow( 0xb, 0x4);
	delay(200);
	iow( 0xb, 0x0);
	return (ior( 0xd) + (ior( 0xe) << 8) );
}


void DM9K_hash_table(struct net_device *dev)
{
	//EtherDev_t *db = (EtherDev_t *)dev->priv;
	struct dev_mc_list *mcptr = dev->mc_list;
	int mc_cnt = dev->mc_count;
	u16_t hash_val;
	u16_t i, oft, hash_table[4];
	DMFE_DBUG(0, "DM9K_hash_table()", 0);
	/* Set Node address */
	for (i = 0, oft = 0x10; i < 6; i++, oft++)
	iow( oft, GETMAC(dev->dev_addr, i));
  
	/* Clear Hash Table */
	for (i = 0; i < 4; i++)
		hash_table[i] = 0x0;
	/* broadcast address */
	hash_table[3] = 0x8000;
	/* the multicast address in Hash Table : 64 bits */
	for (i = 0; i < mc_cnt; i++, mcptr = mcptr->next) {
		hash_val = cal_CRC((u8_t *)mcptr->dmi_addr, 6, 0) & 0x3f; 
		hash_table[hash_val / 16] |=(u16_t) 1 << (hash_val % 16);
	}
	/* Write the hash table to MAC MD table */
	for (i = 0, oft = 0x16; i < 4; i++) 
	{
		iow( oft++, hash_table[i] & 0xff);
		iow( oft++, (hash_table[i] >> 8) & 0xff);
	}
}


/*
  Calculate the CRC valude of the Rx packet
  flag = 1 : return the reverse CRC (for the received packet CRC)
         0 : return the normal CRC (for Hash Table index)
*/
static unsigned long cal_CRC(u8_t * Data, unsigned int Len, u8_t flag)
{
u32_t crc = CRC_32(Data,Len);
    if (flag) 
		return ~crc;
		return crc;
	 
}

/* CRC_32 運算 */
u32_t CRC_32(u8_t *CRC_Data , u16_t Data_len)
{
  u32_t crc ,carry ;
  u16_t  iTemp;
  u16_t iTemp1;

  /* 將輸入的資料,進行 crc-32 運算 */
  crc = 0xffffffff;
  for(iTemp = 0 ; iTemp < Data_len ; iTemp++)
    {
      carry = (crc ^ *CRC_Data++) & 0xff;
      for(iTemp1 = 0 ; iTemp1 < 8 ; iTemp1++)
        {
          if(carry & 1)
            carry = (carry >> 1) ^ 0xedb88320;
          else
            carry >>= 1;
        }
      crc = ((crc >> 8) & 0x00ffffff) ^ carry;
    }
  return(crc);
}
#endif

/*
   Read a byte from I/O port
*/
volatile static u8_t ior(int reg)
{
	outb(reg, DM9KADDR);
	return inb(DM9KDATA);
}

/*
   Write a byte to I/O port
*/
static void iow(int reg, u8_t value)
{
	outb(reg, DM9KADDR);
	outb(value, DM9KDATA);
}

/*
   Read a word from phyxcer
*/
volatile static u16_t phy_read(int reg)
{
	/* Fill the phyxcer register into REG_0C */
	iow(0xc, DM9K_PHY | reg);
	iow(0xb, 0xc); 	/* Issue phyxcer read command */
	delay(100);		/* Wait read complete */
	while((ior(EPCR) & 0x01) == 0x01);
	iow( 0xb, 0x0); 	/* Clear phyxcer read command */
	/* The read data keeps on REG_0D & REG_0E */
	return ( ior(0xe) << 8 ) | ior(0xd);
}

/*
   Write a word to phyxcer
*/
static void phy_write(int reg, u16_t value)
{
	/* Fill the phyxcer register into REG_0C */
	iow(0xc, DM9K_PHY | reg);
	/* Fill the written data into REG_0D & REG_0E */
	iow(0xd, (value & 0xff));
	iow(0xe, ( (value >> 8) & 0xff));
	iow(0xb, 0xa);		/* Issue phyxcer write command */
	delay(200);			/* Wait write complete */
	while((ior(EPCR) & 0x01) == 0x01);
	iow(0xb, 0x0);		/* Clear phyxcer write command */
}

/*-----------------------------------------------------------------------------------*/
/*
 * ethernetif_output():
 *
 * This function is called by the TCP/IP stack when an IP packet
 * should be sent. It calls the function called low_level_output() to
 * do the actuall transmission of the packet.
 *
 */
/*-----------------------------------------------------------------------------------*/
static err_t
ethernetif_output(struct netif *netif, struct pbuf *p,
      struct ip_addr *ipaddr)
{
  struct EtherDev *dev;
  struct pbuf *q;
  struct eth_hdr *ethhdr;
  struct eth_addr *dest;
  struct ip_addr *queryaddr;
  err_t err;
  u8_t i;
  DMFE_DBUG(1, "ethernetif_output()\n", p);
  
 dev = netif->state;

  /* Make room for Ethernet header. */
  if (pbuf_header(p, 14) != 0) {
    /* The pbuf_header() call shouldn't fail, but we allocate an extra
       pbuf just in case. */
    q = pbuf_alloc(PBUF_LINK, 14, PBUF_RAM);
    if (q == NULL) {
#ifdef LINK_STATS
      lwip_stats.link.drop++;
      lwip_stats.link.memerr++;
#endif /* LINK_STATS */      
      return ERR_MEM;
    }
    pbuf_chain(q, p);
    p = q;
  }
  /* Construct Ethernet header. Start with looking up deciding which
     MAC address to use as a destination address. Broadcasts and
     multicasts are special, all other addresses are looked up in the
     ARP table. */
  queryaddr = ipaddr;
  if (ip_addr_isany(ipaddr) ||
     ip_addr_isbroadcast(ipaddr, &(netif->netmask))) {
    dest = (struct eth_addr *)&ethbroadcast;
  } else if (ip_addr_ismulticast(ipaddr)) {
    /* Hash IP multicast address to MAC address. */
    /*to do : */
  } else {

    if (ip_addr_maskcmp(ipaddr, &(netif->ip_addr), &(netif->netmask))) {
      /* Use destination IP address if the destination is on the same
         subnet as we are. */
      queryaddr = ipaddr;
    } else {
      /* Otherwise we use the default router as the address to send
         the Ethernet frame to. */
      queryaddr = &(netif->gw);
    }
    dest = etharp_lookup(queryaddr);
  }
  /* If the etharp_lookup() didn't find an address, we send out an ARP
     query for the IP address. */
  if (dest == NULL) {
    err = etharp_query(netif,  queryaddr, p);
     return err;    
  }
  ethhdr = p->payload;
  for(i = 0; i < 3; i++) {
    ethhdr->dest.addr[i] = dest->addr[i];
    ethhdr->src.addr[i] = dev->dev_addr.addr[i];
  }
ethhdr->type = htons(ETHTYPE_IP);
#ifdef LINK_STATS
    lwip_stats.link.xmit++;
#endif /* LINK_STATS */
   return low_level_output(netif, p);

}

/*-----------------------------------------------------------------------------------*/
static void
ethernetif_input(struct netif *netif)
{
  struct EtherDev *dev;
  struct eth_hdr *ethhdr;
  struct pbuf *p;
  dev = netif->state;
  p = low_level_input(netif);
  if (p != NULL) {
#ifdef LINK_STATS
    lwip_stats.link.recv++;
#endif /* LINK_STATS */
    ethhdr = p->payload;    
    switch (htons(ethhdr->type)) {
    case ETHTYPE_IP:
      etharp_ip_input(netif, p);
      pbuf_header(p, -14);
      netif->input(p, netif);
      break;
    case ETHTYPE_ARP:
      p = etharp_arp_input(netif, &(dev->dev_addr), p);
      if (p != NULL) {
  low_level_output(netif, p);
  pbuf_free(p);
      }
      break;
    default:
      pbuf_free(p);
      break;
    }
  }
}
/*-----------------------------------------------------------------------------------*/
void
etharp_timer(void *arg)
{
struct EtherDev *dev = arg;
if (!(ior(NSR) & 1<<6))
    dev->link_mode = DM9K_DISCONN;
    else dev->link_mode = dev->op_mode;
etharp_tmr();
sys_timeout(etharp_TMR_INTERVAL, etharp_timer, NULL);
}
/*-----------------------------------------------------------------------------------*/
/*
 * ethernetif_init():
 *
 * Should be called at the beginning of the program to set up the
 * network interface. It calls the function low_level_init() to do the
 * actual setup of the hardware.
 *
 */
/*-----------------------------------------------------------------------------------*/
err_t
ethernetif_init(struct netif *netif)
{
int i;
  if (dmfe_probe(dmfe_dev)!=0) 
  {
  	DEBUGF(DM9K_DEBUG | DBG_TRACE, ("device not found!\n"));
  	return ERR_IF;
}; 	
  netif->state =  dmfe_dev;
  netif->name[0] = IFNAME0;
  netif->name[1] = IFNAME1;
  netif->hwaddr_len = 3;
  netif->output = ethernetif_output;
  netif->linkoutput = low_level_output;
   for (i = 0; i < netif->hwaddr_len; ++i) {
     netif->hwaddr[i] = dmfe_dev->dev_addr.addr[i];
      }
  low_level_init(netif);
  etharp_init();
  return ERR_OK;
  sys_timeout(etharp_TMR_INTERVAL, etharp_timer, NULL);
}
/*-----------------------------------------------------------------------------------*/




/* 檢查 DM9K 接收內存是否還有新的封包 */
u8_t CheckNetPack(struct EtherDev *dev)
{
u16_t temp;
  ior(MRCMDX);
  switch(ior(MRCMDX))//DM9KREG_r(MRCMDX))                      /* 檢查是否有新的封包進入 */
    {
      case 0x00 :
        {
          return(0);                             /* 尚無封包進入 */
        }
      case 0x01 : return(1);              /* 有封包進入 */
      default   : 
            temp = ior(0xF4) + ior(0xF5)*256;
      		DEBUGF(DM9K_DEBUG | DBG_TRACE,("%02x",ior(MRCMDX)));
			dev->reset_rx_status++;
			dmfe_stop(dev);
			delay(200);
		    dmfe_init_DM9K(dev);      /* 內存出錯,重置 DM9K */
            return(0);
    }
}

void Ethernet_poll(struct netif *netif)
{
    if (((struct EtherDev *)(netif->state))->link_mode == DM9K_DISCONN)
    {
    DEBUGF(DM9K_DEBUG | DBG_TRACE,
        ("Hardware error!No Active network connected.\n \
           Please check your network interface.\n"));
    return;
    }
    if(CheckNetPack((struct EtherDev *)(netif->state))) 
      ethernetif_input(netif);   
}


?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美日韩在线电影| 亚洲综合激情另类小说区| 欧美精品一区二区久久久| 欧美一级艳片视频免费观看| 欧美电影影音先锋| 91精品国产色综合久久不卡电影| 欧美视频在线播放| 欧美男生操女生| 欧美精品1区2区| 欧美一卡二卡三卡四卡| 精品久久久久香蕉网| 精品国产麻豆免费人成网站| 精品国产一二三| 26uuu亚洲| 日本一区二区三区dvd视频在线| 国产丝袜美腿一区二区三区| 国产精品视频九色porn| 亚洲品质自拍视频网站| 亚洲一区在线观看视频| 视频一区二区不卡| 久久精品国产免费| 国产成人av一区二区三区在线 | 蜜桃av一区二区三区| 久久精品国产一区二区三| 精品在线观看免费| 成人av在线资源网站| 91同城在线观看| 欧美午夜一区二区三区| 日韩欧美美女一区二区三区| 国产亚洲女人久久久久毛片| 中文字幕佐山爱一区二区免费| 一区二区三区在线免费| 日本不卡一二三区黄网| 国产精品资源网| 91精品办公室少妇高潮对白| 欧美一级二级三级蜜桃| 中文一区在线播放| 亚洲国产精品久久人人爱蜜臀| 美国十次综合导航| 不卡的看片网站| 欧美精品电影在线播放| 国产三级一区二区三区| 亚洲一区日韩精品中文字幕| 久久精品国产99国产| av电影在线观看一区| 欧美色爱综合网| 日本一区二区三区在线不卡| 一区二区三区影院| 国产一区欧美一区| 欧美综合亚洲图片综合区| 欧美本精品男人aⅴ天堂| 《视频一区视频二区| 日韩av电影天堂| zzijzzij亚洲日本少妇熟睡| 欧美一二三区在线| 亚洲免费电影在线| 激情国产一区二区| 在线视频欧美精品| 欧美国产欧美综合| 天堂va蜜桃一区二区三区| 不卡大黄网站免费看| 日韩欧美国产精品| 亚洲国产aⅴ天堂久久| 国产99久久精品| 日韩欧美国产不卡| 亚洲综合激情网| www.欧美.com| 久久日韩粉嫩一区二区三区| 五月天亚洲婷婷| 色婷婷av一区二区三区gif | 亚洲视频 欧洲视频| 黄一区二区三区| 欧美精品在线一区二区三区| 亚洲欧美经典视频| 丁香桃色午夜亚洲一区二区三区| 欧美一区二区在线不卡| 亚洲另类在线制服丝袜| proumb性欧美在线观看| 久久精品一二三| 久久精工是国产品牌吗| 欧美精品在线观看播放| 一区二区三区欧美在线观看| 99久久久久久| 国产欧美日韩精品一区| 另类调教123区 | 亚洲成人tv网| 日本韩国精品一区二区在线观看| 国产精品网曝门| 国产精品一二三在| 久久婷婷色综合| 国产真实乱偷精品视频免| 日韩欧美在线123| 婷婷亚洲久悠悠色悠在线播放| 欧洲精品视频在线观看| 亚洲免费观看视频| 日本道免费精品一区二区三区| 一区精品在线播放| 不卡的电影网站| 中文字幕中文字幕在线一区| 从欧美一区二区三区| 欧美国产精品一区二区| 懂色av一区二区在线播放| 国产欧美一区二区三区沐欲| 国产电影一区在线| 欧美激情一区三区| 成人av电影观看| 亚洲女同女同女同女同女同69| 成人高清视频在线观看| 国产精品毛片久久久久久| www.av亚洲| 亚洲精品成人天堂一二三| 91高清视频免费看| 日韩激情一二三区| 日韩女优av电影| 国产一区免费电影| 国产精品久久久久影院| 色婷婷亚洲婷婷| 午夜精品影院在线观看| 欧美一卡2卡3卡4卡| 久久99蜜桃精品| 日本一区二区免费在线观看视频| 成+人+亚洲+综合天堂| 依依成人精品视频| 91麻豆精品国产自产在线观看一区| 97精品国产露脸对白| 亚洲在线视频免费观看| 欧美一区二区三区四区视频| 久久爱www久久做| 国产日韩欧美高清在线| 色妞www精品视频| 亚洲va欧美va人人爽午夜| 精品毛片乱码1区2区3区| 国产盗摄一区二区三区| 亚洲欧洲综合另类| 7878成人国产在线观看| 国产激情偷乱视频一区二区三区| 18涩涩午夜精品.www| 91精品啪在线观看国产60岁| 紧缚奴在线一区二区三区| 国产精品不卡视频| 欧美福利电影网| 国产成人aaa| 亚洲电影一区二区三区| 337p粉嫩大胆色噜噜噜噜亚洲| 不卡视频一二三| 日韩在线卡一卡二| 欧美激情一区三区| 777久久久精品| 成人激情午夜影院| 秋霞影院一区二区| 国产精品热久久久久夜色精品三区 | 成人的网站免费观看| 亚洲成人激情av| 久久久99精品久久| 欧美日韩卡一卡二| 国产91富婆露脸刺激对白| 亚洲第一激情av| 中文字幕精品综合| 日韩三级视频中文字幕| 91女人视频在线观看| 精品一区二区三区蜜桃| 亚洲国产精品综合小说图片区| 久久九九久久九九| 欧美日韩大陆在线| 99久久国产综合精品麻豆| 精品一区二区三区不卡| 亚洲午夜日本在线观看| 国产精品免费观看视频| 日韩欧美成人激情| 欧美三级资源在线| 91啪亚洲精品| 风间由美一区二区av101| 麻豆国产精品官网| 亚洲国产一二三| 国产精品对白交换视频 | 亚洲成av人在线观看| 国产精品国产三级国产a| 精品美女在线播放| 在线播放视频一区| 欧美中文字幕一二三区视频| 成人免费视频app| 精品一区二区三区av| 日韩电影在线一区| 亚洲一二三区视频在线观看| 亚洲欧洲日本在线| 欧美高清在线视频| 久久一区二区三区四区| 日韩欧美国产综合| 51精品视频一区二区三区| 在线观看成人小视频| 色综合天天综合给合国产| 从欧美一区二区三区| 国产麻豆精品在线观看| 精品一区二区成人精品| 日韩电影一二三区| 天天综合色天天| 五月天国产精品| 五月天亚洲精品| 日韩精品乱码av一区二区| 亚洲国产视频直播|