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

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

?? cs8900a.c

?? Embest EudKit-II教學系統配Samsung S3C44B0處理器的部分測試程序。
?? C
字號:
/*********************************************************************************************
* File:	cs8900a.c
* Author:	Embest
* Desc:	cs8900a ethernet chip driver
* History:	
*********************************************************************************************/
#include "cs8900a.h"


#define MEM_BASE	0x06000000
#define IO_BASE		0x07000300
#define MAX_COUNT	0x00100000


#define io_write(addr, val)	(*(volatile unsigned short *)(addr) = val)
#define io_read(addr)		((unsigned short)*(volatile unsigned short *)(addr))


#ifdef MEM_MODE
inline void reg_write(unsigned short reg, unsigned short val)
{
	io_write((MEM_BASE+reg), val);
}
inline unsigned short reg_read(unsigned short reg)
{
	return io_read(MEM_BASE+reg);
}
#else /* IO_MODE */
inline void reg_write(unsigned short reg, unsigned short val)
{
	io_write(IO_BASE+IO_PACKETPAGE_POINTER, reg);
	io_write(IO_BASE+IO_PACKETPAGE_DATA0, val);
}
inline unsigned short reg_read(unsigned short reg)
{
	io_write(IO_BASE+IO_PACKETPAGE_POINTER, reg);
	return io_read(IO_BASE+IO_PACKETPAGE_DATA0);
}
#endif /* MEM_MODE */


unsigned char mac_addr[6] = { 0x00,0x06,0x98,0x01,0x7E,0x8F };
unsigned char net_out_data[1536];
unsigned char net_in_data[1536];
int iReceiveData;
int iSendData;


int CS_Probe(void)
{
	unsigned short id, sign;

	sign = io_read(IO_BASE+IO_PACKETPAGE_POINTER);

	io_write(IO_BASE+IO_PACKETPAGE_POINTER, REG_Identification);
	id = io_read(IO_BASE+IO_PACKETPAGE_DATA0);

	if(sign != ID_SIGNATURE || id != ID_CODE)
		return 0;

	return 1;
}


void CS_SetupMemoryBase(unsigned int base)
{
	unsigned short temp;
	/* set memory map base address */
	io_write(IO_BASE+IO_PACKETPAGE_POINTER, REG_MemoryBaseAddress);
	io_write(IO_BASE+IO_PACKETPAGE_DATA0, base & 0xffff);
	io_write(IO_BASE+IO_PACKETPAGE_POINTER, REG_MemoryBaseAddress+2);
	io_write(IO_BASE+IO_PACKETPAGE_DATA0, base >> 16);

	/* read bus control register */
	io_write(IO_BASE+IO_PACKETPAGE_POINTER, REG_BusCTL);
	temp = io_read(IO_BASE+IO_PACKETPAGE_DATA0);
	/* enable memory map */
	temp |= MemoryE;
	io_write(IO_BASE+IO_PACKETPAGE_POINTER, REG_BusCTL);
	io_write(IO_BASE+IO_PACKETPAGE_DATA0, temp);
}


int CS_Reset(void)
{
	int i;
	unsigned short result;

	/* software reset */
	io_write(IO_BASE+IO_PACKETPAGE_POINTER, REG_SelfCTL);
	io_write(IO_BASE+IO_PACKETPAGE_DATA0, RESET|SelfCTL_LOW);

	/* while INITD bit set */
	for(i=0; i<MAX_COUNT; i++)
	{
		io_write(IO_BASE+IO_PACKETPAGE_POINTER, REG_SelfST);
		result = io_read(IO_BASE+IO_PACKETPAGE_DATA0);
		if(result & INITD) break;
	}
	if(i >= MAX_COUNT)
		return 0;

	/* while SIBUSY bit clean */
	for(i=0; i<MAX_COUNT; i++)
	{
		io_write(IO_BASE+IO_PACKETPAGE_POINTER, REG_SelfST);
		result = io_read(IO_BASE+IO_PACKETPAGE_DATA0);
		if((result & SIBUSY) == 0) break;
	}
	if(i >= MAX_COUNT)
		return 0;

	return 1;
}


unsigned short CS_Identification(unsigned short *rev)
{
	unsigned int id;

	id = reg_read(REG_Identification);
	*rev = reg_read(REG_Identification+2);

	return id;
}


void CS_SetupMacAddr(unsigned char *mac)
{
	reg_write(REG_IA, *(unsigned short *)(mac));
	reg_write(REG_IA+2, *(unsigned short *)(mac+2));
	reg_write(REG_IA+4, *(unsigned short *)(mac+4));
}


void CS_EnableIrq(int enable)
{
	unsigned short temp;

	temp = reg_read(REG_BusCTL);

	if(enable)
	{
		temp |= EnableIRQ;
		reg_write(REG_InterruptNumber, INTRQ0);
	}
	else
	{
		temp &= ~EnableIRQ;
		reg_write(REG_InterruptNumber, ALL_INTRQ_HI);

		temp = reg_read(REG_ISQ);
		temp &= LOW_BITS_MASK;
		switch(temp)
		{
		case 0x04: reg_read(REG_RxEvent); break;
		case 0x08: reg_read(REG_TxEvent); break;
		case 0x0C: reg_read(REG_BufEvent); break;
		case 0x10: reg_read(REG_RxMISS); break;
		case 0x12: reg_read(REG_TxCOL); break;
		}
	}
}


void CS_Configuration(void)
{
	unsigned short temp;

	/* configure LineCTL */
	temp = reg_read(REG_LineCTL);
	temp &= ~(AUIonly | AutoAUI_10BT);
	temp |= (SerRxON | SerTxON | ModBackOffE);
	reg_write(REG_LineCTL, temp);

	/* configure RxCTL */
	reg_write(REG_RxCTL, RxOKA | IdividualA | BroadcastA | RxCTL_LOW);

	/* configure RxCFG */
	reg_write(REG_RxCFG, RxCFG_LOW);

	/* configure TxCFG */
	reg_write(REG_TxCFG, TxCFG_LOW);
}	
		

int CS_Init(void)
{
	unsigned short id, rev;

	CS_Probe();

	if(!CS_Reset())
	{
		uart_printf("  Reset CS8900A failed.\n");
		return 0;
	}
	uart_printf("  Reset CS8900A successful, ");

#ifdef MEM_MODE
	CS_SetupMemoryBase(MEM_BASE);
#endif

	id = CS_Identification(&rev);
	switch(rev)
	{
	case REV_B: uart_printf("  Rev B.\n"); break;
	case REV_C: uart_printf("  Rev C.\n"); break;
	case REV_D: uart_printf("  Rev D.\n"); break;
	case REV_F: uart_printf("  Rev F.\n"); break;
	}

	CS_SetupMacAddr(mac_addr);
	CS_EnableIrq(0);
	CS_Configuration();

	return 1;
}


void CS_Close(void)
{
	CS_EnableIrq(0);

	reg_read(REG_RxEvent);
	reg_read(REG_TxEvent);

	/* cleanup LineCTL */
	reg_write(REG_LineCTL, LineCTL_LOW);

	/* cleanup RxCTL */
	reg_write(REG_RxCTL, RxCTL_LOW);

	/* cleanup RxCFG */
	reg_write(REG_RxCFG, RxCFG_LOW);

	/* cleanup TxCFG */
	reg_write(REG_TxCFG, TxCFG_LOW);
}


int CS_ReceivePacket(unsigned int tms)
{
	int i, length;
	unsigned short *buf;

	tms *= 50;
	while(tms)
	{
		unsigned short temp = reg_read(REG_ISQ);
		temp = reg_read(REG_RxEvent);
		if(temp & RxOK) break;
		tms --;
	}

	if(tms == 0)
		return 0;

	/* Discard RxStatus */
	reg_read(REG_RxStatus);
	/* Read the frame's length.	*/
	length = reg_read(REG_RxLength);
#ifdef MEM_MODE
#else
	*(volatile unsigned char *)(IO_BASE+IO_RX_TX_DATA0);
#endif

	/* Read frame */
	buf = (unsigned short *)net_in_data;
	for(i=0; i<length; i+=2)
		*buf++ = io_read(IO_BASE+IO_RX_TX_DATA0);

	return length;
}


int CS_TransmitPacket(unsigned char *data, int length)
{
	int i;
	unsigned short *buf;

	/* Send Command */
#ifdef MEM_MODE
	reg_write(REG_TxCommand, TxStart | TxCMD_LOW);
	reg_write(REG_TxLength, (unsigned short)length);
#else
	io_write(IO_BASE+IO_TX_COMMAND, TxStart | TxCMD_LOW);
	io_write(IO_BASE+IO_TX_LENGTH, (unsigned short)length);
#endif


	/* Wait */
	for(i = 0; i < MAX_COUNT; i++)
	{
		unsigned short temp = reg_read(REG_BusST);
		if(temp & Rdy4TxNOW) break;
	} 

	if(i >= MAX_COUNT)
		return 0;

	buf = (unsigned short *)data;
	for(i=0; i<length; i+=2)
		io_write(IO_BASE+IO_RX_TX_DATA0, *buf++);

	iSendData = 0;

	return 1;
}


/*
* extern functions
*/
/*********************************************************************************************
* name:		NicInit
* func:		initialize CS8900A chip
* para:		none
* ret:		none
* modify:
* comment:		
*********************************************************************************************/
void NicInit(void)
{
	CS_Init();
	/* delay some times */
    delay(100);
}

/*********************************************************************************************
* name:		NicClose
* func:		close CS8900A chip
* para:		none
* ret:		none
* modify:
* comment:		
*********************************************************************************************/
void NicClose(void)
{
	/* close ethernet */
	CS_Close();
}

/*********************************************************************************************
* name:		NicReset
* func:		Reset CS8900A chip
* para:		none
* ret:		0 -- success 		-1 -- fail
* modify:
* comment:		
*********************************************************************************************/
int NicReset(void)
{
	if(CS_Reset())
		return 0;

	return -1;
}

/*********************************************************************************************
* name:		EtherOutput
* func:		output data through ethernet CS8900A chip
* para:		data -- data pointer
*			len	  -- data length
* ret:		0 -- success 		-1 -- fail
* modify:
* comment:		
*********************************************************************************************/
int EtherOutput(unsigned char *dmac, char* data, unsigned short len)
{
	int i;

    for(i=0; i<6; i++)
    	data[i] = dmac[i];
	for(i=0; i<6; i++)
    	data[6+i] = mac_addr[i];

	len += 14;
    if(len < 60 )
    	len = 60;
    if(len > 1518 )
	{
		uart_printf("  Cann't send data more than 1518 bytes!\n");
		return -1;
    }

	if(!CS_TransmitPacket(data, len))
    	return -1;

	iSendData = 0;
	
    return 0;
}

/*********************************************************************************************
* name:		EtherInput
* func:		get data from ethernet CS8900A chip
* para:		tms -- timeout value
* ret:		none
* modify:
* comment:		
*********************************************************************************************/
int EtherInput(unsigned short tms)
{
	int length = CS_ReceivePacket(tms);


	/* Check frame length */
	if(length < 60 || length > 1518)
		return 0;

	iReceiveData = 1;

	return length;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国内精品久久久久影院一蜜桃| 国产精品久久久久影院色老大| 国产91丝袜在线观看| 香蕉成人啪国产精品视频综合网| 国产精品欧美综合在线| 日韩欧美国产wwwww| 欧美美女网站色| 欧美日韩一区不卡| 欧美视频完全免费看| 欧美伊人精品成人久久综合97 | 欧美一卡二卡在线观看| 欧美性一级生活| 欧美视频在线观看一区二区| 色婷婷综合视频在线观看| 色综合久久综合网| 欧美性一二三区| 欧美区在线观看| 欧美一区二区日韩一区二区| 日韩一区二区影院| 亚洲精品一区二区三区在线观看| 日韩丝袜情趣美女图片| 欧美一级午夜免费电影| 久久无码av三级| 国产精品沙发午睡系列990531| 国产精品毛片无遮挡高清| 亚洲靠逼com| 天天免费综合色| 蜜臀精品一区二区三区在线观看| 激情av综合网| 国产麻豆视频一区二区| 成av人片一区二区| 欧美午夜精品一区二区三区 | 成人免费的视频| 色婷婷综合久久久中文字幕| 欧美性一区二区| 欧美xxxx老人做受| 国产精品高潮久久久久无| 亚洲成人久久影院| 国产高清在线精品| 欧美性xxxxxx少妇| 久久综合色一综合色88| 亚洲猫色日本管| 久久成人av少妇免费| av在线一区二区三区| 欧美乱妇一区二区三区不卡视频 | 色悠悠亚洲一区二区| 5858s免费视频成人| 国产午夜亚洲精品不卡| 亚洲青青青在线视频| 久久黄色级2电影| 色妹子一区二区| 精品国产网站在线观看| 一区二区三区不卡视频| 国产精品亚洲人在线观看| 欧美三级韩国三级日本一级| 国产欧美一区二区精品忘忧草| 一区二区在线看| 国产一区二区视频在线| 欧亚一区二区三区| 国产亚洲短视频| 日韩国产精品91| 91看片淫黄大片一级在线观看| 日韩欧美成人激情| 亚洲一卡二卡三卡四卡五卡| 国产成人av电影在线播放| 欧美精品vⅰdeose4hd| 国产精品久久夜| 国产一区二三区好的| 91精品国产综合久久精品麻豆 | 福利视频网站一区二区三区| 欧美综合一区二区| 国产精品久久久99| 国产精品一区不卡| 日韩欧美国产1| 全部av―极品视觉盛宴亚洲| 在线精品亚洲一区二区不卡| 国产精品电影一区二区三区| 暴力调教一区二区三区| 久久久激情视频| 国内精品第一页| 日韩精品一区二区在线观看| 日产欧产美韩系列久久99| 欧美日韩亚洲综合一区二区三区| 亚洲欧美在线高清| 成人h动漫精品一区二区| 久久久精品国产99久久精品芒果 | 精品日韩av一区二区| 天堂精品中文字幕在线| 欧美体内she精高潮| 日韩理论片中文av| 一本大道综合伊人精品热热| 成人欧美一区二区三区黑人麻豆| 丰满亚洲少妇av| 国产欧美综合在线| 成人福利视频在线看| 国产欧美一区二区精品婷婷| 成人精品视频一区二区三区尤物| 久久久噜噜噜久噜久久综合| 国产麻豆成人精品| 国产精品三级久久久久三级| a4yy欧美一区二区三区| 亚洲精品视频在线观看免费| 在线观看91视频| 日本欧美一区二区在线观看| 日韩一级完整毛片| 国产在线播放一区三区四| 久久久精品免费网站| 成人禁用看黄a在线| 亚洲精品免费在线观看| 欧美日韩黄视频| 蜜桃一区二区三区四区| 久久青草国产手机看片福利盒子| 粗大黑人巨茎大战欧美成人| 中文字幕字幕中文在线中不卡视频| www.欧美.com| 偷窥少妇高潮呻吟av久久免费| 欧美大尺度电影在线| 成熟亚洲日本毛茸茸凸凹| 一区二区三区美女| 欧美一二三四区在线| 成人av影视在线观看| 亚洲成国产人片在线观看| 欧美精品一区二| 色婷婷亚洲婷婷| 久久国产精品色婷婷| 国产精品久久久久9999吃药| 欧美老肥妇做.爰bbww视频| 精品中文字幕一区二区小辣椒 | 粉嫩在线一区二区三区视频| 亚洲精品综合在线| 日韩欧美久久一区| 91丨九色丨国产丨porny| 三级久久三级久久久| 日本一区二区电影| 制服.丝袜.亚洲.中文.综合| 丰满少妇在线播放bd日韩电影| 亚洲国产成人精品视频| 久久精品在线观看| 91精品蜜臀在线一区尤物| 成人黄色综合网站| 在线观看视频91| 美腿丝袜亚洲三区| 一区二区三区在线影院| 久久久综合视频| 91麻豆精品国产91久久久久久| jlzzjlzz国产精品久久| 久久精品国产精品亚洲精品| 亚洲三级在线播放| 欧美韩国日本不卡| 日韩西西人体444www| 欧美午夜电影一区| 91在线观看高清| 成人妖精视频yjsp地址| 狂野欧美性猛交blacked| 婷婷开心久久网| 亚洲综合丁香婷婷六月香| 中文字幕国产一区| 久久天堂av综合合色蜜桃网| 69堂精品视频| 欧美人xxxx| 91麻豆精品国产91久久久久久久久| 色香色香欲天天天影视综合网| 成人精品免费看| 国产精品996| 国产成人午夜精品影院观看视频| 黑人精品欧美一区二区蜜桃 | 高清不卡在线观看av| 国内一区二区视频| 麻豆精品在线播放| 蜜臀久久99精品久久久久宅男| 日本不卡视频一二三区| 日韩精品三区四区| 天堂久久一区二区三区| 婷婷中文字幕综合| 日韩国产高清在线| 奇米四色…亚洲| 蜜桃av一区二区三区电影| 日韩精品三区四区| 麻豆国产一区二区| 国产一区二区导航在线播放| 国产一区二区三区综合| 国产91在线|亚洲| 99热在这里有精品免费| 91在线丨porny丨国产| 色婷婷亚洲综合| 欧美日韩综合色| 精品三级在线观看| 国产欧美日韩精品在线| 亚洲欧洲精品天堂一级 | 色综合激情久久| 欧洲一区二区三区在线| 欧美视频第二页| 欧美一二区视频| 久久久国产一区二区三区四区小说| 久久久久久久久久久久久夜| 国产女主播在线一区二区| 亚洲四区在线观看| 日韩和欧美的一区| 国产电影一区在线| 日本高清免费不卡视频|