⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hardware.c

📁 使用MagicARM2200教学实验开发平台和ZLG/IP软件包
💻 C
字号:
#define HARDWARE_GLOBALS
#include "config.h"
#include "../include/cfg_net.h"
#include "dm9000_driver.h"

EX_RAM uint16 iic=0;

union  REC_BUFF_UNION	REC_BUFF[MAX_REC_BUFF];

board_info_t	NetDriverInfo[MAX_NET_PORT];		/* driver status */

static uint8 nfloor      = 0;

void  	outb(uint8 reg,	uint32	IOaddr);
uint8	inb(uint32 IOaddr);
void  	outw(uint16 reg, uint32	IOaddr);
uint16	inw(uint32 IOaddr);
void  	outl(uint32 reg, uint32	IOaddr);
uint32	inl(uint32 IOaddr);
static uint8 ior(board_info_t *db, uint8 reg);
//static uint16 iors(board_info_t *db, uint16 reg);
static void iow(board_info_t *db, uint8 reg, uint8 value);
static uint16 phy_read(board_info_t *db, uint8 reg);
static void phy_write(board_info_t *db, uint8 reg, uint16 value);
static void set_PHY_mode(board_info_t *db);
static void program_dm9801(board_info_t *db, uint16 HPNA_rev);
static void program_dm9802(board_info_t *db);
static void identify_nic(board_info_t *db);
void	udelay(uint16 DelayTime);
void init_dm9000(unsigned char num);


/**********************************************************************
**函数原型:    void 		Send_Packet(struct _pkst *TxdData)
**入口参数:		struct _pkst *TxdData	:指向要发送数据的结构指针
**              
**出口参数:		无
**返 回 值:	无              
**说    明:	发送数据包,以太网底层驱动程序,所有的数据发送都要通过该程序
************************************************************************/
void Send_Packet(struct _pkst *TxdData)//  
{
		board_info_t *db = &NetDriverInfo[0];
	char * data_ptr;
	int i, tmplen;
	uint8 int_status;
	struct _pkst *ExPtr;//
	
	uint16 ii,length=0,temp16;
		
	/* Disable all interrupt */
	iow(db, 0xff, 0x80);
				
	length=length+TxdData->length;
	ExPtr=TxdData->STPTR;
	while(ExPtr!=NULL)//计算出要发送的数据的总长度
	{	
		length=length+ExPtr->length;
		ExPtr=ExPtr->STPTR;
	}
	ii=length;
	
	/* Move data to DM9000 TX RAM */	
	outb(0xf8, db->ioaddr);
	
	data_ptr = (char *)TxdData->DAPTR;
	
	if (db->io_mode == DM9000_BYTE_MODE) {
		/* Byte mode */
		for (i = 0; i < (TxdData->length); i++)
			outb((data_ptr[i] & 0xff), db->io_data);
	} else if (db->io_mode == DM9000_WORD_MODE) {
		/* Word mode */
		tmplen = ((TxdData->length) + 1) / 2;
		if((uint32)data_ptr&0x00000001)
		{
			for (i = 0; i < tmplen; i++)
			{
	         		temp16=data_ptr[i*2]+data_ptr[i*2+1]*256;
	         		outw(temp16, db->io_data);
	        }
        }	
		else
			for (i = 0; i< tmplen; i++)
				outw(((uint16 *)data_ptr)[i], db->io_data);
	} else {
		/* DWord mode */
		tmplen = ((TxdData->length) + 3) / 4;
		for (i = 0; i< tmplen; i++)
			outl(((uint32 *)data_ptr)[i], db->io_data);
	} 
		
	ExPtr=TxdData->STPTR;
	while(ExPtr!=NULL)
	{
		data_ptr = (char *)ExPtr->DAPTR;
		if (db->io_mode == DM9000_BYTE_MODE) {
			/* Byte mode */
			for (i = 0; i < ExPtr->length; i++)
				outb((data_ptr[i] & 0xff), db->io_data);
		} else if (db->io_mode == DM9000_WORD_MODE) {
			/* Word mode */
			tmplen = (ExPtr->length + 1) / 2;
			if((uint32)data_ptr&0X00000001)
			{
				for (i = 0; i < tmplen; i++)
				{
					temp16=data_ptr[i*2]+data_ptr[i*2+1]*256;
	         		outw(temp16, db->io_data);
			 	}
			}
			else
				for (i = 0; i< tmplen; i++)
					outw(((uint16 *)data_ptr)[i], db->io_data);
		} else {
			/* DWord mode */
			tmplen = (ExPtr->length + 3) / 4;
			for (i = 0; i< tmplen; i++)
				outl(((uint32 *)data_ptr)[i], db->io_data);
		} 
		ExPtr=ExPtr->STPTR;
	}
	
	/* Set TX length to DM9000 */
	iow(db, 0xfc, ii & 0xff);
	iow(db, 0xfd, (ii >> 8) & 0xff);

	/* Issue TX polling command */
	iow(db, 0x2, 0x1);		/* Cleared after TX complete */
		
	/* Re-enable interrupt*/ 
	iow(db,0xff,0x83);
	for(length=0;length<6;length++)	
	{
		for(ii=0;ii<1000;ii++)
		{//检查CR寄存器的txp位是否为低,为1说明正在发送,为0说明发完或出错放弃
			int_status = ior(db, 0xfe);		/* Got ISR */
			if (int_status & DM9000_TX_INTR)
			{ break; }
        	}
		if(int_status & DM9000_TX_INTR)//表示发送成功,判断发送状态寄存器TSR,决定是否出错
		{
			iow(db, 0xfe, int_status);		/* Clear ISR status */ 
			break;
		}
	}
		
	
}

/**********************************************************************
**函数原型:    unsigned char * Rec_Packet()
**入口参数:

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -