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

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

?? altera_avalon_dm9000.c

?? FPGA應用如sd卡控制
?? C
字號:
/******************************************************************************************

**--------------File Info-------------------------------------------------------------------------------
** File name:			  ctr_avalon_dm9000.c
** Modified by:duckfun
** Modified date:2006-10-20
** Version:
** Descriptions:
**
********************************************************************************************************/

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include "alt_types.h"
#include "altera_avalon_dm9000_regs.h"
#include "lwip/opt.h"
#include "lwip/def.h"
#include "lwip/mem.h"
#include "lwip/pbuf.h"
#include "lwip/sys.h"
#include "lwip/netif.h"
#include "lwip/stats.h"
#include "netif/etharp.h"
#include "arch/perf.h"
#include "sys/alt_irq.h"
#include "altera_avalon_dm9000.h"
#include "io.h"
#include "altera_avalon_pio_regs.h"

#define USE_ARP_SEMAPHORE


#ifdef ALT_DEBUG
#define	VERB(msg) printf msg
#else
#define	VERB(msg) do { } while (0)
#endif

inline void dm9k_idxout(alt_avalon_dm9k_if * pdev, u_char val)
{
	IOWR(pdev->base_addr, pdev->index_offset, val);
}

inline u_char dm9k_idxin(alt_avalon_dm9k_if * pdev)
{
	return (u_char)(IORD(pdev->base_addr, pdev->index_offset) & 0xff);
}

inline void dm9k_datout(alt_avalon_dm9k_if * pdev, u_char val)
{
	IOWR(pdev->base_addr, pdev->data_offset, val);
}

inline u_char dm9k_datin(alt_avalon_dm9k_if * pdev)
{
	return (u_char)(IORD(pdev->base_addr, pdev->data_offset) & 0xff );
}

inline void dm9k_datoutw(alt_avalon_dm9k_if * pdev, u_short val)
{
	IOWR(pdev->base_addr, pdev->data_offset, val);
}

inline u_short dm9k_datinw(alt_avalon_dm9k_if * pdev)
{
	return (u_short)(IORD(pdev->base_addr, pdev->data_offset) & 0xffff );
}

inline void dm9k_datoutl(alt_avalon_dm9k_if * pdev, u_long val)
{
	IOWR(pdev->base_addr, pdev->data_offset, val);
}

inline u_long dm9k_datinl(alt_avalon_dm9k_if * pdev)
{
	return (u_long)(IORD(pdev->base_addr, pdev->data_offset));
}

inline u_char dm9k_regin(alt_avalon_dm9k_if * pdev, u_char regidx)
{
	dm9k_idxout(pdev, regidx);
	return dm9k_datin(pdev);
}

inline void dm9k_regout(alt_avalon_dm9k_if * pdev, u_char regidx, u_char val)
{
	dm9k_idxout(pdev, regidx);
	dm9k_datout(pdev, val);
}

inline void dm9k_meminw(alt_avalon_dm9k_if * pdev, u_short * pbuffer, int len)
{
	dm9k_idxout(pdev, 0xf2);
	for(len=(len+1)/2;len--;) *pbuffer++ = dm9k_datinw(pdev);
}

inline void dm9k_memoutw(alt_avalon_dm9k_if * pdev, u_short * pbuffer, int len)
{
	dm9k_idxout(pdev, 0xf8);
	for(len=(len+1)/2;len--;) dm9k_datoutw(pdev, *pbuffer++);
}

int dm9k_identify(alt_avalon_dm9k_if * pdev)
{
	// vid(29:28) = 0A:46
	if((dm9k_regin(pdev, 0x28) != 0x46) || (dm9k_regin(pdev, 0x29) != 0x0a)) return -1;
	// pid(2B:2A) = 90:00
	if((dm9k_regin(pdev, 0x2A) != 0x00) || (dm9k_regin(pdev, 0x2B) != 0x90)) return -1;

	return 0;
}


err_t alt_avalon_dm9k_init(struct netif *netif)
{
	int i;
	alt_avalon_dm9k_if * pdev = (alt_avalon_dm9k_if*)netif->state;
	pdev->lwip_dev_list.dev.netif = netif;

	// check private data's availability	
	if (!pdev) return ERR_IF;

	// identify our device
	if(dm9k_identify(pdev) == -1) return ERR_IF;
	
	// specify callback routines
	netif->name[0] = 'd';
	netif->name[1] = 'm';
	netif->output = dm9k_output;
	netif->linkoutput = dm9k_link_output;
	
	// set physical address
	// 
	pdev->hwaddr[5] = IORD(PIO_KEY_BASE, 0) & 0xFF;
	for(i=0;i<(netif->hwaddr_len = 6);i++) netif->hwaddr[i] = pdev->hwaddr[i];
	
	// dm9k initialization
	if(dm9k_init(pdev) != ERR_OK || 
		!(pdev->arp_semaphore = sys_sem_new(1)) ||
		!(pdev->tx_semaphore = sys_sem_new(pdev->dm9k_tx_space))
		)
	{
		free(netif->state);
		return ERR_IF;
	} // of dm9k initialization
	
	etharp_init();
	
	return ERR_OK;
}

void alt_avalon_dm9k_rx(alt_lwip_dev * paltdev)
{
	alt_avalon_dm9k_if * pdev = (alt_avalon_dm9k_if*)(paltdev->netif->state);
	
	// save current index register
	volatile u_char idxold = dm9k_idxin(pdev);
	
	for(;dm9k_input(paltdev->netif););
	
	// resotre old idx register
	dm9k_idxout(pdev, idxold);
}


err_t dm9k_init(alt_avalon_dm9k_if * pdev)
{
	int i;
	
	// 1. power on internal PHY
	dm9k_regout(pdev, 0x1f, 0x00);
	usleep(5000);
	
	// 2. software reset 
	dm9k_regout(pdev, 0x00, 0x03);
	usleep(5000);
	
	// 3. clear Network Stautus Register(NSR) by reading out
	dm9k_regin(pdev, 0x01);
	
	// 4. set MAC address
	for(i=0;i<6;i++) dm9k_regout(pdev, 0x10+i, pdev->hwaddr[i]);
	
	// 4.1 set hash table
	// for(i=0;i<6;i++) dm9k_regout(pdev, 0x16+i, 0xff);
	
	// 5. clear Interrupt Status Register (NSR)
	dm9k_regout(pdev, 0xfe, 0x00);
		
	// 6. register interrupt handler
	alt_irq_register(pdev->irq, (void*)pdev, (void*)dm9k_isr); 

	pdev->dm9k_linked = (dm9k_regin(pdev, 0x01) & 0x40) >> 6;
	
	// 7. interrupt enable, 5: Link, 1: TX, 0: RX
	dm9k_regout(pdev, 0xff, 0xbf);
	//dm9k_regout(pdev, 0xff, ((1<<1)|(1<<0)));
	
	// 8. RX start, 5: Discard long, 4: Discard CRC, 3: All multicast, 2: Runt, 1: Promiscuous, 0: RX enable
	dm9k_regout(pdev, 0x05, ((1<<5)|(1<<4)|(1<<3)|(1<<0)));
	
	return ERR_OK;
}

void dm9k_isr(void * pvoid)
{
	volatile u_char ist, nsr;
	u_char curridx;
	alt_avalon_dm9k_if * pdev = (alt_avalon_dm9k_if*)pvoid;
	
	// save current index port value
	curridx = dm9k_idxin(pdev);

	// 1. handle RX activity
	// read/clear interrupt status register
	dm9k_regout(pdev, 0xfe, (ist = dm9k_regin(pdev, 0xfe)));

{
	if(ist & (1<<2)) VERB(("<ROS>"));
	if(ist & (1<<3)) VERB(("<ROOS>"));
}
	
	// check rx availability, roos(3), ros(2), rx(0)
	if(ist & ((1<<3)|(1<<2)|(1<<0))) sys_mbox_post(rx_mbox, &(pdev->lwip_dev_list.dev));
	
	// 2. check tx completeness
	// read/clear network status register
	dm9k_regout(pdev, 0x01, (nsr = dm9k_regin(pdev, 0x01)));
	
	// update link status
	pdev->dm9k_linked = (nsr & 0x40) >> 6;

	// check completeness
	if(nsr & 0x08) sys_sem_signal(pdev->tx_semaphore);
	if(nsr & 0x04) sys_sem_signal(pdev->tx_semaphore);

	// restore index register
	dm9k_idxout(pdev, curridx);
} // void dm9k_isr()

err_t dm9k_output(struct netif *netif, struct pbuf *p, struct ip_addr *ipaddr)
{
	err_t err;
	alt_avalon_dm9k_if * pdev = (alt_avalon_dm9k_if*)netif->state;
	
	/* 
	* resolve hardware address, then send (or queue) packet 
	* The code which updates the ARP tables does not appear to be thread safe
	* so I've added a MUTEX around all calls to the arp code
	* 
	*/
	
	WAIT_ARP_SEMAPHORE(pdev);
	err = etharp_output(netif, ipaddr, p);
	SIGNAL_ARP_SEMAPHORE(pdev);
	
	return err;
}

err_t dm9k_link_output(struct netif *netif, struct pbuf *p)
{
	alt_avalon_dm9k_if * pdev = (alt_avalon_dm9k_if*)netif->state;
	
	// wait tx resource availability
	sys_sem_wait(pdev->tx_semaphore);

	// fill packet to MAC
	dm9k_memoutw(pdev, (u_short*)(p->payload), p->tot_len);
	
	// specify the length
	dm9k_regout(pdev, 0xfc, (u_char)(p->tot_len & 0xff));
	dm9k_regout(pdev, 0xfd, (u_char)((p->tot_len & 0xff00) >> 8));

	// kick start
	dm9k_regout(pdev, 0x02, 0x01);

	return ERR_OK;
}

int dm9k_input(struct netif *netif)
{
	struct eth_hdr  *ethhdr;
	struct pbuf     *p;
	alt_avalon_dm9k_if * pdev = (alt_avalon_dm9k_if*)netif->state;

	/* move received packet into a new pbuf */
	if(!(p = dm9k_link_input(pdev))) return 0;

	ethhdr = (struct eth_hdr*)(p->payload);

	switch (htons(ethhdr->type)) {
	/* IP packet? */
	case ETHTYPE_IP:
		/* 
		* update ARP table 
		*/

		WAIT_ARP_SEMAPHORE(pdev);
		etharp_ip_input(netif, p);
		SIGNAL_ARP_SEMAPHORE(pdev);
		
		/* skip Ethernet header */
		pbuf_header(p, -(s16_t)sizeof(struct eth_hdr));

		/* pass to network layer */
		netif->input(p, netif);
		
		break;

	case ETHTYPE_ARP:
		/* 
		* pass p to ARP module  
		* 
		*/
		WAIT_ARP_SEMAPHORE(pdev);
		etharp_arp_input(netif, (struct eth_addr *)&netif->hwaddr, p);
		SIGNAL_ARP_SEMAPHORE(pdev);
		break;

	default:
		pbuf_free(p);
		p = NULL;
		break;
	} // of packet type switch
	
	return 1;
} // of alt_avalon_dm9k_rx

struct pbuf * dm9k_link_input(alt_avalon_dm9k_if * pdev)
{
	u_char saveidx;
	
	struct pbuf *p, *q;
	volatile u_short pklen, status;
	u_short remains;
	
	saveidx = dm9k_idxin(pdev);
	
	// check RX availability
	// first, dummy read
	dm9k_idxout(pdev, 0xf0);
	status = dm9k_datinw(pdev);
	// re-read again
	status = dm9k_datinw(pdev);
	if((status & 0xff) != 0x01) 
	{
		dm9k_idxout(pdev, saveidx);
		return NULL;
	}

	// now, read status word and set pointer to increment automatically
	dm9k_idxout(pdev, 0xf2);
	status = dm9k_datinw(pdev);
	
	// read packet length, eliminate 4 byte CRC
	pklen = dm9k_datinw(pdev) - 4;
	
	// allocate buffer
	if(!(p = pbuf_alloc(PBUF_RAW, pklen, PBUF_POOL)))
	{
		// OOOPS!
		// handle pointer adjustment, can add ptr directly, too
		VERB(("<oop>"));
		
		dm9k_idxout(pdev, 0xf2);
		for(remains = (pklen+4+1)/2; remains--;) dm9k_datinw(pdev);
		
		dm9k_idxout(pdev, saveidx);
		return NULL;
	}
	
	// fill packet per chunk
	for(remains=pklen, q = p; remains && q; q = q->next)
	{
		dm9k_meminw(pdev, q->payload, q->len);
		remains -= q->len;
	} // of fill loop

	// finally, read out the 4-byte CRC
	dm9k_datinw(pdev);
	dm9k_datinw(pdev);

#if LINK_STATS
	lwip_stats.link.recv++;
#endif /* LINK_STATS */      

	dm9k_idxout(pdev, saveidx);
	return p;

}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
粉嫩高潮美女一区二区三区| 欧美成va人片在线观看| 亚洲大片免费看| 国产精品色一区二区三区| 日韩免费视频一区| 精品久久久久久久久久久久久久久久久 | 欧美日韩1234| 精品婷婷伊人一区三区三| 日本丰满少妇一区二区三区| av不卡一区二区三区| 99re成人在线| 色播五月激情综合网| 欧洲精品一区二区| 91在线精品秘密一区二区| 91看片淫黄大片一级| 欧美三级蜜桃2在线观看| 欧美日产国产精品| 精品久久久久久亚洲综合网 | 老鸭窝一区二区久久精品| 久久国产精品99久久久久久老狼| 精品午夜久久福利影院| 国产精品99久久久久久久女警| 成人精品视频一区二区三区尤物| 成人夜色视频网站在线观看| 色综合久久久久久久久久久| 欧美日免费三级在线| 久久免费精品国产久精品久久久久| 中文av字幕一区| 亚洲h在线观看| 粗大黑人巨茎大战欧美成人| 一本大道久久a久久综合| 7777精品伊人久久久大香线蕉超级流畅 | 国产成人综合自拍| 一本大道综合伊人精品热热 | 亚洲美女屁股眼交3| 日本在线不卡一区| jizzjizzjizz欧美| 欧美日韩国产大片| 久久久久国产免费免费| 一区二区三区精品在线观看| 国产曰批免费观看久久久| 91精品1区2区| 久久久久久综合| 午夜亚洲国产au精品一区二区| 国产成人精品一区二区三区四区| 欧美日本一区二区| 国产精品久久久久aaaa| 韩国成人精品a∨在线观看| 欧美色综合影院| 国产精品毛片无遮挡高清| 另类中文字幕网| 欧美精品黑人性xxxx| 亚洲欧美精品午睡沙发| 国产乱子伦视频一区二区三区 | 婷婷开心激情综合| 99久久综合狠狠综合久久| 久久久另类综合| 性感美女极品91精品| 色先锋aa成人| 中文字幕va一区二区三区| 国产一区二区三区四区五区入口| 欧美精品亚洲二区| 亚洲一区免费视频| 欧洲国内综合视频| 亚洲在线视频免费观看| 色婷婷久久99综合精品jk白丝| 中文字幕一区二区在线播放| 成人理论电影网| 久久久久九九视频| 国产99久久久久| 国产三级一区二区三区| 国产激情偷乱视频一区二区三区 | 亚洲欧美韩国综合色| 国产九色精品成人porny| 久久影视一区二区| 国精品**一区二区三区在线蜜桃| 91精品国产综合久久国产大片 | 亚洲天堂2014| 99久久99久久精品免费观看| 国产精品免费看片| av亚洲精华国产精华| 亚洲欧洲国产专区| 色噜噜狠狠一区二区三区果冻| 亚洲精品视频在线观看网站| 色94色欧美sute亚洲线路一ni| 亚洲综合久久久久| 欧美日韩高清不卡| 久久av老司机精品网站导航| 日韩三级av在线播放| 国产一区二区毛片| 亚洲欧美日韩一区二区 | 91精品久久久久久久99蜜桃| 天堂成人免费av电影一区| 欧美一区永久视频免费观看| 国产一区二区三区| 亚洲人成7777| 日韩一区二区精品在线观看| 国产毛片精品一区| 亚洲免费在线视频一区 二区| 色欧美乱欧美15图片| 亚洲成av人片一区二区三区| 精品久久一二三区| 99久久精品免费精品国产| 丝瓜av网站精品一区二区| 久久五月婷婷丁香社区| 一本大道久久a久久综合| 日本伊人精品一区二区三区观看方式 | 337p亚洲精品色噜噜狠狠| 九色porny丨国产精品| 国产精品女主播av| 制服.丝袜.亚洲.另类.中文| 国产a精品视频| 日韩福利电影在线| 国产精品嫩草影院av蜜臀| 欧美欧美欧美欧美首页| 国产999精品久久久久久| 亚洲一区av在线| 国产欧美日韩视频一区二区| 欧美日韩国产高清一区二区三区 | 色婷婷狠狠综合| 黄色小说综合网站| 亚洲影视在线观看| 国产日韩欧美在线一区| 91精品国产91久久久久久一区二区| 风间由美一区二区三区在线观看 | 亚洲一二三四区不卡| 精品日韩一区二区| 欧美视频一区二区三区四区 | 精品无人码麻豆乱码1区2区 | 久久精品噜噜噜成人av农村| 亚洲视频网在线直播| 久久精品欧美日韩精品 | 成人免费在线观看入口| 欧美精品一区二区久久婷婷| 欧美日韩视频不卡| 色哟哟国产精品免费观看| 成人黄色一级视频| 国产成人精品免费| 国产成a人亚洲| 国内偷窥港台综合视频在线播放| 天天色 色综合| 亚洲成人在线网站| 一卡二卡三卡日韩欧美| 亚洲色图欧美激情| 亚洲猫色日本管| 亚洲情趣在线观看| 自拍偷自拍亚洲精品播放| 亚洲欧洲www| 亚洲日本va午夜在线电影| 中文字幕在线不卡视频| 国产精品国产三级国产aⅴ入口| 精品国产免费一区二区三区香蕉| 日韩亚洲欧美在线| 欧美va日韩va| 久久无码av三级| 中文字幕第一区第二区| 国产精品美女久久久久高潮| 最新日韩av在线| 亚洲精品免费播放| 亚洲国产精品久久不卡毛片 | 欧美不卡123| 国产亚洲欧洲一区高清在线观看| 26uuu国产电影一区二区| 久久精品夜色噜噜亚洲aⅴ| 国产精品网友自拍| 亚洲精品日韩综合观看成人91| 亚洲午夜一区二区| 免费成人在线观看| 国产成人免费av在线| 色系网站成人免费| 欧美福利视频一区| 久久人人97超碰com| 国产精品国产三级国产三级人妇 | 欧美成人性战久久| 国产欧美精品区一区二区三区| 中文字幕成人在线观看| 亚洲精品美腿丝袜| 精品中文字幕一区二区 | 免费成人你懂的| 极品瑜伽女神91| av高清久久久| 欧美日韩国产首页| 国产蜜臀av在线一区二区三区| 国产精品久久久久久一区二区三区| 亚洲精品国产成人久久av盗摄| 三级欧美在线一区| 成人国产电影网| 91精品福利在线一区二区三区| 国产精品三级久久久久三级| 午夜亚洲国产au精品一区二区| 国产电影一区二区三区| 在线观看91精品国产入口| 久久精品一区二区| 日韩国产高清影视| 一本大道久久a久久精二百| 日韩欧美一区二区久久婷婷| 亚洲欧洲国产日本综合| 精品中文av资源站在线观看| 91丨国产丨九色丨pron| 久久久久久久久蜜桃|