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

? 歡迎來(lái)到蟲(chóng)蟲(chóng)下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲(chóng)蟲(chóng)下載站

?? altera_avalon_dm9000.c

?? FPGA應(yīng)用如sd卡控制
?? C
字號(hào):
/******************************************************************************************

**--------------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;

}

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产91丝袜在线观看| av中文字幕不卡| 国产精品丝袜一区| 欧美日本一道本| 国产一区二区三区不卡在线观看| 亚洲视频在线观看一区| 日韩一卡二卡三卡国产欧美| 成人少妇影院yyyy| 久久国产精品99精品国产| 亚洲色图另类专区| 久久精品综合网| 777午夜精品视频在线播放| eeuss鲁片一区二区三区 | 亚洲不卡在线观看| 欧美国产丝袜视频| 日韩欧美高清一区| 欧美日韩五月天| 色诱亚洲精品久久久久久| 极品少妇xxxx精品少妇偷拍| 午夜伦理一区二区| 亚洲少妇屁股交4| 国产精品成人免费精品自在线观看| 欧美成人精品3d动漫h| 精品视频1区2区| 欧美在线视频你懂得| 色欧美88888久久久久久影院| 粉嫩一区二区三区性色av| 激情综合一区二区三区| 强制捆绑调教一区二区| 日本在线播放一区二区三区| 亚洲国产日日夜夜| 樱桃国产成人精品视频| 国产精品女同一区二区三区| 久久综合五月天婷婷伊人| 日韩一区二区在线观看| 欧美精品777| 91精品国产aⅴ一区二区| 欧美肥妇bbw| 91精品婷婷国产综合久久 | 日本黄色一区二区| 成人av综合一区| 成人精品免费看| 极品少妇一区二区三区精品视频 | 激情综合五月天| 裸体健美xxxx欧美裸体表演| 免费成人你懂的| 蜜桃一区二区三区在线| 黄色日韩网站视频| 国产一区二区精品久久91| 岛国一区二区在线观看| 97久久精品人人爽人人爽蜜臀| 国产河南妇女毛片精品久久久| 懂色av一区二区三区免费观看| 国产精品91xxx| 懂色av一区二区在线播放| 不卡高清视频专区| 欧美在线制服丝袜| 91精品福利在线一区二区三区| 精品免费一区二区三区| 久久精品一二三| 成人欧美一区二区三区在线播放| 亚洲欧美日韩系列| 性做久久久久久免费观看| 蜜桃av噜噜一区| 国产成人午夜视频| 91在线国产观看| 欧美精品在线观看一区二区| 日韩精品一区二区在线| 国产精品热久久久久夜色精品三区 | 欧美成人精精品一区二区频| 中文乱码免费一区二区| 亚洲摸摸操操av| 奇米精品一区二区三区在线观看 | 成人网页在线观看| 欧美亚洲另类激情小说| 4438x成人网最大色成网站| 精品成人一区二区三区四区| 国产精品色哟哟网站| 亚洲综合激情网| 国内外成人在线视频| 91在线观看免费视频| 91精品国产综合久久久久| 国产免费观看久久| 亚洲成人在线免费| 国产不卡一区视频| 欧美精品粉嫩高潮一区二区| 精品国产青草久久久久福利| 中文字幕一区免费在线观看| 日韩成人av影视| 99久精品国产| 日韩精品一区国产麻豆| 亚洲精品老司机| 国产成人精品影院| 宅男噜噜噜66一区二区66| 久久精品男人的天堂| 亚洲成人三级小说| 不卡大黄网站免费看| 精品伦理精品一区| 亚洲午夜影视影院在线观看| 成人综合婷婷国产精品久久| 欧美日韩国产综合草草| 国产视频视频一区| 免费视频最近日韩| 精品视频123区在线观看| 国产精品久久久久久一区二区三区| 首页欧美精品中文字幕| 91日韩在线专区| 久久蜜桃一区二区| 麻豆精品在线播放| 欧美日韩高清一区二区不卡| 国产精品视频看| 国产成人免费在线观看不卡| 4438x成人网最大色成网站| 一区二区三区四区在线免费观看| 国产精品99久久久久久久女警| 欧美一区二区三区免费大片 | 欧美性猛片aaaaaaa做受| 欧美国产禁国产网站cc| 韩国精品一区二区| 精品国产网站在线观看| 日韩在线一二三区| 欧美午夜一区二区三区| 亚洲美女免费视频| 97精品视频在线观看自产线路二| 久久久久国产精品厨房| 激情综合色播五月| 日韩精品中文字幕在线不卡尤物| 亚洲成a人片综合在线| 色网站国产精品| 亚洲视频1区2区| 99精品视频中文字幕| 国产精品嫩草久久久久| 国产高清不卡二三区| 亚洲精品一区二区在线观看| 久久国产精品免费| 欧美成人国产一区二区| 蜜芽一区二区三区| 欧美一卡2卡三卡4卡5免费| 天天综合色天天综合| 欧美日韩精品免费| 日韩福利电影在线| 精品成人一区二区三区| 国产精品1024久久| 亚洲欧洲韩国日本视频| 色综合天天综合在线视频| 亚洲欧美一区二区不卡| 色悠悠亚洲一区二区| 午夜精品一区二区三区电影天堂| 欧洲国内综合视频| 日本一道高清亚洲日美韩| 欧美一级日韩免费不卡| 狠狠色丁香久久婷婷综合丁香| 久久尤物电影视频在线观看| 国产成人在线看| 亚洲另类色综合网站| 欧美三级韩国三级日本三斤| 日本免费新一区视频| 精品欧美久久久| av在线这里只有精品| 午夜精品国产更新| 精品欧美久久久| 91在线观看地址| 丝袜亚洲精品中文字幕一区| 精品毛片乱码1区2区3区 | 色综合天天综合在线视频| 亚洲高清免费观看 | 欧美日韩aaaaaa| 国产精品资源在线| 亚洲欧美偷拍三级| 欧美一区二区大片| 国产传媒日韩欧美成人| 一区二区三区在线免费视频| 欧美老女人第四色| 高清不卡在线观看| 一区二区三区**美女毛片| 日韩欧美激情在线| 91一区一区三区| 男女男精品视频网| 欧美国产精品一区| 91精品婷婷国产综合久久性色| 国产福利精品导航| 午夜伦欧美伦电影理论片| 国产女人aaa级久久久级| 在线观看视频一区二区| 国产精品小仙女| 午夜私人影院久久久久| 国产欧美日产一区| 欧美视频第二页| 国内精品嫩模私拍在线| 一区二区三区鲁丝不卡| 久久久久久久久岛国免费| 欧美伊人久久久久久久久影院 | 国产成人精品亚洲777人妖 | 奇米色777欧美一区二区| |精品福利一区二区三区| 欧美不卡视频一区| 欧美在线观看视频在线| 国产成人精品免费视频网站| 奇米影视7777精品一区二区| 亚洲综合在线免费观看|